\tikzset 中的条件

\tikzset 中的条件

我想设置一个绘图选项,用我选择的颜色的圆圈来装饰线条,其中“无”表示没有圆圈。我希望得到这样的效果:

\documentclass{amsart}
\usepackage{tikz}
\usetikzlibrary{positioning, decorations.markings}
\tikzset{-o-/.style n args={1}{
append after command={\pgfextra{\let\mainnode=\tikzlastnode}% Borrowed this line, but I don't understand it.
\def\argone{#1} \def\argtwo{none}
\ifx\argone\argtwo
\else
decoration={markings, mark=at position 0.5 with {draw[black, fill=#1] circle[radius=2pt];}}, postaction={decorate}
\fi
}}}

\newcommand*{\mytriangle}[1]{
\begin{tikzpicture}
\draw[-o-={#1}] (0,0)--(0,1);
\draw[-o-={#1}] (0,0)--(1,0);
\draw[-o-={#1}] (1,0)--(0,1);
\end{tikzpicture}}

\begin{document}
\mytriangle{white}, \mytriangle{none}.
\end{document}

我试图借

append after command={\pgfextra{...} ...}

这个问题,因为否则 ifx 条件在 \tikzset 内部不起作用,但现在我的代码无法做出所需的装饰。

答案1

您可以在代码中使用.code类型并调用,而不是评估 a 内部的条件。从内部来看, a就是这样,与 相同,但您可以评估任意代码,而不仅仅是调用。\pgfkeysalso.style.style\tikzset{foo/.style={bar}}\tikzset{foo/.code=\pgfkeysalso{bar}}.code\pgfkeysalso

请注意,您不需append after command要这样做(您正在使用decorations.markings库来放置代码)。

我借用了\str_if_eq:nnFexpl3一点(您的\def\argone{#1}\def\argtwo{none}\ifx测试也可以工作,但可能会产生重新定义两个宏的不良副作用\argone\argtwo您必须在该测试周围放置一个组以确保安全)。

\documentclass{amsart}

\ExplSyntaxOn
\cs_new_eq:NN \ifstreqF \str_if_eq:nnF
\ExplSyntaxOff

\usepackage{tikz}
\usetikzlibrary{positioning, decorations.markings}
\tikzset
  {
    -o-/.code=%
      {%
        \ifstreqF{#1}{none}
          {%
            \pgfkeysalso
              {
                decoration=%
                  {%
                    markings,
                    mark=at position 0.5 with {\draw[black, fill={#1}]
                      circle[radius=2pt];}
                  },
                postaction={decorate}
              }
          }
      }
  }

\newcommand*{\mytriangle}[1]{
\begin{tikzpicture}
\draw[-o-={#1}] (0,0)--(0,1);
\draw[-o-={#1}] (0,0)--(1,0);
\draw[-o-={#1}] (1,0)--(0,1);
\end{tikzpicture}}

\begin{document}
\mytriangle{white}, \mytriangle{none}.
\end{document}

在此处输入图片描述


关于您的测试的附注:以下内容将是它的有效且安全的变体:

\begingroup
  \def\argone{#1}%
  \def\argtwo{none}%
  \expandafter
\endgroup
\ifx\argone\argtwo
  <true>
\else
  <false>
\fi

保持和\begingroup ...\endgroup的定义是局部的,并且由于在和的定义之前进行评估,所以在组结束时恢复。\argone\argtwo\expandafter\ifx\argone\argtwo

相关内容