MWE

MWE

이름이 인 문서가 있는 경우 출력 PDF 파일에 단어를 추가하여 my exam.tex이름을 갖게 할 수 있습니까?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.pdfanswers

latexmk필요한 여러 컴파일이 자동으로 고려되도록 사용했습니다 .

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}

산출

\jobname.pdf

산출

\jobname-solved.pdf

산출


한 번에 하나의 파일만 출력하려면 옵션이 실제로 클래스에 전달될 latexmk때만 호출되도록 위의 답변을 약간 수정하면 됩니다 . 이것은 귀하가 요청한 질문에 대한 답변입니다. 여전히 .answersexam-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}

관련 정보