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

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

我正在使用练习包来编写练习及其相应的答案。每章末尾都包含练习列表,我希望在课程结束时包含所有练习的所有答案。为此,我使用了包选项 answerdelayed,除了烦人的问题外,效果很好。问题是,答案中定义的任何引用都被报告为未定义,即使对它们的唯一引用也在答案中。

例如

\documentclass{book}

\usepackage{mwe}
\usepackage{float}
\usepackage[answerdelayed]{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}
\shipoutAnswer
\end{document}  

报告

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

如果我放弃选项answerdelayed,我会得到正确参考该图的答案,但这会给我一长串难看的问题和答案。我怎样才能抑制由于未包含练习答案而导致的未定义引用警告?我尝试了相关文章中建议的解决方法(使用 noanswer 选项时,如何抑制练习答案中未定义的引用?answerdelayed),但该选项似乎不起作用。

答案1

另一个问题的答案使用了稍微复杂的语法。使用etoolbox包可以更轻松地完成此操作,该包(除其他功能外)提供了一个\AtBeginEnvironment将代码添加到环境启动的命令。

在环境开始时添加代码意味着代码仅在环境内部具有范围,因此\ref仍然在答案之外有效。

当这两个选项均未使用时,可以将重新定义包含在answerdelayed或选项的检查中,noanswer以便使其在答案中正常工作。\ref

下面的重新定义包括检查引用是否已定义,使用\IfRefUndefinedExpandable来自refcount包的。使用此检查\ref可以在 期间正常使用,而当未出现在文档中\shipoutAnswer时,未定义引用警告将被抑制。要在重新定义中使用 的原始定义,可以使用 将原始定义复制到可在 的新版本中使用的新宏。\shipoutAnswer\ref\let\origref\ref\origref\ref

这种方法的一个缺点是,当答案中的引用实际上未定义时,警告也会被抑制。为了更容易发现这些引用,您可以在文档本身中打印一个显眼的警告。

梅威瑟:

\documentclass{book}
\usepackage{mwe}
\usepackage{float}
\usepackage{etoolbox}
\usepackage[answerdelayed]{exercise}
\usepackage{refcount}
\usepackage{xcolor}
\usepackage[T1]{fontenc}
\makeatletter
\let\origref\ref
\if@AnswerDelay\AtBeginEnvironment{Answer}{%
\def\ref#1{%
\IfRefUndefinedExpandable{#1}{\textcolor{red}{UNDEFINED \detokenize{#1}}}{\origref{#1}}}%
}%
\fi
\if@AnswerOutput\else
\AtBeginEnvironment{Answer}{%
\def\ref#1{%
\IfRefUndefinedExpandable{#1}{\textcolor{red}{UNDEFINED \detokenize{#1}}}{\origref{#1}}}%
}%
\fi
\makeatother

\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} and Table~\ref{tab:some_table}.
    \end{Answer}
\shipoutAnswer
Solve exercise \ref{exe:some_exercise}.

\end{document}

在此处输入图片描述

相关内容