在 LaTeX 内部代码中我遇到了。这与或\@@par
有何不同。如果我正在编写包或类文件,应何时使用?\par
\newline
\@@par
总的来说,我在研究内部代码时会遇到很多其他内部命令/宏(例如,,,,\z@
等等\p@
)\protected@edef
。如果我正在编写包或类文件,是否有一些文档可以说明何时以及如何使用它们?我真的应该关心它们吗?
答案1
在 LaTeX 中,该\par
命令在文档运行期间会被重新定义多次。例如,在它tabular
不执行任何操作的情况下:输入如下命令
\begin{tabular}{l}
\ttfamily\meaning\par
\end{tabular}
将打印
macro:->.
(冒号后显示参数文本;->
句点前显示替换文本)。这样,用户就不会被tabular
.
在center
、flushleft
或flushright
环境中,定义更加复杂,但最终宏 \par
将执行{\@@par}
,其中\@@par
在内核中定义为
\let\@@par\par
在仍然具有其原始含义的时刻\par
。在正常情况下,\par
将具有原始含义,并且通常应\par
在宏中使用。
另一个例子:当启动\parbox
或时,将执行命令,它也会执行。为什么?因为或可以位于或任何其他已被重新定义的地方。minipage
\@parboxrestore
\let\par\@@par
\parbox
minipage
tabular
\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
获得灵感。该课程从另一个基类开始,并且有效地使用了包。