假设我想一次性扩展 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}