我正在尝试使用多个类似的预操作。由于我更希望实现自动化,因此我尝试使用带有预操作的 foreach。但似乎不起作用。
让我们看一个例子
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw node
[preaction={fill,transform canvas={xscale=1.03,yscale=1.03},red}]
[preaction={fill,transform canvas={xscale=1.02,yscale=1.02},green}]
[preaction={fill,transform canvas={xscale=1.01,yscale=1.01},blue}]
[text width=10em, text height=10em,circle,fill=white] {} ;
\end{tikzpicture}
\end{document}
这将产生一个带有三种颜色边框的(丑陋)节点。现在我知道存在循环,我可能想使用十种颜色,而且我是个懒人。那么我如何使用 foreach 来避免复制粘贴十次相同的代码?
我尝试了对我来说最自然的方法:
\draw node
\foreach \scale/\color in {1.03/red, 1.02/green, 1.01/blue} {
[preaction={draw,transform canvas={xscale=\scale,yscale=\scale},\color}]
}
[text width=10em, text height=10em,circle,fill=white] {} ;
并且编译器会抱怨:
错误:包 tikz 错误:节点必须有一个(可能为空的)标签文本。 l.59 \foreach \scale/\color 为 {1.03/红色, 1.02/绿色, 1.01/蓝色} {
欢迎任何想法。
答案1
这是 TeX 解析 TikZ 语法的“特性”。当 TeX 找到关键字时,node
它会开始寻找接下来的内容(直到 的末尾node
),并且它只“知道”一定数量的内容,例如 the[optional settings]
和(label)
the {text}
。它没有知道如何处理\foreach
命令。它似乎也不太热衷于foreach
关键字,但我可能没有得到正确的语法,所以其他人可能会用它找到解决方案。
但是,使用机制的力量,您想要做的事情完全可以实现\pgfkeys
。它内置了一种迭代列表的方法(想象地称为.list
)。以下是一些适用于您的示例的代码。
\documentclass{article}
% \url{http://tex.stackexchange.com/q/24948/86}
\usepackage{tikz}
\tikzset{
repeated preaction/.style={%
repeat preaction/.list={#1}
},
repeat preaction/.code args={#1/#2}{%
\tikzset{
preaction={
fill,
transform canvas={xscale=#1,yscale=#1},
#2
}
}
}
}
\begin{document}
\begin{tikzpicture}
\draw node
[preaction={fill,transform canvas={xscale=1.3,yscale=1.3},red}]
[preaction={fill,transform canvas={xscale=1.2,yscale=1.2},green}]
[preaction={fill,transform canvas={xscale=1.1,yscale=1.1},blue}]
[text width=10em, text height=10em,circle,fill=white] {} ;
\end{tikzpicture}
\begin{tikzpicture}
\draw node
[repeated preaction={1.3/red, 1.2/green, 1.1/blue}]
[text width=10em, text height=10em,circle,fill=white] {} ;
\end{tikzpicture}
\end{document}
这段代码的作用是定义一些额外的键。我将按照它们被调用的顺序来介绍它们。
repeated preaction
:这需要一个参数,即一个列表。它的唯一任务是将该参数作为列表传递给下一个键。如果您准备写入repeat preaction/.list={...}
位[...]
,则可以跳过此部分。(也许这个键的更好名称是repeat preaction with
。)
repeat preaction
:这是列表语法迭代的代码。因此,它会依次传递列表的每个元素。由于列表的格式为scale/colour
,因此我们相应地指定参数语法,而不仅仅是获取参数列表。这会在每次迭代时执行其代码,它所做的只是设置相应的键。由于我们现在处于“代码”形式(处理参数所必需的),我们必须使用命令跳回到选项设置模式\tikzset
。
只需稍微巧妙一点,实际的预操作也可以传递给初始选项(尽管必须小心宏参数)。
(我稍微放大了你的比例,这样它们更容易看到。另外,图片的两侧被裁剪器裁剪了,这是因为缩放的使用混淆了边界框。这不会发生在真实的文档。)