什么是原始的、宏的以及它们如何比较?

什么是原始的、宏的以及它们如何比较?

标题几乎说明了一切。如果有帮助的话,我在阅读时发现自己问了这个问题,这篇关于 \par vs. \\ 的文章

答案1

答案不是很简短(对于评论来说太长),但另一方面也不是很长。

TeX 基元是elementary particlesTeX Universe 的。它们不是也不能由其他命令序列构造。这些基元已由 TeX 引擎提供,并且未在plain.tex(或latex.ltxLaTeX 版本中)中定义。目前,最常用的 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}

当我使用\fooTeX 将其替换为时,\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 用于表示其动作的名称)永远不会改变。

相关内容