重复行动

重复行动

我正在尝试使用多个类似的预操作。由于我更希望实现自动化,因此我尝试使用带有预操作的 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

只需稍微巧妙一点,实际的预操作也可以传递给初始选项(尽管必须小心宏参数)。

(我稍微放大了你的比例,这样它们更容易看到。另外,图片的两侧被裁剪器裁剪了,这是因为缩放的使用混淆了边界框。这不会发生在真实的文档。)

重复的预行动

相关内容