我发现很难找到以 开头的命令的定义@
。在哪里以及如何\@nobreaktrue
定义?
答案1
TeX 有一个内置的原语\show
来显示命令序列的含义。例如
\show\TeX
\bye
在 plainTeX 中写道:
> \TeX=macro:
->T\kern -.1667em\lower .5ex\hbox {E}\kern -.125emX.
l.1 \show\TeX
到终端和log
文件。
但对于已经定义强大的LaTeX命令来说,这仅显示一些不太有用的东西:
\show\pagebreak
\documentclass{article}
\begin{document}
\end{document}
导致终端(和log
-file)输出:
> \pagebreak=macro:
->\protect \pagebreak .
因此,从 2020-10-01 版本开始,LaTeX 有了一个新命令\ShowCommand
(参见ltnews32.pdf
)。
\ShowCommand\pagebreak
\documentclass{article}
\begin{document}
\end{document}
显示:
> \pagebreak=robust macro:
->\protect \pagebreak .
> \pagebreak =\long macro:
->\@testopt {\@no@pgbk -}4.
<argument> \pagebreak
哪一个更有用。
注意:<argument> \pagebreak
上面输出中的 并不意味着这\pagebreak
是 的参数\pagebreak
,而是 已\ShowCommand
使用 参数运行\pagebreak
。我解释这一点是为了避免误解输出。真正的参数将#1
在 之前显示为 等->
。
要显示以 开头的命令序列,@
您必须使用\makeatletter…\makeatother
:
\makeatletter
\ShowCommand\@nobreaktrue
\makeatother
\documentclass{article}
\begin{document}
\end{document}
写入终端(和文件log
):
> \@nobreaktrue=macro:
->\global \let \if@nobreak \iftrue .
由于\@nobreaktrue
不够坚固,
\makeatletter
\show\@nobreaktrue
\makeatother
\documentclass{article}
\begin{document}
\end{document}
有相同的输出。
顺便说一句:要找出定义的位置,您只能移动\ShowCommand
。在上面的例子中,所有定义都可以在所使用的格式中找到。例如,在\ShowCommand\section
之前,\documentclass
您会得到\section=undefined
。所以你会知道,它不是 LaTeX 格式的命令。加载类后,您将获得另一个输出,并且您会知道它是在类本身中定义的,还是在类所需的包中定义的。
要查找定义,您还可以搜索整个 TEXMF 树,例如grep -R '\\@nobreaktrue' /usr/local/texlive/2022/texmf-dist/tex/*
在 Linux/Unix 终端中使用。但是,这不仅会显示定义,还会显示每个用法。因此,您需要进一步限制搜索结果。如果这样\@nobreaktrue
做
grep -R '\\def\\@nobreaktrue' /usr/local/texlive/2022/texmf-dist/tex/*
将导致:
/usr/local/texlive/2022/texmf-dist/tex/latex/base/latex.ltx:\def\@nobreaktrue {\global\let\if@nobreak\iftrue}
/usr/local/texlive/2022/texmf-dist/tex/latex-dev/base/latex.ltx:\def\@nobreaktrue {\global\let\if@nobreak\iftrue}
但是,例如,\@footrue
通常搜索正则表达式\\newif *\\if@foo[^@a-zA-Z]
是更好的选择。