`latexmk`

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 文件, 則運行 bibtexbiber 來重寫 .bbl 文件, 如果沒有 .bib 文件, 則不運行 bibtexbiber, 這個選項也會將 .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 .tex file.
  • %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: latexmk uses xelatex to make an .xdv rather than .pdf file, with the .pdf file being created in a separate step. This is enforced by the use of the -no-pdf option. If %O is part of the command for invoking xelatex, then latexmk will insert the -no-pdf option automatically, otherwise you must provide the option yourself.

-no-pdfxelatex 特有的選項.

綜上所述, 產(chǎn)生這個問題的原因是: 在使用 latexmk-xelatex 選項時, latexmk 會執(zhí)行 xelatex %O %S, 而這個 %O 中帶了 (latexmk 選項) 中的 -no-pdf 選項, 于是在沒有配置 rc 文件的時候, latexmk -xelatex main = xelatex -no-pdf -record main.

問題出現(xiàn)了就可以給出解決辦法:

  1. rc 中的 $xelatex 選項的配置為不帶 %O 的命令, 如 $xelatex="xelatex %S" 即可, 但是這么做的后果是不能將臨時添加在 latexmk 中的 xelatex 的選項傳遞給 xelatex, 比如像上面一樣配置 $xelatex, 那么在使用 latexmk -synctex=1 main 的時候, 不會執(zhí)行 -synctex=1 這個選項.
  2. 修改 rc 文件中的 $pdflatex 選項為 $pdflatex="xelatex %O %S" 這樣可以接受臨時添加的選項, 后果是不能使用 pdflatex 編譯.
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 剛裝了電腦,這幾天一直在整理資料還有倒騰軟件。今天打開Word突然覺得它很難用,因為它經(jīng)常出現(xiàn)格式混亂的情況。這時...
    BSC_5622閱讀 48,371評論 0 19
  • 目錄 [TOC] 本系列是有關LaTeX的學習系列,共計19篇,本章節(jié)是第5篇。前一篇:04LaTeX學習系列之-...
    張一根閱讀 23,168評論 1 4
  • 一份簡短的LaTeX介紹 第一章 LaTeX須知 1.1 概述 1.1.1 TeX TeX是高德納開發(fā)的,以排版數(shù)...
    左岸右水閱讀 2,263評論 0 0
  • LaTeX ,是一種基于 TeX 的排版系統(tǒng),由美國計算機科學家萊斯利·蘭伯特在20世紀80年代初期開發(fā),利用這種...
    海上波濤閱讀 1,667評論 0 0
  • 機械鍵盤由于獨特的手感,越來越受到大家的青睞。 其每一顆按鍵都有一個單獨的開關來控制閉合,這個開關也被稱為“軸”,...
    超級老兔子閱讀 488評論 0 0

友情鏈接更多精彩內(nèi)容