我正在尝试编写一些条件 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
默认值。#1
drawif
答案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
只是用来举例子。注意,<
否则>
不会出问题。