是否可以添加两个保存整数值的不相关变量?
例如,我有这个 MWE
\documentclass[addpoints]{exam}
\usepackage{enumitem}
\begin{document}
\begin{enumerate}[label=\textbf{\arabic*}\hspace{4mm}]
\item this is one
\item this is two
\item this is three
\label{lst:num} % this will give me the number of bullet points I have (in this case its 3)
\end{enumerate}
\begin{questions}
\question[2] this is one
\question[3] this is two
\question[4] this is three
\end{questions}
Total = \numpoints + \ref{label} % 9+3 (from our bullet point) = 12 (the result I want to obtain)
\end{document}
在上面的例子中,我想添加\numpoints
和\ref{label}
以产生结果 12。可以吗?
答案1
这是一个强大的:
- 标签的值
lst:num
是使用\getrefnumber
从refcount
包中检索的 - 使用 可以检索点的值
\numpoints@exp
。
一些解释:
- 最外层的逻辑是将两个整数相加,因此我们有
\the\numexpr <num1>+<num2>\relax
,其中<num1>
和都<num2>
应该完全可扩展并在输入流中留下一个整数。 - 这
<num1>
是 打印的值\numpoints
,其定义为
并且不可扩展\def\numpoints{\@ifundefined{exam@numpoints}% {\mbox{\normalfont\bfseries ??}}% \exam@numpoints }
\exam@numpoints
是未定义或等于\relax
。因此,\numpoints@exp
提供了一个可扩展的变体,0
当\exam@numpoints
未定义时,它会退出。 - 这
<num2>
是存储在 label 中的值lst:num
。同样,\ref{lst:num}
当 labellst:num
未定义时(例如在第一次运行中),是不可扩展的。\getrefnumber{<label>}
是的可扩展变体,当未定义时\ref
,它也会返回。0
<label>
更新:
要使用enumitem
option label
,需要添加两件事:
enumitem
选项ref
用于恢复存储在项目标签中的阿拉伯“值”的纯文本格式- 提供了一个包装宏,它去掉了“返回值”周围的
\getrefnumber@wrap{<label>}
一层括号(由 添加) 。enumitem
\getrefnumber
\documentclass[addpoints]{exam}
\usepackage{enumitem}
\usepackage{refcount}
\makeatletter
\newcommand\getTotalPoints[1]{%
\the\numexpr\numpoints@exp+\getrefnumber@wrap{#1}\relax
}
% expandable variant of \numpoints
\def\numpoints@exp{%
\ifcsname exam@numpoints\endcsname\exam@numpoints\else0\fi
}
% strip pair of braces from result of \getrefnumber{<label>}
\def\getrefnumber@wrap#1{%
\expandafter\getrefnumber@wrap@i\expanded{\getrefnumber{#1}}\@nil
}
\def\getrefnumber@wrap@i#1\@nil{#1}
\def\enit@reflabel#1#2{%
\ifnum\enit@depth=\@ne\else % no level 0
\advance\enit@depth\@ne
\@namedef{p@\@enumctr}{}% Don't accumulate labels
\advance\enit@depth\m@ne
\fi
\ifcase#2%
\@namedef{the\@enumctr}{#1}%
\else
\enit@normlabel{\csname the\@enumctr\endcsname}{#1}%
\fi}
\makeatother
%\usepackage{unravel}
\providecommand\unravel[1]{#1}
\providecommand\unravelsetup[1]{}
\unravelsetup{max-action=1000, max-input=1000, max-output=1000}
\begin{document}
\begin{enumerate}[label=\textbf{\arabic*}\hspace{4mm}, ref=\arabic*]
\item this is one
\item this is two
\item this is three
\label{lst:num} % this will give me the number of bullet points I have (in this case its 3)
\end{enumerate}
\begin{questions}
\question[2] this is one
\question[3] this is two
\question[4] this is three
\end{questions}
Total = \getTotalPoints{lst:num}
\end{document}