在一个回答对于来自 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
从一个源文件生成多个输出文件来完成这一任务。
包装器脚本确实是完成所需操作的最明显方式。但是我看到给定的命令行使用
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
我使用的另一种方法是使用一个驱动程序 .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 &" );
}
这些作业是并行执行的。对我来说,这种方法很有效,你也许可以根据自己的情况进行调整。