“\@nobreaktrue”的定义是什么?

“\@nobreaktrue”的定义是什么?

我发现很难找到以 开头的命令的定义@。在哪里以及如何\@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]是更好的选择。

相关内容