![在循环中使用宏](https://linux22.com/image/333763/%E5%9C%A8%E5%BE%AA%E7%8E%AF%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%AE%8F.png)
我想知道是否有办法在\foreach
循环中使用宏。例如,我定义的一些局部变量是:
\newcommand{\labA}{Adult}
\newcommand{\labB}{Adolescent}
\newcommand{\labC}{Child}
在正文中,我想要做的是使用 ABC 生成一个 for 循环,但显示\labA
、\labB
和\labC
。例如
\foreach \age in {A,B,C}
{
(I want to show \lab\age here)
}
但是,\lab\age
似乎不起作用,我想知道是否有办法从循环中显示包含本地(A,B 和 C)的本地。
答案1
答案2
xparse
使用和的相当灵活的实现expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\agename}{m}
{
\str_case:nnF { #1 }
{
{A}{Adult}
{B}{Adolescent}
{C}{Child}
}
{You~fool!}
}
\NewDocumentCommand{\xforeach}{m +m}
{
\clist_map_inline:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\xforeach{A,B,C}{%
Age #1: \agename{#1}\par
}
\end{document}
如您所见,循环中的“变量”用#1
定义虚拟宏来表示。
代码几乎很简单:宏\agename
根据对应关系列表检查其参数。“错误分支”可能是一个更好的错误捕获函数,目前它只是打印“你这个傻瓜!”。
该\xforeach
宏是用户级版本:作为第一个参数给出的逗号分隔列表中的每个项目都按照第二个参数中指定的内容\clist_map_inline:nn
使用。#1