节点选项中的宏

节点选项中的宏

我使用\pgfkeystikz定义一些东西(请参阅下面的 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

这是一个不使用额外软件包的替代方案(并且非常接近 TiZ 内部使用,如果我没记错的话)。我不得不用你的来tp/.default={}tp/.default=\empty如果我没记错的话,TiZ 在内部使用\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}

在此处输入图片描述

相关内容