TikZ 中的嵌套样式

TikZ 中的嵌套样式

我有:

\pgfkeys{/TransformerNetwork/.style={
        transformer/.style 2 args={draw, cylinder, gray!80, rotate=90, minimum height=#1, minimum width=#2},
        }}

进而:

\begin{tikzpicture}[/TransformerNetwork]
    \node [transformer={2.3cm}{1cm}] () at (0,0.6) {};

但 tikz 抱怨:

Illegal parameter number in definition of \pgfkeys@temp.

我如何让它知道这两个参数用于嵌套样式?

答案1

我同意杰克的观点,这里没有必要嵌套定义样式,但是,万一出现更复杂的情况,您确实需要嵌套它们(或者至少,不能这样做会变得非常麻烦),问题的解决方案很简单,并且本质上与嵌套定义的问题相同。

也就是说,如果你把下面的代码放在一个文档中

\def\a{\def\b#1{got #1}}

您将收到完全相同的错误信息:

! Illegal parameter number in definition of \a.

因此,这里发生的事情是,\def幕后发生了一些事情,样式的内容被转换为 的主体\def。这意味着#1#2被解释为 的参数样式。要让它们按预期工作,方法是将哈希值加倍。也就是说,

\def\a{\def\b##1{got ##1}}

工作原理:当\a执行时,它在流中被替换为\def\b#1{got #1}

翻译回你的风格,这将变成:

\pgfkeys{/TransformerNetwork/.style={
        transformer/.style 2 args={draw, rectangle, gray!80, rotate=90, minimum height=##1, minimum width=##2},
        }}

现在它可以按照您希望的方式运行了。

很高兴你尝试了这种风格2参数,因为样式可以默认情况下采取一个论点。也就是说,

\pgfkeys{/TransformerNetwork/.style={
        transformer/.style 2 args={draw, rectangle, gray!80, rotate=90, minimum size=#1},
        }}

不会产生错误,但替换的值#1需要由TransformerNetwork样式提供,并且不是样式transformer。 提供给样式的任何参数transformer都将被丢弃。

当然,可以选择并混合这种语法,并取得良好的效果。

\documentclass{standalone}
% \url{http://tex.stackexchange.com/q/21414/86}
\usepackage{tikz}

\pgfkeys{/TransformerNetwork/.style 2 args={
        transformer/.style 2 args={draw=#1, rectangle, rotate=#2, minimum height=##1, minimum width=##2},
        }}

\begin{document}
\begin{tikzpicture}
\begin{scope}[/TransformerNetwork={red}{50}]
    \node [transformer={2.3cm}{1cm}] () at (0,0.6) {};
    \node [transformer={2cm}{1.5cm}] () at (3,0.6) {};
\end{scope}
\begin{scope}[/TransformerNetwork={green}{80},yshift=-3cm]
    \node [transformer={2.3cm}{1cm}] () at (0,0.6) {};
    \node [transformer={2cm}{1.5cm}] () at (3,0.6) {};
\end{scope}
\end{tikzpicture}
\end{document}

生成:

嵌套样式定义

答案2

你不应该嵌套定义样式。定义内部样式 ( transformer),然后在外部样式的定义中调用它 ( TransformerNetwork)。此外,TransformerNetwork应该是.style 2 args,以便它可以处理随后传递给内部样式的两个参数:

\documentclass{article}
\usepackage{tikz} 
\usetikzlibrary{shapes}  
\begin{document}

\pgfkeys{
        /tikz/transformer/.style 2 args={
            draw,
            cylinder, gray!80,
            rotate=90,
            minimum height=#1,
            minimum width=#2
        },
        /TransformerNetwork/.style 2 args={
        transformer={#1}{#2},
        }
}

\begin{tikzpicture}
\node [/TransformerNetwork={2.3cm}{1cm}] () at (0,0.6) {};
\end{tikzpicture}  
\end{document} 

相关内容