为什么 \ifnum 在 TikZ 样式定义中不起作用?

为什么 \ifnum 在 TikZ 样式定义中不起作用?

我正在尝试编写一些条件 TikZ 样式。以前有人尝试过,但我认为从来没有完全令人满意的方式。我的尝试是这样的:

\documentclass{article}

\usepackage{tikz}

\begin{document}
    \tikzset{drawif/.style={\ifnum 1=1 draw\else fill\fi}}
    \tikz{\node[drawif] {Test};}
\end{document}

而不是1=1,插入一个有意义的表达式。编译时,这会出现很多错误:

! Missing = inserted for \ifnum.
               }
l.7         \tikz{\node[drawif]
                      {Test};}
! Missing number, treated as zero.
               }
l.7         \tikz{\node[drawif]
                      {Test};}
! Argument of \pgfkeys@@normal has an extra }.
            \par 
l.7         \tikz{\node[drawif] {Test};}

Runaway argument?
\pgfkeys@mainstop \else \pgfkeys@case@two \fi \fi \fi \pgfkeys@parse \ETC.
! Paragraph ended before \pgfkeys@@normal was complete.

等等。发生什么事了?

答案1

所发生的情况是,它tikz试图解析您定义为样式的样式,但在读取时会感到困惑\ifnum

您实际上想要的是设置drawif样式时运行一些代码。这些代码将在某些条件下设置一些样式。要在设置样式时运行代码,您可以使用键.code而不是键.style

\documentclass{article}

\usepackage{tikz}

\begin{document}
    \tikzset{drawif/.code={\ifnum 1=1 \tikzset{draw}\else \tikzset{fill}\fi}}
    \tikz{\node[drawif] {Test};}
\end{document}

您可以在值#1内部使用.code来引用可以传递给样式的参数:

\usepackage{tikz}

\begin{document}
    \tikzset{drawif/.code={\ifnum #1=1 \tikzset{draw}\else \tikzset{fill}\fi}}
    \tikz{\node[drawif=1] {Test};}
\end{document}

并且可以设置用于不带参数的情况下的drawif/.default=1默认值。#1drawif

答案2

.style尝试拆分输入以=识别键/值对。您需要隐藏=括号中的符号:

\documentclass{article}

\usepackage{tikz}

\begin{document}
\makeatletter
\tikzset{
  drawif/.style={%
    \expandafter\ifnum\@firstofone{1=\test} draw\else fill\fi
  }
}
\makeatother

\def\test{1}
\tikz{\node[drawif] {Test};}

\def\test{0}
\tikz{\node[drawif] {Test};}

\end{document}

但我认为这条.code路线更好。

一个更简单的技巧:

\documentclass{article}

\usepackage{tikz}

\newcommand{\equals}{=}

\begin{document}
\tikzset{
  drawif/.style={%
    \ifnum 1\equals\test draw\else fill\fi
  }
}

\def\test{1}
\tikz{\node[drawif] {Test};}

\def\test{0}
\tikz{\node[drawif] {Test};}

\end{document}

当然\test只是用来举例子。注意,<否则>不会出问题。

相关内容