
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 "
latexmk
wird zweimal aufgerufen und es ist einfach, dies in ein Wrapper-Skript einzufügen. Ich bin jedoch neugierig, ob es auch möglich ist, eine .latexmkrc
Datei 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 .latexmkrc
Datei 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 latexmk
in der genanntenhttps://www.ntg.nl/maps/45/06.pdfwurde vorgenommen, ohne im Detail zu untersuchen, wie latexmk
die Aufgabe bewältigt werden kann, aus einer Quelldatei mehrere Ausgabedateien zu erzeugen.
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
latexmk
von verwendet-pdflatex=...
, um Optionen für bereitzustellenpdflatex
. Da alle Optionen von unterstützt werdenlatexmk
, 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
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ürlatexmk
oder eine spezielle Befehlszeile verwendet werden musspdflatex
.
In diesem Fall myfile_solution.tex
könnte
\newcommand{\version}{}
\input{myfile}
Ich würde auch myfile.tex
etwas hinzufügen, das korrektes Verhalten liefert, wenn \version
es 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.