虽然我知道如何赋予样式默认值,以便参数变为可选,但我无法弄清楚如何使样式的行为不同的取决于是否给出了论证。为了说明我的意思,下面是一个相当牵强的例子:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\tikzstyle{quux} = [draw=red,blue,thick]
\node[quux] (a) {A};
\node[quux,right=of a] (b) {B};
\node[quux,right=of b] (c) {C};
\node[quux,right=of c] (d) {D};
\node[quux,right=of d] (e) {E};
\end{tikzpicture}
\end{document}
结果如下:
不幸的是,这段代码中有很多冗余。现在,对于这样一个简单的例子,这并不重要。但也有其他情况,消除这种冗余会很有帮助。正如我们所见,对于除 之外的所有节点(a)
,我们有代码right=of (x)
,因为显然第一个节点的位置不需要相对于另一个节点放置,事实上也不能这样。我想要的是类似以下内容:
\begin{document}
\begin{tikzpicture}
\tikzstyle{quux} = [draw=red,blue,thick,if argument present={right=of #1}]
\node[quux] (a) {A};
\node[quux=a] (b) {B};
\node[quux=b] (c) {C};
\node[quux=c] (d) {D};
\node[quux=d] (e) {E};
\end{tikzpicture}
\end{document}
这样的事可能吗?
答案1
您可以使用.append code
并检查内部参数是否为空,例如使用\ifx
,如果没有设置,right of=#1
请使用pgfkeysalso
如下方法:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\tikzset{
quux/.style={blue,draw=red,thick},
quux/.append code={\ifx\\#1\\\else\pgfkeysalso{right of=#1}\fi},
quux/.default={}
}
\begin{document}
\begin{tikzpicture}
\node[quux] (a) {A};
\node[quux=a] (b) {B};
\node[quux=b] (c) {C};
\node[quux=c] (d) {D};
\node[quux=d] (e) {E};
\end{tikzpicture}
\end{document}