有没有办法给命令添加索引?例如:
\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
为:\varIV
some 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