![TikZ 中的嵌套样式](https://linux22.com/image/238181/TikZ%20%E4%B8%AD%E7%9A%84%E5%B5%8C%E5%A5%97%E6%A0%B7%E5%BC%8F.png)
我有:
\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}