\@@par 和 \par 之间有什么区别?

\@@par 和 \par 之间有什么区别?

在 LaTeX 内部代码中我遇到了。这与或\@@par有何不同。如果我正在编写包或类文件,应何时使用?\par\newline\@@par

总的来说,我在研究内部代码时会遇到很多其他内部命令/宏(例如,,,,\z@等等\p@\protected@edef。如果我正在编写包或类文件,是否有一些文档可以说明何时以及如何使用它们?我真的应该关心它们吗?

答案1

在 LaTeX 中,该\par命令在文档运行期间会被重新定义多次。例如,在它tabular不执行任何操作的情况下:输入如下命令

\begin{tabular}{l}
\ttfamily\meaning\par
\end{tabular}

将打印

macro:->.

(冒号后显示参数文本;->句点前显示替换文本)。这样,用户就不会被tabular.

centerflushleftflushright环境中,定义更加复杂,但最终 \par将执行{\@@par},其中\@@par在内核中定义为

\let\@@par\par

在仍然具有其原始含义的时刻\par。在正常情况下,\par将具有原始含义,并且通常应\par在宏中使用。

另一个例子:当启动\parbox或时,将执行命令,它也会执行。为什么?因为或可以位于或任何其他已被重新定义的地方。minipage\@parboxrestore\let\par\@@par\parboxminipagetabular\par

内核有一组有趣的宏:

\def\@setpar#1{\def\par{#1}\def\@par{#1}}
\def\@par{\let\par\@@par\par}
\def\@restorepar{\def\par{\@par}}

宏改变了和\@setpar的含义;为什么要将 的新含义复制到 中?因为在不确定 是否具有所需含义的情况下,人们总是可以说 会恢复 的定义含义。 的默认定义是恢复原始含义。\par\@par\par\@par\@restorepar\par\@setpar\par\@par

当然,分组在这里起着至关重要的作用。例如,\par在 中不执行任何操作tabular,但一旦\end{tabular}执行,\par就会恢复之前的含义\begin{tabular}。因此很少需要使用 进行恢复\let\par\@@par;例外是\@parboxrestore,它旨在使 LaTeX 进入全新状态,就像应该开始一个新文档一样(我们在\parbox或中minipage,这确实有意义)。

您的问题可能是由以下行引发的:

\newenviron{solution}{}{\xappto{\temp@solnlist}{\solutionbody {\@@par}}}

在您的代码中使用 listxadd 和 xappto 时出现的问题

\par好吧,这是一个应该使用平原的地方:

\newenviron{solution}
  {}
  {\xappto{\temp@solnlist}{\expandonce{\solutionbody}\noexpand\par}}

\noexpand需要的,因为\xappto我们想要\par存储它,而不是在\xappto执行命令时不受控制地扩展它。

答案2

找到命令功能的最简单方法是创建一个最小命令并运行:

\makeatletter\ttfamily
\meaning\par \\
\meaning\@@par \\
\meaning\p@

随着你对 LaTeX2e 内核的学习,你可以通过笔记等方式来拓展这个范围。

编写 LaTeX2e 样式的包和宏的最佳学习资源是源代码本身以及包。所有这些作业都是为了节省当时的内存而完成的,在现代课堂上是不必要的,我会选择可读性。

不要从头开始创建现代课程,而是从现有课程开始。我建议您查看以tufte-book获得灵感。该课程从另一个基类开始,并且有效地使用了包。

相关内容