我希望能够检测是否已通过提供特定选项\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}