标题几乎说明了一切。如果有帮助的话,我在阅读时发现自己问了这个问题,这篇关于 \par vs. \\ 的文章。
答案1
答案不是很简短(对于评论来说太长),但另一方面也不是很长。
TeX 基元是elementary particles
TeX Universe 的。它们不是也不能由其他命令序列构造。这些基元已由 TeX 引擎提供,并且未在plain.tex
(或latex.ltx
LaTeX 版本中)中定义。目前,最常用的 TeX 引擎是 pdftex、xetex 和 luatex。
相反,宏是使用 TeX 基元(例如\def
)和/或其他宏设置的,而这些宏又使用其他基元。您可以在文件plain.tex
(Plain-TeX 核心)、latex.ltx
(LaTeX 内核)以及各种.cls
和.sty
包文件和inline
许多文档中找到宏。
突出的原语有\let
、、、、、(及其变体等)等。列表太长,无法在此全部\par
列出\box
。\hskip
\vskip
\def
\edef
\expandafter
原则上,可以\par
通过重新定义\def\par{...}
。但是,在大多数情况下,这并不可取。在对 TeX 系统进行一些奇怪的操作之前,使用\let\oldpar\par
来保存 的含义;-)\par
原语和宏的共同点是它们都是有时带有参数的命令序列。
答案2
TeX 是一种宏扩展语言。这意味着我们作为程序员可以定义一系列宏,这些宏在使用时会被其定义替换。因此
\def\foo{\baz ab}
当我使用\foo
TeX 将其替换为时,\baz ab
它会查找 a\baz
以查找其定义。这可能是另一个宏,可能是一些文字文本(例如ab
),也可能是原始。这是 TeX 内置的命令,因此是执行而不是扩展。因此,例如,\par
原语是指示 TeX 进行一些排版的指令。
上述内容有几个附加条件。首先,我们可以定义与原语相同的名称
\let\oldfpar\par
\def\par{...
可用于各种效果。这是一项重要的技术,但请注意,我保存了原始形式,因此我仍然可以获取原始内容。
其次,虽然我说过原语是可执行的,但其中一些是“可扩展的”,因此确实会以某种方式被“结果”取代。原\par
语不是其中之一(排版不能被认为是“提供替换文本”),但例如所有条件(\if...
)都是。
第三,我们可以创建不是宏的控制序列(“命令”)。我们已经看到\let
,它将控制序列的含义复制到新名称,因此可以用于原语和宏。我们还可以做类似的事情\chardef
,它使控制序列等于字符或字符编号。
您可以看到当前使用的内容定义\show
。因此
\show\par
\let\oldpar\par
\def\par{\oldpar}
\show\par
我明白了
> \par=\par.
l.1 \show\par
?
> \par=macro:
->\oldpar .
l.4 \show\par
注意,在第一种情况下,我的控制序列\par
等于原语\par
,而在第二种情况下,它是一个宏。这可能会导致一些奇怪的效果:
\let\savedshow\show
\let\show\par
\let\par\savedshow
\par\show
\par\par
产量
> \show=\par.
l.4 \par\show
?
> \par=\show.
l.5 \par\par
?
这里的关键点是原语的‘内部’名称(TeX 用于表示其动作的名称)永远不会改变。