![你支持和反对 TeX 的观点](https://linux22.com/image/381654/%E4%BD%A0%E6%94%AF%E6%8C%81%E5%92%8C%E5%8F%8D%E5%AF%B9%20TeX%20%E7%9A%84%E8%A7%82%E7%82%B9.png)
我的回答是“不多”,我正在考虑将 *TeX 移植到浏览器。抱歉,这不是一个确切的问题,但我不知道有更好的地方可以收集专家意见。
我认为 TeX 的主要特性包括:
数学
离线处理,与在线浏览器和所见即所得 MS-Word 相比,可以更仔细地计算间距和连字符等排版细节;
用于控制和文本生成的统一的宏语言;
对于 LaTeX 等来说,内容和样式是分离的。
(1) 是无与伦比的,但它已经移植为 MathJax。(2) 应该可以在无头浏览器中使用。(3) 几十年前 Unicode 还不流行甚至还没有诞生时可能是一个优势。现在人们几乎只对非文本(如图形和代码列表)使用命令。当不断使用特殊文本时,\TeX
例如教科书,无论如何,在 html+css+js 中模拟很容易。 (4) 现在在前端社区中得到了更多的讨论和支持。
我移植 *TeX 的动机来自于无数令人沮丧的徒劳的调试、谷歌搜索和订购软件包等努力。我必须承认,直到最近我才开始阅读教科书。我想学习 *TeX 的最佳实践和可维护风格,这样当我传递一些不适合表格单元格或叠加投影仪项目的内容时,我可以得到有意义的消息,如类型或断言错误,而不是随机包中缺少括号,甚至是没有任何消息的空白页。
我发现没有最佳实践,只有历史。
我知道 LuaLaTeX。即使它解决了所有主要软件包被重写后的一些问题,但它似乎还不足以让我忽视前端标准和技术的现有和未来的进步。
因此,我想问一下我是否错过了 *TeX 任何难以移植的显著优势,或者任何现有的使 *TeX 变得现代化或足够可用的努力,或者我应该在其他地方询问?
谢谢!
答案1
这对于评论来说太长了,因此我将它作为答案发布:
你支持和反对 TeX 的观点
- math […] 是无与伦比的,但它已经移植为 MathJax
这不完全正确。MathJax 复制了部分语法,但直接比较,输出结果存在相当多的差异,MathJax 无法与排版系统 TeX 竞争。但当然,对于大多数用户来说,这两个系统都会输出一些他们能理解的数学符号。这一点肯定与你想要实现的质量有关。
- 离线处理,与(在线)浏览器和(所见即所得)MS-Word 相比,可以更仔细地计算间距和连字符等排版细节;[…] 应该可以在无头浏览器中实现。
现在的问题是你想模拟什么。即使使用无头浏览器,精心布局页面(如 TeX 所做的那样)也很难模拟,因为它需要大量计算。好的,连字算法已经在浏览器中实现(如果我没记错的话),你很可能会得到某种页面布局(pdf.js 也使用 Web 技术来输出页面)。但是你能对字体进行详细的调整吗?如果没有大量的附加组件,可能就无法做到。
此时您应该非常小心,像 pgfplots 所做的计算和引擎所做的计算不会混合,并且您不会最终得到一种资源怪物,它会比我的带有 100 多个选项卡的浏览器窗口消耗更多的内存(顺便说一句:我希望现代 Web 应用程序在 1 个选项卡中运行并且不会消耗太多资源,我想这对您来说将是一个很大的挑战)。
- 一种用于控制和文本生成的统一宏语言;[…] 几十年前,当 Unicode 还不流行甚至还没有诞生时,这可能是一个优势。现在人们几乎只对非文本(如图形和代码列表)使用命令。当经常使用特殊文本时,如 texbook 中的 \TeX,无论如何都很容易在 html+css+js 中模拟
你说得真快。你真的认为 unicode 能解决所有问题吗?我知道网络确实使用不同的技术进行语义标记(宏也用于此,你参考了图片和列表)。但在这种情况下,TeX 提供的所有优势都是基于宏作为排版的通用语言。
现代应用程序使用类似的方法:领域特定语言。TeX 已经形成了一种 DSL,如今已被其他人采用(例如:MathJax),但请注意,您的“易于模拟”可能并不像您想象的那么容易。重要的是使用宏扩展的乐趣,它解决了许多问题,而将宏扩展作为“有趣的练习”永远无法实现在浏览器中模拟 TeX 的方法。
回到处理的角度:TeX 在其流程中集成了许多选项,包括使用外部工具,如 Biber、Xindy 等。如果您想移植整个用户体验(即输出),您也需要移植这些软件。
对于 LaTeX 等,内容和样式是分开的。[…] 现在在前端社区中得到了更多的讨论和支持。
这对你来说是一个要点。HTML 和 CSS 在该领域比 TeX 和 LaTeX 好得多。但实际上,如果你尝试实现分离,你就能实现。
你的目标
我移植 *TeX 的动机来自于无数个令人沮丧的徒劳的调试、谷歌搜索和订购软件包等的努力。
所以我们开始吧:移植 TeX。过去曾有一些将 TeX 移植到类型安全语言(好吧,Java)的项目,即 NTS 和 ExTeX。我必须承认,我过去看过两者的源代码,甚至尝试用它们运行简单的 TeX 文件,但作为完整的 TeX 实现,它们有一个目标:以 TeX 方式运行 TeX 文件——这意味着要进行扩展。
您要尝试做的是编写不使用 TeX 的 TeX,而这基本上就是 LuaTeX 团队通过 Lua 作为独立语言提供的功能。但您想要其他东西:从 TeX 中移除 TeX 的意图。您想使用 TeX(其算法等)来制作网页,这与 TeX 的用途(即在纸上排版,大小受限,打印机限制等)截然不同。
我知道 LuaLaTeX。即使它解决了所有主要软件包被重写后的一些问题,但它似乎还不足以让我忽视前端标准和技术的现有和未来的进步。
你希望社区在这里做什么?大多数(如果不是全部)软件包维护者都试图与引擎无关,这样他们就可以在 pdflatex、xelatex 和 lualatex 上运行并获得相同的结果。针对一个引擎的优化必须有真正的好处(例如,参见 pgfplots),否则你不会这样做(Knuth:过早优化是万恶之源)。
还有一个重要事实:大多数(如果不是全部)软件包维护者都不会因他们的工作而获得任何报酬,他们是自愿这样做的。如果您重新实现 TeX(并放弃宏方法),您将无法仅仅说“嘿,我有一个新的‘引擎’,请调整您的软件包”,因为 TeX 社区喜欢其已被证明有效的开源软件。
因此,我想问一下我是否错过了 *TeX 任何难以移植的显著优势,或者任何现有的使 *TeX 变得现代化或足够可用的努力,或者我应该在其他地方询问?
所以基本上我认为你错过了 TeX 的一个重要优势:整体而言,它在(大部分)功能上都表现良好。它的排版效果非常好,而且使用 ConTeXt 和较新的引擎,你甚至可以使用真正现代化的附加功能。所有这些都针对一件事:将输出切分为页面,无论是演示文稿的框架还是纸张的页面。真的,说“那个、那个和那个很好,我不喜欢那个、那个和那个,所以让我们只移植前者并删除/忽略后者”太容易了。
还有一点:目前,让 TeX 变得现代化和可用是一个整个社区的过程(诸如 expl3、LuaLaTeX、PDF 标记、字体处理等项目),因此很难仅凭一个新项目就能真正超越所有这些。
回答您的评论
(输出结果存在相当多的差异,而且 MathJax 无法与排版系统 TeX 竞争。)您能详细说明一下吗?
MathJax 非常擅长将数学输入符号转换为更吸引人的数学输出。它没有做的(就我所知,如果我错了,请纠正我)是定位 TeX 的整个计算部分(这莫里安巴尔在类似帖子中解释这个)。
关于 TeX 支持:他们有相当好的常见问题解答,表明他们不打算复制 TeX(例如http://docs.mathjax.org/en/latest/misc/faq.html#does-mathjax-support-tex-macros,其中仅提及 LaTeX)。
我认为这里更重要的是,虽然 MathJax 可以产生“良好”的输出,但它的可扩展性远不及 TeX。想想那里的大量数学包,它们并不总是可以移植到 MathJax。这可能是因为字体问题,或者是由于 TeX 的编程功能无法轻易转移到 MathJax(想想 expl3 中的许多选项在那里都消失了)。
如果你真的想用网络技术构建一个 TeX 克隆,我建议你这样做:在这个网站上搜索带有标签的问题数学模式其中包含复杂的数学问题示例,这些问题已由我们的高级用户仅使用 TeX magic 解决。如果您的克隆也启用了此功能,则一切都很好,否则一个人可能必须了解多种语言(TeX 语法、HTML、CSS、JS)才能在您的系统中实现类似的结果,这将是付出很大努力却收获甚微。
对我来说这是违反直觉的,因为整个 tex.web 的程序部分只包含几千个 SLOC,因此它的数学子集应该很容易克隆。
好吧,您是根据代码行数来衡量 TeX 的?那么这里有一个警告:Donald Knuth 已经实现了许多优化。我想,如果您理解了 TeX 书中关于数学排版的整个部分(以及与之相关的所有内容:字体、对齐方式……)以及代码的实际作用,您可以轻松地克隆它。但除此之外,可能没那么容易。正如我所说,这句话只有在您打算复制 TeX 时才成立。如果您不想要(几乎)相同的输出,那么您仍然可以使用您能想出的任何代码。
(能不能具体针对字体做些调整?)我对字体操作确实不太熟悉,能举个例子吗?
是的:http://mirrors.ctan.org/macros/latex/contrib/microtype/microtype.pdf
(但请注意,你的“易于模仿”可能并不像你想象的那么容易。)你能给我一个反例吗?
正如我所说,已经有 NTS 和 ExTeX 等重新实现尝试正确实现这一点。而且它们相当复杂。所以也许你应该看看它们的源代码。这一点完全是关于兼容性的:如果你想“移植 TeX”,你必须关心这一点,如果不是,那么你可以使用语法的任何部分。
但是如果您想移植 TeX,请查看 LaTeX 和 LaTeX3 内核之类的软件包及其扩展技巧,像 TikZ 这样的软件包严重依赖输出驱动程序(您可能必须为网络编写的东西),如果您想与 LuaLaTeX 等现代引擎竞争(并兼容),您应该看看它们的回调机制。
(重要的是使用宏扩展的乐趣...)我知道对某些人来说,这是一个令人愉快的玩具。我曾经热衷于用 Perl 写诗和用 gnu-dc 编写程序。但对某些人来说,它们并不好玩,反而会带来不必要的痛苦。
没有人认为学习曲线是 TeX 的优势。大多数人都说它很难学,他们可能是对的。理解 TeX 肯定很难(我个人并不总是理解它)。所以你想删除宏扩展作为核心概念之一,同时仍然拥有像 TeX 一样强大的工具?那么你 (a) 需要引入另一种语言(可能具有更好的学习曲线)和 (b) 失去大多数习惯于 TeX 工作方式并接受宏扩展是一个概念的 TeX 用户(不是最舒服的,但也不是最糟糕的)。
(但你想要别的东西:从 TeX 中删除 TeX 的意图。)我怀疑 Knuth 的真正意图是什么,但如果它是关于“仅扩展”,那么你是对的。
我想我没有表达清楚我的观点:Knuth 的意图是创建一个排版系统他的书籍。据我所知,当时的书籍是页面的集合,是印刷品,因此他从未以我们今天所知的数字输出形式为目标。TeX 基于存在页面、输出例程必须计算断点位置等假设。
(你希望社区在这里做什么?...)抱歉造成误解。我当然不是在责怪社区。我确实觉得这是为了不必要的向后兼容性而进行的重复工作。
好吧,所以你认为向后兼容性是不必要的。那么请随意使用像那个大公司推出的每个人都喜欢的数字草稿纸这样的系统,并愉快地接受你需要在每个新版本中微调文档。兼容性可能看起来像是一个阻碍进一步发展的“功能”,但实际上它是 TeX 的优势之一。
话虽如此,调整软件包以适应 LuaLaTeX 等引擎肯定不是重复性工作(这是你的观点)。这是一个概念性决定,许多软件包不需要调整任何东西,因为现代引擎决定兼容并像 TeX 一样工作。是的,确实,你可能会因为向后兼容而错过一些前端技术的进步,但如果我跟上时代,PDF 仍然是纸质数字交换的首选,因此 TeX(在其类别中)正在使用现代技术。
(它的大部分功能都很好……)除了图像定位和代码列表,这浪费了我好几天的时间。我不再关心是否有一种特定的方法来编写(或修复)宏来实现我想要的。它们是显而易见的问题,值得明显的答案或信息。缺少它们将是错误的定义。
是的,您说得对,LaTeX3 项目有一个新的输出例程(如果我没记错的话是 xor)。浮动在概念上很难,因为在基于纸张的工作流程中,它们必须与其他填满页面的文本一起放在页面上。也就是说,您可以自由地做您在其他软件中会做的事情:手动定位(TeX 允许您这样做)。
是的,你是对的,明显的问题值得明显的答案,但此时你想要的是功能请求而不是错误修复,因为输出例程中的任何重大更改都会破坏向后兼容性。
最后,但并非最不重要的一点,我祝你好运。真的,我很想看到 TeX 的现代竞争对手,但到目前为止,还没有人想出任何真正可以与之竞争的东西。