创建变量数组

创建变量数组

我正在为我的试卷创建一个包。(我知道考试类别,但我不想使用它。)我已经准备好了一切,但我想在第一页的顶部创建一个评分表。为此,我需要将考试分数放在一个数组中。我有一个命令用于输出分数。我需要做的是将它们放在一些类似数组的变量中,这样我就可以循环遍历它并在表中输出分数。我该如何创建该数组?我不知道。任何提示都将不胜感激。

答案1

您可以定义一个名称包含数字的宏。使用 LaTeX2e包中的\@namedefand \@nameuse、 or \csdef。and本身提供无需索引的列表操作。\csuseetoolboxetoolbox

一个例子:

\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}

输出如下:

在此处输入图片描述

相关内容