如何检测是否通过 \tikzset 提供选项

如何检测是否通过 \tikzset 提供选项

我希望能够检测是否已通过提供特定选项\tikzset并基于此发出消息。

MWE 得出:

在此处输入图片描述

但是一旦条件起作用(现在只是一条评论)它应该会产生:

在此处输入图片描述

笔记:

  • 尽管我认为这种情况不会引入任何额外的复杂性,但我并不担心 a\tikzset使用另一个定义的样式的情况\tikzset

代码:

\documentclass{article}
\usepackage{tikz}


\tikzset{Hollow/.style={red}}
\tikzset{Solid/.style={green}}

\newcommand{\TikzPicture}{%
    \begin{tikzpicture}
        \draw [ultra thick, blue, ->, My Options] (0,0) -- (1,0)
        % If option Hollow is specified
            node [right] {Error: Option Hollow specified.}
        ;
    \end{tikzpicture}%
}%

\begin{document}

\tikzset{My Options/.style={Hollow}}
\TikzPicture

\tikzset{My Options/.style={}}
\TikzPicture
\end{document}

答案1

编辑:通过.forward to处理程序(仅适用于 PGF 的 CVS 版本),您可以Hollow在想要测试样式是否指定时将布尔值附加到样式中:

\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}

\newbool{Hollow}

\tikzset{
  Hollow is used/.code=\booltrue{Hollow},
  Test Hollow/.code={\tikzset{Hollow/.forward to=/tikz/Hollow is used}},
  Hollow/.style={red},
  Solid/.style={green},
}

\newcommand{\TikzPicture}{%
    \begin{tikzpicture}
        \draw [Test Hollow,ultra thick, blue, ->, My Options] (0,0) -- (1,0)
        \ifbool{Hollow}{
          node [right] {Error: Option Hollow specified.}
        }{
          node [right] {Ok: Option Hollow is not specified.}
        }
        ;
    \end{tikzpicture}%
}%

\begin{document}

\tikzset{My Options/.style={Hollow}}
\TikzPicture

\tikzset{My Options/.style={}}
\TikzPicture

\tikzset{Hollow/.style={violet,dotted}}

\tikzset{My Options/.style={Hollow}}
\TikzPicture

\end{document}

在此处输入图片描述

第一个解决方案(使用 PGF 2.10 版本):

\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}

\newbool{Hollow}

\tikzset{
  Hollow/.code={
    \booltrue{Hollow}
    \pgfkeysalso{red}
  },
  Solid/.style={green},
}

\newcommand{\TikzPicture}{%
    \begin{tikzpicture}
        \draw [ultra thick, blue, ->, My Options] (0,0) -- (1,0)
        \ifbool{Hollow}{node [right] {Error: Option Hollow specified.}}{}
        ;
    \end{tikzpicture}%
}%

\begin{document}

\tikzset{My Options/.style={Hollow}}
\TikzPicture

\tikzset{My Options/.style={}}
\TikzPicture

\end{document}

答案2

.style这种方法通过附加(在本例中)重新定义了处理程序

\expandafter\let\csname ifqrr@trace@pgfk@/tikz/Hollow\endcsname\iftrue

给它。现在,/tikz/Hollow存储在宏中\pgfkeyscurrentpath,所以我们需要将其展开一次,因为当然,\pgfkeyscurrentpath在调用样式时会有所不同。

.ecode这就是我使用它来.code重新定义处理程序的原因.style

\pgfkeys{
  /handlers/.style/.code=
    \pgfkeys{
      \pgfkeyscurrentpath/.ecode=
        \noexpand\expandafter\noexpand\let\noexpand
             \csname ifqrr@trace@pgfk@\pgfkeyscurrentpath\noexpand\endcsname\noexpand\iftrue
        \noexpand\pgfkeysalso{\unexpanded{#1}}%
    }
}

这会产生以下后果:

  • 目前,它仅适用于.style,而不适用于.estyle.style args.estyle args或。它也不适用于具有先前未定义样式(即没有先前的.style 2 args)的处理程序(经常使用) 。.style n args.append style.append style.style
  • 它不适用于以前定义的样式。

我还定义了一个双参数预期.if处理程序,用于测试是否给出了键,但遗憾的是,它不能在路径内使用。因此,我定义了一个非常简单的\iftikzstyle宏,它仅适用于/tikz/路径中的键,但它可以在路径内使用。

进一步改进

  • 重新定义所有其他style处理程序(其只是扩展;)
  • 我们需要更深入地了解:

    \let如果指定了样式调用顺序,最好添加该顺序(例如\tikzset,在 a 的可选参数中使用或\draw)。这样可以使现有/预定义的样式也适用于/.if\iftikzstyle

代码

\documentclass{article}
\usepackage{tikz}

\pgfkeys{/handlers/.style/.code=\pgfkeys{\pgfkeyscurrentpath/.ecode=\noexpand\expandafter\noexpand\let\noexpand\csname ifqrr@trace@pgfk@\pgfkeyscurrentpath\noexpand\endcsname\noexpand\iftrue\noexpand\pgfkeysalso{\unexpanded{#1}}}}
\pgfkeys{
    /handlers/.if/.code 2 args={% works not in the middle of a path
        \expandafter\ifx\csname ifqrr@trace@pgfk@\pgfkeyscurrentpath\endcsname\iftrue#1\else#2\fi}}

\makeatletter
\newcommand*{\iftikzstyle}[1]{% only for /tikz/ styles
    \expandafter\ifx\csname ifqrr@trace@pgfk@/tikz/#1\endcsname\iftrue
        \expandafter\@firstoftwo
    \else
        \expandafter\@secondoftwo
    \fi
}
\makeatother

\tikzset{Hollow/.style={red}}
\tikzset{Solid/.style={green}}

\newcommand{\TikzPicture}{%
    \begin{tikzpicture}
        \draw [ultra thick, blue, ->, My Options] (0,0) -- (1,0)
          \iftikzstyle{Hollow}{node[right] {Error: Option Hollow specified.}}{node[opacity=.5,right] {Option Hollow not specified}}
        ;
    \end{tikzpicture}%
}%

\begin{document}
\tikzset{My Options/.style={Hollow}}
\TikzPicture

\tikzset{My Options/.style={}}
\TikzPicture

\tikzset{Hollow/.if={Hollow is specified.}{Hollow is not specified.}}

\tikzset{Hollow}
\tikzset{Hollow/.if={Hollow is specified.}{Hollow is not specified.}}
\end{document}

输出

在此处输入图片描述

相关内容