我使用\pgfkeys
来tikz
定义一些东西(请参阅下面的 MWE),但简单的代码无法编译。我猜是因为在 \pgfkeys 中使用宏的方式错误\ifthenelse
。但是为什么会出现这个问题,又该如何解决呢?
\documentclass{article}
\usepackage{tikz,ifthen}
\begin{document}
\pgfkeys{%
tp/.code=\def\tp{%
\ifthenelse{\equal{#1}{}}%
{centered}%
{above=#1}%
},
tp/.default={},
mydraw/.code={\tikz\draw(0,0)--node[#1]{node}(1,0);}
}
\pgfkeys{tp,mydraw/.expanded={\tp}}
\end{document}
答案1
expanded
只能扩展可扩展的命令。\ifthenelse
不是这样的命令,所以不起作用。可扩展的测试存在于例如 expl3 中:
\documentclass{article}
\usepackage{tikz,expl3}
\begin{document}
\ExplSyntaxOn
\pgfkeys{%
tp/.code=\def\tp{%
\tl_if_empty:nTF{#1}
{centered}
{above=#1}
},
tp/.default={},
mydraw/.code={\tikz\draw(0,0)--node[#1]{node}(1,0);}
}
\ExplSyntaxOff
\pgfkeys{tp,mydraw/.expanded={\tp}}
\pgfkeys{tp=4pt,mydraw/.expanded={\tp}}
\end{document}
答案2
这是一个不使用额外软件包的替代方案(并且非常接近 Ti钾Z 内部使用,如果我没记错的话)。我不得不用你的来tp/.default={}
换tp/.default=\empty
如果我没记错的话,Ti钾Z 在内部使用\pgfutil@empty
它但我不想\makeatletter
在这里添加 s)。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pgfkeys{%
tp/.code={\ifx#1\empty\relax
\def\tp{centered}%\typeout{empty}
\else
\def\tp{above=#1}%\typeout{#1\space is\space not\space empty}
\fi
},
tp/.default=\empty,
mydraw/.code={\tikz\draw(0,0)--node[#1]{node}(1,0);}
}
\pgfkeys{tp,mydraw={\tp}}
\pgfkeys{tp=5pt,mydraw/.expanded={\tp}}
\end{document}