我正在为我的试卷创建一个包。(我知道考试类别,但我不想使用它。)我已经准备好了一切,但我想在第一页的顶部创建一个评分表。为此,我需要将考试分数放在一个数组中。我有一个命令用于输出分数。我需要做的是将它们放在一些类似数组的变量中,这样我就可以循环遍历它并在表中输出分数。我该如何创建该数组?我不知道。任何提示都将不胜感激。
答案1
您可以定义一个名称包含数字的宏。使用 LaTeX2e包中的\@namedef
and \@nameuse
、 or \csdef
。and本身提供无需索引的列表操作。\csuse
etoolbox
etoolbox
一个例子:
\documentclass{article}
\usepackage{etoolbox}
\newcounter{cnt}
\newcommand\textlist{}
\newcommand\settext[2]{%
\csdef{text#1}{#2}}
\newcommand\addtext[1]{%
\stepcounter{cnt}%
\csdef{text\thecnt}{#1}}
\newcommand\gettext[1]{%
\csuse{text#1}}
\newcounter{colnum}
\newcommand\maketabularrow[1]{%
\setcounter{colnum}{0}%
\whileboolexpr
{ test {\ifnumcomp{\value{colnum}}{<}{#1}} }%
{&\stepcounter{colnum}\thecolnum}
}
\begin{document}
\addtext{one}
\addtext{two}
\addtext{three}
\settext{100}{one hundred}
This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
\begin{tabular}{ |c@{} *{\thecnt}{c|} } % the first row is hidden
\hline
\maketabularrow{\thecnt}\\ \hline
\end{tabular}
100 is \gettext{100}.
\end{document}
答案2
我看得出你有两个问题。首先,你想知道如何创建一个关联(编程)数组,将问题映射到它们的要点。其次,你想知道如何创建一个(LaTeX 表)数组来打印这些内容。像我通常做的那样,我建议pgfkeys
在这里使用作为你的编程语言,特别是(在这种情况下)因为作为一个键值包,它的整个生命周期都致力于构建关联数组。
以下是我创建点数组的方法:
\usepackage{pgfkeys}
\pgfkeys{
/points array/.is family, /points array,
.unknown/.style = {\pgfkeyscurrentname/.initial = #1},
}
\newcommand\questionhaspoints[1]{\pgfkeys{/points array, #1}}
\newcommand\getquestionpoints[1]{\pgfkeysvalueof{/points array/#1}}
然后,您可以写下\questionhaspoints{1 = 10, 2 = 5}
问题 1 有 10 分,问题 2 有 5 分。如果您想检索这些,只需调用\getquestionpoints{1}
和\getquestionpoints{2}
。
调用\pgfkeys
设置了系列/points array
,以便任何时候您尝试在其中分配一个新键(目前“未知”的键),它都会被您请求的值填充。 pgfkeys
除了存储它们的值之外,还可以用键做很多事情,正如您将在稍后看到的那样。
要构建 LaTeX 数组,我认为有必要在调用 之前循环并构建行\begin{tabular}
,因为在 TeX 中,对齐对于其中可以出现的内容的位置非常讲究,特别是&
和\\
指令。最好在开始表格之前让所有内容看起来“正确”。
这是我构建表格的代码:
\usepackage{pgffor}
\pgfkeys{
/points array,
add to table/.style = {
table/.append = {
Question #1
&
\getquestionpoints{#1}
\\
},
},
}
\newcommand\makepointstable[1]{%
\pgfkeys{
/points array,
table/.initial = {},
add to table/.list = {1,...,#1}
}%
}
新键/points array/add to table
只是将其参数附加到名为 的键上table
(假定也在 中/points array
)。它用于构造 所暗示的循环中add to table/.list = {<list of question numbers>}
,该循环对其参数中的数字执行循环,add to table
每次都使用该数字进行调用。结果是键table
保存数组的主体。现在您可以将其放入 中{tabular}
。以下是执行此操作的完整文档:
\documentclass{article}
\usepackage{pgfkeys,pgffor}
\pgfkeys{
/points array/.is family, /points array,
.unknown/.style = {\pgfkeyscurrentname/.initial = #1},
add to table/.style = {
table/.append = {
Question #1
&
\getquestionpoints{#1}
\\
},
},
}
\newcommand\questionhaspoints[1]{\pgfkeys{/points array, #1}}
\newcommand\getquestionpoints[1]{\pgfkeysvalueof{/points array/#1}}
\newcommand\makepointstable[1]{%
\pgfkeys{
/points array,
table/.initial = {},
add to table/.list = {1,...,#1}
}%
}
\begin{document}
\questionhaspoints{1 = 10, 2 = 8, 3 = 15, 4 = 10}
\makepointstable{4}
\begin{tabular}{l|r}
\pgfkeysvalueof{/points array/table}
\end{tabular}
\end{document}
答案3
最新版本的 etoolbox 提供列表以及它们的管理选项。以下是任何感兴趣的人的解决方案。
下面的代码演示了创建和迭代变量列表是多么容易。
\documentclass{article}
\RequirePackage{etoolbox} % defines lists and their operations
\RequirePackage{tabulary} % defines content-based sizable tables
\begin{document}
% define few variables that hold some value
\def\One{this is one}
\def\Two{this is two}
\def\Three{this is three}
% add the above commands to a list named `CmdList'
\listcsgadd{CmdList}{One}
\listcsgadd{CmdList}{Two}
\listcsgadd{CmdList}{Three}
% Now loop-over them to print their values
\begin{description}
\renewcommand*{\do}[1]{\item[#1:] \csuse{#1}}
\dolistcsloop{CmdList}
\end{description}
% creating a table needs little bit more trickery; You cannot insert table entries directly.
% You first have to accumulate all table data into some temporary variable and then use that.
\begingroup
\newcommand\tablecontent{}
\def\do#1{\appto\tablecontent{\hline \textbf{#1} & \csuse{#1}\\}}%
\dolistcsloop{CmdList} % collect the data in a table format
\begin{tabulary}{\textwidth}{|L|L|} % now print the collected data
\tablecontent \hline
\end{tabulary}
\endgroup
\end{document}
答案4
根据上述 Leo Liu 的回答,以下是评分表的内容:
\documentclass{article}
\usepackage{etoolbox}
\newcounter{cnt}
\newcommand\textlist{}
\newcommand\settext[2]{%
\csdef{text#1}{#2}}
\newcommand\addtext[1]{%
\stepcounter{cnt}%
\csdef{text\thecnt}{#1}}
\newcommand\gettext[1]{%
\csuse{text#1}}
\begin{document}
\addtext{3}
\addtext{2}
\addtext{4}
This is text \gettext{1} and \gettext{3}, that is text \gettext{2}.
\begin{tabular}{ |c@{} *{\thecnt}{c|} } % the first row is hidden
\hline
\newcounter{colnum}%
\setcounter{colnum}{0}
\whileboolexpr
{ test {\ifnumcomp{\value{colnum}}{<}{\thecnt}} }%
{&\stepcounter{colnum}\gettext{\thecolnum}}\\
\hline
\setcounter{colnum}{0}
\whileboolexpr
{ test {\ifnumcomp{\value{colnum}}{<}{\thecnt}} }%
{&\stepcounter{colnum}\hspace{1cm}}\\\hline
\end{tabular}
\end{document}
输出如下: