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