是否可以检查给定的参数是否是已定义的 tikz 模式(使用模式库)?我想要一个宏
\IfPatternTF{#1}{executed if #1 is a pattern}{executed if #1 isn't a pattern}
理想情况下, \IfPatternTF 会在检查之前完全扩展 #1,但是一旦我知道如何检查它是否是一种模式,我就可以自己管理它。
请注意,我同样乐意测试某个东西是否是颜色,因为我希望这样做是为了决定在命令中执行 fill= 还是 pattern=。但是,检查 xcolor 颜色是否定义的答案没有帮助,因为这并没有告诉我它是否是 tikz 中 fill= 的可接受参数。
答案1
foo
当在标准库中声明一个模式时pattern
,控制序列\pgf@pattern@name@foo
就被定义了;同样,如果用库中\pgf@pattern@name@meta@foo
声明该模式。\pgfdeclarepattern
patterns.meta
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{patterns,patterns.meta}
\makeatletter
\newcommand{\IfPatternTF}[1]{%
\ifcsname pgf@pattern@name@#1\endcsname
% defined pattern
\expandafter\@firstoftwo
\else
\ifcsname pgf@pattern@name@meta@#1\endcsname
% defined meta pattern
\expandafter\expandafter\expandafter\@firstoftwo
\else
% undefined pattern
\expandafter\expandafter\expandafter\@secondoftwo
\fi
\fi
}
\makeatother
% declare a pattern for testing; this is from the PGF/TikZ manual
\pgfdeclarepattern{
name=hatch,
parameters={\hatchsize,\hatchangle,\hatchlinewidth},
bottom left={\pgfpoint{-.1pt}{-.1pt}},
top right={\pgfpoint{\hatchsize+.1pt}{\hatchsize+.1pt}},
tile size={\pgfpoint{\hatchsize}{\hatchsize}},
tile transformation={\pgftransformrotate{\hatchangle}},
code={
\pgfsetlinewidth{\hatchlinewidth}
\pgfpathmoveto{\pgfpoint{-.1pt}{-.1pt}}
\pgfpathlineto{\pgfpoint{\hatchsize+.1pt}{\hatchsize+.1pt}}
\pgfpathmoveto{\pgfpoint{-.1pt}{\hatchsize+.1pt}}
\pgfpathlineto{\pgfpoint{\hatchsize+.1pt}{-.1pt}}
\pgfusepath{stroke}
}
}
\begin{document}
\IfPatternTF{horizontal lines}{existing pattern}{non existing pattern}
\IfPatternTF{hatch}{existing pattern}{non existing pattern}
\IfPatternTF{foo}{existing pattern}{non existing pattern}
\end{document}
请注意,深入研究内部机制并不能保证永远有效。你可以向 PGF/Ti 提出功能请求钾Z 维护者。
如果名称存储在宏中,则无需担心,只要它是完全可扩展的。所以\newcommand\foo{horizontal lines}
会做\IfPatternTF{\foo}{true}{false}
正确的事情。