
Wenn ich ein Dokument mit dem Namen habe my exam.tex
, ist es dann möglich, der PDF-Ausgabedatei den Namen zu geben, my exam [solved].pdf
indem ich das Wort anhänge[solved]
nurwenn die answers
Klassenoption aktiviert ist?
\documentclass[answers]{exam}
\begin{document}
text
\end{document}
Antwort1
Hier ist meine Lösung für dieses Problem.
Wenn Sie ohne kompilieren -shell-escape
, läuft es ganz normal (d. h., wenn Sie die Option verwenden, answers
werden Antworten ausgegeben, andernfalls nicht; die Standardeinstellung \jobname
wird verwendet.)
Wenn Sie mit kompilieren -shell-escape
, werden zwei Dateien ausgegeben: \jobname.pdf
mit Fragen und \jobname-solved.pdf
mit Antworten. Dies geschieht unabhängig davon, ob die answers
Option an die Klasse übergeben wird oder nicht.
Ich habe latexmk
es so gemacht, dass erforderliche Mehrfachkompilierungen automatisch berücksichtigt werden.
MWE
\documentclass{exam}
\usepackage{pdftexcmds}
\usepackage{iftex}
\makeatletter
\ltx@IfUndefined{pdf@shellescape}
{}
{\ifnum\pdf@shellescape=1
\ifpdftex
\def\latexmkengine{-pdf}%
\fi
\ifluatex
\def\latexmkengine{-lualatex}%
\fi
\ifxetex
\def\latexmkengine{-xelatex}%
\fi
\pdf@system{%
latexmk \latexmkengine\space -jobname="\jobname-solved"
-usepretex="\string\AtBeginDocument{\string\printanswerstrue}"
"\jobname"
}%
\pdf@system{%
latexmk \latexmkengine\space
-usepretex="\string\AtBeginDocument{\string\printanswersfalse}"
"\jobname"
}%
\expandafter\stop
\fi}
\makeatother
\begin{document}
\begin{questions}
\question One of these things is not like the others; one of these things is
not the same. Which one is different?
\begin{oneparchoices}
\choice John
\choice Paul
\choice George
\choice Ringo
\CorrectChoice Socrates
\end{oneparchoices}
\end{questions}
\end{document}
Ausgabe
\jobname.pdf
\jobname-solved.pdf
Wenn Sie immer nur eine Datei gleichzeitig ausgeben möchten, können Sie die obige Antwort leicht ändern, sodass latexmk
nur aufgerufen wird, wenn die answers
Option tatsächlich an die Klasse übergeben wird exam
. Dies beantwortet Ihre Frage so, wie Sie sie gestellt haben. Es muss noch mit kompiliert werden -shell-escape
.
\documentclass[answers]{exam}
\usepackage{pdftexcmds}
\usepackage{iftex}
\makeatletter
\ltx@IfUndefined{pdf@shellescape}
{}
{\ifnum\pdf@shellescape=1
\ifpdftex
\def\latexmkengine{-pdf}%
\fi
\ifluatex
\def\latexmkengine{-lualatex}%
\fi
\ifxetex
\def\latexmkengine{-xelatex}%
\fi
\ifprintanswers
\pdf@system{%
latexmk \latexmkengine\space -jobname="\jobname-solved" "\jobname"
}%
\expandafter\expandafter\expandafter\stop
\fi
\fi}
\makeatother
\begin{document}
\begin{questions}
\question One of these things is not like the others; one of these things is
not the same. Which one is different?
\begin{oneparchoices}
\choice John
\choice Paul
\choice George
\choice Ringo
\CorrectChoice Socrates
\end{oneparchoices}
\end{questions}
\end{document}
Und eine expl3
Lösung, die Dateinamen mit Leerzeichen verarbeitet. Wird -shell-escape
natürlich weiterhin benötigt.
Zwei Dateien ausgeben
\documentclass{exam}
\usepackage{expl3}
\ExplSyntaxOn
\str_new:N \l__diaa_latexmk_engine_str
\str_new:N \g__diaa_solved_jobname_str
\str_const:Nn \l__diaa_latexmk { latexmk }
\cs_new:Nn \__diaa_build_solved_jobname:
{
\str_gset:Nx \g__diaa_solved_jobname_str { \c_sys_jobname_str }
\str_gremove_all:Nn \g__diaa_solved_jobname_str { " }
\str_gput_left:Nn \g__diaa_solved_jobname_str { " }
\str_gput_right:Nn \g__diaa_solved_jobname_str { ~[solved]" }
}
\sys_if_shell_unrestricted:T
{
\sys_if_engine_luatex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -lualatex } }
\sys_if_engine_pdftex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -pdf } }
\sys_if_engine_xetex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -xelatex } }
\__diaa_build_solved_jobname:
\sys_shell_now:x
{
\l__diaa_latexmk \c_space_tl
\l__diaa_latexmk_engine_str \c_space_tl
-usepretex="\string\AtBeginDocument{\string\printanswerstrue}" \c_space_tl
-jobname=\g__diaa_solved_jobname_str \c_space_tl
\c_sys_jobname_str
}
\sys_shell_now:x
{
\l__diaa_latexmk \c_space_tl
\l__diaa_latexmk_engine_str \c_space_tl
-usepretex="\string\AtBeginDocument{\string\printanswersfalse}" \c_space_tl
\c_sys_jobname_str
}
\stop
}
\ExplSyntaxOff
\begin{document}
\begin{questions}
\question One of these things is not like the others; one of these things is
not the same. Which one is different?
\begin{oneparchoices}
\choice John
\choice Paul
\choice George
\choice Ringo
\CorrectChoice Socrates
\end{oneparchoices}
\end{questions}
\end{document}
Eine Datei ausgeben
\documentclass[answers]{exam}
\usepackage{expl3}
\ExplSyntaxOn
\str_new:N \l__diaa_latexmk_engine_str
\str_new:N \g__diaa_solved_jobname_str
\str_const:Nn \l__diaa_latexmk { latexmk }
\cs_new:Nn \__diaa_build_solved_jobname:
{
\str_gset:Nx \g__diaa_solved_jobname_str { \c_sys_jobname_str }
\str_gremove_all:Nn \g__diaa_solved_jobname_str { " }
\str_gput_left:Nn \g__diaa_solved_jobname_str { " }
\str_gput_right:Nn \g__diaa_solved_jobname_str { ~[solved]" }
}
\sys_if_shell_unrestricted:T
{
\sys_if_engine_luatex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -lualatex } }
\sys_if_engine_pdftex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -pdf } }
\sys_if_engine_xetex:T
{ \str_set:Nn \l__diaa_latexmk_engine_str { -xelatex } }
\legacy_if:nT { printanswers }
{
\__diaa_build_solved_jobname:
\sys_shell_now:x
{
\l__diaa_latexmk \c_space_tl
\l__diaa_latexmk_engine_str \c_space_tl
-jobname=\g__diaa_solved_jobname_str \c_space_tl
\c_sys_jobname_str
}
\stop
}
}
\ExplSyntaxOff
\begin{document}
\begin{questions}
\question One of these things is not like the others; one of these things is
not the same. Which one is different?
\begin{oneparchoices}
\choice John
\choice Paul
\choice George
\choice Ringo
\CorrectChoice Socrates
\end{oneparchoices}
\end{questions}
\end{document}
Geben Sie zwei Dateien mit einem Aufruf direkt von lualatex
anstelle von aus latexmk
:
\documentclass{exam}
\usepackage{expl3}
\ExplSyntaxOn
\str_new:N \g__diaa_solved_jobname_str
\str_const:Nn \l__diaa_latex_cmd { lualatex }
\str_const:Nn \l__diaa_latex_options { -synctex=1 ~ -interaction=nonstopmode }
\cs_new:Nn \__diaa_build_solved_jobname:
{
\str_gset:Nx \g__diaa_solved_jobname_str { \c_sys_jobname_str }
\str_gremove_all:Nn \g__diaa_solved_jobname_str { " }
\str_gput_left:Nn \g__diaa_solved_jobname_str { " }
\str_gput_right:Nn \g__diaa_solved_jobname_str { ~[solved]" }
}
\sys_if_shell_unrestricted:T
{
\__diaa_build_solved_jobname:
\sys_shell_now:x
{
\l__diaa_latex_cmd \c_space_tl
-jobname=\g__diaa_solved_jobname_str \c_space_tl
\l__diaa_latex_options \c_space_tl
"\string\AtBeginDocument{\string\printanswerstrue}" \c_space_tl
"\string\input{\c_sys_jobname_str}"
}
\sys_shell_now:x
{
\l__diaa_latex_cmd \c_space_tl
-jobname=\c_sys_jobname_str \c_space_tl
\l__diaa_latex_options \c_space_tl
"\string\AtBeginDocument{\string\printanswersfalse}" \c_space_tl
"\string\input{\c_sys_jobname_str}"
}
\stop
}
\ExplSyntaxOff
\begin{document}
\begin{questions}
\question One of these things is not like the others; one of these things is
not the same. Which one is different?
\begin{oneparchoices}
\choice John
\choice Paul
\choice George
\choice Ringo
\CorrectChoice Socrates
\end{oneparchoices}
\end{questions}
\end{document}