如何在 latex 中添加两个变量

如何在 latex 中添加两个变量

是否可以添加两个保存整数值的不相关变量?

例如,我有这个 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是使用\getrefnumberrefcount包中检索的
  • 使用 可以检索点的值\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>

更新:

要使用enumitemoption 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}

在此处输入图片描述

相关内容