为什么宏中的某些参数前面需要加上 \noexpand?

为什么宏中的某些参数前面需要加上 \noexpand?

我继续研究嵌套 tikzpicture 环境的使用(抱歉),并发现了下一个问题。我不确定,但这听起来像是“脆弱”命令的问题。也许,问题出在嵌套环境上,但我不这么认为,因为代码在很多情况下都能正常工作。这很奇怪,这$\mathbf{\Pi}$不会带来任何问题,但却\textbf{textbf}是灾难性的!。

在下一个代码中,我使用宏\place在节点的帮助下放置一个对象(一些 tex 的代码)。我稍微简化了宏链,但保留了基本内容。

代码我使用 pgf 2.1 CVS

取消注释该行

\documentclass{scrartcl}
\usepackage{amsmath,tikz}

\makeatletter
\def\place{\pgfutil@ifnextchar[{\place@i}{\place@i[]}}%
\def\place@i[#1]#2(#3)#{\place@ii[#1]{#2}(#3)}%
\def\place@ii[#1]#2(#3)#4{% 
\begin{tikzpicture}[overlay]
  \path (0,0)--(#3);
  \node[anchor=#1,rotate=#2] at (#3) {#4};
\end{tikzpicture}%
}% 

\begin{document}

Baseline%
\begin{tikzpicture}
 \draw[help lines] (0,-4) grid (5,1);
 \place[west]{0}(1,-2){$ \frac{2}{3}$} 
 \place[west]{-30}(2,-3){$\mathbf{\Pi}$} 
\end{tikzpicture}% 

% uncomment the next line with \place to see the problem
\begin{tikzpicture}
 %\place[west]{0}(4,0){\textbf{textbf}} 
\end{tikzpicture} 

% \noexpand resolves the problem 
\begin{tikzpicture}
 \place[west]{0}(2,0){\noexpand\textbf{textbf}} 
\end{tikzpicture}  

\end{document} 

结果

在此处输入图片描述

但如果我不使用\noexpand

在此处输入图片描述

我遇到了什么样的问题?

答案1

Marco,谢谢你的答案链接马丁感谢 Martin 使用 pgfinterruptpicture 做出的解释

下一个代码似乎可以解决问题

\newbox\mybox   

\makeatletter
\def\place{\pgfutil@ifnextchar[{\place@i}{\place@i[]}}%
\def\place@i[#1]#2(#3)#{\place@ii[#1]{#2}(#3)}%
\def\place@ii[#1]#2(#3)#4{%
 %\setbox\mybox=\hbox{\pgfinterruptpicture #4\endpgfinterruptpicture}            
 \sbox\mybox{\pgfinterruptpicture#4\endpgfinterruptpicture}% from Martin Scharrer and egreg
\begin{tikzpicture}[overlay]
     \path (0,0)--(#3);
     \node[anchor=#1,rotate=#2] at (#3) {\box\mybox};
    \end{tikzpicture}%
}% 

相关内容