在链接A中,Eureka老师给了一个例子:
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\NewExpandableDocumentCommand\testB{m}{color = #1}
\NewExpandableDocumentCommand\testC{m}{#1}
\begin{document}
\begin{tikzpicture}
\draw[\testB{magenta}] (0,0)--(1,1); % failed
\draw[\testC{cyan}] (0,0)--(1,0); % works
\end{tikzpicture}
\end{document}
\draw[\testB{magenta}] (0,0)--(1,1);
因为展开顺序问题报错\draw[\testC{cyan}] (0,0)--(1,0);
因为省略了color=
而可以正常运行
但在链接B中类似的\inns
却不可行。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\NewExpandableDocumentCommand\inns{m}{inner sep=#1 pt}
\tikz{
\node(a) at (0,0) {A};
% \node[\inns{2}] (b) at (1,0) {B}; % fails
\node[/tikz/inner sep=2pt] (b) at (1,0) {B}; % works
\node[/pgf/inner sep=2pt] (b) at (1,0) {B}; % works
\node[inner sep=2pt] (b) at(1,0) {B}; % works
\expanded{\noexpand\node[\inns{2}]}(b)at(1,0){B}; % works
\expandafter\node\expanded{[\inns{2}]}(b)at(1,0){B}; % works
\draw(a) -- (b);
}
\end{document}
其中\node[\inns{2}] (b) at (1,0) {B};
提示信息为:
Package pgfkeys: I do not know the key '/tikz/inner sep=2 pt' and I am going to ignore it. Perhaps you misspelled it.
这提示\inns
已经被展开为inner sep=2 pt
了,而且根据文档,句柄/tikz/inner sep
与/pgf/inner sep
实际是等价的,这令人非常不解。求解释~
pgfkeys
先根据,
分割每个键值对。之后,对每个键值对,如果没有=
,就把这个键值对整体作为键,否则以第一个=
分割键和值。这两个步骤都是不进行展开的。然后根据键名使用\csname ..<key>..\endcsname
创建一个控制序列,此时才会进行展开。如果一个命令保存的是键和值,那么这个键和值会整体被 pgfkeys 作为键,如果只包含键,那和正常使用没有区别。可参考下面这个例子:\global\let\exp_not:n\unexpanded
\global\let\exp_not:N\noexpand
。\unexpanded
是 eTeX 原语,\noexpand
Knuth TeX 原语,前者保护用{}
包裹的 tokenlist,后者保护它后面的那一个 token。