1 .\" Copyright (c) 1990, 1993
2 .\" The Regents of the University of California. All rights reserved.
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\" notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\" notice, this list of conditions and the following disclaimer in the
11 .\" documentation and/or other materials provided with the distribution.
12 .\" 3. All advertising materials mentioning features or use of this software
13 .\" must display the following acknowledgement:
14 .\" This product includes software developed by the University of
15 .\" California, Berkeley and its contributors.
16 .\" 4. Neither the name of the University nor the names of its contributors
17 .\" may be used to endorse or promote products derived from this software
18 .\" without specific prior written permission.
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 .\" This tutorial sampler invokes every macro in the package several
34 .\" times and is guaranteed to give a worst case performance
35 .\" for an already extremely slow package.
52 手册页 (manual page), 它 使用了
57 .Em 基于宏域 (domain Ns \-base)
62 包, 定义了 页面布局 (page layout), 但是 把 诸如 字体控制 和 其他 排版 细节
66 .Em "页结构宏域 (page structure domain)"
67 它 由 标题, 小节首部, 显示 (displays) 和 列表 宏 组成. 这些 基本项目 影响
69 作为 页结构宏域 的 补充, 这里 还 定义了 另外 两个 宏域, 手册宏域 和
70 基本正文宏域. 基本正文宏域 定义了 一些 宏, 执行 例如 引文 或 文字强调
72 手册宏域 定义的宏 是 非正式 日常用语 的 子集, 用于 描述 命令, 例程
76 手册宏域里 的 宏 用来处理 命令名, 命令行参数和选项, 函数名称, 函数参数,
77 路径, 变量, 以及 到 其他手册页 的 参照 等.
78 这些 域项 留有 为 作者 和 手册页的 未来用户 设置的 值.
79 希望 从 手册集中 获得的 一致性 能够为 将来的 文档工具 提供 更简单的 转换.
84 可以 简单的 理解为 一个 man page, 不用 注意 它的 实际长度,
85 也没有 性别歧视 意图. (译注: 可能是双关语, man page...男人页)
86 .Sh 开始 GETTING STARTED
87 因为 人们 通常是 为了 能够 马上 使用 这些材料 的 时候 才 阅读 教程,所以
88 我们 假设 此文档的 用户 是 缺乏耐心的.下面 简述一下 这份文档 剩余部分
90 .Bl -enum -offset indent
93 .Bl -tag -width flag -compact -offset indent
101 .Bl -tag -width flag -compact -offset indent
107 .Tn "手册宏域和基本正文宏域的介绍" .
108 .Bl -tag -width flag -compact -offset indent
114 .Bl -tag -width flag -compact -offset indent
118 .It "配置声明 (仅用于手册第四部分)" .
121 .It "Errno's (仅用于手册第二部分)" .
128 .\" .It "头文件 Header File (源代码嵌入 including source code)" .
138 .Bl -tag -width flag -compact -offset indent
143 .It "嵌入/引用宏 (Enclosure/Quoting)"
144 .Bl -tag -width flag -compact -offset indent
156 .It "返回值 (仅用于手册页第二和第三部分)"
157 .It "Trade Names (缩略和类型名称)" .
162 .Bl -tag -width flag -compact -offset indent
167 .It "字体模式 (加重, 原文和 Symbolic)" .
175 .Tn "用 GROFF, TROFF 和 NROFF 格式化"
183 宏包 的 目的 是 简化 写手册页 的 过程. 理论上讲, 要使用
187 的 腌脏细节; 然而, 有些 限制 无法回避, 最好 把它们 摆平.
188 而且 你 应该 知道, 这个 宏包 的 速度 比较
195 (句点符) 起始, 紧随其后 是 作为 宏名 的 两个字符. 参数 跟在 宏名 之后,
196 用 空格符 隔开. 这个 位于行首的 句点符 使
198 把 紧随其后 的 两个字符 视作 宏名. 在 某些情况下 要把
200 (句点符) 放在 行首, 但不希望 被理解成 宏请求, 方法是 在
206 被 解释成 一段 长度为零 的 空白, 所以 不会 在 输出端 显示 出来.
210 宏 最多 接受 九个参数, 忽略掉 其余的. 大多数 在
212 里的 宏 支持 九个参数, 某些场合 可以 续加 参数, 或扩展到 下一行. (见
213 .Sx 扩展 Extensions ) .
214 有些宏 能够 处理 引号 引起来的 参数 (见 下面的
219 的 基本正文宏域 和 手册宏域 的宏 拥有 一种特性, 表现在 把 参数列表 当成
222 这意味着 如果 参数列表里的参数 是 普通正文宏域 或 手册宏域
223 里的 宏, 并且 是 可调用宏, 那么 处理的时候 会 执行 或 调用.
224 这种情况下的 参数, 即 宏名, 不需要 用
227 这种风格 使 很多 宏 嵌套 在 一起; 例如 这个 选项宏
236 .Bl -tag -width "\&.Op \&Fl s \&Ar bytes" -offset indent
239 .Li \&.Op \&Fl s \&Ar bytes
242 为了 防止 把 两个字符的字符串 解释成 宏名, 在这个 字符串 前面 加上
245 .Bl -tag -width "\&.Op \&Fl s \&Ar bytes" -offset indent
246 .It Op \&Fl s \&Ar bytes
248 .Li \&.Op \e&Fl s \e&Ar bytes
258 中, 参数列表 按 可调用参数 分析 的 宏 称为 已分析, 可以 从 参数列表
260 这里 用的 术语 '分析' 可能是个 技术失误, 几乎 所有的
262 宏 都 被分析, 既 用它 指 可调用宏, 又 指 有 调用 其他宏的 能力, 显得 很笨拙.
263 .Ss 在参数中传递空格符 Passing Space Characters in an Argument
264 某些时候 我们 希望 能够 把 含有 一个或多个 空格符 的 字符串 作为 单个参数
265 传递. 如果 要 突破 九个参数的限制, 或者 传递给 宏 的 参数 需要 一些 特定布置,
268 的 第一个参数 是 函数名称, 剩下的参数 作为 函数的参数.
270 规定 函数的参数 在 圆括弧内 声明, 每个 参数 至少 由 两个 标示符 组成.
274 有 两个方法 传递 嵌有空格符 的 参数.
279 中, 那个 最容易的方法, 就是 作为 单个 参数 传递 两个引号之间的
280 字符串和空格符, 非常 消耗 时间 和 内存空间.
283 并不费事, 但是 为了 可移植性, 这种 做法 只限于 下列 有迫切需要 的 宏:
285 .Bl -tag -width 4n -offset indent -compact
313 一种 传递 含空格符字符串 的 方法 是 用
315 硬编码 或 不可填充空格符, 也就是 在 空格符 前 加上 转义符
317 这个 方法 适用于 任何宏, 但 有个 副效应, 它 干扰了 对 长行 的 调整.
319 把 这种 硬编码的 空格符 看作 可显示字符, 因此 无法 在需要的时候 把 字符串
320 分段 或 换行. 这种 方法 适用于 字符串 不会 到达 行边界 时, 例如:
321 .Bl -tag -width "fetch(char *str)" -offset indent
322 .It Fn fetch char\ *str
324 .Ql \&.Fn fetch char\e *str
325 .It Fn fetch "char *str"
327 .Ql \&.Fn fetch "\\*qchar *str\\*q"
336 .Dl Fn fetch char *str
338 如果 想知道 参数列表 到达 行边界 时 出现什么, 参看
341 .Ss 尾部的空白符 Trailing Blank Space Characters
343 可能 被 行尾的 空白符 搞乱, 它的防范规则 是 消除 所有 位于行末 的 空白符.
344 如果 坚持 在 行末 加上 空白符, 可以 用 硬空格符 和
348 .Ss 转义特殊字符 Escaping Special Characters
358 .Sh "手册页结构分析 THE ANATOMY OF A MAN PAGE"
359 手册页 可以 很容易的 通过 模板 构建, 模板 放在
360 .Pa /usr/share/misc/mdoc.template .
362 .Pa /usr/share/examples/mdoc
365 .Ss 手册页的模板 A manual page template
366 .Bd -literal -offset indent
367 \&.\e" 所有的手册页都要求有下面的内容
368 \&.Dd 月 日, 年Month day, year
373 \&.Nd 对名称的简单描述 one line description of name
376 \&.\e" 后面的内容取消注释后可以用在你需要的任何地方.
377 \&.\e" 紧接着的这条命令用于手册第二和第三部分, 函数的返回值.
378 \&.\e" .Sh 返回值 RETURN VALUES
379 \&.\e" 下面的命令用于手册第1, 6, 7, 8部分.
380 \&.\e" .Sh 环境 ENVIRONMENT
382 \&.\e" .Sh 示例 EXAMPLES
383 \&.\e" 下面的命令用于手册第1, 6, 7, 8部分
384 \&.\e" (在shell下的命令返回值和标准错误类型的诊断)
385 \&.\e" .Sh 诊断 DIAGNOSTICS
386 \&.\e" 下面的命令用于手册第二和第三部分中的错误和信号处理.
388 \&.\e" .Sh 另见 SEE ALSO
389 \&.\e" .Sh 遵循 CONFORMING TO
390 \&.\e" .Sh 历史 HISTORY
391 \&.\e" .Sh 作者 AUTHORS
396 .Pq Li \&.Dd , \&.Os , \&.Dt
397 宏; 文档日期, 手册或其内容 针对的 操作系统, 手册页的标题
400 这些宏 确认和标识了 这个手册页. 在 后面的
404 这个 模板中 的 其余部分 是 小节首部 (section header)
417 有一些 内容宏 被用来 示范 页面布局宏; 建议 接触 页面布局宏 前 先看看 内容宏.
419 标题宏 是 页结构宏域 的 第一部分, 但 在 过去, 人们 如果 编写 手册页,
420 它 是 手册的 第一部分, 也是 独立部分. 这里 设计了 三个宏 分别 描述
421 文档标题 或 手册标题, 操作系统, 和 制作日期. 它们 放在 文档的 最前面,
422 一次 只 调用 一个, 用来 构建 文档的 页头 和 页脚.
424 .It Li \&.Dt 文档标题 手册区# [卷]
425 文档标题 是 手册页的 主题, 由于 troff 的 限制, 必须
427 手册节号 (部分号) 介于 1,\ ...,\ 8, 如果 指明了 手册节号, 可以 忽略 卷标.
428 卷标 用 下列 标识的 一个 或 任意个:
430 .\" USD UNIX 用户增补文档 User's Supplementary Documents
432 .\" PS1 UNIX 程序员增补文档 Programmer's Supplementary Documents
434 .Bl -column SMM -offset indent -compact
435 .It Li AMD UNIX 历史遗留的手册文档 Ancestral Manual Documents
436 .It Li SMM UNIX 系统管理员手册 System Manager's Manual
437 .It Li URM UNIX 参考手册 Reference Manual
438 .It Li PRM UNIX 程序员手册 Programmer's Manual
447 代表 手册区 2, 3, 4, and 5.
449 .\" MMI UNIX Manual Master Index
451 .\" CON UNIX Contributed Software Manual
453 .\" LOC UNIX Local Manual
454 .It Li \&.Os 操作系统 发行号#
461 发行号 应该 是 系统 专用的 标准发行术语, 像 4.3, 4.3+Tahoe, V.3, V.4.
462 识别不出的 参数 就 照原样 显示在 页脚. 例如, 典型的页脚 可能是:
467 .Dl \&.Os FreeBSD 2.2
471 .Dl \&.Os CS Department
478 .Pa /usr/share/tmac/mdoc/doc-common
484 .It Li \&.Dd 月 日, 年 (month day, year)
491 .Ss 名称背后 What's in a name...
492 手册宏域 的 宏名 来自 非正式的 日常用语, 用来 描述 命令, 子程序 及其
493 相关文件. 在 写 手册页 时, 文字用语 有些 轻微的变化, 分别描述 三个
500 命令. 最后, 对 用户 具体的描述 这条命令; 也就是 在 手册页 正文 里
505 宏 本身 就是 一种 命令; troff 命令 的 基本语法 是:
506 .Bd -filled -offset indent
507 \&.Va argument1 argument2 ... argument9
512 是 宏命令 或 宏请求, 紧随其后 的 是 待处理的参数.
513 第二种 情况 下, 使用 内容宏 描述 一条
518 .Bd -filled -offset indent
530 参数, 作为 可选参数 放在 代表 选项 的 方括弧内. 在
539 .Bd -literal -offset indent
545 第三种 情况 讨论 命令 及其语法, 包括 它们的例子, 可能 还有 更多细节.
553 .Em 文件参数 file arguments .
555 .Bl -tag -width make -offset indent
562 .Op Fl I Ar directory
565 .Op Ar variable=value
579 在 具体的上下文 中, 这种细节 能够 防止 混淆. 然而
581 宏包中 没有为 标志的参数 准备 宏. 作为 替代 是
583 参数宏, 用于 描述 操作对象 或 文件参数 如
587 上面的 make 命令行 是 这样 产生的:
588 .Bd -literal -offset indent
591 \&.Op Fl D Ar variable
593 \&.Op Fl f Ar makefile
594 \&.Op Fl I Ar directory
595 \&.Op Fl j Ar max_jobs
596 \&.Op Ar variable=value
609 .Ss 基本语法 General Syntax
610 手册宏域 和 基本正文宏域 的 宏 有着 相似的语法, 仅有 微小差别:
624 宏有嵌套限制. 所有的 内容宏 能够 识别和正确处理 标点符号, 每个 标点符号
625 要在 前面 用 空格 隔开. 如果 给出 这样的 宏请求:
627 .Dl \&.Li sptr, ptr),
633 标点符号 没有 被识别 出来, 全都按 原文字体 输出. 如果 标点符号 前面用
636 .Dl \&.Li "sptr , ptr ) ,"
640 .Dl Li sptr , ptr ) ,
642 标点符号 被 识别出来 了, 缺省的字体 也 有别于 原文文字的字体.
646 转义符 可以 去掉 标点字符 的 特殊意义.
648 作为 宏语言 有一定 的 限制, 当 表达的字串 中 含有
649 数学, 逻辑 或 引用 符号时 将 难于 处理:
650 .Bd -literal -offset indent-two
651 \&{+,\-,/,*,\&%,<,>,<=,>=,=,==,&,`,',"}
656 会 认为 它 应该 执行或运算 这些 符号 代表的操作.
659 转义 这些 字符. 典型语法 在 下面 显示的 第一个 内容宏 中 可以见到,
661 .Sh 手册域 MANUAL DOMAIN
662 .Ss 地址宏 Address Macro
663 地址宏 用 这种 格式 标明地址: addr1[,addr2[,addr3]].
665 .Dl Usage: .Ad address ... \*(Pu
666 .Bl -tag -width ".Ad f1 , f2 , f3 :" -compact -offset 14n
669 .It Li \&.Ad addr1\ .
671 .It Li \&.Ad addr1\ , file2
673 .It Li \&.Ad f1\ , f2\ , f3\ :
675 .It Li \&.Ad addr\ )\ )\ ,
687 宏用以 说明 这个文档的 描述对象的 作者, 或者 这篇手册页的 作者.
688 名字 信息 后面的 其他参数 被认为是 标点符号.
690 .Dl Usage: .An author_name \*(Pu
691 .Bl -tag -width ".An Joe Author ) ) ," -compact -offset 14n
692 .It Li \&.An Joe\ Author
694 .It Li \&.An Joe\ Author\ ,
696 .It Li \&.An Joe\ Author\ \&Aq\ nobody@FreeBSD.ORG
697 .An Joe Author Aq nobody@FreeBSD.ORG
698 .It Li \&.An Joe\ Author\ )\ )\ ,
707 .Ss 参数宏 Argument Macro
712 .Dl Usage: .Ar argument ... \*(Pu
713 .Bl -tag -width ".Ar file1 file2" -compact -offset 15n
718 .It Li \&.Ar file1\ .
720 .It Li \&.Ar file1 file2
722 .It Li \&.Ar f1 f2 f3\ :
724 .It Li \&.Ar file\ )\ )\ ,
734 .Ss 配置定义 (手册第四部分) Configuration Declaration
739 这个宏 接受 引号内的参数 (只能是双引号).
741 .Bl -tag -width "device le0 at scode?" -offset indent
742 .It Cd "device le0 at scode?"
744 .Ql ".Cd device le0 at scode?" .
746 .Ss 命令修饰 Command Modifier
751 宏 不在 任何参数 前 加 短横线 (dash).
752 传统的标志 以 短横线 开头, 但 一些 命令 或 命令的子集 不用这个.
753 命令修饰宏 也可以 和 交互命令 结合 使用, 如 编辑命令. 另见
755 .Ss 已定义的变量 Defined Variables
760 .Dl Usage: .Dv defined_variable ... \*(Pu
761 .Bl -tag -width ".Dv MAXHOSTNAMELEN" -compact -offset 14n
762 .It Li ".Dv MAXHOSTNAMELEN"
764 .It Li ".Dv TIOCGPGRP )"
773 .Ss Errno's (仅供手册第二部分)
776 errno 宏 指明 手册 第二部分, 库函数 的 错误返回值.(译注: 应该是系统调用)
781 基本正文宏 的 使用, 就象 用在 手册 第二部分 一样.
783 .Dl Usage: .Er ERRNOTYPE ... \*(Pu
784 .Bl -tag -width ".Bq Er ENOTDIR" -compact -offset 14n
787 .It Li \&.Er ENOENT\ )\ ;
789 .It Li \&.Bq \&Er ENOTDIR
798 .Ss 环境变量 Environment Variables
802 .Dl Usage: .Ev argument ... \*(Pu
803 .Bl -tag -width ".Ev PRINTER ) ) ," -compact -offset 14n
808 .It Li \&.Ev PRINTER\ )\ )\ ,
817 .Ss 函数参数 Function Argument
833 .Dl Usage: .Fa function_argument ... \*(Pu
834 .Bl -tag -width ".Fa d_namlen\ )\ )\ ," -compact -offset 14n
835 .It Li \&.Fa d_namlen\ )\ )\ ,
846 .Ss 函数声明 Function Declaration
852 宏 既 不调用 其他宏, 也 不能 被 其他宏调用.
854 .Dl Usage: .Fd include_file (or defined variable)
858 小节, 如果 已经 说明了 某个 函数, 并且 没有 出现 省略号, 则
861 在 函数 和 函数声明 之间, 垂直方向上 产生 一定的 空白.
864 宏 处理 命令行标志. 它 在 标志前 加一个 短横线
866 对于 交互命令 标志, 它 不需要 短横线, 可以用
868 (命令修饰 command modifier)
871 .Dl Usage: .Fl argument ... \*(Pu
872 .Bl -tag -width ".Fl \-s \-t \-v" -compact -offset 14n
883 .It Li \&.Fl xyz\ )\ ,
889 宏 不带 任何 参数, 将 只产生 一个 短横线, 代表 stdin/stdout.
895 .Ss 函数(库函数) Functions (library routines)
896 宏 .Fn 是 ANSI C 函数风格 的 模型.
898 Usage: .Fn [type] function [[type] parameters ... \*(Pu]
900 .Bl -tag -width ".Fn int align. .const * char *sptrsxx" -compact
901 .It Li "\&.Fn getchar"
903 .It Li "\&.Fn strlen ) ,"
905 .It Li \&.Fn "\\*qint align\\*q" "\\*qconst * char *sptrs\\*q" ,
906 .Fn "int align" "const * char *sptrs" ,
916 宏调用 的 结尾处 给出 标记 (反括弧).
918 对于 八个 参数 以上的 函数 (尽管少见), 可以 用 宏
924 (function argument) 宏 的 使用, 突破 参数 过多 的 限制, 例如:
925 .Bd -literal -offset indent
926 \&.Fo "int res_mkquery"
933 \&.Fa "struct rrec *newrr"
940 .Bd -filled -offset indent
941 .Fo "int res_mkquery"
948 .Fa "struct rrec *newrr"
963 小节 有 一个以上的 函数声明, 而且 函数类型 没有 说明, 则 会产生 一个 断行.
964 在 函数 和 函数 的 垂直方向 上 产生 一定的 空白. 此时
966 宏 不按 troff 的 行长 检查 单词 边界, 有可能 难看的 从 单词中间 断开.
968 .Ss 函数类型 Function Type
971 小节. 它 可以 毫无困难的 用在 手册页的 其他 地方, 但 它的 主要 目的
974 小节, 以 核心标准形式 (kernel normal form) 描述 函数类型
975 (它 导致 断行, 在 下一行 显示 函数 名称).
977 .Dl Usage: .Ft type ... \*(Pu
978 .Bl -tag -width "\&.Ft struct stat" -offset 14n -compact
979 .It Li \&.Ft struct stat
985 .Ss 交互命令 Interactive Commands
990 .Dl Usage: .Ic argument ... \*(Pu
991 .Bl -tag -width ".Ic setenv , unsetenvxx" -compact -offset 14n
994 .It Li \&.Ic do while {...}
996 .It Li \&.Ic setenv\ , unsetenv
997 .Ic setenv , unsetenv
1007 宏 用于 说明 文档题目 或 主题. 它的特点 是 能够 记住 调用时 带的 第一个
1008 参数, 这个 参数 就是 该页的 主题. 当 不带 参数 调用它 时,
1010 宏 把 以前 记住的 参数 显示 出来, 可以 为作者 省点劲.
1011 注意: 手册第二部分或第三部分的函数名称, 在
1029 宏 非常接近, 只是 它 不能够 记忆 调用时的 参数.
1031 .Dl Usage: .Nm argument ... \*(Pu
1032 .Bl -tag -width ".Nm mdoc.sample" -compact -offset 14n
1033 .It Li \&.Nm mdoc.sample
1035 .It Li \&.Nm \e-mdoc
1037 .It Li \&.Nm foo\ )\ )\ ,
1047 宏 把 命令行上 剩余的 所有 参数 用 方括弧 括在一起, 把 最后的 标点符号
1054 .Dl Usage: .Op options ... \*(Pu
1055 .Bl -tag -width ".Op Fl c Ar objfil Op Ar corfil ," -compact -offset indent
1060 .It Li ".Op Fl k ) ."
1062 .It Li ".Op Fl k Ar kookfile"
1063 .Op Fl k Ar kookfile
1064 .It Li ".Op Fl k Ar kookfile ,"
1065 .Op Fl k Ar kookfile ,
1066 .It Li ".Op Ar objfil Op Ar corfil"
1067 .Op Ar objfil Op Ar corfil
1068 .It Li ".Op Fl c Ar objfil Op Ar corfil ,"
1069 .Op Fl c Ar objfil Op Ar corfil ,
1070 .It Li \&.Op word1 word2
1079 .Bd -literal -offset indent
1081 \&.Op \&Fl k \&Ar kilobytes
1082 \&.Op \&Fl i \&Ar interval
1083 \&.Op \&Fl c \&Ar count
1089 .Op Fl k Ar kilobytes
1090 .Op Fl i Ar interval
1104 .Dl Usage: .Pa pathname \*(Pu
1105 .Bl -tag -width ".Pa /tmp/fooXXXXX ) ." -compact -offset 14n
1106 .It Li \&.Pa /usr/share
1108 .It Li \&.Pa /tmp/fooXXXXX\ )\ .
1109 .Pa /tmp/fooXXXXX ) .
1117 .Dl Usage: .Va variable ... \*(Pu
1118 .Bl -tag -width ".Va char s ] ) ) ," -compact -offset 14n
1121 .It Li \&.Va settimer ,
1123 .It Li \&.Va int\ *prt\ )\ :
1125 .It Li \&.Va char\ s\ ]\ )\ )\ ,
1134 .Ss 手册页参照 Manual Page Cross References
1136 宏 把 第一个参数 当做 手册页 名称, 第二个参数, 如果 存在,
1137 当做 标点符号 或 手册页 的 部分号 (节号). 剩下 所有的参数
1140 .Dl Usage: .Xr man_page [1,...,8] \*(Pu
1141 .Bl -tag -width ".Xr mdoc 7 ) ) ," -compact -offset 14n
1144 .It Li \&.Xr mdoc\ ,
1148 .It Li \&.Xr mdoc 7\ )\ )\ ,
1157 .Sh 基本正文宏域 GENERAL TEXT DOMAIN
1159 .Bd -literal -offset indent -compact
1160 Usage: .At [v6 | v7 | 32v | V.1 | V.4] ... \*(Pu
1162 .Bl -tag -width ".At v6 ) ," -compact -offset 14n
1174 被 (其他宏) 调用. 该宏 最多 接受 两个 参数.
1176 .Dl Usage: .Bx [Version/release] ... \*(Pu
1177 .Bl -tag -width ".Bx 4.3 ) ," -compact -offset 14n
1187 .Bd -literal -offset indent -compact
1188 Usage: .Fx Version.release ... \*(Pu
1190 .Bl -tag -width ".Fx 2.2 ) ," -compact -offset 14n
1200 被 (其他宏) 调用. 该宏 最多 接受 两个 参数.
1202 .Dl Usage: .Ux ... \*(Pu
1203 .Bl -tag -width ".Ux 4.3 ) ," -compact -offset 14n
1210 .Ss 嵌入和引用宏 Enclosure and Quoting Macros
1211 嵌入 的 概念 和 引用 类似. 把 一句 或 多句 引用对象 嵌到 一对 字符 中,
1212 象 引号 或 括弧. 本篇 文档中 将 混用 术语
1216 大多数 单行的 引用宏名 用 一个 小写字母
1218 结尾, 表明 这是 一个 引用(quoting), 但 也有 不规则变化.
1219 每个 引用宏 都有 一对 开始(open) 和 结束(close) 宏, 各自 以
1223 结尾. 在 某些限制时 这些宏 可以 跨行 使用, 单行的引用宏 可以 嵌套在里面.
1226 .Bd -filled -offset indent
1227 .Bl -column "quote " "close " "open " "Enclose Stringx(in XX) " XXstringXX
1228 .Em " Quote Close Open Function Result"
1229 \&.Aq .Ac .Ao Angle Bracket Enclosure <string>
1230 \&.Bq .Bc .Bo Bracket Enclosure [string]
1231 \&.Dq .Dc .Do Double Quote ``string''
1232 .Ec .Eo Enclose String (in XX) XXstringXX
1233 \&.Pq .Pc .Po Parenthesis Enclosure (string)
1234 \&.Ql Quoted Literal `st' or string
1235 \&.Qq .Qc .Qo Straight Double Quote "string"
1236 \&.Sq .Sc .So Single Quote `string'
1240 除了 下面的 不规则宏, 所有的 引用宏 可以被 (其他宏) 分析和调用. 所有的
1241 引用宏 能够 正确 处理 标点符号, 只要 一次 一个字符, 中间 用 空格 隔开.
1242 引用宏 检查 开始和结束 符号, 以决定 把 它 放在 引用串的 前面还是后面.
1244 .Bl -tag -width xxx,xxxx
1245 .It Li \&.Ec , \&.Eo
1246 这些宏 的 第一个参数 是 各自的 开始和结束串.
1254 格式化, 引用的原文 始终 被引用. 如果用 troff 格式化,
1255 只有 宽度 小于 三个定宽字符 的 项 才被 引用.
1256 This is to make short strings more visible where the font change
1257 to literal (constant width) is less noticeable.
1258 当 字体 变成 原文(定宽) 时, 短串显得更容易被看到.
1260 前缀宏不能被 (其他宏) 调用, 但是可以被分析.
1261 .Bl -tag -width "(namexx" -offset indent
1262 .It Li ".Pf ( Fa name2"
1269 (无空格) 宏 执行 类似的 后缀 功能.
1274 .Bl -tag -width ".Aq Pa ctype.h ) ,xxxxxxxx" -compact -offset indent
1277 .It Li \&.Aq \&Ar ctype.h\ )\ ,
1281 .It Li \&.Bq \&Em Greek \&, French \&.
1282 .Bq Em Greek , French .
1285 .It Li ".Dq string abc ."
1287 .It Li ".Dq \'^[A-Z]\'"
1289 .It Li "\&.Ql man mdoc"
1293 .It Li "\&.Qq string ) ,"
1295 .It Li "\&.Qq string Ns ),"
1299 .It Li "\&.Sq string
1305 选项宏. 它们 都 来自 上面 列出的 基本 引用宏.
1309 扩展的 参数列表宏 同样 来自 相同的 基本例程, 并且, 在 最坏的情况 下, 是
1312 .Ss No\-Op 或正文宏 or Normal Text Macro
1315 用在 某个 宏命令行 上, 意如其名, 将
1317 被格式化, 语法 遵循 一般的 内容宏.
1318 .Ss 无空格宏 No Space Macro
1320 在 宏请求 之间 消除 不需要的 空格.
1321 它 用在 旧式风格的 参数列表 中, 标志和参数 间 没有 空格:
1322 .Bl -tag -width ".Op Fl I Ns Ar directoryxx" -offset indent
1323 .It Li ".Op Fl I Ns Ar directory"
1325 .Op Fl I Ns Ar directory
1332 宏, 除非 还有 其他 宏名 跟在 后面.
1335 .Ss 手册页对照参考 Section Cross References
1337 宏 指定了 到 同一个文档内的 小节首部 的 对照参考.
1340 .Bl -tag -width "Li \&.Sx FILES" -offset 14n
1344 .Ss 参考和引言 References and Citations
1345 The following macros make a modest attempt to handle references.
1346 At best, the macros make it convenient to manually drop in a subset of
1347 refer style references.
1348 下面的宏 试图 适度的 处理 参考资料. 最好情况时, 这些宏 便于 手工
1351 .Bl -tag -width 6n -offset indent -compact
1353 参考开始. 它 导致 一次 断行, 并且 开始 收集 参考资料, 直到 遇到 参考结束宏.
1382 符号 开始的 宏 不能被 (其他宏) 调用, 只能 被 trade name macro 分析,
1383 结果 返回给 调用者 (此时 结果 不太好 预测). 其目的 是 允许 trade name
1385 .Xr troff Ns / Ns Xr ditroff
1387 .Ss 返回值 Return Values
1390 .Sx 返回值 RETURN VALUES
1393 .Dl Usage: .Rv [-std function]
1395 .Ql \&.Rv -std atexit
1402 选项 仅用于 手册页的 第二和第三部分.
1403 .Ss Trade Names (或缩略和类型名)
1404 trade name 宏 一般说来 是 一个 很小的 大写字母宏, 用于 所有 大于
1407 .Dl Usage: .Tn symbol ... \*(Pu
1408 .Bl -tag -width ".Tn ASCII" -compact -offset 14n
1417 .Ss 扩展参数 Extended Arguments
1421 宏 可以 在 宏的边界 扩展 参数列表. 如果 某个宏 要求 所有的参数 在 一行上
1422 出现, 则 参数列表 不能 在 这儿 被 扩展. 例如
1427 宏的一个示例, 用 空格模式宏 把 空格 去掉:
1428 .Bd -literal -offset indent
1430 \&.It Xo Sy I Ar operation
1431 \&.No \een Ar count No \een
1437 .Bd -filled -offset indent
1438 .Bl -tag -width flag -compact
1440 .It Xo Sy I Ar operation
1441 .No \en Ar count No \en
1448 .Bd -literal -offset indent
1450 \&.It Cm S No \&/ Ar old_pattern Xo
1451 \&.No \&/ Ar new_pattern
1458 .Bd -filled -offset indent
1459 .Bl -tag -width flag -compact
1461 .It Cm S No \&/ Ar old_pattern Xo
1462 .No \&/ Ar new_pattern
1473 .Bd -literal -offset indent
1476 \&.Oo \e&! Oc Ns Ar variable
1477 \&.Op Ar operator variable ...
1482 .Bd -filled -offset indent
1483 .Bl -tag -width flag -compact
1486 .Oo \&! Oc Ns Ar variable
1487 .Op Ar operator variable ...
1494 (list-item) 宏 的 参数列表 中 使用了
1496 宏. 扩展宏 不经常 使用, 一般用来 扩展 list-item 宏 的 参数列表.
1497 这也 不幸的 是 扩展宏 最苛刻的 地方. 前两个例子里 空格 被去掉; 第三个 例子中,
1498 希望 能 输出 部分 空格, 而不是 全部. 在 这种情况下 用 这些宏, 要 确保
1502 宏 摆放到 第三个例子 中 示范的位置. 如果
1506 的 参数表 中, 则 无法预测 空格 情况. 这种情况下,
1508 (no space macro) 一定 不能 作为 一行的 第一个宏 或 最后一个宏. 当前
1510 发布的 超过 900个 手册页 (事实上大约1500个) 中,
1514 .Sh 页结构宏宏域 PAGE STRUCTURE DOMAIN
1515 .Ss 小节首部 Section Headers
1516 每个 手册页 里 都用到了 下面 列出的 三个
1518 小节首部宏. 作者 写 手册页 时 可以 酌情考虑 其他 建议使用的 小节首部.
1520 宏 最多 带 九个 参数. 它 可以 被 (其他宏) 分析, 但不能 被调用.
1521 .Bl -tag -width ".Sh SYNOPSIS"
1524 宏是 必不可少的. 否则 无法设置 页头, 页脚 和 缺省的 页布局, 样子 会 很难看.
1526 小节 至少 由 三项 组成. 第一个 是
1528 名称宏, 命名 手册页的 主题. 第二个 是 名称描述宏
1530 它 把 主题名称 和 第三项, 描述, 分离开来.
1531 描述 应该 尽可能的 精简易懂, 少占空间.
1532 .It \&.Sh 总览 SYNOPSIS
1534 总览小节 描述 该 手册页对象 的 典型用途.
1546 用在 手册页 的 第二第三部分, 命令 和 基本名称宏
1548 用在 手册页 的 1, 5, 6, 7, 8 部分. 手册 第四部分 需要
1553 配制设备用途宏. 其他一些 宏 可能 用来 产生 概要行, 象下面的:
1555 .Bd -filled -offset indent
1565 .Dl \&.Op \&Fl benstuv
1579 .Dl ".Op Fl a | Fl b"
1583 一般把 \*(Ba 当做 特殊符号. 参见
1584 .Sx 预定义串 PREDEFINED STRINGS ,
1586 .It \&.Sh 描述 DESCRIPTION
1589 小节 的 第一段话 是 关于 这个 命令, 函数 或 文件 的 摘要, 后跟 字典式的
1590 选项 以及 相应的解释. 创建 这样的 列表, 应该 使用
1597 .Sx 列表和栏目 Lists and Columns
1603 小节首部 是 手册页 编排的 常见内容, 为了 保证 连续性, 应 适当 使用.
1604 它们 按照 应该 出现 的 顺序 排列.
1605 .Bl -tag -width SYNOPSIS
1606 .It \&.Sh 环境 ENVIRONMENT
1608 小节 用来 揭示 相关的 环境变量 和 线索, 它们的 行为, 表现, 用法.
1609 .It \&.Sh 示例 EXAMPLES
1610 有 很多 办法 创建 示例, 详见 下面的
1614 由 手册页的 主题对象 创建 或 使用 的 文件, 应该 通过
1619 .It \&.Sh 另见 SEE ALSO
1620 如果 提及 其他 手册页 或 参照 相应的 手册, 应 把它们 放在
1626 小节 的 参照主题 应该按 手册节号 排序, 按 字母顺序 陈列, 并用 逗号 隔开,
1637 .It \&.Sh 遵循 CONFORMING TO
1638 如果 那些 命令, 库函数 或 文件 遵循 一定的 标准 实现, 如
1642 那就 不需要 这一小节. 如果 命令 不符合 任何标准, 应该 把 它的历史 放在
1645 .It \&.Sh 历史 HISTORY
1646 任何 不属于 已知标准 的 命令 应该 在 这一节 给出 它的 大致历史.
1647 .It \&.Sh 作者 AUTHORS
1648 如果 有 必要, 把 致谢名单 也 列这儿.
1649 .It \&.Sh 诊断 DIAGNOSTICS
1652 特定的 错误处理, 尤其是 库函数 (手册页第二第三部分), 放这儿.
1662 .Bd -literal -offset 14n
1663 \&.Sh PAGE STRUCTURE DOMAIN
1665 .Ss 段落和空行 Paragraphs and Line Spacing.
1669 把 段落命令 放在 所需的位置, 可以 产生 一个空行. 在
1677 声明了 垂直方向 的 距离, 除非 给出 -compact 标志).
1679 .\" This worked with version one, need to redo for version three
1682 .\" .Cw (ax+bx+c) \ is\ produced\ by\ \&
1683 .\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
1700 .\" .Em is produced by
1716 .\" This example shows the same equation in a different format.
1720 .\" signs were forced with
1724 .\" .Cw (ax\ +\ bx\ +\ c) \ is\ produced\ by\ \&
1725 .\" .\".Cw (ax+bx+c) \&.Va_by_) \&_and_\& \&[?/]m_b1_e1_f1[?/]\&
1736 .\" .Li \&.Cx \e\ +\e\ \e&
1747 .\" .Em is produced by
1755 .\" .Li \&.Cx \e\ +\e\ \e&
1766 .\" The incantation below was
1772 .\" .Cw \&[?/]m_b1_e1_f1[?/]\& is\ produced\ by
1774 .\" .Li \&.Cx Op Sy ?/
1784 .\" .Em is produced by
1786 .\" .Li \&.Ar \e\ b1 e1 f1
1798 目前 只实现了 对单词的 保持 能力. 这个宏 有
1806 用于 防止 在 选项语句 的 中间 断行. 在 make 命令行参数的 例子里 (参见
1807 .Sx 名称背后 What's in a name ) ,
1811 (事实上 可以 用 选项宏 防止 此类 事情, 但 当我们 决定 在
1813 中 作为 基本选项, 强制 右边界对齐 时, 它 在 稀疏行里 展开的 很糟糕.
1814 使用 保持宏 时 需要 多做点事, 增加 一个
1818 有 五种类型 的 显示, 一个 快速的单行缩进显示
1824 (begin-display) 显示开始 和
1826 (end-display) 显示结束 宏对 组成的 不规则块.
1828 .Bl -tag -width \&.Dlxx
1830 (D-one) 显示 一行 缩进文字. 该宏 可以被 (其他宏) 分析, 但 不能 被调用.
1835 .Li \&.Dl Fl ldghfstru .
1840 示例宏 已经 遍布 这篇 文档. 它 允许 缩进 (显示) 一行 文字.
1841 其 缺省字体 设为 定宽 (原文), 它 可以 被 其他宏 分析 和 识别.
1844 .Dl % ls -ldg /usr/local/bin
1847 .Li \&.Dl % ls -ldg /usr/local/bin .
1853 宏 结束. 显示 可以 嵌套在 显示 和 列表中.
1857 .Dl ".Bd display-type [-offset offset_value] [-compact]"
1859 显示类型 必须是 下面四个 之一, 可以 指定 一个 缩进量.
1862 .Bl -tag -width "file file_name " -compact
1864 以 打字 形式 显示 一块 正文, 其 右(和左)边界 是 不平整边界.
1866 显示 填充 (格式化) 块. 块中文字 被 格式化 (边界 已经 填充过,
1869 显示 原文块, 适用于 源程序, 或 那种 简单的, 用 table 和
1871 .It Fl file Ar file_name
1874 标志 后面的 文件. 原文模式 被打开, table 设为 8个字符 宽, 然而 文件中
1876 .Xr troff/ Ns Nm \-mdoc
1878 .It Fl offset Ar string
1881 指定为 下面 字符串 之一, 这些 字符串 解释为 对 以后的 正文块的 缩进层次.
1883 .Bl -tag -width "indent-two" -compact
1889 应该 是把 正文块 布在 中间. 不幸的是, 目前 只能在 大致的 中间位置
1892 按 缺省 缩进值 或 table 值 缩进. 这个 缺省 缩进值 同时 用于
1894 显示, 因此 你 应该 使 这两种 显示 一致. 缩进值 一般 设为 6n,
1899 在 距离 右边界 大约 两英寸处 把 正文块 靠
1901 对齐. 这个宏 要 试验 效果, 有可能
1911 现有 五个宏 用于 改变 手册页的 文字外观:
1912 .Bl -tag -width \&.Emxx
1916 宏 加重或强调. 常用的 强调字体 是 斜体 (italic).
1918 .Dl Usage: .Em argument ... \*(Pu
1919 .Bl -tag -width ".Em vide infra ) ) ," -compact -offset 14n
1920 .It Li ".Em does not"
1922 .It Li ".Em exceed 1024 ."
1924 .It Li ".Em vide infra ) ) ,"
1925 .Em vide infra ) ) ,
1929 宏可以被 (其他宏) 分析和调用. 不带参数 调用
1934 原文宏 用来 显示 字符, 变量, 常数, 任何 希望 照 输入文字 原样显示 的 内容.
1936 .Dl Usage: .Li argument ... \*(Pu
1937 .Bl -tag -width ".Li cntrl-D ) ," -compact -offset 14n
1940 .It Li \&.Li M1 M2 M3\ ;
1942 .It Li \&.Li cntrl-D\ )\ ,
1944 .It Li \&.Li 1024\ ...
1951 一般说来 symbolic 强调宏 无论在 象徵主义 角度, 还是 传统的英语 里,
1954 .Dl Usage: .Sy symbol ... \*(Pu
1955 .Bl -tag -width ".Sy Important Noticex" -compact -offset 14n
1956 .It Li \&.Sy Important Notice
1957 .Sy Important Notice
1978 .Bl -tag -width "file file_name " -compact
1979 .It Sy \&Em | Fl emphasis
1983 .It Sy \&Li | Fl literal
1987 .It Sy \&Sy | Fl symbolic
1995 .Ss 标记栏和列表 Tagged Lists and Columns
2002 宏结束. 列表 可以 嵌套在 列表和显示 中. 栏 可以 用在 列表 中, 但是 列表
2005 另外 还可以 指定 列表属性, 像标记宽度, 列表偏移, 以及 紧凑模式
2007 在本文中 大多 使用了 标记风格 (tag style) 的 列表
2009 作为 步距变化, 表示 列表类型的 列表类型 是个 突出来 (overhanging) 的 列表
2013 用户中 很流行, 但 看过 很多 页 的 标记列表 后 可能会 觉得 有点 滑稽.
2021 这三个 是 最简单的 列表类型. 一旦 使用了
2025 宏 组织 表项 . 例如, 可以 这样 写 一个 简单的 数字列表"
2026 .Bd -literal -offset indent-two
2027 \&.Bl -enum -compact
2029 \&Item one goes here.
2031 \&And item two here.
2033 \&Lastly item three goes here.
2039 .Bl -enum -offset indent-two -compact
2045 Lastly item three goes here.
2049 .Bd -literal -offset indent-two
2050 \&.Bl -bullet -compact
2052 \&Bullet one goes here.
2059 .Bl -bullet -offset indent-two -compact
2061 Bullet one goes here.
2073 宏 指定的 参数, 并且 创建 一个 标签, 它 可能会
2079 显示在 更高 位置, 并且 不能 缩进 或
2085 宏 只能 被 插入 (inset), 悬挂 (hang), 和 标记列表类型宏 分析,
2089 .Bl -inset -offset indent
2091 The tagged list (also called a tagged paragraph) is the
2092 most common type of list used in the Berkeley manuals.
2094 Diag lists create section four diagnostic lists
2095 and are similar to inset lists except callable
2098 Hanged labels are a matter of taste.
2100 Overhanging labels are nice when space is constrained.
2102 Inset labels are useful for controlling blocks of
2103 paragraphs and are valuable for converting
2105 manuals to other formats.
2109 .Bd -literal -offset indent
2110 \&.Bl -inset -offset indent
2112 \&The tagged list (also called a tagged paragraph) is the
2113 \&most common type of list used in the Berkeley manuals.
2115 \&Diag lists create section four diagnostic lists
2116 \&and are similar to inset lists except callable
2117 \¯os are ignored.
2119 \&Hanged labels are a matter of taste.
2121 \&Overhanging labels are nice when space is constrained.
2123 \&Inset labels are useful for controlling blocks of
2124 \¶graphs and are valuable for converting
2126 \&manuals to other formats.
2131 .Bl -hang -offset indent
2133 labels appear similar to tagged lists when the
2134 label is smaller than the label width.
2135 .It Em Longer hanged list labels
2136 blend in to the paragraph unlike
2137 tagged paragraph labels.
2141 .Bd -literal -offset indent
2142 \&.Bl -hang -offset indent
2144 \&labels appear similar to tagged lists when the
2145 \&label is smaller than the label width.
2146 \&.It Em Longer hanged list labels
2147 \&blend in to the paragraph unlike
2148 \&tagged paragraph labels.
2152 带有 可选 宽度项的 标记列表 可以 控制 标记的 宽度.
2154 .Bl -tag -width "PAGEIN" -compact -offset indent
2156 sleep time of the process (seconds blocked)
2160 resulting from references
2161 by the process to pages not loaded in core.
2163 numerical user-id of process owner
2165 numerical id of parent of process process priority
2166 (non-positive when in non-interruptible wait)
2170 .Bd -literal -offset indent
2171 \&.Bl -tag -width "PAGEIN" -compact -offset indent
2173 \&sleep time of the process (seconds blocked)
2177 \&resulting from references
2178 \&by the process to pages not loaded in core.
2180 \&numerical user-id of process owner
2182 \&numerical id of parent of process process priority
2183 \&(non-positive when in non-interruptible wait)
2188 .Bl -tag -width Ar -offset indent
2189 .It Fl width Ar "\&Fl"
2190 把 宽度 设置为 标志 (flag) 的 缺省 宽度. 所有 可调用的 宏 都有
2193 的 值 设为 十个 字符宽度, 大约 5/6 英寸.
2194 .It Fl width Ar "24n"
2195 设置 宽度 为 24 个 字符宽度, 大约 两英寸. 要使 比例 调整正常, 字母
2198 .It Fl width Ar "ENAMETOOLONG"
2200 .It Fl width Ar "\\*qint mkfifo\\*q"
2204 如果 没有 为 标记列表类型 指定 宽度, 第一次 调用
2206 的 时候, 格式化软件 试图 决定 适当的宽度. 如果
2208 的 第一个 参数 是 可调用宏, 就 使用 这个宏的 缺省宽度, 就像 把 宏名 当做宽度.
2209 可是 如果 列表中 的 其他表项 得到 另一个 可调用宏, 则 认为 它是 新的,
2211 .Sh 预定义串 PREDEFINED STRINGS
2212 下面的串 是 预定义的, 可以 用在 troff 的 串翻译序列
2220 是串名. 翻译序列 可以 用在 文本 的 任何地方.
2222 .Bl -column "String " "Nroff " "Troff " -offset indent
2223 .It Sy "String Nroff Troff"
2224 .It Li "<=" Ta \&<\&= Ta \*(<=
2225 .It Li ">=" Ta \&>\&= Ta \*(>=
2226 .It Li "Rq" Ta "''" Ta \*(Rq
2227 .It Li "Lq" Ta "``" Ta \*(Lq
2228 .It Li "ua" Ta ^ Ta \*(ua
2229 .It Li "aa" Ta ' Ta \*(aa
2230 .It Li "ga" Ta \` Ta \*(ga
2231 .\" .It Li "sL" Ta ` Ta \*(sL
2232 .\" .It Li "sR" Ta ' Ta \*(sR
2233 .It Li "q" Ta \&" Ta \*q
2234 .It Li "Pi" Ta pi Ta \*(Pi
2235 .It Li "Ne" Ta != Ta \*(Ne
2236 .It Li "Le" Ta <= Ta \*(Le
2237 .It Li "Ge" Ta >= Ta \*(Ge
2238 .It Li "Lt" Ta < Ta \*(Gt
2239 .It Li "Gt" Ta > Ta \*(Lt
2240 .It Li "Pm" Ta +- Ta \*(Pm
2241 .It Li "If" Ta infinity Ta \*(If
2242 .It Li "Na" Ta \fINaN\fP Ta \*(Na
2243 .It Li "Ba" Ta \fR\&|\fP Ta \*(Ba
2254 的 除错系统 比较 有限, 但是 可以 帮助你 检测出 微妙的 错误,
2255 例如 参数名 和 内部寄存器 或 宏名 冲突. (是什么?) 寄存器 是
2257 的 算术存储类, 用 一到二个字符 命名.
2265 的 内部寄存器 由 两个字符 组成, 格式是 <大写字母> <小写字母> 如
2273 有 它 自己的 内部寄存器, 由 两个 小写字母 组成, 或者 是 一个点 加上
2274 一个字母, 或者 是 转义字符 (meta-character) 和 字符. 已经 介绍过的
2277 防止 解释宏. 这办法 同样 适用于 内部寄存器名.
2279 .\" Every callable macro name has a corresponding register
2280 .\" of the same name (<upper_case><lower_case>).
2281 .\" There are also specific registers which have
2282 .\" been used for stacks and arrays and are listed in the
2284 .\" .Bd -ragged -offset 4n
2285 .\" [A-Z][a-z] registers corresponding to macro names (example ``Ar'')
2286 .\" [a-z][A-Z] registers corresponding to macro names (example ``aR'')
2287 .\" C[0-9] argument types (example C1)
2288 .\" O[0-9] offset stack (displays)
2289 .\" h[0-9] horizontal spacing stack (lists)
2290 .\" o[0-9] offset (stack) (lists)
2291 .\" t[0-9] tag stack (lists)
2292 .\" v[0-9] vertical spacing stack (lists)
2293 .\" w[0-9] width tag/label stack
2296 如果 未经转义的 寄存器名 出现在 宏请求的 参数列表 中, 其 后果 不可预测.
2297 一般说来, 如果 大段的文字 没有 出现在 该出现的 地方, 或者 短句, 如标签,
2298 消失了, 多半是 这个地方 误解了 参数列表中的 参数类型.
2299 既然 你的母亲 都 没打算 让你 记住 那些 乱七八糟的 东西, 那就 用 一种办法
2302 (debug) 宏 可以 显示出 对 大多数宏 的 参数列表的 解释.
2305 之类 的 宏 不包含 调试信息, 但是 所有 可调用宏 包含, 我们 强烈建议 一旦
2310 .Dl Usage: \&.Db [on | off]
2312 在 这个 示例中, 我们把 介于 debug 宏 之间 的 文本 故意 弄出点 错误 (标志参数
2317 .Bd -literal -offset indent
2319 \&.Op Fl aC Ar file )
2324 .Bd -literal -offset indent
2326 DEBUG(argv) MACRO: `.Op' Line #: 2
2327 Argc: 1 Argv: `Fl' Length: 2
2328 Space: `' Class: Executable
2329 Argc: 2 Argv: `aC' Length: 2
2330 Space: `' Class: Executable
2331 Argc: 3 Argv: `Ar' Length: 2
2332 Space: `' Class: Executable
2333 Argc: 4 Argv: `file' Length: 4
2334 Space: ` ' Class: String
2335 Argc: 5 Argv: `)' Length: 1
2336 Space: ` ' Class: Closing Punctuation or suffix
2337 MACRO REQUEST: .Op Fl aC Ar file )
2341 调试信息的 第一行 是 调用的 宏名, 这里是
2343 和 它 所在的 行号. 如果 涉及了 一个 或 多个 文件 (特别是 其他文件
2344 包含进来), 行号有可能失灵. 但如果 只有 一个文件, 它 应该是 准的.
2347 和 它的长度. 如果 参数的长度 是 两个字符, 将会 测试 看它 能否 执行
2348 (不幸的是,含有 非零值 的 寄存器 看上去 都能执行).
2349 第三行 给出 分配给类的 空间, 以及 类的类型. 这里的 问题是, 参数 aC
2350 不应该 可执行. 类的 四种类型是 字符串, 可执行类, 结束标点, 和开始标点.
2351 最后一行 显示了 读入的 完整 参数行. 下个例子里, 惹祸的
2354 .Bd -literal -offset indent
2356 \&.Em An escaped \e&aC
2359 .Bd -literal -offset indent
2361 DEBUG(fargv) MACRO: `.Em' Line #: 2
2362 Argc: 1 Argv: `An' Length: 2
2363 Space: ` ' Class: String
2364 Argc: 2 Argv: `escaped' Length: 7
2365 Space: ` ' Class: String
2366 Argc: 3 Argv: `aC' Length: 2
2367 Space: ` ' Class: String
2368 MACRO REQUEST: .Em An escaped &aC
2376 序列的 长度 为零, 但是 不存在 叫做
2378 的 寄存器, 因此 它的类型 是 字符串.
2380 其他 诊断内容 是 使用报告等, 能够 自我解释的.
2381 .Sh GROFF, TROFF AND NROFF
2388 为了 便于 在线阅读, 这个宏包 阻止了 分页, 页头, 页脚 之类 常常在
2390 中 出现的 中断. 此时 即使在 手册页 尾,
2394 ) 也 不会 提示 什么. 对 分页的 阻止 使得
2396 文件 不适合 硬拷贝 (hardcopy). 有一个 名为
2399 .Pa /usr/src/share/tmac/doc-nroff
2400 (依赖于宿主系统) 中置零, 恢复 传统风格.
2402 .Bl -tag -width /usr/share/man0/template.doc -compact
2403 .It Pa /usr/share/tmac/tmac.doc
2405 .It Pa /usr/share/misc/mdoc.template
2407 .It Pa /usr/share/examples/mdoc/*
2415 仍然 没有 解决 在 标志参数中的 连字符, 在
2417 小节 偶尔 会 出点麻烦 (在 连字符处 断行).
2421 还没有 把 3f 小节 加进 头例程 (header routine) 中.
2431 偶然 它会 断开 反括弧, 而 有时候 如果 某行 已满时, 看上去 会 很可笑.
2433 当 使用 nroff 格式化 文档 时, 防止 页头和页脚 (不是 初始的 头和脚) 断开 的 方法
2434 有可能 偶尔 在 页的底部 产生 一个 不可见的 部分填满的 行 (空行).
2436 列表和显示宏不做任何保存, 显然它应该做的.
2437 .\" Note what happens if the parameter list overlaps a newline
2439 .\" to make sure a line boundary is crossed:
2441 .\" \&.Fn struct\e\ dictionarytable\e\ *dictionarylookup struct\e\ dictionarytable\e\ *tab[]
2444 .\" produces, nudge nudge,
2445 .\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
2446 .\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] ,
2448 .\" .Fn struct\ dictionarytable\ *dictionarylookup char\ *h struct\ dictionarytable\ *tab[] .
2450 .\" If double quotes are used, for example:
2452 .\" \&.Fn \*qstruct dictionarytable *dictionarylookup\*q \*qchar *h\*q \*qstruct dictionarytable *tab[]\*q
2455 .\" produces, nudge nudge,
2456 .\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
2458 .\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" ,
2460 .\" .Fn "struct dictionarytable *dictionarylookup" "char *h" "struct dictionarytable *tab[]" .
2462 .\" Not a pretty sight...
2463 .\" In a paragraph, a long parameter containing unpaddable spaces as
2464 .\" in the former example will cause
2466 .\" to break the line and spread
2467 .\" the remaining words out.
2468 .\" The latter example will adjust nicely to
2469 .\" justified margins, but may break in between an argument and its
2473 .\" the right margin adjustment is normally ragged and the problem is
2477 .Sy 徐明 <xuming@users.sourceforge.net>
2480 .Sh "《中国Linux论坛man手册页翻译计划》"
2481 .Sy http://cmpp.linuxforum.net