单击宏名跳转到其定义?

单击宏名跳转到其定义?

受到热烈欢迎我之前有关于类似主题的问题,我将继续进行类似的调查。我认为,如果我可以在我的 LaTeX 编辑器中单击宏名称,那就太好了:

\blob{4}

光标会跳转到相应的定义:

\newcommand{\blob}[1]{...}

有没有 LaTeX 编辑器有这个功能?我自己主要使用 Aquamacs/AucTeX,但也对其他编辑器感兴趣。我认为实现起来会很有挑战性,因为\blob可能不仅仅在当前文档中定义 - 可能是:

  • 在包含当前文档的主文件中,
  • 在当前文档包含的从属文件中,或
  • 在文档使用的包中。

答案1

寻找的一般问题在哪里定义命令时没有可行的解决方案。宏可以和改变其含义;一个典型的例子是\\。这个简单的文档

\documentclass{article}
\begin{document}

\show\\

{\centering\show\\}

\begin{tabular}{c}
\show\\
\end{tabular}
\end{document}

在终端窗口中给出以下输出:

> \\=macro:
->\x@protect \\\protect \\  .
l.4 \show\\

?
> \\=macro:
->\ifhmode \unskip \else \@nolnerr \fi \par \@ifstar {\nobreak \@xcentercr }\@xcentercr .
l.6 {\centering\show\\
                      }
?
> \\=macro:
->{\ifnum 0=`}\fi \@ifstar \@xtabularcr \@xtabularcr .
l.9 \show\\

因此,除了缓存整个序言之外,安全例程还应该编译你的文档,以便获取实际的宏的含义。

另一个例子。假设你加载siunitx并执行\show\SI;输出是

> \SI=\protected macro:
->\int_zero:N \l__xparse_processor_int \tl_set:Nn \l__xparse_args_tl {\SI code }\tl_set:Nn \l__xparse_fn_tl {\SI  }\__xparse_grab_D:w []{-NoValue-}\__xparse_grab_m_1:w \__xparse_grab_D:w []{-NoValue-}\__xparse_grab_m_1:w \l__xparse_args_tl .

但它的实用性非常值得怀疑。

另一个例子。假设你正在使用amsmath并想要访问的定义\bar\show命令将打印

> \bar=macro:
->\protect \mathaccentV {bar}016.

但你会绝不找到执行此定义的位置,因为没有\def\newcommand或任何其他类似的命令可以执行此操作:确实在amsmath.sty你找到(为方便起见,请输入行号)

574 \def\set@mathaccent#1#2#3#4{%
575   \xdef#2{\@nx\protect\@nx\mathaccentV
576     {\@xp\@gobble\string#2}\hexnumber@#1#4}%
577 }
578 \def\@tempa#1{\@xp\@tempb\meaning#1\@nil#1}
579 \def\@tempb#1>#2#3 #4\@nil#5{%
580   \@xp\ifx\csname#3\endcsname\mathaccent
581     \@tempc#4?"7777\@nil#5%
582   \else
583     \PackageWarningNoLine{amsmath}{%
584       Unable to redefine math accent \string#5}%
585   \fi
586 }
587 \def\@tempc#1"#2#3#4#5#6\@nil#7{%
588   \chardef\@tempd="#3\relax\set@mathaccent\@tempd{#7}{#2}{#4#5}}
589 \@tempa{\hat}
590 \@tempa{\check}
591 \@tempa{\tilde}
592 \@tempa{\acute}
593 \@tempa{\grave}
594 \@tempa{\dot}
595 \@tempa{\ddot}
596 \@tempa{\breve}
597 \@tempa{\bar}
598 \@tempa{\vec}

第 597 行从内核的角度执行了重新定义

\mathaccent "7016\relax

fontmath.ltx由高级指令分配

\DeclareMathAccent{\bar}{\mathalpha}{operators}{"16}

最后一个例子。你甚至无法从命令的定义中猜出它的语法:下面是\show\makebox

> \makebox=macro:
->\leavevmode \@ifnextchar (\@makepicbox {\@ifnextchar [\@makebox \mbox }.

答案2

我要提到 TeXlipse,其中包括此功能,但只是部分。当光标位于宏名称上时,您可以按 F3 跳转到其定义。但是...

  • TeXlipse 不\renewcommand考虑通过重新定义。

  • 它不理解 定义的宏\def。仅\newcommand看起来有效。

尽管如此...

  • 如果宏是在当前文件之外定义的,则在通过 包含的包中起作用\usepackage

答案3

您可以尝试类似于的正则表达式(PCRE)/(\\def|\\renewcommand|\\newkeycommand).*$cmdname/

希望这会有所帮助,我现在无法为它编写任何 lisp,但实现起来应该很简单。

相关内容