latexmkから2つのジョブを自動的に呼び出す

latexmkから2つのジョブを自動的に呼び出す

答え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。もちろん、簡単で単純な方法はありませんlatexmkhttps://www.ntg.nl/maps/45/06.pdflatexmk1 つのソース ファイルから複数の出力ファイルを生成するタスクを実行する方法を詳細に調査せずに作成されました。

  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 ファイルを用意することです。これは非常に便利です。TeX コードの重複を避けられると同時に、2 つの .tex ファイルがあることでソリューション バージョンの作成方法がより透明になります。また、または\versionに特別なコマンド ラインを使用する必要もありません。latexmkpdflatex

この場合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 &" );
}

ジョブは並列で実行されます。私の環境ではうまく機能しており、皆さんのケースにも適応できるかもしれません。

関連情報