Rufen Sie automatisch zwei Jobs von Latexmk auf

Rufen Sie automatisch zwei Jobs von Latexmk auf

In einem (nAntwortAuf eine Frage zum Kompilieren zweier Versionen eines Dokuments aus einer Latex-Quelle von Stackoverflow wird der folgende Befehl verwendet, um das Problem zu lösen:

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 "

latexmkwird zweimal aufgerufen und es ist einfach, dies in ein Wrapper-Skript einzufügen. Ich bin jedoch neugierig, ob es auch möglich ist, eine .latexmkrcDatei so zu konfigurieren, dass sie beim Aufruf automatisch beide Jobs ausführt latexmk file.tex. Ist es auch möglich, dass beide Jobs parallel ausgeführt werden (um mehrere Kerne Ihrer CPU zu verwenden)?

Wie kann ich also eine .latexmkrcDatei konfigurieren, um dies zu erreichen? Dass dies möglich ist, wird angezeigt.Hier(S. 105, Nachwirkungen).

Antwort1

Ich kenne keine Möglichkeit, dies rein innerhalb von zu tun latexmk, sicherlich keine, die überhaupt leicht und einfach ist. Ich vermute, dass der Kommentar über latexmkin der genanntenhttps://www.ntg.nl/maps/45/06.pdfwurde vorgenommen, ohne im Detail zu untersuchen, wie latexmkdie Aufgabe bewältigt werden kann, aus einer Quelldatei mehrere Ausgabedateien zu erzeugen.

  1. Ein Wrapper-Skript ist in der Tat die naheliegendste Möglichkeit, das zu tun, was benötigt wird. Ich sehe jedoch, dass die angegebene Befehlszeile die Option latexmkvon verwendet -pdflatex=..., um Optionen für bereitzustellen pdflatex. Da alle Optionen von unterstützt werden latexmk, ist es einfacher (und meiner Meinung nach besser),

     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. Eine andere Methode, die ich verwendet habe, besteht darin, eine Treiber-.tex-Datei zu haben, die einfach die relevante Variable (in diesem Fall \version) einstellt und dann die Hauptdatei eingibt. Ich fand das ziemlich praktisch. Es vermeidet doppelten TeX-Code, während die beiden .tex-Dateien transparenter machen, wie die Lösungsversion erstellt wird. Außerdem wird vermieden, dass für latexmkoder eine spezielle Befehlszeile verwendet werden muss pdflatex.

In diesem Fall myfile_solution.texkönnte

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

Ich würde auch myfile.texetwas hinzufügen, das korrektes Verhalten liefert, wenn \versiones nicht definiert ist. Die erste Zeile könnte beispielsweise lauten:

  \providecommand{\version}{noanswer}

welches nur definiert \version, wenn es nicht bereits definiert ist.

Antwort2

Ich verwende ein latexmkrc, um automatisch zwei Versionen aus derselben Tex-Quelle zu erstellen. In meinem Fall verwende ich das Prüfungspaket. Eine Version ist der Lösungsschlüssel und die andere Version ist die Prüfung, das Quiz oder der Test.

In meiner Tex-Quelle habe ich eine Zeile, die die zu kompilierende Version des Dokuments auswählt. Der Befehl \noprintanswers wird vom Prüfungspaket bereitgestellt.

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

Dies ist der relevante Teil meiner .latexmkrc, der sich im selben Ordner wie meine Tex-Quelle befindet.

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

Die Jobs werden parallel ausgeführt. Bei mir funktioniert es, und Sie können es möglicherweise an Ihren Fall anpassen.

verwandte Informationen