我正在尝试在循环中将几个彩色数字附加到宏中。也就是说,我希望通过循环实现以下目标:
\documentclass{article}
\usepackage{tikz}
\colorlet{color1}{red}
\colorlet{color2}{green!50!black}
\colorlet{color3}{blue}
\colorlet{color4}{black}
\begin{document}
% create a macro that would expand to
\color{color1}1 \color{color2}2 \color{color3}3
\color{color4}4
\end{document}
我能够使用 etoolbox 中的 \xappto 命令将黑色数字添加到宏中,如下所示(我使用 pgf/tikz 进行 foreach 循环):
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\begin{document}
\def\list{}
\foreach \x in {1,...,4} {
\xappto\list{\x\ }
}
\list
\end{document}
因为我稍后会经常使用这些数字,所以我想通过为每个数字分配不同的颜色使它们更容易识别,如下所示:
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\colorlet{color1}{red}
\colorlet{color2}{green!50!black}
\colorlet{color3}{blue}
\colorlet{color4}{black}
\begin{document}
\def\list{}
\foreach \x in {1,...,4} {
% Error because \x not defined outside the loop when \list is expanded
\gappto\list{\color{color\x}}
% Possible problem with the expansion of the \color macro
\xappto\list{\color{color\x}}
\xappto\list{\x\ }
}
\list
\end{document}
但是,在这种情况下,\xappto 和 \gappto 都不起作用。如果我手动扩展 \x,\gappto 就可以工作(例如,当我在 \gappto 命令中将“color\x”替换为“color1”时)。有没有办法强制 latex 扩展 \x,或者有没有更好的方法来解决这个问题?
答案1
我的印象是这是一个 XY 问题。无论如何,这里有一种方法可以实现您的目标:
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\colorlet{color1}{red}
\colorlet{color2}{green!50!black}
\colorlet{color3}{blue}
\colorlet{color4}{black}
\begin{document}
\newcommand*\tomlist{}
\foreach \x in {1,...,4} {%
% Possible problem with the expansion of the \color macro
\xappto\tomlist{\noexpand\color{color\x}\x\ }%
}
\noindent
{\footnotesize\texttt{\meaning\tomlist}}
\noindent
\tomlist
\end{document}
请注意\noexpand
会抑制 的扩展\color
。还请注意\list
是一个非常糟糕的名称,因为它是诸如enumerate
和 等环境itemize
所基于的命令。最好使用
\newcommand*{\tomlist}{}
用于初始化标记列表容器,这样您就不会冒险重新定义一些非常重要的东西。最后,请注意您的代码有几个问题,引入了空格甚至段落中断。