我知道 LaTeX,也听说 LaTeX 是 TeX 中的一组宏。但它到底是什么意思呢?
答案1
答案2
简而言之TeX 就是格式化对于文档/模板设计者来说,LaTeX 的全部内容都是内容,适用于文档编写者。
TeX 是一种排版系统。它提供了许多命令,允许您详细指定文档的格式(例如字体样式、间距、字距、连字等),并具有专门的算法来计算文档中文本的最佳流动(例如在哪里剪切行、页面等)。TeX 的全部目的是为您提供强大的算法和命令,以指定哪怕是最微小的细节,使您的文档看起来很漂亮。
LaTeX 是一套基于 TeX 的宏。LaTeX 背后的想法是将焦点从格式到内容文档。在 LaTeX 中,命令都是关于为文档内容(例如章节、重点、表格、索引等)提供结构。在 LaTeX 中,您只需说\section{...}
:选择更大的字体、不同的字体样式,并在章节标题前后插入适当的空格。由于 LaTeX 建立在 TeX 之上,因此您当然也可以获得漂亮的文档作为输出;但更重要的是,您的源输入也可以结构良好,更易于人类阅读(和书写!)。
答案3
(已更新以更好地反映 LaTeX 格式的年龄)
区分排版“引擎”、“格式”和“包”很重要。
这引擎是实际的程序。如今,与 TeXlive 和 MiKTeX 一起分发的最常用引擎是
pdfTeX
、XeTeX
和LuaTeX
。这些“引擎”利用许多所谓的“原始”指令来完成处理用户输入的工作。原始 TeX 引擎提供的“原始”指令示例(以及较新的引擎提供的指令!)包括\def
、\outer
、、\expandafter
、、、、和。原始指令非常强大,但其中许多指令非常低级,因此直接在文档中使用它们会相当棘手,这是客气的说法。\noexpand
\futurelet
\relax
\catcode
\vbox
\hbox
\accent
\kern
A格式是宏-- 在诸如
\def
-- 的原始命令的帮助下定义的命令,这些命令结合起来,使这组原始命令可供人类用于排版目的。例如,Plain TeX
是 Don Knuth(他还创建了 TeX程序)排版他的书籍,包括电子书. (旁白:电子书除了 Plain-TeX 中设置的宏之外,还定义并使用了其他宏格式,用于处理各种与格式相关的任务。)LaTeX2e
自 1994 年问世以来,它可能是目前最常用的格式。(附言:在 1994 年 LaTeX2e 发布之前,LaTeX 有多个编号版本;最终版本编号为“2.09”。)Plain TeX
和都LaTeX2e
可以与各种引擎“匹配”,具体来说pdfTeX
,XeTEX
和LuaTeX
。的当前版本ConTeXt
是一种基于 LuaTeX 引擎的格式;它无法在 或 下pdfTeX
运行XeTeX
。在大多数情况下,
Plain TeX
格式中定义的宏也在LaTeX
和LaTeX2e
格式中定义。但是,相当多的 Plain-TeX 宏(尤其是与更改文档中字体外观相关的宏,例如\bf
、\it
和\tt
)被视为已弃用,不应再在基于 LaTeX 的文档中使用;请改用基于 LaTeX2e 的宏,例如\textbf
和\itshape
。(准确地说,宏\bf
和\it
是不是在 LaTeX2e 内核中定义,但“仅”在某些 LaTeX2e 文档类中定义。)多年来,人们编写了大量软件包(几千个,甚至可能是几万个),用于完成新的排版相关任务或简化其他任务。许多软件包都需要格式
LaTeX2e
。不过,有些软件包可以很好地与Plain TeX
和配合使用LaTeX2e
。一些较新的软件包(例如fontspec
)可以运行仅有的在 XeLaTeX 和 LuaLaTeX 下。
可以肯定的是,关于哪些排版任务应该由引擎、格式和软件包处理的决定可能有点武断,而且经常取决于历史。例如,在 1994 年,当它LaTeX2e
首次广泛传播时,在文档内和文档之间超链接文本片段的能力并不被认为是核心排版工作。我确信,如果hyperref
从一开始就将各种与超链接相关的“钩子”和重要设计决策内置到 LaTeX2e 格式中,那么这个软件包(它是在 LaTeX2e 基本上被冻结之后很久才出现的)会更加精简和更容易维护。
另一个例子:TeX(引擎)具有功能强大且通常非常成功的段落构建算法。但是,如果用户(或软件包编写者)使用 、 或 作为底层引擎,则无法直接调整或修改这些算法TeX
。pdfTeX
相反XeTeX
,随着LuaTeX
段落构建算法的重要组件已向程序员“开放”。因此,我们开始看到新的软件包(显然需要使用LuaTeX
作为引擎)提供迄今为止根本不可行的额外排版功能。
当您输入如下指令时
pdflatex myfile
在命令行中,实际运行的是pdfTeX
程序首先加载 LaTeX格式然后处理其中的内容myfile.tex
以创建一个名为的文件myfile.pdf
。
这里有三种打印“Hello World”的方法。第一种需要 (Plain) TeX,第二种需要 LaTeX2e,第三种需要ConTeXt
。
Hello World.
\bye
\documentclass{article}
\begin{document}
Hello World.
\end{document}
\starttext
Hello World.
\stoptext
假设输入文件hello.tex
在这三种情况下都有名称。要生成 pdf 文件,您需要键入 编译第一个文件pdftex hello
,键入 编译第二个文件pdflatex hello
,键入 编译第三个文件context hello
。
有关 TeX 引擎和格式的更多信息,我推荐文档的第 1 部分LuaLaTeX 指南作者:Manuel Pégourié-Gonnard。它有一个方便的表格,对四种引擎、两种格式以及两种创建 dvi 和 pdf 文件的方式之间的潜在交互进行了分类。
答案4
Don Knuth 提供了 TeX 排版程序和普通的 TeX 宏(文件 plain.tex)。
TeX 程序负责排版。预加载的宏(当然还有输入文档)控制排版的内容。
通常,宏和输入文档将项目放在水平列表中,然后,当发出 \par 命令(例如,空白行)时,TeX 程序会将段落分成行。
如果你用 \tracingall 运行 TeX,你可以看到什么是宏,什么是 TeX 命令。我建议你尝试一下
$ tex '\relax \tracingall \input story \end'
而不是 LaTeX 文档。LaTeX 进行了很多宏处理,特别是字体选择。