使用 noanswer 选项时,如何抑制练习答案中未定义的引用?

使用 noanswer 选项时,如何抑制练习答案中未定义的引用?

我正在使用练习包来编写练习及其相应的答案。我有数百个练习,每个练习都在自己的文件中。练习将包含在两个单独的文档中。在第一个文档中,每个练习应该不带答案出现,而在第二个文档中,它们应该与答案一起出现。为此,我noanswer在第一个文档中使用了包选项。问题是,在第一个文档中,答案中定义的任何引用都被报告为未定义,即使对它们的唯一引用也在答案中。

例如:

\documentclass{article}

\usepackage{mwe}
\usepackage{float}
\usepackage[noanswer]{exercise}

\begin{document}
    \begin{Exercise}
        \label{exe:some_exercise}
        \blindtext
    \end{Exercise}
    \begin{Answer}[ref={exe:some_exercise}]
        \begin{figure}[H]
            \centering
            \includegraphics[width=.48\linewidth]{example-image-a}
            \caption{MWE figure}
            \label{fig:some_figure}
        \end{figure}
        \blindtext as shown in Figure~\ref{fig:some_figure}.
    \end{Answer}
\end{document}  

报告:

LaTeX Warning: Reference `fig:some_figure' on page 1 undefined on input line 20

我尝试过其他包选项,例如answerdelayed,然后从不调用\shipoutAnswer,但存在同样的问题。如何抑制由未包含的练习答案引起的未定义引用警告,但在正在排版的文档部分中仍然会看到未定义引用的警告?

编辑:

我发现了类似的问题并有一个答案,但我不知道如何将其答案应用到练习包中。

为什么在解决方案中定义和使用标签(并且未打印答案)时,我们会在考试课中收到未定义的引用警告?

答案1

如果您设置了 [noanswer],请尝试在加载 exercise.sty 后添加以下两行:

\expandafter\let\expandafter\InitAnswer\csname @InitAnswer\endcsname
\expandafter\def\csname @InitAnswer\endcsname{\def\ref##1{?}\InitAnswer}

出现问题的原因是,\vbox如果设置了 [noanswer] 选项,则通常会处理 Answer 文本,并且不使用结果。这意味着\ref需要知道标签,但标签不会写入辅助文件,因为这\write aux{... label}是打印材料中未使用的一部分\vbox。异步\write原语在这里发挥了作用。

相关内容