定义在 foreach 循环中重复使用的序列

定义在 foreach 循环中重复使用的序列

我有一个宏,当我将它与文字序列一起使用时,它能够完全按照我的要求执行,但对于已定义为可重用的序列则不能:

\documentclass[tikz,14pt,border=10pt]{standalone}
%%%<
\usepackage{verbatim}
%%%>
\begin{comment}
\end{comment}
\title{test1}
\usetikzlibrary{shapes,arrows,positioning,calc}
\begin{document}
\begin{tikzpicture}[auto, thick, node distance=2cm, >=latex, font=\sffamily]

\newcommand{\track}[3]{
\foreach \b [count=\i] in {#3}
{
  \node[#1] at (\i*3,#2) {\b};
}
}

\newcommand{\GA}{1,1,0,0,1}
\track{fill=red!50,thin}{0.0}{1,1,0,0,1}
\track{fill=green!50,thin}{0.5}{\GA}
\end{tikzpicture}
\end{document}

在此处输入图片描述

为什么 1,1,0,0,1 的行为不同,以及如何让红色行为与宏一起工作?

答案1

嗯,这是一种方法,受到人们在 pgfplots 中这样做的方式的启发。

\documentclass[tikz,14pt,border=10pt]{standalone}
%%%<
\usepackage{verbatim}
%%%>
\begin{comment}
\end{comment}
\title{test1}
\usetikzlibrary{shapes,arrows,positioning,calc}
\begin{document}
\begin{tikzpicture}[auto, thick, node distance=2cm, >=latex, font=\sffamily]

\newcommand{\track}[3]{\edef\temp{#3}
\foreach \b [count=\i] in \temp
{
  \node[#1] at (\i*3,#2) {\b};
}
}

\newcommand{\GA}{1,1,0,0,1}
\track{fill=red!50,thin}{0.0}{1,1,0,0,1}
\track{fill=green!50,thin}{0.5}{\GA}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

如果您调用,\foreach \b in {\GA}则只会有一个循环。如果您想先评估宏,则需要删除括号。

可能的解决方案:

\documentclass[tikz,14pt,border=10pt]{standalone}
\usetikzlibrary{shapes,arrows,positioning,calc}

\newcommand{\track}[3]{%
  \expandafter\trackaux\expandafter{#3}{#1}{#2}%
}
\newcommand{\trackaux}[3]{%
  \foreach \b [count=\i] in {#1} {
    \node[#2] at (\i*3,#3) {\b};
  }%
}

\newcommand{\GA}{1,1,0,0,1}

\begin{document}

\begin{tikzpicture}[auto, thick, node distance=2cm, >=latex, font=\sffamily]
\track{fill=red!50,thin}{0.0}{1,1,0,0,1}
\track{fill=green!50,thin}{0.5}{\GA}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容