在 HTML 中,在过去十年左右的时间里,人们强烈推动将内容结构和样式完全分离。现在大多数网站都是使用 HTML 来构建结构标记,使用 CSS 来呈现这些标记。这使得在同一内容上应用不同的样式变得非常容易:如果您不知道这有多强大,请参阅例如http://www.csszengarden.com/有一份 W3c 文档支持语义和表现标记的分离。
我对 LaTeX 还比较陌生,但我已经设计网站一段时间了。是的,它们是不同的领域,但它们试图做同样的事情:很好地呈现内容。过去 6 个月使用 LaTeX 的经验让我感觉,内容和样式分离的概念在 TeX 世界中并没有发挥太大作用。例如,在 HTML+CSS 中定义表格单元格的换行规则就像向单元格添加一个类并在 CSS 文档中添加一行一样简单。在 LaTeX 中,您需要执行类似这样的可怕事情。
那么,是我遗漏了什么,还是 LaTeX 遗漏了什么?LaTeX 的设计中是否使用了内容和样式分离的概念?它只是执行得不好吗?在未来的版本中(LaTeX3?ConTeXt?)它有可能得到更好的实现吗?
注意:我无意冒犯 LaTeX 开发人员:该系统确实很棒,原因还有很多。我只是看到了这个巨大的漏洞,却很少有人讨论它,我很好奇为什么。
答案1
历史
Knuth 在 20 世纪 70 年代末编写了 TeX,因为他想在当时知识和技术有限的情况下尽可能地排版材料。人们普遍认为他做得相当不错,但他肯定不是想将结构和风格分开。
Lamport 在 20 世纪 80 年代中期编写了 LaTeX,当时他认为有必要更明确地区分这两个领域。LaTeX 在 20 世纪 90 年代初进行了修订,当前的内核可追溯到 1994 年(当然,修复了一些错误)。这比 HTML + CSS 模型早了一段时间,而且技术限制也意味着当时不可能进一步复杂化 LaTeX。(1994 年,LaTeX 对许多 PC 来说都太大了,团队非常努力地将其压缩。)
在 HTML 世界中,可以添加新标签,但这些标签会被不认识它们的渲染器忽略。但 TeX 的情况并非如此:未知的控制序列是错误的。因此,我们不能只添加新概念,然后期望现有文档能够正常工作:这是真的很重要。所以 1994 年做出的决定对今天的 LaTeX 仍然具有重要意义。
ConTeXt 较新,与 LaTeX 相比,它确实将更多的设计“开箱即用”地分开。ConTeXt 还采用了与 LaTeX 不同的稳定性方法,其内核的开发前景更为积极。然而,ConTeXt 的方法在某些方面更像普通的 TeX,而不是 LaTeX,因为 ConTeXt 的设计比 LaTeX 更“贴近用户”。
输入和输出
在 HTML 世界中,文档被完全读入内存以构建用于渲染的 DOM。TeX 不是那样工作的,至少除非我们自己编写所有代码。相反,TeX 会读取一行并处理它,然后再转到下一行。(LuaTeX 可以改变这一点,但我认为即使在 ConTeXt 中,TeX 模型仍然是主要的。)因此,改变外观所需的方法非常不同。
思考这一领域时要牢记的关键一点是人们想要什么样的输出。在 TeX 世界中,我们专注于高质量的排版。因此,几乎总是需要对设计进行一些手动调整以反映内容的实际情况。这不是“写得好”的 HTML 中发生的事情,尽管它可以用 XML 来表达,但它肯定打破了严格的分离。我和其他人认为这不是坏事:你确实需要手动干预才能获得最佳结果。
表格
问题中特别提到了表格,我认为它们值得单独考虑。在 HTML 中,表格有多种用途。在 TeX 中,表格的处理方式要严格得多。表格是 TeX 世界中出了名的复杂,Knuth 确实指出,它们居然能发挥作用,真是太神奇了!在大多数排版文档中,表格主要用于“正式表格”,而且这些表格的“良好”外观范围相当有限。因此,没有必要提供全套类似 CSS 的控件。
正如 canaaerus 在他的回答中所说,TeX 世界不是由委员会管理的,而是没有人管理的,因此实现什么取决于个人用户的需求。目前有一系列适用于 LaTeX 的表格包,以及 ConTeXt 方法和\halign
纯 TeX 中的原始方法。然而,他们主要试图解决其他问题,这告诉你用户的优先级在哪里。
展望未来
作为 LaTeX3 项目的成员,我知道我们肯定在讨论如何更好地区分内容和设计。这里需要注意的一个问题是,HTML + CSS 模型并不总是能很好地转换成我们想要的排版内容。这两个领域之间存在一些显著的差异,这意味着事情永远不会那么简单。
任何更好的方法都必须与 TeX 兼容,无论是在代码方面还是在界面方面。我们有实验代码处理对象之间的关系('l3ldb'),加上设计“模板”,均位于此区域。
答案2
尽管这种内容和标记的分离对于 TeX 开发人员和用户来说并不陌生,但 TeX 和 HTML 以及它们的社区的工作方式之间存在一些根本差异。
HTML 本质上是集中组织的。有一个委员会(即 W3C)负责制定网络标准。然后,所有 HTML 文档的作者都必须按照这些标准编写,HTML 解释器(即大多数网络浏览器)的开发人员必须实现这些标准。
另一方面,对于 TeX 来说,情况就大不相同了。没有明确的标准。当然,大多数东西都是基于 Knuth 最初的 TeX。但也添加了很多东西。例如,现在有不同的宏包,ConTeXt 和 LaTeX。在那里,您可以很容易地看到,基本语法还没有固定下来。任何人都可以说他想使用/
宏而不是\
像 LaTeX 那样。此外,当今使用的大部分功能都是作为包添加的。它们使 TeX 具有极强的可扩展性。
这引出了技术层面的差异。TeX 是图灵完备的!而 HTML 只是一种标记语言。在 HTML 中,您可以指定文档的内容、结构和样式,而在 TeX 中,您可以编写构建文档的算法。
当然,在最简单的情况下,您不必使用复杂的编程结构,因此 TeX 文档看起来与用标记语言编写的文档没有什么不同。但我认为,就这类文档而言,内容和标记的分离在 TeX 中应用得非常好。
如果你看看这个例子您给出的正是文档不再具有标记的点。
答案3
LaTeX 的设计中是否也采用了内容和样式分离的理念?只是实施得不好吗?
它被使用,但不一定不好实施(请参阅其他答案以了解历史视角)。相反,它是在相当低级。
你能在 LaTeX 中,绝对要严格区分内容和样式(事实上我强烈建议这样做)。但要做到这一点,您需要利用 LaTeX 定义宏的功能。
LaTeX 有一个很少语义宏,如\chapter
和\emph
(当然还有更多)。文档类和包为您提供了更多选项。例如,KOMA 脚本类提供了大量宏来定制LaTeX 提供的语义宏的外观和感觉。
但在实践中,您需要哪种语义在很大程度上取决于您正在编写的文档类型。因此,有一些文档类,例如,scrlttr2
它们为写信这一特定任务提供语义宏,但这些是例外:LaTeX 并不提供大量高度特定领域的语义宏,而是提供了一种用于构建特定领域宏的语言。
最终,您的文档应该没有物理布局宏,并且仅使用语义宏。\textbf
? 不,使用描述宏为什么您想要粗体文本。
由于宏是特定于领域的,因此您需要的大多数宏可能都是您自己编写的。这就是为什么许多 LaTeX 软件包为您提供了使此过程尽可能简单的工具。例如,有些软件包可以自定义图形的显示(或创建自定义图形类型;请参阅caption
或float
);有些软件包有助于编写强大的宏(etoolbox
以及大多数 LaTeX3)。还有一些软件包适用于许多特殊用例,例如突出显示源代码。
有了这些,在大多数情况下,编写一组简单的语义宏并在整个文档中使用就相对简单了。不过,我的硕士论文的宏定义占了整个文档的六分之一左右(以 SLOC 格式,注释已删除)。
答案4
我完全同意结构和样式的分离是 LaTeX 和 ConTeXt 的基本优势之一。尽管如此,在实践中很难完全避免将它们混合在一起。事实证明,只有非常简单的文档才能将样式和内容完全分离。现实生活中,即使是一本中等大小的书,也几乎总是需要在最后一刻进行一些微调,而这实际上会破坏它们的分离。对于我这个出版商来说,实现 100% 分离的最实用的解决方案是始终将内容保存在定义文档结构的 xml 文件中,并将所有与样式相关的说明放在 ConTeXt 文件中。ConTeXt 恰好是一种非常实用的 xml 处理器。当然,您可以使用 XSLT 从 xml 中轻松创建 LaTeX 文件,并使用 LaTeX(如果您愿意)。在这种情况下,您应该将所有与样式相关的说明放在 xsl 文件中。