如何循环将彩色文本附加到宏中?

如何循环将彩色文本附加到宏中?

我正在尝试在循环中将几个彩色数字附加到宏中。也就是说,我希望通过循环实现以下目标:

\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}{}

用于初始化标记列表容器,这样您就不会冒险重新定义一些非常重要的东西。最后,请注意您的代码有几个问题,引入了空格甚至段落中断。

相关内容