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