\pgfkeys
我正在尝试在以下设置中使用:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfkeys}
\begin{document}
\begin{tikzpicture}[%
m1 color/.initial=red,
m2 color/.initial=green,
m3 color/.initial=blue,
]
\foreach \i in {1, ..., 3} {%
\pgfkeys{/tikz/m\i color/.get=\c}
\node at (0, \i) [color=\c] {\i};
}
\end{tikzpicture}
\end{document}
当我编译它时,出现以下错误:
! Package xcolor Error: Undefined color `\c '.
如果我更改代码以不使用\i
选择键,即:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfkeys}
\begin{document}
\begin{tikzpicture}[%
m1 color/.initial=red,
m2 color/.initial=green,
m3 color/.initial=blue,
]
\foreach \i in {1, ..., 3} {%
\pgfkeys{/tikz/m1 color/.get=\c}
\node at (0, \i) [color=\c] {\i};
}
\end{tikzpicture}
\end{document}
然后它可以编译,但是现在我无法遍历键。
我还注意到这确实有效:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfkeys}
\begin{document}
\begin{tikzpicture}[%
color1/.initial=red,
color2/.initial=green,
color3/.initial=blue,
]
\foreach \i in {1, ..., 3} {%
\pgfkeys{/tikz/color\i/.get=\c}
\node at (0, \i) [color=\c] {\i};
}
\end{tikzpicture}
\end{document}
那么第一个例子有什么问题?
只是出于好奇,我尝试更改m1 color
为m1_color
,然后现在它起作用了。因此,它似乎与空间有关。但是什么呢?
答案1
宏会删除其后面的任何空格,因此m\i color
将扩展为m1color
不等m1 color
。您需要添加一个明确的空格m\i\space color
::
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfkeys}
\begin{document}
\begin{tikzpicture}[%
m1 color/.initial=red,
m2 color/.initial=green,
m3 color/.initial=blue,
]
\foreach \i in {1, ..., 3} {%
\pgfkeys{/tikz/m\i\space color/.get=\c}
\node at (0, \i) [color=\c] {\i};
}
\end{tikzpicture}
\end{document}
另请注意,并不总是支持对键值使用宏。在这种情况下是支持color
的,但对于其他键,您可能需要先通过添加/.expand once
到键来扩展它,例如color/.expand once=\c
。
答案2
如果你更改
\pgfkeys{/tikz/m\i color/.get=\c}
到
\pgfkeys{/tikz/m\i\space color/.get=\c}
但我不能保证它能达到你想要的结果......