LaTeX 的低级编程记录不全,关于所谓控制命令的部分就更少了。
LaTeX 提供了\@for
宏。其工作原理是将列表项重复分配给临时变量:
我想定义一个包含所有希腊数学字母的列表。该列表定义如下:
\newcommand{\mathList}{\alpha,\beta,\gamma,
\delta,\epsilon,\zeta,\theta}
为了迭代列表,我使用了@for
宏。例如,下面将展开列表并删除逗号。
\@for\i:=\mathList\do{%
\ensuremath \i \space
}
我如何定义一个宏来删除列表中的第n 个元素?我已经想出了附加到列表的方法,但为了简洁起见,我没有发布它。我更喜欢 TeX 或 LaTeX 解决方案,尽管我也很想知道在 LaTeX3 中是如何实现的,所以欢迎所有解决方案。
为方便起见,下面给出最小示例:
\documentclass[11pt]{article}
\begin{document}
\makeatletter
\let\dotlessi\i
\newcommand*{\mathList}{\alpha,\beta,\gamma,
\delta,\epsilon,\zeta,\theta, }
\@for\i:=\mathList\do{%
\ensuremath \i \space
}
\let\i\dotlessi
\makeatother
\end{document}
答案1
这是一种方法(从列表中删除项目编号 3):
\count@=0
\toks@{}
\@for\i:=\mathList\do{%
\advance\count@ 1
\ifnum\count@=3 \else
\edef\0{\the\toks@\expandafter\noexpand\i,}%
\toks@\expandafter{\0}%
\fi
}%
\edef\mathList{\the\toks@}
答案2
在 expl3 中,你可以写
\clist_remove_element:Nn \l_tmpa_clist {foo}
foo
从逗号列表变量中删除\l_tmpa_clist
。还有一个全局变量\clist_gremove_element:Nn
。使用的技术与 Harald 发布的非常相似:迭代列表,如果元素不匹配,则将其推送到新的 clist 上。
更新: 本着 Aditya 对 ConTeXt 的 clist 方法的总结,这里还有几个 expl3 示例(涵盖了广泛的功能,但并未涉及所有内容)。初始化:
\clist_new:N \l_tmpa_clist
\clist_clear:N \l_tmpa_clist
要添加数据:
\clist_put_left:Nn \l_tmpa_clist {a}
\clist_put_right:Nn \l_tmpa_clist {b}
迭代/映射:
\clist_map_inline:Nn \l_tmpa_clist { this is element: #1 \\ }
\clist_map_inline:nn {a,b,c} { this is element: #1 \\ }
查询:
\clist_if_in:NnTF \l_tmpa_clist {a} {true} {false}
操纵:
\clist_remove_duplicates:N \l_tmpa_clist
\clist_remove_element:Nn \l_tmpa_clist {c}
当然,您不必遵循变量的 expl3 命名方案;在临时代码中,完全可以\foo
改写\l_tmpa_clist
。
expl3 中的逗号列表通常不包含空元素,并且元素周围的空格会被保留(这是一个有争议的观点,将来可能会略有改变)。它们可以包含除不受保护的逗号之外的任何内容。
expl3 还提供了一种称为“序列”的结构,其用法与 clist 类似,但旨在用于只有内部函数添加/操作数据时;逗号列表作为数据结构只有在它们从文档级输入继承数据时才真正有必要。(使用序列的优势在于处理方式更通用,并且您可以在其元素中包含逗号。)
答案3
以下是 ConTeXt 中不同逗号列表操作命令的摘要。
这就是我在 ConTeXt 中执行此操作的方法。
定义列表
\def\MathList{alpha,beta,gamma,delta,epsilon,zeta,theta}
ConTeXt 不会从列表的每个元素中删除空格。这
{alpha, beta}
与 不同{alpha,beta}
。
接下来定义一个宏来显示列表元素
\def\ShowListElement#1{\mathematics{\getvalue{#1}}\space}
要显示整个列表:
\processcommacommand[\MathList]\ShowListElement
要将元素添加到列表末尾:
\addtocommalist {phi} \MathList
\processcommacommand[\MathList]\ShowListElement
要将元素添加到列表的开头:
\pretocommalist {kappa} \MathList
\processcommacommand[\MathList]\ShowListElement
仅当元素不存在时才添加该元素。
\addtocommalist {alpha} \MathList
\processcommacommand[\MathList]\ShowListElement
要从列表中删除元素:
\removefromcommalist {gamma} \MathList
\processcommacommand[\MathList]\ShowListElement
要将元素添加到列表(不检查):
\appendtocommalist {nu} \MathList
\prependtocommalist {nu} \MathList
\processcommacommand[\MathList]\ShowListElement
替换元素的值:
\substituteincommalist {delta} {Delta} \MathList
\processcommacommand[\MathList]\ShowListElement
获取逗号列表的大小
\getcommacommandsize [\MathList]
\commalistsize
从逗号列表中获取索引元素
\getfromcommacommand [\MathList] [2]
\commalistelement
替换逗号列表中的元素
\def\newcommalistelement {iota}
\replaceincommalist \MathList {2}
\commalistelement \crlf
\processcommacommand[\MathList]\ShowListElement
反转逗号列表。结果存储在\reversedlist
\reversecommacommand\MathList
\processcommacommand[\reversedlist]\ShowListElement
每个使用的命令commacommand
也都有一个commalist
变体,如果列表未存储在宏中(例如,在处理键值列表时),则可以使用该变体。
还有一些其他特定于数字列表的功能(排序、压缩、扩展等)。