LaTeX 中内容结构和样式的分离?

LaTeX 中内容结构和样式的分离?

在 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 软件包为您提供了使此过程尽可能简单的工具。例如,有些软件包可以自定义图形的显示(或创建自定义图形类型;请参阅captionfloat);有些软件包有助于编写强大的宏(etoolbox以及大多数 LaTeX3)。还有一些软件包适用于许多特殊用例,例如突出显示源代码。

有了这些,在大多数情况下,编写一组简单的语义宏并在整个文档中使用就相对简单了。不过,我的硕士论文的宏定义占了整个文档的六分之一左右(以 SLOC 格式,注释已删除)。

答案4

我完全同意结构和样式的分离是 LaTeX 和 ConTeXt 的基本优势之一。尽管如此,在实践中很难完全避免将它们混合在一起。事实证明,只有非常简单的文档才能将样式和内容完全分离。现实生活中,即使是一本中等大小的书,也几乎总是需要在最后一刻进行一些微调,而这实际上会破坏它们的分离。对于我这个出版商来说,实现 100% 分离的最实用的解决方案是始终将内容保存在定义文档结构的 xml 文件中,并将所有与样式相关的说明放在 ConTeXt 文件中。ConTeXt 恰好是一种非常实用的 xml 处理器。当然,您可以使用 XSLT 从 xml 中轻松创建 LaTeX 文件,并使用 LaTeX(如果您愿意)。在这种情况下,您应该将所有与样式相关的说明放在 xsl 文件中。

相关内容