我目前所做的只是grep
在 MetaPost 树中的所有文件中搜索关键字,例如
grep -r withdots `kpsexpand -v '$TEXMFDIST'`/metapost
然后用眼睛扫描输出来找到定义。
在 TeX 中,这稍微简单一些。我可以直接在文档中使用它来获取日志中\show\section
宏的定义,或者也可以使用该工具。\section
texdef
有没有与MetaPost类似\show
或适合的东西?texdef
答案1
我不知道有什么等价的东西texdef
,但是MetaPost 手册在其调试部分(在我的版本中大约在第 73 页)。showvariable
确实显示了宏定义,不幸的是它们被截断为标称行长度,并且我找不到如何禁用此截断:
showvariable thelabel;
在终端上给出如下信息:
thelabel@#=macro:(EXPR3)(EXPR4)->begingroup.save.p;picture.p;if.picture ETC.
但是,我找到了一种方法(确实不太方便!)来获取完整的定义:
tracingonline := 1; % to get output on the terminal, not only in the log file
begingroup;
interim tracingmacros := 1;
save myPic;
picture myPic;
myPic := thelabel.lft(nullpicture, (0,0)); % form a valid expression with thelabel
endgroup;
、begingroup
和interim
仅用于避免干扰您之后可能拥有的代码(因此,和将在组; 处理之后恢复为它们以前的值,save myPic
因为它是一个内部变量,与 ; 相反,您可以看到变量被恢复)。endgroup
tracingmacros
myPic
tracingmacros
interim
myPic
tracingrestores := 1;
通过此代码,我获得:
thelabel@#(EXPR3)(EXPR4)->begingroup.save.p;picture.p;if.picture(EXPR3):p=(EXPR
3)else:p=(EXPR3)infont.defaultfont.scaled.defaultscale.fi;p.shifted((EXPR4)+lab
eloffset*laboff(SUFFIX2)-(labxf(SUFFIX2)*lrcorner.p+labyf(SUFFIX2)*ulcorner.p+(
1-labxf(SUFFIX2)-labyf(SUFFIX2))*llcorner.p))endgroup
(SUFFIX0)<-
(SUFFIX1)<-thelabel
(SUFFIX2)<-lft
(EXPR3)<-picture
(EXPR4)<-(0,0)
我不会说它很华丽,但现在它看起来就像宏定义一样。可以添加适量的自动化:
vardef displayMacros(text t) =
interim tracingmacros := 1;
t;
enddef;
displayMacros(
save myPic;
picture myPic;
myPic := thelabel.lft(nullpicture, (0,0));
);
关于withdots
你举的例子,你可以试试这个:
showtoken withdots;
showvariable withdots;
show withdots;
我得到了这个:
> withdots=tag
withdots=picture
>> Edge structure at line 29:
Filled pen stroke :
(2.5,5)..controls (2.5,5) and (2.5,5)
..(2.5,5)
butt ends, mitered joins limited 1 with pen
pencircle transformed (0,0,0,0,0,0)
End edges
因此,withdots
是图片对象,而不是宏。与上面给出的输出(位于本文顶部)进行比较showvariable thelabel
。