几个月前,egreg 给了一个精彩答案回答我关于使用exam
文档类修改成绩表的问题。最近,在加载hyperref
包后,我意识到修改后的表格中指向问题位置的超链接没有保留。
也许经验丰富的用户很容易知道为什么会这样,但 egreg 的代码超出了我的理解范围。我想知道是否有办法修改以下代码以保留问题的超链接:
\documentclass[10pt,addpoints]{exam}
\usepackage{xparse,tabularx,refcount,etoolbox}
\usepackage{hyperref}
\usepackage{lipsum}
\newcounter{grading}
\BeforeBeginEnvironment{questions}{%
\stepcounter{grading}%
\gradingtable
}
\AfterEndEnvironment{questions}{%
\addtocounter{question}{-1}%
\refstepcounter{question}%
\label{grading\thegrading @label}%
}
\ExplSyntaxOn
\tl_new:N \l__farlow_grading_tl
\NewDocumentCommand{\gradingtable}{}
{
\tl_clear:N \l__farlow_grading_tl
\int_step_inline:nnnn { 1 } { 1 } { \getrefnumber{grading\thegrading @label} }
{
\tl_put_right:Nn \l__farlow_grading_tl
{
##1 \vphantom{$\bigg|$} & & & \\ \hline
}
}
\par\noindent
\begin{tabularx}{\textwidth}
{
| c |
>{\hsize=0.5\hsize} X |
>{\hsize=0.5\hsize} X |
>{\hsize=2.0\hsize} X |
}
\hline
Problem &
\multicolumn{1}{c|}{Understood} &
\multicolumn{1}{c|}{Confused} &
\multicolumn{1}{c|}{Note} \\ \hline
\tl_use:N \l__farlow_grading_tl
\end{tabularx}
}
\ExplSyntaxOff
\begin{document}
\begin{questions}
\fullwidth{\lipsum[1-2]}
\question First question.
\question Second question.
\end{questions}
\end{document}
这将产生以下内容:
在上面的代码中,我只修改了 egreg 的原始代码通过加载hyperref
包以及摆脱二 question
环境。就我的想法而言,我只需要一个questions
环境,但如果表格中的问题编号能够超链接到文档中相应编号的问题,那就太理想了。
是否有一个相对简单的方法可以修改 egreg 的代码来实现这一点,或者这基本上是一个失败的办法?
答案1
您需要做的就是告诉 TeX,在制作表格时,应该删除超链接而不是数字。因此,请更改此行:
##1 \vphantom{$\bigg|$} & & & \\ \hline
到
\ref{question@##1} \vphantom{$\bigg|$} & & & \\ \hline
这是在每个环境开始时创建空白表的行。它循环遍历已设置的一些标签并将它们转储到表中。通过对包进行一些研究(即\process@question
从 的扩展中查看 的定义\question
),每个问题都设置了一个名为 的标签question@*number*
。我们用这些标签替换了 egreg 输入的数字,超链接就在那里。