检查宏参数是否为 tikz 模式

检查宏参数是否为 tikz 模式

是否可以检查给定的参数是否是已定义的 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声明该模式。\pgfdeclarepatternpatterns.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}正确的事情。

相关内容