我需要有多个可通过索引访问的列表(类似数组)。我的最小非工作示例如下:
\documentclass{minimal}
\usepackage{etoolbox}
\newcounter{listAcounter}
\newcommand\addToList[3]{%
\stepcounter{#2}%
\csdef{#1\the#2}{#3}
}
\newcommand\getFromList[2]{%
\csuse{#1#2}
}
\begin{document}
\addToList{listA}{listAcounter}{one}
\addToList{listA}{listAcounter}{two}
\addToList{listA}{listAcounter}{three}
This is element 2 from list A: \getFromList{listA}{2}.
\end{document}
我使用 pdflatex 进行编译得到:
! You can't use `the letter l' after \the.
<argument> listA\the l
istAcounter
l.17 \addToList{listA}{listAcounter}{one}
我该如何修复此代码?为什么这是错误的?
答案1
当你输入时,\the#2
你已经有一个形成的标记,因此它不会合并成一个命令名称,例如\thelistAcounter
。你必须自己构建名称:
\documentclass{article}
\usepackage{etoolbox}
\newcounter{listAcounter}
\newcommand\addToList[3]{%
\stepcounter{#2}%
\csdef{#1\csuse{the#2}}{#3}
}
\newcommand\getFromList[2]{%
\csuse{#1#2}%
}
\begin{document}
\addToList{listA}{listAcounter}{one}
\addToList{listA}{listAcounter}{two}
\addToList{listA}{listAcounter}{three}
This is element 2 from list A: \getFromList{listA}{2}.
\end{document}
注意%
后面的\csuse{#1#2}
。
使用 可以更轻松地实现expl3
,避免定义计数器。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newList}{m}
{
\seq_new:c { l_kees_list_#1_seq }
}
\NewDocumentCommand{\addToList}{mm}
{
\seq_put_right:cn { l_kees_list_#1_seq } { #2 }
}
\NewDocumentCommand{\getFromList}{mm}
{
\seq_item:cn { l_kees_list_#1_seq } { #2 }
}
\ExplSyntaxOff
\begin{document}
\newList{listA}
\addToList{listA}{one}
\addToList{listA}{two}
\addToList{listA}{three}
This is element 2 from list A: \getFromList{listA}{2}.
\end{document}