交互地查找宏定义

交互地查找宏定义

在 TeX 文档中,primitive 命令\show将打印出当前一层级的宏定义(它不会(也不能?)简化为原语)。这带来了实际存在于文档本身中的限制,必须一遍又一遍地排版和重新排版,并筛选日志消息(即使是最基本的文件,这也不算什么)。

有没有办法以交互方式运行 TeX 会话,以便我可以

$ latex
> \documentclass{article}
blah blah blah

> \show\list
#1#2->\ifnum \@listdepth >5\relax \@toodeep \else \global \advance \@listdepth \@ne \fi 
\rightmargin \z@ \listparindent \z@ \itemindent \z@ \csname @list\romannumeral \the 
\@listdepth \endcsname \def \@itemlabel {#1}\let \makelabel \@mklab \@nmbrlistfalse 
#2\relax \@trivlist \parskip \parsep \parindent \listparindent \advance \linewidth -
\rightmargin \advance \linewidth -\leftmargin \advance \@totalleftmargin \leftmargin 
\parshape \@ne \@totalleftmargin \linewidth \ignorespaces .

> ...

交互式地?

答案1

有时候你需要一个交互式提示。你可以通过错误或 show 函数(\show\showthe\showbox)获得这样的提示。交互式提示的界面非常基础,但在使用 action 之后可以添加其他内容i,例如 file 的 session test.tex

\documentclass{article}
\show\list

LaTeX 会停在\show\list,之后的内容?由用户交互插入:

$ latex test
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2011/06/27>
Babel <3.9f> and hyphenation patterns for 77 languages loaded.
(/home/one/tl/tldevsrc/Master/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/home/one/tl/tldevsrc/Master/texmf-dist/tex/latex/base/size10.clo))
> \list=macro:
#1#2->\ifnum \@listdepth >5\relax \@toodeep \else \global \advance \@listdepth 
\@ne \fi \rightmargin \z@ \listparindent \z@ \itemindent \z@ \csname @list\roma
nnumeral \the \@listdepth \endcsname \def \@itemlabel {#1}\let \makelabel \@mkl
ab \@nmbrlistfalse #2\relax \@trivlist \parskip \parsep \parindent \listparinde
nt \advance \linewidth -\rightmargin \advance \linewidth -\leftmargin \advance 
\@totalleftmargin \leftmargin \parshape \@ne \@totalleftmargin \linewidth \igno
respaces .
l.2 \show\list

? i\makeatletter\show\@listdepth
> \@listdepth=\count34.
<insert>   \makeatletter\show\@listdepth

l.2 \show\list

? i\showthe\@listdepth
> 0.
<insert>   \showthe\@listdepth

l.2 \show\list

? 

尽管如此,仍需注意以下几点:

  • Catcodes:当前的 catcode 设置可能未知,这里@有 catcode 12,更改了要在宏名称中使用的\makeatothercatcode 。否则可以使用:@\csname

    \expandafter\show\csname @listdepth\endcsname
    
  • 根据当前上下文,插入内容可能会破坏或混淆内容。例如,在逐字上下文中,宏不能作为宏插入。

相关内容