翻译: GNU Texinfo 7.2

[ 最后修订与导出时间: 2026-03-01 19:04:28 +0800 ,总字数: 35056 ]

GNU Texinfo 手册 GNU Texinfo

Texinfo

本手册适用于 GNU Texinfo(版本 7.2,2024 年 12 月 20 日),这是一个文档系统,可以使用语义标记从单个源生成在线信息和打印手册。

Texinfo 复制许可条款

GNU Texinfo 是 自由软件 ,即任何人都可在特定条款下自由使用、自由再分发本软件。Texinfo 并非公有领域内容,其受版权保护且对分发行为设有相关限制,但这些限制的制定初衷,是保障所有遵守协作准则的使用者能行使合理的使用权利。本条款禁止的行为,是试图阻止他人进一步分享其从你处获取的任一版本的 Texinfo 软件。

具体而言,我们保障你享有以下权利:无偿分发与 Texinfo 相关的程序副本;获取相关程序的源代码,或在需要时能够获取该代码;修改这些程序,或在新的自由软件中使用其部分代码;同时你也有权知晓自身可行使上述所有权利。

为确保所有人都能享有上述权利,我们禁止你以任何方式剥夺他人的这些权利。例如,若你分发 Texinfo 相关程序的副本,必须将你所享有的全部权利一并赋予接收者;必须确保接收者同样能获取或有权获取该程序的源代码;同时必须向其告知所享有的各项权利。

此外,为保护本项目的权益,我们需让所有使用者知晓:与 Texinfo 相关的程序不提供任何担保。若此类程序经他人修改后进行传播,我们希望接收者能够明确知晓,其获取的程序并非由本项目原封分发的版本,从而避免他人修改引入的问题对本项目的声誉造成影响。

当前分发的 Texinfo 相关程序,其许可协议的具体条款均载明于随程序附带的《通用公共许可证》中。本手册的版权保护与使用条款遵循《GNU 自由文档许可证》(详见《GNU 自由文档许可证》章节)。

1. Texinfo 概述

Texinfo 是一套文档编制系统,仅需编写单个源文件,即可生成在线查阅文档与印刷版输出文档。这意味着你无需为每种输出格式单独撰写不同文档,只需完成一份文档的编写即可。

通过 Texinfo,你可借助 TeX 排版系统生成 PDF 格式的印刷版文档,文档可包含章节、小节、交叉引用和索引等内容。基于同一个 Texinfo 源文件,你还能生成适用于网页浏览器的 HTML 格式文档,生成可在 GNU Emacs 或其他 Info 阅读程序中使用的 Info 文件,同时也能生成 DocBook、EPUB 3 或 LaTeX 格式的文件。

Texinfo 源文件为纯文本文件,内容中穿插着 @-commands (以 @开头的指令),这些命令用于告知 Texinfo 处理程序执行对应的操作。Texinfo 的标记命令几乎完全具备语义化特性,也就是说,这些命令用于定义文档中文本的实际语义,而非单纯的外观格式排版指令。

GNU Emacs 中内置了专门的 Texinfo 模式,该模式提供了各类与 Texinfo 相关的功能(详见《使用 Texinfo 模式》章节)。

Texinfo 是专为编写软件说明文档和手册设计的工具。如果你想要为自己的程序编写优质手册,Texinfo 的诸多功能将为你简化编写工作。但需要注意的是,Texinfo 并非通用型排版程序,它几乎未提供任何用于控制最终排版效果的命令。因此,若你需要排版报纸、制作精美杂志广告,或遵循出版社严苛的格式排版要求,Texinfo 可能无法满足你的使用需求。

“Texinfo” 的拼写规范为:首字母 T 大写,其余字母均小写。该单词的第一个音节发音与 “speck”(/spek/)一致,而非 “hex”(/heks/)。这一特殊的发音方式源于 TeX 的发音规则。TeX 的发音需将末尾的 X 读作巴赫(Bach)姓氏中最后一个音的发音,TeX 中的字母 X 并非英语中常见的 “ex” 发音,实际对应希腊字母 χ(chi)的发音。

Texinfo 是 GNU 项目的官方文档格式。你可通过 GNU 文档网页获取更多相关信息,其中包括各类 GNU 软件包的使用手册

1.1. 问题反馈

我们欢迎大家针对 Texinfo 系统的任意方面提交问题反馈与改进建议,涵盖程序运行、文档内容、安装部署等相关问题。请将反馈内容发送至邮箱:bug-texinfo@gnu.org。你可通过 Texinfo 官方主页获取其最新版本,网址为:https://www.gnu.org/software/texinfo

提交问题反馈时,请提供足够信息,确保维护者能够复现相关问题。一般来说,需包含以下内容:

  • Texinfo 的版本号,以及涉事的程序和手册版本
  • 复现问题所需的所有输入文件内容
  • 涉事程序的具体运行步骤
  • 问题现象描述,以及所有错误输出的样本
  • 所用的硬件设备、操作系统名称及版本
  • 你认为有帮助的其他相关信息

若不确定某项信息是否需要提供,建议一并附上。提供的信息宁多勿少,避免遗漏关键内容。

务必附上能复现问题的实际输入文件,这一点至关重要。

若 GNU Emacs 中的 Info 阅读器出现问题,需向 Emacs 开发团队提交反馈,具体可参阅《GNU Emacs 手册》中的 “问题反馈” 章节。

我们同样欢迎大家提交程序补丁。若有相关提交,建议使用 'diff -c'、 'diff -u' (详见《文件的比较与合并》)或 'git diff' 命令生成补丁,并附上 ChangeLog 变更记录(详见《GNU 编码标准》中的 “变更日志” 章节),同时遵循项目现有的编码规范。

1.2. 输出格式

下文为 Texinfo 目前支持的输出格式总览。

Info
信息文档格式。 (通过 texi2any 生成)该格式基本是 Texinfo 源文件的纯文本转写形式,仅添加少量控制字符,为交叉引用、索引等功能提供导航信息。GNU Emacs 的信息文档子系统(参见《信息文档》)、独立的 info 程序(参见《GNU 信息文档程序》)等工具均可读取此类文件。相关详情参见《Info 文件》与《创建并安装 Info 文件》章节。
Plain text
纯文本格式。 (通过 texi2any --plaintext 生成)该格式与 Info 格式输出几乎一致,仅剔除了用于导航的控制字符。
HTML
超文本标记语言。 (通过 texi2any --html 生成)HTML 是超文本标记语言的缩写,为 World Wide Web万维网 文档的编写标准,可由网页浏览器在线渲染展示。HTML 拥有多个版本,既包含不同的官方标准,也存在各浏览器专属的扩展规范。 texi2any 工具仅使用该语言的通用子集,可被所有主流浏览器解析,且刻意避免使用大量较新或支持度较低的标签。因此其原生输出样式虽较为简洁,但可根据需求在多个层级进行自定义配置。相关详情参见《生成 HTML 文档》章节。
EPUB 3
电子出版格式。 (通过 texi2any --epub3 生成)EPUB 是专为便携式设备阅读电子书设计的格式,由 HTML 衍生而来。该格式最初由国际数字出版论坛(IDPF)开发,目前该组织已并入万维网联盟(W3C)。其最新主要修订版本 EPUB 3 于 2011 年发布。
DVI
设备无关格式。 (通过 texi2dvi 生成)设备无关二进制格式是 TeX 排版程序(官网:http://tug.org)的输出格式,需由 DVI 驱动程序解析后,转换为适配具体设备的显示或打印指令。常用的 DVI 驱动程序包括:将格式转换为 PostScript 格式的 Dvips(参见《Dvips 工具》)、用于 X 窗口系统显示的 Xdvi(下载地址:http://sourceforge.net/projects/xdvi/)。相关详情参见《使用 TeX 进行排版与打印》章节。(请注意:Texinfo 语言与 TeX 系列常用语言差异显著,包括纯 TeX、LaTeX、ConTeXt 等。)
PostScript
页面描述语言。 (通过 texi2dvi --ps 生成)PostScript 是一种页面描述语言,自 1985 年起被广泛应用,至今仍在使用。其基础介绍及更多相关参考可参见:https://en.wikipedia.org/wiki/PostScript。Texinfo 默认识别 dvips 程序,将 TeX 生成的 DVI 格式转换为 PostScript 格式。相关详情参见《Dvips 工具》章节。
PDF
便携式文档格式。 (通过 texi2dvi --pdftexi2pdf 生成)该格式由 Adobe 系统公司基于其早前的 PostScript 语言开发,专为便携式文档交换设计。该格式可精准还原文档的原始外观,包括字体、图形等元素,且支持任意比例缩放。其设计目标包括跨平台兼容、易于查看等;相关背景知识可参见:https://en.wikipedia.org/wiki/Portable_Document_Formathttp://tug.org/TUGboat/tb22-3/tb72beebe-pdf.pdf。Texinfo 默认使用 pdftex 程序(TeX 的扩展工具)生成 PDF 格式,工具详情参见:http://tug.org/applications/pdftex。相关使用方法参见《PDF 格式输出》章节。
LaTeX

拉泰赫格式。 (通过 texi2any --latex 生成)该格式是基于 TeX 构建的排版系统,最初由莱斯利・兰波特于 1984 年发布。LaTeX 在 TeX 的基础上扩充了大量定义,且拥有丰富的第三方扩展包,是学术文献领域的通用排版格式。目前 LaTeX 仍在持续开发更新,更多信息可参见其官方网站:https://www.latex-project.org/

LaTeX 格式的输出文件可进一步转换为 DVI、PostScript 或 PDF 格式。从理论上讲,相较于基于纯 TeX 实现的 Texinfo,LaTeX 格式支持更高程度的输出自定义配置。

DocBook
文本书籍格式。 (通过 texi2any --docbook 生成)该格式是基于 XML 的标记语言,主要用于编写技术文档,因此在整体框架上与 Texinfo 存在一定相似性。官方详情参见:http://www.docbook.org。目前已有多款将 DocBook 格式转换为 Texinfo 格式的工具,相关信息可参见 Texinfo 官方网页。
XML

可扩展标记语言。 (通过 texi2any --xml 生成)与上述所有输出格式不同, texi2any 生成的 XML 格式并非最终可使用的文档,而是 Texinfo 源文件的转写形式,无法直接通过网页浏览器或其他常规程序查看。

XML 是一种通用的语法规范,可适用于各类内容的标记(参考标准:http://www.w3.org/XML)。Texinfo 生成 XML 格式的核心目的,是为了通过各类 XML 工具进行后续的二次处理。其输出语法由 XML 文档类型定义(DTD)规范,相关定义文件 texinfo.dtd 已包含在 Texinfo 源程序发布包中。

Texinfo 源程序发布包中还包含一个实用脚本 txixml2texi ,可将 XML 格式反向转换为原始的 Texinfo 内容(Texinfo 宏定义与条件语句除外)。

1.3. 信息文件

如前文所述,Info 格式基本是 Texinfo 源文件的纯文本转写形式,仅添加少量控制字符用于分隔节点并提供导航信息,供 Info 阅读程序解析运行。

Info 文件几乎均由处理 Texinfo 源文档生成, texi2any (也称作 makeinfo )是将 Texinfo 文件转换为 Info 文件的核心命令,相关说明参见《texi2any:Texinfo 转换工具》章节。

通常情况下,用户会通过一个约定命名为 'Top' 的节点进入 Info 文件。该节点一般仅包含文件用途的简要说明,以及一个可访问文件其余内容的大型菜单。从该节点开始,你既可以按节点依次浏览整个文件,也可以直接跳转到主菜单中列出的指定节点,还可以检索索引菜单并直接定位到包含所需信息的节点。此外,使用独立的 Info 程序时,你还能在命令行中指定具体的菜单项(参见《Info 程序》章节)。

若你希望像阅读印刷版手册一样按顺序浏览 Info 文件,可反复按下空格键(SPC),也可使用 Info 高级命令 g * 调出整个文件的内容(参见《Info 程序中的高级命令》章节)。

info 目录下的 dir 文件 是整个 Info 系统的入口,通过该文件可访问完整 Info 系统中各文档的 'Top' 节点。

若你希望通过统一资源标识符(URI)引用 Info 文件,可使用以下示例中的非官方语法,该语法可在 Emacs/W3 等工具中正常使用:

info:emacs#Dissociated%20Press
info:///usr/info/emacs#Dissociated%20Press
info://localhost/usr/info/emacs#Dissociated%20Press

需要注意的是,info 程序本身并不支持解析任何形式的 URI。

1.4. 印刷书籍

Texinfo 文件可以被格式化并排版成印刷书籍或手册。要实现这一点,你需要使用 TeX—— 这是由斯坦福大学的高德纳(Donald Knuth)编写的一款专业排版程序,它并不包含在 Texinfo 发行包中。

Texinfo 提供了一个 texinfo.tex 文件,其中包含 TeX 在排版 Texinfo 文件时所需的定义。你可以从 Texinfo 官网获取最新版的 texinfo.tex:https://www.gnu.org/software/texinfo/

基于 Texinfo 制作的书籍与其他排版印刷品类似:可以包含标题页、版权页、目录、前言,以及章节、带编号或无编号的小节与子小节、页眉、交叉引用、脚注和索引等。

TeX 功能非常强大,特性极多。但由于 Texinfo 文件必须既能以 Info 形式在纯字符终端上展示信息,又能排版成印刷书籍,因此 Texinfo 所支持的格式化命令会受到一定限制。

有关使用 TeX 处理手册的更多信息,请参见《使用 TeX 进行格式化与印刷》。

1.5. 新增输出格式

前面几节介绍的输出格式已经能满足非常广泛的使用场景,但显然仍有扩展空间。

如果你是程序员,并希望通过为 Texinfo 实现更多输出格式来为 GNU 项目贡献代码,那将非常有价值。最实用的实现方式是为 texi2any 编写一个新的后端 —— 它是我们的 Texinfo 解析器参考实现,会将 Texinfo 输入转换成树形结构,你可以直接基于该结构进行格式转换。源码文件 tp/Texinfo/Convert/Converter.pm 中的文档是很好的起点(详见 Texinfo 模块文档中的 Texinfo::Convert::Converter)。参见:texi2any:Texinfo 翻译器

另一种可行的方式是使用 texi2any 输出的 Texinfo XML 作为输入。如上所述,这种 XML 基本完整表示了原输入内容,且不含 Texinfo 本身的语法与选项特性。

如果你仍然忍不住想直接编写一个读取 Texinfo 源码的新程序,我们再多提醒一句:请不要低估所需工作量。Texinfo 绝非易于正确解析的简单语言,且仍在持续开发中,这意味着你需要承担长期维护工作。建议你确保 texi2any 附带的语言测试用例在你的新程序中都能正确运行。

不时有人提议从 Texinfo 源码生成传统 Unix man 手册页。但由于 man 手册页有严格的约定格式,编写一份优质的 man 手册所需的源码,与用于编写优质用户教程 / 参考手册的典型 Texinfo 源码完全不同。这使得生成 man 手册与 Texinfo 的设计目标相冲突 ——Texinfo 的设计初衷就是 不必为不同输出格式用不同方式重复编写同一份文档 。你不如直接编写 man 手册。

作为支持 man 手册的替代方案,你可能会发现 help2man 工具很有用。它从程序的 '--help' 输出生成传统格式的 man 手册页。事实上,Texinfo 发行版中自带程序的 man 手册页就是用它生成的。这是由 Brendan O’Dea 开发的 GNU 软件,可从 http://www.gnu.org/software/help2man 获取。

1.6. 发展历史

理查德・M・斯托曼(Richard M. Stallman)发明了 Texinfo 格式,编写了最初的处理程序,并创建了本手册的 1.0 版。罗伯特・J・查塞尔(Robert J. Chassell)从 1.1 版开始,对手册进行了大量修订与扩充。布莱恩・福克斯(Brian Fox)负责 Texinfo 的独立发行版直至 3.8 版本。卡尔・贝里(Karl Berry)从 Texinfo 3.8(手册 2.22 版)开始继续维护,加文・史密斯(Gavin Smith)则从 Texinfo 6.0 起接手维护工作。

起源

理查德・斯托曼在 1975/1976 年的 Emacs 最初实现中,加入了一个名为 Info 的在线超文本帮助系统。几年前,他观看了道格拉斯・恩格尔巴特(Douglas Engelbart)的「NLS」超文本系统演示后深受启发。

另一方面,20 世纪 70 年代,卡内基梅隆大学(CMU)的布莱恩・里德(Brian Reid)开发了名为 Scribe 的程序与格式,用于标记文档以便打印输出。它和 Texinfo 一样,使用 @ 符号开头表示命令。更重要的是,Scribe 致力于描述文档内容而非排版样式,这一理念被 Texinfo 完全继承。

与此同时,麻省理工学院(MIT)的人员开发了另一种格式 Bolio。理查德・斯托曼(RMS)将 Bolio 改造为使用 TeX 作为排版语言,形成了 BoTeX。已知最早的 BoTeX 版本是 1984 年 10 月 31 日的 0.02 版。

BoTeX 仅能作为打印文档的标记语言,无法用于在线文档。RMS 将 BoTeX 与 Info 结合,创造了 Texinfo—— 一种既可在线阅读、也可打印成书的文本标记语言。

最初用于生成 Info 格式的转换器(主要由 RMS 与 Bob Chassell 完成)是用 Emacs Lisp 编写的,即 texinfo-format-buffer 等函数。20 世纪 90 年代初,Brian Fox(布莱恩・福克斯)用 C 语言重新实现了转换程序,即现在的 makeinfo ,同时也实现了独立的 info 阅读器。

用 Perl 重新实现

2012 年,C 语言版的 makeinfo 被一个 Perl 实现版本取代,该版本统称为 texi2any 。此版本支持与 texi2html 同等程度的输出定制能力。 texi2html 最初由 Lionel Cons 编写,后来由众多开发者共同完善。为让 texi2html 能替代 makeinfo 所需的大量新特性,由 Patrice Dumas 实现。 texi2any 的第一个从未发布的版本基于 texi2html 代码。

不过,该实现后来被废弃,转而使用当前程序(同样由 Patrice Dumas 编写),它会将 Texinfo 输入解析为树形结构再进行处理。它继承了 texi2html 的定制设计与其他特性(关于 texi2html 兼容性,详见 texi2html:texi2any 的前身)。但 texi2any 是完全重新实现:它为所有后端生成基于树结构的输入文档表示,供各后端使用。

这个新的 Perl 程序比旧的 C 程序慢很多。尽管自首次发布以来速度差距有所缩小,但可能永远无法完全匹敌。那我们为何还要切换?简而言之:我们希望并相信,当前程序会比之前 C 版的 makeinfo 更容易扩展,以支持不同输出样式、后端格式及各类定制。具体原因如下:

  • HTML 定制:多年来,许多 GNU 及其他自由软件项目都在顺畅使用 texi2html 的 HTML 定制功能。实际上当时已存在两套独立的 Texinfo 语言实现,保持同步十分困难。把 texi2html 中的 HTML 定制能力加入 C 程序工作量巨大。
  • Unicode 与多语言支持,尤其是东亚语言。当时若用 C 实现几乎等于重写整个程序。虽然后来解析器和部分转换后端改用 C 编写,但转换后端主体仍为 Perl,其内置了良好的多语言支持。
  • 新增后端: makeinfo 代码已变得十分复杂,新增后端极为繁琐,需要与现有后端进行复杂交互。相比之下,新实现提供清晰的树结构表示,供所有后端使用。用户已提出多种后端需求(LaTeX、最新 (X) HTML 等),此次改造让这些后端更易实现。
  • 降低贡献门槛:整体上,更清晰的结构、分离的解析器 / 后端设计,会让任何人都更容易阅读代码并参与贡献,带来显而易见的好处。尽管十年过去,社区贡献的后端仍未出现,但理论上这种结构更利于协作贡献。

texi2any 旨在成为参考实现,用于定义手册中未完全规范的语言细节。若无这样的参考实现,其他实现很可能出现或明显或细微的行为差异,进而导致 Texinfo 文档与特定处理器绑定。同时,为所有处理器提供一致的命令行选项也很重要。与 texi2any 同步开发了大量语言与处理器测试用例;我们鼓励所有打算编写 Texinfo 解析程序的人使用这些测试。

随着 texi2any 作为参考实现发布,C 语言版 makeinfotexi2html 的开发均已停止。今后,我们建议 Texinfo 文档作者仅使用 texi2any

2. 编写 Texinfo 文件

2.1. 通用语法规则

本节描述所有 Texinfo 文档通用的语法约定。

  • 除 ‘@’、‘{’ 和 ‘}’ 之外,所有可打印 ASCII 字符均可直接出现在 Texinfo 文件中,并表示自身。‘@’ 是转义字符,用于标记命令开头;‘{’ 和 ‘}’ 则用于包裹部分命令的参数。若要在文档中插入这些特殊字符,需在其前面加一个 ‘@’:即 ‘@@’、‘@{’ 和 ‘@}’。
  • 在 Texinfo 文件中,用于描述手册内容的命令均以 ‘@’ 开头,这类命令称为 ‘@-commands’。(Texinfo 中的 ‘@’ 作用与纯 TeX 中的 ‘\’ 相同。)

    根据功能与参数形式的不同,部分 @-commands 需要单独成行书写,部分可直接写在句子中。通用规则:如果命令嵌入在普通文本中,则需要用大括号包裹参数;如果命令单独成行,则通常不需要大括号。关于 Texinfo 命令语法的更多细节,参见 @-Command 语法

  • @-command 名称后的空格是可选的,即使存在通常也会被忽略。例外情况是空格具有实际意义的环境,例如 @example 环境。
  • Texinfo 支持英文及其他语言中常用的引号格式,详见插入引号
  • 连续三个连字符 --- 会生成长破折号(em dash),用于句子中的标点分隔。两个连字符 -- 生成中破折号(en dash),主要用于表示数值范围,例如 “6 月 25–26 日”。单个连字符 - 生成普通连字符,用于复合词。在 Info 格式屏幕显示时,三个连字符会被简化为两个,两个连字符会被简化为一个(注意不是传递性缩减)。当然,在 @code@example 等字面量环境中,源码中的任意数量连字符都会原样保留。
  • 空白符:Texinfo 文件是纯文本文件,每行以常规换行符(换行符)结束。Texinfo 处理器逐行读取输入。段落以空行或仅包含空格的行作为结束标志。文本中连续的多个空格通常等价于单个空格( verbatim 模式除外)。

换页符(CTRL-l)会结束当前未闭合的段落。其他换页符以及其他 ASCII 空白符(制表符、回车符)均按普通空格处理(尽管最终效果可能因输出格式而异)。因此,在文档中使用这类空白符意义不大。非 ASCII 空格(如 Unicode 全角空格等)完全不被识别为空白符,会被当作普通非空白字符处理。

但在 verbatim 模式下(例如代码示例中),制表符可以在输出中产生正确的排版效果。

2.2. 注释

你可以在 Texinfo 文件中使用 @comment 命令书写注释,该命令可简写为 @c 。这类注释是给阅读 Texinfo 源码的人看的。一行中跟在 @comment@c 之后的所有内容都属于注释;这一行的剩余部分 不会出现在最终输出内容中 。(准确地说: @c@comment 后面的字符不能是连字符或字母 / 数字,否则会被当作命令的一部分。)

通常,你可以在一行的中间使用 @comment@c ,只有该命令之后的文本不会被输出;但某些命令(如 @settitle )会处理整行内容。不能在这类命令开头的行内使用 @comment@c

在嵌套命令、复杂宏定义等场景下, @c@comment 在 TeX 处理时可能会引发错误。因此,你也可以使用 DEL 字符(十进制 ASCII 127,十六进制 0x7f,八进制 0177)作为真正的 TeX 注释符(在 TeX 内部为 catcode 14)。 DEL 字符之后该行的所有内容都会被忽略,并且会与下一行合并。

你还可以使用 @ignore@end ignore 命令让一大段文本被 Texinfo 处理器忽略。这两个命令都要 单独成行 ,并且从行首开始写。两个命令之间的文本不会出现在处理后的输出中。你可以用 @ignore … @end ignore 来书写多行注释。(关于此类命令嵌套的注意事项,参见「条件嵌套」。)

2.3. Texinfo 文件的必备内容

按照惯例,Texinfo 文件的文件名后缀为 .texi.texinfo.txi.tex 之一。不建议使用 .tex ,因为该后缀已被 TeX 和 LaTeX 输入文件占用。最常用且推荐的后缀是 .texi 。Texinfo 文件名应 只包含 ASCII 字符

默认情况下,输出文件名以输入文件名为基础生成:首先从输入文件名中去掉 .texi.tex 、=.txi= 或 .texinfo 后缀;然后加上对应输出格式的专属后缀 —— 生成 HTML 时为 .html ,生成 Info 时为 .info ,依此类推。输出文件名也应只包含 ASCII 字符1

若要生成可打印的手册,Texinfo 文件 必须 以如下一行开头:

\input texinfo

文件内容写在这一行之后,并且必须用如下一行结束 Texinfo 源码:

@bye

文件末尾单独一行的 @bye 用于告知 TeX 文件已结束,停止排版。如果省略这一行,程序运行结束后会停留在 TeX 的交互提示符界面。

此外,你通常还会为 Texinfo 文件配置标题、标题页、索引等内容,这些都在本手册中有详细说明。但对于简短文档而言, 最简结构 只需要开头一行和结尾一行即可。

若无额外指定,输入与输出编码默认采用 UTF-8,这是一种兼容 7 位 ASCII 的通用编码。

2.4. 简易示例

下面是一个简短的 Texinfo 示例文件。

\input texinfo
@settitle 示例手册 1.0

@copying
这是一个完整 Texinfo 文件的简短示例。

版权所有 @copyright{} 2016 Free Software Foundation, Inc.
@end copying

@titlepage
@title 示例标题
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage

@contents

@node Top
@top GNU 示例

本手册适用于 GNU Sample
(版本 @value{VERSION},@value{UPDATED})。

@menu
* 第一章::    第一章是本示例
              中唯一的一章。
* 索引::      完整索引。
@end menu


@node 第一章
@chapter 第一章

@cindex 章,第一章
这是第一章。
@cindex 索引项,另一个

下面是一个有序列表。

@enumerate
@item
这是第一项。

@item
这是第二项。
@end enumerate


@node 第一节
@section 第一节

第一章的第一节。


@node 第二节
@section 第二节

第一章的第二节。


@node 索引
@unnumbered 索引

@printindex cp

@bye

2.5. Texinfo 文件头

Texinfo 文件以这一行开头:

\input texinfo

'\input texinfo' 这一行告诉 TeX 使用 texinfo.tex 文件,该文件定义了如何将 Texinfo 的 @-commands 转换成 TeX 的排版命令。(注意这里使用的是反斜杠 \ ;对 TeX 来说这是正确写法。)

将所有影响 整篇文档格式 的命令放在文件头里是合理的。 @settitle 行通常出现在文件头的开头:

@settitle Sample Manual 1.0

@settitle 用于指定印刷版手册的页面页眉(或页脚)标题,以及 HTML 中 ‘<head>’ 部分的默认标题和文档描述。例如 @synindex (参见 @synindex:合并索引)也是常放在文件头中的命令。

Texinfo 文件中,直到输出为文档主体内容之前的部分,统称为 序言 (preamble)。它包含文件头、文档权限声明标题与版权页说明。这对 LaTeX 输出格式尤为重要,因为序言结束的位置会输出 \begin{document} 这一行。在其他输出格式中,序言可用于决定某些特殊内容的排版方式,例如:将 @copying(声明复制权限)的输出作为注释放在输出文件开头,或设置文件头中使用的语言。

2.5.1. Texinfo 文件的首行

所有作为 TeX 顶层输入的 Texinfo 文件,都必须以如下形式的一行开头:

\input texinfo

当文件被 TeX 处理时, ‘\input texinfo’ 命令会告知 TeX 加载处理 Texinfo 文件所需的宏。这些宏位于名为 texinfo.tex 的文件中,该文件应已随 TeX 或 Texinfo 软件一同安装在你的系统里。TeX 使用反斜杠 '\' 标记命令开头,就像 Texinfo 使用 ‘@’ 一样。texinfo.tex 负责将 '\' 切换为 ‘@’;在切换生效前,TeX 要求使用 '\',这就是它出现在文件开头的原因。

你可以选择在这一行后面加上注释,告诉 GNU Emacs 编辑此文件时使用 Texinfo 模式:

\input texinfo @c --texinfo--

当 Emacs 无法通过文件后缀自动识别文件类型时,这会很有用。

2.5.2. @setfilename: 设置输出文件名

@setfilename 行用于指定由 texi2any 生成的输出文件名称。该命令在 TeX 排版时会被忽略。如果使用该命令,它应当是第一个 Texinfo 命令(即位于 '\input texinfo' 之后)。请将 @setfilename 命令写在行首,并在同一行后跟 Info 文件名。

@setfilename info-file-name

该名称必须与 Texinfo 源文件名不同。命名有两种惯例:

  • 可以完全去掉输入文件的后缀(如 .texi );
  • (推荐)将其替换为 .info 后缀。不建议将 @setfilename 的名称设为与输入文件名完全无关。

如果存在 @setfilename 行,Texinfo 处理器会忽略该行 之前 的所有内容。这也是文件第一行( \input 行)不会出现在输出中的原因。

如果没有 @setfilename 行, texi2any 会根据输入文件名自动确定输出名称(参见 Texinfo 文件必须具备的内容)。此时 \input 行与开头的空行仍然会被忽略。

在生成其他输出格式时, texi2any 会将最后的后缀替换为对应格式的专属后缀(例如生成 HTML 时为 .html );如果指定名称没有后缀,则会直接添加 .后缀 (如 .html )。

@setfilename不允许 使用普通 @-commands ,例外只有 @@@{@} 以及类似 @atchar{} 这类转义相关命令。

@setfilename 曾经是 Texinfo 处理器和其他一些程序的必填项,现在已不再强制,可以省略。如果 Texinfo 输入来自标准输入、没有源文件名可用于推导基础文件名, @setfilename 仍然有用。但这不是唯一方式:也可以在 texi2any 命令行中使用 --output 选项指定输出文件名(参见从 Shell 调用 texi2any )。

尽管显式使用 '.info' 后缀更可取,但部分操作系统无法处理长文件名。即使你指定的文件名本身不长,也可能出现问题。这是因为 Info 格式化工具会将长 Info 文件拆分为多个间接子文件,并在原文件名后追加 ‘-1’、‘-2’……,‘-10’、‘-11’ 等编号。例如,在文件名长度限制为 14 个字符的旧系统上, texinfo.info-10 会过长;因此在这类系统上,该文档的 Info 文件名可以是 texinfo ,而不是 texinfo.info@setfilename 就是用来指定这种替代名称的

2.5.3. @settitle: 设置文档标题

Texinfo 文件应当包含如下一行:

@settitle title

请将 @settitle 命令写在行首,并在同一行紧跟标题内容。该行不要再写其他内容。 @settitle 命令应位于所有生成实际输出内容的命令之前。最佳位置是紧跟在 @setfilename 命令之后(如果有该命令,见上一节)。

该命令指定的标题,会用于双面印刷输出的页眉或页脚(如果启用了页眉页脚)。关于印刷输出页眉的更多信息,参见「页眉生成」。

在 HTML 中,该 title标题 会作为文档的 ‘<title>’ 标签内容,并成为 ‘<head>’ 部分默认的文档描述信息。

当输出中包含标题页时(印刷版输出通常如此), @settitle 中的标题 不会影响 标题页上显示的标题。因此两者不必完全一致。我们推荐的做法是:在 @settitle 的标题里包含手册的版本或版次号;而在标题页上,版本号通常以 @subtitle (副标题)形式出现,因此可以不写在 @title 中。参见 @titlepage

2.5.4. 序言

preamble序言区 从 Texinfo 文件的开头开始,一直延续到第一个直接输出内容之前。它通常包含文件头部(参见 Texinfo 文件头部)、声明文档授权信息的 @copying 块(参见 @copying:声明复制授权)以及 @titlepage 标题页定义(参见 标题与版权页)。

序言区可以包含影响 整个文档格式 、但本身不产生输出或不立即产生输出的命令,例如 @settitle (参见 @settitle:设置文档标题)、 @documentlanguage (参见 @documentlanguage ll [_cc]:设置文档语言)、设置页眉、控制缩进或断字的命令,以及目录相关命令(参见 生成目录)。

任何开启段落的文本、作为引用 / 表格 / 列表等格式的 @-commands@node (参见 节点)以及章节结构命令(参见 章节结构),都会 结束序言区

序言区的概念对 LaTeX 输出尤为重要,因为 \begin{document} 这一行会在序言区结束时输出。

在纯文本输出中,序言区会像文档开头一样正常输出;例如,序言区中的 @contents 会被输出为目录(参见 生成目录)。

HTML 和 Info 格式对序言区也没有太多特殊处理。不过, 序言区末尾生效的一些设置会作用于整个文档 ,不受后续内容影响。这适用于指定缩进或语言的命令(参见 @documentlanguage ll [_cc]:设置文档语言)。

例如,在下面这份文档中,HTML 和 Info 格式的版权注释会以 @documentlanguage 设置为 ‘pt’(葡萄牙语)的方式排版,因为这是序言区结束前最后一个 @documentlanguage 命令。

\input texinfo
@documentlanguage fr

@copying
The copying information @error{} some text
@end copying

@documentlanguage pt

Text ending the preamble

@documentlanguage de

@node Top

2.5.5. Emacs 专用文件头的起始与结束

在 Emacs 里,可以用 标题区起始行标题区结束行 ,把 Texinfo 序言中对整个文档生效的命令包裹起来。这样你就可以只对 Texinfo 文件的一部分进行 Info 格式转换或打印排版。详见《texinfo-format… 命令》。

标题区起始行 是一条 Texinfo 注释,写法如下:

@c %**start of header

请把这行写在 Texinfo 文件的 第二行 。在起始行之后,写上对整个文档格式生效的命令(如 @settitle@synindex@footnotestyle ),然后再写 标题区结束行

标题区结束行 同样是一条 Texinfo 注释,写法如下:

@c %**end of header

使用特殊字符串 ‘%**’,是为了避免把其他普通注释误判为标题区起始行。如果你需要,可以通过修改 Emacs 变量 tex-start-of-headertex-end-of-header 来自定义这串标记。详见《Texinfo 模式下的排版与打印》。

标题区起始行和结束行 不属于 Texinfo 格式标准 ,这也是它们用注释形式实现的原因。

2.6. 目录分类

使用 @dircategory 命令为手册指定一个类别。下面是一些类别名称示例:

Basics                         # 基础
Text creation and manipulation # 文本创建与处理
Archiving                      # 归档
Compression                    # 压缩
Database                       # 数据库
Editors                        # 编辑器
Emacs
Email                          # 电子邮件
Graphics                       # 图形
Localization                   # 本地化
Network applications           # 网络应用
Printing                       # 打印
Science                        # 科学
Software development           # 软件开发
Software libraries             # 软件库
Version control                # 版本控制

@dircategory 命令之后通常会紧跟 @direntry 块,供 install-info 工具使用。详情参见《安装 Info 目录文件》。

手册中第一个 @dircategory 命令作用于整个手册。后续出现的 @dircategory 仅对紧跟在它之后的 @direntry 块生效。

2.7. 文档权限

这部分用于描述文档,并包含 copyright notice版权声明copying permissions复制授权信息 ,通过 @copying 命令实现。一份正式的手册会根据其发布的许可证,在这里包含更多内容。

@copying
这是一个完整 Texinfo 文件的简短示例,版本 1.0。

Copyright @copyright{} 2016 Free Software Foundation, Inc.
@end copying

在 Texinfo 生成的各种输出格式中, copyright notice版权声明copying permissions复制授权信息 需要出现在多个位置。因此,Texinfo 提供了两个命令: @copying 用于 一次性声明 这段文本, @insertcopying 用于在合适的位置 插入 这段文本。

如果文档是软件手册,软件本身通常采用不同的许可证 —— 对于 GNU 及其他许多自由软件包,软件一般以 GNU GPL 发布,而手册以 GNU FDL 发布。注明手册所对应软件的许可证是有益的,但不一定需要附上软件许可证的完整文本。

2.7.1. @copying: 声明复制许可

@copying 命令应在文档最 开头 使用,建议放在文件头部信息之后(参见《Texinfo 文件头部》)。按照惯例,它通常包含:一两句话说明程序用途、文档自身标识、合法版权行、复制权限说明。下面是一个框架示例:

@copying
本手册适用于 program(version version,updated
date),该程序……

Copyright @copyright{} years copyright-owner.

@quotation
允许……
@end quotation
@end copying

@quotation 无法律意义,仅用于在部分场景中提升可读性。

@copying 中的内容会以注释形式出现在 Info 和 HTML 输出文件开头;在 DocBook 输出中,也会以合适的标记放在文件开头。 纯文本与打印格式不会自动输出 这段内容,你必须手动使用 @insertcopying 命令来显示版权与权限信息,详见下一节。

@copyright{} 命令在支持该字形的输出格式中(如打印、HTML)会生成带圈版权符号 ©;在不支持的格式中,则会生成三字符序列 ‘(C)’。

版权声明本身必须遵循以下法定格式:

Copyright © years copyright-owner.

即便文档使用其他语言,‘Copyright’ 一词也 必须 用英文书写,这是国际法要求。

years年份 列表应包含所有完成版本的年份(即使次年才发布)。最简单的写法是:每个年份完整写出,用逗号分隔。

copyright-owner版权所有者 是对该作品拥有合法版权的个人或机构。如果作品转让给 FSF,则所有者为:‘Free Software Foundation, Inc.’。

版权 “行” 在源文件和输出中都可以分多行,历史悠久、发布年份较多的文档常会这么做。如果分多行,源文件中不要对任何一行缩进(包括 @copying 块内的其他内容)。

更多信息参见:《GNU 维护者信息》中的版权声明、《GNU 示例文本》(GNU 手册可直接使用的完整文本)、《GNU 自由文档许可证》(GNU 及其他自由手册所遵循的协议)

2.7.2. @insertcopying: 插入许可说明文本

@insertcopying 命令只需单独写在一行即可,示例:

@insertcopying

该命令会插入之前由 @copying 定义的文本。为满足法律要求, 必须在印刷版手册的版权页中使用此命令 (参见版权页)。

@copying 命令本身会将权限文本以注释形式放在 Info 文件的第一个节点之前,并且会自动复制到每个拆分后的 Info 输出文件开头,这是法律必需的。这意味着使用 Info 阅读手册的用户 不会直接看到这段文字 (除非使用高级 Info 命令 g * )。从法律角度来说这没有问题,因为文本已经存在;但如果要让内容在输出中可见,就必须使用 @insertcopying

同理, @copying 中的文本会自动作为 HTML 注释放在每个 HTML 输出文件的开头。同样,不使用 @insertcopying 的话,这段内容不会在页面中显示(除非读者查看 HTML 源码)。

@copying 定义的权限文本也会通过合适的标记自动出现在 DocBook 输出文件的开头。 @insertcopying 可用于在普通正文内输出这段权限文本。

2.9. 生成目录

@chapter@section 及其他结构化命令(参见章节结构化)会提供用于生成目录的信息,但这些命令本身不会让手册中出现实际的目录。要生成目录,你必须使用 @contents@summarycontents 命令。

@contents
在打印版手册中生成完整目录,包含所有 chapters章节sections节subsections小节 等,以及附录和无编号章节。由 @majorheading@chapheading 及其他 @…heading 命令生成的标题不会出现在目录中(参见结构化命令类型)。
@shortcontents
@summarycontents

@summarycontents@shortcontents 的同义命令。)

生成简明目录或概要目录,仅列出 chapters章appendices附录unnumbered chapters无编号章节sections节subsections小节 与次次节均被省略。只有篇幅很长的手册,才需要在完整目录之外再附带一份简明目录。

这两个目录命令都应单独占一行,放在文件开头附近、 @end titlepage 之后(参见 @titlepage )、任何结构化命令之前。目录命令会在目录首页顶部自动生成类似章节的标题,因此无需在其前面添加 @unnumbered 等结构化命令。

由于 Info 文件使用菜单而非目录,Info 格式化命令会忽略目录命令。但目录会被包含在纯文本输出及其他输出格式(如 HTML)中。

在 HTML 输出中,简明目录里的链接指向完整目录中的对应条目,而非文档正文;完整目录中的链接则直接指向文档正文。

@shortcontents 暂不支持 LaTeX 输出格式。

2.10. ‘Top’ 节点与主菜单

‘Top’ 节点是读者进入 Info 手册时最先到达的节点。因此,它应当包含对本手册的极简短说明(含版本号)。‘Top’ 节点里的内容 不会 出现在打印版或 DocBook 输出中。

惯例写法是:在 @node Top 这一行后面,紧接着写一行 @top 命令,并在其中填入文档标题(参见 @top 章节结构化命令)。

我们可以重复 @copying 文本开头的简短说明,但不必重复版权信息,因此这里 不使用 @insertcopying

‘Top’ 节点中包含一个 top-level menu顶层菜单 ,列出所有章节;也可以包含一个 detailed menu详细主菜单 ,列出整个文档里的所有节点。

@node Top
@top Short Sample

This is a short sample Texinfo file.

@menu
* First Chapter::    The first chapter is the
                       only chapter in this sample.
* Index::            Complete index.
@end menu

2.10.1. 主菜单的组成部分

主菜单(master menu)是文档的顶层菜单。按照惯例,主菜单中会包含一份详细菜单,列出文档里的所有节点。和其他普通菜单一样,主菜单被包含在 @menu@end menu 之间,并且 不会 出现在打印版输出或 DocBook 输出中。

主菜单包含 Texinfo 文件中主要节点的条目:章节、类章节、附录对应的节点,随后是各类索引节点。

你可以在这些条目之后,再加入一份 detailed menu详细菜单 。详细菜单会列出其他更低层级的节点,通常按章节顺序排列。这些条目能方便查阅者直接跳转到特定节点,查找特定信息,而无需经过中间菜单。如果你在主菜单中使用详细菜单,需要用 @detailmenu … @end detailmenu 环境将其包裹。

菜单中的每一部分都可以用一行描述性文字开头。只要这一行不是以星号 * 开头,就不会被当作菜单条目处理。(更多信息参见「编写菜单」。)

例如,本手册的主菜单大致如下(实际条目会多得多):

@menu
* Copying Conditions::  Your rights.
* Overview::            Texinfo in brief.
...
* Command and Variable Index::
* General Index::

@detailmenu
--- The Detailed Node Listing ---

Overview of Texinfo

* Reporting Bugs:: ...
...

Beginning a Texinfo File

* Sample Beginning:: ...
...
@end detailmenu
@end menu

2.11. 文档正文

文档主体包含文档的全部文本。一本手册会被划分为一个或多个 nodes节点 (见节点)。下面的示例展示了一个由三个节点组成的章节:一个节点用于存放章节的引言内容,另外两个节点对应小节。引言部分中包含一个有序列表。

@node First Chapter
@chapter First Chapter

@cindex chapter, first
This is the first chapter.
@cindex index entry, another

Here is a numbered list.

@enumerate
@item
This is the first item.

@item
This is the second item.
@end enumerate


@node First Section
@section First Section

First section of first chapter.


@node Second Section
@section Second Section

Second section of first chapter.

在 Info 输出中,「First Chapter」节点会包含一个菜单,列出该章节下的两个小节。同样地,当该节点输出为独立的 HTML 文件时,文件中会包含本章的目录。

本章内容最终呈现效果如下:

1. First Chapter

This is the first chapter.

Here is a numbered list.

  1. This is the first item.
  2. This is the second item.

1.1 First Section

First section of first chapter.

1.2 Second Section

Second section of first chapter.

(在 Info 和 HTML 输出中,本章内容同样会按节点进行拆分。)

2.12. Texinfo 文件的结尾

Texinfo 文件的末尾应当包含用于生成索引的命令(参见《打印索引与菜单》),以及用于标记最后一行待处理内容的 @bye 命令。例如:

@node Index
@unnumbered Index

@printindex cp

@bye

@bye 命令会终止 Texinfo 的处理流程。它必须单独占一行。 @bye 之后的所有内容都会被完全忽略。

3. 节点

node节点 是一段以 @node 命令开始、直到下一个 @node 命令为止的文本区域。要定义一个节点,需在一行开头书写 @node 命令,其后跟上节点名称。Info 阅读器每次只显示一个节点,并提供命令让用户跳转到相关节点。HTML 输出也可采用类似的导航方式。

节点用作 cross-references交叉引用 的目标。交叉引用(如本句末尾的引用)通过 @xref 及相关命令创建;参见交叉引用。交叉引用可以散落在全文各处。其他 @-commands 也可以作为交叉引用的目标(参见 @anchor: 定义任意交叉引用目标;参见浮动元素)。

通常情况下,你应在每个章节结构化命令前紧接书写节点命令 —— 例如,在 @section@subsection 行之前。即使你不打算将文件生成 Info 格式,也应这样做。这是因为打印输出会在交叉引用中同时使用节点名和章节结构化名称。

唯一可以只使用章节结构化命令而不使用节点的场景是:你编写的文档 完全没有交叉引用 ,且 只用于打印 ,不会转换为 Info、HTML 或其他格式。

3.1. 编写 @node

在一行开头书写 @node ,后面跟上 node-name节点名称 ,如下所示:

@node node-name

插入 @node 行之后,应紧接着书写对应的章节或小节相关 @-command (如果有)并写上名称。

你可以在 @node 的节点名称参数之后, 在同一行的剩余位置最多再写三个可选参数 ,参数之间用逗号分隔。它们依次是: ‘Next’(下一个)、‘Previous’(上一个)、‘Up’(上级) 指针 的名称。因此,完整写出 ‘Next’、‘Previous’、‘Up’ 指针的节点行模板如下:

@node node-name, next, previous, up

node-name 参数必须存在,其他参数可选。如果你只想指定部分指针,只需按需保留逗号即可,例如: @node mynode,,,uppernode@node 行中每个名称前后的空格都会被忽略。但是,如果你的 Texinfo 文档是 层级结构 (几乎所有文档都是),我们建议 省略所有指针 ,让 texi2any 自动计算。

texi2any 工具会为层级结构的文档 自动生成节点指针 。要让它正常工作,每个 @node 命令后面应 紧跟 一个章节结构化命令(如 @chapter@section ),中间可以穿插注释行。最后,你必须在 Top 节点行后面,紧跟一行以 @top 开头的内容,用来标记文件的顶层节点。参见 @top 章节结构化命令

即使你显式指定了所有指针,也 不能 在 Texinfo 源文件中随意打乱节点顺序。节点必须按照你希望在输出中显示的顺序书写。虽然对 Info 格式来说顺序看似无关紧要,但对其他输出格式非常重要。

在大多数情况下,你应该利用 自动生成指针 的功能,不要重复书写程序可以自动确定的节点指针。不过,Texinfo 文档 不强制 必须是层级结构,甚至完全可以不包含章节结构化命令(例如你永远不打算打印该文档),因此在通用场景下,仍然可以显式指定节点指针。

如果你使用 GNU Emacs,并且希望显式写出指针,可以使用 Texinfo 模式提供的 更新节点命令 来自动插入指针名称。(参见:更新节点与菜单

你也可以手动填写 ‘Next’、‘Previous’、‘Up’ 指针。在 Emacs 中这样做时,使用 Texinfo 模式的快捷键 C-c C-c n 会很方便。该命令会插入 @node 和一行注释,按正确顺序列出指针名称,帮助你区分每个参数对应哪个指针。

3.2. 节点命名规则

节点名称用于标识节点。关于节点名称的全部细节,参见「 @node 行格式要求」。

以下是关于节点命名的建议:

  • 尽量选择 信息明确且简短 的节点名称。

    在 Info 文件中,文件名、节点名和指针名都会写在同一行,可能会超出窗口右边界(这对 Info 本身没有影响,但不够美观)。

  • 尽量让节点名称 开头部分就互不相同 。这样便于在 Info 中使用 自动补全 功能。
  • 按照惯例,节点名称的大小写规则与章节、小节标题一致。本手册中,首词和重要单词大写,其余小写;有些手册只大写首词和专有名词。两种方式均可,建议保持统一即可。
  • 在 HTML 输出中,节点名称里除了纯 ASCII 字母、数字和空格之外的字符,都会在文件名中被转换。(参见 HTML 交叉引用节点名扩展规则。)这会让手册页面的 URL 变得不友好;例如,本手册中的 @dots 节点会被生成为 __0040dots.html
  • 由于节点名会被用于 交叉引用 ,一旦文档发布后, 不建议 随意修改节点名。当你删除或重命名节点时,最好用旧名称定义一个 @anchor 。这样,来自其他手册、邮件归档等的引用就不会失效。参见 @anchor: 定义任意交叉引用目标

给定节点的指针用于跳转到其他节点,指针内容就是这些目标节点的名称。

通常:

  • 节点的 ‘Up’ 指针指向在其菜单中列出该节点的那个上级节点。
  • 节点的 ‘Next’ 指针指向同一菜单中当前节点的下一个节点。
  • 节点的 ‘Previous’ 指针指向同一菜单中当前节点的上一个节点。 如果一个节点的上一节点与上级节点是同一个,则两个指针指向同一节点。

通常,Texinfo 文件的第一个节点是 ‘Top’ 节点,它的 ‘Up’ 指针指向 dir 文件,该文件包含整个 Info 系统的主菜单。

3.3. @node 行的编写要求

@node 一起使用的名称有多项要求:

  • 同一个 Texinfo 文件中的所有 node names节点名称 必须唯一。

    例如,如果你每章末尾都有一个小结,必须给每个小结节点起不同的名字,不能都叫 “Summary”。但 chapters章节sections小节 等的标题可以重复。因此你可以每章都用一个名为 “Summary” 的小节,只要这些小节对应的节点名称各不相同即可。

    Node names节点名称anchor names锚点名称 (见 @anchor: 定义任意交叉引用目标)和 float labels浮动标签 (见 @float [type][,label]: 浮动内容)必须全部唯一。

  • 节点名称中可以包含 @-commands3。例如,在节点名中使用 @TeX{} 会输出 TeX 标志,和普通文本一样。交叉引用中也应使用和节点名中相同的 @TeX{}

    但有些命令不适合用在节点名里,比如环境命令(如 @quotation )、整行作为参数的命令(如 @sp )等。允许使用的命令完整列表,以及它们在 HTML 标识符和文件名中的展开规则,参见《HTML 交叉引用命令展开》。

  • 节点名称不能以形如 (内容) 这样左括号开头、右括号结尾,因为这种语法用于指定外部手册。
  • 不建议在节点名中可靠地使用句号、逗号或冒号,这些符号可能会让部分 Info 阅读器出错。 texi2any 默认会对有问题的节点名和标签进行转义,但部分 Info 阅读器不识别这种语法。转义会使名称周围出现 DEL 字符(‘CTRL-?’,字符码 127,常显示为 ^? )。若要关闭转义,可将自定义变量 INFO_SPECIAL_CHARS_QUOTE 设为 ‘0’(见 Info 与纯文本自定义变量)。

    texi2any 会对节点名、菜单项和交叉引用中的这类问题发出警告。若不想显示警告,可将自定义变量 INFO_SPECIAL_CHARS_WARNING 设为 ‘0’(见 Info 与纯文本自定义变量)。

    如果你坚持在节点名中使用这些特殊字符,为了不混淆 Texinfo 处理器,仍必须对其进行转义:使用专用插入命令(见@comma{} 插入逗号 ‘,’)或 @asis (见 @asis )。示例:

    @node foo@asis{::}bar@comma{} baz
    

    下面是一个避免使用特殊字符的示例,本手册中有这样一节标题:

    @section @code{@@unnumbered}, @code{@@appendix}: Chapters with...
    

    但对应的节点名会去掉逗号和小标题:

    @node @code{@@unnumbered @@appendix}
    
  • 节点名称区分大小写。
  • ‘@node’ 行中名称前后的空格会被忽略;名称内部的多个空白符会合并为一个空格。例如:

    @node foo bar
    @node  foo bar,
    @node foo bar ,
    @node foo  bar,
    @node  foo  bar ,
    

    这些写法都定义同一个节点,即 ‘foo bar’。在菜单项中,节点名称内部应当只使用一个空格,否则某些版本的 Info 阅读器将无法找到该节点。

3.4. 首个节点

Texinfo 文件的第一个节点是 Top 节点,被包含的子文件除外(参见「包含文件」)。Top 节点应当包含一段简短的摘要和一个主菜单。关于 Top 节点的内容与示例,详见「‘Top’ 节点与主菜单」。应避免在 Top 节点之前、不属于任何节点的纯文本内容。如果存在这类文本,在 DocBook 输出中不会被生成。

下面是 Top 节点中应使用的节点指针说明:

  • Top 节点(名称必须是 ‘top’ 或 ‘Top’)的 ‘Up’ 节点,应设为另一个文件中的某个节点名,该文件里有一个菜单能指向本文件。文件名写在括号内。

    通常,所有 Info 文件都通过一棵由多个目录构成的虚拟 Info 树提供访问。这种情况下,应使用 ‘(dir)’ 作为 Top 节点的上级;它指向 dir 文件中的顶层节点,该文件包含整个 Info 系统的主菜单。(每个存放 Info 文件的目录都应包含一个名为 dir 的文件。)

    这对 Info 格式没问题,但在 HTML 输出中,你可能希望 Top 节点的 Up 链接指向某个具体地址。例如,对 GNU 项目来说,合适的地址是 http://www.gnu.org/manual/(汇总大多数 GNU 手册链接的页面);如果手册部署在 www.gnu.org 上,写成 /manual/ 会更好。这可以通过自定义变量 TOP_NODE_UP_URL 来指定(参见「HTML 文件名与链接自定义」),例如:

    $ texi2any --html -c TOP_NODE_UP_URL=/manual/ ...
    
  • Top 节点的 ‘Prev’(上一节点)通常省略。
  • Top 节点的 ‘Next’(下一节点)应设为文档的第一章。

关于如何在 Info 目录中安装 Info 文件的更多信息,参见「安装 Info 文件」。

通常最好 完全不写指针 ,让工具自动隐式定义,最终只需这样写:

@node Top

3.5. @top 章节命令

@top 是一个专用的章节结构化命令,你 只能 在 Texinfo 文件开头的 @node Top 行之后使用。

它的输出效果与 @unnumbered 相同(参见 @unnumbered, @appendix: 其他标记类型的章节)。在 LaTeX 中会使用 \part*

提升或降低章节层级时, @top 会被忽略。也就是说,它永远不会被降级,也没有内容可以被提升到它这一级(参见提升/降低节: @raisesections@lowersections )。

过去的惯例是将 ‘Top’ 节点用 @ifnottex 条件命令包裹,使其不会出现在打印版输出中(参见条件可见文本)。因此,以前的 ‘Top’ 节点通常这样写:

@ifnottex
@node Top
@top your-manual-title

very-high-level-summary
@end ifnottex

现在这已经 不再需要 了,因为目前 ‘Top’ 节点 永远不会 在打印版中输出,在 DocBook 格式中也不会输出。

3.6. Texinfo 文档结构

节点可以包含 menus菜单 ,菜单里列出父节点下的 child nodes子节点 名称;例如,对应某一章的节点会包含该章下各小节的菜单。菜单让用户可以在 Info 输出中跳转到子节点。

此外,节点还包含指向其他节点的 node pointers节点指针 。‘Next’(下一)和 ‘Previous’(上一)指针将同一层级的节点连成一条链。顾名思义,‘Next’ 指向下一个节点,‘Previous’ 指向上一个节点。

一般来说,‘Next’ 和 ‘Previous’ 指向手册中 same hierarchical level同一层级 的节点,而不一定是 Texinfo 文件里物理上紧邻的下一个节点。在 Texinfo 文件中,紧跟在后面的节点往往是更低层级的节点 —— 例如,章节节点之后通常紧跟着小节节点。因此,同一章内所有同级小节节点会被链接在一起,链中的顺序与父章节菜单里子节点的顺序一致。每个子节点都会将父节点名称作为其 ‘Up’(上级)指针。

由于 ‘Top’ 节点是其所在层级的唯一节点,它的 ‘Next’ 指向紧随其后的第一个节点,这个节点几乎总是章节或同层级节点。这是 ‘Next’ 必须指向同层级节点规则的一个例外。

每个节点的 Info 和 HTML 输出都会包含指向 ‘Next’、‘Previous’、‘Up’ 节点的链接。HTML 输出还会分别使用 accesskey 属性,值为 ‘n’、‘p’、‘u’。这让浏览器用户可以使用快捷键(通常是 M-字母 )进行导航,例如在节点内任意位置按 M-n 跳转到 ‘Next’ 节点。节点指针与菜单为 Info 文件提供结构,就像 chapters章节sections小节subsections子小节 为打印书籍提供结构一样。这两种结构在理论上是独立的;但在实际使用中,打印书籍的树形结构几乎总是同时用作节点与菜单结构,这样文档更容易阅读。

通常, 章节结构与节点结构是完全平行的 :每一章、每一小节等都对应一个节点,并且节点的层级关系与章节结构完全一致。因此,如果一个节点是章节层级,它的子节点就是小节层级;同理,小节的子节点是子小节层级。

从技术上讲,是可以创建只包含其中一种结构、两种结构不平行,或其中某一种结构不符合常规的 Texinfo 文档的。但据我们所知,目前广泛使用的所有 Texinfo 手册都遵循这种常规的平行结构。

3.7. 节点与菜单示例

下图展示了一个包含三章的 Texinfo 文件,每章各包含两节。

图中 “root根节点” 位于顶部,“leaves叶子节点” 位于底部。这是此类结构图的常规绘制方式,呈现一棵倒置的树。正因如此,根节点被称为 ‘Top’(顶层)节点,而‘Up’(上级)节点指针会将你导向更靠近根节点的位置。

                         Top
                          |
        -------------------------------------
       |                  |                  |
    Chapter 1          Chapter 2          Chapter 3
       |                  |                  |
    --------           --------           --------
   |        |         |        |         |        |
Section  Section   Section  Section   Section  Section
  1.1      1.2       2.1      2.2       3.1      3.2

若使用显式指针(不推荐如此编写,此处仅作示例),用于开启第 2 章的完整命令如下:

@node     Chapter 2,  Chapter 3, Chapter 1, Top
@comment  node-name,  next,      previous,  up

该行 @node 指令表明:当前节点名为 “Chapter 2”, ‘Next’(下一个)节点为 “Chapter 3”,‘Previous’(上一个)节点为 “Chapter 1”,‘Up’(上级)节点为 “Top”。如果文档按层级结构组织,你可以(且应当)省略这些节点名称,但指针关联关系依然生效。

要在 Info 中跳转到 2.1 节和 2.2 节,需要在第 2 章内部定义菜单(详见菜单相关说明)。你应在 2.1 节开头前编写菜单,示例如下:

@menu
* Sect. 2.1::    本节描述。
* Sect. 2.2::    描述。
@end menu

2.1 节节点的自动指针对应写法:

@node     Sect. 2.1, Sect. 2.2, ,         Chapter 2
@comment  node-name, next,      previous, up

注意:此处不会生成 ‘Prev’(上一个)指针,因为在 2.1 节之前,同一层级不存在其他节点。

若使用显式指针,2.1 节节点可写作:

@node     Sect. 2.1, Sect. 2.2, Chapter 2, Chapter 2
@comment  node-name, next,      previous,  up

在自动指针模式下,节点的 ‘Next’ 和 ‘Previous’ 指针会指向 同一层级 的其他节点(章与章、节与节之间)。如示例所示,使用显式指针时,指针也可指向其他位置 —— 本例中 ‘Previous’ 指针即指向上级。‘Up’ 指针通常指向上一层级节点(更靠近 ‘Top’ 节点);‘Menu’(菜单)则指向下一层级节点(更靠近叶节点)。( cross-reference交叉引用 可指向任意层级节点,详见交叉引用相关说明。)

从技术上讲,显式节点指针可跳转到任意节点,不受文档结构限制,甚至可跳转到其他 Info 文件中的节点。但如果 ‘Next’、‘Previous’、‘Up’ 指针指向的节点与逻辑上的下一个、上一个、上级节点不对应,会给读者带来极大困惑。

按照惯例, @node 指令与章节结构化指令会按此顺序配合使用,其后常紧跟索引指令。(如上例所示,可在 @node 行后添加注释行,用于标注显式指针各自的含义。)Texinfo 处理器会通过这一结构,识别节点与分节指令之间的关联关系。

下面是本手册中 “结束 Texinfo 文件” 一章的开头部分,展示了 @node 行、 @chapter 行与索引行的连用格式:

@node Ending a File
@chapter Ending a Texinfo File
@cindex Ending a Texinfo file
@cindex Texinfo file ending
@cindex File ending

3.8. 节点描述

你可以在 @node 行之后使用 @nodedescription 命令,为节点的用途提供一段简短描述。这类描述可用于对节点名称本身的信息进行补充或扩展。

你也可以使用 @nodedescriptionblock 环境来编写节点描述,这对于篇幅较长的描述会更方便。

texi2any 工具在为 Info 格式(以及可选的 HTML 格式)输出菜单时,会使用你通过这些命令提供的内容。如果 texi2any自动生成菜单 ,或者在显式的 @menu 块中没有为菜单项提供描述,它就会使用节点对应的这段描述。(见「菜单」章节)

以下是这些命令的使用示例:

@node Tools
@chapter 工具

本章介绍你可以使用的各种工具。

@node Screwdrivers
@nodedescription 一字头与十字头螺丝刀。
@section 螺丝刀

本节介绍螺丝刀。

@node Drills
@nodedescriptionblock
使用电动螺丝刀、手电钻、组合电钻、冲击起子、锤钻、破碎机和拆除钻在物体上打孔。
@end nodedescriptionblock
@section 电钻

本节介绍电钻。

在 Info 输出中, texi2any 会为 ‘Tools’节点生成如下菜单:

* Menu:

* 螺丝刀::            一字头与十字头螺丝刀。
* 电钻::              使用电动螺丝刀、手电钻、组合电钻、冲击起子、
                      锤钻、破碎机和拆除钻在物体上打孔。

Menus菜单 包含指向 子节点 的指针。在 Info 输出中,你通过菜单跳转到这些子节点。 texi2any 可以在 HTML 输出中生成菜单,但默认不开启(详见《HTML 输出结构定制》, FORMAT_MENU )。菜单在印刷版手册或其他输出格式中不起作用。

当节点后跟随分节指令、未使用显式的 @menu 块、且使用自动指针时, texi2any 在输出 Info 或带菜单的 HTML 时会 自动生成菜单

通常让 texi2any 自动生成菜单会更方便,这样在你添加、删除或移动节点时,就不需要手动维护 Texinfo 源码中的菜单块。对于常见的、按层级组织的手册(节点对应分节指令、且省略节点指针),只有当你需要精确控制 Info 中菜单的内容与格式时,才需要手动编写菜单。

3.9.1. 编写菜单

菜单由单独一行的 @menu 命令开始,其后跟随菜单项行或菜单注释行,最后以单独一行的 @end menu 命令结束。

菜单的写法如下所示:

@menu
更大的文本单元

* Files::                       全部关于文件处理。
* 多缓冲区: Buffers.           多个缓冲区;同时编辑
                                多个文件。
@end menu

在菜单中,所有以 '*' 开头的行都是 menu entry菜单项 (注意星号后面有一个空格)。

菜单中也可以出现不以 '*' 开头的行,这类行不属于菜单项,而是会显示在 Info 文件中的 menu comment line菜单注释行 。上面示例中的 ‘更大的文本单元’ 就是一条菜单注释行;以 '*' 开头的两行则是菜单项。

从技术上讲,菜单可以跳转到任意节点,不受文档结构限制,甚至可以跳转到其他 Info 文件中的节点。但是, texi2any 的隐式指针生成功能(见《编写 @node》)与 GNU Emacs Texinfo 模式的更新命令,仅用于在 层级结构文档 中生成子节点菜单。在层级结构的文档中,若要引用任意节点,使用 交叉引用 会好得多。

在 Info 中,用户通过 m (Info-menu) 命令选择节点,菜单项名称就是用户在 m 命令后需要输入的内容。在 HTML 输出中,前九个菜单项会分别使用值为 ‘1’…‘9’ 的 accesskey 属性。这使得浏览器用户可以通过(通常是) M-数字 快速访问前几个菜单项,例如按 M-1 跳转到第一项。

在 Texinfo 中,菜单的写法如下:

@menu
* 菜单项名称: 节点名称.   简短描述。
* 节点名称::               推荐使用这种形式。
@end menu

这会生成:

* Menu:

* 菜单项名称: 节点名称.   简短描述。
* 节点名称::               推荐使用这种形式。

下面是你可能在 Texinfo 文件中见到的实例:

@menu
更大的文本单元

* Files::                   全部关于文件处理。
* 多缓冲区: Buffers.       多个缓冲区;同时编辑
                            多个文件。
@end menu

这会生成:

* Menu:
更大的文本单元

* Files::                   全部关于文件处理。
* 多缓冲区: Buffers.       多个缓冲区;同时编辑
                            多个文件。

在这个示例中,菜单包含两个条目。‘Files’(文件)既是菜单项名称,也是该条目指向的节点名称。‘Multiples’(多缓冲区)是菜单项名称;它指向名为 ‘Buffers’(缓冲区)的节点。‘Larger Units of Text’(更大的文本单元)这一行是注释;它会显示在菜单里,但不是有效条目。

由于 ‘Files’ 和 ‘Buffers’ 都没有指定文件名,因此它们必须是同一 Info 文件内的节点名称(参见「引用其他 Info 文件」)。

一个节点中 最多只能有一个菜单 。按照惯例,菜单应放在 节点的末尾 ,在 @end menu 与下一个节点的开始之间, 不能包含 任何普通文本或额外命令。

这一惯例很实用,因为使用菜单的读者很容易错过菜单之后的文本。此外,在 Info 输出中(菜单没有专门的结束标记),任何位于菜单之后的文本都会被当作菜单的一部分。这样一来,以 '*' 开头的行就很可能被错误解析。

通常,包含菜单的节点最好不要有太多文本。如果你发现菜单前有大量文字,我们一般建议将除一两段之外的内容全部移到新的子节点中。否则,读者很容易忽略菜单。

一个菜单项由三部分组成,其中 只有第二部分是必需的

  • 菜单项名称(可选)
  • 节点名称(必需)
  • 项目描述(可选)

通用菜单项的模板如下(更多写法见下一节):

* menu-entry-name: node-name.   description

在菜单项名称后加 单个冒号 ,在节点名后可以用制表符、逗号、换行,或两个字符 句号 + 空格 (‘. ’)。

菜单项的第三部分是描述性短语或句子。菜单项名和节点名通常较短;描述用于向读者说明该节点的内容。一段好的描述是 补充 节点名,而不是重复节点名。描述是可选的,可以 跨多行

  • 有的作者喜欢缩进第二行
  • 有的喜欢与第一行对齐。这由你自己决定。空行或下一个菜单项,表示描述结束。

菜单中的空格在 Info 输出中会 原样保留 ,因此你可以按自己的喜好排版菜单。但请注意:输入节点名时 不能多加空格 ,否则某些版本的 Info 阅读器会找不到节点(参见 @node 行要求)。

当菜单项文本(以及节点名、交叉引用)包含可能影响 Info 解析的问题结构时, texi2any 会发出警告并保护这些名称。详见《Info 节点名约束》。

3.9.5. 简洁化菜单项

菜单项名称节点名称 相同时,你可以在行首的星号和空格后直接写名称,并在名称后面跟 两个冒号

例如,写成:

* Name::                        description

而不是:

* Name: Name.                   description

我们建议尽可能使用节点名作为菜单项名,因为这样可以减少菜单里的视觉冗余,看起来更清爽。

3.9.6. 引用其他 Info 文件

你可以创建一个菜单项,让 Info 阅读器的用户跳转到 另一个 Info 文件 中的节点,方法是在 节点名称前用括号写上文件名 。示例如下:

@menu
* first-entry-name:(filename)nodename.     description
* (filename)second-node::                  description
@end menu

例如,要直接引用 Emacs 手册中的 ‘Outlining’ 和 ‘Rebinding’ 节点,可以这样写菜单:

@menu
* Outlining: (emacs)Outline Mode. 用于编辑大纲的主模式。
* (emacs)Rebinding::              如何重新定义按键含义。
@end menu

如果你 只写文件名、不写节点名 ,Info 会默认你指向的是该文件的 Top(顶层) 节点。示例:

* Info: (info).         文档浏览系统。
* (emacs)::             可扩展、自文档化的
                        文本编辑器。

GNU Emacs Texinfo 模式的菜单更新命令 只对当前缓冲区中的节点生效 ,因此不能用它自动生成引用其他文件的菜单。这类菜单 必须手动编写 。详见《更新节点与菜单》。

4. 章节结构

Texinfo 的 chapter structuring章节结构化 命令可将文档划分为 chapters章sections节subsections子节subsubsections子子节 的层级结构。这些命令会在文本中生成大号标题,正如上方所示。它们还会为生成目录提供信息(见「生成目录」)。

通常情况下,你需要在每一个章节结构化命令之前紧跟一个 @node 命令。参见「节点」。

4.1. 节的树形结构

一个 Texinfo 文件通常像书籍一样被组织为 chapters章sections节subsections子节 等层级。这种结构可以可视化为一棵树(更准确地说是一棵 倒置的树 ):根在顶部,各个层级分别对应章、节、子节、子子节。

下图展示了一个包含三章、每章各含两节的 Texinfo 文件结构:

                         Top
                          |
        -------------------------------------
       |                  |                  |
    Chapter 1          Chapter 2          Chapter 3
       |                  |                  |
    --------           --------           --------
   |        |         |        |         |        |
Section  Section   Section  Section   Section  Section
  1.1      1.2       2.1      2.2       3.1      3.2

在具有这种结构的 Texinfo 文件中,第 2 章的开头写法如下:

@node    Chapter 2
@chapter Chapter 2

为便于举例,下面是 使用显式节点指针 时的写法:

@node    Chapter 2,  Chapter 3, Chapter 1, Top
@chapter Chapter 2

章节结构化命令将在后续小节中介绍; @node 命令已在前一章说明(见节点)。

4.2. 结构命令的类型

章节结构化命令分为四组,每组都包含对应 chapters章sections节subsections子节subsubsections子子节 层级的结构化命令:

  • @chapter 命令与类 @appendix 命令:在文档正文和目录中均生成带编号或字母标识的条目。
  • @unnumbered 命令:在文档正文和目录中均生成无编号的条目。 @top 命令属于本组,有特殊用途(参见 @top 分节命令)。无编号节是文档结构的正常组成部分。
  • @heading 命令:生成简单的无编号标题,不出现在目录中,不与节点关联,也无法被交叉引用。这类标题命令不会另起一页。

在印刷版输出中,章节结构化命令会在文档中生成标题。如果使用了 @setchapternewpage 命令, @chapter@unnumbered@appendix 命令会在印刷手册中另起一页;而 @heading 类命令则不会。参见 @setchapternewpage: 章节前的空白页

在 Info 和纯文本输出中,这类命令会让标题单独占一行,并在下方用一行 ASCII 字符(‘*’、‘=’ 等)下划线。例如:

5 Chapter Structuring
*********************

同一层级的所有命令使用相同的下划线字符。例如,章级命令 @chapter@appendix@unnumbered@chapheading 使用相同的下划线。

在 HTML 中,章级命令默认生成 <h2> 级标题(可通过 CHAPTER_HEADER_LEVEL 自定义变量控制,参见特定输出的 HTML 自定义)。其他层级命令对应的标题元素级别也会相应调整。

在 DocBook 输出中,会使用对应层级的元素。生成的元素会包含其后所有同级或更高级别命令之前的所有节。例如, @chapter 会生成 <chapter> 元素,并包含该章内所有节与子节。

下表为汇总:

                                                          No new page
Numbered        Unnumbered            Lettered/numbered   Unnumbered
In contents     In contents           In contents         Not in contents
                @top                                      @majorheading
@chapter        @unnumbered           @appendix           @chapheading
@section        @unnumberedsec        @appendixsec        @heading
@subsection     @unnumberedsubsec     @appendixsubsec     @subheading
@subsubsection  @unnumberedsubsubsec  @appendixsubsubsec  @subsubheading

4.3. @chapter: 章节结构定义

@chapter 用于标识文档中的 章节 —— 它是常规文档结构层级中的最高级别。将该命令写在行首,并在同一行后跟章节标题。章节会 自动编号 ,从 1 开始。

例如,本手册当前这一章的标题为 “Chapter Structuring”(章节结构化),对应的 @chapter 行如下所示

@chapter Chapter Structuring

4.4. @unnumbered, @appendix: 特殊标记的章节(无编号 / 附录)

使用 @unnumbered 命令开始一个 章级元素 ,使其显示时不带任何形式的章节编号。使用 @appendix 命令开始一个附录,附录以字母(‘A’、‘B’……)而非数字标识;附录同样属于章级结构。

@chapter 一样,将 @appendix@unnumbered 命令写在行首,并在同一行跟上标题。

Texinfo 还提供了一个 @centerchap 命令,用法与 @unnumbered 类似,但会在印刷版和 HTML 输出中将参数 居中显示 。Texinfo 通常不提供这类排版选择, 建议不要使用该命令 ,因为它可能在后续版本中被移除。

对于 @unnumbered ,如果其关联节点的名称是以下英文单词之一(不区分大小写):

Acknowledgements  Colophon  Dedication  Preface
致谢、出版声明、献词、前言

则 DocBook 输出会使用对应的专用标签(如 <preface> ),而非默认的 <chapter>@unnumbered 自身的参数可以是任意内容,并会照常作为元素标题输出。

4.5. @majorheading, @chapheading: 章节级标题

@majorheading@chapheading 命令会在文档正文中生成 类似章节的标题

但是,这两个命令 都不会在目录中生成条目 ,并且都不会让 TeX 在印刷版手册中另起新页。

在 TeX 中, @majorheading 命令在标题前生成的垂直空白比 @chapheading 更大,除此之外两者效果相同。

在其他输出格式中, @majorheading@chapheading 生成的效果与 @chapter 类似。区别在于它们 没有编号 ,也 不与节点关联 。参见 @chapter: 章节结构化

4.6. @section: 章节下的节

@section 命令用于标识 section within a chapter unit章内部的节 ,无论该章是由 @chapter@unnumbered 还是 @appendix 创建,都会遵循对应章级命令的编号规则。因此:

  • 在编号为「1」的 @chapter 章节中, sections节 会编号为「1.1」「1.2」等;
  • 在标识为「A」的 @appendix 附录章中, sections节 会编号为「A.1」「A.2」等;
  • 在 @unnumbered 无编号章中, sections节 不会编号

创建 section节 的方式:将 @section 命令写在行首,并在同一行后面写上节的标题。例如:

@section This is a section

节标题会出现在目录中。

4.7. @unnumberedsec, @appendixsec, @heading: 无编号小节 / 附录小节 / 普通标题

@unnumberedsec@appendixsec@heading 命令分别是 @section 命令对应的无编号版、附录版、标题版(见上一节)。

在普通情况下,并不需要使用 @unnumberedsec@appendixsec ,因为在 @unnumbered@appendix 章节内部,直接使用 @section 即可;同样可参见上一节。

@unnumberedsec
@unnumberedsec 命令可用于无编号章节、普通章节或附录内部,用来生成 无编号的节
@appendixsec
@appendixsection

@appendixsection@appendixsec 命令的完整拼写形式,二者是 同义词

按照惯例, @appendixsec@appendixsection 命令只在附录内部使用。

@heading
你几乎可以在任何位置使用 @heading 命令,生成节级别的标题,且不会出现在目录中。 @heading 系列命令可以出现在大多数环境内部,但不允许放在另一个命令的参数中等无效位置。

4.8. @subsection: 节之下的子节

subsections子节sections节 的关系,就如同 sections节chapters章 的关系(参见 @section: 章节之下的节)。示例:

@subsection This is a subsection

子节标题会被列入目录。

4.9. @subsection 命令

@unnumberedsubsec@appendixsubsec@subheading 命令分别是 @subsection 命令对应的无编号版、附录版、标题版。(参见 @subsection: 节之下的子节。)

在普通情况下,并不需要使用 @unnumberedsubsec@appendixsubsec ,因为在 @unnumbered@appendix 章节的节内部,直接使用 @subsection 即可。(参见 @section: 章节之下的节。)

@subheading 命令生成类似子节的标题,但 不带编号,且不出现在目录中

同样地, @unnumberedsubsec 生成无编号的子节式标题, @appendixsubsec 生成带字母与数字编号的子节式标题;这两个命令生成的标题都会出现在目录中。

4.10. @subsubsection 及其他三级子子节命令

Texinfo 中第四级、也是最低一级的分节命令是 ‘subsub’ 系列命令。它们包括:

@subsubsection
子子节与子节的关系,如同子节与节的关系。(参见 @subsection: 节之下的子节。)子子节标题会出现在目录中。
@unnumberedsubsubsec
无编号子子节的标题会出现在目录中,但不带编号。除此之外,与普通子子节相同。
@appendixsubsubsec
按照惯例,附录系列命令仅用于附录中,并会自动使用合适的字母与数字编号。它们也会出现在目录中。
@subsubheading
@subsubheading 命令可用于任何需要一个小型标题、且该标题 不出现在目录中 的位置。

与子节的用法一样,通常情况下不需要使用 @unnumberedsubsubsec@appendixsubsubsec ,因为在无编号章节和附录章节的子节内部,直接使用 @subsubsection 即可。(参见 @section: 章节之下的节。)

4.11. @part: 章的分组

最后一个分节命令是 @part ,用于标记手册中的 part部分 ,也就是一组章节或(较少见的)附录。它的行为与其他分节命令差异很大,以适配书籍中 “parts”(部分) 的常规用法。

@part 不与 @node 命令关联。只需在文档中需要标记该部分开始的位置,将命令单独写在一行,并带上部分标题即可。例如:

@part Part I:@* The beginning

从示例可以看出, @part 的内容 不会自动编号或标注 ,文本会原样输出。

由于部分不与节点关联, @part 行后 不能跟随普通文本 。要得到正确输出,其后必须紧跟 章级命令 (及其节点)。延续上面的示例:

@part Part I:@* The beginning

@node Introduction
@chapter Introduction
...

在 TeX 输出中:

  • @part 的内容会出现在普通目录和简目里,但不带页码(符合常规排版惯例)。
  • 文档正文中会输出一张部分页,只显示 @part 内容。
  • 示例中的 @* 会在部分页产生换行,但在目录里会替换为空格。
  • 无论章节分页如何设置,部分页总会强制出现在奇数页(右侧页)。

在 LaTeX 输出中,@part 会被转换为 \part。

在 TeX 输出中:

  • @part 的内容会同时出现在常规目录和简缩目录中(参见「生成目录」),但不显示页码(这是常规排版惯例)。
  • 此外,文档正文中会输出一张 “part page部分页”,页面上只显示 @part 的内容。
  • 在上面的示例里, @* 会在部分页中产生换行(但在目录中会被替换为空格)。
  • 无论章节分页如何设置,这张部分页都会被强制放在奇数页(右侧页)。参见 @setchapternewpage: 章节前的空白页
  • 在 LaTeX 输出中,@part 会被输出为 \part

在 HTML 输出中, @part 内容同样会出现在目录里。标题会作为后续章节或附录节点的一部分,出现在正文里。

在 DocBook 输出中, <part> 元素会包含其后所有章节,直到下一个 <part> 。包含章节的 <part> 在遇到附录时也会自动结束。

在 Info 和纯文本输出中, @part 不起作用。

在提升或降低节级别时, @part 会被忽略(见下一节)。也就是说,它永远不会被降级,也没有内容可以升级到它这一级。

4.12. 提升/降低节层级: @raisesections@lowersections

@raisesections@lowersections 命令会 隐式地提升或降低 后续章节、节以及其他分节命令的层级(部分 @part 除外)。

也就是说:

  • @raisesections 命令会将 */sections节/ 变成 chapters章subsections子节 变成 sections节 * ,依此类推。
  • 反之, @lowersections 命令会将 章变成节、节变成子节 ,依此类推。

因此, @lowersections 可以抵消 @raisesections 的效果,反之亦然。

在实际使用中,通常只对 大块内容 提升或降低层级,一般用于外部文件。你可以用 @lowersections ,把一个独立完整的 Texinfo 文件,作为 内部被包含文件 嵌入到另一个 Texinfo 文件中(参见「包含文件」)。典型用法如下:

@lowersections
@include somefile.texi
@raisesections

(如果不加最后的 @raisesections ,主文件中 所有后续的节都会被降级 。)

如果被降级的包含文件中有 @top 节点,你需要用标记做 条件包含 (参见 @set@value )。

最终生成的菜单 必须考虑层级升降 ,因此在文档中随意到处使用 @raisesections@lowersections 很可能导致错误(除非文档中的菜单全部是自动生成的)。

重复使用这些命令会逐级继续提升或降低层级。如果试图提升到比章(chapter)更高的级别,效果仍等同于章命令;如果试图降低到比子子节(subsubsection) 更低的级别,效果仍等同于子子节命令。此外,被降级的子子节与被提升的章,无法与 texi2any 的隐式节点指针自动判定功能兼容,因为菜单结构无法被正确表示。

@raisesections@lowersections 命令 各占一行 书写。

5. 交叉引用

Cross-references交叉引用 用于引导读者查阅 同一文档或其他 Texinfo 文件 中的其他部分。

使用交叉引用,可以让读者跳转到当前上下文过于详细、或属于附带信息的内容。在线帮助系统或参考手册不同于小说,很少有人会从头到尾按顺序阅读。人们通常只查找自己需要的内容。因此,这类文档应当包含 大量交叉引用 ,帮助读者找到他们可能没读到的其他信息。

在印刷版手册中,交叉引用会生成 页码引用 ;如果是指向另一本手册,则会显示该手册名称。在 Info 中,交叉引用会生成可跳转条目,可使用 Info 的 f 命令跳转。(参见《在 Info跟随交叉引用》。)在 HTML 中,交叉引用会生成 超链接 。在 DocBook 中,使用 <link> 元素表示交叉引用;如果是指向另一本手册,则会显示手册名称。

各类交叉引用命令通过节点、锚点(参见 @anchor: 定义任意交叉引用目标)或浮动标签(参见 @float [类型][,标签]: 浮动内容)来定位目标位置。当 TeX 生成 DVI 文件时,会记录每个交叉引用目标的页码,并在引用中使用这些页码。因此,即使你编写的手册 只用于印刷、不用于在线阅读 ,也仍然必须编写 @node 行(或 @anchor 锚点),为交叉引用目标命名。

5.1. 不同类型的交叉引用命令

共有三种不同的交叉引用命令:

@xref
用于以 Info 格式交叉引用 开头 一个句子,在 Info 中显示为‘*Note name: node.’,在其他输出格式中显示为 ‘See …’。
@ref
常用于句子 内部 或更常见的是句子 末尾 ;在 Info 中生成 ‘*note name: node.’,在其他格式中只显示引用内容, 不带前面的 ‘See’。
@pxref
用于括号内、句子末尾,或在标点符号之前做补充引用。在 Info 中输出以小写 ‘*note’ 开头,在其他格式中以小写 ‘see’ 开头。(这里的 ‘p’ 代表 ‘parenthesis’,即 “括号”。)

此外,还有一些用于引用 Texinfo 系统 外部文档 的命令:

  • @cite 命令用于引用书籍和手册。
  • @url 用于生成 URL,例如引用万维网上的某个页面。

5.2. 交叉引用的组成部分

交叉引用命令只需要 一个必选参数 ,即它所指向的节点名称。一条交叉引用命令最多还可以包含 四个额外参数 。完整的五参数交叉引用模板如下:

@xref{node-name, online-label, printed-label, manual-name, printed-manual-title}

交叉引用的五个可能参数分别是:

  • node-name节点anchor-name锚点名称 。 这是交叉引用跳转的目标位置。在印刷版文档中,只有 同一文档内 的引用才会根据节点位置给出页码。使用 @node 定义节点(参见 编写 @node)、 @anchor (参见 @anchor: 定义任意交叉引用目标)或带标签的 @float (参见 @float [type][,label]: 浮动内容)来指定目标。该参数为 必选 (引用整本手册时除外)。

    交叉引用中书写的节点名称,必须与 @node完全一致 (包括大小写),否则处理工具可能无法找到该引用。

  • 在线输出标签。通常省略。若省略,则优先使用第三参数(主题描述);若该参数也省略,则直接使用节点名称。
  • 印刷输出标签。通常为章节标题或主题名称,在印刷版手册中作为引用名称。若省略,则使用节点名称。
  • 被引用手册名称。当引用目标位于 当前手册之外 、属于另一个 Texinfo 文件时使用。
  • 被引用印刷版手册标题。对应另一个 Texinfo 文件中被引用手册的印刷版标题。

分隔参数的逗号 前后的空白会被忽略 。如果需要在参数内部使用逗号,需用 @comma{} (参见 @comma{} 插入逗号‘,’)。

后续章节将分别介绍一参数、二参数、三参数、四参数、五参数的交叉引用用法。

使用 TeX 处理时,对于 同一手册内 的交叉引用,页码后会 自动添加逗号 ,除非参数的右花括号后面紧跟非空白字符(如逗号或句号)。这样你可以控制在其他输出格式中是否显示该逗号。例如:

@xref{Another Section} for more info
  • TeX 输出:‘See Another Section, page ppp, for more info’
  • Info 输出:‘*Note Another Section:: for more info’

如果不希望自动生成逗号,可以在参数后使用 ‘@:’ 等命令。例如:‘ @xref{Hurricanes}@: --- for the details ’会生成:

See Hurricanes, page ppp —- for the details

而不是:

See Hurricanes, page ppp, —- for the details

当交叉引用文本(以及节点名、菜单项)中存在可能干扰 Info 格式解析的可疑结构时, texi2any 会给出警告并保护相关名称。参见 Info 节点名称约束

5.3. 单参数 @xref

@xref 最简单的形式只接受一个参数,即同一个 Texinfo 文件中另一个节点的名称。

例如:

@xref{Tropical Storms}.

在 Info 格式中生成:

*Note Tropical Storms::.

在印刷版手册中生成:

See Section 3.1 [Tropical Storms], page 24.

在印刷版手册中。

5.4. 双参数 @xref

使用两个参数时,第二个参数会作为 online-label在线输出 的显示标签。

格式如下:

@xref{node-name, online-label}.

示例:

@xref{Electrical Effects, Lightning}.

在 Info 格式中会生成:

*Note Lightning: Electrical Effects.

在印刷版手册中会生成,其中会显示节点名称:

See Section 5.2 [Electrical Effects], page 57.

交叉引用的第二个参数与节点名称遵循相同的约束条件。在此场景中可能引发问题的字符是 冒号 。详见《Info 节点名称约束》。

5.5. 三参数 @xref

第三个参数会 替换印刷版输出中的节点名称 。第三个参数应当是印刷版中章节的名称,或是该章节所讨论主题的表述。

格式如下:

@xref{node-name, online-label, printed-label}.

示例:

@xref{Electrical Effects, Lightning, Thunder and Lightning}, for details.

在 Info 格式中生成:

*Note Lightning: Electrical Effects, for details.

在印刷版手册中生成:

See Section 5.2 [Thunder and Lightning], page 57, for details.

如果提供了第三个参数,而第二个参数为空,那么第三个参数会 同时充当在线标签和印刷标签 。(注意:两个连续的逗号用于标记第二个参数为空。)

@xref{Electrical Effects, , Thunder and Lightning}, for details.

在 Info 格式中生成:

*Note Thunder and Lightning: Electrical Effects, for details.

在印刷版手册中生成:

See Section 5.2 [Thunder and Lightning], page 57, for details.

交叉引用的第三个参数与节点名称遵循相同的约束条件。在此场景中可能引发问题的字符是 冒号 。详见《Info 节点名称约束》。

实际使用建议:

  • 如果节点名称与章节标题相同(或基本相同),通常只写第一个参数即可。
  • 如果节点名称与标题不同,则只需要写第一个和第三个参数。

Texinfo 提供了一个设置,可以让交叉引用 默认使用章节标题而非节点名称 (显式指定的第三个参数仍然优先):

@xrefautomaticsectiontitle on

通常这行代码会写在文档开头,作用于整个手册。但你也可以按需关闭( @xrefautomaticsectiontitle off ),例如当你引入其他没有合适章节名称的子文档时。

该设置同样适用于 HTML 中的节点标题:如果开启 @xrefautomaticsectiontitle ,在可能的情况下,节点标题会使用 章节名称 而非节点名称。

5.6. 四参数与五参数 @xref

在交叉引用中,第四个参数用于指定 另一本手册 的名称(与当前引用所在文件不同),第五个参数则指定该手册作为印刷版时的标题。

完整模板为:

@xref{node-name, online-label, printed-label, manual-name, printed-manual-title}

@xref {节点名,在线标签,印刷标签,手册名,印刷手册标题}

例如:

@xref{Electrical Effects, Lightning, Thunder and Lightning, weather, An Introduction to Meteorology}.

在 Info 格式中会生成如下输出:

*Note Lightning: (weather)Electrical Effects.

可以看到,手册名被放在圆括号内,并置于节点名之前。在 HTML 中,手册名和节点名用于构造超链接 URL(参见 HTML 交叉引用),而链接文本则基于标签生成。

在印刷版手册中,该引用效果如下:

See section “Thunder and Lightning” in An Introduction to Meteorology.

印刷手册的标题会以 @cite 格式排版;由于引用另一本手册时无法预知页码,因此引用中不包含页码。

下一种情况:使用长格式 @xref 时,你常常会省略第二个参数。此时,第三个参数(主题描述)会作为在线格式中的交叉引用名称。

例如:

@xref{Electrical Effects, , Thunder and Lightning, weather, An Introduction to Meteorology}.

在 Info 中生成:

*Note Thunder and Lightning: (weather)Electrical Effects.

在印刷版手册中生成:

See section “Thunder and Lightning” in An Introduction to Meteorology.

下一种情况:如果另一本手册中的 节点名与章节标题相同 ,你也可以省略章节标题。此时节点名将同时用于两处。

例如:

@xref{Electrical Effects,,, weather, An Introduction to Meteorology}.

在 Info 中生成:

*Note (weather)Electrical Effects::.

在印刷版手册中生成:

See section “Electrical Effects” in An Introduction to Meteorology.

一般来说,没有理由只提供手册名参数而不提供印刷手册标题参数,除非不生成印刷版手册。你也可能需要引用 同一本印刷手册内 的另一手册文件 —— 当多个 Texinfo 文件被合并到同一本印刷手册,但在其他输出格式中可生成独立文件时。这种情况下,只需指定第四个参数,无需第五个。如果缺少印刷手册标题参数,印刷输出中将直接使用手册名代替。

只提供印刷手册标题参数而不提供在线手册名参数,基本没有意义,除非该 Texinfo 源文件 只用于生成印刷版手册 。在线格式中的结果取决于具体格式,可能会出现空手册名,或以类似印刷版的格式引用该手册。

最后,也允许只保留第四、第五个参数,省略其余所有参数,用于整体引用另一本手册。详见下一节。

5.7. 引用整本手册

通常情况下,交叉引用 必须指定一个节点 。但你经常会需要 整体引用另一本手册 ,而不是其中某个特定章节。这种情况下,指定章节名是多余且分散注意力的。

因此,在对其他手册进行交叉引用时(参见 带四个和五个参数的 @xref ),如果第一个参数是 ‘Top’(必须这样大写)或者完全省略,并且第三个参数也省略,那么印刷版输出中将 不包含节点或章节名称 。(如果显式写了‘Top’,Info 格式输出会包含它。)例如:

@xref{Top,,, make, The GNU Make Manual}.

会生成:

*Note (make)Top::.

以及印刷版:

See The GNU Make Manual.

无论是否显式指定‘Top’节点,Info 阅读器都会跳转到该手册的顶层节点。

另外一种(也是历史上常用的)写法是:指定‘Top’节点,并为 @xref 的第三个参数提供合适的内容,以此来引用整本手册。用这种写法引用《GNU Make 手册》可以这样写:

@xref{Top,, Overview, make, The GNU Make Manual}.

它在 Info 中生成:

*Note Overview: (make)Top.

在印刷手册中生成:

See section “Overview” in The GNU Make Manual.

在这个例子里,Top 是第一个节点的名称,Overview 是手册第一章的名称。印刷手册中第一章并没有通用的命名规范,这只是 Make 手册恰好使用的名称。正是因为首节名称不统一,所以 在整体引用手册时,省略第三个参数是更推荐的做法

5.8. @xref: 基础交叉引用

@xref 命令用于在句子开头生成交叉引用。有关 @xref 的使用示例,请参见前面的章节。

5.9. @ref: 直接交叉引用

@ref@xref 几乎完全相同,唯一区别是: @ref 不会在输出中生成 ‘See’ 字样,只输出引用本身。这使得它适合用在句子末尾。

例如:

For more information, @pxref{This}, and @ref{That}.

在 Info 格式中生成:

For more information, *note This::, and *note That::.

在印刷版中生成:

For more information, see Section 1.1 [This], page 1, and Section 1.2 [That], page 2.

使用 @ref 命令时,作者可能会写出适合印刷手册、但在 Info 格式中显得生硬的句子。请记住,你的读者可能同时使用印刷版和 Info 等其他格式。例如:

Sea surges are described in @ref{Hurricanes}.

在印刷版中显示正常:

Sea surges are described in Section 6.7 [Hurricanes], page 72.

但在 Info 中读起来会很别扭,因为 “note” 在这里会被当作动词理解:

Sea surges are described in *note Hurricanes::.

5.10. @pxref: 附带页码的交叉引用

括号内引用命令 @pxref@xref 几乎完全相同,但它 最适合用在括号内部 。该命令与 @xref 的区别在于:输出的引用词是小写的 ‘see’(参见),而不是大写的 ‘See’(参见)。在 Info 格式中则输出 ‘*note’。

当只带一个参数时,括号内的交叉引用示例如下:

... storms cause flooding (@pxref{Hurricanes}) ...

在 Info 中生成:

... storms cause flooding (*note Hurricanes::) ...

在印刷手册中生成:

… storms cause flooding (see Section 6.7 [Hurricanes], page 72) …

在旧版 Texinfo 中,不允许在 @pxref 后面直接加标点,因此它只能用在右括号之前。现在这一限制已取消。 @pxref{节点名} 的效果等价于 ‘see @ref{node-name}’。不过在很多场景下, 后者更推荐 ,因为这样能让 Info 格式的输出里清晰地显示出 “see” 一词。

5.11. @anchor: 定义自定义交叉引用目标

@anchor 用于在文档中标记一个 anchor锚点 ,使其可以像节点一样被交叉引用。你可以使用 @anchor 命令创建锚点,并将标签名放在大括号内作为参数。例如:

This marks the @anchor{x-spot}spot.
...
@xref{x-spot,,the spot}.

会生成:

This marks the spot.
...
See [the spot], page 1.

可以看到, @anchor 命令 本身不会产生任何输出 。上面的例子在单词 ‘spot’ 之前定义了一个名为 ‘x-spot’ 的锚点,之后可以用 @xref 或其他交叉引用命令来指向它,如下所示(参见 “交叉引用”)

最佳实践 :将 @anchor 命令放在 你希望引用的位置之前 ,这样读者跳转到锚点时,视线能直接落在正确内容上。为了源码可读性,你也可以把 @anchor 单独放在一行。 @anchor 之后的空白(包括换行)会被忽略。

命名与使用约束

  • 锚点名、节点名、浮动体标签 不能冲突
  • 锚点、节点、浮动体标签在某些处理中是类似的:例如 goto-node 命令既可以接受节点名,也可以接受锚点名。(参见 Info 中的 “跳转到节点”。)
  • 锚点名和浮动体标签也可能出现在菜单(参见 “菜单”)和节点方向指针(参见 “编写 @node”)中,但 不推荐这样使用

锚点名在可包含的字符方面,与节点名遵循相同的约束规则(参见 Info 节点名称约束)。

兼容建议

由于锚点和节点在功能上是等效的,当你 删除或重命名某个节点 时,最好用旧名称定义一个 @anchor 。这样一来,其他 Texinfo 手册或外部网页指向该旧节点的链接仍然可以正常工作

5.13. @inforef: 仅针对信息文件的交叉引用

@inforef 用于创建指向 Info 文档的交叉引用 —— 即使是从印刷版手册中引用。该命令最初用于并非由 Texinfo 源码生成的 Info 文件。

此命令现已废弃,不应再使用 。它除了几乎没有实际用途外,类似的输出效果完全可以通过 @xref@ref@pxref 实现:只需将 Info 文件名作为第四个参数,且不提供第五个参数即可。

该命令接受两个或三个参数,顺序如下:

  • 节点名
  • 交叉引用名称(可选)
  • Info 文件名

模板为:

@inforef{node-name, cross-reference-name, info-file-name}

5.14. @url, @uref {网址 [, 显示文本 ][, 替换文本 ]}=

@url 用于生成对统一资源定位符(URL)的引用。它有一个必选参数,即 URL 本身,以及两个可选参数,用于控制显示的文本。在 HTML 和 PDF 输出中, @url 会生成可点击的链接。(若仅需标注 URL 而不生成可点击链接,请使用 @indicateurl ,参见 @indicateurl {uniform-resource-locator}。)

@uref@url 的同义词。(最初, @url 的作用等同于 @indicateurl ,而必须使用 @uref 才能生成有效链接;但实际使用中 @url 几乎总是被误用,因此我们修改了它的含义。)

如果指定第二个参数,该参数将作为显示文本(默认为 URL 本身);在 HTML 以外的输出格式中,除了这段文本外,还会额外输出 URL。

如果指定第三个参数,则使用该参数作为显示文本,且在任何格式中都不再输出 URL。这在文本本身已具备足够引用信息时非常有用,例如在手册页中。另外,如果提供了第三个参数,第二个参数会被忽略。

5.14.1. @url 示例

首先是 @url 最简形式的示例,仅使用一个参数。此时给出的 URL 既是链接目标,也是链接的显示文本:

The official GNU ftp site is @url{http://ftp.gnu.org/gnu}.

生成结果:

The official GNU ftp site is http://ftp.gnu.org/gnu.

@url 的双参数形式

下面是双参数形式的示例:

The official @url{http://ftp.gnu.org/gnu, GNU ftp site}
holds programs and texts.

生成结果:

The official GNU ftp site holds programs and texts.

在 HTML 中输出为:

The official <a href="http://ftp.gnu.org/gnu">GNU ftp site</a>
holds programs and texts.

在其他格式中,输出类似这样:

The official GNU ftp site (http://ftp.gnu.org/gnu)
holds programs and texts.

@url 的三参数形式

最后是三参数形式的示例:

The @url{/man.cgi/1/ls,,ls} program ...

除 HTML 外,生成结果为:

The ls program …

而在 HTML 中生成:

The <a href="/man.cgi/1/ls">ls</a> program ...

顺便一提,有些人更倾向于用这种明确格式显示 URL:

如果你愿意,可以在源文件中使用这种写法。我们认为没有必要在输出中包含 ‘<URL:’ 和 ‘>’ ,因为任何需要识别文本中 URL 的实用软件,都能在没有这些标记的情况下正常识别

5.14.2. URL 换行

TeX 只允许在 URL 中的少数几个特殊字符处换行,这些字符包括:‘&’、‘.’、‘#’、‘?’和 ‘/’(但不能在两个连续的 ‘/’ 之间换行)。在这些字符周围会插入少量可伸缩的空白,以辅助换行。

对于 HTML 输出,现代浏览器也会在显示的 URL 内部自动换行。如果你需要在其他字符处允许换行,可以按需插入 @/ (参见 @*@/: 生成与允许换行)。

默认情况下,在 TeX 中,这类在特殊字符处的换行 发生在字符之后 。有些人更希望换行出现在特殊字符之前。这可以通过 @urefbreakstyle 命令控制(该命令仅对 TeX 生效):

@urefbreakstyle how

其中参数 how 可取以下值:

after
(默认值)可能在特殊字符之后换行。
before
可能在特殊字符之前换行。
none
完全不在这些特殊字符处考虑换行;所有可能的换行必须手动插入。

5.14.3. @url 的 PDF 输出格式

如果 PDF 的最终用途仅为 在线浏览 (在某种程度上类似于 HTML),你可能不希望 URL 出现在可见文本中(就像网页读者看不到原始 URL 一样)。Texinfo 为此提供了一个专用于 PDF 的选项,该选项必须在 @tex 内部使用:

@tex
\global\urefurlonlylinktrue
@end tex

效果是: @url{http://www.gnu.org, GNU} 的可见输出只显示「GNU」,并附带指向 http://www.gnu.org 的链接。通常情况下,可见输出会同时包含标签和 URL:‘GNU (http://www.gnu.org)’。

该选项仅在使用 pdfTeX 生成 PDF 时有效,通过其他方式(例如 TeX→DVI→PDF)从 Texinfo 转为 PDF 时无效。因此,你可以像上面那样,在 @tex 中无条件使用该选项;生成 DVI 时它会被自动忽略。

5.15. @cite{参考文献}: 引用标注

@cite 命令用于标注 没有配套 Info 文件的书籍 名称。例如,我们可以这样引用: 一本书

该命令在印刷版手册中会使用 斜体 ,在 Info 文件中会生成 引号

如果一本书是用 Texinfo 编写的, 更推荐使用交叉引用命令 ,因为读者在 Info 中可以直接点击跳转。参见 @xref

5.16. PDF 颜色设置

默认情况下,PDF 输出中的 URL 和交叉引用链接以 黑色 显示。但在极少数情况下,你可能想像网页一样,用不同颜色突出显示这类 “可点击” 链接。Texinfo 提供了专用于 PDF 的颜色设置选项, 必须@tex 内部使用:

@tex
\global\def\linkcolor{1 0 0}  % 红色
\global\def\urlcolor{0 1 0}   % 绿色
@end tex

\urlcolor 用于修改 @url 输出内容的颜色(包括实际 URL 与任何文本标签)。 \linkcolor 用于修改指向节点等交叉引用的颜色。两者相互独立。

给出的三个数值必须是 0 到 1 之间的数字,分别表示红、绿、蓝的分量。

这些定义只在使用 pdfTeX 生成 PDF 时生效,通过其他方式(如 TeX→DVI→PDF)从 Texinfo 生成 PDF 时无效。因此,你可以像上面那样在 @tex 中无条件设置,生成 DVI 时这些命令会被自动忽略。

我们 不建议为了好看而随意加颜色 ;除非有明确需求,否则最好不使用。

6. 文本、单词与短语标记

在 Texinfo 中,你可以用多种方式标记单词和短语。Texinfo 处理器会根据这些标记来决定如何高亮显示文本。例如,你可以指定一个单词或短语是定义项、元语法变量,还是程序中使用的符号。你还可以用多种不同的方式对文本进行强调。

6.1. 标记定义、命令等

6.1.1. 高亮命令的实用价值

这些命令具有多种用途:

@code{sample-code}
表示属于程序代码片段的字面示例文本。参见 @code {sample-code}
@kbd{keyboard-characters}
表示键盘输入内容。参见 @kbd {keyboard-characters}
@key{key-name}
表示键盘上按键的标准名称。参见 @key {key-name}
@samp{text}
表示作为字符序列字面示例的文本。参见 @samp {text}
@verb{text}
原样输出一段字符序列。参见 @verb {chartextchar}
@var{metasyntactic-variable}
表示元语法变量。参见 @var {metasyntactic-variable}
@env{environment-variable}
表示环境变量。参见 @env {environment-variable}
@file{file-name}
表示文件名。参见 @file {file-name}
@command{command-name}
表示命令名称。参见 @command {command-name}
@option{option}
表示命令行选项。参见 @option {option-name}
@dfn{term}
表示术语的首次引入或定义性使用。参见 @dfn {term}
@cite{reference}
表示书籍名称。参见 @cite {reference}
@abbr{abbreviation}
表示缩写,例如 “Comput.”。
@acronym{acronym}
表示首字母缩写词。参见 @acronym {acronym [, meaning ]}
@indicateurl{uniform-resource-locator}
表示示例性质(即无功能)的统一资源定位符。参见 @indicateurl {uniform-resource-locator}。(如需可点击的 URL,请使用 @url ,参见 @url, @uref {url [, text ][, replacement ]}。)
@email{email-address[, displayed-text]}
表示电子邮件地址。参见 @email {email-address [, displayed-text ]}

6.1.2. @code {spmle-code}: 代码示例

使用 @code 命令来标记属于程序片段、且由 完整语法记号 组成的文本。将文本用大括号包裹。

因此,你应当对程序中的表达式、程序中使用的变量或函数名、以及编程语言中的关键字使用 @code

对于类似编程语言的命令名(例如 Texinfo),也应使用 @code 。例如, @code@samp 分别是在 Texinfo 源文件中写成 ‘ @code{@@code} ’ 和 ‘ @code{@@samp} ’ 生成的。

@code 命令中的单词出现在 句首 时, 不应该 改变其大小写。大多数计算机语言是 区分大小写 的。例如在 C 语言中, Printf 与标识符 printf 不同,而且很可能是拼写错误。即使在不区分大小写的语言中,标识符出现不同拼写也会让读者困惑。请选定一种拼写并始终使用。如果你不希望句首的命令名全为小写,应 重新组织句子

在输出格式允许的情况下, @code 的参数会以等宽(打字机)字体排版。例如:

The function returns @code{nil}.

会生成:

The function returns nil.

以下情况 不建议 使用 @code

  • 对于 Shell 命令名(如 ls ),请使用 @command
  • 对于环境变量(如 TEXINPUTS ),请使用 @env
  • 对于独立出现的 Shell 选项(如 '-c'),请使用 @option
  • 一整行 Shell 命令用 @samp 通常比 @code 效果更好,此时以更美观为准。
  • 对于短于一个语法记号的字符序列。例如,当你写到 ‘goto-ch’,它只是 Emacs Lisp 函数 goto-char 名称的一部分,应使用 @samp
  • 一般来说,当描述记号内部所使用的字符时(例如解释函数名可以使用哪些字母或可打印符号),不要用 @code (改用 @samp )。同样,不要用 @code 标记程序的输入文本,除非该输入使用类编程语言书写。例如,GNU Emacs 的按键命令不应使用 @code (改用 @kbd ),但这些按键所调用的 Emacs Lisp 函数名可以用 @code

默认情况下,TeX 会考虑在 @code 及相关命令中的 '-' 和 '_' 字符处换行。这可以通过 @allowcodebreaks 控制(参见 @allowcodebreaks: 控制 @code 中的换行)。在 HTML 输出中,换行由浏览器行为决定。对于 Info 格式,通常不在此类位置换行。

对于 Info 和纯文本格式, @code 及相关命令(如 @kbd@command )的输出通常会被引号包裹,除非处于等宽类环境中,例如 @example 环境(参见 @example: 示例文本)和 @code 自身等。若要控制 texi2any@code 等命令输出中插入的引号字符,可参见 OPEN_QUOTE_SYMBOLCLOSE_QUOTE_SYMBOL 自定义变量(参见多格式自定义变量)。

6.1.3. @kbd {keyboard-characters}: 键盘输入内容

使用 @kbd 命令标记 需要用户从键盘输入的字符 。例如,要表示按键组合 M‑a ,写作:

@kbd{M-a}

要表示按键序列 M-x shell ,写作:

@kbd{M-x shell}

默认情况下, @kbd 命令会使用不同的字体(在输出格式支持时,使用斜体等宽字体而非普通等宽字体),以便用户区分 需要手动输入的字符计算机输出的内容

由于不同手册对 @kbd 的使用风格不同,你可以通过 @kbdinputstyle 命令控制字体切换。该命令对 Info 格式输出无效。请在行首使用该命令,并传入以下单词之一作为参数:

‘code’
@kbd 始终使用与 @code 相同的字体。
‘example’
仅在 @example 及类似环境中,为 @kbd 使用区分性字体。
‘distinct’
(默认值)始终为 @kbd 使用区分性字体。

你可以在 @kbd 的大括号内嵌套其他 @-command 。例如,下面这种写法可以更简洁地描述 “先按 r 键,再按回车键”:

@kbd{r @key{RET}}

这会输出: r RET 。(本手册使用 @kbdinputstyle 的默认设置。)

当你需要 逐字母拼出输入内容 时,也应使用 @kbd 命令。例如:

To give the @code{logout} command,
type the characters @kbd{l o g o u t @key{RET}}.

这段代码会输出:

To give the logout command, type the characters l o g o u t RET.

(此例同时说明:你可以加入空格以便阅读。如果你需要明确表示输入中的 空格字符 ,请使用 @key{SPC}

6.1.4. @key {key-name}: 按键名称

@key 命令用于表示键盘上按键的 标准名称 ,例如:

@key{RET}

当需要输入的字符序列中包含需要用名称表示的按键时,你可以在 @kbd 命令的参数内使用 @key 命令。

例如,要生成 C-x ESCM-TAB ,应写成:

@kbd{C-x @key{ESC}}
@kbd{M-@key{TAB}}

下面是推荐使用的按键名称列表:

SPC
空格(Space)
RET
回车(Return)
LFD
换行(Linefeed,不过如今大多数键盘没有换行键,最好将该字符称作 C-j
TAB
制表符(Tab)
BS
退格(Backspace)
ESC
退出(Escape)
DELETE
删除(Delete)
SHIFT
Shift 键
CTRL
Ctrl 键
META
Meta 键

处理修饰键名称(如 ‘meta’、‘ctrl’)时需要注意细节:当描述 组合按键 (如 Meta-a )时,只使用 @kbd ,不使用 @key ;当 单独提及修饰键本身 时,才使用 @key 。例如:写成 ‘ @kbd{Meta-a} ’,生成 Meta-a ;写成 ‘ @key{META} ’,生成 META

6.1.5. @samp {text}: 示例文本

使用 @samp 命令来标记 字面示例 ,即文件、字符串、模式等中的一段字符 “sample(样本)”。将文本用大括号括起来。其参数会显示在 单引号 内,并且以 等宽字体 输出。

例如:

To match @samp{foo} at the end of the line,
use the regexp @samp{foo$}.

会生成:

To match ‘foo’ at the end of the line, use the regexp ‘foo$’.

凡是指代 单个字符 时,都应使用 @samp ,除非 @kbd@key 更合适。你也可以用 @samp 标记完整的 C 语言语句或完整的 Shell 命令 —— 在这种场景下, @samp 通常比 @code 效果更好。简单来说, @samp 是一个通用命令,用于所有不适合用 @code@kbd@key@command 等标记的内容。

只有当标点符号属于你指定的字符串本身时,才把它写在大括号内。如果标点符号属于外围的英文文本,则写在大括号外。例如下面句子中的逗号和句号都在大括号外:

In English, the vowels are @samp{a}, @samp{e},
@samp{i}, @samp{o}, @samp{u}, and sometimes
@samp{y}.

会生成:

In English, the vowels are ‘a’, ‘e’, ‘i’, ‘o’, ‘u’, and sometimes ‘y’.

6.1.6. verb {chartextchar}: 原样文本

使用 @verb 命令输出 原样字符序列 (按原文输出,不做转义解析)。

与 LaTeX 的 \verb 命令类似,原样文本可以用 任意一个不重复的分隔符 包裹。将包含分隔符在内的原样文本放在大括号中。文本会以等宽字体显示:

How many @verb{|@|}-escapes does one need to print this
@verb{.@a @b.@c.} string or @verb{+@'e?`{}!`\+} this?

会生成:

How many @-escapes does one need to print this
@a @b.@c string or @'e?`{}!`\ this?

这与 @samp (见上一节)、 @code 等命令形成对比:在那些命令中,参数是普通的 Texinfo 文本, @{} 三个字符依旧是特殊字符。而在 @verb 中, 除了你选定的分隔符之外,没有任何字符是特殊的

分隔符本身也可以出现在原样文本内部,如上例所示。再举一例:‘@verb{…}’ 会输出一个(等宽)句点。

不建议 在其他 Texinfo 结构内部使用 @verb 。特别地,在任何与交叉引用相关的内容中(如章节标题、图表标题等)使用 @verb 是无效的。

6.1.7. @var {metasyntactic-variable}: 元语法变量

使用 @var 命令标记 元语法变量metasyntactic variable元语法变量 是用来代表另一文本片段的占位符。例如,在函数文档中,你应当使用元语法变量来描述传递给该函数的参数。

不要@var 用于计算机程序中的 普通变量名 。这些是具体名称,因此应使用 @code 。例如,Emacs Lisp 变量 texinfo-tex-command 不是元语法变量,应使用 @code 正确排版。

不要@var 用于环境变量;环境变量应使用 @env (见下一节)。

@var 在 Info 文件中的效果是将参数 全部转为大写 。在印刷版手册中,参数以 斜体 显示。4

例如:

To delete file @var{filename},
type @samp{rm @var{filename}}.

会生成:

To delete file filename, type ‘rm filename ’.

(注意: @var 可以嵌套在 @code@samp@file 等命令内部。)

元语法变量统一写成 小写、无空格 形式,可用连字符提高可读性。因此,说明如何开头编写 Texinfo 手册的示例源码如下:

\input texinfo
@@settitle @var{name-of-manual}

会生成:

\input texinfo
@settitle name-of-manual

某些文档风格会用尖括号表示元语法变量,例如:

..., type rm <filename>

但这 不是 Texinfo 所使用的风格。

6.1.8. @env {environment-variabl}: 环境变量

使用 @env 命令标记 环境变量 ,这类变量被包括 GNU 在内的众多操作系统使用。不要将它用于元语法变量;元语法变量请使用 @var (见上一节)。

@env 在显示效果上与 @code 等价。例如:

The @env{PATH} environment variable ...

会生成:

The PATH environment variable …

6.1.9. @file {file-name}: 文件名

使用 @file 命令标记文件名、缓冲区名、目录名或 Info 中的节点名。你也可以用该命令标记 文件后缀不要@file 标记编程语言中的符号,这类内容应使用 @code

@file 的显示效果与 @code 相同。例如:

The @file{.el} files are in
the @file{/usr/local/emacs/lisp} directory.

会生成:

The .el files are in the /usr/local/emacs/lisp directory.

6.1.10. @command {command-name}: 命令名称

使用 @command 命令来标记命令名称,例如 lscc

@command 的显示效果与 @code 相同。例如:

The command @command{ls} lists directory contents.

会生成:

The command ls lists directory contents.

如果你将某个程序名称视为一个普通英文单词,例如‘Emacs’或‘Bison’,则应使用普通正文字体,而不要使用 @command

当书写一整行 Shell 命令调用时,例如 ‘ls -l’,你可以根据排版效果自行选择使用 @samp@code

6.1.11. @option {option-name}: 命令行选项

使用 @option 命令标记命令行选项,例如 -l--version--output=filename

@option 的显示效果与 @code 相同。例如:

The option @option{-l} produces a long listing.

会生成:

The option -l produces a long listing.

6.1.12. @dfn {term}: 被定义的术语

使用 @dfn 命令来标记 专业术语的首次引入或定义性用法 。仅当段落的目的是正式介绍一个后续会再次用到、或读者应当掌握的术语时,才使用该命令。仅仅是文中第一次顺带提到某个术语,并不适合使用 @dfn

该命令在印刷版手册中会使用 斜体 ,在 Info 文件中会用 双引号 标出。

例如:

Getting rid of a file is called @dfn{deleting} it.

会生成:

Getting rid of a file is called deleting it.

通用规则:包含术语定义性出现的句子,本身就应该是该术语的定义。句子不必显式说明 “这是一个定义”,但应包含定义所需的信息 —— 即清晰说明该术语的含义。

6.1.13. @abbr {abbreviation [, meaning ]}: 缩写

你可以使用 @abbr 命令来标记 通用缩写 。缩写以单个参数的形式放在大括号内,例如 ‘ @abbr{Comput.} ’ 。出于排版风格或特定缩写的习惯,你也可以省略句点,例如 ‘ @abbr{Mr} Stallman ’。

@abbr 接受一个 可选的第二个参数 ,用于表示该缩写的完整含义。

如果缩写以小写字母加句点结尾、且不在句末,同时没有第二个参数,记得使用 @. 命令(参见 “句尾”)以获得正确的间距。不过,你 不必 在缩写内部使用 @. ;Texinfo 会自动认为缩写内部的句点不表示句子结束。

在支持对应标签的输出格式(如 HTML 和 DocBook)中,会使用该标签。否则,直接输出第一个参数;如果提供了第二个参数,则在缩写后用括号输出。例如:

@abbr{Comput. J., Computer Journal}

会生成:

Comput. J. (Computer Journal)

对于 全大写字母 组成的缩写,你可能更适合使用 @acronym 命令。关于这两个命令的用法区别,详见下一节。

6.1.14. @acronym {acronym [, meaning ]}: 大写缩写词

@acronym 命令用于标记全大写形式的缩写词,例如 ‘NASA’。缩写词作为单个参数放在大括号内,如 ‘ @acronym{NASA} ’ 。出于排版风格或特定缩写习惯,你也可以加点,如 ‘ @acronym{N.A.S.A.} ’。

@acronym 接受一个 可选的第二个参数 ,用于表示该缩写词的完整含义。

如果缩写词出现在句末,且没有第二个参数,记得使用 @. 或类似命令(参见 “结束句子”)以获得正确的间距。

在 TeX 中,缩写词会以 稍小字号 显示。在 Info 输出中,参数直接原样显示。在上述格式以及 LaTeX 输出中,如果提供了第二个参数,它会跟在缩写词后用括号显示。在 HTML 和 DocBook 中会使用对应的标签。

例如(因为 GNU 是递归缩写,我们递归使用 @acronym ):

@acronym{GNU, @acronym{GNU}'s Not Unix}

会生成:

GNU (GNU’s Not Unix)

某些场景下,习惯将姓氏全部大写显示。 不要 为此使用 @acronym ,因为姓名不是缩写词。应改用 @sc (参见 @sc {text}: 小型大写字体)。

@abbr@acronym 是关系密切的命令:两者都用于告诉读者此处使用了简写形式,并可附带完整含义。选择使用哪个命令时,请记住以下区别:

  • 在普通英文用法中,首字母缩写词(acronym)是缩写(abbreviation)的子集:包括可发音的词,如 ‘NATO’、‘radar’、‘snafu’;部分资料也将音节缩写(如 ‘Usenet’)、混合缩写(如 ‘SIGGRAPH’)、不可发音的首字母缩写(如 ‘FBI’)归入此类。
  • 在 Texinfo 中,acronym(而非普通 abbreviation)只能由大写字母和句点组成,不允许小写字母。
  • 在 TeX 中,acronym 会以稍小字号显示,普通 abbreviation 则不会。
  • 通常来说,要对所有大写序列坚持使用 @acronym 既困难又费时。而且,部分缩写用正常字号、部分用小字号会显得怪异。因此,你可以考虑一种更简单的方式:不使用 @acronym ,直接把全大写内容作为普通文本排版,例如直接写 ‘GNU’,输出也是 ‘GNU’。
  • 一般而言,并非所有缩写都必须使用这两个命令;请自行判断。即使不用,文本也完全可读。

6.1.15. @indicateurl {{uniform-resource-locator}: 无功能的URL

使用 @indicateurl 命令标记万维网上的统一资源定位符(URL)。该命令 仅用于标记 ,不会生成可点击的链接(如需可点击链接,请使用 @url@uref 命令,参见 @url, @uref {url [, text ][, replacement ]})。 @indicateurl 适用于标记 并不实际存在 的 URL。

例如:

For example, the URL might be @indicateurl{http://example.org/path}.

会生成:

For example, the URL might be ‘http://example.org/path’.

@indicateurl 的输出效果通常与 @samp 相似(参见 @samp {text})。

6.1.16. @email {email-address [, displayed-text ]}: 邮箱地址

使用 @email 命令标记电子邮件地址。该命令有一个必选参数(邮箱地址)和一个可选参数(要显示的文本,默认为地址本身)。

在 Info 格式中,地址会用尖括号括起来;如果提供了显示文本,则显示在地址前面。在印刷版输出中,不显示尖括号。在 HTML 和 DocBook 输出中, @email 会生成 ‘mailto’ 链接。在 HTML 里, ‘mailto’ 链接通常会打开邮件撰写窗口。

例如:

Send bug reports to @email{bug-texinfo@@gnu.org},
suggestions to the @email{bug-texinfo@@gnu.org, same place}.

会生成:

Send bug reports to bug-texinfo@gnu.org, suggestions to the same place.

6.2. 文本强调

通常,Texinfo 会通过切换字体,来根据文本所属类别标记文字,例如 @code 命令。大多数情况下,这是标记文字的最佳方式。但有时,你只想 强调文本 ,而不指明其类别。为此,Texinfo 提供了两个命令。

此外,Texinfo 还有若干用于指定输出字体的命令。这些命令在 Info 格式中无效,且其中只有 @r 命令有常规用途。

6.2.1. @emph {text} 与 @strong {text}:斜体强调 / 粗体强调

@emph@strong 命令用于 强调文本@strong 的强调程度更强。在印刷版输出中, @emph 显示为 斜体@strong 显示为 粗体 。在 Info 格式输出中, @emph 会在文本两侧加下划线( '_' ), @strong 会在文本两侧加星号。

例如:

@strong{Caution:} @samp{rm * .[^.]*}
removes @emph{all} files in the directory.

会生成:

Caution: ‘rm * .[^.]*’ removes all files in the directory.

@strong 命令很少使用,通常只用来标记视觉上需要突出的元素,比如上例中的单词 ‘Caution’ 。

注意:不要在 @strong 中使用 ‘Note’ 这个词并紧跟空格;Info 会把这种组合误判为交叉引用。可以改用类似 Please noticeCaution 的短语,或者在 @quotation 命令的可选参数中使用 ‘Note’—— 那里是允许的。

6.2.2. @sc {text}: 小型大写字体

使用 @sc 命令将文本以 A SMALL FONT小型大写字体 显示(在输出格式支持的情况下)。需要设置为小型大写的文本请用 小写字母 写在大括号内,示例如下:

Richard @sc{Stallman} a commencé le projet GNU.

会生成:

Richard STALLMAN a commencé le projet GNU.

如上所示,我们建议将 @sc 保留用于需要特殊小型大写效果的场景;姓氏是典型场景,尤其在非英语语言中,尽管这方面没有严格规定。

在 TeX 中, @sc 大括号内的大写字母会以 全尺寸大写 显示,只有小写字母会转为小型大写。在 Info 输出中, @sc 的参数会全部以大写显示。在 HTML 中,参数会转为大写并使用 <small> 标签缩小字号,因为 HTML 难以原生表示真正的小型大写。在 LaTeX 中,会直接输出对应小型大写字体的命令。

总体而言,我们建议 尽可能使用标准的大小写字母

6.2.3. 印刷用字体设置

Texinfo 提供了一条命令,用于在文档的 印刷版输出 中修改正文字体大小: @fonttextsize 。该命令对其他输出格式无效。它在行尾接受一个参数,只能是 ‘10’ 或 ‘11’。

例如:

@fonttextsize 10

作用是将正文字体缩小到 10 磅(默认是 11 磅)。章节标题等其他元素的字体会相应缩小。该命令 只应@smallbook (参见 @smallbook: 印刷 “小开本” 书籍)或类似设置配合使用,因为在标准纸张(8.5×11 或 A4)上,10 磅字体会过小。

使用这条命令的一个原因是:减少页数,从而降低实体书的印刷成本。

Texinfo 目前 没有 提供切换字体族、或更通用的字号修改命令。

Texinfo 还提供了若干 字体命令 ,用于在印刷手册、以及(在支持的情况下)HTML 和 DocBook 输出中指定字体切换。这些命令对 Info 格式无效。所有命令都作用于紧跟其后、用大括号括起来的参数。

@b
选择 /bold face粗体/;
@i
选择 italic font斜体
@r
选择 roman font罗马字体 ,即正文的常规印刷字体,可能有衬线,也可能没有。
@sansserif
选择 sans serif font无衬线字体
@slanted
选择 slanted font倾斜体
@t
选择与 @code 相同的等宽打字机风格字体。

@r 命令在示例类环境中很有用,可以用标准罗马字体写注释,而不是使用等宽字体,在印刷版中效果更好。

例如:

@lisp
(+ 2 2)    ; @r{Add two plus two.}
@end lisp

会生成:

(+ 2 2)    ; Add two plus two.

@t 命令偶尔可用于在支持的环境中输出打字机字体,同时不需要在 Info 或纯文本中加引号区分。(对比 @t{foo} 输出 foo ,与 @code{foo} 输出 foo 。)适合用 @t 而非 @code 的场景:

  • 参数是单个字符
  • 参数外面已经有某种引号
  • 从上下文或参数本身就能明显看出是计算机相关内容(如新闻组名称)

一般来说,其他字体命令很少会用到;它们存在的主要目的,是为了能够在文档里描述特定字体效果的功能(例如 TeX 及其相关工具包)。

7. 引用与示例

引用和示例是由一个或多个完整段落组成的文本块,它们与正文主体区分开,并以不同方式处理。输出时通常会进行缩进。

在 Texinfo 中,你始终要在行首单独写一个 @-command 来开始一段引用或示例,并在行首单独写一个 @end command 来结束它。例如,以行首单独的 @example 开始一个示例,以行首单独的 @end example 结束该示例, @endexample 之间只保留一个空格。

7.1. 块包裹命令

以下是用于包裹文本块(也称为环境)的命令汇总。后续章节会对它们做更详细的说明。

@quotation
标记需要引用的文本。文本会自动换行、两侧缩进,默认以罗马字体显示。
@indentedblock
@quotation 类似,但文本仅左侧缩进。
@example
用于展示代码、命令等内容。文本以等宽字体显示,会缩进但不会自动换行。
@lisp
@example 类似,专门用于展示 Lisp 代码。文本以等宽字体显示,会缩进但不会自动换行。
@verbatim
标记需要原样输出的文本;不进行任何字符替换,所有命令均失效,直到遇到 @end verbatim 。文本以等宽字体显示,不缩进、不自动换行。多余空格与空行有效,制表符会展开。
@display
展示说明性文本。文本会缩进但不自动换行,不指定字体(默认使用罗马字体)。
@format
@display 类似(文本不自动换行、不指定字体),但不缩进。
@smallquotation
@smallindentedblock
@smallexample
@smalllisp
@smalldisplay
@smallformat
这些 @small... 系列命令与普通版功能一致,仅在支持的环境中以更小字号输出文本。
@flushleft
@flushright
文本不自动换行,分别左对齐或右对齐。
@raggedright
文本会自动换行,但仅左对齐,右侧边缘不齐。
@cartouche
通过绘制圆角方框高亮文本,常用于示例或引用。

@exdent 命令用于在上述结构中取消当前行的缩进。

@noindent 命令可用于上述结构之后(或任意段落开头),避免后续文本作为新段落自动缩进

7.2. @quotation: 块引用

引用文本的处理方式与普通文本相同(常规字体、自动换行),但有以下区别:

  • 左页边距向页面中心靠近,使整个引用块缩进;右页边距也可能向中心靠近
  • 段落首行缩进不超过其他行
  • 可使用 @author 命令指定引用的作者

    这是写在 @quotation 命令与 @end quotation 命令之间的文本示例。 @quotation 命令通常用于标记从其他(真实或假设的)印刷作品中摘录的文本。

@quotation 命令需单独占一行,该行不会出现在最终输出中。使用单独一行、仅包含 @end quotation 的语句标记引用结束,该行同样不会出现在输出中。

@quotation 接受一个可选参数,写在命令所在行的剩余部分。如果存在该参数,会以粗体或其他强调样式显示在引用开头,并后跟冒号 ‘:’ 。示例:

@quotation Note
This is
a foo.
@end quotation

输出效果:

Note: This is a foo.

如果 @quotation 的参数是以下英文单词(不区分大小写):Caution、Important、Note、Tip、Warning

则 DocBook 输出会使用对应的特殊标签(如 <note> ),而非默认的 <blockquote>

如果在 @quotation 块内使用 @author 命令指定了引用作者,会在引用末尾单独一行显示作者名:

@quotation
People sometimes ask me if it is a sin in the Church of Emacs to use
vi.  Using a free version of vi is not a sin; it is a penance.  So happy
hacking.

@author Richard Stallman
@end quotation

输出效果:

People sometimes ask me if it is a sin in the Church of Emacs to use vi. Using a free version of vi is not a sin; it is a penance. So happy hacking.

Richard Stallman

7.3. @indentedblock: 缩进文本块

@indentedblock 环境与 @quotation 类似,区别在于:文本 仅在左侧缩进 (且没有用于标注作者的可选参数)。因此,文本字体保持不变,内容会照常自动换行,但 左侧页边距会向内缩进

示例:这是一段写在 @indentedblock 命令与 @end indentedblock 命令之间的文本示例。 @indentedblock 环境中可以包含任意文本或其他所需命令。

其在 Texinfo 源文件中的写法如下:

@indentedblock
This is an example ...
@end indentedblock

7.4. @example: 示例文本块

@example 环境用于标明不属于正文的 计算机输入或输出内容 。如果需要在句子中嵌入代码片段,请改用 @code 命令或同类命令(参见 @code {sample-code})。

@example 命令需单独占一行,使用 @end example 标记块结束。例如:

@example
cp foo @var{dest1}; \
 cp foo @var{dest2}
@end example

会生成:

cp foo dest1; \
 cp foo dest2

输出采用 等宽字体缩进 。输入文件中的每一行对应输出中的一行;也就是说,源文本 不会自动换行 。多余的空格和空行 有效 。Texinfo 命令会被展开;如果希望输出 完全原样 ,请改用 @verbatim 环境(参见 @verbatim: 原样文本块)。

从逻辑上讲,示例通常位于段落 “中间”,后续接续的文本不应缩进,如上例所示。 @noindent 命令可避免文本像新段落一样被缩进(参见 @noindent: 省略缩进)。

如果希望代码注释使用普通罗马字体,可以使用 @r 命令(参见 打印用字体)。

可以为 @example 命令指定可选参数,多个参数用逗号分隔。在 HTML 输出中,这些参数会作为类名输出,前缀为字符串 ‘user-’。这可用于为手册中的代码示例添加语法高亮。

我们建议:为 @example 指定多个参数时, 第一个参数用来指明代码语言 (如 C、lisp、Cplusplus)。你也可以用其他参数实现格式提示、标记代码样例以便提取和处理等用途,但目前暂无明确统一的建议。这一点或许会在未来的 Texinfo 版本中改变。

注意: 不要在示例内容的行中使用制表符!(在 Texinfo 的其他位置也不要用,verbatim 环境除外。)TeX 会把制表符当作单个空格处理,和它们实际显示的效果不一致。

7.5. @verbatim: 原样文本块

@verbatim 环境用于输出可能包含 特殊字符或不应被解析的命令 的文本,比如计算机输入或输出内容( @example 会将其中文本当作普通 Texinfo 命令解析)。在 Texinfo 手册中嵌入自动生成的文件内容时,该环境尤其有用。

一般情况下,输出与输入完全一致。不会进行任何字符替换,例如:所有空格、空行(包括制表符)都有效。文本以 等宽字体 排版, 不缩进、不自动换行

@verbatim 命令需单独一行开头书写,该行不会出现在输出中。使用 @end verbatim 命令标记原样块结束,同样单独一行开头书写,该行也不会出现在输出中。

示例:

@verbatim
{
<tab>@command with strange characters: @'e
expand<tab>me
}
@end verbatim

(其中 <tab> 代表一个实际的制表符)。将会输出:

{
        @command with strange characters: @'e
expand  me
}

由于包含 @verbatim@end verbatim 的行不产生输出,通常应在 @verbatim 前、 @end verbatim 后各加一个空行。 @verbatim 起始与 @end verbatim 结束之间的空行会保留在输出中。

可以通过将 @verbatim 放入 @smallformat 环境中来得到小号的原样文本,如下所示:

@smallformat
@verbatim
... 仍然是原样输出,但字号更小 ...
@end verbatim
@end smallformat

最后提醒一句:在其他 Texinfo 结构内部使用 @verbatim 是不可靠的。

另见: @verbatiminclude file: 原样包含文件

7.6. @lisp: Lisp 代码示例

@lisp 命令用于书写 Lisp 代码:

@lisp
Example lisp code
@end lisp

该命令现在与以下写法完全等效:

@example lisp
Example lisp code
@end example

建议使用 @lisp ,以保留示例类型相关的信息。例如,当你编写一个函数,仅处理且完整处理 Texinfo 文件中的所有 Lisp 代码时,这会很有用。这样你就可以把 Texinfo 文件当作 Lisp 库来使用

7.7. @display: 正文字体示例块

@display 命令用于开启另一类环境,该环境中 字体保持不变 ,不会像 @example 那样切换为等宽字体。输入的每一行仍会对应输出一行,且输出内容仍会缩进。

这是一段写在 @display 命令
和 @end display 命令的文本示例。@display 命令
会对文本进行缩进,但不会自动换行重排

7.8. @format: 整行宽度示例

@format 命令与 @display 类似,区别在于 文本不缩进 。与 @display 一样,它不会使用等宽字体。因此:

@format
This is an example of text written between a @code{@@format} command
and an @code{@@end format} command.  As you can see
from this example,
the @code{@@format} command does not fill the text.
@end format

会输出:

This is an example of text written between a @format command
and an @end format command.  As you can see
from this example,
the @format command does not fill the text.

7.9. @exdent: 取消行缩进

@exdent 命令用于移除一行可能存在的所有缩进。该命令需写在 行首 ,且仅对 同一行内 命令之后的文本生效。不要在文本两侧加大括号。在输出格式允许的情况下, @exdent 所在行的文本会以罗马字体显示。

@exdent 通常用于示例内部。例如:

@example
This line follows an @@example command.
@exdent This line is exdented.
This line follows the exdented line.
The @@end example comes on the next line.
@end example

会输出:

This line follows an @example command.
This line is exdented.
This line follows the exdented line.
The @end example comes on the next line.

在实际使用中, @exdent 命令很少用到。通常,你可以通过结束示例环境、让页面恢复正常宽度来取消文本缩进。

@exdent 并非在所有输出格式中都生效。

7.10. @flushleft@flushright: 左对齐 / 右对齐

@flushleft@flushright 命令分别使文本行 靠左对齐、靠右对齐,但不会自动换行重排 。这些命令单独成行,不使用大括号。 @flushleft@flushright 分别由单独成行的 @end flushleft@end flushright 结束。

示例:

@flushleft
This text is
written flushleft.
@end flushleft

输出:

This text is written flushleft.

@flushright 产生的对齐效果常用于信件的回信地址。例如:

@flushright
Here is an example of text written
flushright.  The @code{@flushright} command
right justifies every line but leaves the
left end ragged.
@end flushright

输出:

Here is an example of text written flushright. The @flushright command right justifies every line but leaves the left end ragged.

7.11. @raggedright: 右不齐平文本

@raggedright 会像平常一样对文本进行自动换行,但只在 左侧对齐 ,右侧边缘保持不齐平。该命令单独占一行,不使用大括号,以单独一行的 @end raggedright 结束。此命令仅在默认两端对齐的输出格式中生效;在默认就是右不齐平的格式(如 Info 或 HTML)中无效。

当段落里包含一长串命令名,且预先知道两端对齐会让排版很难看时, @raggedright 会很有用。

示例(摘自本手册其他部分):

@raggedright
Commands for double and single angle quotation marks:
@code{@@guillemetleft@{@}}, @code{@@guillemetright@{@}},
@code{@@guillemotleft@{@}}, @code{@@guillemotright@{@}},
@code{@@guilsinglleft@{@}}, @code{@@guilsinglright@{@}}.
@end raggedright

输出效果:

Commands for double and single angle quotation marks: @guillemetleft{}, @guillemetright{}, @guillemotleft{}, @guillemotright{}, @guilsinglleft{}, @guilsinglright{}.

7.12. @noindent: 取消缩进

示例或其他插入内容可能会把段落分成几段。通常情况下,格式化工具会把示例后面的文本当作新段落来缩进。你可以在行首、接续文本之前写上 @noindent逐个取消 这种缩进。也可以用 @paragraphindent 全局取消所有段落的缩进(参见 @paragraphindent: 控制段落缩进)。

下面示例展示了如何取消 @example 之后文本的默认缩进,这是很常见的场景:

@example
This is an example
@end example

@noindent
This line is not indented.  As you can see, the
beginning of the line is fully flush left with the
line that follows after it.

输出效果:

This is an example
This line is not indented.  As you can see, the
beginning of the line is fully flush left with the
line that follows after it.

@noindent 的标准用法如上所示:在本应成为段落的开头,取消该处的默认缩进。它可以紧跟文本,也可以单独占一行。 不应该 在其他场景使用,比如段落中间或某个环境内部(参见 引用与示例)。

你可以通过修改输入来控制 Info 文件输出中的空行数量:只包含 @noindent 的行不会生成空行,环境的 @end 行也不会。

不要在 @noindent 命令后加大括号;不需要使用大括号,因为 @noindent 是用在段落之外的命令(参见 @-Command 语法)。

7.13. @indent: 强制缩进

作为对 @noindent 命令的补充(见上一节),Texinfo 提供了 @indent 命令,用于 强制让段落缩进 。例如,本节的第一段就是使用 @indent 命令进行缩进的。

实际上, @indent 最常用于 章节的第一段 ,用来覆盖该处默认不缩进的行为(参见 @paragraphindent: 控制段落缩进)。它可以紧跟文本,也可以单独占一行。

作为一种特殊情况,当在 不自动换行 的环境中使用 @indent 时,它会在 TeX 输出中生成一个段落缩进空格。(这类环境中输入的一行对应输出的一行,例如 @example@display ;所有环境的汇总,参见 块包裹命令。)

不要在 @indent 命令后加大括号;该命令不需要大括号,因为 @indent 是用在段落之外的命令(参见 @-Command 语法)。

7.14. @cartouche: 圆角方框

在输出格式支持的情况下, @cartouche 命令会为其内容绘制一个 圆角方框 。你可以使用该命令将手册中的一部分内容与正文分隔开,也可以用它进一步突出示例或引用。

例如,你可以在手册中用圆角框包裹某类示例以强调。示例:

@cartouche
@example
% pwd
/usr/local/share/emacs
@end example
@end cartouche

在印刷版手册中,会为这两行示例添加一个圆角方框。

示例的输出效果如下(如果你在 Info 中阅读, @cartouche 不会生效):

% pwd
/usr/local/share/emacs

@cartouche 接受一个可选参数,写在命令所在行的剩余部分。如果提供该文本,它会作为圆角框的标题,以粗体或其他强调样式显示在框的开头,在部分输出格式中会居中。

下面示例演示带标题的圆角框:

@cartouche Important
Text explaining something important out of the main
flow of the text.
@end cartouche

带标题的圆角框效果如下:

Important

Text explaining something important out of the main flow of the text.

在印刷输出中,圆角框内容会保持在同一页内,与 @group 类似(参见 @group: 防止分页)。

7.15. @small: 系列块命令

除了常规的 @example 及类似命令外,Texinfo 还提供了 “小型” 示例风格命令,包括: @smallquotation@smallindentedblock@smalldisplay@smallexample@smallformat@smalllisp

在大多数输出格式中, @small… 系列命令与其对应的普通命令效果相同。

但在 印刷输出 中, @small… 命令会使用比普通示例命令 更小的字号 排版文本。例如,代码示例可以容纳更长的行,且无需重写就能适配页面宽度。

使用对应的 @end small… 标记 @small… 块的结束。例如, @smallexample 需与 @end smallexample 配对使用。

下面是 @smallexample 命令所用字体的示例(在大多数输出格式中,效果与普通写法一致):

... to make sure that you have the freedom to
distribute copies of free software (and charge for
this service if you wish), that you receive source
code or can get it if you want it, that you can
change the software or use pieces of it in new free
programs; and that you know you can do these things.

@small… 命令与其普通版本使用 相同的字体样式@smallexample@smalllisp 使用等宽字体,其余命令使用常规字体。它们在其他方面的行为也保持一致 —— 是否自动换行、是否缩小页边距等。不过,即使普通版本命令支持参数, @small… 系列命令 也不接受任何参数

通用原则 :若无特殊需求,建议直接使用常规命令(例如用 @example 而非 @smallexample )。仅使用 texinfo.tex 处理时,可通过 ‘ @set dispenvsize small ’ 实现类似效果,该指令会为 @example 等环境统一使用更小字号。在 HTML 输出中,如需调整环境的字号,可通过 CSS 设置;详见 HTML CSS

8. 列表与表格

Texinfo 提供多种创建列表和表格的方式。列表可以是项目符号列表或编号列表;双列表格可以突出显示第一列中的条目;同时也支持多列表格。

8.1. 列表介绍

Texinfo 会自动对列表或表格中的文本进行缩进,并为 有序列表 自动编号。如果你修改了列表,这个自动编号功能会非常实用,因为你 不需要手动重新编号

编号列表和表格以行首对应的 @-command 开始,以单独一行的对应 @end 命令结束。表格和项目符号列表命令还要求,在起始 @-command 的同一行上书写格式控制信息。

例如:

  • 使用 @enumerate 命令开始有序列表,用 @end enumerate 结束。
  • 使用 @itemize 命令开始项目符号列表,并在同一行后跟格式命令(如 @bullet ),用 @end itemize 结束。

列表中的每一项,都要以 @item@itemx 命令开头。

下面是不同类型列表与表格的项目符号列表示例:

  • 带或不带项目符号的无序列表。
  • 使用数字或字母的有序列表。
  • 带高亮效果的双列表格。

下面是包含相同内容的有序列表示例:

  1. 带或不带项目符号的无序列表。
  2. 使用数字或字母的有序列表。
  3. 带高亮效果的双列表格。

下面是包含相同内容及其对应 @-command 的双列表格:

@itemize
带或不带项目符号的无序列表。
@enumerate
使用数字或字母的有序列表。
@table
@ftable
@vtable
可选择建立索引的双列表格。

8.2. @itemize: 创建无序列表

@itemize 命令用于生成一组 “items”(项目),每个项目在左侧边距内以项目符号或其他标记开头,并且通常会缩进。

在行首写 @itemize 来开始一个项目符号列表。在该命令的 同一行 后面,跟上一个 Texinfo 命令或字符来生成项目标记。通常会在 @itemize 后使用 @bullet (实心圆点),但你也可以使用 @minus (减号)或其他任意 Texinfo 命令或字符。如果不指定标记命令,默认使用 @bullet

@itemize 之后编写你的项目,每个项目以 @item 开头。文本可以跟在 @item 同一行。一个项目的文本可以跨多个段落。

下面是 @itemize 的使用示例:

@itemize @bullet{}
@item
Some text for foo.

@item
Some text
for bar.
@end itemize

效果如下:

  • Some text for foo.
  • Some text for bar.

当你把 @bullet 这类标记命令作为 @itemize 的参数时,通常可以省略命令后面的 ‘{}’。

如果你完全不想要任何标记,但仍需要逻辑上的项目,可以使用 @w{} (这种情况下 必须写大括号 )。

@itemize 环境内部至少要有一个 @item 。如果一个都没有, texi2any 会给出警告。如果你只想要缩进文本而不是项目列表,请使用 @indentedblock ;详见 @indentedblock: 缩进文本块

出现在 @item 紧前方的索引条目,会与该 @item 关联。

通常你应该在项目之间留一个空行,这会在 Info 文件中产生空行(TeX 无论如何都会自动插入合适的垂直间距)。除非条目非常简短,否则这些空行会让列表更美观。

项目符号列表可以 嵌套 在其他项目符号列表中。下面是一个用减号标记的列表嵌套在圆点标记的列表中的示例:

@itemize @bullet{}
@item
First item.

@itemize @minus{}
@item
Inner item.

@item
Second inner item.
@end itemize

@item
Second outer item.
@end itemize

效果如下:

  • First item.
    • Inner item.
    • Second inner item.
  • Second outer item.

8.3. @enumerate: 创建数字或字母编号列表

@enumerate@itemize 用法类似(参见 @itemize: 创建项目符号列表),区别在于:项目的标记是连续的数字或字母,而非项目符号。

在行首书写 @enumerate 命令。该命令 不需要必选参数 ,但可以接受一个数字或字母作为可选参数。

  • 不带参数时,@enumerate 从数字 ‘1’ 开始编号。
  • 带数字参数(如 ‘3’)时,从该数字开始编号。
  • 带大写或小写字母参数(如 ‘a’ 或 ‘A’)时,从该字母开始编号。

编号列表的文本写法与项目符号列表相同:每个项目开头用一行 @item 起始。文本可以紧跟在 @item 同一行,单个项目的文本也可以跨多个段落。

建议在列表条目之间空一行,这通常能让 Info 文档更易读。

下面是不带参数的 @enumerate 示例:

@enumerate
@item
Underlying causes.

@item
Proximate causes.
@end enumerate

效果如下:

  1. Underlying causes.
  2. Proximate causes.

下面是带参数 3 的示例:

@enumerate 3
@item
Predisposing causes.

@item
Precipitating causes.

@item
Perpetuating causes.
@end enumerate

效果如下:

  1. Predisposing causes.
  2. Precipitating causes.
  3. Perpetuating causes.

用法总结:

@enumerate
不带参数:生成数字列表,第一项从 1 开始。
@enumerate unsigned-integer
无符号整数带(无符号)数字参数:从该数字开始生成编号列表,可用于接续被其他文本打断的列表。
@enumerate upper-case-letter
大写字母带大写字母参数:生成字母编号列表,从该大写字母开始。
@enumerate lower-case-letter
小写字母带小写字母参数:生成字母编号列表,从该小写字母开始。

你也可以像大纲一样 嵌套 使用编号列表。

8.4. 创建双列表格

@table@itemize 用法类似(参见 @itemize: 创建项目符号列表),但允许你为每个项目指定名称或标题行。 @table 命令用于生成双列表格,特别适用于术语表、说明性示例和命令行选项汇总。

8.4.1. 使用 @table 命令

使用 @table 命令可以生成 双列表格 。该命令通常用于展示一组项目及每个项目对应的简短说明,例如定义列表。

在空行之后,于行首书写 @table 命令,并在 同一行 跟随一个 标记命令 作为参数,例如 @code@samp@var@option@kbd (参见《标记定义、命令等》)。该命令会作用于第一列的文本。例如, @table @code 会让第一列文本的输出效果,等同于将其作为 @code 命令的参数。

你可以将 @asis 命令作为 @table 的参数。 @asis 是一个无额外效果的命令:如果在 @table 后使用该命令,第一列条目将 原样输出 ,不添加任何高亮样式。

@table 命令也可与此处未明确列出的其他命令配合使用。但你只能使用 带大括号参数 的预定义 Texinfo 命令。无法可靠使用通过 @macro 定义的新命令,不过指向合适预定义命令的 @alias 是可以的。参见《定义新的 Texinfo 命令》。

每个表格条目以行首的 @item 命令开始。

  • @item 同一行的内容为第一列文本。
  • 第二列文本写在 @item 所在行的下一行及后续行中。

    你可以写任意多行说明文本,甚至多个段落。但只有与 @item 同行的内容会被放入第一列(包括脚注)。第二列若为空,无需输入任何内容。

通常应在表格条目之间空一行,这会在 Info 文件中产生空行,使排版更美观(条目极短时除外)。

用一行单独的 @end table 结束表格。为保证各输出格式排版一致,在表格结束后应另起一空行。

例如,下面的表格使用 @samp 命令高亮第一列文本:

@table @samp
@item foo
This is the text for
@samp{foo}.

@item bar
Text for @samp{bar}.
@end table

输出效果:

‘foo’
This is the text for ‘foo’.
‘bar’
Text for ‘bar’.

如果你希望用 同一段文本 说明两个或多个命名项目,请使用 @itemx 命令。(参见 @itemx: 第二个及后续项目。)

@display 内部 不支持 嵌套 @table 命令(见使用 @table 命令)。因为 @display 是面向行的环境,二者一起使用没有实际意义。若想对表格进行缩进,可尝试使用 @quotation (参见 @quotation: 块引用)或 @indentedblock (参见 @indentedblock: 缩进文本块)。

8.4.2. @ftable@vtable

@ftable@vtable 命令与 @table 命令基本相同,区别在于:

  • @ftable 会自动将表格第一列中的每一项加入函数索引;
  • @vtable 会自动将表格第一列中的每一项加入变量索引。

这简化了创建索引的工作。只有与 @item@itemx 命令位于同一行的条目才会被编入索引,且索引中的格式与该行显示的内容完全一致。有关索引的更多信息,请参见《索引》章节。

使用 @ftable@vtable 开始双列表格时,需将该 @-command 写在行首,同一行后紧跟一个 Texinfo 命令(如 @code )作为参数,用法与 @table 命令完全一致;并单独使用一行的 @end ftable@end vtable 命令结束表格。

示例可参考上一节中的 @table 示例。

术语说明(便于你写文档) @ftable:函数索引表格 @vtable:变量索引表格 @item / @itemx:表格项命令 index:索引 two-column table:双列表格

8.4.3. @itemx: 第二个及后续表项

当同一个表格项在 第一列 中有 两个或多个条目 ,且每个条目需要单独占一行时,可在表格内使用 @itemx 命令。

第一个条目使用 @item ,后续所有条目使用 @itemx@itemx 必须紧跟在 @item 命令之后, 中间不能有空行

@itemx 的用法与 @item 完全一致,区别仅在于:在部分输出格式中,它不会在第一列文本上方生成多余的垂直间距。如果有多个连续的 @itemx 命令,它们之间 不要插入空行

示例:

@table @code
@item upcase
@itemx downcase
These two functions accept a character or a string as
argument, and return the corresponding uppercase (lowercase)
character or string.
@end table

效果如下:

upcase
downcase
这两个函数接受字符或字符串作为参数,并返回对应的大写(小写)字符或字符串。

(另请注意:本示例同时展示了双列表格中支持多行说明文本的写法。)

8.5. @multitable: 多列表格

@multitable 用于创建任意列数的表格,每一列均可自定义宽度。

@multitable 所在行定义列宽,表格中每一行实际内容以 @item 命令开头,列与列之间用 @tab 命令分隔。最后以 @end multitable 结束表格。具体用法见后续小节。

8.5.1. 多列表格列宽

你可以用两种方式为多列表格定义列宽:按行宽的比例指定,或使用 原型行 指定。不支持混合使用这两种方式。无论哪种方式,列宽都必须在 @multitable 命令所在的同一行上完整定义。

  1. 要按行宽比例指定列宽,可在 @multitable 命令后书写 @columnfractions 与小数(通常小于 1;开头的 0 可写,会被忽略),例如:

    @multitable @columnfractions .33 .33 .33
    

    这些比例之和不必精确等于 1.0,上面的例子就是如此。这样可以生成不需要占满整行宽度的表格。

    使用 @columnfractions 时,最左侧的列看起来可能会比预期略宽于其他列。这是因为列与列之间的间距被算在了其他列的宽度里。

    例如,见结构命令的类型

    @multitable @columnfractions .19 .30 .29 .22
    @item                        @tab                              @tab                       @tab No new page
    @item @i{Numbered}           @tab @i{Unnumbered}               @tab @i{Lettered/numbered} @tab @i{Unnumbered}
    @item In contents            @tab In contents                  @tab In contents           @tab Not in contents
    @item                        @tab @code{@@top}                 @tab                       @tab @code{@@majorheading}
    @item @code{@@chapter}       @tab @code{@@unnumbered}          @tab @code{@@appendix} @tab @code{@@chapheading}
    @item @code{@@section}       @tab @code{@@unnumberedsec}       @tab @code{@@appendixsec} @tab @code{@@heading}
    @item @code{@@subsection}    @tab @code{@@unnumberedsubsec}    @tab @code{@@appendixsubsec} @tab @code{@@subheading}
    @item @code{@@subsubsection} @tab @code{@@unnumberedsubsubsec} @tab @code{@@appendixsubsubsec} @tab @code{@@subsubheading}
    @end multitable
    
    No new page
    NumberedUnnumberedLettered/numberedUnnumbered
    In contentsIn contentsIn contentsNot in contents
    @top@majorheading
    @chapter@unnumbered@appendix@chapheading
    @section@unnumberedsec@appendixsec@heading
    @subsection@unnumberedsubsec@appendixsubsec@subheading
    @subsubsection@unnumberedsubsubsec@appendixsubsubsec@subsubheading
  2. 要使用原型行指定列宽,可在 @multitable 命令后用大括号分别写出每一列的 最长内容 。例如:

    @multitable {some text for column one} {for column two}
    

    这样第一列的宽度就会等于排版后 “some text for column one” 的宽度,第二列则等于 “for column two” 的宽度。

    原型行里的内容不必出现在表格正文中。

    尽管本例中只用了普通文本,但原型行里可以包含 Texinfo 命令;像 @code 这类标记命令尤其实用。

    原型行在 HTML 输出中不生效。

8.5.2. 多列表格行

在使用 @multitable 命令定义好列宽度之后(见上一节),你需要以 @item 开头来书写多列表格主体中的每一行,并使用 @tab 分隔各列内容。表格主体内的换行符没有特殊含义,你可以根据需要在源文件中随意折行。

你也可以使用 @headitem 代替 @item 来生成 表头行 。在 TeX 输出中,这样的行会以 粗体 显示;在 HTML 和 DocBook 输出中会使用 <thead> 标签;在 Info 格式中,表头行下方会自动生成一条由减号(‘-’)组成的分隔线。

@headitem 行中的内容需要在模板中使用时,可以在模板里使用 @headitemfont 命令。它是 @b 的同义词,但使用 @headitemfont 可以避免对特定字体样式的依赖,以防将来我们提供修改字体样式的方式。

下面是一个完整的多列表格示例(文字摘自《GNU Emacs 手册》,见该手册中的 “分割窗口” 章节):

@multitable @columnfractions .15 .45 .4
@headitem Key @tab Command @tab Description
@item C-x 2
@tab @code{split-window-vertically}
@tab Split the selected window into two windows,
with one above the other.
@item C-x 3
@tab @code{split-window-horizontally}
@tab Split the selected window into two windows
positioned side by side.
@item C-Mouse-2
@tab
@tab In the mode line or scroll bar of a window,
split that window.
@end multitable

生成效果如下:

KeyCommandDescription
C-x 2split-window-verticallySplit the selected window into two windows, with one above the other.
C-x 3split-window-horizontallySplit the selected window into two windows positioned side by side.
C-Mouse-2In the mode line or scroll bar of a window, split that window.

9. 特殊显示

本章中的命令可用于编写 特殊显示效果 的文本(在输出格式支持的前提下),使其脱离文档的常规排版流。

其中一类命令用于创建 floats浮动元素 ,即图表、表格等与正文分隔开的内容,它们可以带有编号、标题,或被文档其他位置引用。这类显示中常会包含图片。

另一组命令用于在 Texinfo 中创建 脚注

9.1. 浮动元素

浮动元素(float)是与正文分隔开的显示块,通常会标注为 “Figure”(图)、“Table”(表)、“Example”(示例) 或类似类型。

它之所以被称为 “float(浮动)”,是因为在打印输出时,理论上可以被移动到当前页的顶部、底部或后续页面(在其他输出格式中浮动并无意义)。但遗憾的是,除 LaTeX 外,其他所有输出格式目前均未实现浮动功能,浮动内容只会在当前位置输出,效果近似于 @group 命令(参见 @group: 防止分页)。

9.1.1. @float [ type ][, label ]: 浮动内容

要生成浮动内容,需将需要独立显示的内容,放在单独成行的 @float@end float 命令之间。

浮动内容常使用 @image 插入已有的图片(参见 “插入图片”),或使用 @multitable 展示表格(参见 “ @multitable: 多列表格”)。不过浮动块内可以放置任意内容。下面是一个使用纯文本的示例:

@float Figure,fig:ex1
This is an example float.
@end float

输出效果:

This is an example float.

Figure 9.1

如示例所示, @float 接受两个参数(用逗号分隔): type类型label标签 ,两者均为可选。

type
(类型)指定该浮动内容的类别;通常是 “Figure图”、“Table表” 等词汇。如果不指定类型,只指定标签,则交叉引用时只会显示纯数字。
label

(标签)指定该浮动内容的交叉引用标签。如果提供标签,该浮动内容会 自动编号 ,并会出现在 @listoffloats 生成的列表中(参见 “ @listoffloats: 浮动元素目录”)。允许使用标签进行交叉引用,例如:‘see @ref{fig:ex1}’ 会输出:见Figure 9.1

反之,如果 不提供标签 ,则浮动内容 不会编号 ,也不会出现在 @listoffloats 列表中,且无法被交叉引用。

通常情况下,会同时指定类型和标签,以得到带标题、带编号的浮动块。

在 LaTeX 输出中,如果文档里存在 @float ,会在导言区自动加载 float 宏包。类型为 ‘figure’ 或 ‘table’(不区分大小写)的 @float 由该宏包预定义。其他类型会自动定义新的浮动环境,名称基于 @float 类型,只保留字母与连字符。

在 Texinfo 中,所有浮动内容的编号规则统一:章节号。浮动块序号(序号从 1、2、3…… 依次递增,每章重新计数)。 不同类型的浮动块分别独立编号

位于 @unnumbered (无编号章节)内或任何章节之外的浮动块,直接从 1 开始连续编号。

这些编号规则目前 不可修改

9.1.2. @caption & @shortcaption: 标题与短标题

你可以在 @float 环境内的任意位置使用 @caption 命令,为该浮动元素定义标题。此命令 不允许 在其他场景下使用。 @caption 接收一个用大括号包裹的参数。示例如下:

@float
An example float, with caption.
@caption{Caption for example float.}
@end float

输出效果:

An example float, with caption.

Caption for example float.

@caption 可以出现在浮动元素内的任意位置,直到 @end float 才会被处理。标题文本通常为一两句话,必要时也可包含多个段落。

在输出结果中,标题 始终显示在浮动元素下方 ,目前这一位置不可更改。标题前会自动加上 @float 命令中指定的类型或编号(参见上一节)。

@shortcaption 命令同样 只能@float 内部使用,也接收一个用大括号包裹的参数。短标题会替代普通标题,出现在浮动元素列表中(见下一节)。这样你就可以为正文设置长标题,为目录列表设置短标题。例如:

@float
... 同上 ...
@shortcaption{Text for list of floats.}
@end float

@shortcaption 的文本不允许包含注释( @c )、逐字文本( @verb )、 @example 环境、脚注(@footnote)、多段落或其他复杂结构。如果没有搭配 @shortcaption@caption 也受同样限制。在 LaTeX 中,若没有 @shortcaption ,多段落的 @caption 在排版时会报错。

9.1.3. @listoffloats: 浮动元素目录

你可以使用 @listoffloats 命令为 指定类型的浮动元素 生成列表(参见 @float [ type ][, label ]: 浮动内容)),用法类似于文档的总目录。通常,该命令写在独立的 @unnumbered 节点中,以便提供标题和结构,这一点与 @printindex 类似(参见《打印索引与菜单》章节)。

@listoffloats 接受一个 可选参数 ,即浮动元素类型。示例:

@node List of Figures
@unnumbered List of Figures
@listoffloats Figure

如果不带任何参数, @listoffloats 会为 未指定类型 的浮动元素(即 @float 命令没有第一个参数)生成列表。

使用本章前面的示例图, @listoffloats 的输出大致如下:

Figure 9.1

通常,浮动元素列表中的每一行会包含:

  • 浮动元素类型(如果有)
  • 浮动元素编号
  • 标题(若定义了 @shortcaption ,则使用短标题;否则使用 @caption

根据输出格式不同,还可能包含页码。

无编号的浮动元素 (即没有交叉引用标签的浮动元素)不会出现在列表中。

@listoffloats 的排版格式取决于输出格式。例如在 Info 中,它会被格式化为菜单。

在 LaTeX 输出中:

  • 类型为 ‘figure’(不区分大小写)时,输出 \listoffigures
  • 类型为 ‘table’(不区分大小写)时,输出 \listoftables
  • 其他类型则输出对应的 \listof 命令。

9.2. 插入图片

你可以使用 @image 命令插入外部文件中的图片。尽管图片可以用在任何位置(包括段落中间),但我们放在本章介绍,因为它们最常作为显示图表或示例的一部分出现。

9.2.1. 图片语法

@image 命令的语法概要如下:

@image{filename[, width[, height[, alttext[, extension]]]]}

filename 参数为必选,且 不能带文件扩展名 ,因为不同的处理程序支持不同的格式:

  • TeX(DVI 输出)读取 filename.eps(封装 PostScript 格式)。
  • TeX(PDF 输出)按顺序读取 filename.pdf、 filename.png、 filename.jpg 或 filename.jpeg,同时也会尝试扩展名的大写版本。PDF 格式不支持 EPS 图片,因此这类图片必须先转换格式。
  • 在 Info 中,会原样包含 filename.txt(效果近似于 @verbatim )。Info 输出中还可能包含对 filename.png 或 filename.jpg 的引用。
  • 在 HTML 中,按顺序输出对 filename.png、 filename.jpg、 filename.jpeg 或 filename.gif 的引用。如果这些文件都不存在,会报错,但仍会输出对 filename.jpg 的引用。
  • 在 DocBook 中,会为找到的每个文件输出对 filename.eps、 filename.gif、 filename.jpeg、 filename.jpg、 filename.pdf、 filename.png 和 filename.svg 的引用。如果存在 filename.txt,也会原样包含其中内容。
  • 对于 LaTeX,使用不带扩展名的 filename,后续的 LaTeX 处理程序会自动选择合适的图片类型。
  • 对于 Info 和 HTML 输出,如果指定了 @image 的第五个可选参数 extension 且对应文件存在,则会使用该参数作为文件扩展名。扩展名中应包含开头的句点。例如:

    @image{foo,,,,.xpm}
    

如果你希望安装图片文件供 Info 阅读器使用,建议为软件包 foo 创建类似 ‘foo-figures’ 的子目录存放图片,并在 Makefile 中将文件复制到 $(infodir)/foo-figures/

width (宽度)和 height (高度)参数将在下一节说明。

如果图片是一个段落的开头,且后面还有其他文本,应在 @image 命令前使用 @indent@noindent 来指定段落缩进格式,这对 TeX 输出获得正确的段落缩进尤为重要。

使用 @center 可以让图片居中(参见 @titlefont@center@sp )。

对于 HTML 输出,行内图片的 alt 属性 会被设置为 @image 的第四个可选参数 alttext (替代文本);如果未提供,则使用图片的完整文件名。 alttext 会作为 Texinfo 文本处理,因此特殊字符如 ‘"’、‘<’ 和 ‘&’ 会在 HTML 输出中被转义;你也可以用 @- (无输出命令)来生成空的 alt 字符串。参见《 @-@hyphenation: 打印输出中的断词》。

对于 Info 输出, alttext 同样会作为 Texinfo 文本处理并输出,其中 \ 会被转义为 \\" 会被转义为 \" ,不做其他转义。

在 Info 输出中,如果存在对应的二进制图片文件,会输出对它的引用(按顺序尝试: filename + extension.extension.png.jpg );如果存在 .txt 文件,也会原样包含。这样,支持显示图片的 Info 阅读器(如 Emacs 下的 Info 浏览器)可以显示图片,而仅支持纯文本的 Info 阅读器(如独立版 Info 阅读器)则可以显示文本版本。

9.2.2. 图片缩放

@image 命令中的可选参数 width (宽度) 和 height (高度)(见上一节)用于指定图片的缩放尺寸。它们 仅在打印输出中生效

在 TeX 中:

  • 如果两者都不指定,图片按 原始尺寸 显示(以文件内定义为准);
  • 如果只指定其中一个,另一个会按比例自动缩放;
  • 如果两者都指定,则严格按给定值显示,这可能会改变图片的宽高比,导致 变形

宽度和高度可以使用任意合法的 TeX 长度单位,包括:

pt
point点(72.27pt = 1in)
pc
pica派卡(1pc = 12pt)
bp
big point大点(72bp = 1in)
in
inch英寸
cm
centimeter厘米(2.54cm = 1in)
mm
millimeter毫米(10mm = 1cm)
dd
didot point迪多点(1157dd = 1238pt)
cc
clero西塞罗(1cc = 12dd)
sp
scaled point微点(65536sp = 1pt)

例如,下面的命令会将文件 ridt.eps 缩放到高度 1 英寸,宽度按比例自动适配:

@image {ridt,,1in}

要让 @image 在 TeX 中正常工作,必须确保 epsf.tex 文件已安装在 TeX 可识别的路径中。(标准路径为 texmf/tex/generic/dvips/epsf.tex ,其中 texmf 是 TeX 目录树的根目录。)该文件包含在 Texinfo 发行版中,也可从 ftp://tug.org/tex/epsf.tex 等位置获取。

@image 既可以用于行内,也可以用于独立显示的图片。因此,如果你希望图片单独成行,务必在命令前加一空行,否则输出内容会与前面的文本连在一起。

图片缩放功能 目前只在打印输出中实现 ,其他类型的输出暂不支持。

9.3. 脚注

脚注用于对正文进行 佐证或解释说明5

脚注会分散读者注意力,应尽量少用,最好完全避免。标准的文献引用通常更适合放在文档末尾的参考文献列表中,而不是分散在各处脚注里。

9.3.1. 脚注命令

在 Texinfo 中,脚注使用 @footnote 命令创建。该命令后紧跟左大括号,然后是脚注文本,最后以右大括号结束。脚注长度不限(必要时会跨页分页),但通常较短。模板如下:

普通文本 @footnote{脚注文本}

如上所示, @footnote 命令应紧跟在需要注释的文本之后,中间不能有空格;否则脚注标记可能会出现在行首。

例如,这个分句后面就带有一个示例脚注6;在 Texinfo 源文件中写法如下:

...a sample footnote@footnote{Here is the sample
footnote.}; in the Texinfo source...

可以看到,源文件中会出现两个相邻的标点符号;本例中是 ‘.};’ 这样的序列。这是正常的(前者用于结束脚注,后者属于被注释句子的标点),所以不必担心写法看起来奇怪。(另一种完全可用的风格是:把脚注放在句子标点之后,例如 ‘;@footnote{…’。)

在打印输出格式中,脚注的引用标记是上标小数字;脚注文本显示在页面底部,横线下方。

在 Info 格式中,脚注引用标记是一对括号包裹数字,形如 ‘(1)’。如果脚注被放在单独的节点中,引用标记后会带有指向脚注文本的交叉引用链接(参见脚注样式)。

在 HTML 输出中,脚注引用通常标记为上标小数字,并作为超链接指向脚注文本。

脚注不能嵌套,也不能出现在任何类型的章节标题或其他 “非常规” 位置。

最后提示:在 @table@item 命令参数中的脚注,必须与 @item 完全位于同一行(常规要求)。参见创建双列表格

9.3.2. 脚注样式

在线格式支持两种脚注样式,用于决定脚注文本的存放位置:‘end’(末尾) 样式与 ‘separate’(独立) 样式。

‘end’

在 Info 格式中,采用 “末尾节点” 样式时,单个节点的所有脚注都会放在该节点的末尾。脚注与节点其他内容之间,会用一条包含 “Footnotes(脚注)” 文字的虚线分隔。每条脚注都以 ‘(n)’ 形式的引用标记开头。

下面是 Info 输出中,节点末尾样式下单个脚注的示例:

--------- Footnotes ---------

(1)  Here is a sample footnote.

在 HTML 中,如果脚注样式为 ‘end’,或输出文件未拆分,脚注会放在每个输出文件的末尾。

‘separate’

在 Info 格式中,采用 “独立节点” 样式时,单个节点的所有脚注会放在自动生成的独立节点中。在这种样式下,正文里每个 ‘(n)’ 引用标记后面都会附带一个 “footnote reference脚注引用”,它实际上是一个可跳转到脚注节点的交叉引用。

存放脚注的节点名,是在原节点名后加上 ‘-Footnotes’ 构成。(因此,“Footnotes” 节点对应的脚注节点就是 Footnotes-Footnotes!)脚注节点的 Up 指针会指回其父节点。

本手册中第一条脚注在 Info 独立节点样式下的效果如下:

File: texinfo.info  Node: Overview-Footnotes, Up: Overview

(1) The first syllable of "Texinfo" is pronounced like
"speck", not "hex". ...

在 HTML 中,如果脚注样式为 ‘separate’ 且输出已拆分,脚注会放在 单独的文件 中。

除非你的文档包含很长且很重要的脚注(如吉本的《罗马帝国衰亡史》等),否则我们推荐使用 ‘end’ 样式,对读者来说更简单易用。

使用 @footnotestyle 命令指定脚注样式。将该命令写在行首,后面跟上参数:‘end’ 表示节点末尾样式,‘separate’ 表示独立节点样式。

示例:

@footnotestyle end

@footnotestyle separate

请将 @footnotestyle 命令写在 Texinfo 文件的导言区。

10. 索引

使用 Texinfo,你可以自动生成索引,无需手动对条目进行排序与整理。索引中的条目会按字母顺序排列,并附带每条目相关内容的定位信息。在印刷版手册中,该信息为页码;在其他格式中,则会生成指向索引条目位置或对应节点的链接。

Texinfo 提供多种预定义索引类型:函数索引、变量索引、概念索引等。你可以合并索引,或将其用于非默认用途,还可以自定义新索引。

10.1. 预定义索引

Texinfo 提供六种预定义索引。下面是它们的标准含义、缩写及对应的索引条目命令:

‘cp’
(@cindex) 概念索引,用于通用概念。
‘fn’
(@findex) 函数索引,用于函数及类函数名称(如库的入口点)。
‘ky’
(@kindex) 按键索引,用于键盘命令。
‘pg’
(@pindex) 程序索引,用于程序名称。
‘tp’
(@tindex) 数据类型索引,用于类型名称(如头文件中定义的结构体)。
‘vr’
(@vindex) 变量索引,用于变量名称(如库全局变量)。

并非每本手册都需要全部这些索引,大多数手册最多只使用两到三种。例如本手册就包含三种索引:概念索引、变量索引和 @-command 索引。(最后一种实际使用的是函数索引,但在章节标题中称作命令索引。)

不必严格按照预设用途 使用预定义索引。例如,若你想为某些 C 预处理器宏建立索引,可以直接为它们写 @findex 命令,将其与普通函数一同放入函数索引;之后在将 “函数索引” 作为无编号章节输出时,可将标题改为「函数与宏索引」,这样对读者而言结构依然清晰一致。

但另一方面,最好 不要过度偏离 预定义索引的原本含义。否则,一旦你的文档与其他手册的内容合并,索引条目就会无法对应。这种情况下,建议你 自定义新索引 (见 “定义新索引” 一节)。

我们建议:无论源文件中使用多少种索引,最终文档里 尽量只保留一个总索引 ,这样读者只需查阅一处即可。使用 @synindex@syncodeindex 命令,可以将两个或多个源索引合并为一个输出索引(见 “合并索引” 一节)。

基于双字母索引名扩展而来的索引命令同样有效,例如可用 @cpindex 代替 @cindex

10.2. 定义索引条目

生成索引所需的数据,来自分散在整个 Texinfo 源文件中的众多独立索引命令。每条命令表示向某个指定索引添加一个条目;格式化之后,索引会以当前页码或节点名称作为引用标注。

索引条目由行首的一条索引命令,以及该行剩余部分的条目内容组成。

例如,本节开头为概念索引定义了以下五个条目:

@cindex Defining indexing entries
@cindex Index entries, defining
@cindex Entries for an index
@cindex Specifying index entries
@cindex Creating index entries

每个预定义索引都有自己对应的索引命令 —— @cindex 用于概念索引, @findex 用于函数索引,依此类推,具体可参见上一节。

索引条目应 位于 被索引的可见内容 之前 。例如:

@cindex hello
Hello, there!

原因之一是,这样索引链接(无论在何种环境下)会出现在内容前面,更符合读者的阅读习惯,而不是在内容之后。

在 Info 格式中,索引通常会被格式化为菜单。应尽量避免在索引条目中使用冒号,这可能会使部分 Info 阅读器产生混淆。有关菜单项结构的更多信息,请参见「菜单的组成部分」。

默认情况下,概念索引的条目使用罗马字体(正体)打印,其他索引的条目使用等宽字体打印。你可以使用常规 Texinfo 命令修改条目中部分内容的显示样式,例如用 @file 标记文件名(参见「标记文本、单词与短语」),用 @r 表示标准罗马字体(参见「打印用字体」)。

你可以在索引命令或条目文本后使用 @sortas 为索引条目显式指定排序键。

  • 例如:‘ @findex @sortas{\} \ @r{(literal \ in @code{@@math}) ’,这会将生成的索引条目按反斜杠进行排序。

你可以选择在排序时忽略索引条目中的某些字符。目前可选择忽略的字符包括: \- 、=<= 和 @ ,分别通过向 @set 命令提供以下参数实现: txiindexbackslashignoretxiindexhyphenignoretxiindexlessthanignoretxiindexatsignignore 。例如,指定: @set txiindexbackslashignore 会使本手册索引中的 ‘ \mathopsup ’ 条目按 ‘mathopsup’ 排序,从而使其出现在其他以 ‘M’ 开头的条目之中。这样就不必为包含这些字符的索引条目手动指定显式排序键。

使用这些选项时,可能会出现索引条目排序键为空的情况。为避免此问题,可在索引条目中指定 @sortas 指令。例如:

@set txiindexbackslashignore
@findex @sortas{\} \

10.3. 高级索引命令

Texinfo 提供了更多用于索引的命令。

首先,你可以创建 multilevel 多级 索引条目 ,将多个相关子主题归类到同一个上层主题下。实现方法是使用 @subentry 命令分隔条目中的各个部分。示例如下:

@cindex Superhumans @subentry villains
@cindex Superhumans @subentry heroes

一个条目最多可以有三级:

@cindex coffee makers @subentry electric @subentry pink
@cindex coffee makers @subentry electric @subentry blue

你可以对条目的三级内容中的任意一部分或全部使用前面提到的 @sortas 命令,使其排序方式与默认不同。

其次,你可以使用 @seeentry (“see entry”) 命令,让一个索引条目指向另一个条目。例如:

@cindex Indexes @seeentry{Indices}

这类条目在文档中应当是唯一的,目的是将读者引导到包含所需全部信息的目标条目。

最后,你可以使用 @seealso 命令提供 “see also” 条目。这类条目会与普通条目一同出现在最终打印的索引中。例如:

@cindex Coffee
@cindex Coffee @subentry With milk and sugar
@cindex Coffee @subentry With doughnuts
@cindex Coffee @subentry Decaffeinated
@cindex Coffee @seealso{Tea}

使用这三种高级命令时, 不要在索引文本的不同部分之间加逗号 。负责对索引条目排序并生成索引格式化命令的 texindex 程序会自动在正确位置添加逗号。

不要用花括号将 @sortas 或高级命令插入到索引或 @subentry 条目中间;包含花括号的命令应放在条目 开头或末尾

这些功能在打印文档以及将 Texinfo 转换为 DocBook 时最为实用

10.4. 创建索引条目

概念索引条目由文本构成。编写索引的最佳方式是设计出 简洁又清晰 的条目。如果能做到这一点,索引通常会更美观:条目写法就像它们出现在句子中间一样,即 只对专有名词和始终需要大写的缩写进行大写 。这也是大多数 GNU 手册索引所采用的大小写规范。

如果你不知道如何让条目既简洁又清晰,那就写得 长一点但清晰 —— 不要为了简洁而变得晦涩。如果很多条目都由多个单词构成,换一种规范可能会更好: 每个条目的首单词大写 。无论使用哪种大小写规范,都要 保持一致

在任何情况下, 绝对不要 对区分大小写的名称(如 C 或 Lisp 函数名、Shell 命令名)进行大写改写,否则会成为拼写错误。概念索引之外的其他索引条目,通常是编程语言中的符号名或程序名,这些名称一般区分大小写,因此同样要按要求正确使用大小写。

在可行的情况下,让索引条目 保持唯一 是个好习惯。这样一来,使用打印版文档或在线索引补全功能的用户就不会看到无法区分的列表。可以借此机会让原本相同的索引条目更具体,方便读者快速找到确切位置。前面 “高级索引命令” 一节介绍的高级索引功能对此也有帮助。

制作索引条目时,良好的做法是 考虑人们可能用来查找的不同方式 。不同的人查找内容时想到的词汇并不相同。一份实用的索引会把内容放在人们可能用到的 所有不同关键词下 。例如,有的读者会自然认为索引的双字母名称应归类在 “索引,双字母名称” 下,因为 “索引” 是总体概念;但另一位读者可能只记得 “双字母名称” 这个具体概念,而去查找 “索引的双字母名称”。一份好的索引会同时包含这两种条目,从而帮助到两类读者。

和排版一样,编制索引也是一门 需要技巧的艺术 ,其中的精妙之处往往要亲自实践过才能体会。

10.5. 打印索引与菜单

@printindex 接收一个参数: 双字母的索引缩写 。你必须在文档中希望索引出现的位置写上 @printindex 命令。仅仅在 Texinfo 文件中使用 @cindex 或其他生成索引条目的命令是 不会自动生成索引 的 —— 这些命令只是用来 收集索引原始数据

你应当在 @printindex 命令前加上合适的节或章命令(通常是 @appendix@unnumbered ),以提供章节标题,并把索引加入目录。和往常一样,在章节标题前写上 @node 行。

示例:

@node Variable Index
@unnumbered Variable Index

@printindex vr

@node Concept Index
@unnumbered Concept Index

@printindex cp

节点名中必须包含 Index(索引)字样,这样 Info 阅读器才能找到对应的索引。

如果文档中有多个索引,建议把 概念索引放在最后

不同输出格式下的索引细节

  • 在使用 TeX 生成打印版手册的流程中,你需要运行 texindex 程序(见《用 TeX 排版与打印》)对原始数据排序,生成 已排序的索引文件 ,最终打印时使用的就是这个文件。

    @printindex 读取对应的已排序索引文件,生成传统的 双栏索引 ,包含索引术语和页码。

  • 在 Info 输出中: @printindex 生成一个特殊菜单,显示条目相对于节点开头的 行号 。Info 阅读器可直接跳转到条目所在行,而不只是节点(旧版 Info 只会跳转到节点)。示例:

    * First index entry:   Top.   (line  7)
    
  • 在 plain text(纯文本) 输出中: @printindex 格式通常与 Info 菜单类似,显示条目相对于文件开头的行号。
  • 在 HTML 输出中: @printindex 生成指向索引条目的 链接
  • 在 DocBook 和 LaTeX 输出中:仅记录待打印的索引信息。

10.6. 合并索引

有时你会希望把两个不同的索引(例如函数索引和概念索引)合并在一起,可能是因为条目数量很少,单独列出一个索引会显得单薄。

你可以改用 @cindex 命令而非 @findex 命令,把函数条目写入概念索引,然后将概念索引的标题设为 ‘Function and Concept Index’ 并完全不打印 ‘Function Index’ ,以此生成风格统一的手册。但这种做法 不够稳健 。它只适用于你的文档 永远不会 被并入另一个原本就设有独立函数索引的文档的情况;如果你的文档被并入那样的文档,你文档里的函数和另一文档里的函数就无法合并到一起。此外,要让函数名在概念索引中以正确的字体显示,你还必须把每个函数名都用 @code 花括号括起来。

@syncodeindex:使用 @code 合并索引@synindex:合并索引

10.6.1. @syncodeindex: 通过 @code 字体合并索引

当你希望将 函数索引概念索引 合并时,应当仍然用 @findex 标记函数、用 @cindex 标记概念,再通过 @syncodeindex 命令把函数索引条目 重定向 到概念索引中。

@syncodeindex 命令接收两个参数:要重定向的源索引、目标索引。命令格式如下:

@syncodeindex from to

为此,各个索引都有对应的 双字母名称

‘cp’
Concept index(概念索引)
‘fn’
Function index(函数索引)
‘ky’
Key index(按键索引)
‘pg’
Program index(程序索引)
‘tp’
Data type index(数据类型索引)
‘vr’
Variable index(变量索引)

请在 Texinfo 文件开头的 文件头结束行之前或之后不久 使用 @syncodeindex 。示例:将函数索引合并到概念索引:

@syncodeindex fn cp

这样所有原本属于函数索引的条目都会并入概念索引。

如果要同时把 变量索引函数索引 都合并到概念索引:

@syncodeindex vr cp
@syncodeindex fn cp

@syncodeindex 会自动将来自「源索引」的所有条目以 @code 字体显示,覆盖目标索引原本的默认字体。这样,如果你将函数索引中的函数名重定向到概念索引,所有函数名都会按照预期以 @code 字体打印出来。

10.6.2. @synindex: 合并索引

@synindex 命令与 @syncodeindex 命令几乎完全相同,唯一区别是:它不会将 ‘from’ 索引的条目设为 @code 字体,而是使用 roman font(罗马正体)。因此,当你需要将概念索引合并到函数索引中时,应使用 @synindex

有关在文档末尾打印索引或在 Info 文件中创建索引菜单的信息,请参见「打印索引与菜单」。

10.7. 定义新索引

除了预定义索引(见预定义索引),你还可以使用 @defindex@defcodeindex 命令来 定义新索引 。这些命令会创建新的索引 @‑命令 ,用于标记索引条目。 @defindex 命令的用法如下:

@defindex name

新索引的名称通常是 双字母 ,例如 ‘au’ 。示例:

@defindex au

这会定义一个名为 ‘au’ 的新索引,同时自动创建新的索引命令 @auindex ,你可以用它来生成索引条目。这个新命令的用法与预定义的索引命令完全相同。

例如,下面是一个节标题,后面跟着一个概念索引条目和两个 au 索引条目:

@section Cognitive Semantics
@cindex kinesthetic image schemas
@auindex Johnson, Mark
@auindex Lakoff, George

(显然,这里的 ‘au’ 是 “author(作者)” 的缩写。)

Texinfo 会通过 将索引名 与 ‘index’ 拼接来构造新的索引命令。因此,定义一个名为 ‘xy’ 的索引会自动生成命令 @xyindex

使用 @printindex 命令打印新索引,用法与预定义索引一致。例如:

@node Author Index
@unnumbered Author Index

@printindex au

@defcodeindex 命令与 @defindex 类似,区别在于:在打印输出中,它的条目 默认 使用 @code 等宽字体,而不是罗马正体。

你应当在 Texinfo 文件的 文件头结束行之前 定义新索引,并且(当然)要在任何 @synindex@syncodeindex 命令之前定义(见 Texinfo 文件头)。

如前所述(见预定义索引),我们建议最终文档里 尽量只保留一个索引 (无论源文件里用了多少个索引),这样读者只需在一处查找内容。

创建索引时,TeX 会生成以 索引名作为后缀 的文件(见索引文件名)。因此应避免使用与其他用途后缀冲突的索引名,例如 .aux.xml 。如果新索引与已知后缀冲突, texi2any 会自动报错

11. 特殊插入

Texinfo 提供了若干命令,用于插入在 Texinfo 中具有特殊含义的字符(如大括号),以及其他无法通过简单键入得到的图形元素。

11.1. 特殊字符:插入 @ {} , \ # &

‘@’ 和大括号是 Texinfo 中的基础特殊字符。若要在文档中正常显示这些字符,必须在字符前加上 ‘@’,避免 Texinfo 对其进行错误解析。同时也提供了对应的命名命令。

其他字符(逗号、反斜杠、井号、与号)仅在特定场景下为特殊字符,具体说明见对应章节。

11.1.1. 插入 ‘@’ 使用 @@@atchar{}

@@ 会在输出中生成一个单独的 ‘@’ 字符。 不要@@ 命令后面加大括号。

@atchar{} 同样会在输出中生成一个单独的 ‘@’ 字符。与一般字母式命令一样,它 必须 在后面跟上大括号。在行内条件语句中(参见 行内条件: @inline@inlineifelse@inlineraw ),有时需要避免在源文件中直接使用字面量 ‘@’(在其他场景下这样写也可能更清晰)。

11.1.2. 插入 ‘{}’ 使用 @{ @}@l rbracechar{}

@{ 在输出中生成一个左大括号 ‘{’, @} 生成一个右大括号 ‘}’。 不要@{@} 命令后面再加大括号。

@lbracechar{}@rbracechar{} 同样会在输出中分别生成左大括号 ‘{’ 和右大括号 ‘}’。与常规字母式命令一样,它们 必须 在后面跟上大括号。在行内条件语句中(参见 行内条件: @inline@inlineifelse@inlineraw ),有时需要避免在源文件中直接使用大括号字面量(在其他场景下这样写也可能更清晰)。

11.1.3. 插入 ‘,’ 使用 @comma{}

通常情况下,逗号‘,’ , 是普通字符,可直接在文档中输入使用。

但在一种场景下,逗号对 Texinfo 是特殊字符:用于分隔多参数的 Texinfo 命令,例如 @node (参见 @node 行要求)、 @acronym (参见 @acronym {acronym [, meaning ]})、 @xref (参见交叉引用),以及用户自定义的宏(参见定义宏)。

在这些命令中,直接写逗号会干扰 Texinfo 的语法解析,因此必须使用命令 @comma{} 来表示一个真正的逗号。示例如下:

@acronym{ABC, A Bizarre @comma{}}
@xref{Comma,, The @comma{} symbol}
@mymac{One argument@comma{} containing a comma}

虽然 ‘@comma{}’ 几乎可以在任何地方使用,但除了上述特殊场景外,一般没有必要使用。

(顺便一提:‘@comma’ 不像同类命令那样带有 ‘char’ 后缀,这只是历史原因。当时认为没必要再定义一个同义词。)

11.1.4. 插入 ‘\’ 使用 @backslashchar{}

通常情况下,反斜杠‘\’在 Texinfo 中是普通字符,可直接在输入中按需书写,排版后会显示 等宽字体 的反斜杠。

但在一种有限场景下,Texinfo 会将反斜杠当作特殊字符使用:在用户自定义宏的主体中,用于分隔形式参数(详见「定义宏」)。

由于宏参数解析机制的特殊性,使用能生成反斜杠的字母命令,比直接写字面量 \ 更可靠,因此提供了 @backslashchar{} 。下面是宏调用示例:

@mymac{One argument@backslashchar{} with a backslash}

Texinfo 文档还可在 @math 内部将 \ 用作命令字符(详见 @math@displaymath: 数学公式排版)。此时:

  • @\\backslash 生成数学符号字体的反斜杠;
  • @backslashchar{} 仍照常生成等宽字体的反斜杠。

尽管 ‘@backslashchar{}’ 几乎可在任何位置使用,但除上述特殊场景外,一般无需使用。

11.1.5. 插入 ‘#’ 使用 @hashchar{}

通常情况下,井号 ‘#’ 在 Texinfo 中是普通字符,可直接在输入中按需书写,排版后会以 当前字体 显示井号。

该字符根据地区不同还有许多其他名称,如 “number sign数字符号”、“pound英镑符”、“octothorp井字符号” 等。因其外形与音乐中的升号相似,有时也被称作 “sharp升号” 或 “sharp sign升记号”。在 Texinfo 的使用场景中,我们经验里最常用的叫法是 “hash(井号)”。

但在一种有限场景下,Texinfo 会将井号当作特殊字符使用:用于标识所谓的 #line 指令及其变体(详见「外部宏处理器:行指令」)。

因此,若要在这类位置输出真实的井号(例如,在需要为 #line 编写文档的程序中),就必须使用 @hashchar{} 或其他等效结构。示例如下:

@hashchar{} 10 "example.c"

尽管 @hashchar{} 几乎可在任何位置使用,但除上述特殊场景外,其他地方均无需使用。

11.1.6. 插入 ‘&’ 使用 @&@ampchar{}

通常情况下,‘&’ 符号(and 符)在 Texinfo 中是普通字符,可直接在输入中按需书写,排版后会正常显示 ‘&’ 符号。

但是,‘&’ 符号 仅在一种有限场景下 会被特殊处理:在 定义类命令 的参数中(见「定义命令」),当使用 TeX 处理时7,以 ‘&’ 开头后跟若干字母的组合可能会被特殊排版(见「编写定义的约定」)。例如:

@defun foo integer1 &optional integer2 &rest integers
@code{foo} described here.
@end defun

其中的 ‘&optional’ 和 ‘&rest’ 即使不使用任何 @-命令,也可能会被加粗显示。

因此,若要在这类环境中输出一个普通的 ‘&’ 符号,就必须使用 @& 或其他等效结构。下面是一个 C++ 函数以引用作为参数的示例:

@deftypefn Function int foo (const std::vector<int>@& @var{bar})
Documentation of @code{foo}.
@end deftypefn

这段代码最终会输出:

Function: int foo (const std::vector<int>& bar)

Documentation of foo.

尽管 ‘@&’ 和 ‘@ampchar{}’ 几乎可以在任何位置使用,但除上述特殊场景外,其他地方均无需使用。

11.2. 插入引号

正如前面关于 Texinfo 通用输入约定的章节所述(见通用语法约定),Texinfo 源文件使用 ASCII 字符 ` (十进制 96)生成左单引号 ,使用 ASCII 字符 ' (十进制 39)生成右单引号 。将这些输入字符成对使用( ``'' )会生成双引号 。这是 TeX 所采用的约定。

但在计算机代码示例中, `' 会分别显示为这些 ASCII 字符的常规样式:单独的反引号(重音符)和无方向单引号。在过去,TeX 输出默认使用带方向的字形。Texinfo 提供了以下命令,用于在这两种显示样式之间切换:

@codequoteundirected on-off
设为 off 时,代码环境中的 ' 字符将输出为右弯单引号。
@codequotebacktick on-off
设为 off 时,代码环境中的 ` 字符将输出为左弯单引号。

如果只想在文档的部分内容中使用这些设置,可以用 @codequote... on 恢复默认行为,例如: @codequoteundirected on

这些设置会影响: @code@example@kbd@samp@verb@verbatim 。详见高亮命令的用途

遗憾的是,部分文档阅读器在复制粘贴时,会破坏带方向的引号字符。(免费 PDF 阅读器 xpdf 可以正常使用,但其他免费与非免费 PDF 阅读器均存在此问题。)

也可以通过 @set@clear 命令,对对应的变量 txicodequoteundirectedtxicodequotebacktick 进行操作,来控制该功能。

11.3. 插入空格

以下章节介绍用于控制句子内部及句后各类间距的命令。

11.3.1. 多个空格

通常情况下,多个空白字符(空格、制表符、换行符)会被合并为 单个空格

有时你可能需要输出 连续多个空格 ,比如用于示例(例如程序如何处理多个空格输入),或仅用于标题、列表的排版效果。Texinfo 提供三条命令: @SPACE (@+ 空格)、 @TAB@NL ,它们都会在输出中插入一个空格。(其中: @SPACE 表示 ‘@’ 后紧跟一个空格,即 ‘@ ’; TAB 表示实际的制表符; @NL 表示 ‘@’ 位于行尾,即一行的最后一个字符是 ‘@’。)

示例:

Spacey@ @ @ @
example.

会输出:

Spacey    example.

这些命令后面不要带花括号。

若要生成不可换行空格,参见 @tie{}: 插入不可换行空格

11.3.2. 非句尾空格

当句号、感叹号或问号出现在 句子末尾 时,排版后的手册会在其后自动插入稍大的间距。

通常情况下,Texinfo 能够自动判断一个句号是否为句子结尾。但在某些情况下,需要使用专门的命令。对于 不希望后面出现额外空格 的句号、问号、感叹号或冒号,请在其后使用 @: 命令。在以下场景中必须这样做:

  • 小写缩写词末尾的句号,且该句号 并非句子结尾 时。
  • 句子中间的括号注释(如此处示例!)以句号、感叹号或问号结尾时,应在右括号后使用 @: ;右方括号、右单引号和右双引号后同理。

示例:

‘foo vs.@: bar (or?)@: baz’,

下面第一行是实际输出效果,第二行是不使用 @: 时的间距作为对比:

foo vs. bar (or?) baz
foo vs. bar (or?) baz

可以这样记忆 @: 的作用:把它当成一个 隐形的小写字母 ,告诉系统前面的句号 不是句末

部分 Texinfo 命令会强制使用普通单词间距,因此不必额外插入 @: ,包括代码类高亮命令、 @var@abbr@acronym 。(见高亮命令的实用价)例如: ‘@code{foo. bar}’ 中的句号不会被当作句末,也不会插入额外间距。

@: 对 HTML 或 DocBook 输出 无影响

11.3.3. 句尾空格

如前所述,Texinfo 通常会在句子末尾插入额外的空格。它采用与 TeX 相同的判断规则:句子 以 .句号、!感叹号或 ?问号 结尾,其前后可带有闭合标点,后接空白,且 前面不是大写字母

如果句子末尾 以大写字母结尾 ,请使用:

  • @. 代替句号 .
  • @! 代替感叹号 !
  • @? 代替问号 ?

这些命令 后面不要加花括号 。示例:

Give it to M.I.B. and to M.E.W@.  Also, give it to R.J.C@.
Give it to M.I.B. and to M.E.W.  Also, give it to R.J.C.

输出效果如下。在打印版与 Info 格式中,可以看到第一行 W 后面有预期的额外空格:

Give it to M.I.B. and to M.E.W.  Also, give it to R.J.C.
Give it to M.I.B. and to M.E.W. Also, give it to R.J.C.

在其他输出格式中, @. 等价于普通 .@!@? 同理。

上面提到的 “闭合标点” 指:右括号 ( )=、 =] 右方括号) 、右单/双引号 ( ''' 不包含其他 Unicode 右引号)。在判断句号是否为句末时,这些字符可视为 不影响判断 (与 TeX 规则一致)。例如:‘foo.) Bar’ 和 ‘foo.'' Bar’ 中的句号都被视为句末。

Texinfo 中 @:@. 等命令的设计,能与 Emacs 的句子移动命令很好配合(见《GNU Emacs 手册》中的句子相关章节)。可以这样理解: ‘@.’ 里的 ‘@’ 相当于一个隐形的小写字母 ‘a’,让它前面的大写字母不影响 “句号是句末” 的判断。

少数 Texinfo 命令即使展开后以大写字母结尾,也不会被当作缩写,因此不必使用 @. 等命令。典型包括:代码类高亮命令、以大写字母结尾的 @var 参数、 @LaTeX@TeX 。例如:句子以 ‘… @code{@@TeX}.‘ 结尾时,不需要写 @. ;同理, ‘… @var{VARNAME}.’ 中的句号会被当作句末,无需使用 @.

11.3.4. @frenchspacing val: 控制句子间距

在美式排版中,句子末尾 额外增加间距 是传统且规范的做法,这也是 Texinfo 的默认设置(仅在 Info 格式和打印输出中生效,其他格式不生效)。而在法语等排版习惯中,不使用这种额外间距, 所有空格宽度保持一致

因此 Texinfo 提供 @frenchspacing 命令来控制标点后的间距。该命令将 所在行的剩余内容作为参数 ,参数只能是单个单词 ‘o’n 或 ‘off’(与文档语言无关,固定使用这两个词)。

示例:

@frenchspacing on
This is text. Two sentences. Three sentences. French spacing.

@frenchspacing off
This is text. Two sentences. Three sentences. Non-French spacing.

输出效果:

This is text. Two sentences. Three sentences. French spacing.

This is text. Two sentences. Three sentences. Non-French spacing.

@frenchspacing 同样会影响 @.@!@? 之后的输出(见「句子结尾」一节)。

@frenchspacing 对 HTML 或 DocBook 输出无影响。

11.3.5. @dmn {dimension}: 格式化尺寸

你可以使用 @dmn 命令来格式化尺寸数值,使其在打印输出中自动插入合适的间距。在其他输出格式中,该命令不会插入任何空格。

使用 @dmn 命令时,先写数字,紧接着(中间不留空格)写 @dmn ,然后将尺寸单位放在花括号内。例如:

A4 paper is 8.27@dmn{in} wide.

会生成:

A4 paper is 8.27in wide.

并非所有人都使用这种格式。有些人更偏好写成 ‘8.27 in.’ 或 ‘8.27 inches’。但在这种情况下,你需要使用 @tie (参见 @tie{}: 插入不可换行空格)或 @w (参见 @w {text}: 禁止换行),以避免数字与单位之间出现换行。

此外,如果你在句子中间的缩写后面加了句点(如上面的 ‘in.’),应在句点后使用 @: ,避免打印输出时产生多余的空格,详见 “非句子结尾” 一节。

11.4. 插入重音符号

下表列出了 Texinfo 中用于插入 浮动重音符号 的命令。它们都需要一个参数,即要添加重音的字符:

  • 可以像普通命令一样放在花括号里( @'{e} );
  • 也可以作为特例省略花括号,直接将紧跟的字符作为参数( @'e )。这样做是为了让源码更便于输入和阅读,因为重音字符在部分语言中非常常见。

如果是字母形式的命令(如 @dotaccent ),不使用花括号时,命令名与参数之间必须加空格。如果是非字母形式的命令(如 @' ),不能加空格,参数就是紧跟的下一个字符。

例外: @tieaccent 的参数必须放在花括号里(因为它作用于两个字符,而非一个)。

在 Info 与纯文本输出中:

  • 如果文档编码支持,重音结构会输出为真实的重音字符;
  • 若给 texi2any 指定了 --disable-encoding 选项则除外(参见 @documentencoding enc: 设置输入编码);
  • 若无法输出对应编码字符,则使用 ASCII 转写形式。

重音命令表

命令 输出 说明
@"o ö 分音符号(变音符号)
@'o ó 锐音重音
@,{c} ç 软音符号
@=o ō 长音符号/上划线
@^o ô 扬抑符
@`o ò 抑音重音
@~o õ 波浪号重音
@dotaccent{o} ȯ 上点重音
@H{o} ő 匈牙利长音分音
@ogonek{a} ą 尾音符号
@ringaccent{o} 上圈重音
@tieaccent{oo} o͡o 连字符重音
@u{o} ŏ 短音符号
@ubaraccent{o} 下划线重音
@udotaccent{o} 下点重音
@v{o} ǒ 楔形重音(哈采克)

下表列出了用于插入英语以外语言常用字符的 Texinfo 命令:

命令 输出 说明
@exclamdown{} ¡ 倒置感叹号
@questiondown{} ¿ 倒置问号
@aa{} @AA{} å Å 带圈 a、A
@ae{} @AE{} æ Æ ae、AE连字
@dh{} @DH{} ð Ð 冰岛语 eth字符
@dotless{i} ı 无点i
@dotless{j} ȷ 无点j
@l{} @L{} ł Ł 擦音L、l
@o{} @O{} ø Ø 带斜杠o、O
@oe{} @OE{} œ Œ oe、OE连字
@ordf{} @ordm{} ª º 西语序数词符号
@ss{} ß 德语Eszett(尖s)
@th{} @TH{} þ Þ 冰岛语thorn字符

11.5. 插入引号符号

使用成对的单引号字符来开始和结束引用: ``…'' 。两个单引号会被转换为左、右双引号,“像这样”。

你偶尔可能需要输出 连续两个单引号 ;例如,在编写 Maxima 这类计算机语言的文档时, '' 是一个合法命令。这时可以使用输入 '@w{}' 实现;空的 @w 命令会阻止字符被合并成双引号。

Texinfo 中使用的左引号字符( ` ,ASCII 码 96)在 ANSI 和 ISO 字符集标准中是 重音符 。我们将它用作引号字符,是因为 TeX 默认就是这样配置的。

Texinfo 支持英语以外其他语言中使用的多种引号。下表列出了 Texinfo 提供的用于插入各类引号的命令。

命令 符号 Unicode名称(码点)
@quotedblleft{} `` 左双引号(U+201C)
@quotedblright{} '' 右双引号(U+201D)
@quoteleft{} ` 左单引号(U+2018)
@quoteright{} ' 右单引号(U+2019)
@quotedblbase{} 双低9引号(U+201E)
@quotesinglbase{} 单低9引号(U+201A)
@guillemetleft{} « 左双角引号(U+00AB)
@guillemetright{} » 右双角引号(U+00BB)
@guilsinglleft{} 左单角引号(U+2039)
@guilsinglright{} 右单角引号(U+203A)

对于双角引号,同时也支持 Adobe 和 LaTeX 中的字形名称: @guillemotleft@guillemotright这些名称并不准确 :“guillemot” 实际上是一种鸟类(海雀的一种)。

标准 TeX 字体支持英语中常用的引号(即由 ASCII 单引号与成对单引号生成的那些)。对于其他引号,TeX 使用 European Computer Modern(EC) 字体(如 ecrm1000 及其他变体)。这些字体当然是免费的,你可以从 http://ctan.org/pkg/ec 等站点下载。

免费的 EC 字体是使用 Metafont 生成的 位图字体 。尤其对于在线查看,字体的 Type 1(矢量)版本更为合适;这类字体可在 CM-Super 字体包中获取(http://ctan.org/pkg/cm-super)。

这两个发行版都包含安装说明。

引号的使用惯例在不同语言间存在极大差异(参见维基百科 “引号” 词条:https://en.wikipedia.org/wiki/Quotation_mark)。Texinfo 并未提供相关命令或配置,用于按照各类繁多的惯例排版引号。因此,你需要为手册所使用的语言选择适配的命令。有时可通过别名(参见 @alias new=existing )简化使用方式,同时提升源代码的可读性。例如在德语中,左双引号需使用 @quotedblbase 命令,而右双引号则由本应表示左双引号的 @quotedblleft 命令生成,这一用法有违直觉。因此在这种情况下,定义以下别名会更为便捷:

@alias lgqq = quotedblbase
@alias rgqq = quotedblleft

11.6. @sub@sup: 插入下标与上标

你可以使用 @sub@sup 命令插入下标与上标。例如:

here@sub{below}@sup{above}

会生成:

here_{below}^{ᵃᵇᵒᵛᵉ}

在 Info 格式与纯文本中, @sub{text} 目前会输出为 _{text}@sup{text} 会输出为 ^{text} ,包含字面意义上的花括号(用于向读者标记 “script” 文本的起止)。

当输出格式(及显示程序)支持时(如打印输出、HTML),若两个命令连续使用,上标会显示在下标上方。

对于数学表达式中的下标与上标,建议优先使用 TeX 的 _^ 符号。参见下一节。

11.7. @math@displaymath: 数学公式格式化

你可以使用 @math 命令编写数学表达式、方程式或公式。将 TeX 数学标记法写在花括号内,示例如下:

@math{\partial_\alpha \partial^\alpha A^\beta = \mu_0 J^\beta}

@math 用于段落内时,会以 行内形式 排版,就像本示例中这样 \(\partial_\alpha \partial^\alpha A^\beta = \mu_0 J^\beta\) 。该命令对 Info 格式输出无特殊作用,仅会原样输出其内容。

对于打印输出, @math 会切换至 TeX 的 “math mode”。在此场景下,纯 TeX 中用于符号、函数等的数学控制序列需使用 ‘\’ 而非 ‘@’。

默认情况下,HTML 输出仅会对数学公式做 强调处理texi2any 提供了三种选项,用于在 HTML 中正确排版数学公式。你可通过 HTML_MATH 变量选择这些选项(参见 “数学公式的 HTML 自定义配置”):

  • 若将 HTML_MATH 设为 ‘l2h’, texi2any 会尝试调用 latex2html 程序为数学内容生成图片文件;
  • 设为 ‘t4h’ 时,会尝试调用 tex4ht 程序;
  • 设为 ‘mathjax’ 时,会在输出文件中插入 MathJax 脚本引用以排版数学内容(该选项需浏览器启用 JavaScript 才能生效)。

相关配置可参见:MathJax 自定义变量 latex2html 自定义变量 tex4ht 自定义变量

对于 显示型方程式 (独行展示的公式),可使用 @displaymath 命令。示例:

@displaymath
f(x) = {1\over\sigma\sqrt{2\pi}}
e^{-{1\over2}\left({x-\mu\over\sigma}\right)^2}
@end displaymath

该代码会生成:(注:此处对应公式排版效果为正态分布概率密度函数:

\[ f(x) = {1\over\sigma\sqrt{2\pi}} e^{-{1\over2}\left({x-\mu\over\sigma}\right)^2} \]

通常, @math@displaymath 的内容应仅包含纯 TeX 代码,不可穿插 Texinfo 命令。若确需使用 Texinfo 命令,需按常规方式加 ‘@’ 前缀(如 ‘@var’ 而非 ‘\var’),但我们不保证所有 Texinfo 命令均可生效。

尽管 @sub@sup 在某些场景下可在数学模式中使用,但建议在数学表达式中优先使用 TeX 的 ‘_’(下标)和 ‘^’(上标)符号。

仅当输出格式为 LaTeX,或启用 HTML_MATH 相关选项时(其中 tex4ht 需将 T4H_MATH_CONVERSION 设为 ‘latex’;参见 tex4ht 自定义变量),LaTeX 专用代码才能生效。

由于 Texinfo 的 @sup 命令存在命名冲突,若你确需使用纯 TeX 命令 \sup (这种情况极少出现),可改用 \mathopsup 替代 —— 但该写法仅在通过 TeX 处理时生效,输出 LaTeX 或使用任何 HTML_MATH 选项时均不适用。

11.8. 文本专用符号

11.8.1. @TeX{} (TeX)与 @LaTeX{} (LaTeX)

使用 @TeX{} 命令生成 ‘TeX’。在印刷版手册中,它会呈现为特殊的徽标样式,与三个普通字母不同。在其他输出格式中,外观仅为普通的 ‘ TeX ’。

同理,使用 @LaTeX{} 命令生成 “LaTeX”,该徽标在印刷版手册中样式更为特殊(且与不正确的 La@TeX{} 写法不同)。在其他输出格式中,结果仅显示为 “ LaTeX ”。

这些命令的拼写在 Texinfo 中比较特殊,因为它们同时混用了大写和小写字母。

11.8.2. @copyright{} (©): 版权符号

使用 @copyright{} 命令生成版权符号 ‘©’。在支持的环境中,会显示为带圆圈的字母 ‘c’;否则显示为 ‘(C)’。

从法律角度而言,并非必须使用版权符号;根据国际公约,使用英文单词 ‘Copyright’ 即可。

11.8.3. @registeredsymbol{} (®): 注册商标符号

使用 @registeredsymbol{} 命令生成注册商标符号 ‘®’。在支持的环境中,会显示为带圆圈的字母 ‘R’;否则显示为 ‘(R)’。

11.8.4. @dots (…)与 @enddots (…): 省略号

ellipsis省略号 (一连串点)如果直接用多个句点排版,间距会不正确。因此在 Texinfo 中使用专门的命令:使用 @dots{} 命令生成标准省略号,即三个间距恰当的点 就像这样。重点强调: 不要在源文件里直接写三个句点 。这种写法在某些输出格式下或许可用,但在印刷版手册中会导致点与点之间的间距错误。

@enddots{} 命令用于生成 句末省略号 ,同样是三个点,但后面的间距不同, 仔细观察就能看出区别。

这里是一个省略号: ,这里是三个连续句点: ...

在印刷版(以及通常的 HTML)输出中,三个连续句点的间距会比标准省略号紧凑得多。

11.8.5. @bullet (•): 项目符号

使用 @bullet{} 命令生成一个大圆点,或最接近圆点的符号。也可以使用星号代替。这里是一个项目符号:•

11.8.6. @euro (€): 欧元符号

使用 @euro{} 命令生成欧元符号 ‘€’。在支持的环境中会显示该符号,否则显示文字 ‘Euro’。

标准 TeX 字体中不含欧元符号(该字体设计时欧元尚未立法启用)。因此,TeX 会使用额外的字体 feymr10(及其他变体)。该字体为免费字体,可从 http://ctan.org/pkg/eurosym 等渠道下载,发行包中包含安装说明。

11.8.7. @pounds (£): 英镑符号

使用 @pounds{} 命令生成英镑符号 ‘£’。在支持的环境中会显示该符号,否则显示为 ‘#’。

11.8.8. @textdegree (°): 度符号

使用 @textdegree{} 命令生成度数符号 ‘°’。在支持的环境中会显示标准度数符号,否则显示为小写字母 ‘o’。

11.8.9. @minus (−): 减号

使用 @minus{} 命令生成负号。在输出所使用的字符编码与字体支持的情况下,该符号为标准长度的负号 —— 比连字符稍长,比破折号短:

@minus (−): Inserting a Minus Sign

  • ‘−’ 是由 @minus{} 生成的负号,
  • ‘-’ 是由字符 ‘-’ 生成的连字符,
  • ‘—’ 是用于文本中的破折号。

如果你实际需要排版包含减法运算的数学公式,建议使用 @math ,例如 @math{a-b} (参见 @math@displaymath: 数学公式排版)。

11.8.10. @geq (≥)与 @leq (≤): 大于等于/小于等于符号

使用 @geq{}@leq{} 命令生成大于等于号与小于等于号,即 ‘≥’ 和 ‘≤’。当这些符号不可用时,将输出 ASCII 形式的 ‘>=’ 和 ‘<=’。

11.9. 编程专用符号

在 Texinfo 中,代码常通过 @example@end example 包裹的示例进行展示。在这类示例里,你可以使用 ‘⇒’ 或 ‘→’ 表示求值结果或展开效果。同样,也有对应的命令可插入符号,用来表示打印输出、错误信息、表达式等价、编辑器中点的位置,以及图形界面操作序列。

这些符号插入命令并非必须在示例中使用,但 绝大多数情况下都用于示例中 。所有符号插入命令后面都带有空花括号。

11.9.1. 符号汇总

以下是符号命令的汇总说明:

@result{} 表示表达式的运算结果。
@expansion{} 表示宏展开的结果。
-|
@print{} 表示打印输出内容。
error→
@error{} 表示后续文本为错误信息。
@equiv{} 表示两种形式完全等价。
@point{} 表示光标所在位置。
A → B
@clicksequence{A @click {} B} 表示图形界面操作序列:先执行 A,然后点击 B,或从菜单中选择 B,或以其他方式选中 B。

11.9.2. @result{} (⇒):表达式结果

使用 @result{} 命令来表示表达式求值后的结果。

@result{} 命令显示为‘⇒’,即双横线箭头;若该符号不可用,则使用 ASCII 序列 ‘=>’ 代替。

因此,下面的示例:

(cdr '(1 2 3))
    ⇒ (2 3)

可以读作:「(cdr '(1 2 3)) 的求值结果为 (2 3)」。

11.9.3. @expansion{} (→):展开标识

当表达式为宏调用时,它会展开为新的表达式。你可以使用 @expansion{} 命令来表示展开后的结果。

@expansion{} 命令显示为 ‘→’,即长箭头;若该符号不可用,则使用 ASCII 序列 ‘==>’ 代替。

例如,下面的代码:

@example lisp
(third '(a b c))
    @expansion{} (car (cdr (cdr '(a b c))))
    @result{} c
@end example

会生成:

(third '(a b c))
    → (car (cdr (cdr '(a b c))))
    ⇒ c

可以读作: (third '(a b c)) 展开为 (car (cdr (cdr '(a b c)))) ;该表达式的求值结果为 c

通常(如本例),将 @expansion{} 和=@result{}= 命令进行缩进,示例的排版效果会更好

11.9.4. @print{} (-|):生成输出标识

有些表达式在执行过程中会产生输出。你可以使用 @print{} 命令来标记这类显示输出。

@print{} 命令显示为 ‘-|’,即一根短横线紧跟一条竖线;若该符号不可用,仍使用 ASCII 序列 ‘-|’。

在下面的示例中,打印输出的内容用 ‘-|’ 标记,表达式的返回值在最后一行给出。

(progn (print 'foo) (print 'bar))
    -| foo
    -| bar
    ⇒ bar

在 Texinfo 源文件中,该示例写法如下:

@example lisp
(progn (print 'foo) (print 'bar))
    @print{} foo
    @print{} bar
    @result{} bar
@end example

11.9.5. @error{} (error→):错误信息标识

一段代码在求值时可能会触发错误。你可以使用 @error{} 命令来标注对应的错误提示信息。

@error{} 命令显示为 ‘error→’:在打印输出格式中,‘error’ 会显示在方框内;在其他格式中则是 error 后接一个箭头;若箭头符号不可用,会显示为 ‘error–>’。

因此,下述代码:

@example lisp
(+ 23 'x)
@error{} Wrong type argument: integer-or-marker-p, x
@end example

会生成如下内容:

(+ 23 'x)
error→ Wrong type argument: integer-or-marker-p, x

这表示当你对该表达式求值时,会打印出以下错误信息:

Wrong type argument: integer-or-marker-p, x

需要注意,‘error→’ 本身 不属于 错误信息的一部分。

11.9.6. @equiv{} (≡):等价标识

有时两个表达式会产生完全相同的结果。你可以使用 @equiv{} 命令来表示两种形式完全等价。

@equiv{} 命令显示为 ‘≡’,即标准的数学等价符号(三条平行横线);若该符号不可用,则使用 ASCII 序列 ‘==’ 代替。

因此,下述代码:

@example lisp
(make-sparse-keymap) @equiv{} (list 'keymap)
@end example

这表示对 (make-sparse-keymap) 求值的结果,与对 (list 'keymap) 求值的结果完全相同。

11.9.7. @point{} (*):缓冲区光标位置标识

有时你需要展示 Emacs 缓冲区中的文本示例。这类示例的惯例是:在两行包含缓冲区名称的虚线之间,写出该缓冲区的全部内容。

你可以使用 @point{} 命令来标记缓冲区文本中 光标(point) 所在的位置。(当然,光标符号本身并不是缓冲区文本的一部分;它用来表示光标位于两个字符之间的位置。)

@point{} 命令显示为 ‘∗’,即一个星号;若该符号不可用,则使用 ASCII 序列 ‘-!-’ 代替。

下面的示例展示了执行一条插入单词 changed 的 Lisp 命令前后,缓冲区 foo 的内容变化:

---------- Buffer: foo ----------
This is the ∗contents of foo.
---------- Buffer: foo ----------
(insert "changed ")
    ⇒ nil
---------- Buffer: foo ----------
This is the changed ∗contents of foo.
---------- Buffer: foo ----------

在 Texinfo 源文件中,该示例写法如下:

@example
---------- Buffer: foo ----------
This is the @point{}contents of foo.
---------- Buffer: foo ----------

(insert "changed ")
    @result{} nil
---------- Buffer: foo ----------
This is the changed @point{}contents of foo.
---------- Buffer: foo ----------
@end example

11.9.8. 点击序列

在编写图形界面相关文档时,需要描述类似 “Click on ‘File’, then choose ‘Open’, then …” 这样的操作序列。Texinfo 提供了 @clicksequence@click 命令来表示这类操作,典型用法如下:

... @clicksequence{File @click{} Open} ...

会显示为:

... File → Open ...

@click 命令默认生成一个右箭头;该符号也可通过独立命令 @arrow{} 直接使用。

你可以使用 @clickstyle 命令修改 @click 生成的符号,该命令在行内剩余部分接收 一个命令名 作为唯一参数。该命令应能生成一个符号,且通常省略空大括号 ‘{}’。示例如下:

@clickstyle @result
... @clicksequence{File @click{} Open} ...

现在会显示为:

... File ⇒ Open ...

11.10. 插入 Unicode 字符: @U

命令 @U{hex} 用于插入 Unicode 字符 U+ hex 的表示形式。例如, @U{0132} 会插入荷兰语合字 ‘IJ’(即 ‘IJ’)。

hex 必须是 至少四位 的十六进制数,不会自动补前导零。通常, hex 必须指定一个合法的常规 Unicode 字符;例如, U+10FFFF(最后一个码位)本身就是非法码点,因此不能通过该命令插入。

@U 适用于插入 Texinfo 没有提供专用命令的少量符号,同时能让 Texinfo 源码保持纯 7 位 ASCII 编码,以实现最大可移植性。

该命令存在诸多限制 —— 与以 UTF‑8 或其他二进制形式直接插入 Unicode 字符的限制相同。首先也是最重要的一点:TeX 并不支持绝大多数 Unicode 字符。虽然可以按需支持特定的额外符号,但让 texinfo.tex 完整支持整套文字体系(如日文、乌尔都文等)并不现实。 @U 命令并不会改变这一点。如果指定的字符在 TeX 中不被支持,将会报错。LaTeX 输出对 UTF‑8 的支持相对更好,但可能需要额外代码来加载字体并声明 UTF‑8 字符的输出方式。(参见 @documentencoding enc: Set Input Encoding。)

在 HTML 和 DocBook 格式中, @U 的输出始终是形如 ‘ &#x hex; ’ 的实体引用,例如上面的例子会输出 ‘&#x0132;’ 。即使 HTML 文档使用其他编码(如 Latin 1)且该字符不在此编码中,通常也能正常显示。

在 Info 和纯文本格式中,如果输出编码不是 UTF‑8,则会输出 ASCII 序列 ‘ U+ hex ’,例如上面的例子会显示为 6 个 ASCII 字符:‘U+0132’

12. 强制换行 / 分页与禁止换行 / 分页

在某种输出格式中,换行与分页有时会出现在 “不合适” 的位置。你需要确保文本在所有输出格式中显示正常。

例如,在印刷版手册里,分页可能会生硬地出现在示例中间;为避免这种情况,你可以使用分组命令将文本绑定在一起,防止其被拆分到两页。反之,你也可以在原本不会分页的位置强制分页。

你可以使用换行、禁止换行或分页相关命令来修复有问题的换行与分页。

12.1. 换行/分页命令

换行命令用于创建或允许换行与分段:

@*
强制换行。
@sp n
跳过 n 行空行。
@-
插入可选连字符。
@hyphenation {hy-phen-a-ted words}
hy-phen-a-ted 单词中定义连字符位置。

以下命令可将文本保持在同一行:

@w{text}
禁止 text文本 被拆分并跨两行加连字符。
@tie{}
插入普通单词间空格,且此处不允许换行。

分页命令仅适用于印刷版输出,因为其他输出格式没有页面概念。

@page
开始新页面。
@group
将必须在同一页显示的文本绑定在一起。
@need mils
若当前页面剩余空间不足,则新建一页。

12.2. @*@/: 生成换行与允许换行

@* 命令在所有输出格式中强制换行。 @/ 命令仅在印刷版手册中允许自动换行。

下面是使用 @* 的示例:

This sentence is broken @*into two lines.

会生成:

This sentence is broken
into two lines.

@=/= 命令在长 URL 或其他 TeX 无法自动找到合适换行位置的标识符中很有用。TeX 会在 URL 的自然位置自动换行(参见 URL 换行),因此只在需要时才使用 @/@/ 对其他输出格式无效果

12.3. @-@hyphenation: 印刷输出中的连字符换行

尽管 TeX 的断字算法通常效果很好,但它偶尔还是会漏掉合适的断字位置。(或者,更少见的情况是,插入错误的断字。)因此,对于包含生僻词汇的文档,或是为印刷版进行精细排版时,你可能需要显式指定断字位置。Texinfo 提供了两个相关命令:

@-
插入 可选连字符 ,即在单词中可以跨行断开并显示连字符的位置。当你发现因 TeX 未自动断字而导致 “行溢出”(overfull hbox)时,这个命令尤其有用(参见行溢出)。如果一个单词中包含 @- ,TeX 将不会再自动添加其他断字位置。
@hyphenation {hy-phen-a-ted words}

为指定单词设置断字位置。例如:

@hyphenation{man-u-script man-u-scripts}

如示例所示,你需要在每个希望断字的位置加上 ‘-’ 。TeX 只会在单词 完全匹配 时使用指定的断字规则,因此需要给出所有必要的变形形式,比如复数形式。

非印刷格式的输出不会进行连字符断字,因此这些命令在其他输出格式中 均无效

12.4. @allowcodebreaks: 控制 @code 块内的换行

通常情况下,TeX 会在 @code 及相关命令内的字符 ‘-’ 和 ‘_’ 处考虑换行(参见 @code {sample-code}),大致相当于把这些符号当作 “空” 断词点处理。

这一点是必要的,因为很多手册(尤其是 Lisp 家族语言的手册)需要描述非常长的标识符。但另一方面,有些手册不存在这类问题,你可能不希望在某些标识符的下划线处换行,例如 SIZE_MAX ,更不希望在 __typeof__ 这类四个下划线中的任意一处后换行。

因此 Texinfo 提供了这条命令:

@allowcodebreaks false

用于禁止在 @code 内的 ‘-’ 或 ‘_’ 处断行。使用 @allowcodebreaks true 可以恢复允许此类断行。这些命令需单独写在一行。

这些命令可在文档任意位置使用。例如,你可能只需要在某一段有问题的段落中关闭断行,而其他地方保持默认开启,或者反过来。

该命令只对 TeX 输出生效,对其他输出格式无影响。

12.5. @w {text}: 禁止文本换行

@w{text} 输出文本内容,同时 禁止在内容内部自动换行

因此,你可以使用 @w 生成 不可换行的空格 ,其宽度固定为普通单词间空格的宽度:

@w{ } @w{ } @w{ } indentation.

将输出:

indentation.

@w{ } 产生的空格不仅不可断开,而且 不会被拉伸或压缩 。有时这正是你需要的效果,例如在进行手动缩进时。但通常情况下,你会希望使用可拉伸、可压缩的普通单词间空格(用于印刷输出);相关用法请参见下一节的 @tie 命令。

在印刷输出中,你还可以使用 @w 命令避免长名称或短语被自动断词连字符拆分,例如当它们恰好出现在行尾时。

你也可以使用 @w 避免源码控制系统中出现意外的关键字展开。例如,要在文档中原样写出 $Id$ ,可写作 @w{$}Id$ 。不过这个技巧在某些输出格式的文件中无效。

12.6. @tie{}: 插入不可断空格

@tie{} 命令生成一个普通单词间距,且不允许在此处换行。该命令后面必须紧跟一对空的大括号,与段落内其他命令的写法一致。示例:

@TeX{} was written by Donald E.@tie{}Knuth.

输出效果:

TeX was written by Donald E. Knuth.

@tie{}@w{} 有两个重要区别:

  • @tie{} 生成的空格会随段落中普通单词间距一起 轻微拉伸或压缩 ;而 @w{ } 生成的空格 宽度固定不变
  • @tie{} 允许两侧单词正常断词连字符;而 @w{ }禁止两侧单词断词 (出于 TeX 技术原因,即它会生成一个 ‘\hbox’)。

12.7. @sp n: 插入空行

@sp n 开头且整行仅包含该命令时,会生成 n 行空白行。 @sp 同时会强制分段。

例如:

@sp 2

会生成两行空白行。

@sp 命令最常用于标题页

12.8. @page: 开始新页面

一行中只包含 @page 时,会在印刷版手册中 开始新的一页 。在没有 “页面” 概念的其他输出格式中,它会 开始一个新段落@page 命令常用于 Texinfo 文件的 @titlepage 区域,用来 开启版权页

12.9. @group: 禁止分页

@group 命令用于将一段示例内容 保持在同一页 。在 @example 或类似环境中使用它,可以开始一个 不可拆分的垂直块 ,使其在印刷输出中完整出现在同一页。使用仅包含 @end group 的一行来结束该块。该命令 仅对 TeX 输出 生效。

@group@end group 命令必须放在 @example@end example 之间,格式如下:

@example
@group
...
@end group
@end example

尽管从概念上讲, @group 可用于多种场景,但当前实现仅在以下环境中生效: @example 及其变体、 @display@format@flushleft@flushright 。参见 “引用与示例” 一章。(这些命令的共同点是:输入的每一行都会直接对应输出的一行。)

12.10. @need mils: 避免分页

如果一行中只包含 @need n ,那么在印刷版手册里,当当前页面剩余空间小于 n 密耳(千分之一英寸)时,就会 另起新页 。参数 n 外面不要加花括号。 @need 命令对其他输出格式没有效果,因为它们不进行分页。

本段前面就使用了 @need 命令:如果页面剩余空间不足 800 密耳(0.8 英寸),就会在印刷输出中另起一页。写法如下:

@need 800
This paragraph is preceded by ...

@need 命令常用于避免 孤行 :即只有一行文字孤零零出现在印刷页底部的情况。

13. 定义命令

@deffn 命令及其他 definition commands定义类命令 ,可让你以统一格式描述函数、变量、宏、命令、用户选项、特殊形式及其他实体。

在输出结果中,实体会显示其名称、参数及所属类别(如 “函数”、“变量” 等)。定义正文会在下方缩进显示。实体名称也会自动加入对应索引。

所有定义类命令格式相近。本章先讲解 @deffn ,再详细介绍其他定义类命令。

13.1. 定义的模板

@deffn category类别 name名称 args参数…
定义主体内容
@end deffn

@deffn 命令用于定义 类似函数 、可接收参数的实体。在一行开头书写 @deffn 命令,同一行依次跟上: 实体类别、实体名称、参数(如有)。随后在后续行书写定义的主体内容,最后单独一行用 @end deffn 结束定义。

示例:

@deffn Command forward-word count
This command moves point forward @var{count} words
(or backward if @var{count} is negative). ...
@end deffn

渲染效果:

Command: forward-word count
This command moves point forward count words (or backward if count is negative). …

类别名称按 标题格式首字母大写 。如果类别名称含空格(如 ‘Interactive Command’),需用 大括号 包裹:

@deffn {Interactive Command} isearch-forward
...
@end deffn

否则第二个单词会被误识别为实体名称。通用规则:标题行中 除最后一个参数外 ,任何多单词内容都要用大括号包裹。文本中含特殊命令时也需如此(例如西语中的 ‘{declaraci@'on}’)。

不同输出格式中, 类别 的显示位置不同:

  • Info 文件:显示在定义第一行开头
  • TeX 输出:打印在右侧边栏旁

@deffn 会将名称加入函数索引。

@deffn 有三个预定义的专用变体( @defun@defmac@defspec ),会分别为你指定类别:函数、宏和特殊形式。(在 Lisp 中,特殊形式是一种与函数类似的语法实体。)同样,通用命令 @defvr 也配有多个专用变体,用于描述特定类型的变量。

与之类似,通用变量命令 @defvr 也配有多个专用变体,用于描述不同类型的变量

13.2. 定义命令的续行

定义命令的标题行可能会变得很长。因此,Texinfo 提供了一种特殊语法,允许它们在源文件中 跨多行续行 :在需要续行的每一行末尾单独写一个 ‘@’。示例如下:

@defun fn-name @
  arg1 arg2 arg3
This is the basic continued defun.
@end defun

生成的效果为:

Function: fn-name arg1 arg2 arg3
This is the basic continued defun.

可以看到,续行的内容会被合并,就像在源文件中写在同一行一样。

虽然本例只展示了一行续行,但续行可以按同样方式 跨任意多行 :只需在每个需要续行的行尾加上 @

一般情况下,续行符 @ 前面的任意多个空格或制表符,都会被 压缩为单个空格 。但有一个例外:Texinfo 处理器不会完全压缩大括号内部续行周围的空白。例如:

@deffn {Category @
  Name} ...

输出结果中,“Category” 和 “Name” 之间会出现多余空格。要避免这一问题,请在输入时删去不必要的空白,或者把续行符 @ 放在大括号 外面

@ 在其他任何上下文里都 不作为续行符 使用。通常, @ 后面跟空白字符(空格、制表符、换行)会生成一个普通的单词间空格(参见 “多个空格”)

13.3. 可选参数与重复参数

有些实体支持可选参数或重复参数。表示这类参数的通用约定是使用 方括号省略号

  • 被方括号 [] 括起来的参数是可选参数;
  • 后面跟省略号 的参数可以重复多次(也可省略)。

因此,[ optional-arg ] 表示 optional-arg 是可选参数, repeated-args… 表示零个或多个参数。在 Lisp 中,当多个参数需要组合成更深一层的列表结构时,会使用 圆括号

下面是一个虚构的(较复杂的)特殊形式的定义行示例:

Special Form: foobar (var [from to [inc]]) body…

在本例中:

  • 参数 fromto 是可选的,但必须同时出现或同时省略;
  • 如果提供了 fromto ,则 inc 也可以选择性给出;
  • 这些参数与 var 组合成一个列表,以便和 body 区分开, body 包含该形式的所有剩余部分。

在 Texinfo 源文件中,这条 @defspec 语句写法如下:

@defspec foobar (var [from to [inc]]) body@dots{}

13.4. 省略定义名后的空格

出于排版风格或编程语言语法的要求,你可能希望在定义中的名称 后面、左括号前面 不显示空格。要实现这一点,可以设置 ‘txidefnamenospace’ 标记(参见 @set@value )。

例如,如下输入:

@set txidefnamenospace
@deffn Builtin index (string, substring)
@dots{}
@end deffn

会生成如下输出:

Builtin: index (string, substring)

13.5. @deffnx 等:多条 “首行” 定义

若要为一个定义编写 两条或更多首行 / 标题行 ,可在第一条 @deffn 行之后,使用以 @deffnx 开头的行。

示例:

@deffn {Interactive Command} isearch-forward
@deffnx {Interactive Command} isearch-backward
These two search commands are similar except ...
@end deffn

生成效果:

Interactive Command: isearch-forward
Interactive Command: isearch-backward
These two search commands are similar except …

所有定义命令都有对应的 ‘x’ 形式: @defunx@defvrx@deftypefunx 等。

这类带 ‘x’ 的命令用法与 @itemx 类似(参见 @itemx: 第二条及后续条目)。

13.6. 各类定义命令

13.6.1. 函数及类似实体

本节介绍用于描述 函数及带有简单参数的类似实体 的命令:

@deffn category name arguments…

@deffn 是用于 函数、交互式命令以及其他带有简单参数的类似实体 的通用定义命令。你需要选择一个术语来描述所定义实体的类别;例如,如果该实体是函数,就可以使用 “Function”(函数)。

@deffn 命令写在行首,同一行后面依次跟上:所描述实体的类别、该实体的名称、参数(如有)。最后用单独一行的 @end deffn 结束定义。

示例:

@deffn Command forward-char nchars
Move point forward @var{nchars} characters.
@end deffn

这是一个名为 forward-char 、带有一个参数 nchars 的 “command” 的简洁定义。

在支持的输出格式中, @deffn 会对 name名称 使用等宽字体,对其余 arguments参数 使用斜体(效果同 @var )。

在描述文本中,使用 @var 显式写出参数名,以引用该参数的值。在上面的例子里,我们就是这样使用 ‘@var{nchars}’ 的。

在极少数特殊情况下,如果参数名中包含 ‘–’ 或其他会被特殊处理的字符序列(参见 “通用语法约定”),请用 @code 包裹这些特殊字符,避免被转换成排版用的短横线或长破折号。

@defun name arguments…
用于定义带简单参数的函数。等价于:‘@deffn Function …’ 以单独一行的 @end defun 结束。
@defmac name arguments…
用于定义宏。等价于:‘@deffn Macro …’,用法同 @defun
@defspec name arguments…
用于定义特殊形式(special form)。(在 Lisp 中,特殊形式是一类与函数类似的实体;详见《GNU Emacs Lisp 参考手册》中的 “特殊形式”。)等价于:‘@deffn {Special Form} …’,用法同 @defun

以上所有命令都会在 函数索引 中生成条目

13.6.2. 强类型语言中的函数

@deftypefn 命令及其变体是用于描述函数的通用命令,特别适合必须声明变量与函数类型的语言,例如 C 和 C++。

@deftypefn category data-type name arguments…

@deftypefn 是用于定义函数及类似可带参、可带类型实体的通用定义命令。该命令写在行首,同一行后续依次为:实体类别、返回值信息、实体名称、参数(如有)。

示例:

@deftypefn {Library Function} int foobar @
  (int @var{foo}, float @var{bar})
...
@end deftypefn

生成效果:

Library Function: int foobar (int foo, float bar)

表示 foobar 是 “library function” ,返回 int 类型,参数为 foo (int 型)和 bar (float 型)。‘Library Function’ 必须用大括号括起,使其成为单个参数。

使用 @deftypefn 及其变体时,应使用 @var 标记参数名,以便与编程语言中的数据类型、关键字、字面语法区分。在输出格式支持的情况下,定义行默认使用等宽字体; @var 会使用对应字体显示。

如果描述带包(package)的语言(如 Ada)中的过程,可按如下方式使用 @deftypefn

@deftypefn stacks private push @
       (@var{s}:in out stack; @
       @var{n}:in integer)
...
@end deftypefn

(本例中 @deftypefn 参数使用了续行写法,参见定义命令续行,也可写在同一行。)

此时该过程归类到 stacks 包,类型为 private ,过程名为 push ,参数为 sn 。输出效果:

stacks: private push (s:in out stack; n:in integer)

当需要把参数列表当作字面计算机代码、并用 @var 标记参数名时,可使用 @deftypefn 及其变体。不一定需要出现类型名,也可用 ‘{}’ 表示空返回类型。

返回值信息可用于命名返回变量。例如在 Perl 中,可如下指定返回标量 $result$status

@deftypefn {Sub} {(@var{$result}, @var{$status}) =} @
                     process (@var{$input})
... Set @var{$status} to 0 in case of failure ...
@end deftypefn

生成效果:

Sub: ($result, $status) = process ($input)

… Set $status to 0 in case of failure …

@deftypefn 会为名称在函数索引中创建条目。

@deftypefun data-type name arguments…

@deftypefun 是专用于函数的定义命令,等价于:‘@deftypefn Function …’。

@deftypefun 同样会为名称在函数索引中创建条目。

通常返回类型与函数名、参数打印在同一行,如前面示例所示。在源码中,GNU 对强类型函数的风格是 返回类型单独占一行 。因此 Texinfo 提供对应选项: @deftypefnnewline on

该设置 只影响本节通用强类型命令 ,不影响无类型简单函数(如 @deffn )、强类型变量等。具体影响本节命令,以及面向对象语言的同类命令: @deftypeop@deftypemethod (参见面向对象方法)。

指定 @deftypefnnewline off 可恢复默认行为。

13.6.3. 变量及类似实体

以下是用于定义变量及类似实体的命令:

@defvr category name

@defvr 是用于定义 类似变量 (即用于记录值的实体)的通用定义命令。你需要选用一个术语来描述所定义实体的类别;例如,如果该实体是变量,可使用 “Variable”(变量)。 @defvr 命令写在行首,同一行后续依次为: 实体类别实体名称

建议将类别名称按标题格式首字母大写。如果类别名称中包含空格(例如 “User Option”),需用大括号 ‘{}’ 括起来,否则第二个单词会被误判为实体名称。示例:

@defvr {User Option} fill-column
This buffer-local variable specifies
the maximum width of filled lines.
...
@end defvr

使用单独一行的 @end defvr 结束定义。

@defvr 会为该名称在 变量索引 中创建一条目。

@defvar name

@defvar 是专用于 变量 的定义命令,等价于:‘@defvr Variable …’。

示例:

@defvar kill-ring
...
@end defvar

@defvar 会为该名称在 变量索引 中创建一条目。

@defopt name
@defopt 是专用于 用户选项 的定义命令,即供用户根据喜好自行修改的变量;Emacs 中有大量此类变量(参见《GNU Emacs 手册》中的 Variables 章节)。 @defopt 等价于:‘@defvr {User Option} …’。

13.6.4. 强类型语言中的变量

强类型语言中的变量,其处理方式与强类型语言中的函数类似。参见《强类型语言中的函数》一节。通用定义命令 @deftypevr 对应 @deftypefn ,专用定义命令 @deftypevar 对应 @deftypefun

@deftypevr category data-type name

@deftypevr 是用于定义强类型语言中 类似变量 (即用于存储值的实体)的通用定义命令。你需要选用一个术语来描述所定义实体的类别;例如,如果该实体是变量,可使用 “Variable”(变量)。

@deftypevr 命令写在行首,同一行后续依次为:所描述实体的类别、数据类型以及该实体的名称。

示例:

@deftypevr {Global Flag} int enable
...
@end deftypevr

生成效果如下:

Global Flag: int enable

@deftypevar data-type name
@deftypevar 是专用于 强类型语言中变量 的定义命令,等价于:‘@deftypevr Variable …’。

这些命令都会在 变量索引 中为对应名称创建条目。

13.6.5. 数据类型

以下是用于数据类型的命令:

@deftp category name attributes…

@deftp 是用于 数据类型 的通用定义命令。该命令写在行首,同一行后续依次为:类别、类型名称(如 int、float 这类单词),然后是该类型对象的属性名称。因此,你可以用该命令描述 intfloat ,此时可以将 数据类型 作为类别。(数据类型是对一类对象的归类,用于确定可以对其执行哪些操作。)

例如,在 Lisp 中, pair 表示一种特定的数据类型,该类型的对象有两个槽位,分别称为 CARCDR 。下面是定义 pair 的第一行写法:

@deftp {Data type} pair car cdr
...
@end deftp

@deftp 会在 数据类型索引 中为该名称创建条目。

13.6.6. 面向对象编程

本节是用于格式化描述 抽象对象 (如面向对象编程中所用对象)的命令。类(class) 是一种被定义的抽象对象类型。类的实例(instance) 是属于该类类型的具体对象。实例变量(instance variable) 是属于类的变量,但每个实例都拥有自己独立的值。

13.6.6.1. 面向对象的变量

这些命令用于在面向对象编程语言中定义各类变量。

@defcv category class name

@defcv 是用于定义 面向对象编程中与类关联的变量 的通用定义命令。 @defcv 后面带三个参数:所定义实体的类别、它所属的类、以及名称。

例如:

@defcv {Class Option} Window border-pattern
...
@end defcv

生成效果:

Class Option of Window: border-pattern

@defcv 会在 变量索引 中创建条目。

@deftypecv category class data-type name

@deftypecv 是用于定义 面向对象编程中带类型的类变量 的命令。它与 @defcv 类似,只是多了一个 数据类型 参数,用于指定实例变量的类型。

例如:

@deftypecv {Class Option} Window int border-pattern
...
@end deftypecv

生成效果:

Class Option of Window: int border-pattern

@deftypecv 会在 变量索引 中创建条目。

@defivar class name

@defivar 是用于定义 面向对象编程中实例变量 的专用命令。 @defivar 等价于: ‘@defcv {Instance Variable} …’。例如:

@defivar Window border-pattern
...
@end defivar

生成效果:

Instance Variable of Window: border-pattern

@defivar 会在 变量索引 中创建条目。

@deftypeivar class data-type name

@deftypeivar 是用于定义 面向对象编程中带类型的实例变量 的命令。它与 @defivar 类似,只是多了一个 数据类型 参数,用于指定实例变量的类型。例如:

@deftypeivar Window int border-pattern
...
@end deftypeivar

生成效果:

Instance Variable of Window: int border-pattern

@deftypeivar 会在 变量索引 中创建条目。

13.6.6.2. 面向对象的方法

这些命令用于定义面向对象编程语言中类似方法的各类函数型实体。这类实体和函数一样可以接收参数,但与特定的对象类相关联。

@defop category class name arguments…

@defop 命令用于定义这类带 简单参数、类似方法 的实体。

例如,某些系统中有称为 “包装器(wrapper)” 的构造,它们像方法一样与类关联,但行为更像宏而非函数。你可以用 @defop Wrapper 来描述这类构造。

有时需要区分操作(operation)与方法(method)。可以把 操作 理解为方法的 规范/接口 。例如,窗口系统可能规定所有窗口类都有一个名为 expose 的方法;我们就说该窗口系统为所有窗口定义了一个 expose 操作。通常,操作会指定名称与参数形式;所有实现该操作的方法都必须接受相同参数,因为使用该操作的应用并不关心具体由哪个方法来实现它。

很多时候, 为操作写文档比为方法写文档更有意义 。例如,窗口应用开发者只需要知道 expose 这个操作,而不必关心某个具体窗口类是否用自己的方法实现了它。描述该操作可以这样写:

@defop Operation windows expose

@defop 命令写在行首,同一行后续依次为:操作的类别、所属类名、操作名称,以及参数(如有)。

@defop 会在 函数索引 中生成形如 ‘expose on windows’ 的条目。

@deftypeop category class data-type name arguments…
@deftypeop 是面向对象编程中 操作 的通用定义命令,特别适合 强类型面向对象语言 。它与 @defop 类似,只是多了一个 data-type数据类型 参数,用于指定方法的返回值信息(如返回类型)。
@defmethod class name arguments…

@defmethod 是面向对象编程中 方法 的专用定义命令。方法是一种为特定类及其子类实现某个操作的函数。

@defmethod 等价于:‘@defop Method …’。命令写在行首,后续依次为:方法所属类名、方法名、参数(如有)。

示例:

@defmethod bar-class bar-method argument
...
@end defmethod

定义了 bar-class 类中名为 bar-method 的方法,该方法接收一个参数。

@defmethod 会在 函数索引 中创建条目。

@deftypemethod class data-type name arguments…
@deftypemethod 是面向对象语言(尤其是 C++、Java 等强类型语言)中方法的定义命令。它与 @defmethod 类似,只是多了一个 data-type数据类型 参数,用于指定方法的返回值信息(如返回类型)。

带有返回值信息 的这些命令会受 @deftypefnnewline 选项影响(参见「强类型语言中的函数」一节)。

13.7. 通用定义命令

Texinfo 提供了不会自动生成索引条目的定义类命令。

使用 @defblock@end defblock 配对来创建一个 通用定义环境 。在该环境内部,对每个要编写文档的符号使用一行 @defline@deftypeline 。示例:

@defblock
@defline Macro mac (arg1, arg2)
Description of mac.
@deftypeline Builtin int foo (int @var{bar})
Description of foo.
@end defblock

输出效果:

Macro: mac (arg1, arg2)
Description of mac.
Builtin: int foo (int bar)
Description of foo.

@defline 的语法与 @deffn 类似。第一个参数指定定义的 类别 ,后面依次是 符号名称参数 (如有)。包含空格的参数需要用大括号括起来。

@deftypeline 的用法与 @deftypefn 类似:在类别之后指定 数据类型 ,并用 @var 标记参数(参见《强类型语言中的函数》一节)。

如果要让多个符号共用同一段描述,可以将多条 @defline 连续放在一起。示例:

@defblock
@defline Function set-var (value)
@defline {Settable Variable} var
Description of set-var and var.
@end defblock

输出效果:

Function: set-var (value)
Settable Variable: var
Description of set-var and var.

行宏 (参见行宏)与这些命令结合使用会很有用。

13.8. 编写定义的规范

一份手册不应为同一个名称提供多个定义。用于汇总内容的附录应使用 @table ,而非各类定义命令。

使用 @deffn@defun 或其他定义命令编写文档时,请尽量使用 能体现含义的参数名 ,例如 forward-word 函数的 count 参数。同时,如果参数名中包含类型名称(如 integer),请确保该参数确实属于此类型。

字体规范

由于 Texinfo 是 语义化标记语言 ,在定义中应 尽量避免 使用显式字体命令指定样式(参见 “打印用字体” 一节)。仅当需要解决特定输出格式或结构的问题时,才考虑使用。常见用法如下:

  • 使用 @r{&keyword} 显式标记类似 ‘&keyword’ 这样的 Lisp 关键字,输出为: &keyword。

    注意:目前定义行中的这类关键字在 TeX 中会以罗马体显示,但其他输出格式不做此处理。

  • 使用 ‘@r{@slanted{argument}}’,效果为: argument ,作用与 @var 类似,但可避免在 Info 格式中将内容转为大写。

    在以上两种用法中, @r 会将当前定义行的字体(斜体或等宽体)重置为 标准罗马正体

  • 你可以使用 @t (甚至 ‘@r{@t{…’,用 @r 先重置字体)来标记定义行中的 字面语法 ,避免这些内容被显示为斜体罗马体。此处不宜使用 @code ,因为它会在 Info 输出中自动添加引号。

要得到理想效果,可能需要一定的尝试与调试。与往常一样,嵌套字体命令的效果取决于输出格式,因此应尽量避免。

建议尽量减少这类特殊字体用法。可行方案是:将它们封装在 @macro 中(参见 “定义新的 Texinfo 命令” 一节),方便日后统一修改。

13.9. 函数定义示例

下面是摘自《GNU Emacs Lisp 参考手册》中 “调用函数” 一节的定义,使用了 @defun 命令。函数名 apply 紧跟在 @defun 命令之后,同一行后面是参数列表。

Function: apply function &rest arguments

apply calls function with arguments, just like funcall but with one difference: the last of arguments is a list of arguments to give to function, rather than a single argument. We also say that this list is appended to the other arguments.

apply returns the result of calling function. As with funcall, function must either be a Lisp function or a primitive function; special forms and macros do not make sense in apply.

(setq f 'list)
    ⇒ list
(apply f 'x 'y 'z)
error→ Wrong type argument: listp, z
(apply '+ 1 2 '(3 4))
    ⇒ 10
(apply '+ '(1 2 3 4))
    ⇒ 10

(apply 'append '((a b c) nil (x y z) nil))
    ⇒ (a b c x y z)

An interesting example of using apply is found in the description of mapcar.

在 Texinfo 源文件中,这个示例应写成如下形式:

@defun apply function @r{&rest} arguments
@code{apply} calls @var{function} with
@var{arguments}, just like @code{funcall} but with one
difference: the last of @var{arguments} is a list of
arguments to give to @var{function}, rather than a single
argument.  We also say that this list is @dfn{appended}
to the other arguments.

@code{apply} returns the result of calling
@var{function}.  As with @code{funcall},
@var{function} must either be a Lisp function or a
primitive function; special forms and macros do not make
sense in @code{apply}.

@example
(setq f 'list)
    @result{} list
(apply f 'x 'y 'z)
@error{} Wrong type argument: listp, z
(apply '+ 1 2 '(3 4))
    @result{} 10
(apply '+ '(1 2 3 4))
    @result{} 10

(apply 'append '((a b c) nil (x y z) nil))
    @result{} (a b c x y z)
@end example

An interesting example of using @code{apply} is found
in the description of @code{mapcar}.
@end defun

在本手册中,该函数在 命令与变量索引 中归类于 apply 条目下。

14. 国际化

Texinfo 对使用英语以外的其他语言编写文档提供了一定支持,不过这部分功能仍需大量完善工作。(如果你参与翻译输出到文档中的固定字符串,可参考「文档字符串的国际化」。)

关于 Texinfo 支持的各类带重音字符及特殊字符列表,参见「插入重音符号」。

14.1. @documentlanguage ll [ _cc ]: 设置文档语言

@documentlanguage 命令用于声明当前文档的语言区域。该命令需 单独成行 ,写在文件开头附近。

@documentlanguage ll[_cc]

在命令名后填写两位 ISO 639-2 语言代码 (ll),可选择性地跟上一个下划线与两位 ISO 3166 国家代码 (cc)。若为多语言文档,可 多次使用 该命令,以声明每次语言切换。若完全不使用此命令,默认语言为 en_US (美式英语)。

与 GNU Gettext 类似(参见 Gettext ),若省略国家代码,会尽可能采用该语言的主流方言。例如: de 等价于 de_DE (德国使用的德语)。

此命令会更改各种 document strings文档字符串 的翻译,例如交叉引用中的 “see” (见Cross-references)、函数定义中的 “Function” (见定义命令)等。此外,该命令还可可选地影响 texi2any 对索引的排序方式(参见「全局自定义变量」中的 DOCUMENTLANGUAGE_COLLATION 部分)。

注意:在 Info 格式输出中,部分字符串属于关键字, 不会被翻译 ,例如 “Node:”、“Next:”、“Menu:” 等。

在 DocBook 输出中, @documentlanguage 用于设置后续章节的语言。

对于 LaTeX,该命令会在导言区生成加载 ‘babel’ 宏包的代码,并输出 \selectlanguage

对于 TeX,该命令会读取文件 txi-locale.tex (若存在)。如果 @documentlanguage 参数带有可选的 ‘_cc’ 后缀,会优先尝试该组合:例如使用 @documentlanguage de_DE 时,TeX 会先查找 txi-de_DE.tex ,再查找 txi-de.tex

这类以 txi-* 命名的文件,用于重新定义 TeX 输出中使用的各类英文词汇,例如 “Chapter”(章)、“See”(参见)等。我们知道,这类单独的词汇通常无法孤立地进行翻译,而对于表意文字(及其他文字体系)而言,还需要一套截然不同的实现方案。欢迎为改进 Texinfo 的语言支持提供帮助。

如果运行的 TeX 程序具备相应支持, @documentlanguage 还会切换 TeX 当前的 断字模式 。标准的 tex 程序通常不支持这一功能,但更新版的扩展 TeX 程序一般都已支持: etex (输出 DVI)、 pdftex (输出 PDF)。若系统中存在这些扩展版本, texi2dvi 会自动使用它们(参见 “使用 texi2dvi 格式化”)。

由于语言代码和国家代码的列表更新相对频繁,本文档不尝试在此罗列。有效的语言代码可参阅 ISO 639 官方主页:http://www.loc.gov/standards/iso639-2/。ISO 3166 对应的国家代码及官方相关信息可通过https://en.wikipedia.org/wiki/ISO_3166查询。

14.2. @documentencoding enc: 设置输入编码

默认情况下,文档的输入与输出编码均采用 UTF-8—— 这是一种通用的 8 位全局字符编码,与 7 位 ASCII 兼容。建议为 Texinfo 手册统一使用 UTF-8 编码。

@documentencoding 命令用于声明 输入文档编码 ,同时也会影响输出编码。如果你的文档编码不是默认值,请在文件开头附近单独一行书写该命令,并跟上合法的编码名称:

@documentencoding enc

UTF-8 始终是编码的最佳选择。Texinfo 仍支持其他编码,主要是为了兼容旧版手册8

US-ASCII
基于英文字母的字符编码。
ISO-8859-1
ISO-8859-15
ISO-8859-2

分别对应 UTF-8 之前西欧(前两种)与东欧(第三种)语言的标准编码。ISO-8859-15 将 8859-1 中部分少用字符(如预制分数符号)替换为更常用的符号,例如欧元符号 €。

编码的完整说明不在本文范围内,可参考:http://czyborra.com/charsets/iso8859.html

koi8-rUTF-8
之前俄语常用编码。
koi8-uUTF-8
之前乌克兰语常用编码。

输出格式中的编码处理

Info 格式输出,会生成一段 ‘Local Variables’ (参见《GNU Emacs 手册》中的文件变量),包含输出编码,方便 Info 阅读器正确设置。如:

Local Variables:
coding: UTF-8
End:

默认情况下,对于 Info 与纯文本输出, texi2any 会尽可能将重音符号、特殊字符(如 @'e )直接输出为对应输出编码下的 UTF-8 序列或 8 位字符。若无法实现,或使用了 --disable-encoding 选项,则改用 ASCII 转写。

HTML 输出,会在 HTML 的 ‘<head>’ 部分输出 ‘<meta>’ 标签,声明输出编码,供服务器与浏览器正确解析页面:

<meta http-equiv="Content-Type" content="text/html;
     charset=utf-8">

在 HTML 与 LaTeX 输出中,若设置了 OUTPUT_CHARACTERS (参见多格式自定义变量),重音与特殊字符(如 @'e`` )会尽可能直接输出为目标编码的真实字符;否则 HTML 中使用 HTML 实体,LaTeX 中使用 LaTeX 宏。

DocBook 输出,若编码与 UTF-8 不同,会在 XML 声明中添加编码属性。若设置了 OUTPUT_CHARACTERS ,重音结构(如 @'e )会尽可能输出为 8 位或 UTF-8 字符,否则使用 XML 实体。

TeX 输出,会输出标准 Computer Modern 字体支持的字符,例如使用构造式重音而非预制字形。使用缺失字符或指定未实现的编码都会产生警告。

尽管现代 TeX 系统支持全球几乎所有文字,但 texinfo.tex 并未集成如此全面的支持,也难以完整复刻相关工作。

LaTeX 输出,会根据编码自动生成加载 inputenc 宏包的代码。这不能保证输入文档中的所有字符都能正常输出:默认字体通常只覆盖 Texinfo 特定字形,而非全部编码字符。你可能需要在导言区加载其他字体,并配合 UTF-8 编码使用 \DeclareUnicodeCharacter ,例如:

@latex
\DeclareUnicodeCharacter{017B}{\.Z}
@end latex

节点名称含非 ASCII 字符、且使用不同字符编码的 Info 文件之间, 交叉引用会失效 。强烈建议:凡是交叉引用目标包含非 ASCII 字符的手册, 只使用 UTF-8 编码

15. 条件可见文本

conditional commands条件命令 允许你为不同的输出格式,或为你自定义的通用条件使用不同的文本。例如,你可以用它们为打印版手册和 Info 输出分别指定不同的文本。

条件命令包含以下类别:

  • 特定于某一输出格式的命令(Info、TeX、HTML……)。
  • 特定于 排除某一格式之外 所有输出格式的命令(例如,非 Info、非 TeX……)。
  • 用于任意输出格式的 ‘Raw’ 格式化器文本,仅对 @-commands 做最少(但非零)解析后直接传递。
  • 与格式无关的变量替换,以及判断变量是否被设置或清除。

15.1. 条件命令

Texinfo 为每种输出格式都提供了对应的 @if格式 环境,用于 只在特定输出格式下包含文本

@ifinfo 开始的文本段,在不生成 Info 输出时(尤其是打印输出时)会被忽略。该文本段只出现在 Info 文件中,同时出于历史兼容考虑,也会出现在纯文本输出中。

其他格式对应的环境用法类似:

@ifdocbook … @end ifdocbook
文本只在 DocBook 输出中显示。
@ifhtml … @end ifhtml
文本只在 HTML 输出中显示。
@iflatex … @end iflatex
文本只在 LaTeX 输出中显示。
@ifplaintext … @end ifplaintext
文本只在纯文本输出中显示。
@iftex … @end iftex
文本只在打印手册中显示。
@ifxml … @end ifxml
文本只在 XML 输出中显示。

@if…@end if… 命令 必须单独占一行 出现在源文件中。命令后的换行符(大致)会被当作空白处理,因此条件文本可以正常融入周围段落。

@if… 结构用于对普通 Texinfo 源码做条件处理;如需直接使用底层格式命令,可参考「RAW 格式化器命令」。

下面是展示所有这些条件命令的示例:

@iftex
This text will appear only in the printed manual.
@end iftex
@ifinfo
However, this text will appear only in Info and plain text.
@end ifinfo
@ifhtml
And this text will only appear in HTML.
@end ifhtml
@iflatex
Moreover, this text will only appear in @LaTeX{}.
@end iflatex
@ifplaintext
Whereas this text will only appear in plain text.
@end ifplaintext
@ifxml
Notwithstanding that this will only appear in XML.
@end ifxml
@ifdocbook
Nevertheless, this will only appear in DocBook.
@end ifdocbook

上面的示例会生成如下一行(取决于你阅读的手册版本):

And this text will only appear in HTML.

可以看到,你 只会看到其中一行输入 ,具体取决于你阅读的是手册的哪个版本。

在复杂文档中,你可能希望 Texinfo 在某些 本不应被处理 的条件分支中发出错误提示。命令 @errormsg{text} 可实现此功能,它接受一个参数,即错误提示文本。

我们在这里提及 @errormsg{} ,尽管它与条件命令并非严格相关,但在实际使用中,它最常用于条件环境中。从技术上讲,它可以在任何位置使用。关于 @errormsg 在 TeX 中输出的行号问题,可参考「外部宏处理器:行指令」。

15.2. 条件取反命令

你可以使用 @ifnot… 环境,指定 除指定格式外 的所有输出格式都包含的文本:

@ifnotdocbook ... @end ifnotdocbook
@ifnothtml ... @end ifnothtml
@ifnotinfo ... @end ifnotinfo
@ifnotlatex ... @end ifnotlatex
@ifnotplaintext ... @end ifnotplaintext
@ifnottex ... @end ifnottex
@ifnotxml ... @end ifnotxml

@ifnot… 命令与 @end 命令在源文件中必须 单独占一行

如果输出文件正好是指定的格式,则该段内容会被忽略;否则会被包含进来。

有一个 例外 (出于历史兼容): @ifnotinfo 文本会在 Info 与纯文本输出中都被省略,而不只是 Info。如果要指定只在 Info 中显示、不在纯文本中显示的文本,请使用 @ifnotplaintext ,示例如下:

@ifinfo
@ifnotplaintext
This will be in Info, but not plain text.
@end ifnotplaintext
@end ifinfo

这些命令所界定的区域,与 @iftex 一样是普通的 Texinfo 源码,而不是像 @tex 那样的原始格式化源码(参见原始格式化命令)。

15.3. Raw 格式化命令

前面介绍的 @if… 条件命令 只能 用于普通 Texinfo 源码。例如,普通 TeX 的大部分特性在 @iftex 内部并不能正常工作。 @if… 的用途是为 Texinfo 源码提供条件处理,而不是提供对底层格式化功能的直接访问。为此,Texinfo 提供了所谓的 raw formatter commands原始格式命令 。它们只应在真正需要时使用(大多数文档并不需要)。

第一个原始格式化器命令是 @tex 。通过用 @tex@end tex 划定一段区域,你可以完整使用纯 TeX 语法,并在 TeX 命令中使用反斜杠 ‘\’。在 @tex 区域内,所有纯 TeX 命令与字符分类都会被恢复。唯一例外是: @ 仍然作为命令起始符,以便处理器能识别 @end tex 。除非正在生成 TeX 输出,否则 Texinfo 处理器不会输出该区域内的内容。

在复杂场景下,你可能希望在 @tex 内部定义新的 TeX 宏。这时必须使用 \gdef ,而不是 \def ,因为 @tex 区域是在一个 TeX 分组内处理的。如果你需要定义多个宏,可以设置 \globaldefs=1 (当分组在 @end tex 结束时,它的值会像往常一样恢复为 0,因此不会对文档其余部分造成问题)。

下面是一个用纯 TeX 编写的独立公式示例:

@tex
$$ \chi^2 = \sum_{i=1}^N
         \left (y_i - (a + b x_i)
         \over \sigma_i\right)^2 $$
@end tex

这个示例的输出 只会出现在打印版手册中 。如果你正在非 TeX 生成的格式中阅读本文,将看不到打印版里的这个公式。

类似地,你可以使用:

  • @html … @end html 插入一段原始 HTML
  • @docbook … @end docbook 插入一段原始 DocBook
  • @latex … @end latex 插入一段原始 LaTeX
  • @xml … @end xml 插入一段原始 XML

原始区域内的换行符行为未做明确规定。

在所有情况下,原始处理过程中, @ 的含义与文档其他部分保持一致。因此,无论最终输出格式是什么,Texinfo 处理器都必须识别并在一定程度上执行原始区域内的内容。所以, 在原始区域内编写会全局影响文档的修改,会导致不可预测且通常不合预期的行为 。例如,在原始区域内使用 @kbdinputstyle 命令属于未定义行为。解决办法很简单: 不要这么做

15.4. 行内条件: @inline@inlineifelse@inlineraw

Texinfo 提供了一组 行内条件命令 ,其参数使用花括号包裹:

@inlinefmt{format, text}
仅在生成指定 format格式 输出时,处理该段 Texinfo text文本
@inlinefmtifelse{format, then-text, else-text}
若正在生成指定 format格式 ,则处理「满足时文本」;否则处理「不满足时文本」。
@inlineraw{format, text}
用法类似,但用于插入原始格式文本(参见 RAW 格式化命令)。

支持的 format格式 名称有:docbook、html、info、latex、plaintext、tex、xml

示例:

@inlinefmt{html, @emph{HTML-only text}}

几乎等价于:

@ifhtml
@emph{HTML-only text}
@end ifhtml

唯一区别是:行内命令 不会 额外添加空白,而环境写法会。

在这些命令中,参数分隔逗号后的空白会被忽略(常规规则),但文本末尾的空白不会被忽略。

若要在参数中插入字面意义的 ‘@’、左大括号 ‘{’ 或右大括号 ‘}’,必须使用字符命令 @atchar{} (参见《使用 @@@atchar{} 插入 @ 》)以及 @lbracechar{}@rbracechar{} (参见《插入 ‘{}’ 使用 @{ @}@l rbracechar{} 》),否则会导致解析混乱。

使用 @inlinefmtifelse 时,还必须使用 @comma{} ,以避免把文本中的逗号 ‘,’ , 误当作参数分隔符。而 @inlinefmt@inlineraw 则不需要 @comma{} (尽管使用也无妨),因为这些命令始终只有两个参数。

对于 TeX 格式,要被处理的 text文本 中不能包含以换行分隔的命令;但会被忽略的文本(即非 TeX 格式下的内容)则不受此限制。

另外还有两个 @inline... 系列条件命令,与 @ifset@ifclear 配套使用,详见下一节。

15.5. 标志: @set@clear 、条件判断与 @value

你可以使用 @set@clear@ifset@ifclear 命令,控制 Texinfo 格式化命令 渲染或忽略 文档中的某部分内容。以下是概要说明:

@set flag [value]
定义变量 flag ,若指定了可选值 value ,则将其赋值给该变量。
@clear flag
取消定义变量 flag ,无论该变量之前是否已定义。
@ifset flag
如果 flag 已被定义,则从当前到下一个 @end ifset 之间的文本会被渲染;如果 flag 未被定义,则该段文本会被忽略。
@inlineifset{flag, text}
@ifset 的花括号行内版本。
@ifclear flag
如果 flag 已被定义,则从当前到下一个 @end ifclear 之间的文本会被忽略;如果 flag 未被定义,则该段文本会被渲染。
@inlineifclear{flag, text}
@ifclear 的花括号行内版本。

@set 与 @value @ifset 与 @ifclear @inlineifset 与 @inlineifclear @value 示例

15.5.1. @set@value

你可以使用 @set 命令为一个 标志(flag) 指定取值,之后该值会被 @value 命令展开。

标志(也称变量)名是一个标识符,以字母、数字、‘-’ 或 ‘_’ 开头。后续字符(如果有)不能是:空白符、@、大括号、尖括号,以及 ‘~`^+|’ 中任意一个;其他字符(如 ‘%’)通常可以使用。但 建议 标志名只使用字母和数字,不要用 ‘-’、‘_’ 或其他符号 ——因为 TeX 的限制,这些符号在某些场景下可用,但并非全部场景都可靠。

取值是输入行中命令之后的剩余全部内容,可以包含任意字符。

@set 命令写法如下:

@set foo This is a string.

这会将标志 foo 的值设为:“This is a string.”

Texinfo 处理器会将 @value{flag} 替换为该标志被设定的字符串。因此,当 foo 如上定义时,处理器会把:

@value{foo}

展开为:

This is a string.

你可以在段落内部使用 @value 命令;但 @set 命令必须单独占一行。

如果像这样只写标志名、不写取值:

@set foo

那么 foo 的值就是空字符串。

如果用 @clear flag 清除了之前定义的标志,那么后续的 @value{flag} 会报错。

示例:如果你定义:

@set howmuch very, very, very

那么处理器会把:

It is a @value{howmuch} wet day.

转换为:

It is a very, very, very wet day.

如果你执行:

@clear howmuch

那么处理器会把:

It is a @value{howmuch} wet day.

转换为:

It is a {No value for "howmuch"} wet day.

@value 不能可靠地用作重音命令的参数(参见「插入重音」)。例如,下面的写法会失效:

@set myletter a
@'@value{myletter}

15.5.2. @ifset@ifclear

当某个 flag标志 被设置时,Texinfo 格式化命令会渲染 @ifset 标志名 与对应的 @end ifset 之间的文本。当该 flag标志 被清除时,这些文本则不会被渲染。 @ifclear 的工作方式与此相反。

将需要条件渲染的文本写在 @ifset 标志名@end ifset 之间,示例如下:

@ifset flag
conditional-text
@end ifset

例如,你可以在同一个文档里实现两个版本,比如为 “large” 和 “small” 编写同一份手册:

You can use this machine to dig up shrubs
without hurting them.

@set large

@ifset large
It can also dig up fully grown trees.
@end ifset

Remember to replant promptly ...

在这个例子中,由于 large 标志已被设置,格式化命令会渲染 @ifset large@end ifset 之间的文本。

flag标志 被清除时,Texinfo 格式化命令不会渲染 @ifset 标志名@end ifset 之间的文本;这段内容会被忽略,不会出现在输出中。

例如,如果你在上例的 @set large 之后、条件文本之前加入 @clear large 命令,那么格式化命令会忽略 @ifset large@end ifset 之间的内容。在最终输出里,这段文字不会显示;你只会看到:“You can use this machine to dig up shrubs without hurting them. Remember to replant promptly …”。

如果某个标志通过 @clear 标志名 被清除,那么格式化命令会渲染 @ifclear@end ifclear 之间的文本。反之,如果该标志通过 @set 被设置,则 @ifclear@end ifclear 之间的文本会被忽略。 @ifclear 命令的写法如下:

@ifclear flag

15.5.3. @inlineifset@inlineifclear

@inlineifset@inlineifclear 提供了 用花括号包裹 的替代写法,对应 @ifset@ifclear ,与其他 @inline... 系列命令类似(参见 行内条件命令: @inline@inlineifelse@inlineraw )。前面提到的关于参数解析的注意事项,在这里同样适用。

@inlineifset{var, text}
如果标志 var 已定义,则处理该段 Texinfo text文本
@inlineifclear{var, text}
如果标志 var 未定义,则处理该段 Texinfo text文本

除语法不同外,它们的整体行为与用途和上一节介绍的 @ifset@ifclear 完全一致。

15.5.4. @value 示例

你可以使用 @value 命令,在手册更新时 只修改一处内容,就能全局生效 ,从而减少需要修改的位置。关于在 Automake 发行版中使用此技巧的完整示例,参见 GNU 示例文本。

本示例改编自《GNU Make 手册》。

  1. 设置标志:

    @set EDITION 0.35 Beta
    @set VERSION 3.63 Beta
    @set UPDATED 14 August 1992
    @set UPDATE-MONTH August 1992
    
  2. 为 @copying 段落编写文本(参见 @copying: 声明复制权限):

    @copying
    This is Edition @value{EDITION},
    last updated @value{UPDATED},
    of @cite{The GNU Make Manual},
    for @code{make}, version @value{VERSION}.
    
    Copyright ...
    
    Permission is granted ...
    @end copying
    
  3. 为打印版手册的标题页编写文本:

    @titlepage
    @title GNU Make
    @subtitle A Program for Directing Recompilation
    @subtitle Edition @value{EDITION}, ...
    @subtitle @value{UPDATE-MONTH}
    @page
    @insertcopying
    ...
    @end titlepage
    

    (在印刷封面上,只显示年月的日期,比显示年月日更简洁。)

  4. 为 Info 文件的 Top 节点编写文本:

    @ifnottex
    @node Top
    @top Make
    
    This is Edition @value{EDITION},
    last updated @value{UPDATED},
    of @cite{The GNU Make Manual},
    for @code{make}, version @value{VERSION}.
    @end ifnottex
    

    手册格式化后, @value 结构会被展开,最终输出类似如下内容:

    This is Edition 0.35 Beta, last updated 14 August 1992,
    of `The GNU Make Manual', for `make', Version 3.63 Beta.
    

更新手册时,你 只需修改这些标志的值 ,无需编辑上述三个章节。

15.6. 检测 Texinfo 命令: @ifcommanddefined@ifcommandnotdefined

偶尔,你可能希望让手册检测某个指定的 Texinfo 命令是否可用,如果不可用则采用某种备用格式化方案。为此提供了 @ifcommanddefined@ifcommandnotdefined 这两个条件命令。例如:

@ifcommanddefined node
Good, @samp{@@node} is defined.
@end ifcommanddefined

将会输出预期的内容:Good, ‘@node’ is defined.

该条件命令也会把文档中通过 @macro@alias@definfoenclose 以及 @def(code)index 定义的新命令视为 “已定义”(参见 定义新的 Texinfo 命令)。注意:TeX 实现会把所有内部 TeX 命令也一并视为 “defined已定义”;而 texi2any 实现在这一点上是可靠的。

你可以查看 Texinfo 源码发行包中的 NEWS 文件,或从 Texinfo 官网(https://www.gnu.org/software/texinfo)链接查看某个命令是在哪个版本加入的。

这些用于检测命令的条件命令本身是在 2013 年发布的 Texinfo 5.0 中才加入的 —— 这距离 Texinfo 诞生已经过去了数十年。要检测这些命令自身是否可用,可以检测预定义标志 txicommandconditionals ,示例如下:

@ifset txicommandconditionals
@ifcommandnotdefined foobarnode
(Good, @samp{@@foobarnode} is not defined.)
@end ifcommandnotdefined
@end ifset

由于标志(见上一节)在 Texinfo 早期就已存在,因此可以直接假定它们是可用的。

我们建议 尽可能避免使用这类检测 ,通常也确实不需要这么做。对大多数软件包而言,合理的做法是要求所有开发者安装指定版本(或更新版本)的 Texinfo,无需兼容过老版本。(任何人都可以轻松下载并安装 Texinfo 源码,它没有麻烦的依赖。)

对于最终用户,一般不会出现 Texinfo 版本问题。在正确发行的软件包中,用户不需要为了编译安装软件而去处理 Texinfo 手册,直接使用预先格式化好的 Info(或其他格式)文件即可。这通常是更可取的方式,可以避免软件包之间产生不必要的依赖(参见 GNU 编码标准中的 发行版 相关内容)。

15.7. 条件嵌套

Texinfo 要求:对于不生效的条件,被忽略的文本必须相对于该条件保持 正确的嵌套结构 。示例如下:

@ifset somevar
@ifset anothervar
Both somevar and anothervar are set.
@end ifset
@ifclear anothervar
Somevar is set, anothervar is not.
@end ifclear
@end ifset

如果 ‘somevar’ 未被设置,整个代码块都会被跳过。

为了让处理器能够可靠地判断哪些命令属于嵌套关系, 所有条件命令必须单独占一行 ,前后不能有任何文本(包括空格)。

16. 定义新的 Texinfo 命令

Texinfo 提供了多种定义新命令的方式(在所有情况下, 不建议 尝试重定义已存在的命令):

  • Texinfo macro宏 允许你将一段任意文本或已有命令(包括其他宏)定义为一个新的 Texinfo 命令。宏可以带有任意数量的参数 —— 每次使用宏时都需要传入这些文本内容。

    顺便说明:这类宏与 @defmac 命令无关,后者用于在手册主题范围内对宏进行文档说明(参见:定义模板)。

  • ‘@linemacro’ 用于定义一类宏,其参数会一直延伸到行末,并以空格分隔。
  • ‘@alias’ 为已有命令定义一个新名称。
  • ‘@definfoenclose’ 允许你为某些非打印输出格式定义带有自定义输出效果的新命令。 该命令已不推荐使用

最通用的方式(不仅限于定义新命令):可以调用任意外部宏处理器,并让 Texinfo 识别所谓的 #line 指令,以便进行错误提示指令,以便进行错误提示。

如果只需做 简单文本替换 ,使用 @set@value 是最简单的方案(参见:标记: @set@clear 、条件指令与 @value )。

16.1. 定义宏

你可以使用 Texinfo 的 @macro 命令来定义宏,格式如下:

@macro macroname{param1, param2, ...}
text ... \param1\ ...
@end macro

参数 param1param2 …… 对应后续在文档中使用该宏时传入的实参(下一节会介绍)。

原则上, macroname宏名 应由 字母与数字 组成,还可以包含连字符 ‘-’(但不能作为首字符)。不允许使用下划线 ‘_’,这样宏才能在 @math 命令内部直接调用,而无需在后面加空格(参见 @math@displaymath: 数学公式排版)。但是,若要让宏在 TeX 中也能正常工作, 宏名必须只由字母组成 :不能包含数字、连字符或其他特殊字符。因此,我们推荐 只使用字母 作为宏名。不应该将已有的 Texinfo 命令重定义为宏。

如果一个宏不需要参数,你可以用空参数列表定义:‘@macro foo{}’ 或者直接不写大括号:‘@macro foo’。

宏的 body定义体 中可以使用绝大多数 Texinfo 命令,包括调用其他宏。但是,在一个宏定义内部再定义另一个宏,由于 @macro 设计上的限制,在 TeX 中无法正常工作。

在宏体中,被反斜杠包围的参数名(如上例中的 ‘\param1\’),会被宏调用时对应的实参替换。你可以在宏体中 任意次 使用参数名,包括 0 次。

如果想在宏展开后得到一个反斜杠 ‘\’,需要写 ‘\\’。在宏体中其他任何单独使用 ‘\’ 的写法都会产生警告。

@macro 行之后、 @end macro 行之前的换行符会被忽略,即不会包含在宏体中。其余空白符按照常规的 Texinfo 规则处理。

如果希望宏可以 递归使用 (即在自身调用的参数里再次调用自己),必须使用 @rmacro 来定义,示例:

@rmacro rmac {arg}
a\arg\b
@end rmacro
...
@rmac{1@rmac{text}2}

这段代码会输出:‘a1atextb2b’。如果换成普通的 ‘@macro’,则会报错。

你可以用 @unmacro foo 取消定义名为 foo 的宏。取消一个原本就不存在的宏不会报错。例如:

@unmacro foo

16.2. 调用宏

宏定义完成之后(见上一节),你可以在文档中像这样调用(使用)它:

@macroname {arg1, arg2, …}

其效果大致等同于你在该位置直接输入宏 macroname 的内容。例如:

@macro foo {p, q}
Together: \p\ & \q\.
@end macro
@foo{a, b}

会生成:

Together: a & b.

可见,参数与实参之间用逗号分隔,并用花括号包裹;逗号 之后 (而非之前)的空白会被忽略。即使宏没有参数,调用时也必须写花括号,这与其他 Texinfo 命令保持一致。例如:

@macro argless {}
No arguments here.
@end macro
@argless{}

会生成:

No arguments here.

传递 包含逗号 的宏参数时需要格外小心,因为逗号本身也用于分隔参数。要在参数中包含逗号字符,最可靠的方法是使用 @comma{} 命令。另一种方法是用 ‘@asis{…}’ 将参数括起来。对于 texi2any ,你还可以在逗号前加反斜杠,写作 ‘\,’,但这在 TeX 中无效。

通常不必担心逗号问题。为方便使用宏,系统实现了两条 automatic quoting 自动转义 规则 :

  1. 如果宏只接收一个参数,调用时其中的所有逗号默认都会被转义。例如:

    @macro TRYME{text}
    @strong{TRYME: \text\}
    @end macro
    
    @TRYME{A nice feature, though it can be dangerous.}
    

    会输出:

    TRYME: A nice feature, though it can be dangerous.

    但要注意:单参数宏不会检查传入的参数数量,调用时请谨慎。

  2. 如果宏调用中嵌套了其他命令(包括宏自身递归调用),嵌套命令里的逗号默认会被转义。例如在:

    @say{@strong{Yes, I do}, person one}
    

    中,‘Yes’ 后面的逗号会被隐式转义。再看一个递归宏的例子:

    @rmacro cat{a,b}
    \a\\b\
    @end rmacro
    
    @cat{@cat{foo, bar}, baz}
    

    会生成字符串 ‘foobarbaz’。

  3. 除此之外,逗号都应像上面那样 显式转义 ,才能被当作参数的一部分。

在宏参数中,反斜杠本身可以用另一个反斜杠转义。例如:

@macname {\\bleh}

会将参数 ‘\bleh’ 传给 macname

texi2any 也识别 ‘\{’ 和 ‘\}’ 来表示花括号,但 TeX 中的实现不支持这两种写法。不过通常很少需要用到它们,只有当宏参数中包含 不匹配的花括号 时才需要。

如果一个宏被定义为恰好接收一个参数,调用时可以不写花括号,宏名后面整行内容都会被当作参数。例如:

@macro bar {p}
Twice: \p\ & \p\.
@end macro
@bar aah

会生成:

Twice: aah & aah.

在这类参数中,特殊字符不会被转义,每个 ‘\’ 都代表自身。

如果一个宏定义为接收多个参数,但调用时只传了一个(放在花括号内),剩余参数会被设为空字符串,且不会报错。例如:

@macro addtwo {p, q}
Both: \p\\q\.
@end macro
@addtwo{a}

只会生成:

Both: a.

16.3. 宏的细节与注意事项

按照设计,宏展开不应在以下场景中发生:

  • @macro@unmacro 所在行;
  • @if... 系列命令行,包括 @ifset 等;
  • @set@clear@value
  • @clickstyle 所在行;
  • 块命令内部未发生宏展开时的 @end 所在行。

遗憾的是,TeX 在这些情况下仍可能执行部分展开,从而可能引发错误。

此外,有不少与宏相关的结构在 TeX 中会出现问题;下面列出部分注意事项。因此,如果你在生成手册印刷版时遇到与宏相关的错误,可以尝试先用 texi2any 展开宏:在调用 texi2dvi 时加上 ‘-E’ 选项(见 使用 texi2dvi 进行格式化)。或者更稳妥的做法是: 完全不使用 Texinfo 内置宏 ,改用专门用于宏处理的语言,例如 M4(见 外部宏处理器:行指令)。

  • 如前所述, 宏名必须全部由字母组成
  • 不建议将任何 TeX 原语、plain 、TeX 命令或 Texinfo 命令名重新定义为宏。遗憾的是,这类命令数量庞大且无明确边界,可能导致的错误也无法预测。
  • 接收 多个参数 的宏,其参数 不能跨行
  • 包含必须单独成行的命令(如条件命令)的宏, 不能在行中间调用 。同理,包含面向行的命令或内容(如 @example 环境)的宏,在 TeX 中的行为可能不可预测。
  • 索引条目中宏展开后的 Texinfo 命令,可能会被当作字面文本排版(包括 “@” 符号),而不是按其本意解析。
  • 行首的空白会被忽略。
  • 宏不能可靠地用在重音命令的参数中(见 插入重音符号)。
  • 宏参数中用于转义逗号的反斜杠写法无效;必须使用 @comma{}
  • 在宏体末尾用 ‘@c’ 可能会导致 texi2any 将宏调用后的文本当作注释忽略。TeX 处理时则不会这样。过去常这样做来 “注释掉” 宏体末尾多余的换行,但现在已无必要,因为 @end macro 前的最后一个换行不会被包含在宏体中。
  • 一般来说,不能随意用宏(或 @value )调用替代 Texinfo 命令的参数,即使文本内容相同。Texinfo 不是 M4(甚至也不是 plain TeX)。有些命令可以这样用,有些则会失败。最好完全避免这样做。例如,下面的写法会失败:

    @macro offmacro
    off
    @end macro
    @headings @offmacro
    

    这看起来等价于 @headings off ,但出于 TeX 技术原因,会报出难以理解的错误:‘Paragraph ended before @headings was complete’。

  • 在数学环境中展开宏,可能导致 TeX 输出的间距异常。例如:

    @iftex
    @macro atan
    \\mathop{\\rm atan}
    @end macro
    @end iftex
    
    @math{@atan{}(x)}
    

    ‘@atan’ 后的花括号会被 TeX 当作子公式,导致左括号前出现多余空格。可以改用原生 TeX 宏来绕过:

    @tex
    \gdef\atan#1{\mathop{\rm atan}}
    @end tex
    

    定义中的 ‘#1’ 会吸收花括号,从而使 \mathop 的间距符合预期。

  • 如果在宏内部使用条件命令有问题, 替代方案是在条件块内部定义不同版本的宏 。例如,不要这样写:

    @macro Mac
    @iftex
    text for TeX output
    @end iftex
    @ifnottex
    text for not TeX output
    @end ifnottex
    @end macro
    

    而改用:

    @iftex
    @macro Mac
    text for TeX output
    @end macro
    @end iftex
    
    @ifnottex
    @macro Mac
    text for not TeX output
    @end macro
    @end ifnottex
    
  • 宏不能以自然方式定义另一个宏。要实现这一点,必须结合条件判断和原生 TeX。例如:

    @ifnottex
    @macro ctor {name, arg}
    @macro \name\
    something involving \arg\ somehow
    @end macro
    @end macro
    @end ifnottex
    @tex
    \gdef\ctor#1{\ctorx#1,}
    \gdef\ctorx#1,#2,{\def#1{something involving #2 somehow}}
    @end tex
    

以下限制属于设计使然:

  • 如果要传递带 Texinfo 命令 @ ,(生成软音符,见 插入重音符号)的参数,必须使用 @value 或其他变通方案,否则逗号可能被当作参数分隔符。在 texi2any 中可以用反斜杠转义逗号;在 TeX 中则需要其他方法,因此我们推荐使用统一的变通方案。例如:

    @macro mactwo{argfirst, argsecond}
    \argfirst\+\argsecond\.
    @end macro
    @set fc Fran@,cois
    @mactwo{@value{fc},}
    

    会生成:

    François+.

  • @verbatim 与宏不能混用;例如,不能在宏内部开始 verbatim 块,而在宏外部结束(见 @verbatim: 字面文本)。同理,在宏内部开始任意环境并在外部结束,可能可用也可能失效。
  • 可以编写完整定义另一个宏的宏,但 不允许嵌套不完整的宏定义 。即 @macro@end macro@rmacro 同理)必须正确配对。例如,不能在一个宏内部开始宏定义,而在该宏外部结束这个嵌套定义。

在 Texinfo 5.0 之前的 makeinfo 实现中,由 @macro 定义展开产生的换行符,这个行尾符不会终止 @-命令 的行分隔参数(如 @chapter@center 等)。新版 texi2any 已不再如此(即换行符会被当作参数的结束标记。)。例如:

@macro twolines{}
aaa
bbb
@end macro
@center @twolines{}

在当前 texi2any 中等价于:

@center aaa
bbb

只有 ‘aaa’ 是 @center 的参数。而在旧实现中,会被解析为:

@center aaa bbb

16.4. @alias new=existing: 命令别名

‘@alias’ 命令用于将一个新命令定义为与已有命令完全相同。这在定义额外的标记名称时非常有用 —— 即便最终输出结果一致,也能在源文件中保留更多语义信息。

请单独一行书写 ‘@alias’ 命令,格式为:新命令名、等号、已有命令名。等号两侧的空格可选,若存在会被忽略。格式如下:

@alias new = existing

举例:如果文档中同时需要引用书籍和其他媒介(如电影),你可以定义一个 @moviecite{} 宏,使其行为与普通的 @cite{} 一致,但同时携带额外的语义信息。写法如下:

@alias moviecite = cite

由于参数解析的细节差异,宏与别名并不总是效果相同;而且别名的定义远比宏简单,因此该命令并非多余。

遗憾的是, 不能为 Texinfo 环境定义别名 ;例如 @alias lang=example 是非法写法。

别名 不允许递归 ,无论是直接递归还是间接递归。

不建议将任何 TeX 原语、普通 TeX 或 Texinfo 命令名重新定义为别名。这类命令数量极多,一旦误用,TeX 可能产生不可预测的错误。

别名的命名规则与宏名一致:可使用字母、数字,以及(非首字符的)连字符 ‘-’。但在 TeX 环境下建议只使用字母,因此我们 推荐仅用字母命名

16.5. 行宏

你也可以使用 @linemacro 命令来定义宏。行宏的定义语法与 @macro 类似。

但是,使用这种方式定义的宏时,语法有所不同。宏调用会使用该行的剩余部分,参数之间用空格分隔。行宏机制主要用于让你可以定义行为与内置定义类命令相似的命令(参见定义类命令)。

示例:

@linemacro defbuiltin {name, args}
@defline {Builtin} \name\ \args\
@end linemacro

上述宏可以这样使用:

@defblock
@defbuiltin foo (bar)
Explanation
@end defblock

这会生成如下结果:

Builtin: foo (bar)

Explanation

这里第一个参数是 foo,会替换宏体中出现的 ‘\name\’。同理,‘(bar)’会替换 ‘\args\’。

如果要在宏参数中包含空格,可以用大括号把参数括起来。包围参数的一对大括号在替换前会被移除。任何空参数(包括最后一个)都必须写作 ‘{}’。此外,参数列表中的 最后一个参数 可以不带大括号,直接包含非开头的空格(如下例所示)。

如果行宏的参数行以 ‘@’ 字符结尾,那么该字符与紧随其后的换行符会被包含在一个宏参数中,并且输入文件的下一行也会被用来获取宏的参数。注意,‘@<换行>’ 序列的替换必须出现在合法上下文中,例如定义行中(参见定义类命令续行)。

另一个示例:

@linemacro deffunc {type, name, args}
@findex \name\
@deftypeline {Func} {\type\} \name\ \args\
@end linemacro

@defblock
@deffunc {long int} F (int @var{one}, int @var{two}, @
int @var{three}, int @var{four}, int @var{five})
Explanation
@end defblock

注意,在宏体中,‘\type\’ 外面需要加大括号,以防类型参数中包含空格。本例会生成下面的输出,并为 F 添加一条索引条目。

Func: long int F (int one, int two, int three, int four, int five)

Explanation

行宏在展开时会生成 整数行 的输出。与用 @macro 定义的宏相比,用 @linemacro 定义的宏在不同 Texinfo 处理器( texi2any 和使用 texinfo.tex 的 TeX)之间可能拥有更好的兼容性。

16.6. @definfoenclose: 自定义高亮样式

@definfoenclose 命令可用于为在线输出格式定义高亮命令。使用该命令定义的指令会通过在文本前后添加字符串来标记内容。

实际上,这个命令用处很小,我们 不建议你使用 。对 @definfoenclose 的支持可能会在未来的 Texinfo 版本中移除。

请在行首书写 @definfoenclose 命令,后跟三个以逗号分隔的参数:

  • 第一个参数是 @-命令名(不带 @ );
  • 第二个参数是起始分隔符字符串;
  • 第三个参数是结束分隔符字符串。

后两个参数会在输出中将高亮文本包裹起来。

分隔符字符串中可以包含空格。起始分隔符与结束分隔符都不是必需的。如果你不需要起始分隔符但需要结束分隔符,必须在命令名后 连续写两个逗号 ;否则你原本想作为结束分隔符的字符串会被错误解析为起始分隔符。

这样定义的包裹型命令接受 一对花括号内的单个参数 ,因为它是为新的标记命令设计的(参见标记文本、单词与短语)。

示例:你可以这样写:

@definfoenclose phoo,//,\\

放在 Texinfo 文件开头,将 @phoo 定义为适用于 Info 和 HTML 的命令:在 @phoo 的参数前插入 ‘//’,在参数后插入 ‘\\’ 。之后你就可以在任意位置写 @phoo{bar} ,它会在 Info 和 HTML 中显示为 ‘//bar\\’。

对于 TeX 格式化,你可以写:

@iftex
@alias phoo = i
@end iftex

@phoo 定义为让 TeX 把参数以斜体排版的命令。

每种定义只作用于对应的格式化器:一个用于 TeX,另一个用于在线格式。TeX 相关定义必须放在 @iftex 中。 @definfoenclose 命令不必放在 @ifinfo 中,除非你想为不同在线输出格式使用不同定义。 @definfoenclose 定义的命令对 DocBook 和 LaTeX 输出无效,其参数会原样输出。对这些格式也可以使用 @alias

@definfoenclose 定义不允许递归,无论是直接递归还是间接递归。

16.7. 外部宏处理器:行指令

Texinfo 内置的宏(以及其他文本替换机制)在常规场景下可以正常工作。但如果你的文档需要 极其复杂 的处理逻辑,它们的脆弱性和局限性就会成为问题。这种情况下,你可以考虑完全改用其他独立的宏处理器,例如 M4(参见 M4)或 CPP(参见 C 预处理器)。

唯一的例外是:Texinfo 无需关心其输入是 “original原始” 源码,还是由其他文件预处理而来。因此,你可以在构建系统中自由调用任意程序,来完成宏展开或其他预处理工作。Texinfo 没有内置对某一种预处理器的专门支持,因为没有任何单一程序能满足所有文档的需求。

唯一的特殊之处在于 错误信息中的行号 。此时,行号应当指向 原始源文件 中的对应位置,无论这个源文件是什么。对此有一套通用机制:即所谓的 ‘#line’ 指令,Texinfo 对其提供支持。

16.7.1. ‘#line’ 指令

如下所示的输入行:

#line 100 "foo.ptexi"

表示下一行原本是文件 foo.ptexi 中的第 100 行,因此错误信息也应以此为准。M4(参见《GNU M4》中的预处理器特性)与 CPP(参见《C 预处理器》中的行控制预处理器输出)均可生成此类行。

texi2any 程序 默认会识别这些行 ,但 @verbatim 块内除外(参见 @verbatim: 原文文本)。可通过 CPP_LINE_DIRECTIVES (参见全局自定义变量完全关闭 该识别功能,不过通常没有必要这么做。

对于少数需要文档化 ‘#line’ 指令、且示例本身会匹配该模式的程序(M4、CPP、Texinfo),可使用命令 @hashchar{} (参见使用 @hashchar{} 插入 #)。本手册源码中,上面的示例行写法如下:

@hashchar{}line 100 "foo.ptexi"

@hashchar 命令于 2013 年加入 Texinfo。若不想依赖该命令,也可使用 @set@value 插入字面量 ‘#’:

@set hash #
@value{hash}line 1 "example.c"

或者在合适的场景下,用 @verbatim 环境替代 @example 。如前所述, #line 识别在 verbatim 块内是 禁用 的。

16.7.2. ‘#line’ 与 TeX

如前所述, texi2any 能够识别上一节介绍的 ‘#line’ 指令。但是, texinfo.tex 不能也无法识别这类指令。因此,如果 TeX 直接处理这类行,会将其错误地按原样排版输出。解决办法是:在运行 TeX 之前,先用 texi2any 的宏展开选项进行预处理。共有三种方式:

  • 若使用 texi2dvi 或其衍生工具(参见 使用 texi2dvi 排版),可传入参数 -Etexi2dvi 会先调用 texi2any 展开宏并剔除 ‘#line’ 指令。
  • 若直接运行 texi2any ,可指定参数: --no-ifinfo --iftex -E somefile.out ,再将生成的 somefile.out 单独交给 texi2dvi 处理。
  • 也可以直接运行: texi2any --dvi --Xopt -E 。(或将 --dvi 替换为 --pdftexi2any 会自动调用 texi2dvi -E

最后一个与 TeX 配合使用的注意事项:由于 ‘#line’ 指令不被识别, @errormsg{} 命令(参见 条件命令)或 TeX 自身输出的行号,是 TeX 读取的处理后文件中的(错误)行号,而非预处理器指定的原始行号。

16.7.3. ‘#line’ 语法细节

‘#line’ 指令的语法细节:‘#’ 字符前后可以有空白字符,单词 ‘line’ 是可选的,文件名后面可以跟一组由空白分隔的整数(这些是某些情况下由 CPP 输出的所谓 “标志”)。对于想了解具体实现细节的读者,实际用于匹配的(Perl)正则表达式如下:

/^\s*#\s*(line)? (\d+)(( "([^"]+)")(\s+\d+)*)?\s*$/

据我们所知,末尾的整数标志只会与文件名一起出现,这一点也体现在正则表达式中。

举例来说,下面是一条语法合法的 ‘#line’ 指令,表示 /usr/include/stdio.h 的第 1 行:

# 1 "/usr/include/stdio.h" 2 3 4

遗憾的是,带引号的文件名(‘"…"’)必须设为可选,因为(尤其是)M4 经常会在单个文件内部生成 ‘#line’ 指令。又因为 ‘line’ 本身也是可选的,结果就可能出现一些意料之外的行也会被匹配,例如:

# 1

对应的解决办法已在上文说明(参见 ‘#line’ 指令)。

17. 包含文件

当 Texinfo 处理器在 Texinfo 文件中遇到 @include 命令时,会处理该命令所指定文件的内容,并将其并入正在生成的输出文件中。因此,使用包含文件可以将单个大型文档拆分为多个便于管理的小型文件。

17.1. 如何使用包含文件

若要在一个 Texinfo 文件中引入另一个文件,需在一行的开头写下 @include 命令,并在同一行紧跟要引入的文件名。例如:

@include buffers.texi

@include 所在行中会展开 @value{var} 引用。除此之外,该行仅允许使用 @@@{@} 以及相关的 @-命令 (如 @atchar{} )。

被引入的文件应当只是一段文本片段,直接原样并入外层的主 Texinfo 文件中;它 不应 包含完整 Texinfo 文件的标准开头与结尾部分。特别注意:

  • 不要在被引入文件的开头写 ‘\input texinfo’,否则这段内容会被原样插入到输出文件中。
  • 也不要在被引入文件的末尾写 @bye 命令, @bye 之后的内容不会被格式化。

很早以前,要求在被引入文件开头写 @setfilename 行,现在已不再需要。如今是否写这一行无关紧要,即便被引入文件里存在 @setfilename ,也会被忽略。

GNU Emacs 的 Texinfo 模式提供了 texinfo-multiple-files-update 命令,用于在多文件包含的情况下更新节点指针与主菜单。详见「更新外层文件与包含文件」。

17.2. @include 的示例文件

下面是一个外层 Texinfo 文件的示例,其中使用了 @include 引入其他文件:

\input texinfo @c -*-texinfo-*-

@settitle Include Example


@node Top
@top Include Example

@include foo.texi
@include bar.texi
@include concept-index.texi
@bye

被包含的文件(例如 foo.texi )可以是这样:

@node First
@chapter First Chapter

Contents of first chapter ...

concept-index.texi 的完整内容可以简单到如下所示:

@node Concept Index
@unnumbered Concept Index

@printindex cp

《GNU Emacs Lisp 参考手册》的外层 Texinfo 源文件名为 elisp.texi 。这个外层文件已经包含了一个拥有 417 个条目的主菜单,以及一列 41 个 @include 文件。

17.3. @verbatiminclude file: 原样包含文件

你可以使用 @verbatiminclude 命令,将文件的 原始内容 精确地包含到文档中:

@verbatiminclude filename

文件 filename 的内容会在 原样环境 中输出(参见 @verbatim: 原文文本)。通常情况下,文件会 原样输出 ,所有特殊字符与空白格式都会保留,不会额外添加缩进;如果你需要缩进,可以把 @verbatiminclude 放在 @example 环境中(参见 @example: 示例文本)。

@verbatiminclude 所在行会展开 @value{var} 引用。这使得你可以包含发行版中其他目录下的文件,例如:

@verbatiminclude @value{top_srcdir}/NEWS

(前提是你必须先定义好 top_srcdir 。)

除此之外,该行仅允许使用 @@@{@} 以及相关的 @-命令(如 @atchar{} )。

关于如何用更小的字号输出文件内容,参见 @verbatim 一节的末尾部分。

18. 使用 TeX 排版与印刷

运行 texi2dvitexi2pdf 命令是生成可打印输出的最简单方式。这些命令会作为 Texinfo 软件包的一部分被安装。

更详细地说,对 Texinfo 文件进行排版与打印是一个多步骤过程:你需要使用 TeX 程序生成用于打印的文件(称为 DVI 或 PDF 文件),然后打印该文件。可选地,你还可以在首次运行 TeX 之后,使用 texindex 命令生成索引;然后 必须再次运行 TeXtexi2dvi 会自动处理所有这些步骤,按需运行 TeX 和 texindex (参见 使用 texi2dvi 进行格式化)。

使用 Shell 命令时,你既可以直接在操作系统 Shell 中操作,也可以在 GNU Emacs 内部的 Shell(或其他计算环境)中工作。你可以像执行其他任何 Shell 命令一样,在 Emacs 内的 Shell 中执行格式化与打印命令。要在 Emacs 中创建 Shell,输入 M-x shell (参见《GNU Emacs 手册》中的 Shell 章节)。如果你使用 GNU Emacs,也可以使用 Texinfo 模式提供的命令,而不是 Shell 命令。参见 使用 Emacs 进行格式化与打印

关于指定打印输出的细节(如纸张尺寸),请参见 全局文档命令

18.1. 使用TeX

名为 TeX 的排版程序可用于对 Texinfo 文档进行格式化,以生成可打印的输出文件。TeX 是一款功能极强的排版程序,使用得当的话,能实现极佳的排版效果。该程序并不包含在 Texinfo 软件包中,其本身就是一套庞大的软件体系。

TeX 是自由软件基金会(FSF)用于文档制作的排版工具,也是为 Texinfo 手册生成打印格式文件(如 PDF 和 PostScript 格式)最简便的方式。TeX 可自由再分发,你可以通过互联网下载,也可通过实体介质获取,详情参见网址:http://tug.org/texlive

18.2. 使用 texi2dvitexi2pdf 格式化

texi2dvi 程序会自动完成从 Texinfo 文档生成 TeX DVI 文件的全部步骤。同理, texi2pdf 用于生成 PDF 文件9

要对输入文件 foo.texi 运行 texi2dvitexi2pdf ,操作如下(其中 ‘prompt$ ’ 为Shell 提示符):

prompt$ texi2dvi foo.texi
prompt$ texi2pdf foo.texi

如示例所示,传给 texi2dvitexi2pdf 的文件名必须包含扩展名,例如 ‘.texi’。

如需查看所有选项列表,运行: texi2dvi --help 。下面介绍部分常用选项。

使用 --pdf 选项时, texi2dvi 会调用 pdftex 而非 tex ,生成 PDF 输出而非 DVI。另外, texi2pdf 命令等价于执行 texi2dvi --pdf 。系统还提供了 pdftexi2dvi 命令,方便 AUC-TeX 使用(见 AUC-TeX),它习惯直接在生成 DVI 的工具前加 ‘pdf’ 来表示生成 PDF。

使用 --dvipdf 选项时, texi2dvi 会先运行 TeX,再运行 DVI 转 PDF 程序来生成 PDF:如果设置了环境变量 DVIPDF ,则使用该值;否则依次尝试 dvipdfmxdvipdfmdvipdfdvi2pdfdvitopdf 中第一个存在的程序。这种方式对 CJK 排版的支持通常优于 pdftex

使用 --ps 选项时, texi2dvi 会先生成 DVI,再通过 dvips (见 Dvips)转为 PostScript 格式。(若设置了 DVIPS 环境变量,则使用该变量指定的程序。)

texi2dvi 也可用于处理 LaTeX 文件。通常它能根据文件内容和扩展名自动判断输入语言;若判断错误,可通过 --language=lang 显式指定, lang 可为 ‘latex’ 或 ‘texinfo‘。

texi2dvi 一个很有用的选项是 --command=cmd 。它会在运行 TeX 前,将 cmd 单独一行插入到输入文件的临时副本开头。借此可以指定不同打印格式,例如 @smallbook (见 @smallbook: 打印 “小开本” 书籍)、 @afourpaper (见 A4 纸打印)或 @pagesizes (见 @pagesizes [ width/][, /height ]: 自定义页面尺寸), 而无需修改文档源码 。(也可通过 texinfo.cnf 在全局范围内设置,见 为 TeX 做准备。)

选项 -E (等价于 -e--expand )会使用 texi2any 而非 TeX 自身实现来展开 Texinfo 宏(见 宏细节与注意事项)。两种实现各有优缺点。

texi2dvi 支持 --build=模式 选项,用于指定 TeX 编译的位置,以及如何处理辅助文件。也可通过环境变量 TEXI2DVI_BUILD_MODE 设置编译 mode模式 。合法取值为:

‘local’
在当前目录编译,保留所有辅助文件。这是传统的 TeX 使用方式。
‘tidy’

在本地的 *.t2d 目录中编译,辅助文件存放在该目录下,输出文件会复制回原目录。

使用 tidy 模式有多个优点:

  • 当前目录不会被大量临时文件污染
  • 可通过 --build-dir=目录 进一步整理:所有 *.t2d 目录统一存放
  • 可设为如 --build-dir=/tmp/\$USER.t2d--build-dir=\$HOME/.t2d ,完全不残留文件
  • 每次 TeX 运行成功后都会更新输出文件,便于同时预览编译失败时,输出文件会保留上一次成功的状态
  • PDF 与 DVI 编译在不同子目录,避免辅助文件冲突

不过,因为 ‘tidy’ 在其他目录编译,TeX 偶尔会找不到某些文件(例如使用 \graphicspath 时),此时可用 -I 指定额外搜索目录。

‘clean’
与 ‘tidy’ 类似,但编译后删除辅助目录。因此每次都需要完整编译流程。

如果系统中有 etextexi2dvi 会优先使用,因为它在某些场景下更快,且在调试 texinfo.tex 时能提供更多跟踪信息。但这个扩展版本的 TeX 不是必需的,且生成的 DVI 与普通 TeX 完全一致。

texi2dvi 会通过 -recorder 选项或扫描 TeX 日志中的 ‘\openout’ 来检测辅助文件。可通过环境变量 TEXI2DVI_USE_RECORDER 控制该行为,合法值为:

‘yes’
直接使用 -recorder ,不做检查。
‘no’
扫描日志中的 ‘\openout’,不做检查。
’yesmaybe‘
先检查是否支持 -recorder ,支持则使用;否则检查是否支持日志中的 ‘\openout’,支持则使用,都不支持则报错。
‘nomaybe’
与 ‘yesmaybe’ 类似,但优先检查日志里的 ‘\openout’。

默认值为 ‘nomaybe’。该环境变量主要用于排错,未来可能修改或移除。

18.3. 使用 tex/texindex 格式化

你可以通过 Shell 命令 tex 后接 Texinfo 文件名,对 Texinfo 文件进行基础格式化。例如:

tex foo.texi

TeX 会生成一个 DVI 文件,以及若干用于索引、交叉引用等信息的辅助文件。DVI 文件(DeVice Independent 的缩写,即设备无关文件)几乎可以在任何设备上打印,通常还需要再做一次格式转换(见上一节)。

tex 格式化命令本身 不会对索引进行排序 ,只会输出未排序的索引数据文件。要在执行 tex 后生成可打印的索引,首先需要一份已排序的索引。 texindex 命令用于对索引排序。(上一节介绍的 texi2dvi 会根据需要自动运行 textexindex 。)

tex 输出的未排序索引文件遵循标准命名规则:将主输入文件的 ‘.texi’ 等后缀替换为 两位字母 的索引名。例如,输入文件 foo.texi 默认生成的原始索引文件为:foo.cp、foo.vr、foo.fn、foo.tp、foo.pg、foo.ky。这些文件名正是要传给 texindex 的参数。

通常不必显式指定所有未排序索引文件名,而是在 Shell 中使用通配符 ‘??’,命令形式如下:

texindex foo.??

该命令会对所有未排序索引文件执行 texindex ,包括你用 @defindex@defcodeindex 自定义的两位字母索引。即使存在非索引文件的两位字母后缀文件(如 ‘foo.el’),也可以安全执行 ‘texindex foo.??’, texindex 只会提示但不会处理这类文件。

texindex 会为每个指定文件生成一个 已排序索引文件 ,命名方式是在原文件名后加 ‘s’。例如:由 foo.cp 生成 foo.cps@printindex 命令会查找该命名的文件(见 “打印索引与菜单”)。TeX 不会读取原始索引输出文件, texindex 也不会修改它。

索引排序完成后,需要再次运行 tex 处理 Texinfo 文件,重新生成包含最新索引条目的输出文件。

最后,通常还需要再运行一次 tex ,以确保交叉引用中的页码正确。

简要总结:完整流程共五步(也可以一步完成:直接运行 texi2dvi ,见上一节。)

  • 对 Texinfo 文件运行 tex 。生成 DVI 文件(交叉引用未定义、无索引),以及带两位字母后缀的原始索引文件。
  • 对原始索引文件运行 texindex 。生成对应的已排序索引文件(三位字母后缀)。
  • 再次对 Texinfo 文件运行 tex 。重新生成 DVI 文件,此时包含索引和已定义的交叉引用,但交叉引用页码仍是上一轮的,通常不正确。
  • 再次用 texindex 对索引排序。
  • 最后一次运行 tex 。此时交叉引用会写入正确的页码。

若要生成 PDF,可以使用 pdftex 代替普通 tex 。即将示例中的 ‘tex foo.texi’ 换成: ‘pdftex foo.texi’。

18.3.1. 部分文档的格式化

有时你可能希望在文档尚未完成时就进行打印,或者只打印文档中的某一章。在这种情况下,TeX 通常生成的辅助文件,以及它对未定义交叉引用给出的警告都会变得很麻烦。你可以使用 @novalidate 命令来避免这些问题,该命令必须在任何分节命令或交叉引用命令之前使用。

因此,文件的开头大致如下所示:

\input texinfo
@novalidate
...

@novalidate 同样会关闭 texi2any 中的校验功能,效果与其命令行选项 --no-validate 完全一致(参见《从 Shell 调用 texi2any 》)。

此外,你不必每次运行 tex 之后都执行 texindextex 格式化命令会直接使用上一次运行 texindex 时生成的已排序索引文件。在文档编写或调试阶段,即使这些索引文件已经过期,通常也不会有影响。

18.3.2. texindex 详细说明

在 2015 年发布的 Texinfo 第 6 版中, texindex 程序被 完全重写 。主要的功能变化是:以左大括号或右大括号(分别为 ‘{’ 和 ‘}’)开头的索引项现在可以正常工作。例如,以下这些简单的索引项会被正确处理,包括在索引中显示的 “索引首字符”:

@cindex @{
@cindex @}
...
@printindex cp

虽然这不属于功能本身,但读者可能会感兴趣:新版的 texindex 是一个文学式程序(literate program)(https://en.wikipedia.org/wiki/Literate_programming) ,使用 Texinfo 编写文档,用可移植的 awk 语言实现代码。它由单一源文件(本例中为 texindex/ti.twjr )生成可执行程序、可打印文档与在线文档。

该系统名为 TexiWeb Jr.,由 Arnold Robbins 开发,他也是新版 texindex 的作者。无独有偶,他同时也是 gawk (GNU Awk,参见《GNU Awk 用户指南》)的长期维护者。文件 texindex/Makefile.am 中展示了该系统的使用示例。

18.4. TeX 格式化的前期准备

TeX 需要找到首行 ‘\input texinfo’ 命令所读取的 texinfo.tex 文件。该文件用于告知 TeX 如何处理各类 @-命令,所有标准 GNU 发行版中均包含此文件。面向通用场景的最新版本可从以下 GNU 官方服务器及镜像站点获取:

开发版最新版本可从 Texinfo 源代码仓库获取:

本质上是一个独立文件,因此若你需要或希望尝试比系统自带版本更新的版本,通常只需下载该文件并放置在 TeX 能找到的任意位置即可。你可以用新版本替换现有 texinfo.tex (建议备份原始文件以防意外)。

此外,若系统尚未通过其他发行版安装 epsf.tex ,请务必安装该文件。更多细节可参见 @image 命令说明的末尾部分(见 “插入图片”)。

若需使用非英文引号,你需要安装欧洲计算机现代字体(例如 ecrm1000),且(针对 PDF 输出)需安装 CM-Super 字体(见 “插入引号”)。

若需使用 @euro 命令,你需要安装 ‘feym*’ 系列字体(例如 feymr10)。详见 “ @euro (€):欧元货币符号”。

上述所有文件在规范的 TeX 安装环境中均默认预装。

可选配置:站点配置文件 texinfo.cnf

你可根据需要创建站点配置文件 texinfo.cnf 。TeX 处理 Texinfo 文件时,会在其搜索路径(包括当前目录和标准安装目录)中查找该文件,你可通过此文件设置本地通用规则。例如,若 texinfo.cnf 中包含 ‘@afourpaper’ 一行(见 “在 A4 纸张上打印”),则所有 Texinfo 文档都会按该纸张尺寸进行处理。若无需配置任何内容,则无需创建此文件。

你可以通过设置 TEXINPUTS 环境变量,让 TeX 能够找到 texinfo.cnf (该变量同样适用于 texinfo.tex 及 TeX 可能读取的其他文件)。例如,若你使用与 Bourne Shell 兼容的 Shell(sh、bash、ksh 等),可在 .profile 文件中添加以下内容:

TEXINPUTS=.:/home/me/mylib:
export TEXINPUTS

上述配置会让 TeX 优先在当前目录(由 ‘.’ 表示)中查找 \input 所需文件,随后在假设用户 “me” 的 mylib 目录中查找,最后在系统目录中查找。(开头、结尾或连续的 ‘:’ 表示在对应位置搜索系统目录。)

18.5. 行溢出(hboxes)问题

TeX 有时无法在正常页边距内对一行内容进行排版。这种情况最常出现在 TeX 遇到它判定为 无法断词的长单词 时,例如电子邮件网络地址或极长的标识符。当这种情况发生时,TeX 会打印出如下错误信息:

Overfull @hbox (20.76302pt too wide)

(在 TeX 中,行内容存放在「horizontal boxes水平盒子」中,因此称为 hbox。‘@hbox’ 是 TeX 原语,不在 Texinfo 语言中使用。)

TeX 还会在 Texinfo 源文件中给出 行号 ,以及 出错行的文本 ,并在所有 TeX 认为可以断词的位置做出标记。有关排版错误的更多说明,参见《使用 TeX 调试》。

如果 Texinfo 文件出现 hbox 溢出,你可以 重写句子 避免该问题,也可以选择保留原样。轻微超出右侧页边距通常无关紧要,甚至难以察觉。

如果你有大量溢出盒子,或不想重写内容,可以强制 TeX 大幅放宽单词间的允许间距 ,这样(运气好的话)能避免很多糟糕的断行,写法如下:

@tex
\global\emergencystretch = .9\hsize
@end tex

(你应根据需要调整这个比例。) \emergencystretch 如此大的数值 不能作为默认值 ,否则排版输出质量会明显下降;它的默认值是 ‘.15\hsize’。 \hsize 是 TeX 中表示 当前行宽 的长度变量。

对于所有存在的溢出盒子,除非另行设置,否则 TeX 会在溢出行旁边打印一个 粗大难看的黑色矩形块 ,方便你在校对草稿时定位问题。

若要避免这种标记破坏最终打印效果,请在 Texinfo 文件开头、 @titlepage 命令之前单独一行加入:

@finalout

18.6. 日文与中文的打印

Texinfo 附带了用于处理日文、中文输入的支持文件。

对于日文,使用文件 texinfo-ja.tex 。主输入文件应以 ‘\input texinfo-ja’ 开头,而非标准的 ‘\input texinfo’。照常使用 UTF-8 字符编码。必须使用 XeTeX 或 LuaTeX 处理文件。

对于中文,使用文件 texinfo-zh.tex 。主输入文件应以 ‘\input texinfo-zh’ 开头,而非标准的 ‘\input texinfo’。照常使用 UTF-8 字符编码。必须使用 XeTeX 处理文件。

例如,可执行以下命令,使用 XeTeX 生成 PDF 输出:‘PDFTEX=xetex texi2pdf my-input-file.texi’。你可能需要安装 XeTeX(或 LuaTeX)、zhspacing 宏包,或者相关字体包。

标准 TeX(或 pdfTeX)不支持日文与中文,因为它们无法处理这些语言所需的字体及数千个字形。

Texinfo 发行版中附带了若干示例文件,可用于测试这些语言的支持:

  • 日文:short-sample-ja.texi
  • 中文:short-sample-zh.texi

有关这些 TeX 扩展的更多信息,参见 XeTeX 主页LuaTeX 网站

19. texi2any: Texinfo 转换工具

texi2any 是面向 Texinfo 的通用翻译工具,可生成多种输出格式,且高度可定制。它支持以下格式:

  • Info(默认格式,或使用 --info
  • HTML(使用 --html
  • EPUB 3(使用 --epub3
  • 纯文本(使用 --plaintext
  • LaTeX(使用 --latex
  • DocBook(使用 --docbook
  • Texinfo XML(使用 --xml

makeinfotexi2any 的别名。默认情况下, texi2anymakeinfo 均生成 Info 格式输出;二者除名称不同外,行为完全一致。

除这些默认格式外, texi2any 的命令行选项可修改输出的诸多细节。此外,初始化文件能对最终输出进行更精细的控制 —— 几乎可以调整 Texinfo 输入文件中未指定的所有内容。初始化文件与主程序一样使用 Perl 编写,所有可在命令行指定的配置,均可在初始化文件中设置。

19.1. 从 Shell 调用 texi2any

要处理一个 Texinfo 文件,在 texi2any 后跟上 Texinfo 文件名即可。同时可通过合适的命令行选项指定输出格式(默认为 Info)。例如,要为 Bison 生成 Info 文件,在 Shell 中输入:

texi2any --info bison.texi

你可以指定多个输入文件,它们会被依次处理。如果输入文件名为 ‘-’,则从标准输入读取。

texi2any 支持大量选项,其中最基础的是用于切换输出格式的选项。默认情况下, texi2any 输出 Info 格式。

命令行选项分为两种:以 ‘–’ 开头的长名称选项,或以 ‘-’ 开头的单字母选项。长选项名称可以使用唯一缩写。

例如,下面这条 Shell 命令会为 bison.texi 生成 Info 文件,并将每行宽度限制为 68 列:

texi2any --fill-column=68 bison.texi

你可以连续书写多个选项,例如:

texi2any --no-split --fill-column=70 ...

(这会将整个 Info 文件保留为一个文件(可能很长),并将行宽设为 70。)

以下是选项列表(大致按字母顺序):

--commands-in-node-names
该选项现已无实际作用,仅为兼容保留。(过去用于确保节点名中的 @-命令 在全文展开,尤其是 @value 。现在该行为已是默认。)
--conf-dir=dir
dir 添加到配置文件搜索路径的开头,这些文件可通过 --init-file 加载(见下文)。 dir 可以是单个目录,或以路径分隔符分隔的多个目录(类 Unix 系统用 ‘:’,Windows 用 ‘;’)。
--css-include=file
生成 HTML 时,将 file 的内容(应为 CSS 规范)直接写入 HTML 的 ‘<style>’ 块。若 file 为 ‘-’ 则从标准输入读取。
--css-ref=url
生成 HTML 时,添加 ‘<link>’ 标签引用 url 处的 CSS 文件,便于使用独立样式表。
-D var
-D 'var value'

定义 Texinfo 变量 var ,等价于 Texinfo 文件中的 @set var (见Flags: @set, @clear, conditionals, and @value ) 。

选项参数在 Shell 中为一个单词;若包含空格,第一个单词为变量名,剩余部分为值。例如 -D 'myvar someval' 等价于 @set myvar someval

--docbook
生成 DocBook 输出(而非 Info)。
--document-language=lang
使用 lang 翻译输出文档中的 Texinfo 关键字。默认使用 @documentlanguage 指定的语言,若无则为英语。(见 @documentlanguage ll [ _cc ]: 设置文档语言
--dvi
通过 texi2dvi 生成 TeX DVI 文件,而非 Info(见 texi2any 的印刷输出)。
--dvipdf
通过 texi2dvi --dvipdf 生成 PDF 文件,而非 Info(见 texi2any Printed Output)。
--enable-encoding
--disable-encoding
默认或使用 --enable-encoding 时,根据文档编码在 Info 和纯文本中输出重音与特殊字符。使用 --disable-encoding 时,输出 7 位 ASCII 转写形式。该选项也影响其他格式的索引键排序与部分纯文本输出。
--epub3
生成 EPUB 3 输出。
--error-limit=limit
-e limit
在中止前报告最多 limit 个错误;默认为 100。
--fill-column=width
-f width
指定一行的最大列数,即一行的右边界。会自动换行的段落将按此宽度排版。(换行填充是指拆分并连接行,使每行长度小于或等于该列数的过程,行将在单词之间断开。)默认值为 72。
--footnote-style=style
-s style

设置脚注样式:‘end’:默认,脚注放在当前节点末尾;‘separate’:脚注放在单独节点。该选项设置的值会覆盖 Texinfo 文件中 @footnotestyle 命令所设定的值(参见「脚注样式」)。

在 Info 格式中:若样式为 ‘separate’, texi2any 会新建一个节点,存放当前节点中的所有脚注。若样式为 ‘end’,脚注引用会直接放在当前节点的末尾。

在 HTML 格式中:若样式为 ‘end’,或输出未拆分,脚注统一放在输出内容的末尾。若样式为 ‘separate’ 且输出已拆分,脚注会放在单独的文件中。

--force
-F
通常输入文件出错时不会生成输出文件;使用此选项则保留输出文件。
--help
-h
打印可用选项与基本用法后退出。
--html
生成 HTML 格式输出(而非 Info 格式)。默认情况下,HTML 输出会按节点拆分为多个文件(每个节点对应一个输出文件),且拆分后的输出文件会写入一个以输入文件名称命名的子目录中。详见「生成 HTML」章节。
-I dir
将目录 dir 添加至查找 @include 命令所引用文件的目录搜索列表末尾。默认情况下, texi2any 会搜索当前目录;若输入文件存在上级目录(且该目录非当前目录),则同时搜索该上级目录。 dir 的值可以是单个目录,也可以是多个目录组成的列表(目录间使用系统默认的路径分隔符分隔:类 Unix 系统为 ‘:’,Windows 系统为 ‘;’)。
--ifdocbook
--ifhtm
--ifinfo
--iflatex
--ifplaintext
--iftex
--ifxml
针对指定格式,强制执行 @ifformat@format 命令的解析逻辑,同时跳过 @ifnotformat 命令的解析 —— 该行为不受实际输出格式的影响。例如,若指定 --iftex 选项,则 @iftex@tex 代码块会被读取解析,而 @ifnottex 代码块会被忽略。
--no-ifdocbook
--no-ifhtml
--no-ifinfo
--no-iflatex
--no-ifplaintext
--no-iftex
--no-ifxml
对于指定的格式,不处理 ‘@ifformat’ 和 ‘@format’ 命令,而会处理 ‘@ifnotformat’ 命令,无论最终输出的是什么格式。例如,如果指定了 --no-ifhtml 选项,那么 ‘@ifhtml’ 和 ‘@html’ 代码块将不会被解析,而 ‘@ifnothtml’ 代码块会被解析。
--info
生成 Info 格式输出。默认情况下,如果输出文件大小超过约 300,000 字节,会被拆分为约该大小的多个子文件。输出文件及所有子文件的名称由输入文件名决定;若文档中使用了 @setfilename 命令,则以该命令指定的名称为准(详见「设置输出文件名」)。详见「标记文件与拆分文件」。
--init-file=file
加载 file 中的代码,用于修改生成手册的行为和输出。这类自定义文件通常使用 .pm.init 扩展名,但并非强制要求,文件名可以任意指定。 --conf-dir 选项(见上文)可用于添加搜索这些自定义文件的目录列表。
--internal-links=file
在 HTML 模式下,输出一个制表符分隔的 file文件 ,包含三列:索引项或目录项的内部链接、其所属的索引(或目录)名称、被索引或录入的条目。条目按对应元素的自然排序排列。该导出结果可用于后续处理工具。
--latex
生成 LaTeX 输出。
--macro-expand=file
-E file
将展开所有 Texinfo 宏后的 Texinfo 源码输出到指定 file文件 。通常,宏展开的结果仅由 texi2any 内部使用,之后便会丢弃。
--no-headers

不在输出中包含菜单和节点分隔线。

生成 Info 格式时,该选项效果与使用 --plaintext 相同,最终生成简单的纯文本文件。此外,输出默认指向标准输出,除非使用 -o 选项覆盖。(此行为是为了向后兼容。)

生成 HTML 格式且输出已拆分时,仅在每个文件开头显示导航链接。如果输出未拆分,则完全不在每个节点顶部显示导航链接。详见「生成 HTML」。

--node-files
--no-node-files

使用 --node-files 时,在生成 HTML 的过程中,会为锚点以及尚未输出的节点,创建以对应节点名命名的重定向文件(参见 HTML 交叉引用・节点名展开)。这可以让节、章级别的跨手册引用正常生效(参见 HTML 交叉引用配置: htmlxref.cnf )。

如果输出是拆分的,该功能默认启用。如果输出未拆分, --node-files 会在生成单一主输出文件之外,额外创建这些重定向文件。 --no-node-files 则在任何情况下都禁止生成重定向文件。该选项对除 HTML 以外的输出格式均无效。(见Generating HTML)

--no-validate
--no-pointer-validate

禁用 texi2any 的指针校验阶段—— 这是一个危险操作。也可以通过 @novalidate 命令实现相同效果(参见「格式化部分文档」)。

如果不禁用指针校验, texi2any 会检查 Texinfo 文件中交叉引用和菜单项的合法性,以及显式指定的节点指针是否有效。

--no-warn
屏蔽警告信息(不屏蔽错误)。
--number-footnotes
--no-number-footnotes
使用 --no-number-footnotes 可关闭脚注自动编号。默认情况下,脚注在每个节点内从 1 开始连续编号,即每个节点开头都会将脚注序号重置为 1。
--number-sections
--no-number-sections
使用 --number-sections (默认选项)时,会像印刷手册一样输出章、节、附录编号。该功能仅适用于具有层次结构的手册。如果你的手册不具备常规结构,应指定 --no-number-sections
--output=file
-o file

指定输出内容写入 file 。这会覆盖 Texinfo 源文件中 @setfilename 命令指定的文件名。如果既没有使用 @setfilename ,也没有指定该选项,则使用输入文件名来决定输出文件名。详见「设置输出文件名」。

如果 file 为 ‘-’,则输出到标准输出,并且隐含启用 --no-split

如果 file 是一个目录或以 ‘/’ 结尾,则按照常规规则(即使用 @setfilename 或输入文件名)决定输出文件名,但文件会写入该目录中。例如: ‘texi2any -o bar/ foo.texi’ 无论是否使用 --no-split ,都会在 bar/ 目录下生成 bar/foo.info 以及其他可能的文件。

生成 HTML 且输出为拆分模式时, file 会被用作存放所有输出文件的目录名。例如: texi2any -o bar --html foo.texi 会在 bar/ 目录下生成 bar/index.html 及其他文件。

生成 EPUB 时,会为 EPUB 格式所需的file文件和目录创建一个容器目录,同时生成 EPUB 输出文件。如果 file 是目录,则容器目录放在该目录内,EPUB 输出文件不会放入该容器目录。如果 file 是文件名,则直接用作 EPUB 输出文件名。

--output-indent=val
该选项现已无任何作用,仅为保持兼容性而保留。(该选项过去用于调整 XML/DocBook 输出中的缩进。)
-P path
将路径 path 添加到 @include 命令的目录搜索列表最前面。参见上文的 -I 选项。

---paragraph-indent=indent ::

-p indent

将段落缩进样式设置为 indent 。该选项设置的值会覆盖 Texinfo 文件中由 @paragraphindent 命令指定的值(参见 @paragraphindent: 控制段落缩进)。 indent 的取值含义如下:

‘asis’
保留段落开头原本的缩进(或无缩进)状态。
‘0’ 或 ‘none’
清除所有已存在的缩进。
‘num’
每个段落缩进 num 个空格。

默认行为:缩进 2 个空格,但章节标题后的第一段不缩进。

--pdf
使用 texi2dvi --pdf 生成 PDF 文件,而非生成 Info 文件(参见 texi2any 打印输出)。
--plaintext

输出纯文本文件(而非 Info 文件):输出中不包含菜单和节点分隔线。这样生成的是简洁的纯文本文件,例如可以直接用于邮件发送,或包含在软件发行包中(如作为 INSTALL 文件)。

使用该选项时,输出默认发送到标准输出,而不是生成以输入文件名或 @setfilename 命名的文件;可通过 -o 选项覆盖此行为。

--ps
使用 texi2dvi --ps 生成 PostScript 文件,而非生成 Info 文件(参见 texi2any 打印输出)。
--set-customization-variable var=value
-c var=value
将自定义变量 var 设置为 value 。等号 ‘=’ 是可选的,但 varvalue 都需要根据 shell 的需要进行引用,以确保整体为单个单词。 texi2any 的许多行为与输出方面都可以通过自定义变量控制,其控制范围超出了文档中 @-命令 和其他命令行选项所能设置的内容。(见自定义变量
--split=how
--no-split

生成 Info 格式时,默认会将较大的输出文件拆分为约 300KB 的较小子文件。生成 HTML 格式时,默认每个输出文件对应一个节点(参见「生成 HTML」)。 --no-split 用于禁止这种输出拆分。

或者,可以使用 --split=how 来指定 HTML 输出的拆分级别。how 的可选值为:

‘chapter’
@chapter 及同级别的章节命令(如 @appendix 等)处进行拆分。
‘section’
@section 及类似级别的命令处进行拆分。
‘node’
在每个节点处进行拆分。这是默认行为。

纯文本输出也可以按照与 HTML 类似的方式拆分。这在需要从 Texinfo 文档中提取章节并将其作为独立文件提供时会很有用。

--split-size=num
设置 Info 文件最大字符数,默认 300,000。单个节点不会被拆分。
--trace-includes
将每个被包含的文件名称(包括任何间接包含的文件)打印到标准输出。只有实际找到的包含文件才会被打印。当使用此选项时, texi2any 不会以任何输出格式生成文档。(此选项的用途是方便收集 Texinfo 手册的源文件。)
--transliterate-file-names
对节点名中的非 ASCII 字符进行转写,用于生成文件名。 启用节点名称中非 ASCII 字符的音译转换,用于生成文件名。参见 HTML 交叉引用・8 位字符扩展
-U var
将变量 var 设为未定义。等效于 Texinfo 文件中的 @clear var 命令(参见标记: @set@clear 、条件编译与 @value )。
--verbose
使 texi2any 显示正在执行的操作信息。通常情况下, texi2any 仅在出现错误或警告时才输出信息。
--version
-V
打印版本号后退出。
--Xopt str
str (单个 Shell 单词)传递给 texi2dvi ;可重复使用该选项(参见 texi2any 打印输出)。
--xml
生成 Texinfo XML 输出。

19.2. texi2any 识别的环境变量

如果未被命令行选项覆盖, texi2any 还会读取环境变量 TEXINFO_OUTPUT_FORMAT 来确定输出格式。其取值可以是以下之一:

docbook dvi dvipdf epub3 html info latex pdf plaintext ps xml

若未设置或未另行指定,默认输出 Info 格式。

TEXINFO_OUTPUT_FORMAT 还可以接受其他一些特殊值,这些值不对应任何可通过命令行设置的输出格式(详见「自定义变量与选项」)。

同名的自定义变量同样会被读取;若设置了该自定义变量,它会覆盖环境变量的设置,但不会覆盖命令行选项。详见「自定义变量与选项」。

你可以通过设置环境变量 TEXINFO_XS 来控制 texi2any 对 Perl 扩展模块的使用。这些模块是编译后的原生代码,可供解释型 Perl 代码调用。理想情况下,这些扩展模块应能正常工作,它们带来的唯一明显变化是让 texi2any 运行得更快。不过,你可以借助该环境变量进行故障排查:例如,当 texi2any 的输出是否因使用扩展模块而出现差异时。

texi2any 识别的 TEXINFO_XS 取值如下:

‘default’
默认行为。尝试加载扩展模块,若失败则静默回退到解释型 Perl 实现。
‘warn’
尝试加载扩展模块,若失败则在回退到解释型 Perl 实现前给出警告信息。
‘debug’
尝试加载扩展模块,并在过程中打印大量调试信息。
‘omit’
不使用任何扩展模块。

TEXINFO_XS_PARSER 设置为 ‘0’ 可禁用解析器模块的原生代码实现。该模块是 texi2any 中将 Texinfo 输入转换为内部树形结构、以便后续处理生成各种输出格式的核心部分。这一设置可用于规避原生代码实现与纯 Perl 实现之间的 bug 或兼容性问题。

19.3. texi2any 的印刷输出

为了对得起「Texinfo 转任意格式」这个名称, texi2any 对生成打印类格式的输出提供了基础支持,包括:TeX DVI、PDF 和 PostScript。当请求这些输出格式时, texi2any 会先对输入进行合法性检查(让用户受益于 texi2any 的错误检查),然后通过调用 texi2dvi 程序来完成转换。如果你不希望进行这类错误检查(比如你的手册结合了 texinfo.tex 使用了高级 TeX 技巧),直接调用 texi2dvi 即可。

对应的输出格式选项为: --dvi--dvipdf--pdf--ps 。关于这些选项以及 texi2dvi 的常规用法,详见「使用 texi2dvi 格式化」。此外,如果指定了以下选项,它们也会被传递给底层工具: --verbose--silent--quiet-I-o 会连同参数一起传递; --debug 会不带参数传递。

与调用 texi2dvi 相关的剩余选项只有 --Xopt :只会传递其参数,且多个 --Xopt 会累积生效。这可用来为 texi2dvi 构造任意命令行。例如,运行:

texi2any --Xopt -t --Xopt @afourpaper --pdf foo.texi

等价于运行:

texi2dvi -t @afourpaper --pdf foo.texi

区别仅在于前者会做合法性检查。

你可能希望 texi2any 的其他选项也能生效,但目前并不支持。例如,运行: texi2any --no-number-sections --dvi foo.texi 生成的 DVI 文件仍然会带有章节编号。(如果收到相关需求,未来可能会改进这一点。)

实际调用的命令名称由自定义变量 TEXI2DVI 指定(详见「多格式通用自定义变量」)。正如你所想,默认值就是 ‘texi2dvi’。

texi2any 在调用 texi2dvi 时本身不会生成普通输出,只会输出诊断信息。

19.4. 自定义变量

警告: 这些自定义变量的名称与含义可能在任意 Texinfo 版本中发生变更。我们始终尽力避免不兼容的改动,但无法绝对保证,因为需求会随时间变化。

texi2any 的行为与输出的很多方面都可以通过修改所谓的 customization variables自定义变量 来调整。这些变量大致分为几类:

  • 与 @-命令相关的变量;例如 @documentlanguage
  • 与命令行选项相关的变量;例如自定义变量 SPLIT 对应 --split 命令行选项。 TEXINFO_OUTPUT_FORMAT 根据输出格式相关的命令行选项设置,可用于指定输出格式。
  • 影响 texi2any 全局行为的变量,尤其是 Texinfo 代码解析相关。
  • 与特定输出格式相关的变量。(仅与 HTML 输出相关的变量在「HTML 输出自定义」中说明。)
  • 适用于多种输出格式的变量。

你可以在命令行上使用以下方式设置自定义变量: --set-customization-variable 'var value' (将变量 / 值对用引号引起来传给 Shell)或 --set-customization-variable var=value (使用等号)。一个特殊值是 ‘undef’,它会将变量设为 Perl 中特殊的 “undefined未定义” 值。

下面各节会分别给出详细说明。

19.4.1. @-命令相关的自定义变量

下面每一个 @-命令,都存在一个 同名 的自定义变量(去掉开头的 @ ):

@afivepaper            @afourpaper        @afourlatex
@afourwide             @allowcodebreaks   @bsixpaper
@contents              @clickstyle        @codequotebacktick
@codequoteundirected   @deftypefnnewline  @documentdescription
@documentencoding      @documentlanguage  @evenfooting
@evenfootingmarks      @evenheading       @evenheadingmarks
@everyfooting          @everyfootingmarks @everyheading
@everyheadingmarks     @exampleindent     @firstparagraphindent
@fonttextsize          @footnotestyle     @frenchspacing
@headings              @kbdinputstyle     @microtype
@novalidate            @oddfooting        @oddfootingmarks
@oddheading            @oddheadingmarks   @pagesizes
@paragraphindent       @setfilename       @setchapternewpage
@shortcontents         @smallbook         @summarycontents
@urefbreakstyle        @xrefautomaticsectiontitle

将这类自定义变量设为某个值 ‘foo’,效果 类似于 执行 @cmd foo 。但二者 并不完全相同 ,因为解析 Texinfo 源码时产生的副作用不会重新执行。另外,在生成某些特定格式时,部分变量 不接收 Texinfo 代码,而是接收 已经格式化好的参数 。例如在生成 HTML 时, documentdescription 就是这种情况。

注意:如果调用 texi2any 并通过 TeX 处理文件(例如使用 --pdf 选项),这些自定义变量可能不会被传递给 TeX。

19.4.2. 自定义变量与选项

下表列出了与部分命令行选项对应的自定义变量。选项含义参见「从 Shell 调用 texi2any 」。

选项 变量
--enable-encoding ENABLE_ENCODING
--document-language documentlanguage
--error-limit ERROR_LIMIT
--fill-column FILLCOLUMN
--footnote-style footnotestyle
--force FORCE
--headers HEADERS, FORMAT_MENU
--internal-links INTERNAL_LINKS
--macro-expand MACRO_EXPAND
--no-validate novalidate
--no-warn NO_WARN
--node-files NODE_FILES
--number-footnotes NUMBER_FOOTNOTES
--number-sections NUMBER_SECTIONS
--output OUTFILE, SUBDIR
--paragraph-indent paragraphindent
--split SPLIT
--split-size SPLIT_SIZE
--trace-includes TRACE_INCLUDES
--transliterate-file-names TRANSLITERATE_FILE_NAMES
--verbose VERBOSE

将这类自定义变量设为值 ‘foo’,效果基本等同于:若该选项带参数:指定 --opt=foo ;若该选项不带参数:指定 --opt

此外,自定义变量 TEXINFO_OUTPUT_FORMAT 可用于指定 texi2any 的输出格式,既可以是常规输出格式,也可以是以下特殊格式:

‘docbook’
‘dvi’
‘dvipdf’
‘epub3’
‘html’
‘info’
‘pdf’
‘plaintext’
‘ps’
‘xml’
与同名命令行选项(以及 TEXINFO_OUTPUT_FORMAT 环境变量取值)一一对应。当命令行选项(或环境变量)设置输出格式时, TEXINFO_OUTPUT_FORMAT 自定义变量会被同步赋值。参见「从 Shell 调用 texi2any 」。
‘debugtree’
不生成常规输出格式,而是输出将输入 Texinfo 文档解析后得到的语法树文本表示。
‘parse’
只进行 Texinfo 源码解析,不产生任何输出。
‘plaintexinfo’
输出已展开所有宏、 @include@value{} 的 Texinfo 源码。与 --macro-expand 类似,但它只输出处理后的 Texinfo,而非在正常转换之外额外输出。
‘rawtext’
输出原始文本,仅做极少格式化。例如忽略脚注、不进行段落填充。常用于解析器处理文件名、HTML 注释中的版权文本等场景。
‘structure’
只进行 Texinfo 源码解析和文档结构判定,不产生输出。
‘texinfosxml’
以 TexinfoSXML 格式输出文档,这是一种用 Lisp S‑表达式表示 XML 数据的语法。
‘textcontent’

只输出纯文本内容,去掉所有命令;可用于拼写检查、字数统计等。Texinfo 源码的 util 目录下提供了极简的 detexinfo 脚本作为示例,仅一行:

exec texi2any -c TEXINFO_OUTPUT_FORMAT=textcontent "$@"

19.4.3. 全局自定义变量

本表列出会影响 texi2any 全局行为的自定义变量

CHECK_MISSING_MENU_ENTRY
当节点中出现 @menu 块时,检查文档章节结构中所有下级节点是否都有对应的菜单项。默认开启。
CHECK_NORMAL_MENU_STRUCTURE
若节点指针(显式设置或自动生成)与节点菜单项的顺序不一致,则发出警告。这是比 CHECK_MISSING_MENU_ENTRY 更严格的结构检查。默认关闭。
COLLATION_LANGUAGE

默认情况下, texi2any 按照 Unicode 排序算法(Unicode 技术标准 #10)对文档索引进行排序,不做语言专属定制。若设置此变量,则使用指定语言对索引排序做语言学定制。

当前,若因缺少相关软件或不支持指定语言而无法实现语言学定制, texi2any 不会给出警告。

在 Perl 中,语言学定制依赖 Unicode::Collate::Locale 模块;若未安装该模块,此变量会被静默忽略。

USE_UNICODE_COLLATION 设为 ‘0’,则不使用 Unicode 排序,也就不会进行语言学定制。

另见下文说明的 DOCUMENTLANGUAGE_COLLATION 变量。

COMMAND_LINE_ENCODING

用于解码命令行参数的编码。默认值基于区域编码(locale encoding)。这会影响插入到输出文件中的文件名,或程序打印的错误信息。

注意:部分来自命令行的文件与目录名可能不会立即解码,甚至完全不解码。

CPP_LINE_DIRECTIVES
在 “预处理” 阶段识别 #line 指令(见外部宏处理器:行指令)。默认开启。
DEBUG
若设置,则生成调试输出;默认为关闭(0)。
DOC_ENCODING_FOR_INPUT_FILE_NAME

若设置,使用输入 Texinfo 文档的编码信息来解析输入文件名,例如 @include@verbatiminclude 参数中的文件名。若未设置,则使用区域编码。默认开启,MS-Windows 系统默认使用区域编码。

注意:此设置仅作用于文件名;文件内容始终使用默认编码或 @documentencoding 指定的编码(见 @documentencoding enc: 设置输入编码)。

INPUT_FILE_NAME_ENCODING 变量会覆盖此变量。

DOC_ENCODING_FOR_OUTPUT_FILE_NAME

若设置,使用输入 Texinfo 文档的编码信息处理输出文件名,例如 --output 指定的文件。若未设置,则使用区域编码。默认未设置,即文件名使用当前区域编码。

注意:此设置仅作用于文件名;文件内容编码由 OUTPUT_ENCODING_NAME 决定。

OUTPUT_FILE_NAME_ENCODING 变量会覆盖此变量。

DOCUMENTLANGUAGE_COLLATION
若设置,尝试使用 @documentlanguage 指令指定的语言对索引排序做语言专属定制。另见上文说明的 COLLATION_LANGUAGE 变量。(见 @documentlanguage ll[/_cc/ ]: 设置文档语言
DUMP_TEXI
调试用。若设置,不执行格式转换,仅进行解析和宏展开。若同时指定 --macro-expand 选项,Texinfo 源码会展开并输出到对应文件。默认为假。
DUMP_TREE
调试用。若设置,将解析 Texinfo 文档后构建的语法树输出到标准错误流。默认为假。
FORMAT_MENU

设为 ‘menu’:输出 Texinfo 菜单(Info 格式默认)。设为 ‘sectiontoc’:HTML 格式默认,不输出 @menu 块内容,而是在每个节点中输出下级章节列表。设为 ‘nomenu’:不输出菜单。

生成 DocBook 或指定 --no-headers 时,此变量会被设为 ‘nomenu’。

IGNORE_SPACE_AFTER_BRACED_COMMAND_NAME
如果设置此变量,将忽略带花括号的 @-命令名 称后的空格。默认为真,与 TeX 行为一致。
INPUT_FILE_NAME_ENCODING
用于输入文件名的编码。此变量会覆盖来自文档或当前区域的任何编码。通常不需要设置此变量,但如果文件系统中的文件名使用特定字符编码,则可以使用该变量。另一种方式是将 DOC_ENCODING_FOR_INPUT_FILE_NAME 设为 ‘0’,以使用区域编码。另请参见 OUTPUT_FILE_NAME_ENCODING
LOCALE_ENCODING
从系统获取的区域编码。通常不需要显式设置此变量。
MAX_MACRO_CALL_NESTING
通过 @rmacro 定义的 @-命令 的最大递归调用次数;默认值为 100000。此变量的作用是避免无限递归。
MESSAGE_ENCODING

用于对 texi2any 输出的消息进行编码的编码方式。默认值基于区域编码。

它也用于传递给从 texi2any 调用的命令的命令行参数。例如,如果 HTML_MATH 设为 ‘l2h’, texi2any 会调用 latex2html

NO_INDEX
如果设置,将不记录索引条目,与索引相关的 @-命令(如 @printindex@synindex@defindex )均无效。默认为假。
NO_USER_COMMANDS
如果设置,将忽略用户自定义 @命令 的定义。 @alias@definfoenclose@defindex@macro 及类似 @命令 均无效。默认为假。
OUTPUT_ENCODING_NAME
用于输出文件的规范化编码名称。应为 HTML 中可用的字符集名称,通常是 IANA 推荐的编码名称之一。默认情况下,如果设置了输入编码(通常通过 @documentencoding ),则使用该信息设置输出编码名称;否则输出编码基于默认编码。参见 @documentencoding enc: 设置输入编码
OUTPUT_FILE_NAME_ENCODING
用于输出文件名的编码。此变量会覆盖来自文档或当前区域的任何编码。通常不需要设置此变量,但如果需要在文件系统中以特定字符编码创建文件名,则可以使用。另请参见 INPUT_FILE_NAME_ENCODING
PACKAGE
PACKAGE_VERSION
PACKAGE_AND_VERSION
PACKAGE_URL
PACKAGE_NAME
分别为实现包的短名称、包版本、包名称与版本的拼接、包网址和完整包名。默认情况下,这些变量均通过 Autoconf、Automake 和 configure 进行设置。
PREFIX
输出文件前缀,会加在某些输出文件名的前面。默认由 @setfilename 或从输入文件设置(参见设置输出文件名)。该值的使用方式取决于其他自定义变量或命令行选项,例如输出是否拆分。默认不设置。
PROGRAM
所使用程序的名称。默认设置为启动的程序名,并移除末尾的 ‘.pl’。
SORT_ELEMENT_COUNT
如果设置,指定一个文件名,将元素列表(节点或节,取决于输出格式)按移除 @命令 后的行数排序并输出到该文件;默认不设置。该变量由 Texinfo 源码分发的 util/ 目录下的 texi-elements-by-size 程序使用(参见 texi-elements-by-size)。
SORT_ELEMENT_COUNT_WORDS
在输出按大小排序的元素文件时(见上一项),使用单词计数而非行数计数;默认为假。
TEST
如果设为真,一些通常每次运行都会动态重新生成的变量(日期、程序名、版本)会被设为固定值。这在将输出与参考文件进行比较时非常有用,常用于测试。默认为假。
TEXINFO_OUTPUT_FORMAT

生成的输出格式。可通过命令行选项(如 --html )、 TEXINFO_OUTPUT_FORMAT 环境变量(参见 texi2any 识别的环境变量)或自定义选项进行设置。参见自定义变量与选项。

TEXINFO_OUTPUT_FORMAT 变量中设置的值,通常与用于指定格式的名称一致,但并非总是如此。如果通过 --xml 、环境变量 TEXINFO_OUTPUT_FORMAT 或自定义变量将格式设为 xml,则 TEXINFO_OUTPUT_FORMAT 自定义变量会被设为更具体的输出格式名称 texinfoxml 。这类命名上的差异不应产生任何用户可见的影响。

TREE_TRANSFORMATIONS

对应的值是一个以逗号分隔的转换列表,这些转换可在输出结果前应用于 Texinfo 语法树。如果指定多个转换,顺序无关;每个转换都会在处理过程中的必要时机执行。

默认情况下,对 HTML 和 DocBook 输出会执行以下语法树转换: ‘move_index_entries_after_items’、‘relate_index_entries_to_table_entries’。下面是更新文档主菜单的示例:

texi2any \
  -c TREE_TRANSFORMATIONS=regenerate_master_menu \
  -c TEXINFO_OUTPUT_FORMAT=plaintexinfo \
  mydoc.texi \
  -o /tmp/out

注意:由于 ‘plaintexinfo’ 输出会展开 Texinfo 宏与条件指令,在将更新内容安装回原文档前,需要先移除这类差异。这一问题可能在未来版本中修复。

当前支持以下转换(其中很多在随 Texinfo 分发的 pod2texi 工具中使用;参见调用 pod2texi: 将 Pod 转为 Texinfo):

‘complete_tree_nodes_menus’
基于章节树,为与任意层级章节关联的节点添加菜单项或完整菜单。
‘complete_tree_nodes_missing_menu’
为没有菜单、但与章节关联的节点添加完整菜单。菜单基于章节树生成。
‘fill_gaps_in_sectioning’
在语法树中添加空的 @unnumbered... 章节,填补章节结构中的断层。例如:若 @chapter 后直接跟 @subsection ,会插入一个 @unnumberedsec
‘insert_nodes_for_sectioning_commands’
为没有对应节点的章节命令自动插入节点。
‘move_index_entries_after_items’
@enumerate@itemize 中,将紧挨着 @item 之前出现的索引条目移到 @item 之后。索引条目之间的注释行也会一同移动。如前所述,HTML 和 DocBook 输出总会执行此操作。
‘regenerate_master_menu’
更新 Top 节点的主菜单,替换 Top 节点菜单中的(第一个) @detailmenu ,或在 Top 节点菜单末尾创建它。
‘relate_index_entries_to_table_entries’
@table@vtable@ftable 中,将紧跟在 @item 行之后的索引 @命令 所对应的索引条目信息,重新关联到 @item 的第一个元素,并从语法树中移除该索引 @命令。
USE_SETFILENAME_EXTENSION
对 Info 格式默认开启,其他输出格式默认关闭。如果设置,严格使用 @setfilename 指定的内容作为输出文件名(包括扩展名)。通常不需要显式设置此变量。
USE_UNICODE_COLLATION

默认情况下, texi2any 按照 Unicode 排序算法(Unicode 技术标准 #10)对文档索引排序,该算法对包含 Unicode 码点的字符串执行多级排序。(为此,程序使用 Unicode::Collate 模块,这是 Perl 标准安装的一部分。)但是,在处理带有大型索引的手册时,使用该算法会导致运行时间明显变长。

将此变量设为 ‘0’ 可使用更简单、更快的排序算法。

如果索引条目中非 ASCII 字符不多,或不关心索引是否正确排序(尤其在编写手册草稿时),开启此选项可加快 texi2any 速度。

USE_UNIDECODE
若设为假,则不使用 Perl 模块 Text::Unidecode 对更多字符进行音译转换;默认为真。

20. 创建与安装信息文件

21. 生成 HTML

21.1. HTML 转换

附录 A @ 命令细节

附录 B 技巧与提示

附录 C Texinfo 示例文件

附录 D Texinfo 模式的使用

附录 E 全局文档命令

附录 F 信息文件格式规范

附录 G GNU 自由文档许可证

命令索引

变量索引

通用索引

脚注

Footnotes:

1

texi2any 可以处理输入文件名中的非 ASCII 字符,但输出文件名中的非 ASCII 字符会对部分输出格式(尤其是交叉引用)造成问题。

2

我们发现,将独立手册的版本称为 “editions(版次)”,程序的版本称为 “versions(版本)”,有助于区分;否则在交流中,很容易因用相同词汇指代文档和软件而造成混淆。

3

在 2013 年 Texinfo 5 发布之前,该特性以临时方式支持(通过 makeinfo--commands-in-node-names 参数)。现在它已成为语言标准的一部分。

4

在 TeX 输出中, @var 目前在代码环境(如 @code@example )中使用斜体等宽字体。我们计划在下一版本中将其改为: 在所有环境中都使用变宽斜体罗马字体 。若想避免这一变更,可用 @set 设置 ‘txicodevaristt’ 标志;若想现在就启用这一变更,可写 ‘@clear txicodevaristt’ (见 @set and @value )。注意:该标志对 LaTeX 输出无效。

5

脚注应当是对正文的补充或展开,但读者 不需要 阅读脚注也能理解正文内容。关于脚注的详细讨论,可参见《芝加哥手册》(The Chicago Manual of Style),该书由芝加哥大学出版社出版。

6

这是示例脚注。

7

该语法用于 Emacs Lisp 关键字。参见《GNU Emacs Lisp 参考手册》中的「函数描述示例」一节。

8

texi2any 为 Texinfo 手册支持更多编码,理论上可支持 Perl 与 iconv 支持的所有编码(参见《GNU C 库》中的通用字符集转换)。但部分输出格式(尤其是 LaTeX)的编码支持可能仍不完善。

9

PDF 即 “便携式文档格式”(Portable Document Format),由 Adobe 公司基于其 PostScript 语言设计,用于文档交换。

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike