如何让 TikZ 样式根据传递给它的参数而表现不同

如何让 TikZ 样式根据传递给它的参数而表现不同

虽然我知道如何赋予样式默认值,以便参数变为可选,但我无法弄清楚如何使样式的行为不同的取决于是否给出了论证。为了说明我的意思,下面是一个相当牵强的例子:

\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}

在此处输入图片描述

相关内容