我想设置一个绘图选项,用我选择的颜色的圆圈来装饰线条,其中“无”表示没有圆圈。我希望得到这样的效果:
\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:nnF
这expl3
一点(您的\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