引用自定义环境中的内容

引用自定义环境中的内容

我一直在绞尽脑汁解决这个问题,不知道我做错了什么。此代码高度基于此解决方案但有些东西没有点击。目标是能够稍后在我的代码中引用解决方案环境的内容。

以下是我正在处理的工作:

\documentclass[addpoints,12pt]{exam}
\usepackage{environ}

\makeatletter
\NewEnviron{sol}{
\begin{solution}
\def\@currentlabel{\BODY}\label{solt:\thequestion}
\BODY
\end{solution}
}
\makeatother


\begin{document}
\begin{questions}
\question This is a question

\begin{sol}
My solution
\end{sol}

\begin{choices}
\choice 8
\choice 1
\choice 3
\choice 4
\end{choices}

\end{questions}


The first solution is:\\
\ref{solt:1}

\end{document}

当我运行此程序时,我收到无效引用。有什么提示可以指出我可能做错了什么吗?

答案1

该解决方案未排版,因此您的标签永远不会在文件中生成.aux,我认为您打算

\documentclass[addpoints,12pt]{exam}
\usepackage{environ}

\makeatletter
\NewEnviron{sol}{%
\def\@currentlabel{\BODY}\label{solt:\thequestion}%
\begin{solution}%
\BODY
\end{solution}%
}
\makeatother


\begin{document}
\begin{questions}
\question This is a question

\begin{sol}
My solution
\end{sol}

\begin{choices}
\choice 8
\choice 1
\choice 3
\choice 4
\end{choices}

\end{questions}


The first solution is:\\
\ref{solt:1}

\end{document}

但是使用带有自动生成密钥的 a\label似乎很危险,对文件的任何编辑都意味着问题会得到一个新编号,因此将在没有任何警告的情况下引用另一个问题。 更符合/\ref的精神的是为您的环境提供一个参数,以便您提供一个要在 中使用的名称,然后您也可以在 中使用它。\label\refsol\label\ref

相关内容