YODL 或另一种文档语言

作者:Karel Kubat

我在 1995 年末和 1996 年初编写了 YODL 的第一个版本,作为我个人使用的通用文档语言,当时名为 DOM,意为“文档维护器”。 我对当时使用的 SGML 转换器不满意,并想编写一个快速而简陋的程序,该程序可以读取文档并将其转换为 LaTeX(用于打印 PostScript)或 HTML。

不幸的是,一个快速而简陋的程序,就像回旋镖一样,往往会飞回你身边。当我开始使用 YODL 后,我告诉了我的同事们,他们立即准备好也使用它。很快我就在重写 YODL,实现新功能,为其他格式编写转换器并记录所有内容。 YODL 已经从一个私人程序发展成为我部门每个人都使用的文档语言。我认为 YODL 在当前的“beta”状态下已经可以面向世界了。在本文中,我想介绍一下 YODL,并告诉您为什么它是一个方便的程序。

获取和安装 YODL

YODL 的设计规范

首先,让我解释一下我在设计 YODL 时的目标。最重要的是,我希望 YODL 成为一种直观且易于使用的文档语言,不像许多常见的文档语言,如 LaTeX、HTML 和一些当前的 SGML 实现。

在这些语言中的每一种语言中,某些字符是特殊的。例如,在 LaTeX 中,您不能简单地输入 $%\* 并期望它出现在您的文本中。在 HTML 中,您必须输入 < 作为 < 才能生成 < 字符。在我的 SGML 版本中,您必须将 & 符号 (&) 输入为 &&ero;,具体取决于您是希望 & 符号出现在普通文本中还是列表中——这太糟糕了。另一方面,YODL 中的所有字符都以您输入的形式出现在输出中。我的想法是:直接输入,您输入的任何内容都会进入输出。 YODL 使用 字符转换表 来实现此类转换。例如,LaTeX 转换表指定输入中的 * 会导致输出中的 $*$。(您甚至可以创建一个字符转换表,声明 aa 应导致 bb,bb 导致 cc,依此类推;这可能会产生有趣的输出。)

“您输入的任何内容都会进入输出”当然是相对的。每种文档语言都必须提供一种在文本中放置命令的方法,以执行诸如更改字体、开始新章节等操作。在我看来,在 LaTeX、HTML 或 SGML 中键入命令很笨拙。例如,以粗体排版文本需要您输入 {\bf text}<strong>text</strong><bf>text</bf>。我不知道你怎么想,但我的手指总是在键入花括号、反斜杠以及小于号或大于号字符时卡住。如果您经常编程,您可能会同意键入括号更容易。因此,我选择在 YODL 语言中将命令定义为宏名称,后跟括号中的参数,如 bf(ext) 中所示。这种语法看起来像带有参数列表的 C 风格函数,但具有多个参数的宏将在单独的括号中包含每个参数。括号的另一个优点是,许多编辑器都具有“匹配模式”,该模式会突出显示这些字符对,从而使文本的键入更加容易。

至于文档语言的“实用性”,无论如何衡量,我认为这种语言必须至少支持章节的自动编号、文本中的标签以及对它们的引用,并且它必须创建目录。尊重应有的尊重:这些功能(以及更多功能)已在 LaTeX 中实现。因此,我选择让 YODL 在其他输出格式中“模拟”此功能。当 YODL 将文档转换为 HTML 时,它会创建一个可点击的目录并对其章节进行编号。

按照设计,YODL 包由一个能够处理简单命令的通用程序组成——这就是 yodl 程序。这个程序远不是一个真正的转换器,而只是一个第一阶段。裸 yodl 程序知道诸如 INCLUDEFILE(读取文件)、DEFINEMACRO(定义新宏)、IFDEF(用于条件执行)等命令。真正的转换器将 yodl 用于其第一阶段,但为给定格式提供宏文件和字符转换表。例如,将 YODL 文档转换为 LaTeX 的 yodl2tex 加载一个适当的宏文件,该文件指定 bf(text) 在 LaTeX 中是 {\bf text},而 $ 字符必须排版为 $\dollar$。某些转换器(如 HTML 转换器)需要后处理器来执行特定操作,例如,解析标签和引用以及创建可点击的目录。通常,用户不会意识到这些特殊性:简单的 shell 脚本(例如,yodl2htmlyodl2texyodl2txt)运行 yodl 程序,提供正确的宏文件,并在必要时启动后处理器。

我想提及的最后一个设计考虑因素是,在某些情况下,您 必须 在给定的输出语言(LaTeX、HTML 或任何其他语言)中使用命令来实现特殊目标。尽管 YODL 可以在不了解输出格式的情况下使用,但最终的文档语言绝不是隐藏的。宏包实现了命令 latexcommand(cmd)htmlcommand(cmd) 等,这些命令是隐藏的。宏包仅实现对其输出格式有效的命令。这意味着 YODL 的所有出色功能都可以用于“标准”事物,同时您始终可以退回到最终输出语言的特定命令以获得特殊功能。

使用 YODL

YODL 附带的宏包定义了四种主要类型的文档:文章、报告、书籍和手册页。 YODL 源文件必须始终提及正在处理的文档类型。文档类型之间的区别在于,每种文档类型都定义了不同的顶级分节命令(例如,文章没有章节,报告没有部分,而手册页有其自己的特定章节),以及 HTML 转换器如何将生成的 HTML 文件拆分为不同的子文件。 HTML 输出按章节拆分,这些章节通过可点击的目录和“下一章”链接到达。定义文档类型的语句还会设置文档标题、作者和日期。(如果您熟悉 LaTeX,那么所有这些都可能让您感到非常熟悉。是的,我承认我在任何地方都在“借用”。)

在声明文档类型之前,可以指定几个可选命令来更改文档的外观。示例包括 mailto,一个宏,用于设置 HTML 输出的默认电子邮件地址;或 htmlbodyopt,一个宏,用于定义前景色或背景色。因此,示例文档可以像这样开始

htmlbodyopt(fgcolor)(#0000B7)
mailto(karel@icce.rug.nl)
report(XWatch: Watcher of logfiles
        under an X session)
        (Karel Kubat)
        (1996)

这些语句之后是文档。报告分为章节,章节分为节,节分为小节等。当在分节命令之后使用标签时,可以引用这些标签。在 HTML 中,引用是可点击的链接

chapter(Introduction)
This is the introductory chapter. Specific
information about the installation is in
chapter ref(install).
chapter(Installation) label(install)
This chapter describes the installation in
detail.
作为用户定义宏的示例,请考虑以下内容。假设您想将 1/4 排版为此处所示,或作为分数,其中 1 在 4 的上方。此分数的布局将取决于输出格式,只有 LaTeX 支持后一种表示法。实现此目的的方法是定义一个新宏,例如 quart
DEFINEMACRO(quart)(0)(\
  latexcommand(\frac{1}{4})\
  txtcommand(1/4)\
  htmlcommand(1/4)\
  mancommand(1/4))
此语句定义了一个名为 quart 的宏,它没有参数。宏最多可以有三十五个参数。宏扩展为每种输出格式(LaTeX、HTML、man 或纯 ASCII)的命令——每次转换一个。现在,新命令可以像这样使用
a quart is quart() gallon
另请注意,反斜杠字符可用于将长行拆分为可读的源代码,就像在 shell 脚本编程中一样。这只是我认为方便并因此实现的另一个功能。

YODL 语言还有许多其他有用的宏——没有空间进行完整的枚举。但是,这里有一些只是为了好玩。您可以通过指定以下内容在文档中使用脚注

footnote(

根据输出格式,文本是真正的脚注,还是放置在正文中。类似地,宏

url(
在 HTML 文档中放置一个可点击的 URL,或在其他类型的输出中提及描述和位置。还有更多,包括 YODL 处理重音字符的方式。所有这些都可以在 YODL 存档附带的文档中找到。

YODL 的宏文件

YODL 仍然需要什么

正如我之前所说,我现在认为 YODL 处于 beta 状态,并且我已经将其发布给任何想要它的人。 Linux 社区最棒的事情之一是它是一个拥有数百万 beta 测试人员的池子。我希望 YODL 在未来几个月内继续发展。

在任何情况下,YODL 仍然需要的是通过 groff 路由到纯 ASCII 的完美转换器。我编写了两个转换器:一个接口到 man 格式,另一个接口到 ms 格式。这至少是一个良好的开端;尽管 manms 包可以做的不仅仅是我挑选出来的那些。此外,HTML 转换器仅支持“标准”HTML,没有花哨的功能,例如框架,尽管有一些基本的表格支持。当然,也欢迎转换为其他格式的转换器,例如转换为 texinfo 格式的转换器,用于创建 info 文件等。

总而言之,YODL 已经在我们部门证明了自己,我们软件随附的几乎所有文档现在都以 YODL 语言编写。我希望您不会觉得 YODL 值得一看,否则我将在接下来的几个月里忙于清空我的邮箱并改进 YODL 包。撇开玩笑,我希望这篇文章已经足够激起您的好奇心,让您尝试 YODL 并发现它的用处。

YODL or Yet Oneother Document Language
Karel Kubat 与他的家人、猫和 1967 年的沃尔沃 Amazon 住在荷兰北部。他是一位全职 Linux 狂热者,可以通过电子邮件 karel@icce.rug.nl 与他联系。
加载 Disqus 评论