
で答えstackoverflow の LaTeX ソースから 2 つのバージョンのドキュメントをコンパイルすることに関する質問に対して、問題を解決するために次のコマンドが使用されます。
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
は 2 回呼び出され、これをラッパー スクリプトに組み込むのは簡単です。ただし、.latexmkrc
を呼び出すときに両方のジョブを自動的に実行するようにファイルを構成することもできるかどうか興味がありますlatexmk file.tex
。両方のジョブを並列に実行することもできますか (CPU の複数のコアを使用するため)?
では、.latexmkrc
これを実行するためにファイルをどのように構成すればよいでしょうか?それは可能であるかもしれないことを示していますここ(p. 105、余波)。
答え1
私はこれを完全に 内で行う方法を知りませんlatexmk
。もちろん、簡単で単純な方法はありませんlatexmk
。https://www.ntg.nl/maps/45/06.pdflatexmk
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
私が使用した別の方法は、関連する変数 (この場合は ) を設定し、メイン ファイルを入力するだけのドライバー .tex ファイルを用意することです。これは非常に便利です。TeX コードの重複を避けられると同時に、2 つの .tex ファイルがあることでソリューション バージョンの作成方法がより透明になります。また、または
\version
に特別なコマンド ラインを使用する必要もありません。latexmk
pdflatex
この場合myfile_solution.tex
、
\newcommand{\version}{}
\input{myfile}
myfile.tex
定義されていない場合に適切な動作をするものも用意します\version
。たとえば、最初の行は次のようになります。
\providecommand{\version}{noanswer}
\version
まだ定義されていない場合にのみ定義します。
答え2
私は、latexmkrc を使用して、同じ tex ソースから 2 つのバージョンを自動的に生成します。私の場合は、試験パッケージを使用しています。1 つのバージョンは解答キーで、もう 1 つのバージョンは試験、クイズ、またはテストです。
私の TEX ソースには、コンパイルするドキュメントのバージョンを選択する行があります。\noprintanswers コマンドは、試験パッケージによって提供されます。
\ifdefined\answersflag\noprintanswers\else\printanswers \fi
これは、Tex ソースと同じフォルダーにある .latexmkrc の関連部分です。
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 &" );
}
ジョブは並列で実行されます。私の環境ではうまく機能しており、皆さんのケースにも適応できるかもしれません。