在循环中使用宏

在循环中使用宏

我想知道是否有办法在\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

\csname您可以使用...对构造控制序列名称\endcsname

在此处输入图片描述

\documentclass{article}

\usepackage{pgffor}

\newcommand{\labA}{Adult}
\newcommand{\labB}{Adolescent}
\newcommand{\labC}{Child}

\begin{document}

\foreach \age in {A,B,C} {%
  Age~\age: \csname lab\age\endcsname\par
}

\end{document}

答案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

在此处输入图片描述

相关内容