使用索引创建变量(使用计数器)

使用索引创建变量(使用计数器)

有没有办法给命令添加索引?例如:

\newcounter{count}
\loop<condition>
  \def\var\Roman{count}{some data}
\repeat

应该\var\Roman{count}变成变量\varI\varII\varIII等等。

背景:我需要从外部文件获取一些数据并将其存储到变量中(稍后我将使用这些变量创建文档)。通常,every\varI应该与 every 相同\varII,但我需要检查是否确实如此。如果不是,我应该返回警告或错误。


第一个问题的解决方案在评论中,但我有第二个问题。

假设我写了这个:

\newcommand\addindex[3]{  % #1 as name of var, #2 as index and #3 as content
  \expandafter\def\csname #1\Roman{#2}\endcsname{#3}  % thanks to egreg
}

\newcounter{count}
\loop\unless\ifnum\value{count}=5
  \stepcounter{count}
  \addindex{var}{count}{\arabic{count}}
\repeat

所有\var<index>这些现在的值都是 5,因为它们被定义为\arabic{count},而不是它们此刻的值。出于某种原因,添加\expandafter之前的\arabic{count}值似乎不起作用...

答案1

该方法非常简单,但我添加了一个可能对您的应用程序有用的技巧:

\newcounter{tempcount} % for temporary usage

\newcommand\addindex[4][]{% #2 as name of var, #3 as index and #4 as content
  \csname#1def\expandafter\endcsname\csname #2\Roman{#3}\endcsname{#4}%
}

现在我们要定义\varI\varII并扩展\varIII为:\varIVsome text

\setcounter{tempcount}{0}

\loop\ifnum\value{tempcount}<4
  \stepcounter{tempcount}
  \addindex{var}{tempcount}{some text}
\repeat

如果您希望将其\varI扩展为1等等,则可选参数的作用如下:

\setcounter{tempcount}{0}

\loop\ifnum\value{tempcount}<4
  \stepcounter{tempcount}
  \addindex[e]{var}{tempcount}{\arabic{tempcount}}
\repeat

通过传递e可选参数,执行的是\csname edef\endcsname,即\edef在进行定义之前完全扩展替换文本。不带可选参数时,仅\def使用。

更有效的定义是\vari\varii等等(使用小写罗马数字):

\newcommand\addindex[4][]{% #2 as name of var, #3 as index and #4 as content
  \csname#1def\expandafter\endcsname\csname #2\roman{#3}\endcsname{#4}%
}

它效率更高,因为\Roman{tempcount}必须扫描扩展中的每个字符\roman{tempcount}并将其更改为大写字母,而使用 TeX 原语\roman{tempcount}扩展为,速度非常快。\romannumeral\c@tempcount\romannumeral

相关内容