查找 MetaPost 定义的最简单方法是什么?

查找 MetaPost 定义的最简单方法是什么?

我目前所做的只是grep在 MetaPost 树中的所有文件中搜索关键字,例如

grep -r withdots `kpsexpand -v '$TEXMFDIST'`/metapost

然后用眼睛扫描输出来找到定义。

在 TeX 中,这稍微简单一些。我可以直接在文档中使用它来获取日志中\show\section宏的定义,或者也可以使用该工具。\sectiontexdef

有没有与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;

begingroupinterim仅用于避免干扰您之后可能拥有的代码(因此,和将在组; 处理之后恢复为它们以前的值,save myPic 因为它是一个内部变量,与 ; 相反,您可以看到变量被恢复)。endgrouptracingmacrosmyPictracingmacrosinterimmyPictracingrestores := 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

相关内容