自动从 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-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 文件使得解决方案版本的制作方式更加透明。它还避免了必须使用latexmk或 的特殊命令行pdflatex

在这种情况下,myfile_solution.tex可能是

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

我还会配备myfile.tex一些功能,以便在\version未定义时提供正确的行为。例如,第一行可以是

  \providecommand{\version}{noanswer}

\version当尚未定义时才进行定义。

答案2

我使用 latexmkrc 从同一个 tex 源自动生成 2 个版本。就我而言,我使用的是考试包。一个版本是答案,另一个版本是考试、测验或测试。

在我的 tex 源代码中,有一行用于选择要编译的文档版本。\noprintanswers 命令由 exam 包提供。

\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 &" );
}

这些作业是并行执行的。对我来说,这种方法很有效,你也许可以根据自己的情况进行调整。

相关内容