\the计数器能否做到被该命令后面的计数器命令影响?

发布于 2021-08-14 09:59:42

问题背景:
想实现试卷排版的一项分数统计功能,下面举例:

一、计算题(共8分)
1.(3分)xxx
2.(5分)xxx

想要计算题后面的“共x分”,这个x可以自动变成下面的分数总和
于是自己用计数器来尝试实现

\documentclass{ctexart}
\newcounter{scores}
\newcommand{\totalscore}{
    \setcounter{scores}{0}
    (共\thescores 分)
}
\newcommand{\subscore}[1]{%
    \addtocounter{scores}{#1}%
    (#1 分)
}
\begin{document}
一、计算题 \totalscore

1.\subscore{2}
\end{document}

image.png

却遇到了问题:
thescores只能显示这个命令之前对scores计数器的操作
这个命令之后的完全不影响他
能否实现后面对socres计数器进行操作的时候,前面的这个thescores也在跟着变呢?

查看更多

关注者
0
被浏览
1.2k
越来越少
越来越少 2021-08-14
这家伙很懒,什么也没写!

查《source2e》, 参考 \label\ref 的做法。命令 \label 将一个全局定义命令\global\@namedef写入 .aux 文件,之后 \ref 会引用这个定义,需要编译两次。

下面是一个例子:

%命令 \TotalPointsRef{<题号宏>} 返回给 <题号宏> 分配的分数
%<题号宏> 是 \examONE 这种形式
\def\TotalPointsRef#1{
  \ifdefined#1%
    (total: #1)
  \else%
    (Ref none!!!)
  \fi%
}

\TotalPointsRef\examONE

\makeatletter
%#1 代表题号,#2 代表分数
%控制序列 \examONE 代表第 ONE 题,ONE 是题号
\def\examtotalwriteout#1#2{%
  \expandafter\string%
  \expandafter\xdef%
  \expandafter\string%
  \csname exam#1\endcsname{#2}%
}
%写入 .aux 文件
\immediate\write\@auxout{%
  \examtotalwriteout{ONE}{10}
}
\makeatother

命令 \label 的定义要复杂一些,可以参考《LaTeX2e 文类和宏包学习手册》和《source2e》来看。

大体意思就是这样。

3 个回答
寄存器
寄存器 2021-08-14
这家伙很懒,什么也没写!

个人觉得直接使用exam实现可能更为方便,如果一定要自己实现,可以考虑LaTeX3。

乙醇
乙醇 2021-08-14
这家伙很懒,什么也没写!

https://tex.stackexchange.com/a/592134/180617
参考一下这个回答以及 exam 文档类的源码试一下

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览