将宏参数扩展为 tikz 命令一次

将宏参数扩展为 tikz 命令一次

假设我想一次性扩展 tikz 命令的宏参数。如果这是一个用括号定义的普通宏,我会知道如何使用 expandafter 来执行此操作,但我不知道在 tikz 命令中将它们放在哪里,因为我不确定它如何解析命令,而且它不能很好地用括号分开。我是否需要为 tikz 命令中我想要扩展的参数之前出现的每个标记使用 expandafters?

具体来说,我该如何定义下面的宏 \drawnode,以便它在插入之前将其参数展开一次。除了 expandafter 之外,我还可以采用基于 edef 的解决方案。

\NewDocumentCommand{\drawnode}{m} {\node[draw,circle,minimum size=2.2mm,black] (foo) at (0,0) #1}

换句话说,我该如何改变 \drawnode 以使以下代码正常工作。

\documentclass{standalone}

\usepackage{unicode-math}
    \setmainfont{XITS}
    \setmathfont{XITS Math}
    \setmathfont{XITS Math}[range={\mathscr,\mathbfscr}]
    \setmathfont{XITS Math}[range={\mathcal,\mathbfcal},StylisticSet=1]
\usepackage{tikz}

\NewDocumentCommand{\drawnode}{m} {\node[draw,circle,minimum size=2.2mm,black] (foo) at (0,0) #1}
\newcommand{\drawagain}{; \node (rect) at (4,2) [draw,thick,minimum width=2cm,minimum height=2cm] {};}

\begin{tikzpicture}
   \drawnode{\drawagain}
\end{tikzpicture}
\end{document}

答案1

问题不在于扩展,而在于语法错误:在 的末尾、 之前缺少{}标签(即圆圈内的文本)。\drawnode#1

如果您关注答案下方的评论,您将看到在tikz和的上下文中对扩展的讨论pgf。我发现,问题经常变成使用扩展来打破不可扩展\foreach循环的本地范围。

\documentclass{standalone}

%\usepackage{unicode-math}
%    \setmainfont{XITS}
%    \setmathfont{XITS Math}
%    \setmathfont{XITS Math}[range={\mathscr,\mathbfscr}]
%    \setmathfont{XITS Math}[range={\mathcal,\mathbfcal},StylisticSet=1]
\usepackage{tikz}

\NewDocumentCommand{\drawnode}{m} {%
  \node[draw,circle,minimum size=2.2mm,black] (foo) at (0,0) {} #1 }
\newcommand{\drawagain}{; \node (rect) at (4,2) 
  [draw,thick,minimum width=2cm,minimum height=2cm] {};}

\begin{document}

\begin{tikzpicture}
  \drawnode{\drawagain}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容