latexmk 的學習(自用)
其實是把翻譯給咕掉了, 先把實用的東西寫了, 方便查閱, 剩下的嘛, 考完研再說吧, 也沒準哪天心血來潮就寫了
先把這個東西寫了, 隨用隨查, 然后也說一下遇到的坑什么的(如果有的話)
命令行中的 latexmk
latexmk 的通用格式為
latexmk [options] [file]
其中 file 可以直接寫文件名, 如果直接寫 foo 的話, latexmk 會按照 foo.tex 來處理. 有一些符號在文件名中是不能用的: $, %, \,`(這個東西不能放在代碼塊里……), &這個符號不能作為文件名的開頭, 還有一些控制字符也不可以, 不過我估計沒人會閑的用控制字符來做 .tex 的文件名...
幾個常用的 option
-auxdir=FOO 或者 -aux-directory=FOO
設置存放輔助文件的文件夾, 但是這個命令只能在 MiKTeX 版本的 latex中使用, 我這里是 TeX Live, 沒有辦法做測試.
-bibtex
當源文件需要用 .bbl 文件作為參考文獻的時候, 運行 bibtex 或者 biber 來更新 .bbl 文件. 這個選項可以將 latexmkrc 中的 $bibtex_use 的值設置為 2 來實現(xiàn).
-bibtex-
從不運行 bibtex 或者 biber. 同時將 .bbl 文件看做珍貴的 ( 原文為 precious ), 也就是在執(zhí)行清理命令的時候不會刪除 .bbl 文件. 如果我們接受到的文件中只有 .bbl 而沒有 .bib 的時候會啟用這個選項. 這個選項可以將latexmkrc 中的 $bibtex_use 的值設置為 0 來實現(xiàn).
bibtex-cond
如果源文件中存在 .bib 文件, 則運行 bibtex 或 biber 來重寫 .bbl 文件, 如果沒有 .bib 文件, 則不運行 bibtex 或 biber, 這個選項也會將 .bbl 文件看做珍貴的. 這個選項可以將latexmkrc 中的 $bibtex_use 的值設置為 1 來實現(xiàn).
-command
列出 latexmk 在處理文件時可以使用的命令, 然后退出.
-c
清理所有由 latex , bibtex, 以及 biber 生成的可再生的文件, 除了 .dvi, postscript, 和 .pdf 文件. 會刪除的文件有 .log, .aux, latexmk 創(chuàng)建的數(shù)據(jù)文件, 還有 @generated_exts 中指定擴展名的文件, 同時還有 $clean_ext 指定的文件.
-C
清理 -c 選項中的所有文件, 以及 .pdf, .dvi, postscript 文件, 以及 $clean_full_ext 指定的文件.
-cd
在進行處理之前切換到有源程序的文件夾, 并將所有的文件生成在這個文件夾里. 舉例: 如果你的文件夾結構為 parent/subfolder/main.tex, 你在 parent 文件夾下, 命令行執(zhí)行
latexmk -cd -xelatex subfolder/main
后, 會進入 subfolder 文件夾進行編譯, 并將輔助文件和輸出文件生成在 subfolder 文件夾下. 這里注意路徑的分隔符要使用 / , 哪怕是 Windows.
-f
強制執(zhí)行 latexmk 哪怕遇到了 error. 一般情況下, 當 latexmk 遇到了 latex 或者其他程序在接下來的運行中無法處理的問題的時候, 將不會給出處理結果.
接下來的運行指的是 如果沒有 error 出現(xiàn), 運行其他程序或者重新運行latex 的時候會編譯完成 ( 這段其實我沒看懂, 原文是 "Further processing" means the running of other Programs or the rerunning of latex (etc) that would be done if no errors had occurred. ) 額外地, 如果你想讓 latex 程序遇到 error 之后不出現(xiàn)給用戶處理 error 的暫停 , 你需要使用一些可以傳遞給程序的選項, 比如 -interaction=nonstopmode. 舉例: 當文檔里有一個嚴重的錯誤, 比如沒有定義的命令, 使用 -f 的話
latexmk -f -xelatex main
在遇到錯誤的時候依舊會暫停來等待用戶處理, 而使用 -interaction=nonstopmode 的話
latexmk -interction=nonstopmode -xelatex main
latexmk 會一氣呵成運行到最后, 哪怕沒有文件輸出.
-g
強制完整地運行一遍 latexmk, 哪怕在 latexmk 覺得源文件自從上次編譯之后沒有改動
-h, -help
打印 latexmk 的幫助信息.
-jobname=STRING
把輸出文件中的文件名設置為 STRING, 而不是源文件名, 這個 STRING 中不能帶空格. 如果要使用占位符 %A 的話也可以, 比如
latexmk -xelatex -jobname=%A-xelatex main
這樣輸出文件名就變成了 main-xelatex.***.
-outdir=FOO 或者 -output-directory=FOO
設置存放所有輸出文件的文件夾.
-pdf
當使用 pdflatex 的時候輸出 .pdf 文件.
-pdflatex
使用 pdflatex 編譯, 并且關閉 .dvi 和 .ps 文件的生成.
-pv
運行預覽程序, 因為編譯中文文檔用的 xelatex 不會生成 .dvi 和 .ps 文件, 所以也不存在預覽哪個文件的問題, 直接就是運行 .pdf 文件的預覽.
-r <rcfile>
按 <rcfile> 中的內(nèi)容執(zhí)行 latexmk. 但是要注意調(diào)用順序, latexmk 總是會先調(diào)用標準初始的 latexmkrc 文件, 如果不存在初始的 latexmkrc 文件的情況下再去調(diào)用 <rcfile>. 但是如果 <rcfile> 中指定了一個初始的 latexmkrc 文件, 那么這個文件會在所有的標準初始的 latexmkrc 文件之前運行.
-v, -version
打印 latexmk 的版本號.
-xelatex
使用 xelatex 編譯程序, 同時關閉 .dvi 和 .ps 的生成.
以上是我在閱讀文檔的過程中覺得我會用的到的選項, 如果有更多的話會再補充
RC 文件中的 latexmk
如何在 RC 文件中設置變量
變量的格式應如下
設置一個值為字符串的變量:
$bibtex='bibtex %O %B';
設置一個值為數(shù)字的變量:
$preview_mode=1;
設置一個值為數(shù)組的變量:
@default_files=('paper', 'paper1');
也可以用下面的語句來給數(shù)組變量添加值:
push @default_files, 'paper2';
可以注意到簡單的標量變量的名字的開頭都是 $, 而數(shù)組變量的名字的開頭是 @, 每個語句都以分號 ; 結尾. 字符串應該用單引號括起來, 不建議使用雙引號.
命令規(guī)定的格式
一些變量會設置 latexmk 用于工作的命令, 比如通過 .tex 文件生成 .dvi 文件, 或者去瀏覽一個 .ps 文件.
占位符
如果你想讓 latexmk 在通常是 latex 的位置使用 elatex 命令, 而且想讓它使用 --shell-escape 選項, 要像下面這么寫
latex='elatex --shell-escape %O %S';
那兩個前面帶 % 的就是占位符, 在運行命令之前他們會被替換為適當?shù)闹? 因此 %S 會被替換為 elatex 應用的源文件名, %O 會被替換為任何 latexmk 將作用在這個命令上的選項, 比如如果你在調(diào)用 latexmk 的時候使用了 -silent 選項, %O 會被替換為 -interaction=batchmode. 下面列出可用的占位符
-
%A: 主.tex文件的文件名. 不同于%R,%A不會被設置別名(jobname) 而受影響; -
%B: 最近命令中的基礎名 (base name). 比如一個document.ps文件從一個document.dvi轉化得到, 那么這個文件名就是document -
%D: 終點 (destination) 文件名. 比如一個.ps文件由一個.dvi文件轉化得到, 那么終點文件名就是這個.ps文件名. -
%O: 例子中提到的選項. -
%P: 如果變量$pre_tex_code不空, 那么%P會被替換為$pre_tex_code中\input{SOURCE}后面的內(nèi)容, 其中SOURCE是資源文件 (source file) 的名字. 這讓 TeX 代碼可以在資源文件被讀入之前就傳給*latex引擎. 如果$pre_tex_code為空, 那么%P和%S等價. -
%R: 根文件名, 這是主.tex文件的基礎名, 但是這個值可以被-jobname選項或者$jobname變量改變. -
%S: 源文件名. 比如當轉化一個.dvi文件到.ps的時候,.dvi的文件名就是源文件名. -
%T: The name of the primary.texfile. -
%U: 如果變量$pre_tex_code不空, 那么這個值就被傳遞給%U, 如果為空, 那么它被替換為一個空字符 (null string). -
%Y: 輔助文件所在的文件夾名. 如果文件夾名不是以合法符號結束, 那么就會被添加一個文件夾分隔符/. 注意: 如果設置了$out_dir卻沒設置$aux_dir, 那么latexmk就把$aux_dir設置為$out_dir. -
%Z: 輸出文件夾名. 如果$out_dir不空, 且沒以合法符號結束, 那么就會被添加一個文件夾分隔符/.
(說實在的我暫時沒分清這么多 name 到底是什么 name, 比如 basename, roof filename, primary tex file...)
如果有什么原因你要使用一個 % 字符, 還不是上面標出的情況, 那么用 %%.
注意: 在文件名傳遞的過程中會被適當?shù)靥砑右? 所以不要自行添加引號, 即使文件名中有空格. ( 如果你的 TeX 文件名中有空格, 那么一些過老版本的 TeX 程序可能不會很好地處理它們. ) 如果 latexmk 的引號不能正確地工作, 你也可以將它關閉, 在變量 $quote_filenames 的設置中.
20200406 更新
昨天在使用 latexmk -xelatex -pvc main 的時候發(fā)現(xiàn) SumatraPDF 不能主動更新 PDF 文件, 而使用 latexmk -pdflatex -pvc main 就可以更新, 甚至將 rc 文件中的 $pdflatex 設置為
$pdflatex="xelatex -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 %O %S";
都可以更新 pdf 文件. 原因是 latexmk 選項中的 -xelatex 的默認選項是 xelatex %O %S 下面直接引用 texdoc latexmk 中的原文
Note about
xelatex:latexmkusesxelatexto make an.xdvrather than-no-pdfoption. If%Ois part of the command for invokingxelatex, then latexmk will insert the-no-pdfoption automatically, otherwise you must provide the option yourself.
而 -no-pdf 是 xelatex 特有的選項.
綜上所述, 產(chǎn)生這個問題的原因是: 在使用 latexmk 的 -xelatex 選項時, latexmk 會執(zhí)行 xelatex %O %S, 而這個 %O 中帶了 (latexmk 選項) 中的 -no-pdf 選項, 于是在沒有配置 rc 文件的時候, latexmk -xelatex main = xelatex -no-pdf -record main.
問題出現(xiàn)了就可以給出解決辦法:
- 將
rc中的$xelatex選項的配置為不帶%O的命令, 如$xelatex="xelatex %S"即可, 但是這么做的后果是不能將臨時添加在latexmk中的xelatex的選項傳遞給xelatex, 比如像上面一樣配置$xelatex, 那么在使用latexmk -synctex=1 main的時候, 不會執(zhí)行-synctex=1這個選項. - 修改
rc文件中的$pdflatex選項為$pdflatex="xelatex %O %S"這樣可以接受臨時添加的選項, 后果是不能使用pdflatex編譯.