翻译: GNU Texinfo 7.2
- TAGS: Translate
[ 最后修订与导出时间: 2026-02-26 00:20:13 +0800 ,总字数: 18601 ]
Texinfo
本手册适用于 GNU Texinfo(版本 7.2,2024 年 12 月 20 日),这是一个文档系统,可以使用语义标记从单个源生成在线信息和打印手册。
Texinfo 复制许可条款
GNU Texinfo 是 自由软件 ,即任何人都可在特定条款下自由使用、自由再分发本软件。Texinfo 并非公有领域内容,其受版权保护且对分发行为设有相关限制,但这些限制的制定初衷,是保障所有遵守协作准则的使用者能行使合理的使用权利。本条款禁止的行为,是试图阻止他人进一步分享其从你处获取的任一版本的 Texinfo 软件。
具体而言,我们保障你享有以下权利:无偿分发与 Texinfo 相关的程序副本;获取相关程序的源代码,或在需要时能够获取该代码;修改这些程序,或在新的自由软件中使用其部分代码;同时你也有权知晓自身可行使上述所有权利。
为确保所有人都能享有上述权利,我们禁止你以任何方式剥夺他人的这些权利。例如,若你分发 Texinfo 相关程序的副本,必须将你所享有的全部权利一并赋予接收者;必须确保接收者同样能获取或有权获取该程序的源代码;同时必须向其告知所享有的各项权利。
此外,为保护本项目的权益,我们需让所有使用者知晓:与 Texinfo 相关的程序不提供任何担保。若此类程序经他人修改后进行传播,我们希望接收者能够明确知晓,其获取的程序并非由本项目原封分发的版本,从而避免他人修改引入的问题对本项目的声誉造成影响。
当前分发的 Texinfo 相关程序,其许可协议的具体条款均载明于随程序附带的《通用公共许可证》中。本手册的版权保护与使用条款遵循《GNU 自由文档许可证》(详见《GNU 自由文档许可证》章节)。
1. Texinfo 概述
Texinfo 是一套文档编制系统,仅需编写单个源文件,即可生成在线查阅文档与印刷版输出文档。这意味着你无需为每种输出格式单独撰写不同文档,只需完成一份文档的编写即可。
通过 Texinfo,你可借助 TeX 排版系统生成 PDF 格式的印刷版文档,文档可包含章节、小节、交叉引用和索引等内容。基于同一个 Texinfo 源文件,你还能生成适用于网页浏览器的 HTML 格式文档,生成可在 GNU Emacs 或其他 Info 阅读程序中使用的 Info 文件,同时也能生成 DocBook、EPUB 3 或 LaTeX 格式的文件。
Texinfo 源文件为纯文本文件,内容中穿插着 @-commands (以 @开头的指令),这些命令用于告知 Texinfo 处理程序执行对应的操作。Texinfo 的标记命令几乎完全具备语义化特性,也就是说,这些命令用于定义文档中文本的实际语义,而非单纯的外观格式排版指令。
GNU Emacs 中内置了专门的 Texinfo 模式,该模式提供了各类与 Texinfo 相关的功能(详见《使用 Texinfo 模式》章节)。
Texinfo 是专为编写软件说明文档和手册设计的工具。如果你想要为自己的程序编写优质手册,Texinfo 的诸多功能将为你简化编写工作。但需要注意的是,Texinfo 并非通用型排版程序,它几乎未提供任何用于控制最终排版效果的命令。因此,若你需要排版报纸、制作精美杂志广告,或遵循出版社严苛的格式排版要求,Texinfo 可能无法满足你的使用需求。
“Texinfo” 的拼写规范为:首字母 T 大写,其余字母均小写。该单词的第一个音节发音与 “speck”(/spek/)一致,而非 “hex”(/heks/)。这一特殊的发音方式源于 TeX 的发音规则。TeX 的发音需将末尾的 X 读作巴赫(Bach)姓氏中最后一个音的发音,TeX 中的字母 X 并非英语中常见的 “ex” 发音,实际对应希腊字母 χ(chi)的发音。
Texinfo 是 GNU 项目的官方文档格式。你可通过 GNU 文档网页获取更多相关信息,其中包括各类 GNU 软件包的使用手册。
1.1. 问题反馈
我们欢迎大家针对 Texinfo 系统的任意方面提交问题反馈与改进建议,涵盖程序运行、文档内容、安装部署等相关问题。请将反馈内容发送至邮箱:[email protected]。你可通过 Texinfo 官方主页获取其最新版本,网址为:https://www.gnu.org/software/texinfo。
提交问题反馈时,请提供足够信息,确保维护者能够复现相关问题。一般来说,需包含以下内容:
- Texinfo 的版本号,以及涉事的程序和手册版本
- 复现问题所需的所有输入文件内容
- 涉事程序的具体运行步骤
- 问题现象描述,以及所有错误输出的样本
- 所用的硬件设备、操作系统名称及版本
- 你认为有帮助的其他相关信息
若不确定某项信息是否需要提供,建议一并附上。提供的信息宁多勿少,避免遗漏关键内容。
务必附上能复现问题的实际输入文件,这一点至关重要。
若 GNU Emacs 中的 Info 阅读器出现问题,需向 Emacs 开发团队提交反馈,具体可参阅《GNU Emacs 手册》中的 “问题反馈” 章节。
我们同样欢迎大家提交程序补丁。若有相关提交,建议使用 'diff -c'、 'diff -u' (详见《文件的比较与合并》)或 'git diff' 命令生成补丁,并附上 ChangeLog 变更记录(详见《GNU 编码标准》中的 “变更日志” 章节),同时遵循项目现有的编码规范。
1.2. 输出格式
下文为 Texinfo 目前支持的输出格式总览。
Info- 信息文档格式。
(通过
texi2any生成)该格式基本是 Texinfo 源文件的纯文本转写形式,仅添加少量控制字符,为交叉引用、索引等功能提供导航信息。GNU Emacs 的信息文档子系统(参见《信息文档》)、独立的 info 程序(参见《GNU 信息文档程序》)等工具均可读取此类文件。相关详情参见《Info 文件》与《创建并安装 Info 文件》章节。 Plain text- 纯文本格式。
(通过
texi2any --plaintext生成)该格式与 Info 格式输出几乎一致,仅剔除了用于导航的控制字符。 HTML- 超文本标记语言。
(通过
texi2any --html生成)HTML 是超文本标记语言的缩写,为World Wide Web万维网文档的编写标准,可由网页浏览器在线渲染展示。HTML 拥有多个版本,既包含不同的官方标准,也存在各浏览器专属的扩展规范。texi2any工具仅使用该语言的通用子集,可被所有主流浏览器解析,且刻意避免使用大量较新或支持度较低的标签。因此其原生输出样式虽较为简洁,但可根据需求在多个层级进行自定义配置。相关详情参见《生成 HTML 文档》章节。 EPUB 3- 电子出版格式。
(通过
texi2any --epub3生成)EPUB 是专为便携式设备阅读电子书设计的格式,由 HTML 衍生而来。该格式最初由国际数字出版论坛(IDPF)开发,目前该组织已并入万维网联盟(W3C)。其最新主要修订版本 EPUB 3 于 2011 年发布。 DVI- 设备无关格式。
(通过
texi2dvi生成)设备无关二进制格式是 TeX 排版程序(官网:http://tug.org)的输出格式,需由 DVI 驱动程序解析后,转换为适配具体设备的显示或打印指令。常用的 DVI 驱动程序包括:将格式转换为 PostScript 格式的 Dvips(参见《Dvips 工具》)、用于 X 窗口系统显示的 Xdvi(下载地址:http://sourceforge.net/projects/xdvi/)。相关详情参见《使用 TeX 进行排版与打印》章节。(请注意:Texinfo 语言与 TeX 系列常用语言差异显著,包括纯 TeX、LaTeX、ConTeXt 等。) PostScript- 页面描述语言。
(通过
texi2dvi --ps生成)PostScript 是一种页面描述语言,自 1985 年起被广泛应用,至今仍在使用。其基础介绍及更多相关参考可参见:https://en.wikipedia.org/wiki/PostScript。Texinfo 默认识别 dvips 程序,将 TeX 生成的 DVI 格式转换为 PostScript 格式。相关详情参见《Dvips 工具》章节。 PDF- 便携式文档格式。
(通过
texi2dvi --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 格式基本是 Texinfo 源文件的纯文本转写形式,仅添加少量控制字符用于分隔节点并提供导航信息,供 Info 阅读程序解析运行。
Info 文件几乎均由处理 Texinfo 源文档生成, texi2any (也称作 makeinfo )是将 Texinfo 文件转换为 Info 文件的核心命令,相关说明参见《texi2any:Texinfo 转换工具》章节。
通常情况下,用户会通过一个约定命名为 'Top' 的节点进入 Info 文件。该节点一般仅包含文件用途的简要说明,以及一个可访问文件其余内容的大型菜单。从该节点开始,你既可以按节点依次浏览整个文件,也可以直接跳转到主菜单中列出的指定节点,还可以检索索引菜单并直接定位到包含所需信息的节点。此外,使用独立的 Info 程序时,你还能在命令行中指定具体的菜单项(参见《Info 程序》章节)。
若你希望像阅读印刷版手册一样按顺序浏览 Info 文件,可反复按下空格键(SPC),也可使用 Info 高级命令 g * 调出整个文件的内容(参见《Info 程序中的高级命令》章节)。
info 目录下的 dir 文件 是整个 Info 系统的入口,通过该文件可访问完整 Info 系统中各文档的 'Top' 节点。
若你希望通过统一资源标识符(URI)引用 Info 文件,可使用以下示例中的非官方语法,该语法可在 Emacs/W3 等工具中正常使用:
info:emacs#Dissociated%20Press info:///usr/info/emacs#Dissociated%20Press info://localhost/usr/info/emacs#Dissociated%20Press
需要注意的是,info 程序本身并不支持解析任何形式的 URI。
1.4. 印刷书籍
Texinfo 文件可以被格式化并排版成印刷书籍或手册。要实现这一点,你需要使用 TeX—— 这是由斯坦福大学的高德纳(Donald Knuth)编写的一款专业排版程序,它并不包含在 Texinfo 发行包中。
Texinfo 提供了一个 texinfo.tex 文件,其中包含 TeX 在排版 Texinfo 文件时所需的定义。你可以从 Texinfo 官网获取最新版的 texinfo.tex:https://www.gnu.org/software/texinfo/。
基于 Texinfo 制作的书籍与其他排版印刷品类似:可以包含标题页、版权页、目录、前言,以及章节、带编号或无编号的小节与子小节、页眉、交叉引用、脚注和索引等。
TeX 功能非常强大,特性极多。但由于 Texinfo 文件必须既能以 Info 形式在纯字符终端上展示信息,又能排版成印刷书籍,因此 Texinfo 所支持的格式化命令会受到一定限制。
有关使用 TeX 处理手册的更多信息,请参见《使用 TeX 进行格式化与印刷》。
1.5. 新增输出格式
前面几节介绍的输出格式已经能满足非常广泛的使用场景,但显然仍有扩展空间。
如果你是程序员,并希望通过为 Texinfo 实现更多输出格式来为 GNU 项目贡献代码,那将非常有价值。最实用的实现方式是为 texi2any 编写一个新的后端 —— 它是我们的 Texinfo 解析器参考实现,会将 Texinfo 输入转换成树形结构,你可以直接基于该结构进行格式转换。源码文件 tp/Texinfo/Convert/Converter.pm 中的文档是很好的起点(详见 Texinfo 模块文档中的 Texinfo::Convert::Converter)。参见:texi2any:Texinfo 翻译器。
另一种可行的方式是使用 texi2any 输出的 Texinfo XML 作为输入。如上所述,这种 XML 基本完整表示了原输入内容,且不含 Texinfo 本身的语法与选项特性。
如果你仍然忍不住想直接编写一个读取 Texinfo 源码的新程序,我们再多提醒一句:请不要低估所需工作量。Texinfo 绝非易于正确解析的简单语言,且仍在持续开发中,这意味着你需要承担长期维护工作。建议你确保 texi2any 附带的语言测试用例在你的新程序中都能正确运行。
不时有人提议从 Texinfo 源码生成传统 Unix man 手册页。但由于 man 手册页有严格的约定格式,编写一份优质的 man 手册所需的源码,与用于编写优质用户教程 / 参考手册的典型 Texinfo 源码完全不同。这使得生成 man 手册与 Texinfo 的设计目标相冲突 ——Texinfo 的设计初衷就是 不必为不同输出格式用不同方式重复编写同一份文档 。你不如直接编写 man 手册。
作为支持 man 手册的替代方案,你可能会发现 help2man 工具很有用。它从程序的 '--help' 输出生成传统格式的 man 手册页。事实上,Texinfo 发行版中自带程序的 man 手册页就是用它生成的。这是由 Brendan O’Dea 开发的 GNU 软件,可从 http://www.gnu.org/software/help2man 获取。
1.6. 发展历史
理查德・M・斯托曼(Richard M. Stallman)发明了 Texinfo 格式,编写了最初的处理程序,并创建了本手册的 1.0 版。罗伯特・J・查塞尔(Robert J. Chassell)从 1.1 版开始,对手册进行了大量修订与扩充。布莱恩・福克斯(Brian Fox)负责 Texinfo 的独立发行版直至 3.8 版本。卡尔・贝里(Karl Berry)从 Texinfo 3.8(手册 2.22 版)开始继续维护,加文・史密斯(Gavin Smith)则从 Texinfo 6.0 起接手维护工作。
起源
理查德・斯托曼在 1975/1976 年的 Emacs 最初实现中,加入了一个名为 Info 的在线超文本帮助系统。几年前,他观看了道格拉斯・恩格尔巴特(Douglas Engelbart)的「NLS」超文本系统演示后深受启发。
另一方面,20 世纪 70 年代,卡内基梅隆大学(CMU)的布莱恩・里德(Brian Reid)开发了名为 Scribe 的程序与格式,用于标记文档以便打印输出。它和 Texinfo 一样,使用 @ 符号开头表示命令。更重要的是,Scribe 致力于描述文档内容而非排版样式,这一理念被 Texinfo 完全继承。
与此同时,麻省理工学院(MIT)的人员开发了另一种格式 Bolio。理查德・斯托曼(RMS)将 Bolio 改造为使用 TeX 作为排版语言,形成了 BoTeX。已知最早的 BoTeX 版本是 1984 年 10 月 31 日的 0.02 版。
BoTeX 仅能作为打印文档的标记语言,无法用于在线文档。RMS 将 BoTeX 与 Info 结合,创造了 Texinfo—— 一种既可在线阅读、也可打印成书的文本标记语言。
最初用于生成 Info 格式的转换器(主要由 RMS 与 Bob Chassell 完成)是用 Emacs Lisp 编写的,即 texinfo-format-buffer 等函数。20 世纪 90 年代初,Brian Fox(布莱恩・福克斯)用 C 语言重新实现了转换程序,即现在的 makeinfo ,同时也实现了独立的 info 阅读器。
用 Perl 重新实现
2012 年,C 语言版的 makeinfo 被一个 Perl 实现版本取代,该版本统称为 texi2any 。此版本支持与 texi2html 同等程度的输出定制能力。 texi2html 最初由 Lionel Cons 编写,后来由众多开发者共同完善。为让 texi2html 能替代 makeinfo 所需的大量新特性,由 Patrice Dumas 实现。 texi2any 的第一个从未发布的版本基于 texi2html 代码。
不过,该实现后来被废弃,转而使用当前程序(同样由 Patrice Dumas 编写),它会将 Texinfo 输入解析为树形结构再进行处理。它继承了 texi2html 的定制设计与其他特性(关于 texi2html 兼容性,详见 texi2html:texi2any 的前身)。但 texi2any 是完全重新实现:它为所有后端生成基于树结构的输入文档表示,供各后端使用。
这个新的 Perl 程序比旧的 C 程序慢很多。尽管自首次发布以来速度差距有所缩小,但可能永远无法完全匹敌。那我们为何还要切换?简而言之:我们希望并相信,当前程序会比之前 C 版的 makeinfo 更容易扩展,以支持不同输出样式、后端格式及各类定制。具体原因如下:
- HTML 定制:多年来,许多 GNU 及其他自由软件项目都在顺畅使用
texi2html的 HTML 定制功能。实际上当时已存在两套独立的 Texinfo 语言实现,保持同步十分困难。把texi2html中的 HTML 定制能力加入 C 程序工作量巨大。 - Unicode 与多语言支持,尤其是东亚语言。当时若用 C 实现几乎等于重写整个程序。虽然后来解析器和部分转换后端改用 C 编写,但转换后端主体仍为 Perl,其内置了良好的多语言支持。
- 新增后端:
makeinfo代码已变得十分复杂,新增后端极为繁琐,需要与现有后端进行复杂交互。相比之下,新实现提供清晰的树结构表示,供所有后端使用。用户已提出多种后端需求(LaTeX、最新 (X) HTML 等),此次改造让这些后端更易实现。 - 降低贡献门槛:整体上,更清晰的结构、分离的解析器 / 后端设计,会让任何人都更容易阅读代码并参与贡献,带来显而易见的好处。尽管十年过去,社区贡献的后端仍未出现,但理论上这种结构更利于协作贡献。
texi2any 旨在成为参考实现,用于定义手册中未完全规范的语言细节。若无这样的参考实现,其他实现很可能出现或明显或细微的行为差异,进而导致 Texinfo 文档与特定处理器绑定。同时,为所有处理器提供一致的命令行选项也很重要。与 texi2any 同步开发了大量语言与处理器测试用例;我们鼓励所有打算编写 Texinfo 解析程序的人使用这些测试。
随着 texi2any 作为参考实现发布,C 语言版 makeinfo 与 texi2html 的开发均已停止。今后,我们建议 Texinfo 文档作者仅使用 texi2any 。
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 示例手册 1.0
@copying
这是一个完整 Texinfo 文件的简短示例。
版权所有 @copyright{} 2016 Free Software Foundation, Inc.
@end copying
@titlepage
@title 示例标题
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage
@contents
@node Top
@top GNU 示例
本手册适用于 GNU Sample
(版本 @value{VERSION},@value{UPDATED})。
@menu
* 第一章:: 第一章是本示例
中唯一的一章。
* 索引:: 完整索引。
@end menu
@node 第一章
@chapter 第一章
@cindex 章,第一章
这是第一章。
@cindex 索引项,另一个
下面是一个有序列表。
@enumerate
@item
这是第一项。
@item
这是第二项。
@end enumerate
@node 第一节
@section 第一节
第一章的第一节。
@node 第二节
@section 第二节
第一章的第二节。
@node 索引
@unnumbered 索引
@printindex cp
@bye
2.5. Texinfo 文件头
Texinfo 文件以这一行开头:
\input texinfo
'\input texinfo' 这一行告诉 TeX 使用 texinfo.tex 文件,该文件定义了如何将 Texinfo 的 @-commands 转换成 TeX 的排版命令。(注意这里使用的是反斜杠 \ ;对 TeX 来说这是正确写法。)
将所有影响 整篇文档格式 的命令放在文件头里是合理的。 @settitle 行通常出现在文件头的开头:
@settitle Sample Manual 1.0
@settitle 用于指定印刷版手册的页面页眉(或页脚)标题,以及 HTML 中 ‘<head>’ 部分的默认标题和文档描述。例如 @synindex (参见 @synindex:合并索引)也是常放在文件头中的命令。
Texinfo 文件中,直到输出为文档主体内容之前的部分,统称为 序言 (preamble)。它包含文件头、文档权限声明、标题与版权页说明。这对 LaTeX 输出格式尤为重要,因为序言结束的位置会输出 \begin{document} 这一行。在其他输出格式中,序言可用于决定某些特殊内容的排版方式,例如:将 @copying(声明复制权限)的输出作为注释放在输出文件开头,或设置文件头中使用的语言。
2.5.1. Texinfo 文件的首行
所有作为 TeX 顶层输入的 Texinfo 文件,都必须以如下形式的一行开头:
\input texinfo
当文件被 TeX 处理时, ‘\input texinfo’ 命令会告知 TeX 加载处理 Texinfo 文件所需的宏。这些宏位于名为 texinfo.tex 的文件中,该文件应已随 TeX 或 Texinfo 软件一同安装在你的系统里。TeX 使用反斜杠 '\' 标记命令开头,就像 Texinfo 使用 ‘@’ 一样。texinfo.tex 负责将 '\' 切换为 ‘@’;在切换生效前,TeX 要求使用 '\',这就是它出现在文件开头的原因。
你可以选择在这一行后面加上注释,告诉 GNU Emacs 编辑此文件时使用 Texinfo 模式:
\input texinfo @c --texinfo--
当 Emacs 无法通过文件后缀自动识别文件类型时,这会很有用。
2.5.2. @setfilename: 设置输出文件名
@setfilename 行用于指定由 texi2any 生成的输出文件名称。该命令在 TeX 排版时会被忽略。如果使用该命令,它应当是第一个 Texinfo 命令(即位于 '\input texinfo' 之后)。请将 @setfilename 命令写在行首,并在同一行后跟 Info 文件名。
@setfilename info-file-name
该名称必须与 Texinfo 源文件名不同。命名有两种惯例:
- 可以完全去掉输入文件的后缀(如
.texi); - (推荐)将其替换为
.info后缀。不建议将@setfilename的名称设为与输入文件名完全无关。
如果存在 @setfilename 行,Texinfo 处理器会忽略该行 之前 的所有内容。这也是文件第一行( \input 行)不会出现在输出中的原因。
如果没有 @setfilename 行, texi2any 会根据输入文件名自动确定输出名称(参见 Texinfo 文件必须具备的内容)。此时 \input 行与开头的空行仍然会被忽略。
在生成其他输出格式时, texi2any 会将最后的后缀替换为对应格式的专属后缀(例如生成 HTML 时为 .html );如果指定名称没有后缀,则会直接添加 .后缀 (如 .html )。
@setfilename 中 不允许 使用普通 @-commands ,例外只有 @@ 、 @{ 、 @} 以及类似 @atchar{} 这类转义相关命令。
@setfilename 曾经是 Texinfo 处理器和其他一些程序的必填项,现在已不再强制,可以省略。如果 Texinfo 输入来自标准输入、没有源文件名可用于推导基础文件名, @setfilename 仍然有用。但这不是唯一方式:也可以在 texi2any 命令行中使用 --output 选项指定输出文件名(参见从 Shell 调用 texi2any )。
尽管显式使用 '.info' 后缀更可取,但部分操作系统无法处理长文件名。即使你指定的文件名本身不长,也可能出现问题。这是因为 Info 格式化工具会将长 Info 文件拆分为多个间接子文件,并在原文件名后追加 ‘-1’、‘-2’……,‘-10’、‘-11’ 等编号。例如,在文件名长度限制为 14 个字符的旧系统上, texinfo.info-10 会过长;因此在这类系统上,该文档的 Info 文件名可以是 texinfo ,而不是 texinfo.info 。 @setfilename 就是用来指定这种替代名称的
2.5.3. @settitle: 设置文档标题
Texinfo 文件应当包含如下一行:
@settitle title
请将 @settitle 命令写在行首,并在同一行紧跟标题内容。该行不要再写其他内容。 @settitle 命令应位于所有生成实际输出内容的命令之前。最佳位置是紧跟在 @setfilename 命令之后(如果有该命令,见上一节)。
该命令指定的标题,会用于双面印刷输出的页眉或页脚(如果启用了页眉页脚)。关于印刷输出页眉的更多信息,参见「页眉生成」。
在 HTML 中,该 title标题 会作为文档的 ‘<title>’ 标签内容,并成为 ‘<head>’ 部分默认的文档描述信息。
当输出中包含标题页时(印刷版输出通常如此), @settitle 中的标题 不会影响 标题页上显示的标题。因此两者不必完全一致。我们推荐的做法是:在 @settitle 的标题里包含手册的版本或版次号;而在标题页上,版本号通常以 @subtitle (副标题)形式出现,因此可以不写在 @title 中。参见 @titlepage。
2.5.4. 序言
preamble序言区 从 Texinfo 文件的开头开始,一直延续到第一个直接输出内容之前。它通常包含文件头部(参见 Texinfo 文件头部)、声明文档授权信息的 @copying 块(参见 @copying:声明复制授权)以及 @titlepage 标题页定义(参见 标题与版权页)。
序言区可以包含影响 整个文档格式 、但本身不产生输出或不立即产生输出的命令,例如 @settitle (参见 @settitle:设置文档标题)、 @documentlanguage (参见 @documentlanguage ll [_cc]:设置文档语言)、设置页眉、控制缩进或断字的命令,以及目录相关命令(参见 生成目录)。
任何开启段落的文本、作为引用 / 表格 / 列表等格式的 @-commands 、 @node (参见 节点)以及章节结构命令(参见 章节结构),都会 结束序言区 。
序言区的概念对 LaTeX 输出尤为重要,因为 \begin{document} 这一行会在序言区结束时输出。
在纯文本输出中,序言区会像文档开头一样正常输出;例如,序言区中的 @contents 会被输出为目录(参见 生成目录)。
HTML 和 Info 格式对序言区也没有太多特殊处理。不过, 序言区末尾生效的一些设置会作用于整个文档 ,不受后续内容影响。这适用于指定缩进或语言的命令(参见 @documentlanguage ll [_cc]:设置文档语言)。
例如,在下面这份文档中,HTML 和 Info 格式的版权注释会以 @documentlanguage 设置为 ‘pt’(葡萄牙语)的方式排版,因为这是序言区结束前最后一个 @documentlanguage 命令。
\input texinfo
@documentlanguage fr
@copying
The copying information @error{} some text
@end copying
@documentlanguage pt
Text ending the preamble
@documentlanguage de
@node Top
2.5.5. Emacs 专用文件头的起始与结束
在 Emacs 里,可以用 标题区起始行 和 标题区结束行 ,把 Texinfo 序言中对整个文档生效的命令包裹起来。这样你就可以只对 Texinfo 文件的一部分进行 Info 格式转换或打印排版。详见《texinfo-format… 命令》。
标题区起始行 是一条 Texinfo 注释,写法如下:
@c %**start of header
请把这行写在 Texinfo 文件的 第二行 。在起始行之后,写上对整个文档格式生效的命令(如 @settitle 、 @synindex 或 @footnotestyle ),然后再写 标题区结束行 。
标题区结束行 同样是一条 Texinfo 注释,写法如下:
@c %**end of header
使用特殊字符串 ‘%**’,是为了避免把其他普通注释误判为标题区起始行。如果你需要,可以通过修改 Emacs 变量 tex-start-of-header 或 tex-end-of-header 来自定义这串标记。详见《Texinfo 模式下的排版与打印》。
标题区起始行和结束行 不属于 Texinfo 格式标准 ,这也是它们用注释形式实现的原因。
2.6. 目录分类
使用 @dircategory 命令为手册指定一个类别。下面是一些类别名称示例:
Basics # 基础 Text creation and manipulation # 文本创建与处理 Archiving # 归档 Compression # 压缩 Database # 数据库 Editors # 编辑器 Emacs Email # 电子邮件 Graphics # 图形 Localization # 本地化 Network applications # 网络应用 Printing # 打印 Science # 科学 Software development # 软件开发 Software libraries # 软件库 Version control # 版本控制
@dircategory 命令之后通常会紧跟 @direntry 块,供 install-info 工具使用。详情参见《安装 Info 目录文件》。
手册中第一个 @dircategory 命令作用于整个手册。后续出现的 @dircategory 仅对紧跟在它之后的 @direntry 块生效。
2.7. 文档权限
这部分用于描述文档,并包含 copyright notice版权声明 和 copying permissions复制授权信息 ,通过 @copying 命令实现。一份正式的手册会根据其发布的许可证,在这里包含更多内容。
@copying
这是一个完整 Texinfo 文件的简短示例,版本 1.0。
Copyright @copyright{} 2016 Free Software Foundation, Inc.
@end copying
在 Texinfo 生成的各种输出格式中, copyright notice版权声明 和 copying permissions复制授权信息 需要出现在多个位置。因此,Texinfo 提供了两个命令: @copying 用于 一次性声明 这段文本, @insertcopying 用于在合适的位置 插入 这段文本。
如果文档是软件手册,软件本身通常采用不同的许可证 —— 对于 GNU 及其他许多自由软件包,软件一般以 GNU GPL 发布,而手册以 GNU FDL 发布。注明手册所对应软件的许可证是有益的,但不一定需要附上软件许可证的完整文本。
2.7.1. @copying: 声明复制许可
@copying 命令应在文档最 开头 使用,建议放在文件头部信息之后(参见《Texinfo 文件头部》)。按照惯例,它通常包含:一两句话说明程序用途、文档自身标识、合法版权行、复制权限说明。下面是一个框架示例:
@copying
本手册适用于 program(version version,updated
date),该程序……
Copyright @copyright{} years copyright-owner.
@quotation
允许……
@end quotation
@end copying
@quotation 无法律意义,仅用于在部分场景中提升可读性。
@copying 中的内容会以注释形式出现在 Info 和 HTML 输出文件开头;在 DocBook 输出中,也会以合适的标记放在文件开头。 纯文本与打印格式不会自动输出 这段内容,你必须手动使用 @insertcopying 命令来显示版权与权限信息,详见下一节。
@copyright{} 命令在支持该字形的输出格式中(如打印、HTML)会生成带圈版权符号 ©;在不支持的格式中,则会生成三字符序列 ‘(C)’。
版权声明本身必须遵循以下法定格式:
Copyright © years copyright-owner.
即便文档使用其他语言,‘Copyright’ 一词也 必须 用英文书写,这是国际法要求。
years年份 列表应包含所有完成版本的年份(即使次年才发布)。最简单的写法是:每个年份完整写出,用逗号分隔。
copyright-owner版权所有者 是对该作品拥有合法版权的个人或机构。如果作品转让给 FSF,则所有者为:‘Free Software Foundation, Inc.’。
版权 “行” 在源文件和输出中都可以分多行,历史悠久、发布年份较多的文档常会这么做。如果分多行,源文件中不要对任何一行缩进(包括 @copying 块内的其他内容)。
更多信息参见:《GNU 维护者信息》中的版权声明、《GNU 示例文本》(GNU 手册可直接使用的完整文本)、《GNU 自由文档许可证》(GNU 及其他自由手册所遵循的协议)
2.7.2. @insertcopying: 插入许可说明文本
@insertcopying 命令只需单独写在一行即可,示例:
@insertcopying
该命令会插入之前由 @copying 定义的文本。为满足法律要求, 必须在印刷版手册的版权页中使用此命令 (参见版权页)。
@copying 命令本身会将权限文本以注释形式放在 Info 文件的第一个节点之前,并且会自动复制到每个拆分后的 Info 输出文件开头,这是法律必需的。这意味着使用 Info 阅读手册的用户 不会直接看到这段文字 (除非使用高级 Info 命令 g * )。从法律角度来说这没有问题,因为文本已经存在;但如果要让内容在输出中可见,就必须使用 @insertcopying 。
同理, @copying 中的文本会自动作为 HTML 注释放在每个 HTML 输出文件的开头。同样,不使用 @insertcopying 的话,这段内容不会在页面中显示(除非读者查看 HTML 源码)。
由 @copying 定义的权限文本也会通过合适的标记自动出现在 DocBook 输出文件的开头。 @insertcopying 可用于在普通正文内输出这段权限文本。
2.8. 标题页与版权页
在硬拷贝(印刷版)输出中,手册名称与作者通常会印在标题页上。版权信息通常印在标题页的背面(扉页)。这部分内容必须包裹在 @titlepage 和 @end titlepage 命令之间:
@titlepage @title Sample Title @c 下面两条命令用于开启版权页 @page @vskip 0pt plus 1filll @insertcopying @end titlepage
我们使用 @insertcopying 命令来引入上一节定义的权限文本,而不是重复书写。
title标题 页与 copyright版权 页只出现在印刷版手册中,在大多数其他输出格式中不会显示。在 HTML 中,想要得到接近印刷版的标题页效果,最佳方式是设置自定义变量 NO_TOP_NODE_OUTPUT (参见 NO_TOP_NODE_OUTPUT)。
2.8.1. @titlepage: 标题页
使用单独一行的 @titlepage 命令开始 title page标题页 及后续 copyright page版权页 的内容,并用单独一行的 @end titlepage 命令结束。
@end titlepage 命令会 另起一页 并 开启页码编号 (参见 标题生成)。所有你希望出现在 unnumbered pages无编号页面 上的内容,都应放在 @titlepage 和 @end titlepage 命令之间。
通过使用 @page 命令,你可以在 @titlepage 与 @end titlepage 划定的区域内 强制分页 ,从而生成多个无编号页面。版权页就是这样生成的。( @titlepage 命令其实更适合命名为 @titleandadditionalpages ,只是这个名字太长了!)
当你编写计算机程序的手册时,应在标题页上写明 手册对应的程序版本 。如果手册更新比程序更频繁,或与程序相互独立,还应标注手册的版次2。这能帮助读者区分手册与程序的对应关系。(“Top” 节点也应包含此信息;参见 “Top” 节点与主菜单。)
一种方法是使用 @title 、 @subtitle 和 @author 命令创建标题页。使用此方法时,你无需指定标题页的具体排版格式,只需提供文本内容,Texinfo 会自动完成排版。常规排版效果为:标题与作者行下方带有黑色横线,副标题文本右对齐。
Texinfo 还提供第二种创建标题页的方法:使用 不适用于正文 的排版命令。该方法通过 @titlefont 、 @sp 和 @center 命令,生成 文字居中 的标题页。
对于足够简单的文档,以及传统书籍版式中的 bastard title page简标题页 ,Texinfo 还提供 @shorttitlepage 命令,它会将该行剩余内容作为标题。其参数会单独占一页,后面跟一页空白页。在 HTML 中,如果未设置 @settitle , @shorttitlepage 可起到与 @settitle 相同的作用。参见 @settitle: 设置文档标题。
2.8.3. @titlefont, @center, @sp: 标题字体、居中与空行
你也可以使用 @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.4. Copyright Page: 版权页
根据国际条约,一本书的 copyright notice版权声明 必须放在 标题页 或 标题页背面 。当版权声明放在标题页背面时,该页通常不编页码。因此,在 Texinfo 中,版权页上的信息应放在 @titlepage 和 @end titlepage 命令之间。
使用 @page 命令进行 分页 。要将版权声明及版权页上的其他内容推到页面底部,可在 @page 之后使用如下写法:
@vskip 0pt plus 1filll
@vskip 命令会在 TeX 输出中插入空白间距;在其他所有输出格式中会被忽略。 ‘0pt plus 1filll’ 表示:插入 0 磅的固定空白,并根据需要自动填充尽可能多的可选空白,将后续内容推到页面底部。注意单词 ‘filll’ 里有 三个小写字母 l ,这是正确写法。
要插入版权文本本身,接下来请写 @insertcopying (参见「文档权限」)。
@insertcopying
在版权声明文本之后,可继续写上 publisher出版方 、ISBN 号、 cover art credits封面美术署名 等信息。
下面是完整示例:
@titlepage ... @page @vskip 0pt plus 1filll @insertcopying Published by ... Cover art by ... @end titlepage
还有一种特殊情况需要考虑:对于 plain text output纯文本输出 ,如果你希望显示版权信息,必须 显式插入 。例如,你可以在 copyright page版权页 之后加上:
@ifplaintext @insertcopying @end ifplaintext
你也可以在同一位置为纯文本输出加入其他类似标题的信息。
2.8.5. 标题生成规则
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 。
‘Top’ 节点中包含一个 top-level menu顶层菜单 ,列出所有章节;也可以包含一个 detailed menu详细主菜单 ,列出整个文档里的所有节点。
@node Top
@top Short Sample
This is a short sample Texinfo file.
@menu
* First Chapter:: The first chapter is the
only chapter in this sample.
* Index:: Complete index.
@end menu
2.10.1. 主菜单的组成部分
主菜单(master menu)是文档的顶层菜单。按照惯例,主菜单中会包含一份详细菜单,列出文档里的所有节点。和其他普通菜单一样,主菜单被包含在 @menu 和 @end menu 之间,并且 不会 出现在打印版输出或 DocBook 输出中。
主菜单包含 Texinfo 文件中主要节点的条目:章节、类章节、附录对应的节点,随后是各类索引节点。
你可以在这些条目之后,再加入一份 detailed menu详细菜单 。详细菜单会列出其他更低层级的节点,通常按章节顺序排列。这些条目能方便查阅者直接跳转到特定节点,查找特定信息,而无需经过中间菜单。如果你在主菜单中使用详细菜单,需要用 @detailmenu … @end detailmenu 环境将其包裹。
菜单中的每一部分都可以用一行描述性文字开头。只要这一行不是以星号 * 开头,就不会被当作菜单条目处理。(更多信息参见「编写菜单」。)
例如,本手册的主菜单大致如下(实际条目会多得多):
@menu
* Copying Conditions:: Your rights.
* Overview:: Texinfo in brief.
...
* Command and Variable Index::
* General Index::
@detailmenu
--- The Detailed Node Listing ---
Overview of Texinfo
* Reporting Bugs:: ...
...
Beginning a Texinfo File
* Sample Beginning:: ...
...
@end detailmenu
@end menu
2.11. 文档正文
文档主体包含文档的全部文本。一本手册会被划分为一个或多个 nodes节点 (见节点)。下面的示例展示了一个由三个节点组成的章节:一个节点用于存放章节的引言内容,另外两个节点对应小节。引言部分中包含一个有序列表。
@node First Chapter @chapter First Chapter @cindex chapter, first This is the first chapter. @cindex index entry, another Here is a numbered list. @enumerate @item This is the first item. @item This is the second item. @end enumerate @node First Section @section First Section First section of first chapter. @node Second Section @section Second Section Second section of first chapter.
在 Info 输出中,「First Chapter」节点会包含一个菜单,列出该章节下的两个小节。同样地,当该节点输出为独立的 HTML 文件时,文件中会包含本章的目录。
本章内容最终呈现效果如下:
1. First Chapter ¶
This is the first chapter.
Here is a numbered list.
- 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 命令。参见「节点」。
4.1. 节的树形结构
一个 Texinfo 文件通常像书籍一样被组织为 chapters章 、 sections节 、 subsections子节 等层级。这种结构可以可视化为一棵树(更准确地说是一棵 倒置的树 ):根在顶部,各个层级分别对应章、节、子节、子子节。
下图展示了一个包含三章、每章各含两节的 Texinfo 文件结构:
Top
|
-------------------------------------
| | |
Chapter 1 Chapter 2 Chapter 3
| | |
-------- -------- --------
| | | | | |
Section Section Section Section Section Section
1.1 1.2 2.1 2.2 3.1 3.2
在具有这种结构的 Texinfo 文件中,第 2 章的开头写法如下:
@node Chapter 2 @chapter Chapter 2
为便于举例,下面是 使用显式节点指针 时的写法:
@node Chapter 2, Chapter 3, Chapter 1, Top @chapter Chapter 2
章节结构化命令将在后续小节中介绍; @node 命令已在前一章说明(见节点)。
4.2. 结构命令的类型
章节结构化命令分为四组,每组都包含对应 chapters章 、 sections节 、 subsections子节 、 subsubsections子子节 层级的结构化命令:
- 类
@chapter命令与类@appendix命令:在文档正文和目录中均生成带编号或字母标识的条目。 - 类
@unnumbered命令:在文档正文和目录中均生成无编号的条目。@top命令属于本组,有特殊用途(参见@top分节命令)。无编号节是文档结构的正常组成部分。 - 类
@heading命令:生成简单的无编号标题,不出现在目录中,不与节点关联,也无法被交叉引用。这类标题命令不会另起一页。
在印刷版输出中,章节结构化命令会在文档中生成标题。如果使用了 @setchapternewpage 命令, @chapter 、 @unnumbered 和 @appendix 命令会在印刷手册中另起一页;而 @heading 类命令则不会。参见 @setchapternewpage: 章节前的空白页。
在 Info 和纯文本输出中,这类命令会让标题单独占一行,并在下方用一行 ASCII 字符(‘*’、‘=’ 等)下划线。例如:
5 Chapter Structuring *********************
同一层级的所有命令使用相同的下划线字符。例如,章级命令 @chapter 、 @appendix 、 @unnumbered 和 @chapheading 使用相同的下划线。
在 HTML 中,章级命令默认生成 <h2> 级标题(可通过 CHAPTER_HEADER_LEVEL 自定义变量控制,参见特定输出的 HTML 自定义)。其他层级命令对应的标题元素级别也会相应调整。
在 DocBook 输出中,会使用对应层级的元素。生成的元素会包含其后所有同级或更高级别命令之前的所有节。例如, @chapter 会生成 <chapter> 元素,并包含该章内所有节与子节。
下表为汇总:
No new page
Numbered Unnumbered Lettered/numbered Unnumbered
In contents In contents In contents Not in contents
@top @majorheading
@chapter @unnumbered @appendix @chapheading
@section @unnumberedsec @appendixsec @heading
@subsection @unnumberedsubsec @appendixsubsec @subheading
@subsubsection @unnumberedsubsubsec @appendixsubsubsec @subsubheading
4.3. @chapter: 章节结构定义
@chapter 用于标识文档中的 章节 —— 它是常规文档结构层级中的最高级别。将该命令写在行首,并在同一行后跟章节标题。章节会 自动编号 ,从 1 开始。
例如,本手册当前这一章的标题为 “Chapter Structuring”(章节结构化),对应的 @chapter 行如下所示
@chapter Chapter Structuring
4.4. @unnumbered, @appendix: 特殊标记的章节(无编号 / 附录)
使用 @unnumbered 命令开始一个 章级元素 ,使其显示时不带任何形式的章节编号。使用 @appendix 命令开始一个附录,附录以字母(‘A’、‘B’……)而非数字标识;附录同样属于章级结构。
与 @chapter 一样,将 @appendix 或 @unnumbered 命令写在行首,并在同一行跟上标题。
Texinfo 还提供了一个 @centerchap 命令,用法与 @unnumbered 类似,但会在印刷版和 HTML 输出中将参数 居中显示 。Texinfo 通常不提供这类排版选择, 建议不要使用该命令 ,因为它可能在后续版本中被移除。
对于 @unnumbered ,如果其关联节点的名称是以下英文单词之一(不区分大小写):
Acknowledgements Colophon Dedication Preface 致谢、出版声明、献词、前言
则 DocBook 输出会使用对应的专用标签(如 <preface> ),而非默认的 <chapter> 。 @unnumbered 自身的参数可以是任意内容,并会照常作为元素标题输出。
4.5. @majorheading, @chapheading: 章节级标题
@majorheading 和 @chapheading 命令会在文档正文中生成 类似章节的标题 。
但是,这两个命令 都不会在目录中生成条目 ,并且都不会让 TeX 在印刷版手册中另起新页。
在 TeX 中, @majorheading 命令在标题前生成的垂直空白比 @chapheading 更大,除此之外两者效果相同。
在其他输出格式中, @majorheading 和 @chapheading 生成的效果与 @chapter 类似。区别在于它们 没有编号 ,也 不与节点关联 。参见 @chapter: 章节结构化。
4.6. @section: 章节下的节
@section 命令用于标识 section within a chapter unit章内部的节 ,无论该章是由 @chapter 、 @unnumbered 还是 @appendix 创建,都会遵循对应章级命令的编号规则。因此:
- 在编号为「1」的
@chapter章节中, sections节 会编号为「1.1」「1.2」等; - 在标识为「A」的
@appendix附录章中, sections节 会编号为「A.1」「A.2」等; - 在 @unnumbered 无编号章中, sections节 不会编号 。
创建 section节 的方式:将 @section 命令写在行首,并在同一行后面写上节的标题。例如:
@section This is a section
节标题会出现在目录中。
4.7. @unnumberedsec, @appendixsec, @heading: 无编号小节 / 附录小节 / 普通标题
@unnumberedsec 、 @appendixsec 和 @heading 命令分别是 @section 命令对应的无编号版、附录版、标题版(见上一节)。
在普通情况下,并不需要使用 @unnumberedsec 和 @appendixsec ,因为在 @unnumbered 和 @appendix 章节内部,直接使用 @section 即可;同样可参见上一节。
@unnumberedsec@unnumberedsec命令可用于无编号章节、普通章节或附录内部,用来生成 无编号的节 。@appendixsec@appendixsection@appendixsection是@appendixsec命令的完整拼写形式,二者是 同义词 。按照惯例,
@appendixsec或@appendixsection命令只在附录内部使用。@heading- 你几乎可以在任何位置使用
@heading命令,生成节级别的标题,且不会出现在目录中。@heading系列命令可以出现在大多数环境内部,但不允许放在另一个命令的参数中等无效位置。
4.8. @subsection: 节之下的子节
subsections子节 与 sections节 的关系,就如同 sections节 与 chapters章 的关系(参见 @section: 章节之下的节)。示例:
@subsection This is a subsection
子节标题会被列入目录。
4.9. 类 @subsection 命令
@unnumberedsubsec 、 @appendixsubsec 和 @subheading 命令分别是 @subsection 命令对应的无编号版、附录版、标题版。(参见 @subsection: 节之下的子节。)
在普通情况下,并不需要使用 @unnumberedsubsec 和 @appendixsubsec ,因为在 @unnumbered 和 @appendix 章节的节内部,直接使用 @subsection 即可。(参见 @section: 章节之下的节。)
@subheading 命令生成类似子节的标题,但 不带编号,且不出现在目录中 。
同样地, @unnumberedsubsec 生成无编号的子节式标题, @appendixsubsec 生成带字母与数字编号的子节式标题;这两个命令生成的标题都会出现在目录中。
4.10. @subsubsection 及其他三级子子节命令
Texinfo 中第四级、也是最低一级的分节命令是 ‘subsub’ 系列命令。它们包括:
@subsubsection- 子子节与子节的关系,如同子节与节的关系。(参见
@subsection: 节之下的子节。)子子节标题会出现在目录中。 @unnumberedsubsubsec- 无编号子子节的标题会出现在目录中,但不带编号。除此之外,与普通子子节相同。
@appendixsubsubsec- 按照惯例,附录系列命令仅用于附录中,并会自动使用合适的字母与数字编号。它们也会出现在目录中。
@subsubheading@subsubheading命令可用于任何需要一个小型标题、且该标题 不出现在目录中 的位置。
与子节的用法一样,通常情况下不需要使用 @unnumberedsubsubsec 和 @appendixsubsubsec ,因为在无编号章节和附录章节的子节内部,直接使用 @subsubsection 即可。(参见 @section: 章节之下的节。)
4.11. @part: 章的分组
最后一个分节命令是 @part ,用于标记手册中的 part部分 ,也就是一组章节或(较少见的)附录。它的行为与其他分节命令差异很大,以适配书籍中 “parts”(部分) 的常规用法。
@part 不与 @node 命令关联。只需在文档中需要标记该部分开始的位置,将命令单独写在一行,并带上部分标题即可。例如:
@part Part I:@* The beginning
从示例可以看出, @part 的内容 不会自动编号或标注 ,文本会原样输出。
由于部分不与节点关联, @part 行后 不能跟随普通文本 。要得到正确输出,其后必须紧跟 章级命令 (及其节点)。延续上面的示例:
@part Part I:@* The beginning @node Introduction @chapter Introduction ...
在 TeX 输出中:
@part的内容会出现在普通目录和简目里,但不带页码(符合常规排版惯例)。- 文档正文中会输出一张部分页,只显示
@part内容。 - 示例中的
@*会在部分页产生换行,但在目录里会替换为空格。 - 无论章节分页如何设置,部分页总会强制出现在奇数页(右侧页)。
在 LaTeX 输出中,@part 会被转换为 \part。
在 TeX 输出中:
@part的内容会同时出现在常规目录和简缩目录中(参见「生成目录」),但不显示页码(这是常规排版惯例)。- 此外,文档正文中会输出一张 “part page部分页”,页面上只显示
@part的内容。 - 在上面的示例里,
@*会在部分页中产生换行(但在目录中会被替换为空格)。 - 无论章节分页如何设置,这张部分页都会被强制放在奇数页(右侧页)。参见
@setchapternewpage: 章节前的空白页。 - 在 LaTeX 输出中,@part 会被输出为
\part。
在 HTML 输出中, @part 内容同样会出现在目录里。标题会作为后续章节或附录节点的一部分,出现在正文里。
在 DocBook 输出中, <part> 元素会包含其后所有章节,直到下一个 <part> 。包含章节的 <part> 在遇到附录时也会自动结束。
在 Info 和纯文本输出中, @part 不起作用。
在提升或降低节级别时, @part 会被忽略(见下一节)。也就是说,它永远不会被降级,也没有内容可以升级到它这一级。
4.12. 提升/降低节层级: @raisesections 与 @lowersections
@raisesections 和 @lowersections 命令会 隐式地提升或降低 后续章节、节以及其他分节命令的层级(部分 @part 除外)。
也就是说:
@raisesections命令会将 */sections节/ 变成 chapters章 、 subsections子节 变成 sections节 * ,依此类推。- 反之,
@lowersections命令会将 章变成节、节变成子节 ,依此类推。
因此, @lowersections 可以抵消 @raisesections 的效果,反之亦然。
在实际使用中,通常只对 大块内容 提升或降低层级,一般用于外部文件。你可以用 @lowersections ,把一个独立完整的 Texinfo 文件,作为 内部被包含文件 嵌入到另一个 Texinfo 文件中(参见「包含文件」)。典型用法如下:
@lowersections @include somefile.texi @raisesections
(如果不加最后的 @raisesections ,主文件中 所有后续的节都会被降级 。)
如果被降级的包含文件中有 @top 节点,你需要用标记做 条件包含 (参见 @set 和 @value )。
最终生成的菜单 必须考虑层级升降 ,因此在文档中随意到处使用 @raisesections 和 @lowersections 很可能导致错误(除非文档中的菜单全部是自动生成的)。
重复使用这些命令会逐级继续提升或降低层级。如果试图提升到比章(chapter)更高的级别,效果仍等同于章命令;如果试图降低到比子子节(subsubsection) 更低的级别,效果仍等同于子子节命令。此外,被降级的子子节与被提升的章,无法与 texi2any 的隐式节点指针自动判定功能兼容,因为菜单结构无法被正确表示。
@raisesections 和 @lowersections 命令 各占一行 书写。
5. 交叉引用
Cross-references交叉引用 用于引导读者查阅 同一文档或其他 Texinfo 文件 中的其他部分。
使用交叉引用,可以让读者跳转到当前上下文过于详细、或属于附带信息的内容。在线帮助系统或参考手册不同于小说,很少有人会从头到尾按顺序阅读。人们通常只查找自己需要的内容。因此,这类文档应当包含 大量交叉引用 ,帮助读者找到他们可能没读到的其他信息。
在印刷版手册中,交叉引用会生成 页码引用 ;如果是指向另一本手册,则会显示该手册名称。在 Info 中,交叉引用会生成可跳转条目,可使用 Info 的 f 命令跳转。(参见《在 Info 中跟随交叉引用》。)在 HTML 中,交叉引用会生成 超链接 。在 DocBook 中,使用 <link> 元素表示交叉引用;如果是指向另一本手册,则会显示手册名称。
各类交叉引用命令通过节点、锚点(参见 @anchor: 定义任意交叉引用目标)或浮动标签(参见 @float [类型][,标签]: 浮动内容)来定位目标位置。当 TeX 生成 DVI 文件时,会记录每个交叉引用目标的页码,并在引用中使用这些页码。因此,即使你编写的手册 只用于印刷、不用于在线阅读 ,也仍然必须编写 @node 行(或 @anchor 锚点),为交叉引用目标命名。
5.1. 不同类型的交叉引用命令
共有三种不同的交叉引用命令:
@xref- 用于以 Info 格式交叉引用 开头 一个句子,在 Info 中显示为‘*Note name: node.’,在其他输出格式中显示为 ‘See …’。
@ref- 常用于句子 内部 或更常见的是句子 末尾 ;在 Info 中生成 ‘*note name: node.’,在其他格式中只显示引用内容, 不带前面的 ‘See’。
@pxref- 用于括号内、句子末尾,或在标点符号之前做补充引用。在 Info 中输出以小写 ‘*note’ 开头,在其他格式中以小写 ‘see’ 开头。(这里的 ‘p’ 代表 ‘parenthesis’,即 “括号”。)
此外,还有一些用于引用 Texinfo 系统 外部文档 的命令:
@cite命令用于引用书籍和手册。@url用于生成 URL,例如引用万维网上的某个页面。
5.2. 交叉引用的组成部分
交叉引用命令只需要 一个必选参数 ,即它所指向的节点名称。一条交叉引用命令最多还可以包含 四个额外参数 。完整的五参数交叉引用模板如下:
@xref{node-name, online-label, printed-label, manual-name, printed-manual-title}
交叉引用的五个可能参数分别是:
node-name节点 或 anchor-name锚点名称 。 这是交叉引用跳转的目标位置。在印刷版文档中,只有 同一文档内 的引用才会根据节点位置给出页码。使用
@node定义节点(参见 编写@node行)、@anchor(参见@anchor: 定义任意交叉引用目标)或带标签的@float(参见@float [type][,label]: 浮动内容)来指定目标。该参数为 必选 (引用整本手册时除外)。交叉引用中书写的节点名称,必须与
@node行 完全一致 (包括大小写),否则处理工具可能无法找到该引用。- 在线输出标签。通常省略。若省略,则优先使用第三参数(主题描述);若该参数也省略,则直接使用节点名称。
- 印刷输出标签。通常为章节标题或主题名称,在印刷版手册中作为引用名称。若省略,则使用节点名称。
- 被引用手册名称。当引用目标位于 当前手册之外 、属于另一个 Texinfo 文件时使用。
- 被引用印刷版手册标题。对应另一个 Texinfo 文件中被引用手册的印刷版标题。
分隔参数的逗号 前后的空白会被忽略 。如果需要在参数内部使用逗号,需用 @comma{} (参见 用 @comma{} 插入逗号‘,’)。
后续章节将分别介绍一参数、二参数、三参数、四参数、五参数的交叉引用用法。
使用 TeX 处理时,对于 同一手册内 的交叉引用,页码后会 自动添加逗号 ,除非参数的右花括号后面紧跟非空白字符(如逗号或句号)。这样你可以控制在其他输出格式中是否显示该逗号。例如:
@xref{Another Section} for more info
- TeX 输出:‘See Another Section, page ppp, for more info’
- Info 输出:‘*Note Another Section:: for more info’
如果不希望自动生成逗号,可以在参数后使用 ‘@:’ 等命令。例如:‘ @xref{Hurricanes}@: --- for the details ’会生成:
See Hurricanes, page ppp —- for the details
而不是:
See Hurricanes, page ppp, —- for the details
当交叉引用文本(以及节点名、菜单项)中存在可能干扰 Info 格式解析的可疑结构时, texi2any 会给出警告并保护相关名称。参见 Info 节点名称约束。
5.3. 单参数 @xref
@xref 最简单的形式只接受一个参数,即同一个 Texinfo 文件中另一个节点的名称。
例如:
@xref{Tropical Storms}.
在 Info 格式中生成:
*Note Tropical Storms::.
在印刷版手册中生成:
See Section 3.1 [Tropical Storms], page 24.
在印刷版手册中。
5.4. 双参数 @xref
使用两个参数时,第二个参数会作为 online-label在线输出 的显示标签。
格式如下:
@xref{node-name, online-label}.
示例:
@xref{Electrical Effects, Lightning}.
在 Info 格式中会生成:
*Note Lightning: Electrical Effects.
在印刷版手册中会生成,其中会显示节点名称:
See Section 5.2 [Electrical Effects], page 57.
交叉引用的第二个参数与节点名称遵循相同的约束条件。在此场景中可能引发问题的字符是 冒号 。详见《Info 节点名称约束》。
5.5. 三参数 @xref
第三个参数会 替换印刷版输出中的节点名称 。第三个参数应当是印刷版中章节的名称,或是该章节所讨论主题的表述。
格式如下:
@xref{node-name, online-label, printed-label}.
示例:
@xref{Electrical Effects, Lightning, Thunder and Lightning}, for details.
在 Info 格式中生成:
*Note Lightning: Electrical Effects, for details.
在印刷版手册中生成:
See Section 5.2 [Thunder and Lightning], page 57, for details.
如果提供了第三个参数,而第二个参数为空,那么第三个参数会 同时充当在线标签和印刷标签 。(注意:两个连续的逗号用于标记第二个参数为空。)
@xref{Electrical Effects, , Thunder and Lightning}, for details.
在 Info 格式中生成:
*Note Thunder and Lightning: Electrical Effects, for details.
在印刷版手册中生成:
See Section 5.2 [Thunder and Lightning], page 57, for details.
交叉引用的第三个参数与节点名称遵循相同的约束条件。在此场景中可能引发问题的字符是 冒号 。详见《Info 节点名称约束》。
实际使用建议:
- 如果节点名称与章节标题相同(或基本相同),通常只写第一个参数即可。
- 如果节点名称与标题不同,则只需要写第一个和第三个参数。
Texinfo 提供了一个设置,可以让交叉引用 默认使用章节标题而非节点名称 (显式指定的第三个参数仍然优先):
@xrefautomaticsectiontitle on
通常这行代码会写在文档开头,作用于整个手册。但你也可以按需关闭( @xrefautomaticsectiontitle off ),例如当你引入其他没有合适章节名称的子文档时。
该设置同样适用于 HTML 中的节点标题:如果开启 @xrefautomaticsectiontitle ,在可能的情况下,节点标题会使用 章节名称 而非节点名称。
5.6. 四参数与五参数 @xref
在交叉引用中,第四个参数用于指定 另一本手册 的名称(与当前引用所在文件不同),第五个参数则指定该手册作为印刷版时的标题。
完整模板为:
@xref{node-name, online-label, printed-label, manual-name, printed-manual-title}
@xref {节点名,在线标签,印刷标签,手册名,印刷手册标题}
例如:
@xref{Electrical Effects, Lightning, Thunder and Lightning, weather, An Introduction to Meteorology}.
在 Info 格式中会生成如下输出:
*Note Lightning: (weather)Electrical Effects.
可以看到,手册名被放在圆括号内,并置于节点名之前。在 HTML 中,手册名和节点名用于构造超链接 URL(参见 HTML 交叉引用),而链接文本则基于标签生成。
在印刷版手册中,该引用效果如下:
See section “Thunder and Lightning” in An Introduction to Meteorology.
印刷手册的标题会以 @cite 格式排版;由于引用另一本手册时无法预知页码,因此引用中不包含页码。
下一种情况:使用长格式 @xref 时,你常常会省略第二个参数。此时,第三个参数(主题描述)会作为在线格式中的交叉引用名称。
例如:
@xref{Electrical Effects, , Thunder and Lightning, weather, An Introduction to Meteorology}.
在 Info 中生成:
*Note Thunder and Lightning: (weather)Electrical Effects.
在印刷版手册中生成:
See section “Thunder and Lightning” in An Introduction to Meteorology.
下一种情况:如果另一本手册中的 节点名与章节标题相同 ,你也可以省略章节标题。此时节点名将同时用于两处。
例如:
@xref{Electrical Effects,,, weather, An Introduction to Meteorology}.
在 Info 中生成:
*Note (weather)Electrical Effects::.
在印刷版手册中生成:
See section “Electrical Effects” in An Introduction to Meteorology.
一般来说,没有理由只提供手册名参数而不提供印刷手册标题参数,除非不生成印刷版手册。你也可能需要引用 同一本印刷手册内 的另一手册文件 —— 当多个 Texinfo 文件被合并到同一本印刷手册,但在其他输出格式中可生成独立文件时。这种情况下,只需指定第四个参数,无需第五个。如果缺少印刷手册标题参数,印刷输出中将直接使用手册名代替。
只提供印刷手册标题参数而不提供在线手册名参数,基本没有意义,除非该 Texinfo 源文件 只用于生成印刷版手册 。在线格式中的结果取决于具体格式,可能会出现空手册名,或以类似印刷版的格式引用该手册。
最后,也允许只保留第四、第五个参数,省略其余所有参数,用于整体引用另一本手册。详见下一节。
5.7. 引用整本手册
通常情况下,交叉引用 必须指定一个节点 。但你经常会需要 整体引用另一本手册 ,而不是其中某个特定章节。这种情况下,指定章节名是多余且分散注意力的。
因此,在对其他手册进行交叉引用时(参见 带四个和五个参数的 @xref ),如果第一个参数是 ‘Top’(必须这样大写)或者完全省略,并且第三个参数也省略,那么印刷版输出中将 不包含节点或章节名称 。(如果显式写了‘Top’,Info 格式输出会包含它。)例如:
@xref{Top,,, make, The GNU Make Manual}.
会生成:
*Note (make)Top::.
以及印刷版:
See The GNU Make Manual.
无论是否显式指定‘Top’节点,Info 阅读器都会跳转到该手册的顶层节点。
另外一种(也是历史上常用的)写法是:指定‘Top’节点,并为 @xref 的第三个参数提供合适的内容,以此来引用整本手册。用这种写法引用《GNU Make 手册》可以这样写:
@xref{Top,, Overview, make, The GNU Make Manual}.
它在 Info 中生成:
*Note Overview: (make)Top.
在印刷手册中生成:
See section “Overview” in The GNU Make Manual.
在这个例子里,Top 是第一个节点的名称,Overview 是手册第一章的名称。印刷手册中第一章并没有通用的命名规范,这只是 Make 手册恰好使用的名称。正是因为首节名称不统一,所以 在整体引用手册时,省略第三个参数是更推荐的做法 。
5.8. @xref: 基础交叉引用
@xref 命令用于在句子开头生成交叉引用。有关 @xref 的使用示例,请参见前面的章节。
5.9. @ref: 直接交叉引用
@ref 与 @xref 几乎完全相同,唯一区别是: @ref 不会在输出中生成 ‘See’ 字样,只输出引用本身。这使得它适合用在句子末尾。
例如:
For more information, @pxref{This}, and @ref{That}.
在 Info 格式中生成:
For more information, *note This::, and *note That::.
在印刷版中生成:
For more information, see Section 1.1 [This], page 1, and Section 1.2 [That], page 2.
使用 @ref 命令时,作者可能会写出适合印刷手册、但在 Info 格式中显得生硬的句子。请记住,你的读者可能同时使用印刷版和 Info 等其他格式。例如:
Sea surges are described in @ref{Hurricanes}.
在印刷版中显示正常:
Sea surges are described in Section 6.7 [Hurricanes], page 72.
但在 Info 中读起来会很别扭,因为 “note” 在这里会被当作动词理解:
Sea surges are described in *note Hurricanes::.
5.10. @pxref: 附带页码的交叉引用
括号内引用命令 @pxref 与 @xref 几乎完全相同,但它 最适合用在括号内部 。该命令与 @xref 的区别在于:输出的引用词是小写的 ‘see’(参见),而不是大写的 ‘See’(参见)。在 Info 格式中则输出 ‘*note’。
当只带一个参数时,括号内的交叉引用示例如下:
... storms cause flooding (@pxref{Hurricanes}) ...
在 Info 中生成:
... storms cause flooding (*note Hurricanes::) ...
在印刷手册中生成:
… storms cause flooding (see Section 6.7 [Hurricanes], page 72) …
在旧版 Texinfo 中,不允许在 @pxref 后面直接加标点,因此它只能用在右括号之前。现在这一限制已取消。 @pxref{节点名} 的效果等价于 ‘see @ref{node-name}’。不过在很多场景下, 后者更推荐 ,因为这样能让 Info 格式的输出里清晰地显示出 “see” 一词。
5.11. @anchor: 定义自定义交叉引用目标
@anchor 用于在文档中标记一个 anchor锚点 ,使其可以像节点一样被交叉引用。你可以使用 @anchor 命令创建锚点,并将标签名放在大括号内作为参数。例如:
This marks the @anchor{x-spot}spot.
...
@xref{x-spot,,the spot}.
会生成:
This marks the spot. ... See [the spot], page 1.
可以看到, @anchor 命令 本身不会产生任何输出 。上面的例子在单词 ‘spot’ 之前定义了一个名为 ‘x-spot’ 的锚点,之后可以用 @xref 或其他交叉引用命令来指向它,如下所示(参见 “交叉引用”)
最佳实践 :将 @anchor 命令放在 你希望引用的位置之前 ,这样读者跳转到锚点时,视线能直接落在正确内容上。为了源码可读性,你也可以把 @anchor 单独放在一行。 @anchor 之后的空白(包括换行)会被忽略。
命名与使用约束
- 锚点名、节点名、浮动体标签 不能冲突 。
- 锚点、节点、浮动体标签在某些处理中是类似的:例如
goto-node命令既可以接受节点名,也可以接受锚点名。(参见 Info 中的 “跳转到节点”。) - 锚点名和浮动体标签也可能出现在菜单(参见 “菜单”)和节点方向指针(参见 “编写
@node行”)中,但 不推荐这样使用 。
锚点名在可包含的字符方面,与节点名遵循相同的约束规则(参见 Info 节点名称约束)。
兼容建议
由于锚点和节点在功能上是等效的,当你 删除或重命名某个节点 时,最好用旧名称定义一个 @anchor 。这样一来,其他 Texinfo 手册或外部网页指向该旧节点的链接仍然可以正常工作
5.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 [email protected], 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.3. @listoffloats: 浮动元素目录
10. 索引
10.1. 预定义索引
10.2. 定义索引条目
10.3. 高级索引命令
10.4. 插入索引条目
10.5. 索引与菜单的印刷
10.7. 定义新索引
11. 特殊插入
11.1. 特殊字符:插入 @ {} , \ # &
11.1.1. 使用 @@ 与 @atchar {} 插入 @
11.1.3. 使用 @comma{} 插入逗号‘,’
11.1.4. 使用 @backslashchar {} 插入
11.1.5. 使用 @hashchar {} 插入 #
11.1.6. 使用 @& 与 @ampchar {} 插入 &
11.2. 插入引号
11.3. 插入空格
11.3.1. 多个连续空格
11.3.2. 非句尾空格
11.3.3. 句尾空格
11.3.4. @frenchspacing 取值:控制句尾间距
11.3.5. @dmn {量纲}:量纲格式化
11.4. 插入重音符号
11.5. 插入引号符号
11.6. @sub 与 @sup:插入下标与上标
11.8. 文本专用符号
11.8.1. @TeX {}(TeX)与 @LaTeX {}(LaTeX)
11.8.2. @copyright {}(©):版权符号
11.8.3. @registeredsymbol {}(®):注册商标符号
11.8.4. @dots(…)与 @enddots(…):省略号
11.8.5. @bullet(・):项目符号
11.8.6. @euro(€):欧元符号
11.8.7. @pounds(£):英镑符号
11.8.8. @textdegree(°):度符号
11.8.9. @minus(−):减号
11.8.10. @geq(≥)与 @leq(≤):大于等于 / 小于等于符号
11.9. 编程专用符号
11.9.1. 符号汇总
11.9.2. @result {}(⇒):表达式结果
11.9.3. @expansion {}(→):展开标识
11.9.4. @print {} (-|):生成输出标识
11.9.5. @error {} (error→):错误信息标识
11.9.6. @equiv {} (≡):等价标识
11.9.7. @point {} (∗):缓冲区光标位置标识
11.9.8. 点击序列
11.10. 插入 Unicode 字符:@U
12. 强制换行 / 分页与禁止换行 / 分页
12.1. 换行 / 分页命令
12.2. @* 与 @/: 生成换行与允许换行
12.5. @w {文本}:禁止文本换行
12.6. @tie {}:插入不可断空格
12.7. @sp n: 插入空行
12.8. @page:开始新页面
12.9. @group: 禁止块内分页
12.10. @need 长度值:强制保留指定长度不分页
13. 定义命令
13.1. 定义的模板
13.2. 定义命令的续行
13.3. 可选参数与重复参数
13.4. 省略定义名后的空格
13.5. @deffnx 及相关命令:多个定义首行
13.7. 通用定义命令
13.8. 编写定义的规范
13.9. 函数定义示例
14. 国际化
15. 条件可见文本
15.1. 条件命令
15.2. 条件非命令
15.3. 原始格式化器命令
15.5. 标志位: @set 、 @clear 、条件判断与 @value
15.5.1. @set 与 @value: 设置与引用标志位
15.5.2. @ifset 与 @ifclear:根据标志位判断显示
15.5.4. @value 示例
15.7. 条件判断的嵌套
16. 定义新的 Texinfo 命令
16.1. 定义宏
16.2. 调用宏
16.3. 宏的细节与注意事项
16.4. @alias 新命令 = 已有命令:命令别名
16.5. 行宏
16.6. @definfoenclose:自定义高亮样式
17. 包含文件
17.1. 包含文件的使用方法
17.2. 含 @include 的示例文件
18. 使用 TeX 进行格式化与印刷
18.1. TeX 的使用
18.4. TeX 格式化的前期准备
18.5. 超宽水平盒子(hboxes)问题
18.6. 日文与中文的印刷
19. texi2any:Texinfo 转换工具
19.1. 从 Shell 调用 texi2any
19.2. texi2any 识别的环境变量
19.3. texi2any 的印刷输出
19.4. 自定义变量
19.4.1. 针对 @ 命令的自定义变量
19.4.2. 自定义变量与命令行选项
19.4.3. 全局自定义变量
19.4.4. 信息文件与纯文本的自定义变量
19.4.5. LaTeX 输出的自定义变量
19.4.6. 其他格式的自定义变量
19.4.7. 多格式通用自定义变量
19.5. 文档字符串的国际化
19.7. texi2html:texi2any 的前身
20. 创建与安装信息文件
20.1. 安装 Info 文件
20.1.1. 目录文件 dir
20.1.2. 新增信息文件的列示
20.1.3. 其他目录中的信息文件
20.1.4. 安装信息目录文件
20.1.5. 调用 install-info 工具
20.2. 标签文件与拆分文件
20.3. 信息文件格式常见问题
21. 生成 HTML
21.1. HTML 转换
21.2. HTML 文件拆分
21.3. HTML 层叠样式表(CSS)
21.6. HTML 中的代码示例语法高亮
21.7. HTML 中的交叉引用
21.7.1. HTML 交叉引用链接基础
21.7.2. HTML 交叉引用的节点名展开
21.7.3. HTML 交叉引用的命令展开
21.7.4. HTML 交叉引用的 8 位字符展开
21.7.5. HTML 交叉引用配置文件:htmlxref.cnf
21.8. HTML 输出的自定义
21.8.1. HTML 输出结构的自定义
21.8.2. HTML 的文件名与链接自定义
21.8.4. HTML 功能的自定义
21.8.5. 插入 HTML 代码的自定义
21.8.6. 特定输出内容的 HTML 自定义
21.8.8. JavaScript 接口与许可证
21.8.9. HTML 自定义变量列表
附录 A @ 命令细节
附录 B 技巧与提示
附录 C Texinfo 示例文件
附录 D Texinfo 模式的使用
附录 E 全局文档命令
附录 F 信息文件格式规范
附录 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 输出无效。