受到热烈欢迎我之前有关于类似主题的问题,我将继续进行类似的调查。我认为,如果我可以在我的 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,但实现起来应该很简单。