是否存在使用 TeX(或许是纯 TeX)而不是 LaTeX 来编写文档更好的情况?
答案1
当你想完全理解正在发生的事情,或者想要完全控制时,TeX 很有用。原则上,LaTeX 也可以做到这一点,但还有很多需要理解的地方。(也就是说,LaTeX 是简单的但不是简单的,而普通的TeX虽然简单但并不容易。软件设计相关讨论。)
TeX 是一种排版工具;LaTeX 是一种文档准备系统。在我看来,当你想扮演打印机/排字员的角色时,TeX 很有用;当你想扮演作者的角色时,LaTeX 很有用。
阐述第二点:从前,书籍的生产方式如下:
这作者会用手(用钢笔或铅笔在纸上)或打字机或类似的东西写下他们的手稿(书的内容),然后(经过编辑和校对等)将其发送给打印机(人员)。
这打印机(人,而不是机器!)的工作是获取这些内容,并将其变成页面:拾取金属字块(每个字母),将它们分隔成等长的行,在这里和那里添加空格,等等。(字面意思是排字,所以是排字员。)
TeX 最初是为了帮助完成后一项工作而编写的(Knuth 已经拥有了大部分内容;他当时只出版了书的第二版(TAOCP Vol 2));后来 Leslie Lamport 意识到这对作者来说太低级了,于是发明了 LaTeX。因此,很难建议用纯 TeX 从头开始编写一本书;您最终可能会得到像 LaTeX 一样的复杂宏。但是,如果您已经拥有其他格式的内容,并且只想解决特定于特定已知大小的页面的问题,那么使用纯 TeX(使用尽可能少的宏)可能比使用 LaTeX 更容易。
举一个关于第一点的简单例子:考虑一下字体更改命令。Plain TeX 提供了一种表示“开始使用以下字体”的方法,具体来说就是“Computer Modern italic at 9pt”。当然,您可能希望在命令结束时切换回罗马字体,因此您需要小心地将此命令括在组中。但不仅仅是这样:您可能使用斜体来强调,如果在强调的内容中您想进一步强调,那么惯例是切换回罗马字体。此外,如果您想强调粗体中的某些内容,您应该切换到粗体斜体而不是常规斜体。同样,如果您的字体较大,那么您应该切换到较大的斜体字体。所有这些事情都是 LaTeX 默认\emph
自动执行的。如果您正在编写文档,这通常就是您想要的。但是如果由于某种原因您想要明确控制在哪里使用哪种字体,那么您可能不知道如何使用 LaTeX 来实现,并且当您弄清楚时,您将使用与典型 LaTeX 相差甚远的东西,它更接近普通的 TeX。
这是另一个例子,感谢 Bruno Le Floch 的unravel
包。比较一下运行 LaTeX\newcommand
和运行普通 TeX时内部发生的情况\def
:
\documentclass{article}
\usepackage{unravel}
\begin{document}
\unravel{\newcommand*{\foo}[1]{bar(#1)}} % The LaTeX way
\unravel{\def\foo#1{bar(#1)}} % The plain-TeX way
\foo{3}
\end{document}
按照 的打印unravel
,前者需要 126 步,而后者需要 2 步。此示例说明了 LaTeX 和纯 TeX 之间的其他一些不同点:
- 从技术上来说,普通的 TeX 方式在 LaTeX 中仍然可用,只是不鼓励使用。
- 普通的 TeX 标记通常可以更短(通过做更少的事情:参见下一点)。
- LaTeX 方式可能是大多数作者想要的,因为它源于经验并提供了额外的保护(在这种情况下,可以防止意外重新定义现有命令的常见可能性)。
- 不过,总体而言,使用 LaTeX 的人中很少有人会知道
\newcommand
幕后发生的一切,因此这不利于我们准确理解正在发生的事情。
作为另一个例子(我保证这是最后一个),比较一下标准 LaTeX 方法来获取项目符号列表:
\documentclass{article}
\begin{document}
Some text.
\begin{itemize}
\item first
\item second
\end{itemize}
More text.
\end{document}
与 Knuth 的做法类似texbook.tex
(对应第 10 页):
% TeXbook uses "\input manmac"; for this example just need the following from it.
\def\bull{\vrule height .9ex width .8ex depth -.1ex } % square bullet
% These 3 are already in plain.tex, reproduced here as they may be less familiar.
\def\hang{\hangindent\parindent}
\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
\def\item{\par\hang\textindent}
Some text.
\nobreak\medskip
\item\bull first
\smallskip
\item\bull second
\medbreak\noindent
More text.
\bye
\tracingmacros=1
如果您用和包围“一些文本...更多文本” \tracingmacros=0
,则 LaTeX 情况下的行数大约多 25 倍。更重要的是,LaTeX 方式可能更接近作者的想法,而 TeX 方式可以清楚地显示正在进行的所有排版。
答案2
这个问题没有答案,实际上它符合标准的“基于意见”的关闭原因。但无论如何我都会尝试回答。
TeX 是一种宏扩展语言,并且
LaTeX 被定义为一组宏,因此您在 LaTeX 中编写的所有内容最终都会扩展为一些 TeX 基元序列。
相反,TeX 允许您定义宏,因此从原语(initex)或纯 TeX 开始,您可以定义与 LaTeX 等效的宏。
因此,在某种程度上,它们的功能是相同的。对于绝大多数人来说,在大多数时间里,最好使用 LaTeX,因为无论技术优缺点如何,LateX 基本上形成了一种交流语言,其意义独立于 TeX 排版机中的实现,使用具有共同理解的通用语言进行书写也有其用途。如果您编写自己的 TeX 宏,即使它们排版了等效文档,其他人和其他系统也会更难理解这些文档。
除了共享语言方面,LaTeX 宏并不总是您现在会选择的实现(它们是为更小的机器设计的),但它们已被数百万用户使用了数十年,而且大多数更严重的错误都已修复或有已知的解决方法。如果您“自己动手”文档宏,虽然理论上它们可能同样强大,但可能性不大,数百万小时的测试时间很难被打败。
由于我已经成为维护 LaTeX 团队的一员超过 25 年了,这也许不是您能得到的最客观中立的比较,但仍然......
因为现在是十二月,所以可能一年中最好的时机是指出我有时确实会使用纯文本,例如,我前段时间写的这个纯文本多年来一直有用。
\let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
:76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR@oL
RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
I71Fo71dPA!!FRgiePBt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal,@i;@ TLRlogdLrDsW,@;G
LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;Rri@stW aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye
答案3
几年前,我花了一些精力学习纯 TeX。我这样做是因为:
- 我发现 LaTeX 输出很丑
- 我正在学习 ConTeXt,它的文档经常建议你在需要做一些复杂的事情时使用纯 TeX
具体来说,对于 LaTeX,我经常发现它做出了一些决定,表面上是为了让你不必考虑某些事情,但你不喜欢它做出的决定。你的选择是阅读 LaTeX 代码并找出发生了什么以及如何发生(这并不容易),找到一个可以修复这个小问题的软件包(通常可行,但有时感觉很恶心),或者忍受痛苦。
使用普通的 TeX,您要对看到的任何行为负责,所以如果您不喜欢它,那是您的错,您可以了解自己做错了什么。或者至少在 tex.SE 上询问。:)
顺便说一句,如果您想学习纯 TeX,我建议您从 XeTeX 或 LuaTeX 开始,因为这些引擎的字体情况要简单得多。
答案4
我长期使用 LaTeX(我发现 TeXbook 很难理解),但我从计算机编程的角度来理解这个问题。我第一次接触编程是在当地技术学院的一门关于机器代码(一堆 0 和 1)的课程——太糟糕了,尤其是当我得知学院没有计算机,因此除了手动检查我们提交的代码外,没有其他办法;之后就很容易了,只需提交随机的 0 和 1 序列!但基本上计算机可以理解机器代码。
然后出现了汇编代码,虽然不太容易理解,但至少有一定的可读性。还有一些程序将汇编代码转换成机器代码。
随后出现了 FORTRAN、C 或 Java 等编程语言,它们提供了谈论事物的高级方式 --- 更符合人类的理解(前提是你是计算机程序员)。这些语言附带编译器,编译器本质上会将语言转换为汇编语言,然后再转换为机器代码,然后计算机就可以完成奇妙的事情了。
我的感觉是,尽管 TeX 可以做你想做的事,但它类似于汇编代码,而 LaTeX 类似于 FORTRAN 或 Java,更容易描述你想要的东西。就像编程语言 LaTeX 被“转换”为 TeX 一样。
您想在高水平还是低水平上操作?较低的水平可能处理器效率更高,但较高的水平可能更容易理解。
TeX 文档的编译速度可能比 Latex 文档快,但我们这里谈论的是(几分之一秒)的时间。将其与您制作满足您需求的 TeX 文档所花费的时间进行比较,而 LaTeX 提供了使用 TeX 编码可能需要的许多解决方案。