翻译: GNU Texinfo 7.3
- TAGS: Translate
[ 总字数: 56330 ]
Texinfo
本手册适用于 GNU Texinfo(版本 7.3,2026 年 3 月 1 日),这是一个文档系统,可以使用语义标记从单个源生成在线信息和打印手册。
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 的标记命令几乎完全是 semantic语义化 的,即它们用于指定文档中文本的 含义 ,而非物理格式指令。
大多数输出格式的转换由 texi2any 程序完成,详见《 texi2any: Texinfo 转换器》。唯一例外是通过 TeX 将 Texinfo 代码处理为 DVI 或 PDF 格式(见下文 “印刷书籍”)。Emacs 同样提供将 Texinfo 代码转换为 Info 格式的命令(详见《 texinfo-format… 系列命令》)。
GNU Emacs 中内置了专门的 Texinfo 模式,该模式提供了各类与 Texinfo 相关的功能(详见《使用 Texinfo Mode》章节)。
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工具生成)设备无关二进制格式(DVI) 由 TeX 排版程序生成(官网:http://tug.org)。该格式文件会由 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 --pdf或texi2pdf生成)该格式由 Adobe 系统公司基于其早前的 PostScript 语言开发,专为便携式文档交换设计。该格式可精准还原文档的原始外观,包括字体、图形等元素,且支持任意比例缩放。其设计目标包括跨平台兼容、易于查看等;相关背景知识可参见:https://en.wikipedia.org/wiki/Portable_Document_Format 与 http://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 文件
如前文所述,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. 发展历史
理查德・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 实现。不过,该程序最终并未正式发布。
当前版本的实现(同样由帕特里斯・迪马(Patrice Dumas)编写)继承了 texi2html 中关于自定义配置及其他功能的设计(关于 texi2html 兼容性的更多信息,参见《 texi2html: texi2any 的前身》)。不过, texi2any 是一次完全重新实现:与 texi2html 不同,它会为输入文档构建一个基于树形结构的表示形式,供所有后端程序调用处理。
这款全新的 Perl 程序设计初衷是相比旧版 C 语言程序具备以下优势:
- HTML 自定义配置能力。多年来,许多 GNU 软件及其他自由软件包一直广泛使用
texi2html中的 HTML 自定义配置功能。这就导致实际上形成了 Texinfo 语言的两套独立实现方案,要保持二者同步并非易事。彼时,若要在 C 语言程序中添加texi2html所支持的 HTML 自定义配置功能,需要投入极大的开发成本。 - 通用的 Unicode 与多语言支持(尤其是东亚语言)。在当时的技术背景下,若用 C 语言实现这一特性,无异于重写整个程序。
- 新增后端程序支持。旧版
makeinfo代码的结构已变得极为复杂,新增一个后端程序的难度很高 —— 需要与现有后端程序进行复杂的交互。而新实现方案则提供了清晰的树形结构文档表示形式,供所有后端程序调用。此前已有大量用户提出对多种后端程序的需求(如 LaTeX、最新版 (X) HTML 等);这一架构调整大幅降低了新增后端程序的实现难度。 texi2any的定位是参考实现:一方面用于定义手册中未完整规范的那部分语言特性,另一方面也为未来所有可能处理 Texinfo 的其他程序提供命令行选项的参考标准。
最初,这款新的 Perl 程序运行速度远慢于旧版 C 语言程序。此后,解析器、Info 转换器的部分模块,以及整个 HTML 转换器均已被重写为 C 语言实现,相比纯 Perl 版的 texi2any,性能得到了显著提升。主程序也已迁移至 C 语言实现。 texi2any 的 C 语言版本中嵌入了 Perl 解释器,以兼容那些仍需依赖 Perl 的功能模块。
1.6. 新增输出格式
前面几节介绍的输出格式已经能满足非常广泛的使用场景,但显然仍有扩展空间。
如果你是程序员,并希望通过为 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 获取。
2. 编写 Texinfo 文件
本章介绍 Texinfo 语法以及一个 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 Sample Manual 1.0
@copying
This is a short example of a complete Texinfo file.
Copyright @copyright{} 2026 Free Software Foundation, Inc.
@end copying
@documentinfo
@title Sample Title
@end documentinfo
@maketitle
@contents
@node Top
@top GNU Sample
This manual is for GNU Sample
(version @value{VERSION}, @value{UPDATED}).
@node First Chapter
@nodedescription The first chapter is the only chapter in this sample.
@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.
@node Index
@nodedescription Complete Index
@unnumbered Index
@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-header 或 tex-end-of-header 来自定义这串标记。详见《Texinfo Mode 下的排版与打印》。
标题区起始行和结束行 不属于 Texinfo 格式标准 ,这也是它们用注释形式实现的原因。
2.6. 目录分类
使用 @dircategory 命令为手册指定一个类别。下面是一些类别名称示例:
使用 @dircategory 命令为手册指定分类。
@dircategory 命令通常紧跟在 @direntry 块之前,这些内容会被 install-info 工具使用。有关这些命令的使用示例,参见《安装 Info 目录文件》。
手册中的第一个 @dircategory 命令用于指定整个手册的分类。后续再次使用 @dircategory 仅会设置紧跟其后的 @direntry 块的分类。
不同手册之间的目录分类使用并不统一,而且未来也不太可能统一,因为各个作者独立编写 Texinfo 文档,缺乏能促成统一的集中协调机制。
如果用户或操作系统发行版重视 dir 文件内的逻辑结构,他们可以自行编辑 Info 或 Texinfo 文件中的分类。
手册作者可以考虑使用下面的部分分类。对于会安装多本手册的软件包(如 Emacs),建议使用专属于该软件包的一个或多个分类,将其手册归组。
Editors # 编辑器 Education # 教育 Email # 电子邮件 Fonts # 字体 Games # 游戏 Graphics # 图形图像 Health # 健康 Interface # 界面 Internet applications # 互联网应用 Live communications # 实时通信 Localization # 本地化 Mathematics # 数学 Music # 音乐 Network applications # 网络应用 Printing # 打印 Security # 安全 Science # 科学 Software development # 软件开发 Software libraries # 软件库 Spreadsheets # 电子表格 System administration # 系统管理 Telephony # 电话通信 Text creation and manipulation # 文本创建与处理 Version control # 版本控制 Video # 视频 Web authoring # 网页制作
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 用于在合适的位置 插入 这段文本。
对于纯文本输出,如果你希望显示版权信息,就必须显式插入,否则不会自动输出。例如,你可以在 Texinfo 文件的开头附近添加如下内容:
@ifplaintext @insertcopying @end ifplaintext
你也可以在同一位置为纯文本输出加入其他类似标题的信息。
如果文档是软件手册,对应的软件通常使用不同的许可证 —— 对于 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.8. 标题页与版权页
印刷书籍的第一页通常是 title page标题页 ,包含书名与作者信息。版权与出版信息通常印在下一页,我们将这一页称为 copyright page版权页 。由于它位于标题页的背面(左页),该页也被称为 title verso标题背页 。
Texinfo 提供了相应命令,用于设置文档标题、副标题、作者(或多位作者),以及文档的复制权限与出版信息。这些 metadata元数据 会用于生成标题页和版权页。同样,即使其他输出格式不显示为标题页,这些信息也会以某种形式出现在输出结果中。
Texinfo 提供了 至少三种不同方式 来提供这些元数据并生成标题页与版权页,将在后续小节中介绍。
在 HTML 格式中,要得到与印刷手册类似的标题页,最佳方式是设置自定义变量 NO_TOP_NODE_OUTPUT (详见 NO_TOP_NODE_OUTPUT )。
对于足够简单的文档,以及传统书籍前文中的简略标题页,Texinfo 还提供了 @shorttitlepage 命令,它会将该行剩余内容作为标题。其参数会单独占一页排版,后面跟一个空白页。在 HTML 中,如果未设置 @settitle , @shorttitlepage 可起到与 @settitle 相同的作用。详见 @settitle: 设置文档标题。
文档元数据与 @maketitle 命令 @titlepage 在标题页显示版本或版次信息 标题生成
2.8.1. 文档元数据与 @maketitle 命令
定义标题页所用文档元数据最简单的方式,是使用 @documentinfo 命令。下面是一个模板:
@documentinfo @title name-of-manual-when-printed @subtitle subtitle-if-any @subtitle second-subtitle @author author @end documentinfo
在 @documentinfo 块内, @title 命令 只能使用一次 。 @subtitle 命令可以多次使用,处理 Texinfo 文件时会保留块中 @subtitle 出现的顺序。同理, @author 也可以多次使用。(不过, @title 、 @subtitle 、 @author 之间的相对顺序并不重要。)
版权页的信息写在 @copying 和 @publication 命令块内。关于 @copying 的更多说明,参见「文档权限」一节。
@publication 命令的用法与 @copying 非常相似。Texinfo 处理器在源文件中遇到该命令块时,会保存其中的内容。你可以用这个命令提供文档的出版信息,例如出版商地址、ISBN 等。该块用于填写印刷书籍中会出现在「imprint版本说明」或「colophon版本印记」里的信息。
最后,要 实际输出标题页与版权页 ,需要使用 @maketitle 命令。将该命令单独写在一行,它会汇总已有信息,生成这两页。
这些命令的使用方式示例如下:
@copying copying-info @end copying @publication Published by publisher-name publisher-address @end publication @maketitle
2.8.2. @titlepage: 标题页
除了使用 @maketitle 创建标题页和版权页之外,另一种方式是使用 @titlepage 命令。 @titlepage 和 @end titlepage 之间包含的所有内容,会 直接输出 到印刷版手册中。下面是一个基础示例:
@titlepage @title Sample Title @c 下面两条命令开始版权页 @page @vskip 0pt plus 1filll @insertcopying Published by ... Cover art by ... @end titlepage
将 @titlepage 单独写一行作为标题页及后续版权页内容的开始,并将 @end titlepage 单独写一行作为结束。
@page 行之前的内容用于 标题页 。后续小节会介绍在 Texinfo 文档中使用 @titlepage 命令生成标题页的两种方式:第一种更接近之前 @documentinfo 的用法,第二种则提供更显式的排版控制。
不过,使用 @titlepage 时, copyright page版权页的生成方式是固定不变的 。
版权页
通过使用 @page 命令,你可以在 @titlepage 和 @end titlepage 划定的区域内 强制分页 ,从而生成多个无编号页面。版权页就是这样生成的。( @titlepage 命令其实更适合命名为 @titleandadditionalpages ,只是名字太长了!)
要把版权声明和版权页上的其他文字 推到页面底部 ,可以在 @page 之后使用如下写法:
@vskip 0pt plus 1filll
@vskip 命令会在 TeX 输出中插入空白间距;在其他所有输出格式中会被忽略。‘0pt plus 1filll’ 表示:插入 0 磅的强制空白,并按需插入尽可能多的可选空白,把后续内容推到页面底部。注意单词 ‘filll’ 里是三个 ‘l’,这是正确写法。
要插入版权文本本身,接下来写 @insertcopying (见文档权限):
@insertcopying
(与 @maketitle 会自动输出版权文本不同,使用 @titlepage 时必须手动写这条命令才能输出复制权限信息。)
在版权信息之后,可以写上出版商、ISBN、封面设计署名等信息。
2.8.2.2. @titlefont, @center, @sp: 标题字体、居中与空行
Texinfo 还提供第二种创建标题页的方法,使用不适用于正文的排版专用命令。
该方法通过 @titlefont 、 @sp 和 @center 命令生成文字居中的标题页。
使用 @titlefont 命令选择适合标题本身的大号字体。如果标题特别长,你可以多次使用 @titlefont 。
对于 HTML 输出,每个 @titlefont 命令会生成一个 <h1> 标题,但不会影响 HTML 文档的 <title> 。要设置文档标题,你可以在 @titlefont 命令前使用 @settitle 命令(参见 @settitle: 设置文档标题)。
示例:
@titlefont{Texinfo}
在一行开头使用 @center 命令,可将该行剩余文本居中。因此:
@center @titlefont{Texinfo}
会将标题居中,本例中就是以标题字体显示的「Texinfo」。
使用 @sp 命令插入 垂直间距 。例如:
@sp 2
会在打印页面中插入 两个空行 。(有关 @sp 命令的更多信息,参见 @sp n: 插入空行。)
该方法的模板如下所示:
@titlepage
@sp 10
@center @titlefont{name-of-manual-when-printed}
@sp 2
@center subtitle-if-any
@sp 2
@center author
...
@end titlepage
示例中的间距适用于 8.5×11 英寸规格的手册。
2.8.3. 在标题页显示版本或版次
2.8.4. 标题生成
Texinfo 提供两种 standard page heading formats标准页面页眉格式 :一种用于单面打印的文档(single-sided-printing),另一种用于双面打印的文档(double-sided-printing)。
总体而言,你可以通过多种方式控制页眉:
传统方式是在标题页命令之前编写
@setchapternewpage命令。大多数文档使用标准的单面或双面页眉格式:双面打印时(有时)会使用
@setchapternewpage odd,而单面打印时(几乎总是)不使用@setchapternewpage命令(参见@setchapternewpage: 章节前的空白页)。- 你也可以使用
@headings命令来禁止生成页面页眉,或为单面 / 双面打印启用页眉。若要关闭页眉,可写@headings off。参见@headings命令。 - 或者,你可以自定义页面页眉和页脚格式。参见页面页眉。
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 。
在 Info 输出(有时也包括 HTML 输出)中,‘Top’ 节点通常包含一个列出各章节的顶层菜单,还可能包含一个列出整个文档所有节点的详细菜单。通常不需要在 Texinfo 源文件里手动编写这类菜单,因为 texi2any 会自动生成这些菜单。不过,下面的示例展示了如何在 ‘Top’ 节点中使用 @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.
- This is the first item.
- 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:
* 螺丝刀:: 一字头与十字头螺丝刀。
* 电钻:: 使用电动螺丝刀、手电钻、组合电钻、冲击起子、
锤钻、破碎机和拆除钻在物体上打孔。
3.9. 菜单
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 跳转到第一项。
3.9.2. 菜单示例
在 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 文件」)。
3.9.3. 菜单位置
一个节点中 最多只能有一个菜单 。按照惯例,菜单应放在 节点的末尾 ,在 @end menu 与下一个节点的开始之间, 不能包含 任何普通文本或额外命令。
这一惯例很实用,因为使用菜单的读者很容易错过菜单之后的文本。此外,在 Info 输出中(菜单没有专门的结束标记),任何位于菜单之后的文本都会被当作菜单的一部分。这样一来,以 '*' 开头的行就很可能被错误解析。
通常,包含菜单的节点最好不要有太多文本。如果你发现菜单前有大量文字,我们一般建议将除一两段之外的内容全部移到新的子节点中。否则,读者很容易忽略菜单。
3.9.4. 菜单的组成部分
一个菜单项由三部分组成,其中 只有第二部分是必需的 :
- 菜单项名称(可选)
- 节点名称(必需)
- 项目描述(可选)
通用菜单项的模板如下(更多写法见下一节):
* 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 命令。参见「节点」。
- 节的树形结构
- 结构命令的类型
-
@chapter: 章节结构定义 -
@unnumbered,@appendix: 特殊标记的章节(无编号 / 附录) -
@majorheading,@chapheading: 章节级标题 -
@section: 章节下的节 -
@unnumberedsec,@appendixsec,@heading: 无编号节 / 附录节 / 普通标题 -
@subsection: 节之下的子节 - 类
@subsection命令 -
@subsubsection及其他三级子子节命令 -
@part: 章的分组 - 提升/降低节层级:
@raisesections与@lowersections - 非结构化节点
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 命令 各占一行 书写。
4.13. 非结构化节点
本章迄今为止所有节点示例,都是在 @node 行后紧跟一个结构化命令(如 @chapter )。
不过,你也可以 不使用结构化命令 来创建节点。如果你不希望手册(或手册的某一部分)采用层级结构(即章节高于节、节高于子节等),这种方式会很有用。
实现方法是:在 @node 行后使用 任意标题类命令 。例如:
@node Topic @heading All about the Topic ...
标题命令的参数会照常输出。当 xrefautomaticsectiontitle 标志开启时(参见 xrefautomaticsectiontitle),该参数还会被用作该节点所有交叉引用的显示文本。
这类节点 不属于文档层级结构 。这意味着:
- 它们不会出现在目录中;
- 自动生成的节点方向指针(Next、Prev、Up;参见 编写 @node 行)不会与这类节点建立链接。
如果你想创建 非结构化节点,但不在开头显示标题 ,可以用 @xrefname 命令代替标题命令。例如:
@node Topic @xrefname All about the Topic ...
当 xrefautomaticsectiontitle 标志开启时, @xrefname 会为该节点提供交叉引用文本。因此 @xref{Topic} 会生成类似 “See ‘All about the Topic’” 的输出。
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.12. @link: 纯文本无修饰超链接
@link 会在支持的输出格式中生成一个纯超链接,包括 HTML、DocBook、LaTeX 以及在线版 PDF。其格式模板为:
@link{node-name, label, manual-name}
node‑name 是目标节点或锚点的名称。 label 和 manual‑name 可以省略其中一个,也可以两个都省略。如果提供了 label ,则它会作为链接显示文本。 manual‑name 是目标所在的外部手册名称;如果未提供,则引用指向当前手册。
@link 的输出与 @ref 类似,区别在于:它 不会在 Info 或印刷版输出中为链接文字添加额外标记 ,不会显示为典型的交叉引用样式。
使用 @link 时需要注意:不要用它生成读者浏览手册所 必需 的导航链接,因为在某些输出格式中这类链接不会生效。 @link 最适合用于添加 非必需、但更方便 的辅助链接。例如,可在代码示例中用 @link 引用程序库中某个符号的文档。
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. 标记定义、命令等
Texinfo 提供了多种命令,用于明确一段文本所指代的对象类型。例如,电子邮件地址使用 @email 标记;这样一来,在支持的输出格式中,就可以生成可直接发送邮件的活跃链接。如果电子邮件地址仅被标记为 “以打字机字体显示”,就无法实现这一功能。
- 高亮命令的实用价值
-
@code{spmle-code}: 代码示例 -
@kbd{keyboard-characters}: 键盘输入内容 -
@key{key-name}: 按键名称 -
@samp{text}: 示例文本 -
verb{chartextchar}: 原样文本 -
@var{metasyntactic-variable}: 元语法变量 -
@env{environment-variabl}: 环境变量 -
@file{file-name}: 文件名 -
@command{command-name}: 命令名称 -
@option{option-name}: 命令行选项 -
@dfn{term}: 被定义的术语 -
@abbr{abbreviation [, meaning ]}: 缩写 -
@acronym{acronym [, meaning ]}: 大写缩写词 -
@indicateurl{{uniform-resource-locator}: 无功能的URL -
@email{email-address [, displayed-text ]}: 邮箱地址
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_SYMBOL 和 CLOSE_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 ESC 和 M-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
PATHenvironment 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
.elfiles are in the/usr/local/emacs/lispdirectory.
6.1.10. @command {command-name}: 命令名称
使用 @command 命令来标记命令名称,例如 ls 或 cc 。
@command 的显示效果与 @code 相同。例如:
The command @command{ls} lists directory contents.
会生成:
The command
lslists 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
-lproduces 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 notice 或 Caution 的短语,或者在 @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 结束该示例, @end 与 example 之间只保留一个空格。
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.
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 是不可靠的。
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 命令开头。
下面是不同类型列表与表格的项目符号列表示例:
- 带或不带项目符号的无序列表。
- 使用数字或字母的有序列表。
- 带高亮效果的双列表格。
下面是包含相同内容的有序列表示例:
- 带或不带项目符号的无序列表。
- 使用数字或字母的有序列表。
- 带高亮效果的双列表格。
下面是包含相同内容及其对应 @-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
效果如下:
- Underlying causes.
- Proximate causes.
下面是带参数 3 的示例:
@enumerate 3 @item Predisposing causes. @item Precipitating causes. @item Perpetuating causes. @end enumerate
效果如下:
- Predisposing causes.
- Precipitating causes.
- Perpetuating causes.
用法总结:
@enumerate- 不带参数:生成数字列表,第一项从 1 开始。
@enumerateunsigned-integer- 无符号整数带(无符号)数字参数:从该数字开始生成编号列表,可用于接续被其他文本打断的列表。
@enumerateupper-case-letter- 大写字母带大写字母参数:生成字母编号列表,从该大写字母开始。
@enumeratelower-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
效果如下:
upcasedowncase- 这两个函数接受字符或字符串作为参数,并返回对应的大写(小写)字符或字符串。
(另请注意:本示例同时展示了双列表格中支持多行说明文本的写法。)
8.5. @multitable: 多列表格
@multitable 用于创建任意列数的表格,每一列均可自定义宽度。
在 @multitable 所在行定义列宽,表格中每一行实际内容以 @item 命令开头,列与列之间用 @tab 命令分隔。最后以 @end multitable 结束表格。具体用法见后续小节。
8.5.1. 多列表格列宽
你可以用两种方式为多列表格定义列宽:按行宽的比例指定,或使用 原型行 指定。不支持混合使用这两种方式。无论哪种方式,列宽都必须在 @multitable 命令所在的同一行上完整定义。
要按行宽比例指定列宽,可在
@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 multitableNo 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要使用原型行指定列宽,可在
@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
生成效果如下:
| Key | Command | Description |
|---|---|---|
| C-x 2 | split-window-vertically | Split the selected window into two windows, with one above the other. |
| C-x 3 | split-window-horizontally | Split the selected window into two windows positioned side by side. |
| C-Mouse-2 | In 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 的输出大致如下:
通常,浮动元素列表中的每一行会包含:
- 浮动元素类型(如果有)
- 浮动元素编号
- 标题(若定义了
@shortcaption,则使用短标题;否则使用@caption)
根据输出格式不同,还可能包含页码。
无编号的浮动元素 (即没有交叉引用标签的浮动元素)不会出现在列表中。
@listoffloats 的排版格式取决于输出格式。例如在 Info 中,它会被格式化为菜单。
在 LaTeX 输出中:
- 类型为 ‘figure’(不区分大小写)时,输出
\listoffigures - 类型为 ‘table’(不区分大小写)时,输出
\listoftables - 其他类型则输出对应的
\listof命令。
9.2. 插入图片
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. 脚注
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 命令提供以下参数实现: txiindexbackslashignore 、 txiindexhyphenignore 、 txiindexlessthanignore 和 txiindexatsignignore 。例如,指定: @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 命令接收两个参数:要重定向的源索引、目标索引。命令格式如下:
@syncodeindexfrom 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 命令的用法如下:
@defindexname
新索引的名称通常是 双字母 ,例如 ‘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:
intfoo(const std::vector<int>& bar)¶ Documentation of
foo.
尽管 ‘@&’ 和 ‘@ampchar{}’ 几乎可以在任何位置使用,但除上述特殊场景外,其他地方均无需使用。
11.2. 插入引号
正如前面关于 Texinfo 通用输入约定的章节所述(见通用语法约定),Texinfo 源文件使用 ASCII 字符 ` (十进制 96)生成左单引号 ‘ ,使用 ASCII 字符 ' (十进制 39)生成右单引号 ’ 。将这些输入字符成对使用( `` 和 '' )会生成双引号 “ 和 ” 。这是 TeX 所采用的约定。
但在计算机代码示例中, ` 和 ' 会分别显示为这些 ASCII 字符的常规样式:单独的反引号(重音符)和无方向单引号。在过去,TeX 输出默认使用带方向的字形。Texinfo 提供了以下命令,用于在这两种显示样式之间切换:
@codequoteundirectedon-off- 设为 off 时,代码环境中的
'字符将输出为右弯单引号。 @codequotebacktickon-off- 设为 off 时,代码环境中的
`字符将输出为左弯单引号。
如果只想在文档的部分内容中使用这些设置,可以用 @codequote... on 恢复默认行为,例如: @codequoteundirected on 。
这些设置会影响: @code 、 @example 、 @kbd 、 @samp 、 @verb 和 @verbatim 。详见高亮命令的用途。
遗憾的是,部分文档阅读器在复制粘贴时,会破坏带方向的引号字符。(免费 PDF 阅读器 xpdf 可以正常使用,但其他免费与非免费 PDF 阅读器均存在此问题。)
也可以通过 @set 和 @clear 命令,对对应的变量 txicodequoteundirected 和 txicodequotebacktick 进行操作,来控制该功能。
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选项则除外(参见@documentencodingenc: 设置输入编码); - 若无法输出对应编码字符,则使用 ASCII 转写形式。
重音命令表
| 命令 | 输出 | 说明 |
|---|---|---|
@"o |
ö | 分音符号(变音符号) |
@'o |
ó | 锐音重音 |
@,{c} |
ç | 软音符号 |
@=o |
ō | 长音符号/上划线 |
@^o |
ô | 扬抑符 |
@`o |
ò | 抑音重音 |
@~o |
õ | 波浪号重音 |
@dotaccent{o} |
ȯ | 上点重音 |
@H{o} |
ő | 匈牙利长音分音 |
@ogonek{a} |
ą | 尾音符号 |
@ringaccent{o} |
o̊ | 上圈重音 |
@tieaccent{oo} |
o͡o | 连字符重音 |
@u{o} |
ŏ | 短音符号 |
@ubaraccent{o} |
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. 文本专用符号
Texinfo 支持一些印刷文本中常用、但 ASCII 中没有的额外符号。当然,这类符号还有成千上万种。就 texi2any 而言,直接使用 Unicode 字符是可行的,但 TeX 则没这么方便。
11.7.1. @TeX{} (TeX)与 @LaTeX{} (LaTeX)
使用 @TeX{} 命令生成 ‘TeX’。在印刷版手册中,它会呈现为特殊的徽标样式,与三个普通字母不同。在其他输出格式中,外观仅为普通的 ‘ TeX ’。
同理,使用 @LaTeX{} 命令生成 “LaTeX”,该徽标在印刷版手册中样式更为特殊(且与不正确的 La@TeX{} 写法不同)。在其他输出格式中,结果仅显示为 “ LaTeX ”。
这些命令的拼写在 Texinfo 中比较特殊,因为它们同时混用了大写和小写字母。
11.7.2. @copyright{} (©): 版权符号
使用 @copyright{} 命令生成版权符号 ‘©’。在支持的环境中,会显示为带圆圈的字母 ‘c’;否则显示为 ‘(C)’。
从法律角度而言,并非必须使用版权符号;根据国际公约,使用英文单词 ‘Copyright’ 即可。
11.7.3. @registeredsymbol{} (®): 注册商标符号
使用 @registeredsymbol{} 命令生成注册商标符号 ‘®’。在支持的环境中,会显示为带圆圈的字母 ‘R’;否则显示为 ‘(R)’。
11.7.4. @dots (…)与 @enddots (…): 省略号
ellipsis省略号 (一连串点)如果直接用多个句点排版,间距会不正确。因此在 Texinfo 中使用专门的命令:使用 @dots{} 命令生成标准省略号,即三个间距恰当的点 … 就像这样。重点强调: 不要在源文件里直接写三个句点 。这种写法在某些输出格式下或许可用,但在印刷版手册中会导致点与点之间的间距错误。
@enddots{} 命令用于生成 句末省略号 ,同样是三个点,但后面的间距不同, … 仔细观察就能看出区别。
这里是一个省略号: … ,这里是三个连续句点: ...
在印刷版(以及通常的 HTML)输出中,三个连续句点的间距会比标准省略号紧凑得多。
11.7.5. @bullet (•): 项目符号
使用 @bullet{} 命令生成一个大圆点,或最接近圆点的符号。也可以使用星号代替。这里是一个项目符号:•
11.7.6. @euro (€): 欧元符号
使用 @euro{} 命令生成欧元符号 ‘€’。在支持的环境中会显示该符号,否则显示文字 ‘Euro’。
标准 TeX 字体中不含欧元符号(该字体设计时欧元尚未立法启用)。因此,TeX 会使用额外的字体 feymr10(及其他变体)。该字体为免费字体,可从 http://ctan.org/pkg/eurosym 等渠道下载,发行包中包含安装说明。
11.7.7. @pounds (£): 英镑符号
使用 @pounds{} 命令生成英镑符号 ‘£’。在支持的环境中会显示该符号,否则显示为 ‘#’。
11.7.8. @textdegree (°): 度符号
使用 @textdegree{} 命令生成度数符号 ‘°’。在支持的环境中会显示标准度数符号,否则显示为小写字母 ‘o’。
11.7.9. @minus (−): 减号
使用 @minus{} 命令生成负号。在输出所使用的字符编码与字体支持的情况下,该符号为标准长度的负号 —— 比连字符稍长,比破折号短:
见 @minus (−): Inserting a Minus Sign
- ‘−’ 是由
@minus{}生成的负号, - ‘-’ 是由字符 ‘-’ 生成的连字符,
- ‘—’ 是用于文本中的破折号。
如果你实际需要排版包含减法运算的数学公式,建议使用 @math ,例如 @math{a-b} (参见 @math 与 @displaymath: 数学公式排版)。
11.7.10. @geq (≥)与 @leq (≤): 大于等于/小于等于符号
使用 @geq{} 和 @leq{} 命令生成大于等于号与小于等于号,即 ‘≥’ 和 ‘≤’。当这些符号不可用时,将输出 ASCII 形式的 ‘>=’ 和 ‘<=’。
11.8. 编程专用符号
在 Texinfo 中,代码常通过 @example 和 @end example 包裹的示例进行展示。在这类示例里,你可以使用 ‘⇒’ 或 ‘→’ 表示求值结果或展开效果。同样,也有对应的命令可插入符号,用来表示打印输出、错误信息、表达式等价、编辑器中点的位置,以及图形界面操作序列。
这些符号插入命令并非必须在示例中使用,但 绝大多数情况下都用于示例中 。所有符号插入命令后面都带有空花括号。
11.8.1. 符号汇总
以下是符号命令的汇总说明:
- ⇒
@result{}表示表达式的运算结果。- →
@expansion{}表示宏展开的结果。- -|
@print{}表示打印输出内容。- error→
@error{}表示后续文本为错误信息。- ≡
@equiv{}表示两种形式完全等价。- ∗
@point{}表示光标所在位置。- A → B
@clicksequence{A @click {} B}表示图形界面操作序列:先执行 A,然后点击 B,或从菜单中选择 B,或以其他方式选中 B。
11.8.2. @result{} (⇒):表达式结果
使用 @result{} 命令来表示表达式求值后的结果。
@result{} 命令显示为‘⇒’,即双横线箭头;若该符号不可用,则使用 ASCII 序列 ‘=>’ 代替。
因此,下面的示例:
(cdr '(1 2 3))
⇒ (2 3)
可以读作:「(cdr '(1 2 3)) 的求值结果为 (2 3)」。
11.8.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.8.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.8.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.8.6. @equiv{} (≡):等价标识
有时两个表达式会产生完全相同的结果。你可以使用 @equiv{} 命令来表示两种形式完全等价。
@equiv{} 命令显示为 ‘≡’,即标准的数学等价符号(三条平行横线);若该符号不可用,则使用 ASCII 序列 ‘==’ 代替。
因此,下述代码:
@example lisp
(make-sparse-keymap) @equiv{} (list 'keymap)
@end example
这表示对 (make-sparse-keymap) 求值的结果,与对 (list 'keymap) 求值的结果完全相同。
11.8.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.8.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.9. 插入 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; ’ 的实体引用,例如上面的例子会输出 ‘IJ’ 。即使 HTML 文档使用其他编码(如 Latin 1)且该字符不在此编码中,通常也能正常显示。
在 Info 和纯文本格式中,如果输出编码不是 UTF‑8,则会输出 ASCII 序列 ‘ U+ hex ’,例如上面的例子会显示为 6 个 ASCII 字符:‘U+0132’
12. 数学公式排版
你可以使用 @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 选项时均不适用。
13. 强制换行 / 分页与禁止换行 / 分页
在某种输出格式中,换行与分页有时会出现在 “不合适” 的位置。你需要确保文本在所有输出格式中显示正常。
例如,在印刷版手册里,分页可能会生硬地出现在示例中间;为避免这种情况,你可以使用分组命令将文本绑定在一起,防止其被拆分到两页。反之,你也可以在原本不会分页的位置强制分页。
你可以使用换行、禁止换行或分页相关命令来修复有问题的换行与分页。
13.1. 换行/分页命令
换行命令用于创建或允许换行与分段:
@*- 强制换行。
@spn- 跳过 n 行空行。
@-- 插入可选连字符。
@hyphenation{hy-phen-a-ted words}- 在 hy-phen-a-ted 单词中定义连字符位置。
以下命令可将文本保持在同一行:
@w{text}- 禁止 text文本 被拆分并跨两行加连字符。
@tie{}- 插入普通单词间空格,且此处不允许换行。
分页命令仅适用于印刷版输出,因为其他输出格式没有页面概念。
@page- 开始新页面。
@group- 将必须在同一页显示的文本绑定在一起。
@needmils- 若当前页面剩余空间不足,则新建一页。
13.2. @* 与 @/: 生成换行与允许换行
@* 命令在所有输出格式中强制换行。 @/ 命令仅在印刷版手册中允许自动换行。
下面是使用 @* 的示例:
This sentence is broken @*into two lines.
会生成:
This sentence is broken into two lines.
@/ 命令在长 URL 或其他 TeX 无法自动找到合适换行位置的标识符中很有用。TeX 会在 URL 的自然位置自动换行(参见 URL 换行),因此只在需要时才使用 @/ 。 @/ 对其他输出格式无效果
13.3. @- 与 @hyphenation: 印刷输出中的连字符换行
尽管 TeX 的断字算法通常效果很好,但它偶尔还是会漏掉合适的断字位置。(或者,更少见的情况是,插入错误的断字。)因此,对于包含生僻词汇的文档,或是为印刷版进行精细排版时,你可能需要显式指定断字位置。Texinfo 提供了两个相关命令:
@-- 插入 可选连字符 ,即在单词中可以跨行断开并显示连字符的位置。当你发现因 TeX 未自动断字而导致 “行溢出”(overfull hbox)时,这个命令尤其有用(参见行溢出)。如果一个单词中包含
@-,TeX 将不会再自动添加其他断字位置。 @hyphenation{hy-phen-a-ted words}为指定单词设置断字位置。例如:
@hyphenation{man-u-script man-u-scripts}如示例所示,你需要在每个希望断字的位置加上 ‘-’ 。TeX 只会在单词 完全匹配 时使用指定的断字规则,因此需要给出所有必要的变形形式,比如复数形式。
非印刷格式的输出不会进行连字符断字,因此这些命令在其他输出格式中 均无效 。
13.4. @allowcodebreaks: 控制 @code 块内的换行
通常情况下,TeX 会在 @code 及相关命令内的字符 ‘-’ 和 ‘_’ 处考虑换行(参见 @code {sample-code}),大致相当于把这些符号当作 “空” 断词点处理。
这一点是必要的,因为很多手册(尤其是 Lisp 家族语言的手册)需要描述非常长的标识符。但另一方面,有些手册不存在这类问题,你可能不希望在某些标识符的下划线处换行,例如 SIZE_MAX ,更不希望在 __typeof__ 这类四个下划线中的任意一处后换行。
因此 Texinfo 提供了这条命令:
@allowcodebreaks false
用于禁止在 @code 内的 ‘-’ 或 ‘_’ 处断行。使用 @allowcodebreaks true 可以恢复允许此类断行。这些命令需单独写在一行。
这些命令可在文档任意位置使用。例如,你可能只需要在某一段有问题的段落中关闭断行,而其他地方保持默认开启,或者反过来。
该命令只对 TeX 输出生效,对其他输出格式无影响。
13.5. @w {text}: 禁止文本换行
@w{text} 输出文本内容,同时 禁止在内容内部自动换行 。
因此,你可以使用 @w 生成 不可换行的空格 ,其宽度固定为普通单词间空格的宽度:
@w{ } @w{ } @w{ } indentation.
将输出:
indentation.
由 @w{ } 产生的空格不仅不可断开,而且 不会被拉伸或压缩 。有时这正是你需要的效果,例如在进行手动缩进时。但通常情况下,你会希望使用可拉伸、可压缩的普通单词间空格(用于印刷输出);相关用法请参见下一节的 @tie 命令。
在印刷输出中,你还可以使用 @w 命令避免长名称或短语被自动断词连字符拆分,例如当它们恰好出现在行尾时。
你也可以使用 @w 避免源码控制系统中出现意外的关键字展开。例如,要在文档中原样写出 $Id$ ,可写作 @w{$}Id$ 。不过这个技巧在某些输出格式的文件中无效。
13.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’)。
13.7. @sp n: 插入空行
以 @sp n 开头且整行仅包含该命令时,会生成 n 行空白行。 @sp 同时会强制分段。
例如:
@sp 2
会生成两行空白行。
@sp 命令最常用于标题页
13.8. @page: 开始新页面
一行中只包含 @page 时,会在印刷版手册中 开始新的一页 。在没有 “页面” 概念的其他输出格式中,它会 开始一个新段落 。 @page 命令常用于 Texinfo 文件的 @titlepage 区域,用来 开启版权页 。
13.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 。参见 “引用与示例” 一章。(这些命令的共同点是:输入的每一行都会直接对应输出的一行。)
13.10. @need mils: 避免分页
如果一行中只包含 @need n ,那么在印刷版手册里,当当前页面剩余空间小于 n 密耳(千分之一英寸)时,就会 另起新页 。参数 n 外面不要加花括号。 @need 命令对其他输出格式没有效果,因为它们不进行分页。
本段前面就使用了 @need 命令:如果页面剩余空间不足 800 密耳(0.8 英寸),就会在印刷输出中另起一页。写法如下:
@need 800 This paragraph is preceded by ...
@need 命令常用于避免 孤行 :即只有一行文字孤零零出现在印刷页底部的情况。
14. 定义命令
@deffn 命令及其他 definition commands定义类命令 ,可让你以统一格式描述函数、变量、宏、命令、用户选项、特殊形式及其他实体。
在输出结果中,实体会显示其名称、参数及所属类别(如 “函数”、“变量” 等)。定义正文会在下方缩进显示。实体名称也会自动加入对应索引。
所有定义类命令格式相近。本章先讲解 @deffn ,再详细介绍其他定义类命令。
14.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 也配有多个专用变体,用于描述不同类型的变量
14.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” 之间会出现多余空格。要避免这一问题,请在输入时删去不必要的空白,或者把续行符 @ 放在大括号 外面 。
@ 在其他任何上下文里都 不作为续行符 使用。通常, @ 后面跟空白字符(空格、制表符、换行)会生成一个普通的单词间空格(参见 “多个空格”)
14.3. 可选参数与重复参数
有些实体支持可选参数或重复参数。表示这类参数的通用约定是使用 方括号 和 省略号 :
- 被方括号
[]括起来的参数是可选参数; - 后面跟省略号
…的参数可以重复多次(也可省略)。
因此,[ optional-arg ] 表示 optional-arg 是可选参数, repeated-args… 表示零个或多个参数。在 Lisp 中,当多个参数需要组合成更深一层的列表结构时,会使用 圆括号 。
下面是一个虚构的(较复杂的)特殊形式的定义行示例:
Special Form: foobar (var [from to [inc]]) body…
在本例中:
- 参数 from 和 to 是可选的,但必须同时出现或同时省略;
- 如果提供了 from 和 to ,则 inc 也可以选择性给出;
- 这些参数与 var 组合成一个列表,以便和 body 区分开, body 包含该形式的所有剩余部分。
在 Texinfo 源文件中,这条 @defspec 语句写法如下:
@defspec foobar (var [from to [inc]]) body@dots{}
14.4. 省略定义名后的空格
出于排版风格或编程语言语法的要求,你可能希望在定义中的名称 后面、左括号前面 不显示空格。要实现这一点,可以设置 ‘txidefnamenospace’ 标记(参见 @set 和 @value )。
例如,如下输入:
@set txidefnamenospace
@deffn Builtin index (string, substring)
@dots{}
@end deffn
会生成如下输出:
- Builtin: index (string, substring)
- …
14.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: 第二条及后续条目)。
14.6. 各类定义命令
14.6.1. 函数及类似实体
本节介绍用于描述 函数及带有简单参数的类似实体 的命令:
@deffncategory 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包裹这些特殊字符,避免被转换成排版用的短横线或长破折号。@defunname arguments…- 用于定义带简单参数的函数。等价于:‘@deffn Function …’ 以单独一行的
@end defun结束。 @defmacname arguments…- 用于定义宏。等价于:‘@deffn Macro …’,用法同
@defun。 @defspecname arguments…- 用于定义特殊形式(special form)。(在 Lisp 中,特殊形式是一类与函数类似的实体;详见《GNU Emacs Lisp 参考手册》中的 “特殊形式”。)等价于:‘@deffn {Special Form} …’,用法同
@defun。
以上所有命令都会在 函数索引 中生成条目
14.6.2. 强类型语言中的函数
@deftypefn 命令及其变体是用于描述函数的通用命令,特别适合必须声明变量与函数类型的语言,例如 C 和 C++。
@deftypefncategory data-type name arguments…@deftypefn是用于定义函数及类似可带参、可带类型实体的通用定义命令。该命令写在行首,同一行后续依次为:实体类别、返回值信息、实体名称、参数(如有)。示例:
@deftypefn {Library Function} int foobar @ (int @var{foo}, float @var{bar}) ... @end deftypefn生成效果:
- Library Function:
intfoobar(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,参数为 s 和 n 。输出效果:- stacks:
privatepush(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会为名称在函数索引中创建条目。- Library Function:
@deftypefundata-type name arguments…@deftypefun是专用于函数的定义命令,等价于:‘@deftypefn Function …’。@deftypefun同样会为名称在函数索引中创建条目。
通常返回类型与函数名、参数打印在同一行,如前面示例所示。在源码中,GNU 对强类型函数的风格是 返回类型单独占一行 。因此 Texinfo 提供对应选项: @deftypefnnewline on
该设置 只影响本节通用强类型命令 ,不影响无类型简单函数(如 @deffn )、强类型变量等。具体影响本节命令,以及面向对象语言的同类命令: @deftypeop 和 @deftypemethod (参见面向对象方法)。
指定 @deftypefnnewline off 可恢复默认行为。
14.6.3. 变量及类似实体
以下是用于定义变量及类似实体的命令:
@defvrcategory 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会为该名称在 变量索引 中创建一条目。@defvarname@defvar是专用于 变量 的定义命令,等价于:‘@defvr Variable …’。示例:
@defvar kill-ring ... @end defvar
@defvar会为该名称在 变量索引 中创建一条目。@defoptname@defopt是专用于 用户选项 的定义命令,即供用户根据喜好自行修改的变量;Emacs 中有大量此类变量(参见《GNU Emacs 手册》中的 Variables 章节)。@defopt等价于:‘@defvr {User Option} …’。
14.6.4. 强类型语言中的变量
强类型语言中的变量,其处理方式与强类型语言中的函数类似。参见《强类型语言中的函数》一节。通用定义命令 @deftypevr 对应 @deftypefn ,专用定义命令 @deftypevar 对应 @deftypefun 。
@deftypevrcategory data-type name@deftypevr是用于定义强类型语言中 类似变量 (即用于存储值的实体)的通用定义命令。你需要选用一个术语来描述所定义实体的类别;例如,如果该实体是变量,可使用 “Variable”(变量)。@deftypevr命令写在行首,同一行后续依次为:所描述实体的类别、数据类型以及该实体的名称。示例:
@deftypevr {Global Flag} int enable ... @end deftypevr生成效果如下:
- Global Flag:
intenable ¶ …
- Global Flag:
@deftypevardata-type name@deftypevar是专用于 强类型语言中变量 的定义命令,等价于:‘@deftypevr Variable …’。
这些命令都会在 变量索引 中为对应名称创建条目。
14.6.5. 数据类型
以下是用于数据类型的命令:
@deftpcategory name attributes…@deftp是用于 数据类型 的通用定义命令。该命令写在行首,同一行后续依次为:类别、类型名称(如 int、float 这类单词),然后是该类型对象的属性名称。因此,你可以用该命令描述int或float,此时可以将 数据类型 作为类别。(数据类型是对一类对象的归类,用于确定可以对其执行哪些操作。)例如,在 Lisp 中, pair 表示一种特定的数据类型,该类型的对象有两个槽位,分别称为
CAR和CDR。下面是定义pair的第一行写法:@deftp {Data type} pair car cdr ... @end deftp@deftp会在 数据类型索引 中为该名称创建条目。
14.6.6. 面向对象编程
本节是用于格式化描述 抽象对象 (如面向对象编程中所用对象)的命令。类(class) 是一种被定义的抽象对象类型。类的实例(instance) 是属于该类类型的具体对象。实例变量(instance variable) 是属于类的变量,但每个实例都拥有自己独立的值。
14.6.6.1. 面向对象的变量
这些命令用于在面向对象编程语言中定义各类变量。
@defcvcategory class name@defcv是用于定义 面向对象编程中与类关联的变量 的通用定义命令。@defcv后面带三个参数:所定义实体的类别、它所属的类、以及名称。例如:
@defcv {Class Option} Window border-pattern ... @end defcv生成效果:
- Class Option of
Window: border-pattern ¶ …
@defcv会在 变量索引 中创建条目。- Class Option of
@deftypecvcategory class data-type name@deftypecv是用于定义 面向对象编程中带类型的类变量 的命令。它与@defcv类似,只是多了一个 数据类型 参数,用于指定实例变量的类型。例如:
@deftypecv {Class Option} Window int border-pattern ... @end deftypecv生成效果:
- Class Option of
Window:intborder-pattern ¶ …
@deftypecv会在 变量索引 中创建条目。- Class Option of
@defivarclass name@defivar是用于定义 面向对象编程中实例变量 的专用命令。@defivar等价于: ‘@defcv {Instance Variable} …’。例如:@defivar Window border-pattern ... @end defivar
生成效果:
- Instance Variable of
Window: border-pattern ¶ …
@defivar会在 变量索引 中创建条目。- Instance Variable of
@deftypeivarclass data-type name@deftypeivar是用于定义 面向对象编程中带类型的实例变量 的命令。它与@defivar类似,只是多了一个 数据类型 参数,用于指定实例变量的类型。例如:@deftypeivar Window int border-pattern ... @end deftypeivar
生成效果:
- Instance Variable of
Window:border-pattern ¶int …
@deftypeivar会在 变量索引 中创建条目。- Instance Variable of
14.6.6.2. 面向对象的方法
这些命令用于定义面向对象编程语言中类似方法的各类函数型实体。这类实体和函数一样可以接收参数,但与特定的对象类相关联。
@defopcategory class name arguments…@defop命令用于定义这类带 简单参数、类似方法 的实体。例如,某些系统中有称为 “包装器(wrapper)” 的构造,它们像方法一样与类关联,但行为更像宏而非函数。你可以用
@defop Wrapper来描述这类构造。有时需要区分操作(operation)与方法(method)。可以把 操作 理解为方法的 规范/接口 。例如,窗口系统可能规定所有窗口类都有一个名为
expose的方法;我们就说该窗口系统为所有窗口定义了一个expose操作。通常,操作会指定名称与参数形式;所有实现该操作的方法都必须接受相同参数,因为使用该操作的应用并不关心具体由哪个方法来实现它。很多时候, 为操作写文档比为方法写文档更有意义 。例如,窗口应用开发者只需要知道
expose这个操作,而不必关心某个具体窗口类是否用自己的方法实现了它。描述该操作可以这样写:@defop Operation windows expose
@defop命令写在行首,同一行后续依次为:操作的类别、所属类名、操作名称,以及参数(如有)。@defop会在 函数索引 中生成形如 ‘expose on windows’ 的条目。@deftypeopcategory class data-type name arguments…@deftypeop是面向对象编程中 操作 的通用定义命令,特别适合 强类型面向对象语言 。它与@defop类似,只是多了一个 data-type数据类型 参数,用于指定方法的返回值信息(如返回类型)。@defmethodclass name arguments…@defmethod是面向对象编程中 方法 的专用定义命令。方法是一种为特定类及其子类实现某个操作的函数。@defmethod 等价于:‘@defop Method …’。命令写在行首,后续依次为:方法所属类名、方法名、参数(如有)。
示例:
@defmethod bar-class bar-method argument ... @end defmethod
定义了
bar-class类中名为bar-method的方法,该方法接收一个参数。@defmethod会在 函数索引 中创建条目。@deftypemethodclass data-type name arguments…@deftypemethod是面向对象语言(尤其是 C++、Java 等强类型语言)中方法的定义命令。它与@defmethod类似,只是多了一个 data-type数据类型 参数,用于指定方法的返回值信息(如返回类型)。
带有返回值信息 的这些命令会受 @deftypefnnewline 选项影响(参见「强类型语言中的函数」一节)。
14.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.
将 行宏 (参见行宏)与这些命令结合使用会很有用。
14.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 命令” 一节),方便日后统一修改。
14.9. 函数定义示例
下面是摘自《GNU Emacs Lisp 参考手册》中 “调用函数” 一节的定义,使用了 @defun 命令。函数名 apply 紧跟在 @defun 命令之后,同一行后面是参数列表。
- Function: apply function &rest arguments ¶
applycalls function with arguments, just likefuncallbut 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.
applyreturns the result of calling function. As withfuncall, function must either be a Lisp function or a primitive function; special forms and macros do not make sense inapply.(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
applyis found in the description ofmapcar.
在 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 条目下。
15. 国际化
Texinfo 对使用英语以外的其他语言编写文档提供了一定支持,不过这部分功能仍需大量完善工作。(如果你参与翻译输出到文档中的固定字符串,可参考「文档字符串的国际化」。)
关于 Texinfo 支持的各类带重音字符及特殊字符列表,参见「插入重音符号」。
15.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查询。
15.2. @documentencoding enc: 设置输入编码
默认情况下,文档的输入与输出编码均采用 UTF-8—— 这是一种通用的 8 位全局字符编码,与 7 位 ASCII 兼容。建议为 Texinfo 手册统一使用 UTF-8 编码。
@documentencoding 命令用于声明 输入文档编码 ,同时也会影响输出编码。如果你的文档编码不是默认值,请在文件开头附近单独一行书写该命令,并跟上合法的编码名称:
@documentencodingenc
UTF-8 始终是编码的最佳选择。Texinfo 仍支持其他编码,主要是为了兼容旧版手册8:
US-ASCII- 基于英文字母的字符编码。
ISO-8859-1ISO-8859-15ISO-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 编码 。
16. 条件可见文本
conditional commands条件命令 允许你为不同的输出格式,或为你自定义的通用条件使用不同的文本。例如,你可以用它们为打印版手册和 Info 输出分别指定不同的文本。
条件命令包含以下类别:
- 特定于某一输出格式的命令(Info、TeX、HTML……)。
- 特定于 排除某一格式之外 所有输出格式的命令(例如,非 Info、非 TeX……)。
- 用于任意输出格式的 ‘Raw’ 格式化器文本,仅对 @-commands 做最少(但非零)解析后直接传递。
- 与格式无关的变量替换,以及判断变量是否被设置或清除。
16.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 中输出的行号问题,可参考「外部宏处理器:行指令」。
16.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 那样的原始格式化源码(参见原始格式化命令)。
16.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 命令属于未定义行为。解决办法很简单: 不要这么做 。
16.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 配套使用,详见下一节。
16.5. 标志: @set 、 @clear 、条件判断与 @value
你可以使用 @set 、 @clear 、 @ifset 和 @ifclear 命令,控制 Texinfo 格式化命令 渲染或忽略 文档中的某部分内容。以下是概要说明:
@setflag [value]- 定义变量 flag ,若指定了可选值 value ,则将其赋值给该变量。
@clearflag- 取消定义变量 flag ,无论该变量之前是否已定义。
@ifsetflag- 如果 flag 已被定义,则从当前到下一个
@end ifset之间的文本会被渲染;如果 flag 未被定义,则该段文本会被忽略。 @inlineifset{flag, text}@ifset的花括号行内版本。@ifclearflag- 如果 flag 已被定义,则从当前到下一个
@end ifclear之间的文本会被忽略;如果 flag 未被定义,则该段文本会被渲染。 @inlineifclear{flag, text}@ifclear的花括号行内版本。
@set 与 @value @ifset 与 @ifclear @inlineifset 与 @inlineifclear @value 示例
16.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}
16.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
16.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 完全一致。
16.5.4. @value 示例
你可以使用 @value 命令,在手册更新时 只修改一处内容,就能全局生效 ,从而减少需要修改的位置。关于在 Automake 发行版中使用此技巧的完整示例,参见 GNU 示例文本。
本示例改编自《GNU Make 手册》。
设置标志:
@set EDITION 0.35 Beta @set VERSION 3.63 Beta @set UPDATED 14 August 1992 @set UPDATE-MONTH August 1992
为 @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为打印版手册的标题页编写文本:
@titlepage @title GNU Make @subtitle A Program for Directing Recompilation @subtitle Edition @value{EDITION}, ... @subtitle @value{UPDATE-MONTH} @page @insertcopying ... @end titlepage(在印刷封面上,只显示年月的日期,比显示年月日更简洁。)
为 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.
更新手册时,你 只需修改这些标志的值 ,无需编辑上述三个章节。
16.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 编码标准中的 发行版 相关内容)。
16.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’ 未被设置,整个代码块都会被跳过。
为了让处理器能够可靠地判断哪些命令属于嵌套关系, 所有条件命令必须单独占一行 ,前后不能有任何文本(包括空格)。
17. 定义新的 Texinfo 命令
Texinfo 提供了多种定义新命令的方式(在所有情况下, 不建议 尝试重定义已存在的命令):
Texinfo macro宏 允许你将一段任意文本或已有命令(包括其他宏)定义为一个新的 Texinfo 命令。宏可以带有任意数量的参数 —— 每次使用宏时都需要传入这些文本内容。
顺便说明:这类宏与
@defmac命令无关,后者用于在手册主题范围内对宏进行文档说明(参见:定义模板)。- ‘@linemacro’ 用于定义一类宏,其参数会一直延伸到行末,并以空格分隔。
- ‘@alias’ 为已有命令定义一个新名称。
- ‘@definfoenclose’ 允许你为某些非打印输出格式定义带有自定义输出效果的新命令。 该命令已不推荐使用 。
最通用的方式(不仅限于定义新命令):可以调用任意外部宏处理器,并让 Texinfo 识别所谓的 #line 指令,以便进行错误提示指令,以便进行错误提示。
如果只需做 简单文本替换 ,使用 @set 和 @value 是最简单的方案(参见:标记: @set 、 @clear 、条件指令与 @value )。
17.1. 定义宏
你可以使用 Texinfo 的 @macro 命令来定义宏,格式如下:
@macro macroname{param1, param2, ...}
text ... \param1\ ...
@end macro
参数 param1 、 param2 …… 对应后续在文档中使用该宏时传入的实参(下一节会介绍)。
原则上, 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
17.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 自动转义 规则 :
如果宏只接收一个参数,调用时其中的所有逗号默认都会被转义。例如:
@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.
但要注意:单参数宏不会检查传入的参数数量,调用时请谨慎。
如果宏调用中嵌套了其他命令(包括宏自身递归调用),嵌套命令里的逗号默认会被转义。例如在:
@say{@strong{Yes, I do}, person one}中,‘Yes’ 后面的逗号会被隐式转义。再看一个递归宏的例子:
@rmacro cat{a,b} \a\\b\ @end rmacro @cat{@cat{foo, bar}, baz}会生成字符串 ‘foobarbaz’。
- 除此之外,逗号都应像上面那样 显式转义 ,才能被当作参数的一部分。
在宏参数中,反斜杠本身可以用另一个反斜杠转义。例如:
@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.
17.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
17.4. @alias new=existing: 命令别名
‘@alias’ 命令用于将一个新命令定义为与已有命令完全相同。这在定义额外的标记名称时非常有用 —— 即便最终输出结果一致,也能在源文件中保留更多语义信息。
请单独一行书写 ‘@alias’ 命令,格式为:新命令名、等号、已有命令名。等号两侧的空格可选,若存在会被忽略。格式如下:
@alias new = existing
举例:如果文档中同时需要引用书籍和其他媒介(如电影),你可以定义一个 @moviecite{} 宏,使其行为与普通的 @cite{} 一致,但同时携带额外的语义信息。写法如下:
@alias moviecite = cite
由于参数解析的细节差异,宏与别名并不总是效果相同;而且别名的定义远比宏简单,因此该命令并非多余。
遗憾的是, 不能为 Texinfo 环境定义别名 ;例如 @alias lang=example 是非法写法。
别名 不允许递归 ,无论是直接递归还是间接递归。
不建议将任何 TeX 原语、普通 TeX 或 Texinfo 命令名重新定义为别名。这类命令数量极多,一旦误用,TeX 可能产生不可预测的错误。
别名的命名规则与宏名一致:可使用字母、数字,以及(非首字符的)连字符 ‘-’。但在 TeX 环境下建议只使用字母,因此我们 推荐仅用字母命名 。
17.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 intF(int one, int two, int three, int four, int five) Explanation
行宏在展开时会生成 整数行 的输出。与用 @macro 定义的宏相比,用 @linemacro 定义的宏在不同 Texinfo 处理器( texi2any 和使用 texinfo.tex 的 TeX)之间可能拥有更好的兼容性。
17.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 定义不允许递归,无论是直接递归还是间接递归。
17.7. 外部宏处理器:行指令
Texinfo 内置的宏(以及其他文本替换机制)在常规场景下可以正常工作。但如果你的文档需要 极其复杂 的处理逻辑,它们的脆弱性和局限性就会成为问题。这种情况下,你可以考虑完全改用其他独立的宏处理器,例如 M4(参见 M4)或 CPP(参见 C 预处理器)。
唯一的例外是:Texinfo 无需关心其输入是 “original原始” 源码,还是由其他文件预处理而来。因此,你可以在构建系统中自由调用任意程序,来完成宏展开或其他预处理工作。Texinfo 没有内置对某一种预处理器的专门支持,因为没有任何单一程序能满足所有文档的需求。
唯一的特殊之处在于 错误信息中的行号 。此时,行号应当指向 原始源文件 中的对应位置,无论这个源文件是什么。对此有一套通用机制:即所谓的 ‘#line’ 指令,Texinfo 对其提供支持。
17.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 块内是 禁用 的。
17.7.2. ‘#line’ 与 TeX
如前所述, texi2any 能够识别上一节介绍的 ‘#line’ 指令。但是, texinfo.tex 不能也无法识别这类指令。因此,如果 TeX 直接处理这类行,会将其错误地按原样排版输出。解决办法是:在运行 TeX 之前,先用 texi2any 的宏展开选项进行预处理。共有三种方式:
- 若使用
texi2dvi或其衍生工具(参见 使用texi2dvi排版),可传入参数-E,texi2dvi会先调用texi2any展开宏并剔除 ‘#line’ 指令。 - 若直接运行
texi2any,可指定参数:--no-ifinfo --iftex -E somefile.out,再将生成的somefile.out单独交给texi2dvi处理。 - 也可以直接运行:
texi2any --dvi --Xopt -E。(或将--dvi替换为--pdf)texi2any会自动调用texi2dvi -E。
最后一个与 TeX 配合使用的注意事项:由于 ‘#line’ 指令不被识别, @errormsg{} 命令(参见 条件命令)或 TeX 自身输出的行号,是 TeX 读取的处理后文件中的(错误)行号,而非预处理器指定的原始行号。
17.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’ 指令)。
18. 包含文件
当 Texinfo 处理器在 Texinfo 文件中遇到 @include 命令时,会处理该命令所指定文件的内容,并将其并入正在生成的输出文件中。因此,使用包含文件可以将单个大型文档拆分为多个便于管理的小型文件。
18.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 命令,用于在多文件包含的情况下更新节点指针与主菜单。详见「更新外层文件与包含文件」。
18.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 文件。
18.3. @verbatiminclude file: 原样包含文件
你可以使用 @verbatiminclude 命令,将文件的 原始内容 精确地包含到文档中:
@verbatiminclude filename
文件 filename 的内容会在 原样环境 中输出(参见 @verbatim: 原文文本)。通常情况下,文件会 原样输出 ,所有特殊字符与空白格式都会保留,不会额外添加缩进;如果你需要缩进,可以把 @verbatiminclude 放在 @example 环境中(参见 @example: 示例文本)。
@verbatiminclude 所在行会展开 @value{var} 引用。这使得你可以包含发行版中其他目录下的文件,例如:
@verbatiminclude @value{top_srcdir}/NEWS
(前提是你必须先定义好 top_srcdir 。)
除此之外,该行仅允许使用 @@ 、 @{ 、 @} 以及相关的 @-命令(如 @atchar{} )。
关于如何用更小的字号输出文件内容,参见 @verbatim 一节的末尾部分。
19. 使用 TeX 排版与印刷
运行 texi2dvi 或 texi2pdf 命令是生成可打印输出的最简单方式。这些命令会作为 Texinfo 软件包的一部分被安装。
更详细地说,对 Texinfo 文件进行排版与打印是一个多步骤过程:你需要使用 TeX 程序生成用于打印的文件(称为 DVI 或 PDF 文件),然后打印该文件。可选地,你还可以在首次运行 TeX 之后,使用 texindex 命令生成索引;然后 必须再次运行 TeX 。 texi2dvi 会自动处理所有这些步骤,按需运行 TeX 和 texindex (参见 使用 texi2dvi 进行格式化)。
使用 Shell 命令时,你既可以直接在操作系统 Shell 中操作,也可以在 GNU Emacs 内部的 Shell(或其他计算环境)中工作。你可以像执行其他任何 Shell 命令一样,在 Emacs 内的 Shell 中执行格式化与打印命令。要在 Emacs 中创建 Shell,输入 M-x shell (参见《GNU Emacs 手册》中的 Shell 章节)。如果你使用 GNU Emacs,也可以使用 Texinfo 模式提供的命令,而不是 Shell 命令。参见 使用 Emacs 进行格式化与打印。
关于指定打印输出的细节(如纸张尺寸),请参见 全局文档命令。
19.1. 使用TeX
名为 TeX 的排版程序可用于对 Texinfo 文档进行格式化,以生成可打印的输出文件。TeX 是一款功能极强的排版程序,使用得当的话,能实现极佳的排版效果。该程序并不包含在 Texinfo 软件包中,其本身就是一套庞大的软件体系。
TeX 是自由软件基金会(FSF)用于文档制作的排版工具,也是为 Texinfo 手册生成打印格式文件(如 PDF 和 PostScript 格式)最简便的方式。TeX 可自由再分发,你可以通过互联网下载,也可通过实体介质获取,详情参见网址:http://tug.org/texlive。
19.2. 使用 texi2dvi 或 texi2pdf 格式化
texi2dvi 程序会自动完成从 Texinfo 文档生成 TeX DVI 文件的全部步骤。同理, texi2pdf 用于生成 PDF 文件9。
要对输入文件 foo.texi 运行 texi2dvi 或 texi2pdf ,操作如下(其中 ‘prompt$ ’ 为Shell 提示符):
prompt$ texi2dvi foo.texi prompt$ texi2pdf foo.texi
如示例所示,传给 texi2dvi 和 texi2pdf 的文件名必须包含扩展名,例如 ‘.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 ,则使用该值;否则依次尝试 dvipdfmx 、 dvipdfm 、 dvipdf 、 dvi2pdf 、 dvitopdf 中第一个存在的程序。这种方式对 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’ 类似,但编译后删除辅助目录。因此每次都需要完整编译流程。
如果系统中有 etex , texi2dvi 会优先使用,因为它在某些场景下更快,且在调试 texinfo.tex 时能提供更多跟踪信息。但这个扩展版本的 TeX 不是必需的,且生成的 DVI 与普通 TeX 完全一致。
texi2dvi 会通过 -recorder 选项或扫描 TeX 日志中的 ‘\openout’ 来检测辅助文件。可通过环境变量 TEXI2DVI_USE_RECORDER 控制该行为,合法值为:
- ‘yes’
- 直接使用
-recorder,不做检查。 - ‘no’
- 扫描日志中的 ‘\openout’,不做检查。
- ’yesmaybe‘
- 先检查是否支持
-recorder,支持则使用;否则检查是否支持日志中的 ‘\openout’,支持则使用,都不支持则报错。 - ‘nomaybe’
- 与 ‘yesmaybe’ 类似,但优先检查日志里的 ‘\openout’。
默认值为 ‘nomaybe’。该环境变量主要用于排错,未来可能修改或移除。
19.3. 使用 tex/texindex 格式化
你可以通过 Shell 命令 tex 后接 Texinfo 文件名,对 Texinfo 文件进行基础格式化。例如:
tex foo.texi
TeX 会生成一个 DVI 文件,以及若干用于索引、交叉引用等信息的辅助文件。DVI 文件(DeVice Independent 的缩写,即设备无关文件)几乎可以在任何设备上打印,通常还需要再做一次格式转换(见上一节)。
tex 格式化命令本身 不会对索引进行排序 ,只会输出未排序的索引数据文件。要在执行 tex 后生成可打印的索引,首先需要一份已排序的索引。 texindex 命令用于对索引排序。(上一节介绍的 texi2dvi 会根据需要自动运行 tex 和 texindex 。)
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’。
19.3.1. 部分文档的格式化
有时你可能希望在文档尚未完成时就进行打印,或者只打印文档中的某一章。在这种情况下,TeX 通常生成的辅助文件,以及它对未定义交叉引用给出的警告都会变得很麻烦。你可以使用 @novalidate 命令来避免这些问题,该命令必须在任何分节命令或交叉引用命令之前使用。
因此,文件的开头大致如下所示:
\input texinfo @novalidate ...
@novalidate 同样会关闭 texi2any 中的校验功能,效果与其命令行选项 --no-validate 完全一致(参见《从 Shell 调用 texi2any 》)。
此外,你不必每次运行 tex 之后都执行 texindex 。 tex 格式化命令会直接使用上一次运行 texindex 时生成的已排序索引文件。在文档编写或调试阶段,即使这些索引文件已经过期,通常也不会有影响。
19.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 中展示了该系统的使用示例。
19.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 目录中查找,最后在系统目录中查找。(开头、结尾或连续的 ‘:’ 表示在对应位置搜索系统目录。)
19.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 文件开头、 @maketitle 或 @titlepage 命令之前,单独一行写入以下指令:
@finalout
19.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
20. texi2any: Texinfo 转换工具
texi2any 是面向 Texinfo 的通用翻译工具,可生成多种输出格式,且高度可定制。它支持以下格式:
- Info(默认格式,或使用
--info) - HTML(使用
--html) - EPUB 3(使用
--epub3) - 纯文本(使用
--plaintext) - LaTeX(使用
--latex) - DocBook(使用
--docbook) - Texinfo XML(使用
--xml)
makeinfo 是 texi2any 的别名。默认情况下, texi2any 与 makeinfo 均生成 Info 格式输出;二者除名称不同外,行为完全一致。
除这些默认格式外, texi2any 的命令行选项可修改输出的诸多细节。此外,初始化文件能对最终输出进行更精细的控制 —— 几乎可以调整 Texinfo 输入文件中未指定的所有内容。初始化文件与主程序一样使用 Perl 编写,所有可在命令行指定的配置,均可在初始化文件中设置。
20.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指定的语言,若无则为英语。(见@documentlanguagell [ _cc ]: 设置文档语言) --dvi- 通过
texi2dvi生成 TeX DVI 文件,而非 Info(见texi2any的印刷输出)。 --dvipdf- 通过
texi2dvi --dvipdf生成 PDF 文件,而非 Info(见texi2anyPrinted 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 。等号 ‘=’ 是可选的,但 var 和 value 都需要根据 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 输出。
20.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 或兼容性问题。
20.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 时本身不会生成普通输出,只会输出诊断信息。
20.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未定义” 值。
下面各节会分别给出详细说明。
20.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。
20.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 。
20.4.3. 输出格式选择
自定义变量 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 "$@"
20.4.4. 全局自定义变量
本表列出会影响 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指定的编码(见@documentencodingenc: 设置输入编码)。INPUT_FILE_NAME_ENCODING变量会覆盖此变量。DOC_ENCODING_FOR_OUTPUT_FILE_NAME若设置,使用输入 Texinfo 文档的编码信息处理输出文件名,例如
--output指定的文件。若未设置,则使用区域编码。默认未设置,即文件名使用当前区域编码。注意:此设置仅作用于文件名;文件内容编码由
OUTPUT_ENCODING_NAME决定。OUTPUT_FILE_NAME_ENCODING变量会覆盖此变量。DOCUMENTLANGUAGE_COLLATION- 若设置,尝试使用
@documentlanguage指令指定的语言对索引排序做语言专属定制。另见上文说明的COLLATION_LANGUAGE变量。(见@documentlanguagell[/_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),则使用该信息设置输出编码名称;否则输出编码基于默认编码。参见@documentencodingenc: 设置输入编码。 OUTPUT_FILE_NAME_ENCODING- 用于输出文件名的编码。此变量会覆盖来自文档或当前区域的任何编码。通常不需要设置此变量,但如果需要在文件系统中以特定字符编码创建文件名,则可以使用。另请参见
INPUT_FILE_NAME_ENCODING。 PACKAGEPACKAGE_VERSIONPACKAGE_AND_VERSIONPACKAGE_URLPACKAGE_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.4.5. Info 与纯文本的自定义变量
本表列出仅适用于 Info 和纯文本格式的自定义变量。
ASCII_DASHES_AND_QUOTES- 对于 Info 输出,若设置此变量,当 Texinfo 源码中使用
-、--、---、`、``、'、''时,使用纯 ASCII 字符表示引号、连字符和破折号,而非 UTF-8 方向性引号、短破折号等同类符号。默认开启。 ASCII_GLYPH- 对于 Info 输出,对版权符号(
@copyright{}转为 ‘(C)’)、项目符号(@bullet{}转为 ‘*’)等符号命令使用 ASCII 输出,而非其他 Unicode 序列。默认关闭。 ASCII_PUNCTUATION- 在输出中避免任何不必要的非 ASCII、UTF‑8 序列。该选项隐含
ASCII_DASHES_AND_QUOTES和ASCII_GLYPH,同时还会影响@samp等输出引号的命令。 AUTO_MENU_DESCRIPTION_ALIGN_COLUMN- 对于 Info 输出,由
@nodedescription或@nodedescriptionblock提供的菜单项描述起始列号。默认未定义,此时使用填充列宽度的 45%(参见从 Shell 调用texi2any)。 AUTO_MENU_MAX_WIDTH- 在 Info 中,当从
@nodedescription或@nodedescriptionblock添加描述时,菜单项行的最大列数。默认未定义,此时使用填充列宽度再加 10%(参见从 Shell 调用texi2any)。 CLOSE_DOUBLE_QUOTE_SYMBOL- 在 Info 中为 ‘@dfn’ 输出需要闭合双引号时,使用该字符。Info 默认值与
OPEN_DOUBLE_QUOTE_SYMBOL相同,只是 Unicode 编码为闭合双引号(见下文)。 INDEX_SPECIAL_CHARS_WARNING- 若设置,对索引条目中的 ‘:’ 发出警告,因为并非所有 Info 阅读器都能处理这类字符。仅用于 Info 和纯文本。默认为假,因为此处解析问题不会妨碍导航,阅读器仍可较容易地定位到对应节点。
INFO_SPECIAL_CHARS_QUOTE- 若设置,当节点名、菜单项等处存在对 Info 输出有问题的字符时,用引号字符将其所在部分包裹,具体规则见《Info 格式规范》。Info 格式默认开启,纯文本默认关闭。参见
@node行要求。 INFO_SPECIAL_CHARS_WARNING- 若设置,对节点名、菜单项、交叉引用中不利于 Info 输出的结构(如字符串 ‘::’)发出警告。若未定义,则除非设置了
INFO_SPECIAL_CHARS_QUOTE,否则默认开启。Info 格式默认开启,纯文本默认未定义。索引条目中的类似警告由INDEX_SPECIAL_CHARS_WARNING负责。 OPEN_DOUBLE_QUOTE_SYMBOL- 在 Info 中为 ‘@dfn’ 输出需要左双引号时,使用指定字符。若设置了
--disable-encoding或文档编码不是 UTF‑8,则使用 ‘"’。否则 Info 输出使用 Unicode 左双引号。
20.4.6. LaTeX 自定义变量
警告: LaTeX 输出自定义功能仍处于 实验性阶段 。相关设计尚未最终确定,一切都可能变动,我们欢迎任何反馈。
下表列出仅适用于 LaTeX 输出的自定义变量。
CLASS_BEGIN_USEPACKAGE如果设置,对应的文本将会替换掉 LaTeX 的
\documentclass、总会输出且紧跟在\documentclass之后的宏包导入语句,以及依赖文档编码设置、用于指定输入编码和字体编码的宏包导入语句(inputenc和fontenc)。被替换的内容大致如下:
\documentclass{book} \usepackage{amsfonts} \usepackage{amsmath} \usepackage[gen]{eurosym} \usepackage{textcomp} \usepackage{graphicx} \usepackage{etoolbox} \usepackage{titleps} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc}END_USEPACKAGE如果设置,对应的文本将会替换掉依赖于所使用的 Texinfo 命令的宏包导入语句,以及总会输出、且在所有其他宏包之后导入的最后一批宏包语句。最后这批宏包对应 ‘\usepackage[hidelinks]{hyperref}’。
下面是一个示例,适用于包含索引、
@need、@multitable、定义类命令、@cartouche、列表和@float的文档:\usepackage{imakeidx} \usepackage{needspace} \usepackage{array} \usepackage{embrac} \usepackage{expl3} \usepackage{tabularx} \usepackage[framemethod=tikz]{mdframed} \usepackage{enumitem} \usepackage{float} \usepackage[hidelinks]{hyperref}LATEX_FLOATS_FILE_EXTENSION- 为 LaTeX 输出设置新的浮动体定义文件扩展名。默认为 ‘tfl’。
20.4.7. 其他格式自定义变量
本表列出 仅适用于特定格式 、且没有单独自定义变量描述章节的相关自定义设置。
TXI_MARKUP_NO_SECTION_EXTENT- 用于 XML 输出。不在上层章节命令的标记内包含下层章节命令。默认为假。
TEXI2DVI- 用于生成 PostScript、PDF 和 DVI 文件的命令名称;默认为 ‘texi2dvi’ 。参见
texi2any打印输出。 TEXTCONTENT_COMMENT- 用于纯文本内容输出(即当
TEXINFO_OUTPUT_FORMAT设为textcontent时)。若设置,则同时输出注释。默认为假。 TEXINFO_DTD_VERSION- 用于 XML 输出。XML 输出序言中使用的 DTD 版本。默认值根据
configure.ac中的变量设定。
20.4.8. 多格式通用自定义变量
本表列出适用于 多种输出格式 的自定义变量。
CLOSE_QUOTE_SYMBOL当需要闭合引号时(例如
@samp输出)使用该字符;DocBook 中默认为’。HTML 中默认未定义:若未设置USE_NUMERIC_ENTITY,则设为’;若已设置,则设为’;若设置了OUTPUT_CHARACTERS且输出编码包含该字符,则使用引号字符。Info 格式的默认值与
OPEN_QUOTE_SYMBOL相同,仅 Unicode 编码为闭合引号(见下文)。DOCTYPE- 适用于 DocBook、HTML、XML 格式。指定实体的系统标识符 SystemLiteral,是一个可用于获取实体的 URI,并标识文档的标准 DTD。HTML、DocBook 和 XML 的默认值各不相同。
EXTENSION- 输出文件名附加的扩展名。每种输出格式的默认扩展名不同。
NO_TOP_NODE_OUTPUT若设置,则不输出 Top 节点内容。Top 节点仍会被解析,但内容会被丢弃。HTML:默认不设置;EPUB:默认设置;若
SHOW_TITLE为 ‘undef’,设置NO_TOP_NODE_OUTPUT也会为 HTML 设置SHOW_TITLE。设置
NO_TOP_NODE_OUTPUT(移除 Top 节点并添加标题页)更接近书籍排版。将其设为 false 且SHOW_TITLE保持 ‘undef’、false,则更适合浏览型文档,可直接访问 Top 节点信息。对于 DocBook,
NO_TOP_NODE_OUTPUT默认为 true。设为 false 会输出 Top 节点内容。不建议在 DocBook 中输出 Top 节点,因为标题与版权信息总会输出。为兼容 2022 年之前的行为保留该选项,未来可能移除。OPEN_QUOTE_SYMBOL当需要开启引号时(例如
@samp输出)使用该字符;DocBook 中默认为‘。HTML 中默认未定义:若未设置USE_NUMERIC_ENTITY,则设为‘;若已设置,则设为‘;若设置了OUTPUT_CHARACTERS且输出编码包含该字符,则使用引号字符。对于 Info 格式,默认值取决于启用的文档编码:若设置
--disable-encoding或文档编码不是 UTF‑8,则使用 ‘'’,该字符在现代系统上通常显示为无方向单引号;否则 Info 输出使用 Unicode 左引号。OUTPUT_CHARACTERS- 默认不设置:在 HTML、XML、DocBook 中使用 XML 实体输出重音与特殊字符,在 LaTeX 中使用宏输出。若设置:根据文档编码,在 HTML、XML、DocBook、LaTeX 中直接输出重音字符,并在 HTML、LaTeX 中直接输出特殊字符。参见
@documentencodingenc: 设置输入编码 与「插入重音符号」。 TOP_NODE_UP- Top 节点的上级节点;默认为 ‘(dir)’。该节点名应为已按输出格式排版好的字符串。在 HTML 中可能用于属性,因此不应包含任何元素。仅当设置
TOP_NODE_UP_URL以覆盖 URL 时,才用于 HTML 输出。参见 HTML 自定义变量列表 中的TOP_NODE_UP_URL与 HTML 文件名与链接自定义。 USE_NODES输出文档的基本单元是 output unit输出单元 。通常一个节点与紧随其后的章节命令关联,一个章节命令与前面的节点关联,二者共同构成一个输出单元。
适用于纯文本与 HTML:若设置 ~USE_NODES~,优先以节点划分输出单元;若设为 false,优先以章节结构划分输出单元;默认为 true。
USE_NUMERIC_ENTITY- 适用于 HTML、XML、DocBook。若设置,使用数字实体而非命名实体。DocBook 输出中默认为 true。
20.5. 文档字符串的国际化
texi2any 会在输出文档的多处位置写入固定字符串:交叉引用、页脚、帮助页面、图片替代文本等。所选用的字符串取决于 字符串输出 时的 documentlanguage (文档语言)值(关于 Texinfo 命令接口,参见 @documentlanguage ll[ _cc ]:设置文档语言)。
这些字符串使用 Gettext 框架,并采用 texinfo_document 域(参见 Gettext)。翻译后的字符串以 Texinfo 格式写入,可包含 @-命令。在翻译字符串中,可变部分用 {arg_name} 表示,而非 %s 这类占位符。(该惯例在 Perl 的 gettext 中很常见,且在 GNU Gettext 中完全支持;参见 GNU Gettext 中的 Perl 格式字符串。)例如,在下例中,‘{section}’ 会被替换为章节名:
see {section}
翻译字符串的展开过程如下:
首先对字符串进行翻译。区域设置为 documentlanguage.documentencoding 。
如果 documentlanguage 形式为
ll_CC,则先尝试该形式,再尝试仅使用 ‘ll’。大多数情况下,字符串会按 Texinfo 展开并转换。参数会被替换;例如,
{arg_name}会被替换为对应的实际参数。字符串与参数也可能已经是转换后的形式。这种情况下,仅简单替换参数,同样是将
{arg_name}替换为对应实际参数。
在下例中, {date} 、 {program_homepage} 和 {program} 是字符串的参数。因为它们用在 @uref 中,顺序无法预先确定。 {date} 、 {program_homepage} 和 {program} 会在展开后被替换:
Generated on @emph{{date}} using
@uref{{program_homepage}, @emph{{program}}}.
不可否认,这种方式略显复杂。其价值在于:可以 独立于输出格式 ,指定翻译字符串的排版格式。
例如, @pxref 的翻译字符串可以写成:
see {node_file_href} section `{section}' in @cite{{book}}
这使得可以独立于输出格式指定字符串,同时通过丰富的排版,在多种语言中都能得到合适的翻译。
如果 texi2any 中使用 Perl 进行字符串翻译,会采用 libintl-perl 包作为 gettext 实现;更具体地说,使用的是纯 Perl 实现,这样 Texinfo 才能在所有平台与安装环境下保持一致行为,否则无法做到。 libintl-perl 已包含在 Texinfo 发行版中并会始终安装,以确保需要时可用。也可以使用系统自带的 libintl-perl (可在构建时选择)。
20.6. 调用 pod2texi: 将 Pod 转换为 Texinfo
pod2texi 程序可将 Perl Pod 文档文件转换为 Texinfo 格式。该程序有两种基本运行模式:为每个输入的 Pod 文件生成一份独立手册;若指定 --base-level=1 或更高层级,则生成适用于 @include 指令的 Texinfo 子文件。
pod2texi 程序可脱离 Texinfo 其他组件独立使用;因此, pod2texi 的调用说明以 Perl 独立程序的惯例,采用手册页(man page)格式编写在 Pod 语言文档中,其网页版可参考:https://www.gnu.org/software/texinfo/manual/pod2texi.html,下文也附带了该说明。手册中收录的这份说明本身也是 pod2texi 的使用示例 —— 它正是通过 pod2texi 从 Pod 格式转换而来。
20.6.1. pod2texi 工具
pod2texi 名称
pod2texi - 将 Pod 格式转换为 Texinfo 格式
用法概要
pod2texi [OPTION]... POD...
描述
将 Pod 文件转换为 Texinfo 格式。有两种基本运行模式:默认情况下,每个 Pod 文件转换为独立的 Texinfo 手册。
如果 --base-level 设置为大于 0 的值,则每个 Pod 转换为适合 @include 包含的文件,并额外生成一个包含主菜单和所有 @include 指令的总文件。
选项
--appendix-sections- 使用附录章节命令(
@appendix等),而非默认的带编号章节命令(@chapter、@section等)。 --base-level=数字|名称设置
head1命令对应的层级。可以是整数或不带@的 Texinfo 章节命令:1 对应@chapter/@unnumbered层级;2 对应@section层级;以此类推。默认值为 0,表示head1仍输出为章,但整体输出为独立手册。若层级不为 0,则 Pod 文件将作为适合
@include的 Texinfo 片段输出。此时每个 Pod 文件会额外增加一层覆盖整个文件的章节命令,层级比--base-level高一级。因此,若要让每个 Pod 文件成为大型手册中的一章,应将base-level设为section。可参考 Texinfo 源码发行版中
contrib/perldoc-all的示例,它从 Perl 官方文档生成 Texinfo。--debug=数字- 将调试级别设为指定数字。
--generate-setfilename- 为独立手册生成
@setfilename行。可使用--no-generate-setfilename关闭。若--base-level不为 0,则此选项无效。 --headings-as-sections- 使用标题命令(
@heading等),而非默认的带编号章节命令(@chapter、@section等)。若--base-level不为 0,覆盖整个 Pod 文件的顶层章节命令仍为带编号命令。 --help- 显示帮助信息并退出。
--menus- 输出节点菜单。若存在主手册,其 Top 节点菜单总会输出(因为会生成主菜单)。默认不输出其他节点的菜单。
--outdir=名称- 若主手册包含多个子文件(对应每个输入 Pod),生成的 Texinfo 文件将放入此目录。默认值由
--subdir决定。 --output=名称- 指定第一个手册或主手册的输出文件名。默认输出到标准输出。
--no-section-nodes- 为章节使用锚点(anchor)而非节点(node)。
--no-fill-section-gaps- 不使用空的
@unnumbered文件填补章节层级断层。通常建议保持章节层级完整。 --preamble=字符串- 将字符串作为前置样板代码插入到菜单和
@include之前。若字符串为-,则从标准输入读取前置样板。默认样板为 Texinfo 文档的最小开头。 --setfilename=字符串- 当
--base-level不为 0 时,在主手册的菜单与@include之前的样板中使用该字符串作为@setfilename。若--base-level为 0,则此选项无效。主手册默认不输出@setfilename。 --subdir=名称- 若主手册包含子文件,这些子文件将从此目录被
@include包含。若同时设置了--outdir,此名称通常应设为主手册与--outdir之间的相对路径。 --unnumbered-sections- 使用无编号章节命令(
@unnumbered等),而非默认的带编号章节命令。 --top=TOP- 为主手册的
@top元素指定名称,可以包含 Texinfo 代码。 --version- 显示版本信息并退出。
参见
Pod::Simple::Texinfo、perlpod、Texinfo 手册、Texinfo 官网:https://www.gnu.org/software/texinfo/
版权与许可
版权所有 2012–2024 Free Software Foundation, Inc.
本程序是自由软件:您可以依据 GNU 通用公共许可证的条款重新分发和 / 或修改它,该许可证由自由软件基金会发布,无论是第 3 版,或(您可选)任何更高版本。
在法律允许的范围内,本程序不提供任何担保。
作者
Patrice Dumas bug-texinfo@gnu.org
20.7. texi2html: texi2any 的前身
从设计理念上讲, texi2html 是如今 texi2any 程序的前身。 texi2html 最初由 Lionel Cons 于 1998 年独立开发;当时 makeinfo 还无法生成 HTML 格式。多年来,许多开发者为 texi2html 贡献了代码。
如今的 texi2any 实际复用的 texi2html 代码很少,底层实现思路也完全不同(即先将 Texinfo 文档解析为语法树),但二者在设计上仍有一脉相承之处。
按照设计, texi2any 以某种方式几乎支持 texi2html 的全部功能。但我们并未追求严格兼容,因此 Texinfo 软件包不会安装可直接执行的 texi2html 。可以通过类似下面的命令进行近似模拟:
texi2any --set-customization-variable TEXI2HTML=1 ...
但需要强调的是,这 并非 原有 texi2html 的直接替代品。主要差异如下:
- 最明显的是:
texi2html的命令行选项现在大多已变为自定义变量。 texi2any中的程序级自定义 API 与之前完全不同。- 索引无法拆分。
我们 不打算 重新实现这些差异功能。因此,文档作者应根据需要调整手册与构建流程,以使用 texi2any 的新特性与新方法。 texi2html 的维护者(其中一位正是 texi2any 的主要作者)也 不打算 再发布新版本。
下表列出 texi2html 选项与对应的 texi2any 自定义变量:
| texi2html选项 | texi2any自定义变量/说明 |
|---|---|
--toc-links |
TOC_LINKS |
--short-ext |
EXTENSION 设为‘htm’ |
--prefix |
PREFIX |
--def-table |
DEF_TABLE |
--html-xref-prefix |
EXTERNAL_DIR |
--l2h |
HTML_MATH 设为‘l2h’ |
--l2h-l2h |
L2H_L2H |
--l2h-skip |
L2H_SKIP |
--l2h-tmp |
L2H_TMP |
--l2h-file |
L2H_FILE |
--l2h-clean |
L2H_CLEAN |
--use-nodes |
USE_NODES |
--monolithic |
MONOLITHIC |
--top-file |
TOP_FILE |
--frames |
无等效项 |
--menu |
FORMAT_MENU |
--debug |
DEBUG |
--doctype |
DOCTYPE |
--frameset-doctype |
无等效项 |
--test |
TEST |
最后,如需更详细信息, texi2html 用户可查阅 Texinfo 源码仓库中归档文件 doc/texi2oldapi.texi 的前半部分
21. 创建与安装 Info 文件
本章介绍 Info 输出相关信息,并说明如何安装 Info 文件。使用 texi2any 创建 Info 文件,参见 texi2any: Texinfo 转换器;使用 Emacs 创建 Info 文件,参见 Info 格式排版。关于文件格式的通用说明,参见 Info 文件。关于 Info 格式的详细技术规范,参见 Info 格式规范。
21.1. 安装 Info 文件
Info 文件通常存放在 info 目录中。你可以使用独立的 Info 程序或 Emacs 内置的 Info 阅读器阅读 Info 文件。(有关 Info 的介绍,参见 Info。)
21.1.1. 目录文件 dir
为了让 Info 正常工作, info 目录中必须包含一个作为 Info 系统 顶层目录 的文件。按照惯例,这个文件名为 dir 。(你可以在 Emacs 中通过按下 C-h i 进入 Info,再按 C-x C-f 查看 info 目录的位置。)
dir 文件本身就是一个 Info 文件,它包含系统中所有 Info 文件的 顶层菜单 ,菜单形式如下:
* Menu:
* Info: (info). Documentation browsing system.
* Emacs: (emacs). The extensible, self-documenting
text editor.
* Texinfo: (texinfo). With one source file, make
either a printed manual using
@TeX{} or an Info file.
...
每一条菜单项都指向 圆括号内 对应 Info 文件的 Top(顶层)节点。(菜单项无需显式指定 Top 节点:如果没有写明节点名,Info 会自动跳转到 Top 节点。参见《其他 Info 文件中的节点》。)
因此, ‘Info’ 项指向 info 文件的顶层节点,‘Emacs’ 项指向 emacs 文件的顶层节点。
在每个 Info 文件中,‘Top’ 节点的 ‘Up’ 指针都会回指到 dir 文件。例如,Emacs 手册的 ‘Top’ 节点在 Info 中是这样写的:
File: emacs Node: Top, Up: (DIR), Next: Distrib
这里 dir 文件名写成了大写 DIR—— 它可以写成大写或小写。这是 dir 的 特殊约定 ,并非通用规则。
你可以在 Texinfo 发行包的 util/dir-example 文件中,查看一个完整的 dir 文件示例。
21.1.2. 列出新增 Info文件
要向系统中添加一个新的 Info 文件,你必须在 info 目录下的 dir 文件菜单中,写入一条新的菜单项。例如,如果你要添加 GDB 的文档,需要写入如下新条目:
* GDB: (gdb). C 语言源码级调试器。
菜单项的第一部分是条目名称,后跟冒号。第二部分是 Info 文件名,放在圆括号中,后跟一个点。第三部分是描述信息。
Info 文件的文件名通常带有 .info 后缀。因此,GDB 的 Info 文件既可以命名为 gdb ,也可以是 gdb.info 。Info 阅读器程序会自动尝试带与不带 .info 后缀的文件名10;因此为了简洁,建议在菜单项中不要显式写出 ‘.info’ 。例如,GDB 菜单项的文件名应只写 ‘gdb’ ,而不是 ‘gdb.info’。
21.1.3. 其他目录中的 Info 文件
如果某个 Info 文件不在标准 info 目录中,可以通过三种方式指定它的位置:
- 在
dir文件的菜单项第二部分直接写出该文件的完整路径。 - 在你的
.profile或.cshrc等初始化文件中,通过INFOPATH环境变量指定 Info 目录。(只有设置了该环境变量的用户才能找到以此方式指定路径的 Info 文件。) 如果你使用 Emacs,可以在该文件所在目录下再创建一个 dir 文件,并将该目录添加到个人或站点初始化文件中的
Info-directory-list变量里。该变量告诉 Emacs 去哪里寻找
dir文件(文件名必须为dir)。Emacs 会将所有列出目录下的dir文件内容合并。(在 Emacs 18 版本中,只能将Info-directory变量设为单个目录。)
例如,要访问 /home/bob/info 目录下的测试文件,你可以在系统标准 dir 文件的菜单中添加如下条目:
* Test: (/home/bob/info/info-test). Bob 自用的测试文件。
此时,菜单项的第二部分直接写 info-test 文件的 绝对路径 。
如果你不想修改系统级的 dir 文件,可以在 Shell 启动文件中设置 INFOPATH 环境变量,告诉 Info 去哪里查找文件。该方式对 Emacs 内 Info 和独立的 Info 阅读器都有效。
Emacs 会使用 INFOPATH 环境变量来初始化自身的 Info-directory-list 变量。独立的 Info 阅读器则会把 INFOPATH 中所有目录下名为 dir 的文件合并成一个菜单,显示在名为 ‘(dir)Top’ 的节点中。
无论你如何设置 INFOPATH ,如果它的最后一个字符是冒号‘:’(MS‑DOS/MS‑Windows 系统下使用分号‘;’),系统会自动用默认(编译时内置)路径替换它。这样你就可以在默认路径基础上新增目录,而不必列出所有标准路径。例如(sh 语法):
INFOPATH=/home/bob/info: export INFOPATH
会先搜索 /home/bob/info ,再搜索标准目录。开头的冒号或重复的冒号不会被特殊处理。
当你为配合 Info-directory-list 或 INFOPATH 而创建自己的 dir 文件时,最简单的方法是复制一份已有的 dir 文件,然后把 ‘* Menu:’ 之后的内容替换成你需要的条目。这样可以保证 Info 所需的标点和特殊 CTRL-_ 字符都正确存在。
最后一种方式仅适用于 Emacs Info:直接修改 Info-directory-list 变量。例如:
(add-hook 'Info-mode-hook '(lambda ()
(add-to-list 'Info-directory-list
(expand-file-name "~/info"))))
21.1.4. 安装 Info 目录文件
当你在系统中安装一个 Info 文件时,可以使用 install-info 程序来更新 Info 目录文件 dir 。通常,软件包的 Makefile 会在将 Info 文件复制到正确的安装位置之后,立即运行 install-info 。
为了让 Info 文件能被 install-info 正确处理,你需要在 Texinfo 源文件中加入 @dircategory 和 @direntry…@end direntry 命令。使用 @direntry 指定要添加到 Info 目录文件中的菜单项。使用 @dircategory 为手册指定一个分类,决定它放在 Info 目录的哪个部分。参见 “目录分类”。
下面是这些命令在本手册中的用法示例:
@dircategory Texinfo documentation system @direntry * Texinfo: (texinfo). The GNU documentation format. * install-info: (texinfo)Invoking install-info. ... ... @end direntry
这些命令在生成的 Info 文件中会变成:
INFO-DIR-SECTION Texinfo documentation system START-INFO-DIR-ENTRY * Texinfo: (texinfo). The GNU documentation format. * install-info: (texinfo)Invoking install-info. ... ... END-INFO-DIR-ENTRY
install-info 程序会识别 Info 文件中的这些行,并据此执行相应操作。
务必将 @direntry 和 @dircategory 命令放在 Texinfo 输入文件的开头附近,且在第一个 @node 命令之前。如果在文件后面才使用这些命令, install-info 将无法识别。
install-info 会自动重新格式化它所添加菜单项的描述文字。按照惯例:
- 主条目描述(如上例中的 ‘The GNU documentation format’)建议从第 32 列开始(从 0 算起,与 Emacs 中的
what-cursor-position一致),以便与大多数条目对齐。 - 单个工具的描述尽量从第 48 列开始。
- 关于格式的更多信息,参见 “调用
install-info” 一节中的--calign、--align和--max-width选项。
如果在 Texinfo 源文件中多次使用 @dircategory ,每一次都会指定‘current当前’分类;后续的 @direntry 命令都会添加到该分类下。
每个已安装程序对应的 “Invoking调用” 节点都应该有一个相应的 @direntry 。这样用户就能像传统的 man 手册系统一样,方便地找到各个可执行程序的文档。
21.1.5. 调用 install-info
install-info 从 Info 文件中读取菜单项,并插入到 Info 系统顶层的 dir 文件中( dir 文件的工作原理见前面章节)。 install-info 也可以从 dir 文件中删除菜单项。它最常用于软件安装过程,或是为系统上所有手册构建 dir 文件时。用法:
install-info [option...] [info-file [dir-file]]
如果不指定 info-file 或 dir-file ,则必须使用下面对应的选项来指定。本程序无编译期默认值,且从不使用标准输入。 install-info 每次调用只能读取一个 Info 文件、写入一个 dir 文件。
如果 dir-file (无论以何种方式指定)不存在, install-info 会尽可能创建它(空条目)。
如果任意输入文件是 gzip 压缩过的, install-info 会在读取时自动解压。如果 dir-file 本身是压缩的,写入修改后, install-info 也会自动保持其压缩状态。如果 dir-file 不存在, install-info 会按顺序尝试打开: dir-file.gz、 dir-file.xz、 dir-file.bz2、 dir-file.lz、 dir-file.lzma。
选项说明
--add-once- 指定条目只添加到单个 section 中。
--align=column- 指定菜单项描述中第二行及后续行从第几列开始对齐。默认值:35。与
--max-width配合使用。 column列号 从 1 开始计数。 --append-new-sections- 新 section 不按字母排序,而是直接追加到 DIR 文件末尾。
--calign=column- 指定菜单项描述第一行从第几列开始对齐。默认值:33。与
--max-width配合使用。如果菜单项名称超过该列,描述会自动换到下一行。 column列号 从 1 开始计数。 --debug- 输出详细执行过程。
--delete- 从 dir-file 中删除 info-file 对应的条目。 dir-file 条目中的文件名必须与 info-file 匹配(可忽略可选的 ‘.info’ 后缀)。不插入任何新条目。删除后产生的空 section 也会一并移除。
--description=text- 指定菜单项的描述部分。如果不通过
--entry、--item或本选项指定描述,则会从 Info 文件自身读取。 --dir-file=name- 指定 Info 目录文件( dir-file )的路径。等价于直接使用 dir-file 参数。
--dry-run- 同
--test。 --entry=text- 将 text文本 作为 Info 目录条目插入;文本格式为 Info 菜单项行,后面可跟零或多行以空白开头的额外行。可指定多个条目,都会被添加。如果不指定条目,则从 Info 文件自身信息中获取。
--help- 显示用法信息与所有可用选项,然后正常退出。
--info-file=file- 指定要安装到目录中的 Info 文件。等价于直接使用 info-file 参数。
--info-dir=dir- 指定
dir文件所在目录。等价于--dir-file=目录/dir。 --infodir=dir- 同
--info-dir。 --item=text- 同
--entry=text。Info 目录条目本质就是菜单项。 --keep-old- 不替换已存在的菜单项。如果同时指定
--remove,则表示不删除空 section。 --max-width=column- 指定菜单项描述在此列处自动换行。 column列号 从 1 开始计数。
--maxwidth=column- 同
--max-width。 --menuentry=text- 同
--name。 --name=text- 指定菜单项的名称部分。如果文本不以 ‘*’ 开头,视为 ‘*’ 之后、Info 文件名括号之前的内容。否则原样使用,直到第一个句号为止(必要时自动补空格)。如果不通过
--entry、--item或本选项指定名称,则从 Info 文件中读取;若 Info 文件也没有,则使用 Info 文件的 basename。 --no-indent- 不对新条目做格式化缩进。
--quiet--silent- 静默运行,不输出警告等信息。
--remove- 同
--delete。 --remove-exactly- 类似
--delete,但要求文件名完全匹配才删除;不忽略.info、.gz等后缀。 --section=sec- 将本文件条目放到目录的 sec section 中。可指定多个 section,条目会在每个 section 中添加。不指定则从 Info 文件中读取;Info 文件也未指定时,放入 Miscellaneous section。
--sectionregex sec等价于:=–regex=regex –section=sec –add-once=
install-info会尝试自动识别这种语法,但不一定总能正确判断。其判断规则:- 如果 –section 的第二个参数以连字符开头,使用原始语法。
- 如果第二个参数是可打开的文件,使用原始语法。
- 否则使用上述扩展语法。
如果因为 section 标题以连字符开头、或恰好是可打开文件而导致识别失败,请显式写成:
--regex=regex --section=sec --add-once。--regex=regex- 将本文件条目放入所有匹配该 regex正则 的 section。可匹配多个 section,条目会在每个匹配的 section 中添加。使用基本正则表达式语法(类似 grep)。
--test- 只测试,不实际更新目录文件。
--version- 显示版本信息并正常退出。
21.2. 标签文件与拆分文件
Info 文件始终包含一个标记表(tag table),以便能够快速跳转到各个节点。Info 文件可以是 不拆分( nonsplit 或 unsplit)的,也可以是拆分(split) 的。
如果 Info 文件内容少于约 300,000 个字符,该文件应采用 nonsplit不拆分 形式。此时,标记表应出现在 Info 文件的 末尾 。如果 Texinfo 文件内容超过约 300,000 个字符,Texinfo 处理器会将大型 Info 文件拆分为多个较短的 间接子文件 ,每个子文件约 300,000 字符。在使用 texi2any 时,可以通过 --no-split 禁止拆分;默认的 300,000 字符大小可通过 --split-size 修改(参见《从 Shell 调用 texi2any 》)。
当文件被拆分后,Info 系统会使用原文件的 精简版本 :它只包含标记表和对被拆分出去的文件的引用。这些被拆分出去的文件称为 间接文件 (indirect files)。
拆分后的文件名,是在由 @setfilename 命令或输入文件名指定的输出文件名后,依次追加 -1、-2、-3 等数字形成。原文件的精简版本仍保留 @setfilename 或输入文件名指定的名称。
例如,在编写本文档的某个阶段,Info 文件被保存为 test-texinfo ,内容大致如下:
Info file: test-texinfo, -*-Text-*- produced by texinfo-format-buffer from file: new-texinfo-manual.texinfo ^_ Indirect: test-texinfo-1: 102 test-texinfo-2: 50422 test-texinfo-3: 101300 ^_^L Tag table: (Indirect) Node: overview^?104 Node: info file^?1271 Node: printed manual^?4853 Node: conventions^?6855 ...
(但 test-texinfo 实际包含的节点远多于此处所示。)所有被拆分的间接文件 test-texinfo-1 、 test-texinfo-2 、 test-texinfo-3 ,都会在 ‘Indirect:’ 行之后列出。标记表则在 ‘Tag table:’ 行之后列出。
在间接文件列表中,文件名后的数字表示 此前所有间接文件的总字节数 ,不计算文件列表本身、标记表,以及第一个文件中的权限文本。在标记表中,节点名后的数字表示该节点 起始位置 ,以从(未拆分)输出文件开头算起的字节数表示。
如果你使用 texinfo-format-buffer 生成 Info 文件,可能需要运行 Info-validate 命令。( texi2any 自身已做得很好,无需再用 Info-validate 。)但你 不能 在间接文件上执行 M-x Info-validate 节点检查命令。有关如何使用 texinfo-format-buffer 禁止文件拆分,以及如何验证节点结构,参见《使用 Info-validate 》。
21.3. Info 格式常见问题
以下是在项目邮件列表及其他地方经常被问到的一些问题。
- 为什么运行
info foo得到的结果和man foo一样? - 请检查 Info 手册是否已安装。并非所有 GNU/Linux 发行版都会默认安装全部 Info 手册。这一点比较遗憾,因为 Info 手册通常比附带的 man 手册包含更多信息。
- 为什么不直接用 HTML 代替 Info?
手册本身很少直接用 Info 格式编写,而是由
texi2any程序从 Texinfo 源码生成。texi2any既可以从 Texinfo 源码生成 Info 文件,也可以生成 HTML。你也可以从 GNU 官网(https://www.gnu.org/manual/manual.html)访问和下载 HTML 手册。此外,部分 GNU/Linux 发行版也提供用于安装 HTML 手册的软件包。对于本地安装的文档,Info 相比 HTML 仍有一些优势:Info 浏览器支持索引查找,也支持多个位置本地安装手册之间的交叉链接。将文档安装在本机,而不是依赖网络,非常重要;这样访问文档更可靠,并且能确保文档与已安装软件版本一致。希望未来能改进对以某种 HTML 形式浏览本地安装的 Texinfo 文档的支持。
- 既然 Emacs Info 阅读器更好,为什么还要提供命令行 info 程序?
Emacs Info 阅读器可以显示图片,并完整支持鼠标操作。除此之外,各类 Info 阅读器差别不大。命令行 info 可以配置修改默认按键绑定、更改交叉引用与搜索结果的颜色,还能启用鼠标滚动支持。使用 info 并不需要你熟悉 Emacs 编辑器。(有人推荐另一个名为
pinfo的程序,但它缺少索引查找等重要功能。)有些人更喜欢一次性翻阅整本手册(像
man那样),而不是每次只限于一个节点内容。当然,喜好因人而异,但手册越长、结构越复杂,整块无结构文本就越难阅读。(不过,如果你确实想这样做,可以用info foo | less在less分页器中一次性查看 Info 手册。)- 为什么我的所有链接前面都出现了 ‘see’?
- 默认情况下,Emacs Info 模式会将交叉引用的标记 ‘*note’ 改为 ‘see’,或者完全隐藏。如果开启了
hide-note-references,命令行info也会这么做。遗憾的是,这种处理无法做到完全可靠,因为 Texinfo 中的@pxref和@ref命令在 Info 输出中都会生成这个标记,而 ‘see’ 只适用于@pxref。 - 好,那我怎么才能得到不带额外标记的纯链接?
做不到。Info 是纯文本格式,阅读器基本原样显示内容。如果没有 ‘*note’ 这类文本,就没有任何标记能标识出这是链接。
对于 HTML 等输出格式,你可以使用
@link命令生成纯链接,参见@link: Plain, unadorned hyperlink。不过这在 Info 输出或打印版手册中不会生成可用的交叉引用。- 为什么包含链接的行莫名其妙地变短了?
- 这是因为 Emacs(或开启了
hide-note-references的info)隐藏了 ‘*note’ 字符串,如前所述。 - Info 格式能否扩展以支持字体、颜色或自动换行重排文本?
任何扩展都会与现有 Info 查看器不兼容。添加到 Info 文件中的额外标记会直接显示给用户,导致文件丑陋且难以阅读。
Texinfo 文件被处理成 Info 文件时,文本使用了哪些 Texinfo 标记命令的信息会丢失。此外,也无法可靠判断一段文本是否可以重排(如普通段落),还是应该保留换行(如代码示例、诗歌)。
Info 的核心用途是在文本终端上显示文档。如果你需要更丰富的效果,建议使用
texi2any输出的 HTML 格式。
22. 生成 HTML
texi2any 默认生成 Info 格式输出,但指定 --html 选项后,它会生成供网页浏览器及其他程序使用的 HTML 格式文件。本章将详细介绍这类 HTML 输出的相关细节。
texi2any 提供了大量可由用户自定义的配置变量,你可以通过这些变量调整 HTML 输出效果(参见《HTML 输出定制》)。值得一提的是,工具支持为 @example 环境中的内容实现语法高亮(参见《HTML 中的代码示例语法高亮》)。你也可以编写所谓的 “ initialization files初始化文件”(简称 init files ),几乎能修改 HTML 输出的所有方面。初始化文件包含代码逻辑,可通过 --init-file 选项加载(参见《从 Shell 调用 texi2any 》)。
部分初始化文件随 Texinfo 一同维护,且默认情况下会被安装。例如 chm.pm 会生成压缩 HTML 帮助格式(CHM)的中间文件,这些文件后续可被转换为 CHM 最终格式。
关于通过自定义文件适配 texi2any HTML 输出的详细说明,可参考独立的手册文档(参见《GNU Texinfo texi2any 输出定制》)。
22.1. HTML 转换
由 texi2any 生成的是 标准 HTML 输出。为了获得最大的可移植性与可访问性,输出刻意保持简洁朴素。
你可以通过 CSS(参见 HTML CSS)或其他方式自定义输出结果(参见 HTML 输出定制)。如果无法实现合理的自定义,欢迎反馈问题。
导航栏: 默认情况下,每个节点开头都会插入导航栏,与 Info 输出类似。如果使用了 --no-headers 选项,导航栏只会出现在拆分文件的开头。拆分输出中的 <link> 头部元素,可在支持实现该功能的浏览器中进行类 Info 的导航功能。
原始 HTML: texi2any 会将 Texinfo 源码中 @ifhtml 与 @end ifhtml 之间的内容包含到 HTML 输出中(默认不包含其他条件编译内容)。 @html 与 @end html 之间的源码会原样输出(即不对 HTML 中有特殊含义的 ‘<’、‘>’ 和 ‘&’ 字符进行转义)。参见条件命令。
标准规范: 我们的目标并非要毫无提示地通过所有能想到的校验检查,这甚至通常也无法做到。不同的校验检查有不同的目的,往往只是刻板地强制执行某一种标准。我们最首要的目标是服务用户,而非盲目遵从标准。
如果 texi2any 无错误运行后生成的输出在实际浏览器或 EPUB 阅读器中存在可移植性问题,请作为 bug 反馈(参见报告错误)。
实际使用中, texi2any 生成的 HTML 会随时间缓慢向最新 HTML 标准靠拢,同时尽量保持与较早版本 HTML 的兼容性。我们使用过渡性标记,并且更新节奏足够平缓,以便给各类 HTML 阅读器留出适配时间(也让标准有机会重新纳入被移除的实用功能…)。
22.2. HTML 文件拆分
按节点拆分输出(默认行为)时, texi2any 会将 HTML 输出写入(基本是)每个 Texinfo 源码 @node 对应一个输出文件。
每个输出文件名由节点名生成:空格替换为减号 - ,特殊字符替换为下划线 _ 加上其十六进制编码(参见 HTML 交叉引用)。这样做是为了保证文件名可移植、易用。在极少数情况下,若两个不同节点经过上述处理后名称相同,它们会连续写入同一个文件,并使用 HTML 锚点,以便各自能被独立引用。
如果 texi2any 运行在 文件名不区分大小写 的系统上,仅大小写不同的节点(如 ‘index’ 和 ‘Index’)也会被合并到同一个输出文件中,并使用锚点区分。你也可以通过设置自定义变量 CASE_INSENSITIVE_FILENAMES ,模拟在不区分大小写的文件系统上运行。
也可以使用 --split 选项按章或节拆分(参见 拆分输出)。这种情况下,文件名根据与对应分节命令关联的节点名来构造。此外,除非指定 --no-node-files ,否则会为每个节点输出一个重定向文件,以便更可靠地支持对该手册的交叉引用(参见 HTML 交叉引用)。
拆分时,HTML 输出文件会写入一个 子目录 。子目录名由基础文件名(即去掉扩展名)加上后缀 _html 构成。例如, gcc.texi 的 HTML 输出会写入名 gcc_html/ 的子目录。子目录名基于 @setfilename 或输入文件名(参见 设置输出文件名)。
无论如何,目录内的顶层输出文件始终命名为 index.html 。
整体输出( --no-split ) 命名规则:若存在 @setfilename ,则使用其名称(扩展名 .info 替换为 .html );否则使用 --output 指定的名称(参数原样使用);最后才会基于输入文件名生成。(参见 设置输出文件名)
22.3. HTML 层叠样式表(CSS)
层叠样式表(Cascading Style Sheets,CSS)是用于控制 HTML 文档显示效果的互联网标准,详见:http://www.w3.org/Style/CSS/。
默认情况下,输出中会包含部分 CSS 代码,以更好地实现部分 Texinfo 环境的显示效果。例如:
pre.display { font-family:inherit }
上述代码告知网页浏览器:在用于 @display 环境的 ‘<pre>’ 元素内,使用与主文档相同的字体。而 HTML 原生的 ‘<pre>’ 标签默认会使用等宽字体。
关于 CSS 的完整说明,请参考上述链接。
你可以通过 texi2any 的两个选项调整 HTML 输出中的 CSS: --css-include=file 和 --css-ref=url 。
- 选项
--css-ref=url会在每个输出的 HTML 文件中添加一个 ‘<link>’ 标签,引用指定 URL 地址的 CSS 文件。这允许你使用外部样式表。 - 选项
--css-include=file会将指定文件(file)的内容包含到 HTML 输出中(正如其名)。不过为了实现最大灵活性,具体处理逻辑稍显复杂,详情如下:
CSS 文件处理规则
- 字符集指令:CSS 文件的第一行可能是 ‘@charset’ 指令。若存在该指令,会用于确定 CSS 文件的编码格式,但该行内容不会复制到输出中。
- 导入指令:CSS 文件开头可能包含所谓的 ‘@import’ 指令,用于链接外部 CSS 规范,供浏览器解析文档时使用。完整说明超出本文档范围,此处仅说明其语法处理逻辑:
一个文件中可包含多个 @import 指令,但必须出现在文件最开头,仅可夹杂空白字符和注释,不能有普通样式定义(CSS 注释格式为 ‘/* … */’,与 C 语言一致)。 @import 指令仅支持两种格式:
@import url(http://example.org/foo.css);
@import "http://example.net/bar.css";
核心识别特征是开头的 ‘@’ 和结尾的分号 ‘;’ 。读取 CSS 文件时,这类 ‘@’ 指令会按以下规则复制到输出中:
- 若 file 仅包含普通 CSS 声明:其内容会追加在默认 CSS 之后,从而覆盖默认样式;
若 file 以 ‘@import’ 指令开头:先插入所有 ‘@import’ 指令(按标准要求必须置于首位),再插入默认 CSS;若需通过 ‘@import’ 的样式覆盖默认 CSS,可使用 CSS 的 ‘! important’ 语法,例如:
pre.example { font-size: inherit ! important }- 若文件同时包含 ‘@import’ 和内联 CSS 声明:先插入 ‘@import’ 指令,再插入默认 CSS,最后插入 file 中的内联 CSS;
- 除 ‘@import’ 和 ‘@charset’ 外的其他 @指令,均视为普通 CSS 声明:先插入默认 CSS,再将文件其余内容前置插入。
若 CSS 文件格式错误或存在语法问题,输出结果未定义;程序不会解析 CSS 文件的语义,仅识别特殊字符 ‘@’ 和 ‘;’,并将内容盲目复制到输出中;CSS 文件中的注释可能被包含在输出中,也可能不包含。
自定义 CSS 输出方式
默认情况下,HTML 元素会添加类名,且对应类的 CSS 规则会输出到每个 HTML 文件的开头:设置自定义变量 NO_CSS :可禁止添加类名和使用 CSS;设置 INLINE_CSS_STYLE :可将 CSS 代码嵌入到 HTML 元素的 style 属性中,而非输出到文件开头。
由于 texi2any 仅插入实际输出的 HTML 所需的 CSS 代码,输出文档中无法看到所有潜在的 CSS 规则。若需获取完整的内置默认 CSS 规则列表,可设置自定义变量 SHOW_BUILTIN_CSS_RULES 运行 texi2any ,程序会将内置 CSS 规则输出到标准输出并退出,例如:
texi2any -c SHOW_BUILTIN_CSS_RULES=1
22.4. @documentdescription: 摘要文本
在为文档生成 HTML 输出时,会在 ‘<head>’ 中写入一个 ‘<meta>’ 元素,用于简要说明文档内容。默认情况下,这段描述信息就是文档的标题,取自 @settitle 命令(参见 @settitle: 设置文档标题)。若要修改该内容,可使用 @documentdescription 环境,示例如下:
@documentdescription descriptive text. @end documentdescription
这会在 HTML 的 ‘<head>’ 部分生成如下输出:
<meta name=description content="descriptive text.">
22.5. 生成 EPUB
EPUB 是一种专为在便携式设备上阅读电子书而设计的格式。2024 年版 texi2any 可生成 EPUB 3.3 格式文件。一个 EPUB 文件本质是 ZIP 归档容器,其中既包含说明性文件,也包含以 HTML 格式呈现的手册内容。
EPUB 文件的生成依赖于 Perl 模块 Archive::Zip 已安装,该依赖项会在运行时进行检查。默认情况下,若缺少此依赖却尝试输出 EPUB,会触发错误。但如果将自定义变量 EPUB_CREATE_CONTAINER_FILE 设置为 0(即不生成 EPUB 输出文件),那么即便未安装 Archive::Zip 也不会报错。
texi2any 中与 EPUB 生成相关的测试无需安装 Archive::Zip —— 这些测试会将 EPUB_CREATE_CONTAINER_FILE 设为 0,并通过将自定义变量 EPUB_KEEP_CONTAINER_FOLDER 设为 1,保留包含生成 EPUB 文件所需的所有文件和目录的容器目录。
22.5.1. 容器目录与输出文件
生成 EPUB 输出时,会创建一个包含 EPUB 格式所需文件和目录的 容器目录 。该容器目录的名称规则为:取输入文件的基础名(即移除所有扩展名),并追加后缀 _epub_package 。若通过 --output 选项或 SUBDIR 自定义变量指定了输出目录,则容器目录会创建在该目录下,而非当前目录。每次重新运行程序时,容器目录及其所有内容会被先删除;默认情况下,最终生成 EPUB 文件后,容器目录也会被删除。
从 Texinfo 手册生成的 HTML 文件,会输出到容器目录的子目录中。Texinfo 手册中引用的图片文件(若能找到),会被复制到容器目录的子目录下。
EPUB 输出文件是容器目录的 ZIP 归档包,文件名规则为:取基础名并追加扩展名 .epub 。若通过 --output 选项或 OUTFILE 自定义函数指定了输出文件名,则优先使用该名称。注意:输出的 EPUB 文件绝不会被放置在 --output 或 SUBDIR 指定的目录中;仅有容器目录会按前文所述被放置在该目录下。
若将自定义变量 EPUB_CREATE_CONTAINER_FILE 设置为 0,则不会生成 EPUB 输出文件;若设置了 EPUB_KEEP_CONTAINER_FOLDER ,则在最终生成 EPUB 文件后,容器目录会被保留。
参见《从 Shell 调用 texi2any 》。
22.5.2. EPUB 中的交叉引用
EPUB 格式不支持从一个 EPUB 文件到另一个 EPUB 文件的引用。因此,对 “外部” Texinfo 手册的任何引用都应解析为外部 URL。 texi2any 通过 HTML 交叉引用配置生成这些链接(参见 HTML 交叉引用配置: htmlxref.cnf )。
如果交叉引用没有找到对应的信息,生成的 EPUB 中的链接就会不正确,因此 texi2any 默认会对缺失的交叉引用信息发出警告。如果不希望出现这些警告,可将 CHECK_HTMLXREF 设置为 0。
22.5.3. 实现严格的 EPUB 标准兼容
默认情况下, texi2any 会尽可能生成符合合规检查工具要求的 EPUB。若要达到 完全合规 ,你可能仍需要对 Texinfo 手册做如下调整:
- 确保对外部手册的引用都解析为 URL(参见 EPUB 交叉引用)。
- 避免使用比 XHTML 更宽松的 Texinfo 代码。通常合法的 Texinfo 会被转换为合法的 XHTML,但也存在例外。例如:应避免嵌套引用、嵌套的分节命令与引用、
@table中首个@item之前出现内容,以及省略@table@item的第二列。 - 移除 Texinfo 输入文件名中的空格。
- 移除最终会出现在输出中的换页符。
22.5.4. 为 EPUB 生成的 HTML
为 EPUB 生成的 HTML 遵循 XHTML 规范,采用 UTF‑8 编码,并且不会生成常规 HTML 里的导航页眉与页脚。
texi2any 内部通过设置相关自定义变量来实现这一点,例如 USE_XML_SYNTAX 、 HEADERS 或 OUTPUT_ENCODING_NAME 。EPUB 中会使用部分印刷版输出的特性。特别地,Top 节点不会出现在 EPUB 输出中,而是会生成一个标题页,这是通过设置 NO_TOP_NODE_OUTPUT 实现的。详见《HTML 输出定制》。
OUTFILE 和 SUBDIR 这两个自定义变量的初始值对应 EPUB 容器目录或 EPUB 输出文件(见《容器目录与输出文件》)。在生成 HTML 时,这些变量的值会被取消定义或重置为容器目录中存放 XHTML 文件的位置。
这里特别说明 texi2any 对这些自定义变量的使用,是因为 重置这类变量并不常见 ;不过,这些被重置的变量仅在转换过程内部使用,不会与用户设置的任何自定义配置相互影响。
22.6. HTML 中的代码示例语法高亮
警告: 源码高亮功能仍处于实验阶段,欢迎提供反馈。
HIGHLIGHT_SYNTAX的语法在未来版本中很可能会发生变化。
texi2any 在生成 HTML 输出时,可借助外部软件实现源码语法高亮支持。该功能通过设置 HIGHLIGHT_SYNTAX 启用。语法高亮仅对 @example 代码块生效。
用于语法高亮的语言,是 @example 所在行的第一个参数(参见 @example: 示例文本);如果未指定第一个参数,但设置了 HIGHLIGHT_SYNTAX_DEFAULT_LANGUAGE ,则使用该变量指定的语言。
HIGHLIGHT_SYNTAX 的取值决定了用于高亮的命令:
highlight- 使用来自 http://www.andre-simon.de/doku/highlight/en/highlight.php 的
highlight工具; pygments- 使用来自 https://pygments.org/ 的
pygmentize工具; source-highlight- 使用
source-highlight(参见 GNU Source-highlight)。
22.7. HTML 中的交叉引用
HTML 格式的 Texinfo 手册之间的交叉引用会转换为标准的 HTML <a> 链接。本节将介绍所使用的算法,以便 Texinfo 能够与 texi2html 等其他程序协同工作,生成彼此兼容的 HTML 文件。
该算法 未必 会用于单个 Texinfo 文件生成的 HTML 输出 内部 的链接。此类场景不存在兼容性问题,因此无需对此做出规定。
我们尝试支持对 “外部” 手册的两种形式引用:整体式(monolithic)和拆分式(split)。整体式手册的内容全部包含在单个文件中,而拆分式手册则为每个节点单独生成一个文件(参见《HTML 拆分》)。
本算法主要由帕特里斯・迪马(Patrice Dumas)在 2003–2004 年间设计完成。
22.7.1. HTML 交叉引用链接基础
就本场景而言,一个 HTML 链接由四部分构成:主机名(host name)、目录部分(directory part)、文件部分(file part)和目标部分(target part)。我们始终默认使用 HTTP 协议,例如:
http://host/dir/file.html#target
构建链接的信息来源包括:Texinfo 源码中交叉引用命令里的节点名和手册名(参见《交叉引用》),以及外部配置信息(参见《HTML 交叉引用配置: htmlxref.cnf 》)。
对于发布在万维网上的 HTML 手册,若要让交叉引用正常生效,必须通过外部信息定义 host 和 dir 的值,具体规则后续详述(参见《HTML 交叉引用配置: htmlxref.cnf 》)。
若某本手册无可用的外部信息,则会为 host 和 dir 使用默认值 —— 该默认值适配 “同一主机上并列存放的一组手册间的交叉引用” 场景。此时 host 会硬编码为本地主机:既可能是字面字符串 ‘localhost’,也可能根据 HTML 链接规则,连 http:// 一起完全省略。
dir 和 file 部分的取值,同时取决于当前处理的手册和被引用的手册各自是拆分(split)还是整体(mono)形式:
- 若当前手册是拆分式、被 referent 引用手册也是拆分式:目录为
../referent_html/,文件为展开后的节点名(后文详述); - 若当前手册是拆分式、被引用手册是整体式:目录为
../,文件为referent.html; - 若当前手册是整体式、被引用手册是拆分式:目录为
referent_html/,文件为展开后的节点名; - 若当前手册是整体式、被引用手册也是整体式:目录为
./(或空字符串),文件为referent.html。
核心设计思路是:HTML 格式的 Texinfo 手册会集中存放在一个目录下,某本手册要么以整体式文件 manual.html 存在,要么以拆分式子目录 manual_html/*.html 存在。
另一项仅针对文件名的规则:基础文件名会被截断至 245 个字符 —— 这是为了追加扩展名后,仍能符合多数文件系统通用的 255 字符长度限制。尽管技术上可通过自定义变量 BASEFILENAME_LENGTH 修改该限制(参见《HTML 文件名与链接定制》),但这么做会导致跨手册对这类节点的引用失效。
源码交叉引用命令中,文件名参数里的任何目录部分都会被忽略。例如 @xref{,,,../foo} 和 @xref{,,,foo} 都会将 foo 视作手册名。原因在于:这类手动硬编码目录的方式,几乎无法适配所有使用手册名的输出格式。
最终,链接的 target目标 部分始终是 展开后的节点名 。
当前手册以拆分式还是整体式输出,由 texi2any 的运行方式决定:默认是拆分输出,可通过 --no-split 选项覆盖该默认行为。
默认情况下, texi2any 生成的被引用手册链接,会采用与当前手册相同的形式:若当前手册是拆分输出,那么指向其他手册的链接默认也指向其拆分版本;整体式输出同理。
但被引用手册的形式(整体 / 拆分)通常应在配置文件中明确指定(参见《HTML 交叉引用配置: htmlxref.cnf 》)。此举可确保:生成工具假定的被引用手册格式,与其实际存在的格式一致,避免出现不匹配问题。
22.7.2. HTML 交叉引用的节点名展开
如前一节所述,HTML 交叉引用算法的核心环节是将 Texinfo 源码中的节点名转换为适用于 XHTML 标识符和文件名的字符串。二者的限制条件相近:仅可使用纯 ASCII 字母、数字,以及 - 和 _ 字符。(尽管 HTML 锚点可包含多数字符,但 XHTML 的限制更为严格。)
Texinfo 中的交叉引用可指向三类目标:节点、锚点(参见 @anchor: 定义任意交叉引用目标)或浮动标签(参见 @float [ 类型 ][, 标签 ]: 浮动内容)。但在此场景下,锚点和浮动标签的处理方式与节点完全一致,为简化表述,下文仍统一称 “node” 名。
特殊例外规则: 为适配网页服务器软件,Top 节点(参见《Top 节点与主菜单》)始终映射到文件 index.html ,但其 HTML 目标值仍为 Top。例如(拆分输出场景下):
@xref{Top,,, emacs, The GNU Emacs Manual}.
⇒ <a href="../emacs_html/index.html#Top">
节点名转换遵循以下规则:
- 标准 ASCII 字母(a-z、A-Z)保持不变;其他字符按下述规则处理。
- 标准 ASCII 数字(0-9)仅在作为节点名首个字符时需特殊处理(见规则 8),其余情况保持不变。
- 多个连续的空格、制表符、换行符合并为单个空格。
- 移除开头和结尾的空格。
- 完成上述步骤后,剩余的每个空格转换为
-字符。 - 其他 7 位 ASCII 字符转换为
_00xx形式( xx 为该字符的 ASCII 码,以小写十六进制表示)。例如_会映射为_005f。 - 若节点名首字符非字母,则在转换结果前添加固定字符串
g_t(因前述规则限制,该字符串不会自然出现;此命名为自定义选择,代表 “GNU Texinfo”)—— 这是因为 XHTML 要求标识符必须以字母开头。
示例:
@node A node --- with _'%
⇒ A-node-_002d_002d_002d-with-_005f_0027_0025
常见字符转换示例:
‘_’ ⇒ ‘_005f’ ‘-’ ⇒ ‘_002d’ ‘A node’ ⇒ ‘A-node’
在 大小写折叠 的计算机系统中(文件名不区分大小写),仅大小写不同的节点会映射到同一文件。例如前文提及的 Top 节点始终映射到 index.html ,因此在这类系统中,Top 节点与名为 Index 的节点都会写入 index.html 。但幸运的是,HTML 目标名始终区分大小写(与操作系统无关),可通过目标值区分这些节点。
22.7.3. HTML 交叉引用的命令展开
节点名中可以包含 @-命令(参见 @node 行要求)。本节描述它们的处理方式。
首先移除所有注释。
然后完整展开所有 @value 命令(参见 @set 和 @value )与宏调用(参见调用宏)。
对下面列出的命令,去掉命令名与花括号,并对参数文本 递归处理 :
@asis @b @cite @code @command @dfn @dmn @dotless @emph @env @file @i @indicateurl @kbd @key @samp @sansserif @sc @slanted @strong @sub @sup @t @U @var @verb @w
此外,下列命令会替换为固定文本,如下表所示。如果这些命令带有非空参数(例如 @TeX{bad} ),则视为错误,结果未定义。表中 ‘(space)’ 表示空格字符,‘(nothing)’ 表示空字符串。记号 ‘U+hhhh’ 表示 Unicode 码位 hhhh (十六进制)。
这些展开结果还会根据其他规则做进一步转换,以生成最终的文件名或目标名,例如空格转为 ‘-’ 等。
@(newline) (space)
@(space) (space)
@(tab) (space)
@! ‘!’
@* (space)
@- (nothing)
@. ‘.’
@: (nothing)
@? ‘?’
@@ ‘@’
@{ ‘{’
@} ‘}’
@LaTeX ‘LaTeX’
@TeX ‘TeX’
@arrow U+2192
@bullet U+2022
@comma ‘,’
@copyright U+00A9
@dots U+2026
@enddots ‘...’
@equiv U+2261
@error ‘error-->’
@euro U+20AC
@exclamdown U+00A1
@expansion U+21A6
@geq U+2265
@leq U+2264
@minus U+2212
@ordf U+00AA
@ordm U+00BA
@point U+22C6
@pounds U+00A3
@print U+22A3
@questiondown U+00BF
@registeredsymbol U+00AE
@result U+21D2
@textdegree U+00B0
@tie (space)
引号类 @-命令(如 @quotedblright{} 等)同样替换为对应的 Unicode 值。普通引号字符(如 ASCII 的 ‘ 和 ’)不做修改。参见插入引号。
所有 @acronym 、 @abbr 、 @email 和 @image 命令只保留 第一个参数 (这些命令的后续参数均为可选,此处忽略)。参见 @acronym {acronym [, meaning ]}、 @email {email-address [, displayed-text ]} 与插入图片。
重音符号的处理见下一节。
其他任何未列出的命令均视为错误,处理结果未定义。
22.7.4. HTML 交叉引用的 8 位字符展开
通常,除纯 7 位 ASCII 字符外的其他字符,会被转换为Unicode 规范形式 C(Normalization Form C) 对应的码点(尽可能使用预组合字符)。(该规范形式为 W3C 及其他机构推荐使用。)此规则适用于码点 ≤ 0xffff 的字符(几乎所有场景均满足此条件)。
转换后的 Unicode 码点会进一步遵循前文规则,变为 _hhhh 格式的字符串(/hhhh/ 为码点的十六进制表示)。
示例(结合本节与上一节规则):
@node @b{A} @TeX{} @u{B} @point{}@enddots{}
⇒ A-TeX-B_0306-_22C6_002e_002e_002e
说明: @enddots 先展开为三个句点,再进一步转换为三个 _002e ; @u{B} 是带短音符的字母 B,由于不存在预组合的 Unicode 字符,因此展开为 B_0306 (字母 B 拼接组合型短音符)。
若 Unicode 码点超过 0xffff ,则转换为 __xxxxxx 格式:以两个下划线开头,后跟 6 位十六进制数。由于 Unicode 已规定其最高码点为 0x10ffff ,该格式足以覆盖所有情况。(我们认为定义此额外转义格式优于始终使用 6 位十六进制数 —— 因为前者前两位几乎全为 0,无实际意义。)
此方法在节点名以 ASCII 字符为主、仅含少量 8 位字符时效果良好。但对于非拉丁语系语言编写的文档(如乌克兰语),会生成几乎全由 _xxxx 组成的文件名,既不便捷也难以阅读。为此, texi2any 提供了命令行选项 --transliterate-file-names :启用该选项后,节点名会按语音规则音译为 ASCII 字符,再用于文件名生成和引用,使生成的文件名更易理解。
关于 Unicode 规范形式 C 的定义,参见 Unicode 技术报告 UAX#15:http://www.unicode.org/reports/tr15/。相关文档与实现可在互联网上找到。
22.7.5. HTML 交叉引用配置文件
要让发布在万维网上的其他手册能正确交叉引用到你的手册,Texinfo 转换工具在为这些手册生成 HTML 时,必须知道交叉引用中的 主机(host) 和 目录(dir) 部分。同理,要让你的 HTML 手册能正确引用其他手册, texi2any 也需要知道如何为其他手册构造 URL。
texi2any 会读取名为 htmlxref.cnf 的文件,以及 htmlxref.d 目录下所有以 .cnf 为后缀的文件,用于收集在 HTML 输出中交叉引用其他手册所需的信息。依据 XDG 基础目录规范 (默认路径基于安装目录),系统会在以下目录中查找 htmlxref.cnf 和 htmlxref.d :
./- 当前目录
- 主输入文件所在目录
- 如果输入文件路径包含目录且不是当前目录,会在该目录下查找。
例如:若输入文件为
some/dir/mymanual.texi,则会在some/dir中查找htmlxref.cnf,同时也会读取匹配some/dir/htmlxref.d/*.cnf的所有文件。 ./.texinfo/- 当前目录下的
.texinfo子目录 XDG_CONFIG_HOME/texinfoXDG_CONFIG_HOME为环境变量~/.config/texinfo/- 为当前用户家目录,仅在未设置
XDG_CONFIG_HOME时使用 sysconfdir/xdg/texinfo/sysconfdir- 是编译时指定的系统配置目录,例如
/usr/local/etc XDG_CONFIG_DIRS/texinfo- 对环境变量
XDG_CONFIG_DIRS中以冒号分隔的每个目录依次查找 datadir/texinfo/- 编译时指定的目录,例如
/usr/local/share
所有找到的文件都会被使用, 先找到的配置会覆盖后找到的 。Texinfo 发行版中包含一些文件,这些文件会被安装到上述目录中靠后的一个目录 —— datadir/texinfo/htmlxref.d 下:
Texinfo_GNU.cnf- 处理大量 GNU 手册的交叉引用。
Texinfo_nonGNU.cnf- 非 GNU 项目的自由手册。
你可以使用本地的 htmlxref.cnf 来补充或修正 Texinfo 发行版提供的默认文件,这对修正过时信息、甚至生成本地文件的交叉引用都很有用。
其他遵循 HTML 交叉引用规范、管理手册列表的软件包,也可以将 .cnf 文件安装到 datadir/texinfo/htmlxref.d 目录中。
可以设置自定义变量 HTMLXREF_MODE 来改变文件查找方式。例如设为 ‘none’ 表示不使用任何外部信息。 HTMLXREF_FILE 可将配置文件名改为非 htmlxref.cnf 的其他名称。详见《HTML 交叉引用配置定制》。
该文件 按行处理 :只含空白字符的行会被忽略。注释以行首的 ‘#’ 标识,前面可以有空白。由于 ‘#’ 可能出现在 URL 中,除此之外的位置不会被当作注释开头。
每一个非空、非注释行必须是 变量赋值 或 手册信息 。
变量赋值行格式:
varname = varvalue
等号两边的空白可选,会被忽略。变量名由字母组成,区分大小写。变量值为任意字符串,直到行尾。变量可通过 ${varname} 引用,变量引用可以出现在变量值中。
手册信息行格式:
manual keyword urlprefix
manual :手册的短标识符; keyword :只能是 mono、node、section、chapter 之一; urlprefix :下面会说明。变量引用只能出现在 urlprefix 中。示例(官方标准 htmlxref.cnf 中使用):
GS = ${G}/software hello mono ${GS}/hello/manual/hello.html hello chapter ${GS}/hello/manual/html_chapter/ hello section ${GS}/hello/manual/html_section/ hello node ${GS}/hello/manual/html_node/
如果关键字是 mono , urlprefix 给出该手册整体单文件的主机、目录与文件名。
如果关键字是 node/section/chapter , urlprefix 分别给出该手册按节点 / 节 / 章拆分后的主机与目录。
当 texi2any 生成指向另一本 Texinfo 手册的链接时,会优先使用与当前输出拆分方式相同的那一行配置:生成整体输出( --no-split )时,优先使用 mono 。按节点拆分输出时,优先使用 node ,依此类推。
如果某本手册没有优先匹配的拆分方式配置,则会按以下顺序回退查找:
node ⇒ node, section, chapter, mono section ⇒ section, chapter, node, mono chapter ⇒ chapter, section, node, mono mono ⇒ mono, chapter, section, node
这些按节 / 章的跨手册引用,只有在目标手册使用 --node-files 生成时才能正常工作;拆分输出默认启用该选项。
目前,随 GNU Texinfo 分发的 htmlxref.cnf 是定位万维网上 Texinfo HTML 手册的主要依据。由于它会被安装到 texi2any 使用的路径中,默认情况下,所有交叉引用都会使用该文件里的 HTML 手册地址。
如果你对分发版 htmlxref.cnf 有补充或修正,请照例发送邮件至 bug-texinfo@gnu.org。如果你在公网上发布了 Texinfo HTML 手册,只要在 Texinfo_GNU.cnf 或 Texinfo_nonGNU.cnf 中录入了该手册的最新地址,就可以确保所有由 texi2any 生成的 HTML 手册都会自动使用该地址进行交叉引用。
你可从 https://ftpmirror.gnu.org/texinfo/htmlxref.d/Texinfo_GNU.cnf 和 https://ftpmirror.gnu.org/texinfo/htmlxref.d/Texinfo_nonGNU.cnf 获取这两个文件的最新版本。若你希望为 Texinfo 发行版维护一个独立的配套文件,也请发送邮件至 bug-texinfo@gnu.org 咨询。
22.8. HTML 输出定制
你可以使用大量 用户可定义的定制变量 来调整 HTML 输出。完整列表参见《HTML 定制变量清单》。这些定制变量可实现的功能非常丰富,从整体文档结构、HTML 语言版本,到特定结构的格式化,基本能覆盖 CSS 定制(参见 HTML CSS)无法满足的绝大多数需求。
如果你需要更精细的控制,可以通过 初始化文件 实现,相关内容在独立手册中说明(参见《GNU Texinfo texi2any 输出定制》)。
如果设置了定制变量 TEXI2HTML ,生成的 HTML 会尽可能与 texi2html 兼容(参见 texi2html: texi2any 的前身)。该变量的作用比较特殊:它并不直接修改输出,而是会批量设置许多其他定制变量,其中有些变量 只能在初始化文件中设置 ,并在 texi2any 输出定制的独立手册中说明。默认情况下该变量 未启用 。
22.8.1. HTML 输出结构定制
你可以使用定制变量控制文档标题、目录及其他类似部分的输出。其他变量会影响 texi2any 如何解析文档结构,以及如何将输出拆分为多个文件。
若 SHOW_TITLE 的值为 ‘undef’(默认值),则输出内容开头不会输出标题。如果你设置了该变量,默认情况下会将 @titlepage 的内容(或 @maketitle 生成的输出)用作标题;若需仅输出简洁的标题字符串,需取消设置 USE_TITLEPAGE_FOR_TITLE 。
默认情况下,HTML 输出为在线阅读优化,Top 节点会作为读者的顶层入口。你可以设置 NO_TOP_NODE_OUTPUT 移除 Top 节点,使输出更接近印刷书籍格式。默认情况下,设置 NO_TOP_NODE_OUTPUT 也会在文档开头输出标题,你可以将 SHOW_TITLE 设为 0 来覆盖此行为。
默认情况下,每个节点都会输出下级章节列表用于导航,对应 FORMAT_MENU 变量设为 ‘sectiontoc’。若要像 Info 格式一样使用菜单导航(参见 菜单),可将 FORMAT_MENU 设为 ‘menu’。若既不输出菜单也不输出下级章节列表,可设为 ‘nomenu’。
默认情况下,整篇文档的目录会在 @top 节末尾输出,以便读者尽早看到全局导航,对应 CONTENTS_OUTPUT_LOCATION 设为 ‘after_top’。
将 CONTENTS_OUTPUT_LOCATION 设为 ‘after_title’,可在标题之后输出目录(需已设置 SHOW_TITLE )。若要在文档末尾输出目录,或在拆分输出时输出到单独文件,可设为 ‘separate_element’。也可设为 ‘inline’:此时目录会在对应的 @-命令(如 @contents )所在位置直接输出。
当 FORMAT_MENU 设为 ‘menu’ 并使用菜单导航时,修改 CONTENTS_OUTPUT_LOCATION 会很有用。此时 @top 节中通常已有主菜单(见主菜单组成),读者可能不需要在同一位置再出现目录。
默认情况下, 每个节点单独输出为一个文件 。你可以使用命令行选项 --split 修改,等价于设置 SPLIT 变量。 SPLIT 可取值:chapter、section、node,或设为空字符串表示不拆分输出。参见《拆分输出》。
输出使用名为 output units输出单元 的基本单位,每个输出文件包含一个或多个输出单元,具体取决于 SPLIT 的值。输出单元包含与节点或分节命令关联的内容。在典型的 Texinfo 文档源码中, @node 命令几乎总是紧跟一个分节命令。
定制变量 USE_NODES 决定以 节点 还是 分节命令 作为主命令。默认以节点作为划分输出单元的主要依据。将 USE_NODES 设为 false 可优先使用分节来划分输出单元。
- 当以分节为主时:未直接关联分节命令的 “isolated孤立” 节点会与后续分节命令绑定;无节点的分节命令自身构成输出单元。
- 当以节点为主时:未关联节点的孤立分节与前一个节点绑定;孤立节点自身构成输出单元。
默认情况下, USE_NODES 同时影响节点头部的上、下、上级链接指向节点还是分节:为 true 指向节点,为 false 指向分节。你可以使用 USE_NODE_DIRECTIONS 变量(默认未定义)覆盖该行为。注意:该设置只决定链接目标,不决定链接文字;链接文字定制参见 xrefautomaticsectiontitle。若节点与分节系统性关联,则此定制无实际效果。
你可以设置 DO_ABOUT 添加一个说明如何导航的 About 区块,默认为 0(不输出)。若同时设置 PROGRAM_NAME_IN_ABOUT ,则会在 About 区块中输出程序名称及相关信息,默认为 false。
对于不拆分输出,默认只输出一个文件,包含所有 About 元素( DO_ABOUT )和目录元素( CONTENTS_OUTPUT_LOCATION 为 separate_element )。若希望这些特殊元素单独输出,可将 MONOLITHIC 设为 0,使其输出到独立文件。
在 Texinfo 代码中, @node 命令通常紧跟分节命令,为节点提供标题。默认情况下,若节点后没有分节命令,但有 @heading 等命令,则会使用该标题命令作为标题,避免同时出现节点名和标题。若希望在这种情况下仍 使用节点名作为标题 ,可将 USE_NEXT_HEADING_FOR_LONE_NODE 设为 0。
22.8.2. HTML 文件名与链接定制
可以使用定制变量来控制输出文件名,并定制输出文件内的超链接。
你可以比仅使用命令行选项 --output 更精细地指定输出文件名(参见《从 Shell 调用 texi2any 》)。定制变量 PREFIX 会覆盖由 @setfilename 或输入文件名指定的文件基础名,且 不应包含目录部分 。若要修改中间目录,使用定制变量 SUBDIR 。最后,还可以用定制变量 EXTENSION 覆盖扩展名;若不添加扩展名,该变量应设为 undef 。若设置 CASE_INSENSITIVE_FILENAMES ,文件名会按文件系统不区分大小写的方式构造,此时仅大小写不同的文件会共用同一个文件名。
此外,定制变量 TOP_FILE 可覆盖顶层元素的输出文件名;通常只有在输出被拆分时才会生效。
若设置 USE_ACCESSKEY (默认启用),会在部分导航超链接上使用 accesskey 属性提供键盘快捷键: n: 下一个节点或节; p: 上一个节点或节; u: 上级链接。同理,若设置 USE_REL_REV (默认启用),会在导航中使用 rel 属性定义当前页面与链接资源的关系。例如,指向目录的链接会设置 ‘contents’,指向下一节点或节的链接会设置 ‘next’。
有一些定制变量专用于特定类型的链接:
- 交叉引用命令链接
- 若交叉引用命令的第二个参数已设置,则该参数会作为超链接文字显示(参见
@xref带两个参数)。否则由XREF_USE_NODE_NAME_ARG决定超链接文字:设为 1:使用交叉引用 @ 命令中的节点名(第一个参数)作为显示文字;设为 0:若USE_NODES启用则使用节点名,否则使用节名;设为 ‘undef’(默认):在预格式化环境中使用第一个参数,其他情况根据USE_NODES选择节点名或节名。 - 指向浮动内容的链接
- 若设置
XREF_USE_FLOAT_LABEL(默认关闭),则使用浮动标签,而不是 “类型 + 编号” 的形式(参见@float[ type ][, label ]: 浮动内容)。 - 索引项指向节点或节的链接
- 在
@printindex格式化中会输出两个链接:一个指向索引项,另一个指向包含该索引项的根 @-命令。NODE_NAME_IN_INDEX指定根命令链接使用节点名还是节名:为 true:使用节点名;为 false:使用节名;未定义(默认):由USE_NODES决定。 - 菜单链接
- 默认在菜单项链接中使用节点名。将
NODE_NAME_IN_MENU设为 false 可改用节名。 - 目录链接
若同时存在主目录与简短目录,默认情况下简短目录中的交叉引用指向主目录对应条目。将
SHORT_TOC_LINK_TO_TOC设为 0 可改为直接指向分节命令。若设置
TOC_LINKS,会从标题生成指向目录条目的链接,默认为 false。- Top 节点的上级链接
默认不为 Top 节点生成上级引用。可以设置
IGNORE_REF_TO_TOP_NODE_UP,使其忽略其他交叉引用中指向 Top 节点上级(默认为 ‘(dir)’)的所有链接,该变量默认不启用(参见TOP_NODE_UP)。若手册与其他手册一同在网页中被引用,可将该页面设为链接目标。将
TOP_NODE_UP_URL设为 Top 节点上级引用所使用的 URL。若设置了TOP_NODE_UP_URL,则TOP_NODE_UP的值会作为超链接文字,默认为 ‘(dir)’。TOP_NODE_UP会用在属性中,因此不应包含任何元素。例如,GNU 项目的 http://www.gnu.org/manual/ 收集了大多数 GNU 手册的链接,因此若手册将部署在 www.gnu.org 上,最好将
TOP_NODE_UP_URL设为/manual/。关于 Top 节点指针的更多信息,参见《第一个节点》。
- 图片链接
- 若设置
IMAGE_LINK_PREFIX,其值会被添加到图片文件链接的开头,默认为未设置。这在图片文件存放在特定子目录时很有用。
HTML 手册间的交叉引用
HTML 手册之间的交叉引用规则有精确说明(参见 HTML 交叉引用)。可以通过 htmlxref.cnf 和 htmlxref.d/*.cnf 文件自定义手册的位置。(参见 HTML 交叉引用配置 )。
对于在 HTML 交叉引用配置中未找到的目标手册,会使用默认目录和文件名(参见 HTML 交叉引用链接基础)。默认情况下,每个不在配置文件中的外部手册都会产生一条警告。若不希望出现此类警告,可将 CHECK_HTMLXREF 设为 0,例如在你确定手册已本地安装时。
你可以使用定制变量更精确地指定 HTML 交叉引用配置。默认情况下,用于 HTML 交叉引用配置的文件名以及 htmlxref.d 目录会在多个目录中被搜索; htmlxref.d 目录下所有以 .cnf 为后缀的文件,以及所有找到的、用于 HTML 交叉引用配置的文件都会被使用。
你可以设置 HTMLXREF_MODE 来修改如何获取其他手册的交叉引用信息。
- 如果
HTMLXREF_MODE设为 ‘file’:则该文件名会直接作为信息来源。 - 如果
HTMLXREF_MODE设为 ‘none’:则不使用任何外部交叉引用信息。 - 默认情况是
HTMLXREF_MODE未定义或设为其他任意值。
定制变量 HTMLXREF_FILE 可将配置文件名从默认的 htmlxref.cnf 改为其他名称。若 HTMLXREF_FILE 包含目录,则直接尝试加载,不再按目录搜索。默认情况下,外部手册是拆分式还是单文件输出,由当前正在输出的手册的拆分方式决定。你可以通过设置 EXTERNAL_CROSSREF_SPLIT 显式指定。
还有一些定制变量用于修改交叉引用的其他方面:
- 可以通过
TOP_NODE_FILE_TARGET设置交叉引用中 Top 节点所使用的文件名,默认为index.html; - 可以用
EXTERNAL_DIR为外部手册指定基础目录,默认为空; - 可以用
EXTERNAL_CROSSREF_EXTENSION设置指向其他手册的交叉引用所使用的文件扩展名,未设置时则基于EXTENSION;可以通过BASEFILENAME_LENGTH修改基础文件名的最大长度,默认为截断到 245 字符(参见 HTML 交叉引用链接基础)。
但一般来说,使用这些变量会导致跨手册引用 “失效”,即生成的 URL 无法链接到外部手册,除非目标手册本身也使用了对应的定制参数生成。因此,通常只使用 HTML 交叉引用配置会更稳妥。
22.8.4. HTML 功能定制
默认生成 HTML 代码,你可以设置 USE_XML_SYNTAX 以生成兼容 XML 的代码。主要区别在于:对 <img> 、 <link> 这类无结束标签的标签(即空元素),使用 ‘/>’ 而非 ‘>’ 来闭合标签。
若要设置 DOCTYPE ,可通过自定义变量 DOCTYPE 进行配置。默认使用 HTML5 简洁的、无 DTD 的 DOCTYPE。
你也可以设置以 XML 兼容的文件头开头,示例如下:
texi2any --html my_manual.texi -c USE_XML_SYNTAX \ -c DOCTYPE='<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html>'
你还可以将 DOCTYPE 设置为 HTML 4.01 Transitional:
texi2any --html my_manual.texi -c DOCTYPE=\ '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
默认情况下,对成对单引号、 --- 和 -- 会使用实体字符(详见插入引号、通用语法约定)。极少情况下若需要更简洁的输出,可将 USE_ISO 设为 ‘0’。默认会尽可能使用文本实体;设置 USE_NUMERIC_ENTITY 可 只使用数字实体 ;设置 OUTPUT_CHARACTERS 则会根据输出编码直接输出带重音等特殊字符,而非使用实体。
默认会使用标准允许的自定义属性,在交叉引用中标明目标手册名称。若不希望如此(例如生成严格 XHTML),可设置 NO_CUSTOM_HTML_ATTRIBUTE 以禁止输出自定义属性。
对于定义命令、定义了索引条目的表格命令、以及标题等链接目标,会输出 可复制链接 :鼠标悬停在标题文字上时会显示 ‘¶’ 符号。取消 COPIABLE_LINKS 即可禁用可复制链接。
22.8.5. 插入 HTML 代码定制
有若干变量可用于设置在输出不同位置插入的 HTML 代码。
例如 @samp 输出所需的左引号和右引号,其设置规则如下:
‘和’- 默认情况,此时
OPEN_QUOTE_SYMBOL与CLOSE_QUOTE_SYMBOL未定义。 ‘和’- 若设置了
USE_NUMERIC_ENTITY。 - 直接显示左、右引号字符
- 若设置了
OUTPUT_CHARACTERS,且输出编码包含该字符。 OPEN_QUOTE_SYMBOL和CLOSE_QUOTE_SYMBOL- 若你显式设置了这些自定义变量。
若要修改在不同场景中插入的分隔线(水平线)HTML 代码,可设置: DEFAULT_RULE :用于最终输出中大多数水平分隔线。 BIG_RULE :用于某些更宽的分隔线。
你可以设置 HTML_ROOT_ELEMENT_ATTRIBUTES ,为 <html> 标签添加属性。可以定义变量 EXTRA_HEAD ,在 HTML 的 <head> 标签内添加内容。类似地, AFTER_BODY_OPEN 的值会在 <body> 标签输出后立即插入。这些变量默认为空。
你可以通过定义自定义变量 BODY_ELEMENT_ATTRIBUTES 来设置 <body> 标签的属性。默认情况下,‘lang’ 属性会被设为文档语言(参见 @documentlanguage ll[ _cc ]: 设置文档语言)。
你可以定义变量 PRE_BODY_CLOSE ,在 HTML 的 </body> 标签结束前插入内容。默认不添加任何内容。
同样,以下变量可用于对目录和简短目录的格式进行实用控制:
BEFORE_TOC_LINES- 在目录文本之前插入。
AFTER_TOC_LINES- 在目录文本之后插入。
BEFORE_SHORT_TOC_LINES- 在简短目录文本之前插入。
AFTER_SHORT_TOC_LINES- 在简短目录文本之后插入。
在撰写本文档时,这些变量的默认值被设为用于包裹目录的 <div> 开始和结束标签
22.8.6. 特定输出的 HTML 定制
特定结构的输出是可定制的。
在 HTML 中,标题层级会对应到 ‘<hn>’ 元素,其中 n 为标题级别。以下标题层级可定制:
CHAPTER_HEADER_LEVEL- 章节级别的结构化命令所使用的标题格式化级别;默认为 2。
FOOTNOTE_END_HEADER_LEVELFOOTNOTE_SEPARATE_HEADER_LEVEL- 脚注样式为 ‘end’ 或 ‘separate’ 时,脚注标题所使用的标题格式化级别;默认为 4。参见脚注样式。
MAX_HEADER_LEVEL- 所使用的最大标题格式化级别(标题级别数字越大,对应章节层级越低);默认为 4。
你可以通过设置以下变量来修改各类结构的外观:
DEF_TABLE- 若启用,
@deffn及类似 @-命令 将使用<table>结构(外观更接近 TeX 输出),而非定义列表;默认为关闭(false)。 INDENTED_BLOCK_COMMANDS_IN_TABLE- 若启用,使用表格来实现缩进块命令的缩进效果;默认为关闭(false)。
INDEX_ENTRY_COLON- 索引条目与对应节点或章节之间使用的符号;默认为空字符串。
MENU_ENTRY_COLON- 菜单条目与描述之间使用的符号;默认为 ‘:’。
MENU_SYMBOL- 使用节点名格式化菜单条目时,在菜单条目前显示的符号;默认未定义。若未设置
USE_NUMERIC_ENTITY,则为•;若已设置,则为’。 NUMBER_FOOTNOTESNO_NUMBER_FOOTNOTE_SYMBOL- 默认脚注会编号。使用
--no-number-footnotes或将NUMBER_FOOTNOTES设为 0 时,将使用 ‘*’ 替代编号;若设置了NO_NUMBER_FOOTNOTE_SYMBOL,则使用该变量指定的符号。
22.8.7. 数学公式的 HTML 定制
你可以选择多种方式在 HTML 中渲染数学公式(参见 @math 与 @displaymath: 格式化数学公式)。这一行为由自定义变量 HTML_MATH 控制:默认情况下该变量未设置,此时 HTML 输出仅对数学公式做加粗 / 强调处理;你可选择其他选项,以实现数学公式的规范化排版。对于其中部分选项,若设置 --iftex ,则 @tex 区块会转换为 HTML;若设置 --iflatex ,则 @latex 区块会转换为 HTML。
l2h调用
latex2html程序为数学内容生成图片文件。latex2html会处理数学命令中的 LaTeX 数学公式(包括与 LaTeX 兼容的 TeX 数学公式)。若未忽略@tex和@latex区块,latex2html会将其转换为 HTML。请注意:即便处理@tex区块,latex2html也仅能解析 LaTeX 语法。使用
latex2html处理后,输出目录中会生成名称包含 ‘-l2h’ 的文件(尤其是缓存文件),用于避免重复转换已处理过的 HTML 内容。详见「
latex2html自定义变量」。mathjax在输出文件中插入 MathJax 脚本引用,由该脚本完成数学公式的排版。此方式要求浏览器启用 JavaScript 才能生效。
MathJax 支持 LaTeX 数学公式(包括常用的、与 LaTeX 兼容的 TeX 数学公式)。少数特定语法(如
\text的部分用法)暂不支持,但通常不影响实际使用。若数学命令被实际处理,系统会为 MathJax 脚本生成 JavaScript 许可协议网页标签(参见「JavaScript 许可协议网页标签」)。
详见「MathJax 自定义变量」。
t4h调用
tex4ht程序为数学内容生成 HTML 代码。tex4ht会处理数学命令中的 LaTeX 数学公式(包括与 LaTeX 兼容的 TeX 数学公式)。若未忽略@tex和@latex区块,tex4ht会将其转换为 HTML:@tex区块以 TeX 模式处理,@latex区块以 LaTeX 模式处理。使用
tex4ht处理后,输出目录中会生成名称包含_tex4ht的文件。详见「
tex4ht自定义变量」。
默认情况下,若 CONVERT_TO_LATEX_IN_MATH 未定义,设置 HTML_MATH 会同时自动设置 CONVERT_TO_LATEX_IN_MATH 。此时, @math 和 @displaymath 中的 Texinfo @-命令会先转换为 LaTeX 语法,再整体转换为 HTML。
22.8.7.1. MathJax 自定义变量
本表格列出了使用 MathJax 时可配置的自定义变量(即 HTML_MATH 设为 ‘mathjax’ 的场景)。
MATHJAX_CONFIGURATION需添加到全局 MathJax 配置对象中的数据。格式为以逗号分隔的
component: { name: value, … }键值对列表。例如,你可将
MATHJAX_CONFIGURATION设为:options: { enableMenu: false }, loader: { load: [\'[tex]/physics\'], versionWarnings: false }, tex: { packages: {\'[+]\': [\'physics\']} }上述配置可禁用 MathJax 右键菜单,并加载 MathJax 的
physics扩展包。(详见 MathJax 文档中的「配置 MathJax」章节。)若你覆盖了
texi2any默认输出的任何配置项,需确保新配置与texi2any生成的 HTML 输出兼容。MATHJAX_SCRIPT- 你所使用的 MathJax 组件文件(如
tex-svg.js)的 URL。texi2any会为该变量提供默认值,但建议你将此文件托管在自己的网站上,避免依赖第三方托管服务。 MATHJAX_SOURCEMATHJAX_SCRIPT指定的组件文件对应的完整源代码 URL(需为「便于修改的格式」),或获取该源代码的说明。「便于修改的格式」意味着源代码不应是「压缩版(minified)」。该变量用于许可协议标签页面(参见「JavaScript 许可协议网页标签」)。同样,
texi2any会为该变量提供默认值,但建议你自行托管 MathJax 及其依赖项的源代码。此举可确保源代码的可靠获取,并减少你和用户对第三方分发系统的依赖。
22.8.7.2. latex2html 自定义变量
本节列出在使用 latex2html 将 @math 、 @displaymath 、 @latex 和 @tex 区块转换为 HTML 时可用的自定义变量。这些变量仅在 HTML_MATH 设置为 ‘l2h’ 时生效。
若要实际转换 @tex 区块,需使用 --iftex ;若要实际转换 @latex 区块,需使用 --iflatex 。
L2H_CLEAN- 若启用,会删除与
latex2html相关的中间文件;默认为 true。 L2H_FILE- 若设置,将使用指定文件作为
latex2html的初始化文件;默认为未设置。 L2H_HTML_VERSION- 调用
latex2html时使用的 HTML 版本;默认为未设置。 L2H_L2H- 作为
latex2html调用的程序名称;默认为latex2html。 L2H_SKIP- 若设为真值,则跳过实际调用
latex2html,直接复用之前生成的内容。若设为 0,则完全不使用缓存。若设为 ‘undef’,则尽可能对 TeX 片段使用缓存,剩余部分再执行命令。默认为 ‘undef’。 L2H_TMP- 设置临时文件所用目录。该目录名中的任何部分不能以 ‘.’ 开头,否则
latex2html会因 dvips 问题出错。默认为空字符串,表示使用当前目录。
22.8.7.3. tex4ht 自定义变量
本节列出使用 tex4ht 将 @math 、 @displaymath 、 @tex 和 @latex 区块转换为 HTML 时可使用的自定义变量。这些变量仅在 HTML_MATH 设置为 ‘t4h’ 时有效。
若要实际转换 @tex 区块,需使用 --iftex ;若要实际转换 @latex 区块,需使用 --iflatex 。
T4H_LATEX_CONVERSION- 若设置,用于
@latex区块的转换类型。可选值:latex、tex、texi。未定义时默认为 latex。 T4H_MATH_CONVERSION- 若设置,用于
@math和@displaymath的转换类型。可选值:latex、tex、texi。未定义时默认为 tex。 T4H_TEX_CONVERSION- 若设置,用于
@tex区块的转换类型。可选值:latex、tex、texi。未定义时默认为 tex。
22.8.8. JavaScript 接口与许可证
你可以为 HTML 输出添加一个实验性的 JavaScript 浏览接口,只需将 INFO_JS_DIR 的值设为存放该接口代码的目录名即可。例如,执行 texi2any --html -c INFO_JS_DIR=js manual.texi 会将相关文件放置在输出目录下的 ‘js’ 子目录中。该接口能在网页浏览器中实现 Info 浏览器的部分功能,比如键盘导航和索引查找。 此功能仅对未拆分的 HTML 输出生效 。
默认情况下,系统会生成一个 JavaScript 许可协议网页标签页,用于说明 HTML 输出所使用的所有 JavaScript 代码的许可信息及源代码(参见 https://www.gnu.org/licenses/javascript-labels.html)。相关控制规则如下:
- 若要禁止生成该许可协议标签页,将
JS_WEBLABELS设为 ‘omit’; - 若
JS_WEBLABELS设为默认值 ‘generate’,会在JS_WEBLABELS_FILE指定的路径生成标签页(默认文件名为js_licenses.html),并在所有 HTML 输出文件中添加指向该页面的链接; - 若
JS_WEBLABELS设为 ‘reference’,则仅在输出文件中链接到JS_WEBLABELS_FILE指定的标签文件,而不会生成新的标签文件。此设置适用于你为包含该手册的大型网站单独维护一个统一许可标签文件的场景。
当设置了 INFO_JS_DIR (启用 JavaScript 浏览接口),或将 HTML_MATH 设为‘mathjax’(使用 MathJax 渲染数学公式,参见 MathJax 脚本相关说明)时,系统将会生成上述许可协议标签文件。
22.8.9. HTML 定制变量清单
本表列出适用于 HTML 输出的所有自定义变量。
AFTER_BODY_OPEN- 在每个 HTML 文件开头插入的文本;默认为未设置。
AFTER_SHORT_TOC_LINESAFTER_TOC_LINES若设置,前者在简短目录之后输出,后者在完整目录之后输出;否则使用默认字符串。撰写本文档时,默认是闭合一个
</div>元素。一般情况下,如果设置了
AFTER_SHORT_TOC_LINES,你也应当设置BEFORE_SHORT_TOC_LINES;如果设置了AFTER_TOC_LINES,你也应当设置BEFORE_TOC_LINES。BASEFILENAME_LENGTH- 基础文件名的最大长度;默认为 245。修改此值会使跨手册引用超长节点名失效(参见 HTML 交叉引用链接基础)。
BEFORE_SHORT_TOC_LINESBEFORE_TOC_LINES若设置,前者在简短目录之前输出,后者在完整目录之前输出;否则使用默认字符串。撰写本文档时,默认是开启一个
<div ...>元素。通常,若设置了
BEFORE_SHORT_TOC_LINES,也应设置AFTER_SHORT_TOC_LINES;若设置了BEFORE_TOC_LINES,也应设置AFTER_TOC_LINES。BIG_RULE- 用于顶层元素前后、特殊元素之前的分隔线,但不用于页眉页脚;默认为
<hr>。 BODY_ELEMENT_ATTRIBUTES<body>标签的属性文本。默认会将 HTMLlang属性设为文档语言(参见@documentlanguagell[ _cc ]: 设置文档语言)。CASE_INSENSITIVE_FILENAMES- 按文件系统不区分大小写的方式构建输出文件名(参见 HTML 拆分);默认为 false。
CHAPTER_HEADER_LEVEL- 章节级结构化命令所使用的标题格式化级别;默认为 2。
CHECK_HTMLXREF- 检查作为外部交叉引用目标的手册(见四参数与五参数
@xref)是否存在于htmlxref.cnf或htmlxref.d/*.cnf中(参见 HTML 交叉引用配置);默认为 true。 CONTENTS_OUTPUT_LOCATION- 设为
after_top:在@top节末尾输出目录。设为 ‘inline’:在@contents等命令所在位置直接输出目录。设为separate_element:将目录放在独立元素中,未拆分则在文档末尾,已拆分则在单独文件。设为after_title:在标题之后输出目录。默认为after_top。 CONVERT_TO_LATEX_IN_MATH- 若设置,在将
@math和@displaymath转为 HTML 前,先尝试将其中的 Texinfo @-命令 转为 LaTeX。默认为undef。若未定义,则在设置HTML_MATH时自动启用。 COPIABLE_LINKS- 如果设置此选项,将为定义命令(参见定义命令)、表格命令(参见制作双列表格)中定义索引条目的位置,以及标题生成可复制的链接。当你将鼠标指针悬停在标题文本上时,会显示一个 ‘¶’ 符号作为链接标识。
DATE_IN_HEADER- 在页眉中显示文档生成日期;默认关闭。
DEF_TABLE- 若设置,
@deffn等命令使用<table>结构(更接近 TeX 输出),而非定义列表;默认为 false。 DEFAULT_RULE- 用于普通元素之间的分隔线,不用于顶层元素前后、特殊元素前,也用于页眉页脚;默认为
<hr>。 DO_ABOUT- 设为 0:从不生成 About 特殊元素;设为 1:始终生成;默认为 0。
EPUB_CREATE_CONTAINER_FILE- 设为 0:不生成 EPUB 输出文件;默认为 1。
EPUB_KEEP_CONTAINER_FOLDER- 若设置,保留 EPUB 所需的目录与文件结构。EPUB 是该目录的 ZIP 包。默认未定义。若设置了 TEST 或 DEBUG 且未定义,则自动启用。见容器目录与输出文件
EXTERNAL_CROSSREF_SPLIT- 对其他手册的交叉引用,决定目标手册视为已拆分还是整体输出。默认根据
SPLIT值决定。见HTML Cross-references,见HTML 交叉引用配置文件:htmlxref.cnf EXTERNAL_DIR- 外部手册的基础目录;默认为无。建议使用通用的外部交叉引用机制(参见 HTML 交叉引用配置:
htmlxref.cnf),而非此变量。 EXTERNAL_CROSSREF_EXTENSION- 外部手册交叉引用的文件扩展名;未设置则根据
EXTENSION决定。 EXTRA_HEAD- 在
<head>内追加的文本;默认为未设置。 FOOTNOTE_END_HEADER_LEVEL- 脚注样式为 ‘end’ 时,脚注标题的格式化级别;默认为 4。见脚注样式
FOOTNOTE_SEPARATE_HEADER_LEVEL- 脚注样式为 ‘separate’ 时,脚注标题的格式化级别;默认为 4。见脚注样式
HEADER_IN_TABLE- 使用表格而非简单
<div>格式化页眉;默认为 false。 HIGHLIGHT_SYNTAX- 如果设置该选项,以语言信息作为第一个参数的
@example代码块会在 HTML 输出中进行语法高亮。你也可以通过HIGHLIGHT_SYNTAX_DEFAULT_LANGUAGE来指定默认的高亮语言。语法高亮需要依赖外部程序来生成高亮后的 HTML。HIGHLIGHT_SYNTAX变量用于选择具体的外部程序:highlight、pygments。其他任意值均代表source-highlight(详见《HTML 中的代码示例语法高亮》一节)。 HIGHLIGHT_SYNTAX_DEFAULT_LANGUAGE- 在没有语言信息时,用于语法高亮的默认语言。
HTML_MATH- 用于渲染
@math的方法(参见《数学相关的 HTML 定制》)。可以不设置,或设为 ‘mathjax’(参见 MathJax 定制变量)、‘l2h’(使用latex2html,参见latex2html定制变量)、 ‘t4h’ (使用tex4ht,参见tex4ht定制变量)。默认情况下,设置HTML_MATH也会同时设置CONVERT_TO_LATEX_IN_MATH。 HTML_ROOT_ELEMENT_ATTRIBUTES- 将该字符串用于 HTML 文档根元素
<html>。默认未定义。 HTMLXREF_FILE设置用于对其他手册进行交叉引用的文件名。若未定义,则使用
htmlxref.cnf(参见《HTML 交叉引用配置 》)。默认未定义。若设置了TEST,且HTMLXREF_MODE为默认值、HTMLXREF_FILE未定义,则不使用指向其他手册的交叉引用信息。若
HTMLXREF_MODE设为 ‘file’,则文件名直接作为信息来源。否则,会在多个目录中搜索该文件名,并使用所有找到的文件(参见 HTML 交叉引用配置)。这种情况下,htmlxref.d/*.cnf文件也会被一并使用。HTMLXREF_MODE- 指定如何确定对其他手册的交叉引用信息。设为 ‘none’,不使用任何信息。设为 ‘file’,从文件路径获取信息,默认是
htmlxref.cnf,或使用HTMLXREF_FILE的值。如果未定义(默认情况)或设为其他值,则在多个目录中搜索HTMLXREF_FILE所指的文件名以及htmlxref.d目录,并使用所有找到的HTMLXREF_FILE文件与htmlxref.d目录下所有.cnf后缀的文件(参见 HTML 交叉引用配置)。 ICONS- 在导航面板中使用图标;默认为 false。
IMAGE_LINK_PREFIX- 若设置,其值会加在图片文件链接的前面;默认未设置。
INDENTED_BLOCK_COMMANDS_IN_TABLE- 若设置,对缩进块命令使用表格进行缩进;默认为 false。
INDEX_ENTRY_COLON- 索引条目与对应节点或章节之间使用的符号;默认为空字符串。
INFO_JS_DIR(实验性。)为手册添加 JavaScript 浏览界面。该变量的值为存放此界面代码的目录。例如可运行:
texi2any --html -c INFO_JS_DIR=js manual.texi将文件放到输出目录下的 js 目录中。它会在网页浏览器中提供部分 Info 浏览器的功能,如键盘导航、索引查找。仅对非拆分的 HTML 输出生效。若 JavaScript 或浏览器功能不可用,界面应在功能上提供合理的降级方案。但使用此选项时请谨慎,避免导致部分用户难以访问文档。
IGNORE_REF_TO_TOP_NODE_UP- 忽略对
TOP_NODE_UP(顶层节点的上一级节点)的引用。 INLINE_CSS_STYLE- 将 CSS 直接写在 HTML 元素中,而非放在输出开头;默认为 false。
JS_WEBLABELSJS_WEBLABELS_FILE指定如何使用 JavaScript 许可 Web 标签页面,为手册 HTML 文件中用到的所有 JavaScript 提供许可信息与源码。(参见 https://www.gnu.org/licenses/javascript-labels.html)
值为 ‘generate’(默认):在
JS_WEBLABELS_FILE生成标签页面,并在 HTML 输出中链接到它。仅在实际引用 JavaScript 文件时才执行(HTML_MATH=mathjax,或启用实验性 JS 浏览界面即设置INFO_JS_DIR)。此模式下JS_WEBLABELS_FILE必须是相对文件名。值为 ‘reference’:在输出中链接到
JS_WEBLABELS_FILE指定的标签文件,不生成文件。适用于你为包含手册的大型网站单独维护统一标签文件的场景。值为 ‘omit’:既不生成也不链接标签文件。
MAX_HEADER_LEVEL- 使用的最大标题格式化级别(标题级别数字越大,对应章节层级越低);默认为 4。
MENU_ENTRY_COLON- 菜单条目与描述之间使用的符号;默认为 :。
MENU_SYMBOL- 当使用节点名格式化菜单条目时,在菜单条目前使用的符号;默认未定义:若未设置
USE_NUMERIC_ENTITY,则为•;若已设置,则为’。 MONOLITHIC- 只输出一个包含目录的文件。默认启用,但仅在输出不拆分时有效。
NO_CSS- 不使用 CSS;默认为 false。参见 HTML CSS。
NO_CUSTOM_HTML_ATTRIBUTE- 不在元素中输出带自定义属性的 HTML;默认为 false。
NO_NUMBER_FOOTNOTE_SYMBOL- 当
NUMBER_FOOTNOTES为 false 时,用于脚注的符号;默认为 *。 NODE_NAME_IN_INDEX- 若为 true,在索引条目中使用节点名;否则优先使用章节名。若未定义,在 HTML 中使用
USE_NODES的值。默认未定义。 NODE_NAME_IN_MENU- 若设置,在菜单条目中使用节点名;否则优先使用章节名;默认为 true。
PRE_BODY_CLOSE- 若设置,给定文本会出现在每个 HTML 文件的页脚;默认未设置。
PROGRAM_NAME_IN_ABOUT- 在输出 About 元素时使用。若设置,在 About 特殊元素中输出程序名及其他相关信息;默认为 false。
PROGRAM_NAME_IN_FOOTER- 若设置,在页面页脚中输出程序名及其他相关信息;默认为 false。
SECTION_NAME_IN_TITLE- 若设置,且输出为拆分模式,则在
<title>中使用章节结构化命令(如@chapter、@section)的参数,而非@node的参数。 SHORT_TOC_LINK_TO_TOC- 若设置,且输出了目录,则简短目录中的交叉引用会链接到对应目录条目;默认为 true。
SHOW_BUILTIN_CSS_RULES- 在标准输出中打印内置默认 CSS 规则并退出。
SHOW_TITLE- 若设置,在文档开头输出标题;默认为 undef。若设为 undef,设置
NO_TOP_NODE_OUTPUT也会同时为 HTML 设置SHOW_TITLE。 TEXI2HTML- 生成 HTML 并尽量与
texi2html兼容;默认为 false。 TOC_LINKS- 若设置,创建从标题到目录条目的链接;默认为 false。
TOP_FILE- 可用于顶层文件的文件名。必要时会自动设置合适的扩展名。用于覆盖默认值,通常仅在输出拆分且为 HTML 格式时生效。
TOP_NODE_FILE_TARGET- 交叉引用中顶层节点所使用的文件名;默认为
index.html。 TOP_NODE_UP_URL- 用于顶层节点 “向上” 引用的 URL;默认为
undef,此时不生成顶层向上引用。若设置了TOP_NODE_UP_URL且要覆盖 “向上” 指针名称,或用于其他格式,参见《多格式定制变量》中的TOP_NODE_UP。参见《HTML 文件名与链接定制》。关于顶层节点指针的更多信息,参见《第一个节点》。 USE_ACCESSKEY- 在交叉引用中使用
accesskey;默认为 true。 USE_ISO- 对成对单引号(见Inserting Quotation Marks)、
---和--(见General Syntactic Conventions)使用实体引用;默认为 true。 USE_LINKS- 在 HTML
<head>中生成<link>元素;默认为 true。 USE_NEXT_HEADING_FOR_LONE_NODE- 若设置,对于未关联章节命令、但在其他格式化内容前紧跟通常不与节点关联的命令(如
@heading)的孤立节点,不将节点名作为标题输出,假定后续命令已提供标题。默认为 true。 USE_NODE_DIRECTIONS- 若为 true,使用节点来决定节点头部中 “下一个 / 上一级 / 上一个” 链接的指向。若为 false,使用章节。若未定义,使用 USE_NODES 的值。默认未定义。注意:此设置只决定链接目标,不决定链接文字;链接文字定制参见 xrefautomaticsectiontitle。若节点与章节是系统关联的,此定制无实际效果。
USE_REL_REV- 在交叉引用中使用
rel;默认为 true。 USE_TITLEPAGE_FOR_TITLE- 使用完整的
@titlepage(或@maketitle生成的输出)作为标题,而非简单标题字符串;默认为 true。仅在SHOW_TITLE被设置时有效。 USE_XML_SYNTAX- 使用兼容 XML/XHTML 的语法。
VERTICAL_HEAD_NAVIGATION- 若设置,使用垂直导航面板;默认为 false。
WORDS_IN_PAGE- 当按节点拆分输出时,指定页面最小大致长度,达到该长度才会在页面底部显示导航面板。若要永远不在底部显示导航按钮,设为足够大的数值。默认值为 300。
XREF_USE_FLOAT_LABEL- 若设置,交叉引用中的浮动体名称使用浮动体标签,而非 “类型 + 编号”(参见
@float[ 类型 ][, 标签 ]: 浮动内容)。默认为关闭。 XREF_USE_NODE_NAME_ARG- 仅对不带交叉引用名(第二个参数)的交叉引用命令有效。设为 1:在交叉引用 @命令中,将节点名(第一个参数)作为超链接显示文本。设为 0:若
USE_NODES已设置则使用节点名,否则使用章节名。设为 ‘undef’:在预格式化环境中使用第一个参数,否则根据USE_NODES选择节点名或章节名。默认为 ‘undef’。
附录 A @-Command 细节
以下是 @-命令 的详细说明:包括命令语法、命令列表,以及命令可出现的位置信息。
A.1 @-Command 语法
Texinfo 包含以下几类 @-命令:
花括号命令
这类命令以
@开头,后跟字母或单词,再用花括号包裹参数。例如,@dfn用于标记术语的首次出现或定义,用法如下:‘在 Texinfo 中,@@-命令是 @dfn{标记} 命令。’行命令
这类命令独占一行。行首为 @,后跟命令名(单词),例如
@center或@cindex。若无参数,命令名后直接换行。若有参数,参数与命令名之间用空格分隔,不使用花括号。块命令
这类命令写在行首,后续为普通文本,最后以单独一行的匹配
@end 命令结束。例如:先写@example,接着是代码示例内容,最后以@end example收尾。部分块命令与行命令一样可带参数,例如@enumerate A开启一个环境,并用@end enumerate结束,其中 ‘A’ 就是参数。无参数符号插入命令
这类命令以 @ 开头,后跟单词,再跟一对空花括号 {},用于在文档中插入特殊符号,不带参数。示例:
@dots{}⇒ ‘…’ 、=@equiv{}= ⇒ ‘≡’ 、@TeX{}⇒ ‘TeX’ 、@bullet{}⇒ ‘•’。非字母命令
上述所有命令名都由字母构成(几乎全小写)。而非字母命令以 @ 开头,后跟标点符号或非拉丁字母字符。这类命令通常直接用在段落文本中,包括:
@@、@{、@}、@.、@SPACE以及大部分重音命令。杂项命令
少数命令无法归入以上类别。例如已废弃的
@refill,通常用在段落末尾、句点或其他标点之后,无参数、无需花括号。同理,@multitable块中的@tab也无参数、不带花括号。
由此可见,字母命令按参数语法分为不同类别。无法仅通过命令名外观判断其类别,但可根据命令含义区分:
- 若用于输出字形符号 → 第 4 类,无参数。
- 若用于段落内普通文本 → 第 1 类,必须带花括号参数。
- 非字母命令(如
@:)是例外,无需花括号。
为命令设计不同语法,目的是让 Texinfo 文件更易读,同时让 GNU Emacs 的段落与自动换行命令正常工作。
A.2 @-Command 列表
下面是按字母顺序排列的 Texinfo 以 @ 开头的命令列表。方括号 [] 表示可选参数;省略号 ‘…’ 表示可重复文本。
@whitespace- @ 后紧跟空格、制表符或换行符,会生成一个普通的、可伸缩的单词间空格。参见 “多个空格”。
@!- 生成用于结束句子的感叹号(通常用在句末大写字母之后)。参见 “结束句子”。
@"@'- 分别为下一个字符添加变音符号(分音符 umlaut )或锐音符、 重音符,如 ö、ó。参见 “插入重音符号”。
@&@ampchar{}- 生成 & 符号。参见 “使用
@&和@ampchar{}插入‘&’”。 @*- 强制换行。参见 “
@*和@/: 生成与允许换行”。 @,{c}- 为字符 c 添加变音符号(软音符号 cedilla ),如 ç。参见 “插入重音符号”。
@-- 插入一个可选断字点。参见 “
@-和@hyphenation: 打印输出中的断字”。 @.- 生成用于结束句子的句点(通常用在句末大写字母之后)。参见 “结束句子”。
@/- 不输出内容,但允许在此处换行。参见 “
@*和@/: 生成与允许换行”。 @:- 告知打印输出处理器,不要在紧邻的句点、问号、感叹号或冒号后插入额外空格。参见 “不表示句子结束”。
@=- 为下一个字符添加长音符号(macron / 上横线),如 ō。参见 “插入重音符号”。
@?- 生成用于结束句子的问号(通常用在句末大写字母之后)。参见 “结束句子”。
@@@atchar{}- 插入 ‘@’ 符号。参见 “使用
@&和@ampchar{}插入‘&’”。 @\@backslashchar{}- 插入反斜杠
\;@backslashchar{}可在任意位置使用,而@\仅在@math内部有效。参见 “使用@backslashchar{}插入‘\’” 以及 “@math和@displaymath: 数学公式排版”。 @^@`- 分别为下一个字符添加扬抑符(circumflex / 帽子音)或抑音符(grave / 重音符),如 ô、è。参见 “插入重音符号”。
@{@lbracechar{}- 插入左大括号 ‘{’。参见 “使用
@{、@}与@lbracechar{}、=@rbracechar{}= 插入‘{’、‘}’”。 @}@rbracechar{}- 插入右大括号 ‘}’。参见 “使用
@{、@}与@lbracechar{}、=@rbracechar{}= 插入‘{’、‘}’”。 @~- 为下一个字符添加波浪号(tilde),如 Ñ。参见 “插入重音符号”。
@AA{}@aa{}- 分别生成斯堪的纳维亚语带圈大写 A 和小写 a:Å、å。参见 “插入重音符号”。
@abbr{abbreviation}- 标记普通 abbreviation缩写 ,如 ‘Comput.’。参见 “
@abbr{abbreviation [, meaning ]}”。 @acronym{acronym}- 标记全大写的首字母缩写词,如 ‘NASA’。参见 “
@acronym{acronym [, meaning ]}”。 @AE{}@ae{}- 分别生成大写和小写连字 AE:Æ、æ。参见 “插入重音符号”。
@afivepaper- 将页面尺寸改为 A5。参见 “A4 纸张打印”。
@afourlatex@afourpaper@afourwide- 将页面尺寸改为 A4。参见 “A4 纸张打印”。
@aliasnew/=/existing- 将命令 ‘@new’ 设为已有命令 ‘@existing’ 的别名。参见 “
@aliasnew/=/existing ”。 @allowcodebreakstrue-false- 控制打印输出中在
-和_处是否允许断行。参见 “@allowcodebreaks: 控制@code中的换行”。 @anchor{name}- 将 name 定义为当前位置,用作交叉引用目标。参见 “
@anchor: 定义任意交叉引用目标”。 @appendixtitle- 开始一个 appendix附录 。标题会出现在目录中。参见 “
@unnumbered、@appendix: 其他标号方式的章节”。 @appendixsectitle@appendixsectiontitle- 在附录中开始一个附录节。节标题会出现在目录中。
@appendixsection是@appendixsec的长写法。参见 “@unnumberedsec、@appendixsec、@heading”。 @appendixsubsectitle- 开始一个附录子节。标题会出现在目录中。参见 “类
@subsection命令”。 @appendixsubsubsectitle- 开始一个附录子子节。标题会出现在目录中。参见 “
@subsubsection及其他子子级命令”。 @arrow{}- 生成右箭头符号:‘→’。默认用于
@click。参见 “点击序列”。 @asis- 原样保留内容。用在
@table、@ftable、@vtable之后,使表格第一列不加高亮(原样输出)。参见 “@asis”。 @authorauthor- 在标题页中设置手册作者。参见 “
@title、@subtitle和@author”。在@quotation中设置引用作者。参见 “@quotation: 块引用”。 @b{text}- 尽可能将文本设为粗体。参见 “打印用字体”。
@bullet{}- 生成大圆点 • 或最接近的符号。常与
@itemize配合使用。参见 “@bullet( • )”。 @bsixpaper- 将页面尺寸改为 B6。参见 “A4 纸张打印”。
@bye- 结束文件处理。处理器会忽略
@bye之后的所有内容。参见 “结束 Texinfo 文件”。 @ccomment- 在 Texinfo 中开始一行注释。该行剩余内容不会出现在任何输出中。是
@comment的别名。DEL也可开始注释。参见 “注释”。 @caption- 为
@float定义完整标题。参见 “@caption与@shortcaption”。 @cartouche- 尽可能用圆角方框框住示例或引文以突出显示。与
@end cartouche配对使用。参见 “@cartouche: 圆角矩形”。 @centerline-of-text- 将命令后的一行文本居中。参见 “
@titlefont、@center和@sp”。 @centerchapline-of-text- 类似
@chapter,但章标题居中。参见 “@chapter: 章节结构”。 @chapheadingtitle- 输出无编号的类章标题,但不列入目录。参见 “
@majorheading、@chapheading: 章级标题”。 @chaptertitle- 开始一个带编号的章节。章节标题会出现在目录中。参见 “
@chapter: 章节结构”。 @cindexentry- 向概念索引添加条目。参见 “定义索引条目”。
@cite{reference}- 突出显示没有对应 Info 文件的书籍或其他参考文献名称。参见 “
@cite{reference}”。 @clearflag- 取消设置 flag ,使 Texinfo 格式化命令不再处理后续成对
@ifsetflag 与@end ifset之间的文本,且@value{flag}不再展开为该 flag 对应的值。参见 “标记:@set、@clear、条件命令与@value”。 @click{}- 表示图形界面(GUI)中的一次单击。用于
@clicksequence内部。参见 “点击序列”。 @clicksequence{action @click {} action}- 表示图形界面(GUI)中的连续点击操作序列。参见 “点击序列”。
@clickstyle @cmd- 为每个
@click执行命令@cmd;默认为@arrow。@cmd后面通常省略空花括号。参见 “点击序列”。 @code{sample-code}- 标记表达式、程序中语法完整的记号,或程序名称。参见 “
@code{示例代码}”。 @codequotebacktickon-off@codequoteundirectedon-off- 控制代码示例中反引号 ` 和单引号 ' 的输出方式。参见 “插入引号字符”。
@comma{}- 插入逗号 ‘,’;仅当字面逗号会被当作参数分隔符时才需要使用。参见 “使用
@comma{}插入‘,’”。 @command{command-name}- 标记命令名称,例如
ls。参见 “@command{命令名}”。 @commentcomment- 在 Texinfo 中开始一行注释。该行剩余内容不会出现在任何输出中。是
@c的同义词。参见 “注释”。 @contents- 输出完整目录,或指定对于支持目录的格式应输出目录。参见 “生成目录”。
@copying- 指定文档的版权持有者与复制许可条件。与
@end copying配对使用。参见 “@copying: 声明复制权限”。 @copyright{}- 生成版权符号 ©。参见 “
@copyright{}(©)”。 @defblock- 开始一个包含定义的块。与
@end defblock配对使用。参见 “通用定义命令”。 @defcodeindexindex-name- 定义新索引及其索引命令。条目以
@code字体输出。参见 “定义新索引”。 @defcvcategory class name@defcvxcategory class name- 格式化面向对象编程中类相关变量的说明。接收三个参数:定义对象的类别、所属类、名称。参见 “定义命令”。
@deffncategory name arguments…@deffnxcategory name arguments…- 格式化函数、交互式命令或类似可带参数实体的说明。
@deffn的参数为:描述对象的类别、该实体名称、参数(可选)。参见 “定义命令”。 @defindexindex-name- 定义新索引及其索引命令。条目以罗马字体输出。参见 “定义新索引”。
@definfoenclosenewcmd, before, after- 为在线格式创建新命令
@newcmd,通过在文本前后添加字符串来标记文本。参见 “@definfoenclose: 自定义高亮”。 @defivarclass instance-variable-name@defivarxclass instance-variable-name- 格式化面向对象编程中实例变量的说明。等价于
@defcv {Instance Variable} …。参见 “定义命令”。 @deflinecategory name arguments…- 在
@defblock环境内部使用,为被定义符号提供标题原型行。该命令不创建索引条目。参见 “通用定义命令”。 @defmacmacroname arguments…@defmacxmacroname arguments…- 格式化宏的说明;等价于
@deffn Macro …。参见 “定义命令”。 @defmethodclass method-name arguments…@defmethodxclass method-name arguments…- 格式化面向对象编程中方法的说明;等价于
@defop Method …。参见 “定义命令”。 @defopcategory class name arguments…@defopxcategory class name arguments…- 格式化面向对象编程中操作的说明。参数为:操作类别、所属类、操作名、参数(可选)。参见 “定义命令” 与 “面向对象编程”。
@defoptoption-name@defoptxoption-name- 格式化用户选项的说明;等价于
@defvr {User Option} …。参见 “定义命令”。 @defspecspecial-form-name arguments…@defspecxspecial-form-name arguments…- 格式化 特殊形式(special form) 的说明;等价于
@deffn {Special Form} …。参见 “定义命令”。 @deftpcategory name-of-type attributes…@deftpxcategory name-of-type attributes…- 格式化数据类型的说明;参数为:类别、类型名(如 int)、该类型对象的属性名。参见 “定义命令” 与 “数据类型”。
@deftypecvcategory class data-type name@deftypecvxcategory class data-type name- 格式化面向对象编程中带类型的类变量的说明。参见 “定义命令” 与 “面向对象编程”。
@deftypefncategory data-type name arguments…@deftypefnxcategory data-type name arguments…- 格式化带类型、可带参数的函数或类似实体的说明。参数为:实体类别、类型、实体名、参数(可选)。参见 “定义命令”。
@deftypefnnewlineon-off- 指定
@deftypefn及类似命令的返回值类型是否单独成行;默认为关闭。参见 “带类型语言中的函数”。 @deftypefundata-type function-name arguments…@deftypefunxdata-type function-name arguments…- 格式化带类型语言中函数的说明。等价于
@deftypefn Function …。参见 “定义命令”。 @deftypeivarclass data-type variable-name@deftypeivarxclass data-type variable-name- 格式化面向对象编程中带类型的实例变量的说明。参见 “定义命令” 与 “面向对象编程”。
@deftypelinecategory data-type name arguments…- 在
@defblock环境内部使用,为带数据类型的被定义符号提供标题原型行。该命令不创建索引条目。参见 “通用定义命令”。 @deftypemethodclass data-type method-name arguments…@deftypemethodxclass data-type method-name arguments…- 格式化面向对象编程中带类型的方法的说明。参见 “定义命令”。
@deftypeopcategory class data-type name arguments…@deftypeopxcategory class data-type name arguments…- 格式化面向对象编程中带类型的操作的说明。参见 “定义命令” 与 “面向对象编程”。
@deftypevardata-type variable-name@deftypevarxdata-type variable-name- 格式化带类型语言中变量的说明。等价于
@deftypevr Variable …。参见 “定义命令”。 @deftypevrcategory data-type name@deftypevrxcategory data-type name- 格式化带类型语言中类变量实体的说明(用于记录值的实体)。参数为:实体类别、类型、实体名。参见 “定义命令”。
@defunfunction-name arguments…@defunxfunction-name arguments…- 格式化函数的说明;等价于
@deffn Function …。参见 “定义命令”。 @defvarvariable-name@defvarxvariable-name- 格式化变量的说明;等价于
@defvr Variable …。参见 “定义命令”。 @defvrcategory name@defvrxcategory name- 格式化任意类型变量的说明。
@defvr的参数为:实体类别、实体名称。参见 “定义命令”。 @detailmenu- 在主菜单中标记(可选的)详细节点列表。参见 “主菜单的组成部分”。
@dfn{term}- 标记术语的首次定义性使用。参见 “
@dfn{术语}”。 @DH{}@dh{}- 分别生成冰岛语大写 / 小写字母 ð(eth):Ð、ð。参见 “插入重音符号”。
@dircategorydirpart- 为手册指定一个目录分类。参见 “目录分类”。
@direntry- 开始为本文件编写 Info 目录菜单条目。与
@end direntry配对使用。参见 “安装 Info 目录文件”。 @display- 开始一个示例块。类似
@example(缩进文本、不自动换行),但不切换等宽字体。与@end display配对使用。参见 “@display: 使用正文字体的示例”。 @displaymath- 以 “独立公式” 格式排版数学块。参见 “
@math和@displaymath: 数学公式排版”。 @dmn{dimension}- 格式化度量单位,例如 12pt。参见 “
@dmn{尺寸}: 格式化度量单位”。 @docbook- 直接插入原生 DocBook 内容。与
@end docbook配对使用。参见 “原始格式化器命令”。 @documentdescription- 设置文档描述文本,会包含在 HTML 输出中。与
@end documentdescription配对使用。参见 “@documentdescription: 摘要文本”。 @documentencodingenc- 声明输入文件编码为 enc 。参见 “
@documentencodingenc: 设置输入编码”。 @documentinfo- 开启文档元数据块。需与
@end documentinfo配对使用。详见文档元数据与@maketitle命令。 @documentlanguageCC- 使用两位 ISO-639 缩写 CC 声明文档语言。参见 “
@documentlanguagell [ _cc ]: 设置文档语言”。 @dotaccent{c}- 在字符 c 上方生成点重音,如 ȯ。参见 “插入重音符号”。
@dotless{i-or-j}- 生成无点 i(‘ı’) 和无点 j(‘ȷ’)。参见 “插入重音符号”
@dots{}- 生成省略号 ‘…’。参见 “
@dots(…)和@enddots(…)”。 @email{address [, displayed-text]}- 标记电子邮件地址。参见 “
@email {邮箱地址 [, 显示文本]}”。 @emph{text}- 对文本进行强调。参见 “强调文本”。
@endenvironment- 结束环境块,例如
@end example。参见 “@-命令”。 @enddots{}- 生成句末型省略号
...。参见 “@dots(…)和@enddots(…)”。 @enumerate[ number-or-letter ]- 开始有序列表,每个条目用
@item。可指定起始编号 / 字母。与@end enumerate配对使用。参见 “@enumerate: 创建有序 / 字母列表”。 @env{environment-variable}- 标记环境变量名,例如 PATH。参见 “
@env{环境变量}”。 @equiv{}- 用符号 ‘≡’ 向读者表示两种形式完全等价。参见 “
@equiv{}(≡):表示等价”。 @error{}- 用符号 ‘error→’ 向读者提示后续文本是错误信息。参见 “
@error{}(error→):表示错误信息”。 @errormsg{msg}- 将 msg 作为错误输出到标准错误流,并异常退出。 msg 中的 Texinfo 命令会展开为纯文本。参见 “条件可见文本” 和 “外部宏处理器:行指令”。
@euro{}- 生成欧元符号 €。参见 “
@euro(€):欧元符号”。 @evenfooting [left] @| [center] @| [right]@evenheading [left] @| [center] @| [right]- 分别为偶数页(左页)指定页脚、页眉。参见 “如何自定义页眉页脚”。
@everyfooting [left] @| [center] @| [right]@everyheading [left] @| [center] @| [right]- 为所有页面指定页脚、页眉。对 Info 格式无效。参见 “如何自定义页眉页脚”。
@example- 开始示例块。文本缩进、不自动填充、使用等宽字体。与
@end example配对使用。@example接受以逗号分隔的可选参数,建议第一个参数设为示例代码的语言。参见 “@example: 示例文本”。 @exampleindentindent- 为示例类环境设置缩进空格数(可为 0)。参见 “
@exampleindent: 环境缩进”。 @exclamdown{}- 生成倒置感叹号 ¡。参见 “插入重音符号”。
@exdentline-of-text- 取消一行的所有缩进。参见 “
@exdent: 取消行缩进”。 @expansion{}- 用符号 ‘→’ 向读者表示宏展开结果。参见 “
@expansion{}(→):表示展开”。 @file{filename}- 高亮文件名、缓冲区、节点、目录等名称。参见 “
@file{文件名}”。 @finalout- 禁止 TeX 在超宽行旁边打印大黑框警告。参见 “Overfull hboxes”。
@findexentry- 向函数索引添加条目。参见 “定义索引条目”。
@firstparagraphindentword- 根据 word (none 或 insert)控制章节标题后第一段是否缩进。参见 “
@firstparagraphindent: 标题后缩进”。 @float- 用于定义浮动内容的环境。与
@end float配对使用。参见 “浮动体”。 @flushleft@flushright- 不对文本进行自动填充;对每行进行左对齐(右对齐),右侧(左侧)保持不齐平。字体保持不变。与
@end flushleft(@end flushright)配对使用。参见@flushleft和@flushright。 @fonttextsize10-11- 修改打印输出中正文字体大小。参见 “打印用字体”。
@footnote{text-of-footnote}- 插入脚注,用于对正文内容进行说明或补充。打印输出时脚注显示在页面底部;其他格式中,脚注可放在当前节点、单独节点,或仅标记为脚注文本。参见 “脚注”。
@footnotestylestyle- 指定脚注样式:end 表示放在末尾节点,separate 表示放在单独节点或文件。参见 “脚注样式”。
@format- 开始一种示例块。与
@display类似,但不缩进。与@end format配对使用。参见@example: 示例文本。 @frenchspacingon-off- 控制标点符号后的间距。参见
@frenchspacingval: 控制句子间距。 @ftableformatting-command- 开始双列表格,每个条目使用
@item。自动将第一列的每个条目加入函数索引。与@end ftable配对使用。除索引外与@table相同。参见@ftable和@vtable。 @geq{}- 生成大于等于符号 ‘≥’。参见
@geq(≥) 和@leq(≤): 插入关系符号。 @group- 禁止在后续文本内分页。与
@end group配对使用。在 Info 中忽略。参见@group: 防止分页。 @guillemetleft{}@guillemetright{}@guillemotleft{}@guillemotright{}@guilsinglleft{}@guilsinglright{}- 双角引号与单角引号:« » ‹ ›。
@guillemotleft和@guillemotright分别是@guillemetleft和@guillemetright的同义词。参见 “插入引号”。 @H{c}- 在字符 c 上方生成匈牙利语长元音变音符号,如 ő。
@hashchar{}- 插入井号 ‘#’;仅当字面 ‘#’ 会被解析为
#line指令时需要使用。参见 “使用@hashchar{}插入 ‘#’” 以及 “外部宏处理器:行指令”。 @headingtitle- 输出无编号的类小节标题,但不列入目录。参见
@unnumberedsec、@appendixsec、@heading。 @headingson-off-single-double- 开启或关闭页面页眉,并为打印指定单面 / 双面页眉。参见
@headings命令。 @headitem- 在多列表格(multitable)中开始表头行。参见 “多列表格行”。
@headitemfont{text}- 使用多列表格表头字体显示文本;主要用于多列表格模板。参见 “多列表格行”。
@html- 直接插入原生 HTML 内容。与 @end html 配对使用。参见 “原始格式化器命令”。
@hyphenation{hy-phen-a-ted words}- 显式定义单词的断字点。参见
@-和@hyphenation: 打印输出中的断字。 @i{text}- 尽可能将文本设为 italic font斜体 。参见 “打印用字体”。
@ifcleartxivar- 如果 Texinfo 变量 txivar 未被设置,则格式化后续文本。与
@end ifclear配对使用。参见 “标记:@set、@clear、条件命令与@value”。 @ifcommanddefinedtxicmd@ifcommandnotdefinedtxicmd- 如果 Texinfo 命令 ‘@txicmd’ 已定义(或未定义),则格式化后续文本。与对应的
@end ifcommand...配对使用。参见 “检测 Texinfo 命令:@ifcommanddefined、@ifcommandnotdefined”。 @ifdocbook@ifhtml@ifinfo@iflatex@ifplaintext@ifxml- 开始仅在指定输出格式中显示的内容。
@ifinfo内容会同时在 Info 和纯文本输出中显示(历史兼容)。分别与@end ifdocbook、@end ifhtml等配对使用。参见 “条件可见文本”。 @ifnotdocbook@ifnothtml@ifnotlatex@ifnotplaintext@ifnottex@ifnotxml- 开始在指定格式中不显示、其他格式中显示的内容。例如
@ifnothtml内容不会出现在 HTML 输出中。与对应的@end ifnotformat配对使用。参见 “条件可见文本”。 @ifnotinfo- 开始在除 Info 和纯文本外的输出中显示的内容。与
@end ifnotinfo配对使用。参见 “条件可见文本”。 @ifsettxivar- 如果 Texinfo 变量 txivar 已被设置,则格式化后续文本。与
@end ifset配对使用。参见 “标记:@set、@clear、条件命令与@value”。 @iftex- 开始仅在 TeX 输出中显示的内容。与
@end iftex配对使用。参见 “条件可见文本”。 @ignore- 开始不输出到任何格式的内容块。与
@end ignore配对使用。参见 “注释与忽略文本”。 @image{filename, [width], [height], [alt], [ext]}- 插入外部图片 filename文件 ,按指定 width宽height高 缩放,使用 alt替代文本 ;HTML 中会查找 filename.ext 。参见 “插入图片”。
@includefilename- 读取并插入 Texinfo 源文件 filename 的内容。参见 “包含文件”。
@indent- 插入段落缩进。参见
@indent: 强制缩进。 @indentedblock- 对任意文本块进行左侧缩进。与
@end indentedblock配对使用。参见@indentedblock: 缩进文本块。 @indicateurl{indicateurl}- 标记表示网址(URL)的文本。参见
@indicateurl{统一资源定位符}。 @inforef{node-name, [entry-name], info-file-name}- 对仅存在于 Info 文件、无打印版手册的内容创建交叉引用。参见
@inforef: 对仅 Info 内容的交叉引用。 @inlinefmt{fmt, text}- 仅当输出格式为 fmt 时才插入 text 。参见 “行内条件:
@inline、@inlineifelse、@inlineraw”。 @inlinefmtifelse{fmt, text, else-text}- 如果输出格式是 fmt ,则插入 text ,否则插入 else-text 。
@inlineifclear{var, text}@inlineifset{var, text}- 仅当 Texinfo 变量 var 未设置 / 已设置 时,才插入 text 。
@inlineraw{fmt, raw-text}- 仅当输出格式为 fmt 时,按原生条件格式插入文本。
\inputmacro-definitions-file- 使用指定的宏定义文件。该命令只能写在 Texinfo 文件第一行,用于让 TeX 加载 texinfo 宏定义文件。用
\而不是@,是因为 TeX 在读取宏定义文件之前还不识别@。参见 “Texinfo 文件头”。 @insertcopying- 插入之前用
@copying环境定义的文本。参见@insertcopying: 包含权限文本。 @item- 在
@itemize、@enumerate中标记列表项开始;在@table、@ftable、@vtable中表示第一列条目的内容开始。参见 “列表与表格”。 @itemizemark-generating-character-or-command- 开始无序列表:段落缩进,每项开头有符号(如
@bullet)。与@end itemize配对使用。参见@itemize: 创建项目列表。 @itemx- 用法类似
@item,但在条目上方不产生额外垂直间距。多个条目共用同一个描述时,第一个用@item,后面用@itemx。参见@itemx: 第二个及后续条目。 @kbd{keyboard-characters}- 标记需要用户输入的键盘字符。参见
@kbd{键盘字符}。 @kbdinputstylestyle- 指定
@kbd何时使用与@code不同的字体:code、distinct、example。参见@kbd{键盘字符}。 @key{key-name}- 标记键盘按键名称。参见
@key{按键名}。 @kindexentry- 向按键索引添加条目。参见 “定义索引条目”。
@L{}@l{}- 分别生成波兰语大写 / 小写字母 Ł、ł。
@LaTeX{}- 生成 LaTeX 标志。参见
@TeX{}(TeX) 和@LaTeX{}(LaTeX)。 @latex- 直接插入原生 LaTeX 内容。与
@end latex配对使用。参见 “原始格式化器命令”。 @leq{}- 生成小于等于符号 ‘≤’。参见
@geq(≥) 和@leq(≤):插入关系符号。 @linemacromacroname {params}- 定义一个行宏:将整行剩余内容作为参数,展开为完整行。参见 “行宏”。
@link{nodename, label, manual-name}- 创建无可见标记、无页码引用的纯链接。参见
@link: 纯朴素超链接。 @lisp- 开始 Lisp 代码示例块:文本缩进、不自动换行、使用等宽字体。与
@end lisp配对使用。参见@lisp: 标记 Lisp 示例。 @listoffloats- 生成类似目录的浮动体列表。参见
@listoffloats: 浮动体目录。 @lowersections- 降低章节层级:章变节、节变小节,依此类推。参见
@raisesections和@lowersections。 @macromacroname {params}- 定义新的 Texinfo 命令 @macroname{params} 。与
@end macro配对使用。参见 “定义宏”。 @maketitle- 生成标题页,可能还会生成后续页面。详见文档元数据与
@maketitle命令。 @majorheadingtitle- 输出无编号、类章节标题,不列入目录。标题前的垂直空白比
@chapheading更大。参见@majorheading、@chapheading: 章节级标题。 @math{mathematical-expression}- 排版数学表达式。参见 数学公式排版。
@menu- 标记节点菜单开始,打印手册中无效。与
@end menu配对使用。参见 “菜单”。 @microtypeon-off- 开启或关闭微排版(microtype)。参见 “微排版”。
@minus{}- 生成减号 −。参见
@minus(−):插入减号。 @multitablecolumn-width-spec- 开始多列表格。每行以
@item或@headitem开头,列用@tab分隔。与@end multitable配对使用。参见 “多列表格列宽”。 @needn- 如果当前页面剩余空间不足 n 密耳(千分之一英寸),则在打印手册中另起一页。参见
@needmils: 防止分页。 @nodename, [ next ], [ previous ], [ up ]- 开始新节点。只有第一个参数是必填的。参见 “编写
@node行”。 @nodedescriptionnode-description- 为节点提供简短用途说明。参见 “节点描述”。
@nodedescriptionblock- 用于开始较长的节点描述。与
@end nodedescriptionblock配对使用。参见 “节点描述”。 @noindent- 禁止文本像新段落一样自动缩进。参见
@noindent: 取消段落缩进。 @novalidate- 关闭节点引用校验,并让 TeX 不生成辅助文件。需在任何章节或交叉引用命令之前使用。参见 “指针校验”。
@O{}@o{}- 分别生成大写 / 小写带斜杠 O:Ø、ø。
@oddfooting[left] @| [center] @| [right]=@oddheading [left] @| [center] @| [right]- 分别为奇数页(右页)指定页脚 / 页眉。参见 “如何自定义页眉页脚”。
@OE{}@oe{}- 分别生成大写 / 小写连字 Œ、œ。参见 “插入重音符号”。
@ogonek{c}- 在下一字符下方生成尾音符(ogonek),如 ą。参见 “插入重音符号”。
@option{option-name}- 标记命令行选项,如
-l或--help。参见@option{选项名}。 @ordf{}@ordm{}- 分别生成西班牙语阴性、阳性序数符号 ª、º。参见 “插入重音符号”。
@page- 在打印手册中强制另起一页。参见
@page: 开始新页面。 @pagesizes [width][, height]- 修改页面尺寸。参见 pagesizes。
@paragraphindentindent- 设置段落缩进为 indent 个空格(可为 0);若为
asis则保留源文件缩进。参见@paragraphindent: 控制段落缩进。 @parttitle- 开始一组章节或附录;会出现在目录中。参见
@part: 章节分组。 @pindexentry- 向程序索引添加条目。参见 “定义索引条目”。
@publication- 开始定义文档的出版相关信息。需与
@end publication成对使用。参见 “文档元数据与@maketitle命令”。 @point{}- 用符号 ‘∗’ 向读者标示缓冲区中的光标位置。参见
@point{}(*):标示缓冲区光标位置。 @pounds{}- 生成英镑符号 £。参见
@pounds(£):英镑符号。 @print{}- 用符号 ‘⊣’ 向读者标示打印输出内容。参见
@print{}(-|):标示生成的输出。 @printindexindex-name- 生成指定名称的索引。参见 “打印索引与菜单”。
@pxref{node, [entry], [node-title], [info-file], [printed-manual]}- 用于括号内的引用,打印手册中以小写 ‘see’ 开头。第一个参数为必选,引用整本手册除外。引用整本手册时只需提供手册名 / Info 文件名。参见
@pxref。 @questiondown{}- 生成倒置问号 ¿。参见 “插入重音符号”。
@quotation- 缩小边距以表示引自其他作品的文本。可指定前缀文本。与
@end quotation配对使用。参见@quotation: 块引用。 @quotedblleft{}@quotedblright{}@quoteleft{}@quoteright{}@quotedblbase{}@quotesinglbase{}- 生成各类引号:“” ‘ ’ „ ‚。参见 “插入引号”。
@r{text}- 尽可能将 text文本 设为标准罗马字体。参见 “打印用字体”。
@raggedright- 自动填充文本;左对齐,右侧不齐平。字体保持不变。与
@end raggedright配对使用。参见@raggedright: 右不齐平文本。 @raisesections- 提升后续章节层级:小节变节、节变章,依此类推。参见 “提升 / 降低章节层级:
@raisesections和@lowersections”。 @ref{node, [entry], [node-title], [info-file], [printed-manual]}- 创建不带引导文字的普通引用,命令后直接跟标点。第一个参数为必选,引用整本手册除外。引用整本手册时只需提供 printed-manual(手册名) 或 info-file(Info 文件名) 。参见
@ref。 @registeredsymbol{}- 生成注册商标符号 ®。参见
@registeredsymbol{}(®)。 @result{}- 用符号 ⇒ 向读者标示表达式结果。参见
@result{}(⇒):表达式结果。 @ringaccent{c}- 在下一字符上方生成圈号重音,如 o̊。参见 “插入重音符号”。
@samp{text}- 标记字符序列的字面示例。参见
@samp{text}。 @sansserif{text}- 尽可能将文本设为无衬线字体。参见 “打印用字体”。
@sc{text}- 尽可能将文本设为小型大写字母,Info 中显示为全大写。参见
@sc{text}: 小型大写字体。 @sectiontitle- 在章内开始一节。节标题会出现在目录中。在
@chapter和@appendix内带编号,在@unnumbered内不带编号。参见@section: 章内的节。 @seealso{index-text}- 用于索引条目,引导读者查看另一个相关索引项。参见 “高级索引命令”。
@seeentry{index-text}- 用于索引条目,将读者重定向到另一索引项。参见 “高级索引命令”。
@settxivar [ string ]- 定义 Texinfo 变量 txivar ,可设为字符串值。参见 “标记:
@set、@clear、条件命令与@value”。 @setchapternewpageon-off-odd- 指定章节是否从新页开始,若是,是否从奇数页(右页)开始。参见
@setchapternewpage: 章节前的空白页。 @setfilenameinfo-file-name- 指定输出文件名称。TeX 格式化时忽略此命令。参见
@setfilename: 设置输出文件名。 @settitletitle- 指定打印手册的页面页眉标题,以及 HTML 的默认文档标题。参见
@settitle: 设置文档标题。 @shortcaption- 为浮动体定义简短标题。参见
@caption&@shortcaption。 @shortcontents- 输出仅含章级条目的简短目录,或指定输出简短目录。适用于支持短目录的格式。参见 “生成目录”。
@shorttitlepagetitle- 生成最简标题页。参见
@titlepage。 @slanted{text}- 尽可能将文本设为倾斜字体。参见 “打印用字体”。
@smallbook- 打印输出使用 7×9.25 英寸格式,而非标准 8.5×11 英寸。参见
@smallbook: 小尺寸书籍打印。 @smalldisplay- 开始一类示例块。类似
@display,但尽可能使用更小字号。与@end smalldisplay配对使用。参见@small…块命令。 @smallexample- 开始示例块。类似
@example,但尽可能使用更小字号。与@end smallexample配对使用。参见@small…块命令。 @smallformat- 开始一类示例块。类似
@format,但尽可能使用更小字号。与@end smallformat配对使用。参见@small…块命令。 @smallindentedblock- 类似
@indentedblock,但尽可能使用更小字号。与@end smallindentedblock配对使用。参见@small…块命令。 @smalllisp- 开始 Lisp 代码示例。与
@smallexample相同。与@end smalllisp配对使用。参见@small…块命令。 @smallquotation- 类似
@quotation,但尽可能使用更小字号。与@end smallquotation配对使用。参见@small…块命令。 @sortas{key}- 用于索引命令参数中,指定索引条目用于排序的字符串。参见 “定义索引条目”。
@spn- 跳过 n 行空白行。参见
@spn: 插入空白行。 @ss{}- 生成德语尖锐 S 字母 ß。参见 “插入重音符号”。
@strong{text}- 比
@emph更强的强调。参见 “强调文本”。 @sub{text}- 将文本设为下标。参见
@sub和@sup: 插入下标与上标。 @subentry- 用于索引条目,分隔多级索引的层级。参见 “高级索引命令”。
@subheadingtitle- 输出无编号的类二级小节标题,不列入打印手册目录。参见 “类
@subsection命令”。 @subsectiontitle- 在节内开始二级小节。标题会出现在目录中。编号规则同
@section。参见@subsection: 节内的二级小节。 @subsubheadingtitle- 输出无编号的类三级小节标题,不列入打印手册目录。参见
@subsubsection及其他子子级命令。 @subsubsectiontitle- 在二级小节内开始三级小节。标题会出现在目录中。编号规则同
@section。参见@subsubsection及其他子子级命令。 @subtitletitle- 设置标题页的副标题。参见
@title、@subtitle和@author。 @summarycontents- 输出或指定简短目录。是
@shortcontents的同义词。参见 “生成目录”。 @sup{text}- 将文本设为上标。参见
@sub和@sup: 插入下标与上标。 @syncodeindexfrom-index to-index- 将第一个参数指定的索引合并到第二个参数的索引中,原索引条目使用
@code字体显示。参见 “合并索引”。 @synindexfrom-index to-index- 将第一个参数指定的索引合并到第二个参数的索引中,不改变原索引条目的字体。参见 “合并索引”。
@t{text}- 尽可能将文本设为等宽打字机字体。参见 “打印用字体”。
@tab- 在多列表格(multitable)的一行中分隔列。参见 “多列表格行”。
@tableformatting-command- 开始双列表格(描述列表),每条目使用
@item。第一列条目与@item写在同一行,以 formatting-command 指定的字体显示。与@end table配对使用。参见 “创建双列表格”。另见@ftable、@vtable及@itemx: 第二个及后续条目。 @TeX{}- 生成 TeX 标志。参见
@TeX{}(TeX) 和@LaTeX{}(LaTeX)。 @tex- 直接插入原生 TeX 内容。与
@end tex配对使用。参见 “原始格式化器命令”。 @textdegree{}- 生成度数符号 °。参见
@textdegree(°):度数符号。 @thischapter@thischaptername@thischapternum@thissection@thissectionname@thissectionnum@thisfile@thispage@thistitle- 仅允许在页眉或页脚中使用。它们分别代表:当前章节的编号与名称(格式为「Chapter 1: 标题」)、仅当前章节名称、仅当前章节编号、当前小节的编号与名称、仅当前小节名称、仅当前小节编号、当前部分名称、文件名、当前页码,以及文档标题。参见「如何自定义页眉页脚」。
@TH{}@th{}- 分别生成冰岛语大写 / 小写字母 Þ、þ。参见 “插入重音符号”。
@tie{}- 生成一个普通但不可换行的单词间空格。参见
@tie{}: 插入不可换行空格。 @tieaccent{cc}- 在连续两个字符 cc 上方生成连音符(双字符连音),如 o͡o。参见 “插入重音符号”。
@tindexentry- 向数据类型索引添加条目。参见 “定义索引条目”。
@titletitle- 设置标题页的主标题。参见
@title、@subtitle和@author。 @titlefont{text}- 尽可能以大于正文字号显示文本。参见
@titlefont、@center和@sp。 @titlepage- 开始标题页。单独一行书写,与
@end titlepage配对使用。在线格式默认不输出标题页。参见@titlepage。 @today{}- 插入当前日期,格式为「1 Jan 1900」。参见 “如何自定义页眉页脚”。
@toptitle- 标记文件中的顶层节点,节点定义必须紧跟在
@top命令上一行。标题按章级标题格式化。在 TeX 中,@top只是@unnumbered的别名。 @U{hex}- 输出 Unicode 字符
U+hex的表示形式。参见 “插入 Unicode:@U”。 @u{c}@ubaraccent{c}@udotaccent{c}- 分别在字符 c 上方 / 下方生成短音符、下横线、下点音,如 ŏ、o̲、ọ。参见 “插入重音符号”。
@unmacromacroname- 取消已定义的宏
@macroname。参见 “定义宏”。 @unnumberedtitle- 开始无编号章节,标题出现在目录中。参见
@unnumbered、@appendix: 其他标号方式的章节。 @unnumberedsectitle- 开始无编号节,标题出现在目录中。参见
@unnumberedsec、@appendixsec、@heading。 @unnumberedsubsectitle- 开始无编号二级小节,标题出现在目录中。参见 “类
@subsection命令”。 @unnumberedsubsubsectitle- 开始无编号三级小节,标题出现在目录中。参见
@subsubsection及其他子子级命令。 @uref{url [, displayed-text][, replacement]}@url {url [, displayed-text][, replacement]}- 定义指向外部 URL(如网页)的交叉引用。参见
@url、@uref{url[, text][, replacement]}。 @urefbreakstylestyle- 指定
@uref/@url在特殊字符处的换行方式:after(之后)、before(之前)、none(不换行)。参见@url、@uref{url[, text][, replacement]}。 @v{c}- 在字符 c 上方生成ˇ 音调符号,如 ǒ。参见 “插入重音符号”。
@value{txivar}- 插入之前用
@set定义的 Texinfo 变量 txivar 的值(如有)。参见 “标记:@set、@clear、条件命令与@value”。 @var{metasyntactic-variable}- 标记元语法变量(表示某段文本的占位符)。参见
@var{元语法变量}。 @verb{delim literal delim}- 以等宽字体原样输出字面量文本,用单个字符 delim 作为分隔符,保留所有空格与 Texinfo 特殊字符。参见
@verb{chartextchar}。 @verbatim- 以等宽字体原样输出环境内文本。与
@end verbatim配对使用。参见@verbatim: 纯文本原样输出。 @verbatimincludefilename- 原样插入文件 filename 的内容(等宽字体)。参见
@verbatimincludefile: 原样包含文件。 @vindexentry- 向变量索引添加条目。参见 “定义索引条目”。
@vskipamount- 在打印手册中插入垂直空白,将本页剩余内容推向页面底部。常用于版权页,参数通常写 ‘0pt plus 1filll’(注意三个 l)。参见 “版权页”。
@vtableformatting-command- 开始双列表格,每条目使用
@item。自动将第一列的每个条目加入变量索引。与@end vtable配对使用。除索引外与@table相同。参见@ftable和@vtable。 @w{text}- 禁止文本内部换行。参见
@w{text}: 禁止换行。 @xml- 直接插入原生 XML 内容。与
@end xml配对使用。参见 “原始格式化器命令”。 @xref{node, [entry], [node-title], [info-file], [printed-manual]}- 创建引用,打印手册中以 ‘See’ 开头,命令后直接跟标点。第一个参数为必选,引用整本手册除外。引用整本手册时只需提供手册名 / Info 文件名。参见
@xref。 @xrefautomaticsectiontitleon-off- 默认情况下,交叉引用中使用节标题而非节点名(包括 HTML 的节点头部)。参见 “带三个参数的
@xref”。 @xrefnamexref-name- 在
xrefautomaticsectiontitle开启时,紧跟在@node行后使用,用于提供指向该节点的链接文本,且不会输出标题。参见「非结构化节点」。
A.3 @-Command 上下文
本节大致说明哪些 @-命令 可以用在哪些上下文中。内容并非完全详尽,也不旨在作为完整参考。如果此处信息与 Texinfo 处理器的实际实现存在不一致, 以处理器实现为准 。
下文所说的 普通文本 ,指除章节结构类及其他顶层文档命令之外的任何内容,例如 @section 、 @node 、 @setfilename 等。
@c 、 @comment 以及 @if ... @end if 条件命令可以出现在任何位置(但条件命令仍必须单独成行)。 @caption 和 @shortcaption 只能出现在 @float 中,但内部可以包含普通文本。 @footnote 的内容也是如此。
带大括号标记文本的 @-命令(如 @strong 、 @sc 、 @asis )可以包含原始格式化器命令,如 @html ,不能包含其他块命令(以 @end 结束的命令)、不能跨段落拆分、除此之外可以包含普通文本。
除块命令限制外,在 @center 、 @exdent 以及 @table 中的 @item 行上, 不接受仅在段落内有意义的命令 ,例如 @indent 。
除此之外, 章节结构命令不能包含 @anchor 、 @footnote 或 @verb 。
除此之外,其余命令( @node 、 @anchor 、 @printindex 、 @ref 、 @math 、 @cindex 、 @url 、 @image 等) 不能包含交叉引用命令 ( @ref 、 @xref 、 @pxref 、 @inforef )。
如需精确完整的信息,建议查看源码中的测试套件,它会穷尽测试各种组合。
A.4 废弃的 @-Commmands
以下是 Texinfo 中已废弃或已完全移除的 @-命令。本节仅作历史说明用途。
@refill- 该命令过去用于在所有其他处理完成后,重新整理并缩进段落。现在已不再需要,因为所有格式化工具都会按需自动重排,但你在一些旧手册源码中仍可能见到它,因为它不会造成问题。
@setcontentsaftertitlepage- 过去,目录命令有时会放在文件末尾、各类索引之后、
@bye之前,但现已不推荐这样做。用户打印手册时可使用该命令,强制将目录打印在标题页之后(@end titlepage行之后),即使@contents命令位于手册末尾。 @setshortcontentsaftertitlepage- 即使
@shortcontents命令位于文件末尾,该命令也会将简短目录放在@end titlepage命令之后。
附录 B 技巧与提示
编写 GNU 手册的作者应当参阅《GNU 编码标准》中的 “GNU 手册” 部分。下面是编写 Texinfo 文档的其他一些技巧:
- 用现在时写作,不用过去时或将来时。
- 用主动语态!例如,写 “We recommend that …”(我们建议……),而不是 “It is recommended that …”(建议……)。
- 尽可能把手册设计成可以顺序阅读的形式。读者会厌烦来回翻页查找本该按需直接呈现的信息。
- 将自动换行列宽设为 70 或 72。太长的行难以阅读。
- 包含版权声明与复制许可。
索引、索引、还是索引!
- 用多种方式编写大量索引项。可以在写正文时同步写索引,也可以写完正文后再补。
- 只在某个主题被重点讨论的地方添加索引项。例如,在 “报告 bug” 一章里为 “调试信息” 建索引没有意义,想了解调试信息的人绝不会在那一章里找。
指向整个节的索引命令,紧跟在节命令之后;指向某一段落的索引命令,放在该段落之前。这样,跨页的段落,索引项会指向段落的第一页。下面示例中,索引项 “Leaping”(跳跃)后有一空行:
@section The Dog and the Fox @cindex Jumping, in general @cindex Leaping @cindex Dog, lazy, jumped over @cindex Lazy dog jumped over @cindex Fox, jumps over dog @cindex Quick fox jumps over dog The quick brown fox jumps over the lazy dog.(注意示例中对同一概念用不同写法建立索引:‘Lazy dog’ 和 ‘Dog, lazy’,方便读者用不同方式查找。)
- 概念索引项的首字母统一大写或统一小写。简短条目常用小写,较长条目常用大写。无论选择哪种风格,请保持一致!混用会显得很不专业。
- 索引中需要规范大写的词(如国家名、缩写)务必大写;对大小写敏感的名称(如 C 或 Lisp 中的标识符)要使用正确大小写。
完整短语
完整短语比残缺片段更易阅读……
- 列表中的条目写成完整句子,至少是完整短语。不完整的表达…… 会很别扭…… 像这样。
- 多条目列表或表格的引导句 / 引导短语要写成完整表达。不要写 “You can set:”(你可以设置:),而写 “You can set these variables:”(你可以设置以下变量:)。前者显得话没说完。
引入新术语
引入新术语时,要让不了解的读者能从上下文理解,或者为术语给出定义。
例如,下面句子中 “check in”、“register”、“delta” 都是首次出现,应改写使其易懂:
The major function assists you in checking in a file to your version control system and registering successive sets of changes to it as deltas. 该主函数帮助你将文件签入版本控制系统,并将 successive sets of changes 注册为 delta。
- 使用
@dfn命令包裹首次引入的词汇,用以表明读者此前并不需要知晓该词含义,而是将从本段文字中学习其含义。
反面示例
应避免的不规范写法:
When you are done editing the file, you must perform a @dfn{check in}.
改为:
… you must @dfn{check in} the new version.
这样更通顺。
SCCS, RCS and other version-control systems all perform similar functions in broadly similar ways
(it is this resemblance which makes a unified control mode like this possible).
改为:
… makes a unified interface such as VC mode possible.
句号放在引号外
句号等标点放在引号外面,除非标点本身就是引文的一部分。这与美国部分出版惯例不同,但能让读者清晰区分引文内容与整句。
例如,句号应放在右引号外:
Evidently, ‘au’ is an abbreviation for ``author''.
因为 ‘au’ 并不是 ‘author.’(带句点)的缩写。
空行
- 节命令与后面第一句 / 段落之间,或节相关的索引命令与正文之间,插入空行(如前面索引技巧所示),让源码更易读。
@table命令之前和@end table之后必须空行;@table命令之后不要空行。示例:Types of fox: @table @samp @item Quick Jump over lazy dogs. @item Brown Also jump over lazy dogs. @end table @noindent On the other hand, ...
@itemize ... @end itemize、@enumerate ... @end enumerate同理,前后空行。
空格
不要用空格来排版 Texinfo 文件,除非在 @example … @end example 等字面环境内部。
例如 TeX 会把下面这种对齐排版:
@kbd{C-x v}
@kbd{M-x vc-next-action}
Perform the next logical operation
on the version-controlled file
corresponding to the current buffer.
所以最终显示效果如下:
‘C‑x v’ ‘M‑x vc‑next‑action’ Perform the next logical operation on the version‑controlled file corresponding to the current buffer.
在这种情况下,应当使用 @table 、 @item 和 @itemx 对文本进行格式化,以生成表格。
@code、@samp、@var 与长破折号---
Lisp 符号(包括命令名)用
@code包裹:The main function is @code{vc-next-action}, ...
- 避免在
@code后直接加字母(如 s),效果很难看。 - 元变量用
@var包裹,不要再加尖括号。 - 连续三个连字符 ‘—’ 表示长破折号。Info 格式化器会把三个减号缩成两个;其他输出格式会正常显示长破折号。
程序调用节点
可以从 Shell 调用 Emacs、GCC、gawk 等程序。每个程序的文档都应有一节说明用法。
为方便用户查找,约定这类节的标题以 Invoking 开头,如 “Invoking Emacs”。
C 函数
用 @example 描述 C 函数调用规范时,使用 ANSI C 语法:
void dld_init (char *@var{path});
后续讨论中,用相同参数名并以 @var 高亮。
尽量不要在声明上方写 #include 来表示函数来自某个头文件,以免误导读者。应明确说明声明所在的头文件,或在节开头统一说明一组函数所用的头文件。
节点长度
节点(节)长度保持合理。长节点大胆拆分为子节点,形成清晰的树形结构 —— 这正是 Texinfo 设计的目的。读者通常会用搜索、索引或猜测定位单点信息,而非从头读到尾。
可以用 texi-elements-by-size 工具(在 Texinfo 源码的 util/ 目录下)按行数 / 单词数列出所有节点,找出需要拆分的候选。
大小写规范
- Texinfo 首字母大写,x 和 i 小写。
- Info 首字母大写。
- TeX 用命令
@TeX{}输出(注意大写 T 和 X),按其作者 Donald Knuth 的规范排版;LaTeX 用@LaTeX{}。
最后一点
在 Texinfo 文件的 @bye 之后,可以写给自己看的备注。所有处理器都会忽略 @bye 之后的内容,效果等同于 @ignore … @end ignore 。
附录 C Texinfo 示例文件
C.1 GNU 示例文本
下面是一份完整的 Texinfo 示例文档 ,其中包含应在 GNU 手册中使用的完整文本(可根据需要调整)。
除了法律文本外,本文档还作为一个实用示例,展示 GNU 系统中的许多组件会如何影响手册的编写。如果你尚不熟悉所有这些不同组件,不必担心 —— 它们不是必需的 ,即使不使用它们,也可以写出非常完善的手册。这里仍然将其包含进来,是因为很多手册确实(或可以)从中受益。
有关最简 Texinfo 文件示例,请参见简短示例。
以下是关于本示例的说明:
@include命令引入的version.texi由 Automake 自动维护(参见 GNU Automake 中的 Texinfo 相关内容)。它会设置在其他地方使用的 VERSION、UPDATED 和 UPDATED-MONTH 等值。如果你的发行版不使用 Automake,但使用 Emacs,可以使用time-stamp.el包(参见《GNU Emacs 手册》中的时间戳相关内容)。@syncodeindex命令体现了一项建议:尽可能只使用一个索引,以便读者更方便地查阅索引条目。@dircategory用于为手册指定一个分类,用于构建 Info 目录。有关推荐的分类名称列表,请参见目录分类;另请参见安装 Info 目录文件。- Invoking(调用)节点是 GNU 标准约定,用于帮助用户查找指定程序的命令行使用基础信息。参见《GNU 编码标准》中的手册结构详情。
- 本示例展示了如何使用
@include命令在手册中包含 FDL(GNU 自由文档许可证)。fdl.texi文件可在 Texinfo 及其他 GNU 源码发行版中获取,也可在 GNU 官网(https://www.gnu.org/licenses/fdl-1.3.html)获取,同时附有使用说明。 - 如果版权持有者不是 FSF,请使用相应的版权持有者名称。
- 对于表达个人观点、感受或经历的文档,更适合使用只允许原样复制的许可证,而非 FDL。参见原样复制许可。
以下是示例文档:
\input texinfo @c -*-texinfo-*-
@comment %**start of header
@include version.texi
@settitle GNU Sample @value{VERSION}
@syncodeindex pg cp
@comment %**end of header
@copying
This manual is for GNU Sample (version @value{VERSION}, @value{UPDATED}),
which is an example in the Texinfo documentation.
Copyright @copyright{} 2026 Free Software Foundation, Inc.
@quotation
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled
``GNU Free Documentation License''.
@end quotation
@end copying
@dircategory Texinfo documentation system
@direntry
* sample: (sample)Invoking sample.
@end direntry
@documentinfo
@title GNU Sample
@subtitle for version @value{VERSION}, @value{UPDATED}
@author A.U. Thor (@email{bug-sample@@gnu.org})
@end documentinfo
@maketitle
@contents
@node Top
@top GNU Sample
This manual is for GNU Sample (version @value{VERSION}, @value{UPDATED}).
@node Invoking sample
@chapter Invoking sample
@pindex sample
@cindex invoking @command{sample}
This is a sample manual. There is no sample program to
invoke, but if there were, you could see its basic usage
and command line options here.
@node GNU Free Documentation License
@appendix GNU Free Documentation License
@include fdl.texi
@node Index
@unnumbered Index
@printindex cp
@bye
version.texi
@set UPDATED 1 March 2026 @set UPDATED-MONTH March 2026 @set EDITION 7.3 @set VERSION 7.3
C.2 原义复制许可证
对于软件手册及其他文档来说,使用 允许自由再分发与修改更新 的许可协议至关重要,这样当自由软件发生变更时,其文档也能同步更新。
但另一方面,对于表达你 个人观点、感受或经历 的文档,更适合使用仅允许原样复制的许可协议。
下面是仅允许原样复制的许可协议示例文本。这只是许可协议本身的内容。如需完整的示例文档,请参阅前面的章节。
@copying
本文档为仅允许原样复制的示例。
版权所有 @copyright{} 2026 Free Software Foundation, Inc.
@quotation
允许对本文档的完整内容进行原样复制与分发,无需支付版税,
前提是保留此版权声明与本许可声明。
@end quotation
@end copying
C.3 宽松式复制许可证
对于软件手册和其他文档来说,使用 允许自由再分发和修改更新 的许可协议非常重要,这样当自由软件发生变更时,文档也能随之更新。
另一方面,对于小型辅助文件、简短手册(长度少于 300 行)以及简易文档(README 文件、INSTALL 文件等),完整的 FDL 许可过于繁琐。这类文件可以使用简单的 完全宽松许可 。
下面是此类完全宽松许可的示例文本。这只是许可协议本身的内容。如需完整的示例文档,请参阅前面的章节。
版权所有 @copyright{} 2026 Free Software Foundation, Inc.
无论是否修改,均可在任何媒介中复制和分发本文件,
无需支付版税,前提是保留此版权声明与本许可声明。
附录 D Texinfo 模式的使用
你可以使用任意文本编辑器编辑 Texinfo 文件。Texinfo 文件与其他 ASCII 文件并无区别。不过,GNU Emacs 自带一种专门的Texinfo mode,它提供了相应的 Emacs 命令和工具,能简化你的编写工作。
D.1 Texinfo Mode 概述
Texinfo 模式提供了用于处理 Texinfo 文件的专用功能。你可以:
- 插入常用的 @-命令。
- 自动生成
@node行。 - 显示 Texinfo 源文件的结构。
- 自动创建或更新节点的 Next、Previous 和 Up 指针。
- 自动创建或更新菜单。
- 自动生成主菜单。
- 对文件的部分或全部内容进行 Info 格式排版。
- 对文件的部分或全部内容进行排版与打印。
其中最实用的两个功能或许是:插入常用 @-命令,以及创建节点指针和菜单。
D.2 常用的 GNU Emacs 编辑命令
大多数情况下,普通文本模式(Text mode)下的命令在 Texinfo mode 中 用法完全相同 。Texinfo mode 在 GNU Emacs 通用编辑功能的基础上,新增了专门的编辑命令与工具。两者最主要的区别在于 段落填充 (filling)。在 Texinfo mode 中,段落分隔变量和语法表被重新定义,以确保 独占一行的 Texinfo 命令 不会被意外并入段落内部。因此, M-q (fill-paragraph) 命令只会重新整理段落格式,而不会把相邻行上的索引命令合并进段落里。
此外,Texinfo mode 会将 page-delimiter 变量设为 texinfo-chapter-level-regexp 的值;默认情况下,这是一个匹配章及等价级别命令(如附录)的正则表达式。借助这一分页符设置,你可以使用: C-x ] (forward-page) 跳至下一章、 C-x [ (backward-page) 跳至上一章、 C-x n p (narrow-to-page) 只显示当前章节内容。(有关分页命令的详细说明,参见《GNU Emacs 手册》中的 Pages 章节。)
当你打开后缀名为 .texinfo 、 .texi 或 .txi 的文件时,GNU Emacs 会自动进入 Texinfo Mode。如果文件首行包含 -*-texinfo-*- ,Emacs 同样会切换到 Texinfo mode。如果你当前处于其他模式,想要手动切换到 Texinfo mode,可输入: M-x texinfo-mode 。
与 Emacs 其他所有功能一样,你可以按自己的需求自定义或扩展 Texinfo Mode,尤其是 快捷键绑定 ,修改起来非常简便。本文描述的均为默认 / 标准快捷键。
D.3 插入常用命令
Texinfo mode 提供了在缓冲区中插入各类常用 @命令 的功能,可以帮你减少按键输入。
插入命令通过连续按两次 C-c ,再按 @命令 的首字母来调用:
C-c C-c cM-x texinfo-insert-@code- 插入
@code{},并将光标置于大括号之间。 C-c C-c dM-x texinfo-insert-@dfn- 插入
@dfn{},并将光标置于大括号之间。 C-c C-c eM-x texinfo-insert-@end- 插入
@end,并尝试自动补全后续正确的单词,如 ‘example’ 或 ‘table’。(该命令不能正确处理嵌套列表,只会匹配紧邻的上一层列表。) C-c C-c iM-x texinfo-insert-@item- 插入
@item,并将光标移至下一行开头。 C-c C-c kM-x texinfo-insert-@kbd- 插入
@kbd{},并将光标置于大括号之间。 C-c C-c nM-x texinfo-insert-@node- 插入
@node以及一行注释,列出 Next、Previous、Up 节点的结构,光标留在@node之后。 C-c C-c oM-x texinfo-insert-@noindent- 插入
@noindent,并将光标移至下一行开头。 C-c C-c rM-x texinfo-insert-dwim-@ref- 该功能与快捷键在 Emacs 27.1 中新增。根据光标周围文本自动插入
@pxref{}、@xref{}或@ref{}:在未闭合的左括号附近调用会生成@pxref{};在句子开头或文件开头生成@xref{};其他位置(包括单词中间)则生成@ref{}。数字前缀参数指定大括号要包裹几个单词,光标放在大括号之间。 C-c C-c sM-x texinfo-insert-@samp- 插入
@samp{},并将光标置于大括号之间。 C-c C-c tM-x texinfo-insert-@table- 插入
@table后跟一个空格,光标留在空格之后。 C-c C-c vM-x texinfo-insert-@var- 插入
@var{},并将光标置于大括号之间。 C-c C-c xM-x texinfo-insert-@example- 插入
@example,并将光标移至下一行开头。 C-c C-c {M-x texinfo-insert-braces- 插入
{},并将光标置于大括号之间。 C-c }C-c ]M-x up-list- 从一对大括号中间向后跳出到右括号外侧。按
C-c ]比C-c }更顺手,但后者更助记,因此提供两套绑定。(也可以直接按C-f跳出大括号。)
如果要给已有的单词加上 @code{…} 这类命令,将光标放在单词前,输入 C-u 1 C-c C-c c 。这让编辑已有普通文本变得很方便。前缀参数告诉 Emacs 要把光标后多少个单词放进大括号里:1 表示一个单词,2 表示两个,依此类推。使用负数参数可以包裹光标前的单词。如果不指定前缀参数,Emacs 只插入 @-命令 并将光标放在大括号中间。该功能仅对作用于单行内单词的 @命令 有效,如 @kbd 和 @var 。
这套插入命令是在分析了《GNU Emacs 手册》和《GDB 手册》中不同 @-命令 的使用频率后设计的。如果你想添加自定义插入命令,可以将键盘宏绑定到按键、使用缩写,或直接扩展 texinfo.el 中的代码。
C-c C-c C-d (texinfo-start-menu-description) 是一个与其他插入命令用法不同的命令。它会将节点对应的节或章标题自动填入菜单项的描述位置。(一个菜单项有三部分:条目名、节点名、描述。只有节点名是必需的,但描述有助于说明节点内容。见 菜单组成部分)
使用 texinfo-start-menu-description :将光标放在菜单项行内,按 C-c C-c C-d 。命令会查找并复制对应节点的标题,作为描述插入;光标会定位在插入文本的开头,方便你编辑。如果菜单项已经有描述,该命令不会重复插入。
该命令只是辅助编写描述,不能完全代劳。你必须编辑插入的内容,因为标题通常和节点名用词相近,而有用的描述需要使用不同的措辞。
D.4 显示文件的章节结构
你可以使用 C-c C-s 命令 (texinfo-show-structure) 显示 Texinfo 文件的章节结构。该命令会列出所有以 @chapter 、 @section 等章节类 @-命令 开头的行,相当于自动生成一份目录。这些行会在另一个名为 *Occur* 的缓冲区中展示。在该缓冲区中,你可以将光标移到某一行上,使用 C-c C-c 命令 (occur-mode-goto-occurrence),直接跳转到 Texinfo 文件中对应的位置。
C-c C-sM-x texinfo-show-structure- 显示 Texinfo 文件中的
@chapter、@section等章节行。 C-c C-cM-x occur-mode-goto-occurrence- 跳转到 Texinfo 文件中与
*Occur*缓冲区光标所在行对应的位置。
如果通过 C-u C-c C-s 带前缀参数调用 texinfo-show-structure ,它不仅会列出 @chapter 、 @section 等章节行,还会列出 @node 节点行。你可以用这种方式检查 @node 行中的「下一节(Next)」「上一节(Previous)」「上级(Up)」指针是否正确。
在编写手册时,你通常只关心当前章节的结构。这时可以用 C-x n n (narrow-to-region) 命令限定缓冲区的区域, texinfo-show-structure 就只会作用于该区域。使用 C-x n w (widen) 恢复显示整个缓冲区。(有关缩小区域命令的更多信息,请参见《GNU Emacs 手册》中的 “缩小区域” 一节。)
除了提供 texinfo-show-structure 命令外,Texinfo mode 还会自动设置分页符变量,使其与章节级别的 @-命令 匹配。这样你就可以使用: C-x ] (forward-page) 按章节向后跳转、 C-x [ (backward-page) 按章节向前跳转、 C-x n p (narrow-to-page) 将显示范围缩小到一个章节。有关分页命令的更多信息,请参见《GNU Emacs 手册》中的 “分页” 一节。
D.4.1 使用 texinfo-show-structure
想要时刻清楚 Texinfo 文件中的节点、章、节与子节,并不总是一件容易的事。如果你正在修改或补充他人编写的 Texinfo 文件,情况更是如此。
在 GNU Emacs 的 Texinfo mode 下, texinfo-show-structure 命令会列出所有以定义结构的 @-命令 开头的行: @chapter 、 @section 、 @appendix 等。如果带上参数(交互式使用时以 C-u 作为前缀参数),该命令还会同时显示 @node 行。在 Texinfo mode 中, texinfo-show-structure 命令默认绑定为 C-c C-s 。
这些行会在名为 *Occur* 的缓冲区中展示,并按层级缩进。例如,在本手册上运行 texinfo-show-structure 后,会得到类似这样的内容:
匹配正则表达式 "^@\\(chapter \\|sect\\|subs\\|subh\\|
unnum\\|major\\|chapheading \\|heading \\|appendix\\)"
的行(位于缓冲区 texinfo.texi):
...
4177:@chapter Nodes
4198: @heading Two Paths
4231: @section Node and Menu Illustration
4337: @section The @code{@@node} Command
4393: @subheading Choosing Node and Pointer Names
4417: @subsection How to Write a @code{@@node} Line
4469: @subsection @code{@@node} Line Tips
...
这表示 texinfo.texi 的第 4337、4393、4417 行分别以 @section 、 @subheading 、 @subsection 命令开头。将光标移入 *Occur* 窗口,定位到某一行,再使用 C-c C-c 命令 (occur-mode-goto-occurrence),即可跳转到 Texinfo 文件中对应的位置。有关 occur-mode-goto-occurrence 的更多信息,参见《GNU Emacs 手册》中的 “使用 Occur” 一节。
*Occur* 窗口的第一行会描述由 texinfo-heading-pattern 指定的正则表达式,这正是 texinfo-show-structure 所查找的模式。更多信息参见《GNU Emacs 手册》中的 “使用正则表达式” 一节。
调用 texinfo-show-structure 时,Emacs 会显示 整个缓冲区 的结构。如果你只想查看部分区域的结构(例如某一章),可以使用 C-x n n (narrow-to-region) 命令限定区域(参见《GNU Emacs 手册》中的 “缩小区域”)。上面的示例就是这样生成的。(使用 C-x n w (widen) 恢复显示整个缓冲区。)
如果以 C-u C-c C-s 带前缀参数调用 texinfo-show-structure ,它不仅会列出以 @chapter 、 @section 等 @-命令 开头的行,还会列出以 @node 开头的行。
你可以通过查看 *Occur* 窗口中的列表,快速回忆 Texinfo 文件的结构;如果节点命名有误或遗漏了某个节,也能及时修正。
D.4.2 使用 occur
有时候 texinfo-show-structure 命令输出的信息过多。如果你只是想快速回忆 Texinfo 文件的整体结构,却被它生成的详细列表淹没,这时可以直接使用 occur 命令。操作方法:输入
M-x occur
然后在提示处输入一个正则表达式,即你想要匹配的模式。(详见《GNU Emacs 手册》中的 “正则表达式” 章节。) occur 命令会从缓冲区中光标当前位置开始,一直搜索到缓冲区末尾。如果你想在整个缓冲区中搜索,先把光标移到缓冲区开头。
例如,想查看所有包含 ‘@chapter’ 的行,直接输入 ‘@chapter’ 即可。它会列出所有章节行,也会列出行中间包含 ‘@chapter’ 的句子。
只想查看以 ‘@chapter’ 开头的行,在 occur 提示处输入:‘^@chapter’;想查看以某个单词或短语结尾的行,在末尾加上 $ ,例如: catching mistakes$ ;这在你需要查看同属一章或一节、且拥有相同 Up 指向的所有节点时非常有用。
更多说明请参见《GNU Emacs 手册》中的 “使用 Occur” 一节。
D.5 更新节点与菜单
texi2any 命令可以为层次化组织的 Texinfo 文件生成 Info 文件,即便文件中缺少 ‘Next’、‘Previous’ 和 ‘Up’ 指针(参见编写 @node 行)。因此,通常情况下无需显式编写 ‘Next’、‘Previous’ 和 ‘Up’ 指针。在这种情况下,对于没有显式菜单的节点,菜单也会被自动添加。(有关 texi2any 的更多信息,参见 texi2any: Texinfo 转换器。)
如果你仍然希望使用显式指针,Texinfo mode 提供了可 自动创建或更新菜单与节点指针 的命令。这些命令被称为 “update更新” 命令,因为它们最常用于在编辑完 Texinfo 文件后对其进行更新;不过你也可以用它们将 ‘Next’、‘Previous’ 和 ’Up‘ 指针插入原本没有这些指针的 @node 行中,并为原本没有菜单的文件生成菜单。
D.5.1 更新相关命令
你可以使用更新命令来:
- 插入或更新节点的 Next、Previous 和 Up 指针,
- 插入或更新节的菜单,
- 为 Texinfo 源文件创建主菜单。
你也可以用这些命令来更新区域或整个 Texinfo 文件中的所有节点与菜单。
更新命令仅适用于规范的 Texinfo 文件,即像书籍一样按层次结构组织的文件。在这类文件中,除了 Top 节点行之外,每条 @node 行后面必须紧跟一条结构化命令。
结构化命令可以紧跟在 @node 行之后,也可以在其后隔一行 @comment 或一行 @ifinfo 。 @node 行与结构化命令之间最多只能插入一行,且只能是 @comment 或 @ifinfo 。
对整个缓冲区生效的命令要求:‘Top’ 节点之后必须跟一个使用 @chapter 或同级命令的节点。菜单更新命令不会为只有章节级节点的 Texinfo 文件生成主菜单或总菜单!菜单更新命令只会在节点内部为更低层级的节点创建菜单。要生成章节菜单,必须提供 ‘Top’ 节点。
菜单更新命令会删除指向其他 Info 文件的菜单项,因为它们不指向当前缓冲区内的节点。这是一个不足。你可以使用交叉引用而非菜单项来引用其他 Info 文件。所有更新命令都不会影响交叉引用。
Texinfo 模式有五个最常用的更新命令:
- 两个用于更新 单个节点(或区域) 的节点指针或菜单;
- 两个用于更新整个文件的所有节点指针与菜单;
- 一个
texinfo-master-menu命令,用于为完整文件创建主菜单,并可选择更新整个文件的所有节点与菜单。
texinfo-master-menu 是核心命令:
C-c C-u mM-x texinfo-master-menu创建或更新包含所有其他菜单的主菜单(会保留已有菜单中的描述)。
带前缀参数(交互时为
C-u)时:在构建主菜单之前,会先创建或更新缓冲区中的所有节点与普通菜单。(关于主菜单,详见《顶层节点与主菜单》。)texinfo-master-menu正常工作的前提:Texinfo 文件必须有 ‘Top’ 节点,且至少有一个后续节点。对 Texinfo 文件进行大量编辑后,可直接执行:
C-u M-x texinfo-master-menu
或
C-u C-c C-u m
这会一次性完整更新所有节点与菜单。
其他主要更新命令用于更小范围的工作,适合边写边更新节点与菜单的用户。
命令如下:
C-c C-u C-nM-x texinfo-update-node- 为光标所在节点插入 Next、Previous 和 Up 指针(即光标之前的
@node行)。如果该@node行中已存在 Next、Previous 或 Up 指针,旧指针会被移除,并插入新指针。带参数时(交互模式下为前缀参数C-u),此命令会更新区域内的所有@node行(区域即光标与标记之间的文本)。 C-c C-u C-mM-x texinfo-make-menu创建或更新光标所在节点的菜单。带前缀参数(交互模式下使用
C-u)时,该命令会为区域内或属于该区域的节点创建或更新菜单。每当
texinfo-make-menu更新已有菜单时,原有菜单中的描述会被保留并整合到新菜单中。具体做法是:将原有菜单里的描述,复制到新菜单中节点名称相同的条目里;如果节点名称不同,则不会复制描述。C-c C-u C-eM-x texinfo-every-node-update- 为缓冲区中所有节点插入或更新 Next、Previous、Up 指针。
C-c C-u C-aM-x texinfo-all-menus-update创建或更新缓冲区中的所有菜单。带前缀参数时,在处理菜单前先插入 / 更新所有节点指针。
如果已有主菜单,
texinfo-all-menus-update会更新它;但如果原本没有主菜单,该命令不会新建(需用texinfo-master-menu)。对于不需要主菜单的文档,可使用:
C-u C-c C-u C-a
或
C-u M-x texinfo-all-menus-update
这会更新所有节点与菜单。
变量 texinfo-column-for-description 用于指定菜单描述的缩进列数。默认值为 32,不过将其减小到 24 往往会更实用。你可以通过定制界面(参见《GNU Emacs 手册》中的 “定制” 一节)或 M-x set-variable 命令(参见《GNU Emacs 手册》中的 “查看与设置变量” 一节)来设置该变量。
此外,命令 texinfo-indent-menu-description 可用于将已有的菜单描述缩进至指定列。最后,如果你愿意,还可以使用 texinfo-insert-node-lines 命令在文件中插入缺失的 @node 行。具体来说,你可以在初稿中完全不写 @node 行,然后用 texinfo-insert-node-lines 命令自动生成。但我们不推荐这种做法。更好的方式是:在编写每个章节片段的同时就为节点命名,这样便于轻松创建交叉引用。实用的交叉引用是优秀 Texinfo 手册尤为重要的特性。(更多信息参见 “其他更新命令”。)
D.5.2 更新的前提条件
要使用更新命令,你必须以章节、节、子节等层级结构来组织 Texinfo 文件。在构建手册的层级结构时, 一次不能向下跨越超过一级 :你可以在「Top」节点后接一章,但不能直接接一节;可以在一章后接一节,但不能直接接一子节。不过, 向上可以一次跨越任意多级 —— 例如,从子节直接回到章节。
除「Top」节点外,每条 @node 行后面 必须紧跟 一条结构化命令行,如 @chapter 、 @section 或 @unnumberedsubsec 。
每条 @node 行与结构化命令行的组合必须是以下形式之一:
@node Comments, Minimum, Conventions, Overview @comment node-name, next, previous, up @section Comments
或如下形式(不含 @comment 行):
@node Comments, Minimum, Conventions, Overview @section Comments
或如下形式(不写显式节点指针):
@node Comments @section Comments
在本例中,‘Comments’ 既是节点名也是节名。下一个节点是 ‘Minimum’,上一个节点是 ‘Conventions’。‘Comments’ 节隶属于 ‘Overview’ 节点,由「Up(上级)」指针指定。
如果文件中有「Top」节点,它必须命名为 ‘top’ 或 ‘Top’,并且是文件中的第一个节点。
菜单更新命令会在章节内生成节的菜单、在节内生成子节的菜单,依此类推。这意味着:如果你想要生成章节菜单,就必须有一个「Top」节点。
D.5.3 更新主文件与包含文件
GNU Emacs Texinfo mode 提供了 texinfo-multiple-files-update 命令。该命令会创建或更新包含文件以及外部(总)Texinfo 文件中的 ‘Next’、‘Previous’、 ‘Up’ 指针,并在外部文件中创建或更新主菜单。根据调用时是否携带可选参数,该命令只会更新包含文件中第一行 @node 的指针,或更新所有节点指针。
使用 C-u 作为前缀参数时,会在外部文件中生成并插入总菜单。使用数字前缀参数(如 C-u 2 )时,会先更新所有包含文件的全部菜单与所有 ‘Next’、‘Previous’、 ‘Up’ 指针,再在外部文件中生成并插入总菜单。
详细说明如下:
M-x texinfo-multiple-files-update- 不带任何参数调用时:
- 创建或更新外部(总)Texinfo 文件所包含的每个文件中,第一行
@node的 ‘Next’、‘Previous’、 ‘Up’ 指针。 - 创建或更新外部(总)文件的 ‘Top’ 顶层节点指针。
- 在外部文件中创建或更新主菜单。
- 创建或更新外部(总)Texinfo 文件所包含的每个文件中,第一行
C-u M-x texinfo-multiple-files-update- 以
C-u作为前缀参数调用时:- 创建或更新每个包含文件中第一行
@node的指针。 - 创建或更新外部文件的 ‘Top’ 顶层节点指针。
- 在外部文件中生成并插入总菜单,该总菜单由所有包含文件中的全部菜单汇总而成。
- 创建或更新每个包含文件中第一行
C-u 8 M-x texinfo-multiple-files-update- 以数字前缀参数(如 =C-u 8=)调用时:
- 创建或更新所有包含文件中全部 ‘Next’、‘Previous’、 ‘Up’ 指针。
- 创建或更新所有包含文件中的全部菜单。
- 创建或更新外部(总)文件的 ‘Top’ 顶层节点指针。
- 随后在外部文件中生成总菜单。这与单文件编辑时带参数调用
texinfo-master-menu的效果类似。
注意交互使用时前缀参数的用法:普通前缀参数 C-u 只会让 texinfo-multiple-files-update 插入总菜单;而数字前缀参数(如 C-u 8 )会先更新所有文件里的每一个指针与菜单,再插入总菜单。
D.5.4 包含文件的要求
如果你打算使用 texinfo-multiple-files-update 命令,那么列出了各个被包含文件的外部 Texinfo 主文件,应当 只包含 Texinfo 文件的开头与结尾部分,以及若干列出被包含文件的 @include 命令。它甚至不应该包含索引,索引应当单独放在一个被包含的文件里。
此外,每个被包含文件必须恰好包含一个最高层级节点(惯例为 @chapter 或同级节点),且该节点必须是被包含文件中的第一个节点。而且,每个被包含文件里的这个最高层级节点,在文件结构中必须处于同一层级。通常,它们都是 @chapter 、 @appendix 或 @unnumbered 节点。因此,一般情况下,每个被包含文件只包含一章或同级别的一个节点。
外部主文件应当只包含一个节点,即 Top(顶层)节点。除了唯一的 Top 节点外,它不应包含任何其他节点, texinfo-multiple-files-update 命令不会处理这些额外节点。
D.5.5 其他更新命令
除主要的更新命令外,Texinfo 模式还提供若干使用频率较低的更新命令:
M-x texinfo-insert-node-lines在 Texinfo 文件的指定区域内,为所有缺少
@node行的@chapter、@section等章节命令自动插入@node行。若携带参数(交互使用时以
C-u作为前缀),texinfo-insert-node-lines不仅会插入@node行,还会将章节或节标题作为对应节点名一并插入。同时,它会为已存在但缺少节点名的@node行补全标题作为节点名。由于节点名通常应比章节标题更简洁,你需要手动编辑这些自动插入的节点名。例如,以下命令选中整个缓冲区,并为全文插入
@node行与节点名:C-x h C-u M-x texinfo-insert-node-lines
该命令将标题作为节点名插入
@node行;而texinfo-start-menu-description命令(见 “常用命令的插入”)是将标题作为描述插入到菜单项中,二者作用不同。但两种情况下,插入的文本都需要你手动编辑。M-x texinfo-indent-menu-description- 将光标所在位置之后菜单中的所有描述缩进至指定列,可用来为描述内容留出更多空间。若携带参数(交互使用时以
C-u作为前缀),该命令会对 区域内所有菜单 的所有描述进行缩进。注意:此命令不会对多行描述的第二行及后续行做缩进处理。 M-x texinfo-sequential-node-update- 无视节点的层级关系,直接将当前节点的紧邻后一个和前一个节点设为‘Next’ 或 ‘Previous’ 指针。这意味着某一小节的「下一节」可能直接是下一章。按顺序编排的节点适合小说等需要从头到尾顺序阅读的文档。(不过在 Info 中,
g *命令本身就可以顺序浏览文件,因此严格来说并不一定需要顺序节点。)若携带参数(交互使用时带前缀),texinfo-sequential-node-update会对整个区域内所有节点执行顺序更新。
D.6 生成 Info 格式
Texinfo mode 提供了多条命令,用于将 Texinfo 文件的部分或全部内容格式化为 Info 格式。
D.6.1 在 Emacs 中运行 texi2any/makeinfo
texi2any 程序给出的错误信息比 Emacs 中的任何格式化命令都更友好,我们推荐使用它。 texi2any 程序独立于 Emacs 运行。
你可以在 GNU Emacs Texinfo mode 中,使用 makeinfo-region 或 makeinfo-buffer 命令来运行 texi2any (或 makeinfo )。在 Texinfo mode 下,这些命令默认绑定为: C-c C-m C-r 、 C-c C-m C-b 。
C-c C-m C-rM-x makeinfo-region- 将当前区域格式化为 Info 格式。
C-c C-m C-bM-x makeinfo-buffer- 将当前缓冲区格式化为 Info 格式。
调用 makeinfo-region 时,输出会写入临时缓冲区。调用 makeinfo-buffer 时,输出会写入由 @setfilename 指定的文件(参见 @setfilename: 设置输出文件名)。
Emacs 的 makeinfo-region 和 makeinfo-buffer 命令会在临时 Shell 缓冲区中运行 texi2any 。如果 texi2any 检测到错误,Emacs 会在临时缓冲区中显示错误信息。
你可以通过键入 C-x ` (next-error) 来解析错误信息,这会让 Emacs 跳转到 texi2any 判定为出错的 Texinfo 源码行并将光标定位到该行。有关 next-error 命令的更多用法,参见《GNU Emacs 手册》中的 “运行 make 或一般编译器” 一节。
此外,你可以终止运行 texi2any 的 Shell 进程,或让 Shell 缓冲区重新显示最近的输出。
C-c C-m C-kM-x makeinfo-kill-job- 终止当前正在运行的
texi2any(或makeinfo)任务(来自makeinfo-region或makeinfo-buffer)。 C-c C-m C-lM-x makeinfo-recenter-output-buffer- 重新显示
texi2any所在的 Shell 缓冲区,展示其最近输出。
(注意:用于终止和重新显示 TeX 任务的对应命令是 C-c C-t C-k 和 C-c C-t C-l 。参见 Texinfo 模式下的格式化与打印。)
你可以通过以下方式为 texi2any 指定选项:使用 M-x customize 或 M-x set-variable 命令设置 makeinfo-options 变量,或是在你的 .emacs 初始化文件中直接设置该变量。
例如,你可以在 .emacs 文件中写入:
(setq makeinfo-options
"--paragraph-indent=0 --no-split
--fill-column=70 --verbose")
更多信息参见:
- 《GNU Emacs 手册》中的简易自定义界面
- 《GNU Emacs 手册》中的查看与设置变量
- 《GNU Emacs 手册》中的初始化文件
- 以及
texi2any选项说明。
D.6.2 texinfo-format... 系列命令
在 GNU Emacs 的 Texinfo mode下,你可以使用 texinfo-format-region 命令格式化 Texinfo 文件的部分或全部内容。该命令会格式化当前区域,并在名为 *Info Region* 的临时缓冲区中显示格式化后的文本。
类似地,你可以使用 texinfo-format-buffer 命令格式化整个缓冲区。该命令会创建一个新缓冲区,并在其中生成 Info 文件。按下 C-x C-s 即可按照 @setfilename 行指定的名称保存该 Info 文件,而 @setfilename 必须位于 Texinfo 文件的开头附近。
C-c C-e C-rtexinfo-format-region- 将当前区域格式化为 Info 格式。
C-c C-e C-btexinfo-format-buffer- 将当前缓冲区格式化为 Info 格式。
texinfo-format-region 和 texinfo-format-buffer 命令会提供一定的错误检查功能,其他工具也能为你排查格式化错误提供进一步帮助。这些方法在附录中有说明;参见 “排查错误”。不过, texi2any 程序提供的错误检查效果更好(参见 在 Emacs 中运行 texi2any/makeinfo )。
texinfo-format-buffer 和 texinfo-format-region 命令的一个特殊之处在于:它们不会对包含 @w 或 @* 命令的段落进行缩进(或自动填充)。
D.7 使用 Emacs 格式化与打印
GNU Emacs 可以通过 Emacs 内置的 Shell,借助 TeX 对文档进行格式化与打印。Texinfo mode 也提供了预定义的快捷键命令,用于格式化和打印。
D.7.1 Texinfo Mode 下的格式化与印刷
Texinfo mode 提供了若干预定义快捷键命令,用于 TeX 格式化与打印。其中包括索引排序、查看打印队列、终止格式化任务、重新显示操作所在缓冲区等命令。
编写文档时,你通常只需对文件的一部分进行排版与打印,以预览效果。可以使用 texinfo-tex-region 及相关命令实现这一目的;使用 texinfo-tex-buffer 命令可格式化整个缓冲区。
要使 texinfo-tex-region 或 texinfo-tex-buffer 正常工作,文件必须以 \input texinfo 行开头,且必须包含 @settitle 行,文件末尾必须单独一行写 @bye 。(使用 texinfo-tex-region 时,必须将 @settitle 行放在文件头开始行与文件头结束行之间。)
C-c C-t C-bM-x texinfo-tex-buffer- 对缓冲区运行
texi2dvi。除对缓冲区执行 TeX 处理外,该命令还会根据需要自动创建或更新索引。 C-c C-t C-rM-x texinfo-tex-region对当前区域运行 TeX。
如果与打印输出相关的 @-命令 位于文件头开始行与文件头结束行之间,
texinfo-tex-region会按照相应设置格式化该区域。例如,若将@smallbook命令写在这两行之间,texinfo-tex-region会以 “小开本” 尺寸格式化该区域。C-c C-t C-iM-x texinfo-texindex- 运行
texindex,对使用texinfo-tex-region格式化后的 Texinfo 文件的索引进行排序。texinfo-tex-region不会自动运行texindex,它只执行 TeX 排版命令。在使用texindex对原始索引文件排序后,你必须再次运行texinfo-tex-region。(通常,格式化区域时不会生成索引,只有格式化缓冲区时才会。由于texi2dvi命令的出现,该命令几乎已不再需要。) C-c C-t C-pM-x texinfo-tex-print- 打印由
texinfo-tex-region或texinfo-tex-buffer生成的 DVI 文件。 C-c C-t C-qM-x tex-show-print-queue- 显示打印队列。
C-c C-t C-dM-x texinfo-delete-from-print-queue- 从打印队列中删除任务;系统会提示你输入此前由
C-c C-t C-q(texinfo-show-tex-print-queue) 显示的任务编号。 C-c C-t C-kM-x tex-kill-job- 终止当前正在运行的由
texinfo-tex-region或texinfo-tex-buffer启动的 TeX 任务,以及在 Texinfo Shell 缓冲区中运行的其他任何进程。 C-c C-t C-xM-x texinfo-quit-job- 向因出错而停止的 TeX 格式化任务发送
x以退出。执行此操作时,TeX 会在.log文件中保留操作记录。 C-c C-t C-lM-x tex-recenter-output-buffer- 重新显示运行 TeX 打印与格式化命令的 Shell 缓冲区,展示其最近输出。
因此,格式化缓冲区的常用命令序列如下(右侧为注释):
C-c C-t C-b 对缓冲区运行 texi2dvi。 C-c C-t C-p 打印 DVI 文件。 C-c C-t C-q 显示打印队列。
Texinfo 模式的 TeX 格式化命令会在 Emacs 中启动一个名为 *tex-shell* 的子 Shell。 texinfo-tex-command 、 texinfo-texindex-command 、 tex-dvi-print-command 等命令均在此 Shell 中运行。
你可以在 *tex-shell* 缓冲区中观察命令执行情况,并像使用其他普通 Shell 缓冲区一样切换和使用它。
格式化与打印命令依赖多个变量的值。默认值如下:
变量名 默认值 texinfo-texi2dvi-command "texi2dvi" texinfo-tex-command "tex" texinfo-texindex-command "texindex" texinfo-delete-from-print-queue-command "lprm" texinfo-tex-trailer "@bye" tex-start-of-header "%**start" tex-end-of-header "%**end" tex-dvi-print-command "lpr -d" tex-show-queue-command "lpq"
你可以使用 M-x set-variable 命令修改这些变量的值(参见《GNU Emacs 手册》中的 “查看与设置变量”),或在 .emacs 初始化文件中设置(参见《GNU Emacs 手册》中的 “初始化文件”)。
从第 20 版开始,GNU Emacs 提供了名为 Customize 的友好界面,用于修改用户可定义变量。有关详情,请参见《GNU Emacs 手册》中的 “简易自定义界面”。执行 M-x customize 后,可在 ‘Development/Docs/Texinfo’ 组中找到 Texinfo 相关变量。
D.7.2 使用局部变量列表
对 Texinfo 文件应用 TeX 格式化命令的另一种方式,是将该命令放在 Texinfo 文件末尾的 / local variables list 局部变量列表/ 中。你可以将 tex 或 texi2dvi 命令指定为 compile-command ,然后通过 M-x compile 让 Emacs 执行它。这会创建一个名为 *compilation* 的专用 Shell 缓冲区,Emacs 将在其中运行编译命令。例如,在 gdb.texi 文件的末尾, @bye 命令之后,可以添加如下内容:
Local Variables:
compile-command: "texi2dvi gdb.texi"
End:
这种方法最常被同样以这种方式编译程序的程序员使用;详见《GNU Emacs 手册》中的 “编译” 部分。
D.8 Texinfo Mode 小结
在 Texinfo mode 中,每类命令都有以相同按键开头的默认快捷键。所有为 Texinfo 模式专门定制的命令都以 C-c 开头,这些按键在一定程度上便于记忆。
插入命令
插入命令通过按两次 C-c ,再加上要插入的 @-命令 的首字母来调用。(从助记角度来说,用 C-c C-i 表示 “custom insert” 可能更合理,但 C-c C-c 输入更快。)
C-c C-c c 插入 @code
C-c C-c d 插入 @dfn
C-c C-c e 插入 @end
C-c C-c i 插入 @item
C-c C-c n 插入 @node
C-c C-c s 插入 @samp
C-c C-c v 插入 @var
C-c { 插入花括号
C-c ]
C-c } 跳出当前最内层花括号
C-c C-c C-d 在菜单项行的描述位置中插入节点的章节标题
显示结构
texinfo-show-structure 命令常在缩小显示的区域内使用。
C-c C-s 列出所有标题
总更新命令
texinfo-master-menu 命令用于创建总菜单,也可用于更新文件中的所有节点和菜单。 C-c C-u m M-x texinfo-master-menu 创建或更新总菜单
C-u C-c C-u m 以 C-u 作为前缀时,先创建或更新所有节点与普通菜单,再生成总菜单
更新指针
更新指针命令通过 C-c C-u 调用,后跟: C-n 执行 texinfo-update-node 、 C-e 执行 texinfo-every-node-update 。
C-c C-u C-n 更新单个节点 C-c C-u C-e 更新缓冲区中的所有节点
更新菜单
更新菜单命令通过 C-c C-u 调用,后跟: C-m 执行 texinfo-make-menu 、=C-a= 执行 texinfo-all-menus-update 。若要同时更新节点与菜单,在 C-c C-u C-a 前加 C-u 。
C-c C-u C-m 创建或更新单个菜单 C-c C-u C-a 创建或更新缓冲区中的所有菜单 C-u C-c C-u C-a 以 C-u 作为前缀时,先创建或更新所有节点,再创建或更新所有菜单
格式化为 Info
基于 Emacs Lisp 编写的 Info 格式化命令,使用 C-c C-e 调用: C-r 格式化区域、 C-b 格式化整个缓冲区。
基于 texi2any/makeinfo 程序的命令,使用 C-c C-m 调用: C-r 格式化区域、 C-b 格式化整个缓冲区。
使用 texinfo-format… 系列命令:
C-c C-e C-r 格式化区域 C-c C-e C-b 格式化缓冲区
使用 texi2any/makeinfo :
C-c C-m C-r 格式化区域 C-c C-m C-b 格式化缓冲区 C-c C-m C-l 重绘 texi2any 输出缓冲区 C-c C-m C-k 终止 texi2any 格式化任务
排版与打印
TeX 排版与打印命令通过先按 C-c C-t ,再按另一个控制键来调用: C‑r 对应 texinfo-tex-region , C‑b 对应 texinfo-tex-buffer ,依此类推。
C-c C-t C-r 对区域执行 TeX 排版 C-c C-t C-b 对缓冲区执行 texi2dvi C-c C-t C-i 运行 texindex C-c C-t C-p 打印 DVI 文件 C-c C-t C-q 显示打印队列 C-c C-t C-d 从打印队列删除任务 C-c C-t C-k 终止当前 TeX 格式化任务 C-c C-t C-x 退出已暂停的 TeX 格式化任务 C-c C-t C-l 重绘输出缓冲区
其他更新命令
其余更新命令因不常用,没有标准快捷键。
M-x texinfo-insert-node-lines
在区域中插入缺失的 @node 行以 C-u 为前缀时,使用章节标题作为节点名
M-x texinfo-multiple-files-update
更新多文件文档以 C-u 2 为前缀时,先创建或更新所有包含文件中的节点与菜单
M-x texinfo-indent-menu-description
缩进菜单描述文本
M-x texinfo-sequential-node-update
按严格顺序插入节点指针
D.9 Info 文件的直接格式化
一般情况下,不需要手动编辑或处理 Info 文件。Info 文件的大部分内容是纯文本,但其标签表需要计算节点与间接文件的偏移量(见标签文件与分拆文件),这在实际操作中并不现实。Texinfo 处理器会从 Texinfo 源文件输出格式规整的 Info 文件。此外,Texinfo 源文件中的许多信息在转为 Info 文件后会丢失。因此,无论是用于错误报告、统计分析还是搭建翻译版本, Texinfo 源文件都更适合用于手册分析 。
尽管如此,在一些场景下(尤其是手写 Info 文件时),直接处理 Info 文件仍有其意义,特别是用于 计算 Info 文件节点偏移量和计算分拆后 Info 文件的文件偏移量 。Emacs 提供了两条命令来完成这些工作: Info-tagify 为缺少标签表的非分拆文件添加标签表,该功能也可用于 Info 文件合法性校验(见查找引用错误的节点)。可以使用 Info-split 将非分拆的 Info 文件手动分拆。
D.9.1 为文件添加标签
Texinfo 处理器会自动生成标签表。唯一的例外是:当你带前缀参数调用 texinfo-format-buffer (即 C-u M-x texinfo-format-buffer )时,会生成一个不带标签表的未分拆 Info 文件(在某些场景下,这对 Info 文件校验很有用,参见「生成未分拆文件与添加标签表」)。因此,添加标签表的功能,通常更适用于手写的 Info 文件。
要为一个未分拆的文件创建标签表,请打开你想要添加标签的 Info 文件,然后输入:
M-x Info-tagify
(注意: Info-tagify 中的 ‘I’ 是大写。)
该命令会生成一个带有标签表的 Info 文件。标签表是格式规范的 Info 文件的必要组成部分(参见「标签文件与分拆文件」)。同时,校验或分拆 Info 文件也需要标签表。
D.9.2 手动拆分文件
你应当对大型文件进行分拆,或者让 texinfo-format-buffer 或 makeinfo-buffer 命令自动为你分拆。(通常你会让其中一个格式化命令自动完成这项工作。参见 “为 Info 格式进行格式化”。)
分拆出来的文件称为 间接子文件 。
标签表由格式化命令自动创建;只有在手动处理时,才需要你自己创建标签表。有关创建标签表的说明,参见 “为文件添加标签”。
打开你想要手动添加标签并分拆的 Info 文件,然后依次输入以下两条命令:
M-x Info-tagify M-x Info-split
(注意:‘Info’ 中的 ‘I’ 为大写。)
使用 Info-split 命令时,当前缓冲区会被改写为一个(小型)Info 文件,其中列出所有间接子文件。你应当用这个文件覆盖保存原来的文件。间接子文件会被写入原文件所在目录,文件名是在原文件名后追加 ‘-’ 和数字生成。
这个主文件仍然可以作为 Info 文件使用,但它只包含标签表和子文件目录。参见 “标签文件与分拆文件”。
D.10 错误检查
除了文档内容本身的错误外,使用 Texinfo 时还可能出现两类错误:一是 @-命令 使用错误,二是节点与章节结构错误。
要查找 @-命令 相关问题,可以在有问题的区域上运行 TeX 或区域格式化命令;实际上,你在编写每一段区域时都可以运行这些命令。
要查找节点与章节结构相关问题,可以使用 C-c C-s (texinfo-show-structure) 及其相关的 occur 命令,也可以使用 M-x Info-validate 命令。
D.10.1 推荐使用 texi2any
texi2any 工具在检测错误并给出提示方面表现非常出色,远胜于 texinfo-format-region 或 texinfo-format-buffer 。此外,各类自动创建、更新节点指针与菜单的功能,也大幅减少了人为出错的可能。
请使用 texi2any (或它在 Texinfo 模式里的对应命令 makeinfo-region 和 makeinfo-buffer )来格式化文件并检查错误,这是使用 Texinfo 的最佳方式。但如果你无法使用 texi2any ,或者问题非常难以定位,你可以使用本节介绍的工具。
D.10.2 利用 Info 文件格式化排查错误
在编写完 Texinfo 文件的一部分后,你可以使用 texinfo-format-region 或 makeinfo-region 命令,查看该区域是否能正常格式化。
但你之所以阅读本节,很可能是因为某些原因无法使用 makeinfo-region 命令;因此,本节余下内容均假设你使用的是 texinfo-format-region 。
如果你在某个 @-命令 上出错, texinfo-format-region 会在错误处或错误之后停止处理,并显示错误信息。要查看错误发生在缓冲区的哪个位置,可以切换到 *Info Region* 缓冲区;光标会停在错误位置之后。同时,错误发生(或更准确地说,被检测到)之后的文本将不会被格式化。
例如,如果你不小心把菜单结束命令写成了带 ‘s’ 的 @end menus ,而不是正确的 @end menu ,你会看到如下错误信息:
@end menus is not handled by texinfo
光标会停在缓冲区中出错的位置或其附近。缓冲区内容大致如下:
---------- Buffer: *Info Region* ----------
* Menu:
* Using texinfo-show-structure:: How to use
`texinfo-show-structure'
to catch mistakes.
* Running Info-validate:: How to check for
unreferenced nodes.
@end menus
∗
---------- Buffer: *Info Region* ----------
texinfo-format-region 命令有时会给出有些奇怪的错误提示。例如,下面这个交叉引用无法正常格式化:
(@xref{Catching Mistakes, for more info.)
在这种情况下, texinfo-format-region 检测到缺少右花括号,但提示信息却是「Unbalanced parentheses」(括号不匹配),而不是「Unbalanced braces」(花括号不匹配)。这是因为该格式化命令把花括号的不匹配当作括号不匹配来处理。
有时 texinfo-format-region 无法检测到错误。例如,下面语句中的右花括号和右括号位置写反了:
(@xref{Catching Mistakes), for more info.}
格式化后会生成:
(*Note for more info.: Catching Mistakes)
你只能通过对比正确格式来发现错误,正确的结果应该是:
(*Note Catching Mistakes::, for more info.)
顺便一提:如果你正在 Info 中阅读本节,并按下 f RET (Info-follow-reference) ,会产生如下错误:
No such node: "Catching Mistakes) The only way ...
这是因为 Info 会把错误示例当作本节中的第一个交叉引用;如果你在按下 Info 的 f 命令后立刻按 RET ,Info 会尝试跳转到这个被错误引用的节点。如果你输入 f catch TAB RET ,Info 会补全正确示例里的节点名,并带你跳转到「Catching Mistakes」节点。(尝试之后,你可以按 l (Info-last) 从「Catching Mistakes」节点返回。)
D.10.3 使用 TeX 调试
你也可以在使用 TeX 格式化文件时排查错误。
通常,你最好先对同一个文件运行 texinfo-format-buffer (或者更好的 makeinfo-buffer ),因为 texinfo-format-buffer 给出的错误提示有时比 TeX 更易懂。(更多信息参见 “利用 Info 格式化排查错误”。)
例如,对某个 Texinfo 文件运行 TeX,其中一段内容如下:
---------- Buffer: texinfo.texi ----------
name of the Texinfo file as an extension. The
@samp{??} are `wildcards' that cause the shell to
substitute all the raw index files. (@xref{sorting
indices, for more information about sorting
indices.)
---------- Buffer: texinfo.texi ----------
(该交叉引用缺少右花括号。)TeX 输出如下内容后便停止运行:
---------- Buffer: *tex-shell* ----------
Runaway argument?
{sorting indices, for more information about sorting
indices.) @ETC.
! Paragraph ended before @xref was complete.
<to be read again>
@par
l.27
?
---------- Buffer: *tex-shell* ----------
在这个例子中,TeX 给出了准确且易懂的错误信息:
Paragraph ended before @xref was complete. (段落结束前 @xref 尚未完成。)
‘@par’ 是 TeX 内部命令,与 Texinfo 无关。‘l.27’ 表示 TeX 在 Texinfo 文件的第 27 行检测到问题。‘?’ 是 TeX 在这种情况下的提示符。
遗憾的是,TeX 并非总是这么有用,有时你必须像福尔摩斯一样才能找出问题所在。
无论如何,如果遇到这类问题,你有三种选择:
- 在 ‘?’ 提示符下按
RET,让 TeX 继续运行并只忽略当前错误。 在 ‘?’ 提示符下输入
r RET,让 TeX 继续运行并尽可能忽略所有错误。这通常是最佳做法。但要注意:一个错误可能会引发后续一连串错误提示。当 TeX 输出大量错误时,可按
C-c(若在 Emacs 内的 Shell 中运行则按C-c C-c)停止 TeX。- 在 ‘?’ 提示符下输入
x RET,让 TeX终止本次运行。
如果你在 Emacs 内部运行 TeX,需要切换到 Shell 缓冲区,在 TeX 显示 ‘?’ 的那一行进行操作。
有时即使存在问题,TeX 格式化文件时也不会报错。这种情况通常发生在某个命令未结束,但 TeX 仍能继续处理时。例如,如果你没有用 @end itemize 结束枚举列表,TeX 仍然会生成可打印的 DVI 文件。它只会给出一条比较隐晦的提示:
(@end occurred inside a group at level 1)
但打印出的 DVI 会发现:列表之后的所有文本都会像最后一个列表项一样保持缩进。这条错误信息表示:TeX 期望在文件某处找到某个 @end 命令,但无法确定具体位置。
另一种极难排查的错误来源是缺少 @end 命令。如果你被莫名其妙的错误难住,优先检查是否少写了 @end 。
如果 Texinfo 文件缺少文件头,TeX 可能在运行一开始就停止,并输出类似下面的内容。‘*’ 表示 TeX 正在等待输入:
This is TeX, Version 3.14159 (Web2c 7.0) (test.texinfo [1]) *
这时只需在星号后输入 \end RET 。然后在 Texinfo 文件中补上文件头,再重新运行 TeX 即可。(注意这里使用的是反斜杠 \ 。TeX 使用 \ 而非 @ ;此时你是在直接使用 TeX,而非 Texinfo。)
D.10.4 查找引用错误的节点
你可以使用 Info-validate 命令检查是否存在 ‘Next’、 ‘Previous’、 ‘Up’或其他节点指针指向不存在节点的情况。该命令会检查 每一个节点指针都指向一个真实存在的节点 。 Info-validate 命令只对 Info 文件生效,不适用于 Texinfo 源文件。
texi2any 程序会 自动校验指针 ,因此如果你使用 texi2any ,就不需要再用 Info-validate 。如果设置了自定义变量 CHECK_NORMAL_MENU_STRUCTURE , texi2any 还会在节点指针(无论是手动设置还是自动生成)与菜单条目顺序不一致时给出警告。 texi2any 不会检查每个指 ‘Next’ 针是否都有对应的 ‘Previous’ 指针反向指回,因为在非标准文档结构中这可能是合理的。
只有在以下情况,你才可能需要使用 Info-validate :无法运行 texi2any ,只能通过 texinfo-format-region 或 texinfo-format-buffer 生成 Info 文件;或者你是从零手写 Info 文件。
D.10.4.1 使用 Info-validate
要使用 Info-validate ,请打开你要检查的 Info 文件,然后输入:
M-x Info-validate
注意: Info-validate 命令中的 ‘I’ 必须大写。在运行 Info-validate 之前,你可能还需要先创建标签表。参见 “为文件添加标签”。
如果文件合法,你会看到提示:“File appears valid”(文件看起来合法)。但如果存在指针指向不存在的节点,错误信息会显示在名为 problems in info file 的缓冲区中。
例如,在只包含本手册第一个节点的测试文件上运行 Info-validate ,会出现如下提示:
In node "Overview", invalid Next: Texinfo Mode
这表示名为 “Overview” 的节点的 “Next” 指针没有指向任何有效节点(在本例中确实如此,因为测试文件只有一个节点)。
现在假设我们在测试文件中添加一个名为 “Texinfo Mode” 的节点,但没有为它设置 “Previous” 指针。这时会出现如下错误信息:
In node "Texinfo Mode", should have Previous: Overview
这是因为在标准文档结构中,每个 “Next” 指针都应该有对应的 “Previous” 指针反向指回。
Info-validate 还会检查所有菜单项和交叉引用是否都指向真实存在的节点。
Info-validate 需要 标签表 ,并且 不能用于已分拆的文件 ( texinfo-format-buffer 命令会自动分拆大文件)。要在大文件上使用 Info-validate ,你必须带参数运行 texinfo-format-buffer 使其不分拆 Info 文件,并为这个未分拆的文件创建标签表。
D.10.4.2 创建未拆分文件并添加标签表
你只能在带有标签表的单个 Info 文件上运行 Info-validate 。该命令无法作用于主文件被拆分后生成的间接子文件。如果你有一个较大的文件(大约超过 300,000 字节),需要以 不生成间接子文件 的方式运行 texinfo-format-buffer 或 makeinfo-buffer 命令。同时,你还需要为该 Info 文件创建标签表。完成这些操作后,即可运行 Info-validate 检查存在错误引用的节点。
第一步:创建不拆分的 Info 文件。为阻止 texinfo-format-buffer 将 Texinfo 文件拆分为多个小 Info 文件,给 M-x texinfo-format-buffer 命令加上前缀:
C-u M-x texinfo-format-buffer
或者:
C-u C-c C-e C-b
执行后, texinfo-format-buffer 不会拆分文件,也不会为其创建标签表。
第二步:为不拆分的 Info 文件创建标签表(见 “为文件添加标签”)。打开由 texinfo-format-buffer 生成的不拆分 Info 文件,输入:
M-x Info-tagify
第三步:校验该 Info 文件
M-x Info-validate
(注意:Info-validate 中的字母 I 为大写。)
简而言之,操作步骤为:
C-u M-x texinfo-format-buffer M-x Info-tagify M-x Info-validate
完成节点结构校验后,你可以以常规方式重新运行 texinfo-format-buffer ,使其自动构建标签表并拆分文件;也可以手动创建标签表并拆分文件(见 “手动拆分文件”)。
D.11 批处理格式化
你可以使用 batch-texinfo-format 和 Emacs 批处理模式,将 Texinfo 文件格式化为 Info 格式。你可以在任意 Shell 中以批处理模式运行 Emacs,包括 Emacs 内部的 Shell。(参见《GNU Emacs 手册》中的 “初始选项”。)
下面是一条 Shell 命令,用于格式化当前目录下所有以 .texinfo 结尾的文件:
emacs -batch -funcall batch-texinfo-format *.texinfo
Emacs 会处理命令行中列出的所有文件,即使在格式化某些文件时出现错误也会继续执行。
请仅按照示例所示,在 Emacs 批处理模式下运行 batch-texinfo-format ;它不是交互式命令。执行完成后,它会退出批处理模式的 Emacs。
如果你没有 texi2any ,又希望一次性格式化多个 Texinfo 文件, batch-texinfo-format 会很方便。使用批处理模式时,会创建一个新的 Emacs 进程。这会释放你当前的 Emacs,使你可以继续在其中工作。(当你运行 texinfo-format-region 或 texinfo-format-buffer 时,在命令完成前,你无法在该 Emacs 中进行其他操作。)
附录 E 全局文档命令
以下是影响整个文档的附加命令。其中大多数命令用于定制打印输出的外观。如果要使用这些命令,通常都应在 Top 节点之前给出。
E.1 @setchapternewpage: 章节前的空白页设置
在正式装订的书籍中,文本通常双面印刷,章节从右侧页面开始,且右侧页面为奇数页码。但在短篇报告中,文本常单面印刷,章节也可能不另起新页,而是在上一章结尾后,留出少量垂直空白直接接续。
你可以为 @setchapternewpage 命令指定不同参数,来控制打印输出中章节如何另起页,以及页眉是否适配单面 / 双面印刷。
@setchapternewpage 命令需写在行首,后跟参数。例如,让每一章都从新的奇数页开始:
@setchapternewpage odd
@setchapternewpage 支持以下三种取值:
@setchapternewpage off- 新章节不另起页,在上一章结尾后留出垂直空白接续排版;同时页眉按单面印刷格式排版。
@setchapternewpage on- 新章节另起新页,页眉按单面印刷格式排版。这是短篇报告或个人打印最常用的格式,也是默认值。
@setchapternewpage odd- 新章节从新的奇数页(右侧页)开始,并按双面印刷排版。这是书籍与手册最常用的格式。
Texinfo 没有 @setchapternewpage even 命令,因为行业惯例中,章节或书籍不会从偶数页开始。
如果你不喜欢 @setchapternewpage 设置的默认页眉,可以用 @headings 命令显式控制。详见 @headings 命令。
手册或书籍的开头页面不编页码,例如标题页与版权页均无页码。按照惯例,目录与前置内容使用罗马数字编号,与正文页码不连续。
@setchapternewpage 对无分页的输出格式(如 Info、HTML)无效。
我们建议 不要 在文档源码中添加任何 @setchapternewpage 命令,因为这类分页需求并非文档本身的固有属性。在某次特定的纸质版输出中,若你不想要默认效果(无空白页、所有页面页眉相同),可在使用 texi2dvi 时通过 --texinfo 选项指定所需输出。
E.2 页眉设置
大多数印刷版手册,除标题页和版权页外,每页顶部都会带有页眉。部分手册还会包含页脚。页眉与页脚在 Info 或其他输出格式中 无效 。
Texinfo 提供两种标准页眉格式:一种用于单面印刷的手册,另一种用于双面印刷的手册。默认情况下,Texinfo 文件不指定页脚内容,因此页脚保持空白。
Texinfo 还提供若干页眉与页脚命令,可用于自定义页眉、页脚格式。
在 Texinfo 中,页眉与页脚是页面顶部和底部的单行内容,不支持创建多行页眉或页脚。每条页眉或页脚行分为三部分:左侧、中间、右侧。任意部分或整行都可以留空。页眉 / 页脚的左侧内容左对齐,中间内容居中,右侧内容右对齐。
E.2.1 @headings 命令
@headings 命令 很少使用 。它用于指定每页打印哪种类型的页眉和页脚。通常,这一行为由 @setchapternewpage 命令控制。只有当 @setchapternewpage 无法满足需求时,才需要使用 @headings 。
你可以按以下方式使用 @headings :
@headings off- 关闭页面页眉的打印。
@headings single- 启用适用于单面印刷的页面页眉。
@headings double- 启用适用于双面印刷的页面页眉。
@headings singleafter@headings doubleafter- 分别在当前页输出之后,启用单面或双面页眉。
@headings on- 启用页面页眉:如果是
@setchapternewpage on,则使用单面页眉;否则使用双面页眉。
举例:假设你在 @titlepage 命令之前写了 @setchapternewpage off ,让新章节不另起一页。该命令同时会让页眉按单面印刷排版。如果你想让页眉按双面印刷排版,就可以写: @headings double 。
你可以单独一行写 @headings off 来完全停止生成所有页面页眉,例如:
@headings off
E.2.2 标准页眉格式
Texinfo 提供两种标准页眉格式:一种用于 单面印刷 的手册,另一种用于 双面印刷 的手册。
单面印刷的标准格式为:页眉行左侧显示 章节名 ,中间留空,右侧显示 页码 。单面页面效果如下:
_______________________ | | | chapter page number | | | | Start of text ... | | ... | | |
双面印刷的标准格式:
- 在左侧(偶数页):左侧显示 页码 ,中间留空,右侧显示文档标题(由
@settitle命令指定)。 - 在右侧(奇数页):左侧显示 章节名 ,中间留空,右侧显示 页码 。
像打开的书那样并排显示时,偶数页与奇数页效果如下:
_______________________ _______________________ | | | | | page number title | | chapter page number | | | | | | Start of text ... | | More text ... | | ... | | ... | | | | |
章节名前会带有 “Chapter” 字样、章节编号和冒号,便于在手册中定位位置。
注意:在新章节开始的页面,页眉行中可能会省略部分内容。
默认情况下,Texinfo 文件不指定页脚内容,因此 页脚保持空白 。
E.2.3 如何自定义页眉
你可以使用 Texinfo 提供的标准页眉,也可以自定义页眉页脚。默认情况下,Texinfo 没有页脚;如果你显式指定了页脚,正文可用的页面空间会略微缩小。
Texinfo 提供六条命令用于指定页眉与页脚:
@everyheading和@everyfooting:生成奇偶页相同的页眉与页脚。@evenheading和@evenfooting:仅为 偶数页(左侧页) 生成页眉与页脚。@oddheading和@oddfooting:仅为 奇数页(右侧页) 生成页眉与页脚。
在定义自定义页眉页脚之前,必须先用 @headings off 取消预定义的页眉。
下面这个例子将所有页面的页眉设置为:左侧显示章节名、中间显示页码、右侧显示日期:
@headings off
@everyheading @thischapter @| @thispage @| @today{}
你必须使用 @| 分隔左、中、右三部分,否则命令无法区分各部分的起止。
每一部分都可以包含普通文本或 @-命令。文本会像正文中的普通段落一样排版,而 @-命令 会自动展开为页码、日期、章节名等内容。
六条页眉页脚命令
@everyheading left @| center @| right@everyfooting left @| center @| right- ‘every’ 系列命令对奇偶页统一生效。适用于单面印刷,或希望页眉页脚对称的文档。
@evenheading left @| center @| right@oddheading left @| center @| right@evenfooting left @| center @| right@oddfooting left @| center @| right- ‘even’ 和 ‘odd’ 系列命令分别对偶数页、奇数页生效。适用于双面印刷的书籍与手册。
使用 @this... 系列命令可以显示章节、节的名称以及页码。你可以在页眉和页脚的左侧、中间或右侧部分使用这些 @this... 命令。
以下是 @this... 系列命令:
@thispage- 展开为当前页码。
@thissectionname- 展开为当前节的名称。
@thissectionnum- 展开为当前节的编号。
@thissection- 展开为当前节的编号 + 名称,格式如:‘Section 1: Title’。
@thischaptername- 展开为当前章节的名称。
@thischapternum- 展开为当前章节编号,附录则为字母。
@thischapter- 展开为当前章节的编号 + 名称,格式如:‘Chapter 1: Title’。
@thistitle- 展开为文档标题(由
@settitle指定)。 @thisfile- 仅用于
@include文件:展开为当前被包含文件的文件名。如果当前文件不是被包含文件,该命令无效。 仅适用于@include文件:展开为当前被包含文件的文件名。如果当前 Texinfo 源文件不是被包含文件,该命令无效。除非是被包含文件,否则此命令不会提供当前主源文件的文件名。(有关@include文件的更多信息,参见 [包含文件]。)
你还可以使用 @today{} ,会自动展开为当前日期,格式如:‘1 Jan 1900’。
其他 @-命令 与普通文本在页眉页脚中的效果与正文一致。这在编写草稿时特别有用,例如:
@headings off
@everyheading @emph{Draft!} @| @thispage @| @thischapter
@everyfooting @| @| Version: 0.27: @today{}
注意标题不要过长:过长的标题可能会与页眉或页脚的其他部分重叠,从而遮挡内容。
如果你的章节或节非常短,那么在同一页中可能会出现多个章节或节。在这种页面上,你可以通过以下方式指定 @thischapter 、 @thissection 等宏引用哪一个章节或节:
@everyheadingmarks ref@everyfootingmarks ref- 参数 ref 可以是以下两种之一:
top:@this...系列命令将引用页面顶部的章节 / 节;bottom:命令将反映页面底部的章节 / 节。这些 ‘@every…’ 命令对偶数页和奇数页同时生效。 @evenheadingmarks ref@oddheadingmarks ref@evenfootingmarks ref@oddfootingmarks ref- 这些 ‘@even…’ 和 ‘@odd…’ 命令分别只对偶数页或奇数页生效。参数 ref 的用法与 ‘@every…’ 命令相同。
请将这些命令紧接写在 @...contents 目录命令之后;如果没有目录,或者目录打印在手册末尾,则写在 @end titlepage 命令之后。这些命令对 LaTeX 输出无效。
在 TeX 中,默认情况下:页眉和页脚里的 @this... 命令都默认对应页面底部的章节 / 节。
E.3 @paragraphindent: 控制段落缩进
Texinfo 处理器可能会在每个段落的第一行开头插入空白,从而产生段落缩进。你可以使用 @paragraphindent 命令来指定这种缩进。将 @paragraphindent 命令写在行首,后面跟 ‘asis’ 或一个数字:
@paragraphindent indent
缩进方式由 indent 的值决定:
asis- 不改变现有的缩进(打印输出中未实现)。
none0- 取消所有缩进。
- n
- 在 Info 输出中缩进 n 个空格,在打印输出中缩进 n 个 em 单位。
indent 的默认值是 3。 @paragraphindent 对 HTML 输出无效。
最好在 Texinfo 文件开头的页眉结束行之前写入 @paragraphindent 命令,这样区域格式化命令会按照指定值缩进段落。参见 “页眉开始” 部分。
E.4 @firstparagraphindent: 标题后首段缩进
正如你在本手册中所见,任何节的第一段默认不缩进。从排版角度来说,缩进是段落分隔的标志,因此新章节开始时不需要缩进。该缩进由 @firstparagraphindent 命令控制:
@firstparagraphindent word
标题后的第一段是否缩进,由 word 的值决定:
none- 禁止第一段缩进(默认值)。如果启用了
@paragraphindent asis,makeinfo会忽略此选项。 insert- 使用常规段落缩进。该设置会遵循
@paragraphindent命令设定的段落缩进量(参见@paragraphindent: 控制段落缩进)。
@firstparagraphindent 对 HTML 和 DocBook 输出无效。
最好在 Texinfo 文件开头的页眉结束行之前写入 @firstparagraphindent 命令,以便区域格式化命令按指定值缩进段落。参见 “页眉开始” 部分。
E.5 @exampleindent: 环境缩进
Texinfo 处理器会对 @example 及类似环境中的每一行进行缩进。你可以使用 @exampleindent 命令来指定该缩进量。将 @exampleindent 命令写在行首,后跟 asis 或一个数字:
@exampleindent indent
缩进量由 indent 的值决定:
asis- 不改变现有的缩进(打印输出中未实现)。
0- 取消所有缩进。
- n
- 在 Info 输出中,环境缩进 n 个空格;在打印输出中,缩进 n 个 em 单位。
缩进的默认值:在 Info 中为 5 个空格,在打印输出中为 0.4 英寸,略小一些。(缩小缩进是为了让打印手册的物理行能容纳更多字符。)
最好在 Texinfo 文件开头的页眉结束行之前写入 @exampleindent 命令,以便区域格式化命令按照指定值对段落进行缩进。参见 “页眉开始” 部分。
E.6 @smallbook: 打印 “小开本” 书籍
默认情况下,TeX 会按照 8.5 × 11 英寸(美国常用的信纸尺寸)排版页面。不过,你可以在 Texinfo 文件开头、标题页之前,单独一行插入以下命令,让 TeX 或 LaTeX 按照适合装订成书的 7 × 9.25 英寸 格式排版:
@smallbook
(因为很多书籍的尺寸大约就是 7 × 9.25 英寸,所以这个命令其实更适合叫作 @regularbooksize ;但相对于 8.5 × 11 英寸的大尺寸,它就被称为 @smallbook 了。)
关于不修改源文件、也能使用 @smallbook 配合 TeX 排版的其他方法,参见 “使用 texi2dvi 或 texi2pdf 排版” 和 “为 TeX 做准备” 两节。
E.7 A4 纸张打印
你可以使用 @afourpaper 命令,将文档按 ISO 216 A4 纸张尺寸排版。把该命令单独写在 Texinfo 文件开头附近、标题页之前即可。
你可以根据喜好选择是否使用 @afourlatex 命令提供的排版效果。此外还有:
@afourwide:适用于宽版 A4 纸张@afivepaper:适用于 A5 纸张@bsixpaper:适用于 B6 纸张
关于无需修改源文件就能按不同纸张尺寸排版的其他方法,参见「使用 texi2dvi 或 texi2pdf 排版」和「为 TeX 做准备」两节。
E.8 @pagesizes [ width/][, /height ]: 自定义页面尺寸
你可以使用 @pagesizes 命令显式指定页面上正文区域的高度和(可选的)宽度。将该命令单独写在 Texinfo 文件开头附近、标题页之前。高度在前,宽度(如需指定)在后,中间用逗号分隔。示例:
@pagesizes 200mm,150mm
以及
@pagesizes 11.5in
这对于在 B5 尺寸纸张上打印比较合适。需要强调的是:该命令指定的是正文区域大小,而非纸张本身大小(B5 纸张为 250mm × 177mm,法律纸为 14in × 8.5in)。
如果要进行更复杂的修改(例如更改页面边距),你必须在 texinfo.tex 或 texinfo.cnf 中定义新命令。
关于无需修改源文件即可指定 @pagesizes 的其他方法,参见「使用 texi2dvi 或 texi2pdf 排版」和「为 TeX 做准备」两节。
E.9 微排版
部分版本的 TeX(即 pdfTeX 和 LuaTeX)支持微排版功能。这些功能包括对字体字形进行轻微拉伸,并允许文字极轻微地超出页边距。使用这些功能可以让 TeX 在将段落拆分为行时拥有更大的灵活性,并通过减少断字次数、生成更均匀的排版灰度来提升段落外观。
texinfo.tex 在可用时会自动启用这些微排版特性(简称 ‘microtype’)。你可以在输入文件中通过 @microtype off 关闭微排版;同样,使用 @microtype on 可以重新开启。
LaTeX 输出所使用的字体可能不支持缩放。如果字体不可缩放,启用微排版在转换 LaTeX 输出时可能会触发错误。因此,LaTeX 输出默认不开启微排版,但可以通过 @microtype on 手动启用。为 LaTeX 默认输出字体获取可缩放字体的一种方法是安装 CM-Super 字体包(http://ctan.org/pkg/cm-super)。
@microtype 命令对其他输出格式无效。
E.10 放大比例
你可以使用 TeX 命令 \mag 来让 TeX 把页面排版得比平常更大或更小。所有被排版的内容都会按比例放大或缩小。(=\mag= 是 ‘magnification’(放大)的缩写。)这不是一条 Texinfo 的 @-命令,而是一条原生 TeX 命令,以反斜杠开头。你必须把这条命令写在 @tex 和 @end tex 之间(参见「原生格式化器命令」)。
在 \mag 命令后跟上等号 ‘=’ 和一个数字,该数字是你想要放大倍数的 1000 倍。例如,要以正常大小的 1.2 倍 打印页面,可在 Texinfo 文件开头、标题页之前写下:
@tex
\global\mag=1200
@end tex
在某些印刷技术中,你可以给印刷店提供比正常尺寸更大的原版文件,让他们进行缩小输出,这样得到的普通大小副本效果会更好 —— 相当于变相提高了分辨率。
根据你的系统不同,使用非标准 \mag 值生成的 DVI 文件可能无法打印,或只能以特定放大倍率打印。请做好需要多次试验的准备。
附录 F 信息文件格式规范
本节描述 Info 格式的技术细节。
在本正式描述中,字符 <>*()|=# 用于描述语言本身,其他字符为字面字符。使用的典型形式规则如下: <...> 表示元变量名,‘=’ 表示定义,‘*’ 表示重复,‘?’ 表示可选,‘()’ 表示分组,‘|’ 表示选择,‘#’ 表示注释。
一般来说,读取 Info 文件的程序应对文件中出现的关键字不区分大小写(例如 ‘Tag Table’ 和 ‘Tag table’ 应视为等价),以便兼容使用不同大小写的 Info 生成程序。
我们用 <lparen> 和 <rparen> 表示字面括号(属于 Info 格式本身的括号),分别对应单个字符 ‘(’ 和 ‘)’。最后,双字符序列 ^x 表示单个控制字符 Ctrl-x , x 可为任意字符。
本格式定义是在 Info 格式首次诞生约 25 年后编写的。因此,如果本定义与实际使用存在冲突,以实际使用为准。同时,本文档假定读者具备 Texinfo 基本知识;它旨在为实现者提供指南,而非严格的技术标准。我们可能会引用本手册其他章节的示例与定义,而不重复赘述所有细节。
F.1 Info 格式:整册手册
首先,Info 手册分为 nonsplit非拆分式 (全部内容包含在单个文件中)和 split拆分式 (分布在多个文件中)。
非拆分式手册的语法结构为:
<nonsplit info file> = <preamble> <node>* <tag table>? <local variables>?
若采用拆分式,则存在一个 main file主文件 ,仅包含指向其他 subfile子文件 中节点的指针。主文件结构如下:
<split info main file> = <preamble> <indirect table> <tag table> <local variables>?
拆分式手册中的子文件语法结构为:
<split info subfile> = <preamble> <node>*
注意:对于拆分文件,标签表(tag table)不是可选的,它与间接表(indirect table)配合,用于定位某个节点所属的子文件。
Info 文件中的多个部分(如节点或标签表)都以如下序列开头:
<separator> = (^L)?^_(^L)?^J
即:一个 CTRL-_ 字符后跟一个换行符,前后可带有可选的换页符。
F.2 Info 格式:序言
前言(preamble) 是所有输出文件开头的文本。默认情况下,它不会在 Info 阅读器中显示,但可根据用户需求展示。
<preamble> = <identification> # “本文档为 FILENAME,由……生成” <copying text> # @copying 文本的展开内容 <dir entries> # 由 @dircategory 与 @direntry 生成
各组成部分说明:
<identification line>- 标识行。输出文件开头的任意字符串,其后跟一个空行。
<copying text>- 版权声明文本。若手册中包含
@copying环境,则为该环境内容的展开结果(参见@copying: 声明复制权限)。 <dir entries>- 目录项。手册中所有
@dircategory和@direntry命令的处理结果(参见 安装 Info 目录文件)。
F.3 Info 格式:间接表
<indirect table> = <separator> Indirect: (<filename>: <bytepos>)*
间接表仅在输出拆分文件时写入主文件。它以十进制整数形式指定:若将所有子文件按顺序拼接(不含顶层文件),每个子文件中第一个节点的起始字节位置(从 0 开始计数)。第一条条目指向实际内容的第一个节点。
举例说明:假设为 GDB 手册生成分拆输出,顶层文件 gdb.info 中会包含类似内容:
<separator> Indirect: gdb.info-1: 1878 gdb.info-2: 295733 ...
这告知 Info 阅读器:手册的第一个节点位于文件 gdb.info-1 的第 1878 字节处(该位置在文件的前言之后)。如果将 gdb.info-2 拼接到 gdb.info-1 之后(包含两个文件的前言部分),则子文件 gdb.info-2 中的第一个节点将从第 295733 字节开始。
遗憾的是,由于各种缺陷与疏忽, makeinfo 等生成 Info 文件的程序并非总能完美实现这些规则。因此,健壮的 Info 阅读器在给定位置并非恰好是节点起始处时,不应立即放弃,而应回退到在该位置附近搜索节点。
F.4 Info 格式:标签表
<tag table> = <separator> Tag Table: (<lparen>Indirect<rparen>)? (Node|Ref): <nodeid>^?<bytepos> <separator> End Tag Table
行 ‘(Indirect)’ 仅在拆分输出时出现。
标签表用于指定文件中每个节点与锚点的起始字节位置。若为拆分输出,标签表只写入主输出文件。
每一行按标注将标识符定义为锚点或节点。例如: Node: Top^?1647 表示名为 ‘Top’ 的节点从第 1647 字节开始。 Ref: Overview-Footnote-1^?30045 表示名为 ‘Overview-Footnote-1’ 的锚点从第 30045 字节开始。
同一标识符同时以两种方式定义属于错误。
- 非拆分输出:字节位置直接对应输出文件内的位置。
- 拆分输出:字节位置对应将所有拆分文件(不含顶层文件)按顺序拼接后形成的虚拟文件中的位置,参见上一节。
示例:
^_ Tag Table: Node: Top^?89 Node: Ch1^?292 ^_ End Tag Table
plaintext
这表示手册包含 ‘Top’ 和 ‘Ch1’ 两个节点,分别位于第 89 字节和第 292 字节。由于没有 ‘(Indirect)’ 行,说明手册未拆分。
文件中的前言段或其他非节点内容,不会在标签表中出现条目。
F.5 Info 格式:局部变量
局部变量段是可选的。它目前用于给出编码信息或文档语言代码。
<local variables> = <separator> Local Variables: (coding: <encoding>)? (Info-documentlanguage: <language>)? End:
有关文档编码的信息,请参见 @documentencoding enc: Set Input Encoding。
‘<language>’ 应采用 ll 或 ll_cc 格式;参见 @documentlanguage ll[_cc]: Set the Document Language。即使 Texinfo 文档中多次出现 @documentlanguage ,局部变量段中也只能指定一种语言。
F.6 Info 格式:普通节点
常规节点的格式如下:
<node> = <separator> File: <fn>, Node: <id1>, (Next: <id2>, )? (Prev: <id3>, )? Up: <id4> <general text, until the next ^_ or end-of-file>
每个冒号和逗号后面至少要有一个空格或制表符,但任意数量的空格都会被忽略。节点标识符 <id> 的格式如下:
<id> = (<lparen><infofile><rparen>)?<node-spec>? <node-spec> = <nodename> | <del><nodename><del> <del> = ^?
该 <node> 在文件 <fn> 中定义了 <id1> ,文件 <fn> 通常为 ‘manualname’ 或 ‘manualname.info’。 <id1> 中不允许出现带括号的 <infofile> 部分。
Next、Prev、Up 后面的每个标识符都指向文件内的节点或锚点。这些指针通常指向同一文件内,但 ‘(dir)’ 常被用来指向顶层目录文件。如果使用了 <infofile> 部分,则可以省略节点名,此时该节点标识符指向被引用文件中的 Top 节点。
Next 和 Prev 指针是可选的。Up 指针技术上也是可选的,但这通常意味着节点结构存在错误。按照惯例,节点会组织成树形结构,但这并非格式强制要求。
包含句号、逗号、冒号或圆括号的节点名可能会使 Info 阅读器产生混淆。如果需要引用名称包含这些字符的节点,应使用一对 DEL 字符(‘CTRL-?’,字符编码 127)将 <nodename> 包裹起来。 makeinfo 在默认情况下会在需要时自动添加这些字符。注意:并非所有 Info 阅读器都识别该语法,参见 Info 节点名约束。
节点的 <general text> (普通文本)部分可以包含后续描述的特殊结构。
F.7 Info 格式:菜单
按照惯例,菜单出现在节点末尾,但 Info 格式对其位置不做任何限制。
<menu> = * Menu: (<menu entry> | <menu comment>)*
<menu entry> (菜单项)的组成部分在《菜单的组成》中也有描述。它们与交叉引用的语法相同,只是以 ‘*’ 开头,而非 ‘* (N|n)ote’(参见 Info 格式:交叉引用)。索引扩展了菜单格式,用于指定目标行;参见 Info 格式:打印索引。
<menu comment> (菜单注释)是指不以 ‘*’ 开头的任意行,它可以出现在菜单开头,或者与菜单项之间隔有一个或多个空行。这些注释会原样作为菜单的一部分显示(参见 编写菜单)。
F.8 Info 格式:图片
@image 命令会在 Info 文件中生成以下特殊指令(参见 插入图像):
<image> = ^@^H[image src="<image file>" (dpi=<dpi>)? (depth=<depth>)? (text="<txt file contents>")? (alt="<alt text>")? ^@^H]
本说明中的换行和缩进仅为排版需要;Info 文件中该指令各部分之间的空白符可任意设置。
在字符串 <image file> 、 <txt file contents> 和 <alt text> 中:
- 双引号 ‘"’ 需转义为
\" - 反斜杠
\需转义为\\
txt 和 alt 配置项为可选。
各参数说明
alt 值:作用与 HTML 中的 alt 属性一致,即对图像的文本描述。例如在纯文本显示终端或语音播报系统中,会使用 alt 值替代(通常为图形格式的) <image file> 进行展示。
<txt file contents> :若存在,应作为图像的 ASCII 字符形式表示,适用于纯文本显示场景。
格式本身不强制规定需优先展示 <image file> 、 <alt text> 还是 <txt file contents> ,由阅读器自行决定。
可选参数( dpi / depth )
dpi 和 depth 选项仅在为 texi2any 工具的实验性变量 INFO_MATH_IMAGES 输出内容时生效(参见 Info 与纯文本自定义变量)。
dpi (每英寸点数)
dpi 指定图像的每英寸点数(DPI)。Info 阅读程序可利用该值缩放图像,使其尺寸与周边文本适配。图像显示高度(像素)的参考计算公式如下:
\[ h_{display} = (h_{file} / dpi) * (72.27/10) * f \]
公式中各参数含义:
- h_{display}:图像的目标显示高度(像素)
- h_{file}:图像未缩放时的原始高度(像素)
- dpi :Info 文件中指定的图像 DPI 值
- f :当前使用字体的字号(像素)
公式中的 72.27 是 1 英寸对应的点数(TeX 系统定义);10 是 TeX 默认的 10 点字体大小(即 1 em 的尺寸)。商值 72.27/10 表示每英寸对应的 em 数,用于将图像的英寸高度转换为 em 高度。
depth(基线下方深度)
depth 指定图像在基线下方的深度(单位:图像像素,缩放前)。阅读程序应根据该值向下偏移图像,使其与周边文本正确对齐。
F.9 Info 格式:索引打印
Info 格式中的索引是一种特殊的菜单,在开头多了一条专门标记它为索引菜单的指令。
<printindex> = ^@^H[index^@^H] * Menu: <index entry>*
索引项( <index entry> ) 与普通菜单项类似,但自由格式的描述部分被替换为该条目在正文中出现的行号:
<index entry> =
* <entry text>: <node-spec>. <line-spec>
<line-spec> =
<lparen>line <lineno><rparen>
开头部分 ‘<entry text>: <entry node>.’ 应位于同一行。 <entry text> 即为索引词条。
尽管 <entry text> 后面跟有冒号,但其本身可以包含冒号,因此 Info 阅读器应尽可能将整行的前面部分都当作 <entry text> 处理。(但 <entry text> 中不能包含可能出现在 <node-spec> 中的 DEL 控制字符。)
<lineno> 是一个无符号整数,表示相对于对应节点起始处的行号。在 <line-spec> 之前可以有一个可选的换行。
示例:
^@^H[index^@^H] * Menu: * thunder: Weather Phenomena. (line 5)
这表示索引词条 ‘thunder’ 出现在节点 ‘Weather Phenomena’ 的第 5 行。
F.10 Info 格式:交叉引用
Info 格式中的通用交叉引用具有以下两种形式之一:
<cross-reference> =
* (N|n)ote <id>::
| * (N|n)ote <label>:<id>(.|,)
<id> = (<lparen><infofile><rparen>)?<node-spec>?
<label> = <label text> | <del><label text><del>
字符 ‘*’ 与后面的 ‘N’ 或 ‘n’ 之间不能有空格。句子开头应使用 ‘*Note’,其他位置应使用 ‘*note’。(部分 Info 阅读器,如 Emacs 内置的阅读器,可将 ‘*Note’ 和 ‘*note’ 分别显示为 ‘See’ 和 ‘see’。)两种形式中, <label text> 均为描述性文本。
两种形式里的 <id> 都指向一个节点或锚点,用法与节点信息行中的引用一致(参见 Info 格式:常规节点)。可选的带括号的 <infofile> 是被引用手册的名称, <node-spec> 给出该手册内的节点或锚点。
第二种形式带有描述性标签。这种形式的交叉引用通常应以逗号或句号结尾,以便确定 <id> 的结束位置。
如果 <label> 中包含冒号( : ),则应使用一对 <del> 字符将其包裹。同理,如果节点名包含易引发解析问题的字符,也可使用这种转义方式;此时无需结尾的逗号或句号。如前所述,并非所有 Info 阅读器都支持这种转义机制。
该格式不规定如何查找其他手册以解析这类引用。
示例:
*note GNU Free Documentation License:: *note Tag table: Info Format Tag Table, for details. *Note Overview: (make)Top. *Note ^?:^?: (bash)Bourne Shell Builtins. *Note alloca.h: (gnulib)^?alloca.h^?.
第一个示例使用简写形式引用当前手册内的节点。
第二个同样引用当前手册内的节点 ‘Info Format Tag Table’;冒号前的 ‘Tag table’ 只是该引用的标签,‘for details.’ 属于句子文本,而非引用的一部分。
第三个示例引用另一个手册 ‘make’ 中的 ‘Top’ 节点,‘Overview’ 是该交叉引用的标签。
第四个示例展示了标签中冒号的转义写法。第五个示例展示了节点名中点号的转义写法。
参见 交叉引用。
附录 G GNU 自由文档许可证
命令索引
变量索引
通用索引
脚注
Footnotes:
texi2any 可以处理输入文件名中的非 ASCII 字符,但输出文件名中的非 ASCII 字符会对部分输出格式(尤其是交叉引用)造成问题。
我们发现,将独立手册的版本称为 “editions(版次)”,程序的版本称为 “versions(版本)”,有助于区分;否则在交流中,很容易因用相同词汇指代文档和软件而造成混淆。
在 2013 年 Texinfo 5 发布之前,该特性以临时方式支持(通过 makeinfo 的 --commands-in-node-names 参数)。现在它已成为语言标准的一部分。
在 TeX 输出中, @var 目前在代码环境(如 @code 或 @example )中使用斜体等宽字体。我们计划在下一版本中将其改为: 在所有环境中都使用变宽斜体罗马字体 。若想避免这一变更,可用 @set 设置 ‘txicodevaristt’ 标志;若想现在就启用这一变更,可写 ‘@clear txicodevaristt’ (见 @set and @value )。注意:该标志对 LaTeX 输出无效。
脚注应当是对正文的补充或展开,但读者 不需要 阅读脚注也能理解正文内容。关于脚注的详细讨论,可参见《芝加哥手册》(The Chicago Manual of Style),该书由芝加哥大学出版社出版。
这是示例脚注。
texi2any 为 Texinfo 手册支持更多编码,理论上可支持 Perl 与 iconv 支持的所有编码(参见《GNU C 库》中的通用字符集转换)。但部分输出格式(尤其是 LaTeX)的编码支持可能仍不完善。
PDF 即 “便携式文档格h式”(Portable Document Format),由 Adobe 公司基于其 PostScript 语言设计,用于文档交换。
在 MS‑DOS/MS-Windows 系统上,Info 阅读器还会尝试 .inf 后缀。