我正在使用练习包来编写练习及其相应的答案。每章末尾都包含练习列表,我希望在课程结束时包含所有练习的所有答案。为此,我使用了包选项 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}