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