50 关于NewExpandableDocumentCommand的展开问题?

发布于 2024-12-30 20:44:31

链接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实际是等价的,这令人非常不解。求解释~

image.png

查看更多

关注者
0
被浏览
114
雾月
雾月 2天前
这家伙很懒,什么也没写!

报错里看到 \test.. 展开为了 inner sep=2 不代表 \node 读取键时看到了 \test.. 展开后的结果,读取键时可能展开,也可能不展开,完全取决于实现。比如 \keys_set:nn 就不会展开键,\keys_set:ne 就会先展开第二个参数,再读取键。实际使用时不应当依赖于这一行为,如果没有特殊说明,总是应当认为既可能展开,又可能不展开,这样才能减少出错的概率。

2 个回答
Sagittarius Rover
我要成为TikZ糕手/(ㄒoㄒ)/~~

谢谢雾月老师的解释,但我还有几个小问题:

  1. 是否有简单的方法确定\node读取键时“真正”的展开情况
  2. 我之前一直以为这两者的差异是colorinner sep这两个key的性质不同导致的;而经过进一步测试发现上述例子是因为读取key时,对于那些允许省略键的选项不会出错,而不允许省略键的选项则会因为展开顺序的问题而报错;是什么造成了这一区别呢?
  3. unexpended命令和noexpand/\exp_not:n是否有区别(?)我通过latexdef发现后两者等价,而unexpendednoexpand均为Plain-TeX的原语。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览