TikZ \foreach 循环与宏定义列表

TikZ \foreach 循环与宏定义列表

\foreach每当我们循环的列表由宏定义时,我在 TikZ 循环中都会遇到一个小问题。 以下代码示例将显示我的问题:

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}
Picture one:

\begin{tikzpicture}
\foreach \x/\y in {1.0/2.0, 3.0/4.0} \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}

Picture two:

\newcommand{\mymacro}{1.0/2.0, 3.0/4.0}
\begin{tikzpicture}
\foreach \x/\y in {\mymacro} \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}
\end{document}

预期结果是两幅图像看起来相同。但在第二张图片中,我只得到一个节点 - 并且\x\y都是每一次扩展到1.0/2.0, 3.0/4.0。希望有人能帮忙。

答案1

\mymacro循环不会扩展,\foreach但之后才会扩展。您需要删除{ }宏周围的括号才能使其工作:

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}
Picture one:

\begin{tikzpicture}
\foreach \x/\y in {1.0/2.0, 3.0/4.0} \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}

Picture two:

\newcommand{\mymacro}{1.0/2.0, 3.0/4.0}
\begin{tikzpicture}
\foreach \x/\y in \mymacro \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}
\end{document}

请注意,虽然通常两者参数 {\mymacro}并且\mymacro是相同的,\foreach似乎测试{并且扩展该论点,如果它不存在。

答案2

从 3.1.7 版(2020 年 11 月)开始,蒂克兹支持expand list选项\foreach

来自TikZ 与 PGF手动的:

/pgf/foreach/expand list={<boolean>}(默认false
如果将此键设置为 true,则列表的内容将\edef在进一步处理之前完全展开。这允许使用复杂的宏,在展开时生成列表,而无需使用中间宏。

因此,如果生成列表的宏需要多次扩展,这将特别有用。

\documentclass{article}
\usepackage{tikz}

\begin{document}
Picture one:

\begin{tikzpicture}
\foreach \x/\y in {1.0/2.0, 3.0/4.0} \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}

Picture two:

\newcommand{\mymacro}{1.0/2.0, 3.0/4.0}
\begin{tikzpicture}
\foreach[expand list] \x/\y in {\mymacro} \node[draw] at (\x,\y) {\x--\y};
\end{tikzpicture}
\end{document}

相关内容