我对 TeX 和 LaTeX 还很陌生,因为大创意— 以编程方式创建文档。然而,我对 TeX(及其库 — LaTeX、ConTeXt 等)的体验几乎完全不愉快。
我的印象是 TeX(ETC。)本质上是一堆未记录的宏(甚至功能?)语法不可解析(我被告知它是图灵完备的),经常崩溃(大多数错误消息都有神秘的来源),对现代框架的支持不稳定(我不得不读报纸关于字体命名方案以找到如何应用 Helvetica?),并且没有进行实际编程的机会(而不是脑死亡标记),代码库令人困惑地支离破碎(我应该使用哪个二进制文件、分发版、库,以及它们如何交互?)。
鉴于这个伟大想法是值得称赞的,并且 TeX 和朋友们还远未达到它的理想实现,我想知道:
为什么在程序化文档格式化问题领域中,TeX 是唯一的参与者?难道没有人知道如何做得更好吗?如果我们从头开始设计 TeX,它会是什么样子?
(注:我不是寻找论战;我正在寻找真正的答案。)
答案1
(对于任何“太长;没读完”的感受,我提前道歉——如果你只想读其中一句话,那就读这个链接吧:开始使用 LaTeX/TeX 的最佳方法?)
我的非专家背景:
- 我从 2002 年左右开始使用 LaTeX 帮助我校的工程专业学生撰写硕士论文和博士论文。
- 几年来,我对 20 世纪 90 年代早期的旧论文样式文件做了基本的修改,并尝试了两三次从头开始编写论文。
- 我终于成功实现了 2008 年开始使用的版本,最近对其进行了大量更改,以便默认将用户与样式的内部结构隔离开来。新样式涵盖了旧样式的所有功能,为目录和其他列表中的奇数页标题增加了相当多的自动化功能,并且代码行数减少了约 50%。
我学到的东西:
- 只要你达到中等程度的文档要求,编写 LaTeX 文档就等于编程。
- 它可以被编程得很差,也可以被编程得很高效。
- 你的编程水平有多差或多高效,很大程度上受到强迫症倾向、好奇心和批判性思维的影响。
至于提出的具体问题:
大多数错误信息的来源都很神秘
我明白你的意思。你肯定得不到干净的 Pythonic 堆栈跟踪。没有简单的调试工具(不过 ConTeXt 可能有更好的支持)。调试通常是一个生成最小工作示例的过程,它要么让你在开始注释和删除代码时确定问题消失的地方,要么至少将问题的范围缩小到可以更轻松地获得专家建议的程度。
真的,这让我想起当我们没有一个好的调试器(或者不知道如何使用调试器)时,我们是如何使用“回声检查”来调试 Fortran 代码的。
我必须阅读一篇有关字体命名方案的论文才能找到如何应用 Helvetica?
我认为这有点夸张,但它确实说明了可用的文档级别不同。有些文档已经过时,有些不完整。谷歌搜索“latex 字体”会返回一系列相当难以预测的答案,其中一些要么是错误的,要么是过时的,要么是不完整的。
谷歌搜索“Latex 字体选择”返回其他页面,包括本维基百科页面,但这并不是您想要的,除非您想使用 XeTeX(其创建的部分原因是为了更轻松地处理 Unicode 和任意字体)。
我最终在这个网站上搜索了字体信息,并找到了如何更改字体文档的宽度?——它没有给出完整的示例,但包含了所有内容。默认情况下,Helvetica 的 MWE 是
\documentclass{article}
\usepackage{helvet}
\renewcommand\familydefault{\sfdefault}
\begin{document}
Hello, world.
\end{document}
函数在哪里?(涉及强迫症领域)
我不确定您如何定义函数而不是宏,但我当然可以定义可重用的代码块并调用它们。这些块可以接受不同数量的参数,并相应地采取行动。它们可以有效地为参数提供默认值。LaTeX 的全局命名空间可能是一个障碍,但通常通过使用特殊前缀或类似前缀标记局部变量来解决。
例如:我们论文委员会的签名表要求每位委员会成员一行。一些委员会成员有特定的头衔(主席或联合主席),其他人没有特定的头衔。每行还应包括一个供成员写批准日期的位置。有一次,我们有一位亲戚,吨\memberone
复制和粘贴的代码仅在于我们是否排版、等的名称\membertwo
以及该人是否具有特定的头衔而有所不同。
现在,我们有一个单一函数(或者宏,我猜)它接受两个参数,并且可以排版任何成员的签名行。
\newcommand{\nameanddateline}[2]{% irrelevant spacing and other commands removed
\eqparbox{name}{\hrulefill} \quad \parbox{.75in}{\hrulefill} \\
\eqparbox{name}{#1\ifthenelse{\equal{#2}{}}{\relax}{, #2}}
\quad \makebox[.75in][c]{\hfill{}Date\hfill{}} \\
}
调用时,\nameanddateline{\committeechair}{\chairtitle}
我们得到一个添加了主席头衔的签名行。调用时\nameanddateline{\memberone}{}
,我们得到一个完全没有头衔的签名行。在接下来的几天里我将发布的版本中,我甚至去掉了部分,\memberN
转而使用姓名数组(学生将使用\renewcommand{\committeemembers}{Member 1, Member 2, ...}
,我可以迭代逗号分隔的值)\committeemembers
。
LaTeX 不会强迫你编写高效或可维护的代码或标记。我并不声称我的代码是顶级的。我的 Python 代码可能会让你痛苦地哭泣。但它就像任何其他语言一样,由程序员决定他们想要的东西有多干净。
没有进行实际编程的机会(与愚蠢的标记相反)
我不确定你会把什么称为死标记。它具有足够的编程能力,让我能够以相对高效的方式排版我的文档。我可以定义自己的命令,可以循环遍历定义为逗号分隔值的简单数组的元素,并且我有 if/then/else 结构。对于我的需求,它运行良好。我当然更喜欢用它,而不是编写 VBA 或与 MS Word 中的主文档和其他问题作斗争。
那里有很多过时的信息。长期用户中有很多坏习惯,他们没有跟上新软件包的步伐,或者没有仔细考虑如何将文档写得更像代码,而不是显式标记。举个例子:我认识一个人,他\bf
的论文中有 1700 多个命令,默认情况下,每个命令都会在较新的回忆录类中抛出错误。全部这些命令用于定义向量。如果他曾经读过任何中间材料,说你可以定义一个\bvec{}
命令来执行向量格式化,他只需要改\newcommand\bvec[1]{\bf #1}
一次\newcommand\bvec[1]{\bfseries #1}
。
同样,一位合作者向我介绍了一些奇怪的定理间距。他一直在解决这个问题,方法是添加一个\vspace*
命令来删除多余的空格。我想,“这不可能是它设计的工作方式”,我的强迫症开始了。大约一个小时后,我找到了一个使用该\qedhere
命令的更简洁的解决方案。它在 Wikibooks 上有很好的记录,但你必须去寻找它,而不是简单地实现想到的第一个修复。
我对这样的事情感到沮丧,但并不感到震惊。也许我的标准太低了——就在几年前,我的一个学生问我,为什么她教授的 Fortran 有限元代码在她的系统上编译不通过,而在他的系统上却运行良好。我从 1989 年开始编写 Fortran,并且改编了 70 年代早期编写的代码。我没有认识到引发错误的行上的符号。另一位教员看了看,说:“哦,那是霍尔瑞斯符号”。该符号在 Fortran 66 标准中已弃用,并在 Fortran 77 中完全删除。原来的教授在 2004 年左右仍在使用它。为什么?因为它仍然可以为他编译。一些长期使用 LaTeX 的用户也有类似的效果。
令人困惑的、支离破碎的代码库(我应该使用哪个二进制文件、分布图和库,以及它们如何交互?)。
值得庆幸的是,这种分裂更多的是理论上的,而不是实践上的。至少根据我的经验,LaTeX 代码通常是分布中立的。我不得不修改我的论文风格中的一个命令来处理两个不同版本的回忆录类(一个是 2005 年的 PCTeX 版本,另一个是 CTAN 上的当前版本)。但我所要做的就是检查某个非常简单的命令是否已定义,如果没有,就自己定义它。
我认为 CTAN 在提供干净、更新的软件包方面做得非常好。您从随机 Google 搜索中获得的说明或软件包显然会有很大差异。
答案2
为什么在程序化文档格式化问题领域中,TeX 是唯一重要的参与者?
对我来说,你的意思不太明显,但从表面上看,这个前提并不正确。基于 Java,有两种非常强大的 PDF 生成工具:Open Office 具有完全可编程的后端,而用于创建 PDF 的 Java 库 i-Text 几乎可以完全覆盖 PDF 功能,在这方面比 Tex 引擎更强大(尝试在 Latex 的信件上添加数字签名)。这两种工具都支持生成类似于以下文档的方法:HTML::模板文档模板和代码是分开的,许多人认为这比通常编写的 Latex 文档更干净、更易于维护。值得一提的是,最新版本的 Word 允许 VBA 访问 .NET 库,从而允许在文档创建中实现相当高水平的编程复杂性。
我认为,Tex 家族的优势并不在于其功能列表,尽管就微排版而言,上述系统都无法与 Luatex 相媲美,而是在于文档准备和样式设计的精神。Knuth 的创作非常丰富。我已经记不清有多少数学 ascii 符号的作者认为它比 Knuth 的更好:事实上没有。Knuth 并没有试图给出最通用的模型,而只是给出一个足以让数学家写作出版的模型,但他的模型经受住了考验,并对后来的设计产生了巨大的影响,而后来的设计通常只吸取了一些经验教训。
掌握任何 Tex 系统都需要时间,但一旦掌握,它就是一种非常自然的文本准备方式。Tex 只有在你想要精细控制输出时才会变得困难,然后全部系统很难。宏的语义经常被抱怨,而且它们很棘手,但要找到一种如此顺利地融入文本的计算机制并不容易。
所以还有其他选择,而 Tex 家族拥有深厚而独特的优势。
答案3
TeX 的替代品是存在的:它们是所见即所得的文字处理器和桌面出版程序。而且在大多数商业领域,它们被更广泛地采用。
TeX 仍在使用在许多学术和其他领域因为
- 它的输出很漂亮
- 它是免费且开源的
- 作为学术传统的一部分,它在 30 年的使用中积累了相当大的惯性
我不确定你说的缺乏“认真的编程机会”是什么意思。函数和数据结构是作为宏实现的,是的,但我认为大多数强大的 TeX 用户都会称自己为程序员。
你可能会发现这些问题有助于你理解 TeX 的方式:
至于用 Helvetica 字体来放置章节标题,这并没有那么糟糕,但你必须了解一些有关 LaTeX 及其历史的知识。TeX 的出现时间早于 PostScript、PDF、TrueType 和大多数电子排版标准(以及 Unicode,这是一系列全新的问题)。因此,它的字体机制有点过时。XeTeX 引擎对此进行了显著改进,该引擎原生支持 TrueType 字体和 Unicode。
以下是一个示例文件,类似于您链接到的解决方案因为它使用sectsty
包。这个包可能在你的本地 TeX 发行版中;无需下载或安装。与你链接的示例不同,你必须通过 xelatex 而不是 pdflatex 来运行它。同样,该可执行文件也可能在你的本地发行版中。优点是字体规范更合理。
\documentclass{article}
\title{Helvectica section headings}
% TEX.SE \url{}
\usepackage{lipsum}
\usepackage{fontspec}
\newfontfamily{\phv}{Helvetica}
\usepackage{sectsty}
\allsectionsfont{\phv}
\begin{document}
\maketitle
\section{First section}
\lipsum[1-3]
\section{Second section}
\lipsum[4-5]
\end{document}
答案4
預設失敗。
首先,人们正在尝试让 TeX 变得更好,例如LaTeX3和LuaTeX项目。(这些并不是从头开始重建 LaTeX,但已经很接近了)
其次,还有其他选择,比如文档书。事实上,许多标记语言项目都可以从这个角度来看待。如果 HTML 不是以编程方式创建文档,那么它到底在做什么?
稍微不那么开玩笑地说,为什么是TeX 仍然流行吗?有一定数量的“如果它没坏...”:很多人都知道如何使用 TeX,任何新项目都很难说服任何人使用它。
我认为你的一般问题可以问任何大型代码项目。为什么 PHP 是这样的?为什么 HTML 的工作方式所以?我们为什么不把一切都扔掉,从头开始呢?因为那是这很少是一个好主意。