在将考试类别中的解决方案移至尾注之前强制扩展编号

在将考试类别中的解决方案移至尾注之前强制扩展编号

我正在尝试调整这个非常有用的答案这里及其后续行动这里关于如何在考试文档类中偶尔显示每个部分后的解决方案并对其进行编号。最后一个链接已经解释了这个问题:尾注在将解决方案移到末尾之前不会扩展解决方案的编号,因此下面的 MWE

\documentclass[a4paper]{exam}
\usepackage[utf8]{inputenc}
\printanswers

\usepackage{url}
\usepackage{endnotes}

\def\enotesize{\normalsize}
\def\makeenmark{\relax}
\def\notesname{Answers}
\def\answer#1{\endnotetext{\vspace*{-3.5ex}\begin{solution}#1\end{solution}\unskip}}
\def\theanswers{\theendnotes \medskip}

\renewcommand{\solutiontitle}{\noindent\textbf{Solution \thequestion\thepartno\thesubpart\thesubsubpart:}\par\noindent} % like the exam documentation recommends

\begin{document}
    
    \begin{questions}
        \addpoints \question This is the first question
        \begin{parts}
            \part This is part one.
            \answer{Answer 1.1}
            \part This is part two.
            \answer{Answer 1.2}
        \end{parts}     
        \addpoints \question This the second question
        
        \answer{This is the solution to question two.}
        
    \end{questions}
    
    \theanswers
    
\end{document}

仍然给出输出:

输出的截图,解决方案的编号只查看尾注之前的问题

所有解决方案都按照最后一个问题、部分、子部分、子子部分进行编号,而不是按照其对应的问题、部分、子部分、子子部分进行编号。提出的解决方案这里不起作用,因为问题计数器不需要在每次遇到解决方案环境时增加,因为它也可以属于问题的一部分或子部分。

在将所有解决方案移至尾注之前,有什么方法可以强制尾注扩大编号?

答案1

postnotes软件包提供了一些基础结构,用于在标记设置的位置存储(和扩展)一些变量,并在最后打印注释时检索它们。该软件包使用此基础结构移植许多变量,如\thechapter\thesection等等\thepage,还为一些需要将某些变量视为“就像它们位于标记位置”的软件包添加了支持。但用户也可以利用该机制。

基本结构是postnotes提供一对钩子,postnotes/note/store一个在设置标记的地方调用,另一个在最后打印注释之前调用。您可以通过注释唯一 ID 在两点之间建立连接,您可以在第一个钩子中通过 访问该 ID ,在第二个钩子中postnotes/print/note/begin通过 访问该 ID 。\l_postnotes_note_id_tl\l_postnotes_print_note_id_tl

在实践中:

\documentclass[a4paper]{exam}

% This is already the default nowadays.
% \usepackage[utf8]{inputenc}

\printanswers

\renewcommand{\solutiontitle}{\noindent\textbf{Solution \pnthequestion\pnthepartno\pnthesubpart\pnthesubsubpart:}\par\noindent} % like the exam documentation recommends

% I presume this is desired?
\counterwithin*{partno}{question}

\usepackage{postnotes}
\postnotesetup{
  listenv=none,
  format=\normalsize,
  maketextmark=,
}
\renewcommand*{\pntitle}{Answers}

\NewDocumentCommand{\answer}{m}{%
  \postnote[nomark]{\vspace*{-3.5ex}\begin{solution}#1\end{solution}}}

\NewDocumentCommand{\theanswers}{}{\printpostnotes}

\ExplSyntaxOn
\AddToHook { postnotes/note/store }
  {
    \prop_new:c { g__ypnia_exam_ \l_postnotes_note_id_tl _prop }
    \prop_gput:cnx { g__ypnia_exam_ \l_postnotes_note_id_tl _prop }
      { thequestion } { \thequestion }
    \prop_gput:cnx { g__ypnia_exam_ \l_postnotes_note_id_tl _prop }
      { thepartno } { \thepartno }
    \prop_gput:cnx { g__ypnia_exam_ \l_postnotes_note_id_tl _prop }
      { thesubpart } { \thesubpart }
    \prop_gput:cnx { g__ypnia_exam_ \l_postnotes_note_id_tl _prop }
      { thesubsubpart } { \thesubsubpart }
  }
\AddToHook { postnotes/print/note/begin }
  {
    \prop_get:cnN
      { g__ypnia_exam_ \l_postnotes_print_note_id_tl _prop }
      { thequestion } \pnthequestion
    \prop_get:cnN
      { g__ypnia_exam_ \l_postnotes_print_note_id_tl _prop }
      { thepartno } \pnthepartno
    \prop_get:cnN
      { g__ypnia_exam_ \l_postnotes_print_note_id_tl _prop }
      { thesubpart } \pnthesubpart
    \prop_get:cnN
      { g__ypnia_exam_ \l_postnotes_print_note_id_tl _prop }
      { thesubsubpart } \pnthesubsubpart
  }
\ExplSyntaxOff

\begin{document}

\begin{questions}
  \addpoints \question This is the first question
  \begin{parts}
    \part This is part one.
    \answer{Answer 1.1}
    \part This is part two.
    \answer{Answer 1.2}
  \end{parts}
  \addpoints \question This the second question

  \answer{This is the solution to question two.}

\end{questions}

\theanswers

\end{document}

结果是:

在此处输入图片描述

请注意以下编号方案:

\renewcommand{\solutiontitle}{\noindent\textbf{Solution \thequestion\thepartno\thesubpart\thesubsubpart:}\par\noindent}

有点尴尬。这不是在 LaTeX 中嵌套不同级别文档计数器的常用方法,而是将上级合并到打印表示中(\the...)。具体来说,您依赖于partnosubpart并且subsubpart按照类中的默认格式进行格式化,因此 0 不会产生输出。这可能很脆弱,但也许在 中是有意义的exam,因为子级别看起来非常接近,因此嵌套会有点过头。无论如何,即使不应应用通常的嵌套,我仍然会使用类似的东西:

\documentclass[a4paper]{exam}

% This is already the default nowadays.
% \usepackage[utf8]{inputenc}

\printanswers

\newcommand*{\pnsolution}{}
\AddToHook{env/questions/begin}{%
  \renewcommand*{\pnsolution}{\thequestion}}
\AddToHook{env/parts/begin}{%
  \renewcommand*{\pnsolution}{\thequestion\thepartno}}
\AddToHook{env/subparts/begin}{%
  \renewcommand*{\pnsolution}{\thequestion\thepartno\thesubpart}}
\AddToHook{env/subsubparts/begin}{%
  \renewcommand*{\pnsolution}{\thequestion\thepartno\thesubpart\thesubsubpart}}

\renewcommand{\solutiontitle}{\noindent\textbf{Solution \pnsolution:}\par\noindent} % like the exam documentation recommends

\usepackage{postnotes}
\postnotesetup{
  listenv=none,
  format=\normalsize,
  maketextmark=,
}
\renewcommand*{\pntitle}{Answers}

\NewDocumentCommand{\answer}{m}{%
  \postnote[nomark]{\vspace*{-3.5ex}\begin{solution}#1\end{solution}}}

\NewDocumentCommand{\theanswers}{}{\printpostnotes}

\ExplSyntaxOn
\AddToHook { postnotes/note/store }
  {
    \tl_new:c { g__ypnia_solution_ \l_postnotes_note_id_tl _tl }
    \tl_gset:cx { g__ypnia_solution_ \l_postnotes_note_id_tl _tl }
      { \pnsolution }
  }
\AddToHook { postnotes/print/note/begin }
  {
    \tl_set:Nv \pnsolution
      { g__ypnia_solution_ \l_postnotes_print_note_id_tl _tl }
  }
\ExplSyntaxOff

\begin{document}

\begin{questions}
  \addpoints \question This is the first question
  \begin{parts}
    \part This is part one.
    \answer{Answer 1.1}
    \part This is part two.
    \answer{Answer 1.2}
  \end{parts}
  \addpoints \question This the second question

  \answer{This is the solution to question two.}

\end{questions}

\theanswers

\end{document}

还请注意,您需要最新版本postnotes(v0.2.2) 才能实现上述功能。

相关内容