自動從 Latexmk 呼叫兩個作業

自動從 Latexmk 呼叫兩個作業

在一個回答關於從 stackoverflow 的 Latex 來源編譯文件的兩個版本的問題,使用以下命令來解決問題:

latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex | latexmk -pdf -pdflatex="pdflatex -synctex=1 -interaction=nonstopmode -shell-escape" -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex "

latexmk被調用兩次,將其放入包裝腳本中很簡單。但是我很好奇是否也可以配置一個.latexmkrc文件,使其在您調用時自動執行這兩項工作latexmk file.tex。是否也有可能這兩個作業並行執行(以使用 cpu 的多個核心)?

那麼,如何設定.latexmkrc檔來完成此任務呢?表明這可能是可能的這裡(第 105 頁,後果)。

答案1

我知道沒有辦法純粹在內部做到這一點latexmk,當然沒有什麼是容易和簡單的。我懷疑所提到的latexmk評論https://www.ntg.nl/maps/45/06.pdf是在沒有詳細研究如何完成latexmk從一個來源檔案產生多個輸出檔案的任務的情況下完成的。

  1. 包裝腳本確實是完成所需任務的最明顯的方式。但是我看到給定的命令行使用latexmk's-pdflatex=...選項來提供選項pdflatex。由於所有選項都受支持latexmk,因此使用起來更簡單(而且我認為更好)

     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile -pretex="\newcommand{\version}{noanswer}" -usepretex myfile.tex
     latexmk -pdf -synctex=1 -interaction=nonstopmode -shell-escape -jobname=myfile_solution -pretex="\newcommand{\version}{}" -usepretex myfile.tex
    
  2. 我使用的另一種方法是使用驅動程式 .tex 文件,該文件只需設定相關變數(在本例中\version),然後輸入主文件。我發現這很方便。它避免了重複的 TeX 程式碼,同時擁有兩個 .tex 檔案使得解決方案版本的製作方式更加透明。它還避免了必須使用特殊的命令行latexmkpdflatex

在這種情況下,myfile_solution.tex可以是

    \newcommand{\version}{}
    \input{myfile}

如果沒有定義,我也會配備myfile.tex一些能夠提供正確行為的東西。\version例如,第一行可以是

  \providecommand{\version}{noanswer}

\version當尚未定義時才定義。

答案2

我使用 Latexmkrc 自動從同一 tex 來源產生 2 個版本。就我而言,我使用的是考試包。一個版本是答案鍵,另一個版本是考試、測驗或測驗。

在我的 tex 來源中,我有一行選擇要編譯的文檔版本。 \noprintanswers 指令由考試包提供。

\ifdefined\answersflag\noprintanswers\else\printanswers \fi

這是我的 .latexmkrc 的相關部分,它與我的 tex 來源位於同一資料夾中。

my $filename = $ARGV[-1];
($base_name, $path, $ext) = fileparseB( $filename );
if  ($ext ne '.tex' ) {
   $file = "$base_name$ext";
}
else {
   $file = $base_name;
}

$tmp = 'blanks.tmp';
if (-e $tmp) {
   system( "rm $tmp" );
} else {
   system( "touch $tmp" );
   system( "latexmk -jobname=${file}blank -usepretex=\"\\def\\answersflag{}\" ${file} > ${file}blank.log &" );
}

這些作業是並行執行的。它對我有用,您也許可以根據您的情況進行調整。

相關內容