
如果我有一個名為 的文檔,是否可以透過附加單字來my exam.tex
使其輸出 PDF 文件的名稱為my exam [solved].pdf
[solved]
僅有的何時啟answers
用班級選項?
\documentclass[answers]{exam}
\begin{document}
text
\end{document}
答案1
這是我對這個問題的解決方案。
如果您在沒有 的情況下編譯-shell-escape
,它只會正常運行(即,如果您使用該answers
選項,它將輸出答案,否則不會;\jobname
使用預設值。)
如果使用 進行編譯-shell-escape
,則會輸出兩個檔案:\jobname.pdf
包含問題和\jobname-solved.pdf
答案。無論answers
選項是否傳遞給類別,它都會執行此操作。
我已經使用了latexmk
自動考慮所需的多次編譯。
微量元素
\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}
輸出
\jobname.pdf
\jobname-solved.pdf
如果您只想一次輸出一個文件,您可以稍微修改上面的答案,以便僅在選項實際傳遞給類別latexmk
時調用。正如您所問的那樣,這回答了您的問題。它仍然需要用 來編譯。answers
exam
-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}
以及expl3
處理帶有空格的檔案名稱的解決方案。當然還是需要的-shell-escape
。
輸出兩個文件
\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}
輸出一個文件
\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}
直接調用lualatex
而不是輸出兩個檔案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}