使用 etoolbox 自定义元素列表

使用 etoolbox 自定义元素列表

我需要有多个可通过索引访问的列表(类似数组)。我的最小非工作示例如下:

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

在此处输入图片描述

相关内容