问题背景:
想实现试卷排版的一项分数统计功能,下面举例:
一、计算题(共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}
却遇到了问题:
thescores只能显示这个命令之前对scores计数器的操作
这个命令之后的完全不影响他
能否实现后面对socres计数器进行操作的时候,前面的这个thescores也在跟着变呢?
查《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》来看。
大体意思就是这样。
https://tex.stackexchange.com/a/592134/180617
参考一下这个回答以及 exam
文档类的源码试一下
耿教授,我并没有编排试卷需求,只是昨天看到群里的老师提出了需求,我就想试一下能否实现,提高自己的LaTeX水平,而且exam的东西太多了,很多东西调试起来比较麻烦,我还是喜欢个人定制,更自由。
关于您说的LaTeX3,我将上面的自定义代码换成了
但是结果还是一样的,我思考了一下是因为这样的使用逻辑和计数器的并没有本质区别,我现在掌握的知识还不够,我想不到其他的使用逻辑与方法,耿教授能否指点指点
我原本想的是设置成全局变量什么的可以试试,但是结果都是一样的