![原始 (La)TeX 中是否有 `for each` 循环?](https://linux22.com/image/402479/%E5%8E%9F%E5%A7%8B%20(La)TeX%20%E4%B8%AD%E6%98%AF%E5%90%A6%E6%9C%89%20%60for%20each%60%20%E5%BE%AA%E7%8E%AF%EF%BC%9F.png)
我正在尝试遍历所有基本颜色的列表:
\def\thecolors{black, blue, brown, cyan, darkgray, gray, green, lightgray, lime, magenta, olive, orange, pink, purple, red, teal, violet, white, yellow}
我想为它们每个定义一个带有某种for each
循环的命令,大致如下:
\foreach \x in \thecolors%
{\newcommand{\csname command\x\endcsname}
{\textcolor{\x}{Some text including the string \x.}}
我知道这或多或少是实现此目的的方法pgf/tikz
,但我想知道是否有办法仅使用 (La)TeX 原始命令来实现此目的。
提前感谢任何答复。
附言:我是否需要明确定义\thecolors
,或者 LaTeX 基本颜色是否已存储在某些命令中?
编辑
我不认为这是重复的(1)因为它明确要求 (La)TeX 原始方法。
答案1
在 LaTeX 中,一种更“原始”的方式,同时也避免了使用 分组时出现的问题\foreach
,就是
\makeatletter
\def\basiccolors{%
black,blue,brown,cyan,darkgray,gray,green,lightgray,lime,%
magenta,olive,orange,pink,purple,red,teal,violet,white,yellow%
}
\def\do@def#1{%
\expandafter\newcommand\csname command#1\endcsname{%
\textcolor{#1}{Some text including the string #1}%
}%
}
\@for\next:=\basiccolors\do{\expandafter\do@def\expandafter{\next}}
\makeatother
请注意,项目列表中不允许有空格。
它是很多更容易expl3
:
\usepackage{expl3}
\ExplSyntaxOn
\NewDocumentCommand{\makecommandsfromlist}{mm}
{
\clist_map_inline:nn { #1 }
{
\cs_new:cpn { command ##1 } { #2 }
}
}
\ExplSyntaxOff
\makecommandsfromlist{
black, blue, brown, cyan, darkgray, gray, green,
lightgray, lime, magenta, olive, orange, pink,
purple, red, teal, violet, white, yellow
}
{\textcolor{#1}{Some text including #1}}
答案2
您可以使用\@for
或expl3
列表,但通常更方便(在扩展方面更有效)的技术是使用不同的结构,它允许您执行没有单独循环宏的列表,这在教科书的附录 D 中进行了解释并在乳胶中的几个地方使用(寻找\@elt
用法)我将\\
在这里使用。
\documentclass{article}
\def\thecolors{\\{black}\\{blue}\\{brown}\\{cyan}\\{darkgray}\\{gray}\\{green}\\{lightgray}\\{lime}\\{magenta}\\{olive}\\{orange}\\{pink}\\{purple}\\{red}\\{teal}\\{violet}\\{white}\\{yellow}}
\usepackage{xcolor}
\begin{document}
{%
\def\\#1{\expandafter\gdef\csname command#1\endcsname{%
\textcolor{#1}{Some text including the string #1.}}}%
\thecolors
}
\commandblue
\end{document}