Vim documentation: print

*print.txt* For Vim version 8.0. 最近更新: 2017年8月 VIM 参考手册 by Bram Moolenaar 译者: Willis http://vimcdoc.sf.net 打印 *printing* 1. 简介 |print-intro| 2. 打印选项 |print-options| 3. PostScript 打印 |postscript-printing| 4. PostScript 打印编码 |postscript-print-encoding| 5. PostScript CJK 打印 |postscript-cjk-printing| 6. PostScript 打印疑难解答 |postscript-print-trouble| 7. PostScript 工具 |postscript-print-util| 8. 换页字符 |printing-formfeed| {Vi 无此功能} {仅当编译时加入 |+printer| 特性才有效} ============================================================================== 1. 简介 *print-intro* 在 MS-Windows 上 Vim 可以在任何打印机上打印你的文本。在别的系统上,它产生一个 PostScript 文件。该文件能直接发送到 PostScript 打印机上,也能通过类似 ghostscript 的程序用在别的打印机上。 备注: 如果用 |:hardcopy| 打印有问题,还有一个办法是用 |:TOhtml| 并在浏览器上打 印生成的 html。 *:ha* *:hardcopy* *E237* *E238* *E324* :[range]ha[rdcopy][!] [arguments] 打印 [range] 指定的行 (缺省是整个文件)。 在 MS-Windows 上,会显示打印对话框,用来选择打印机和 纸张尺寸等。[!] 版本跳过对话框。这里,打印机由 'printdevice' 指定。如果 'printdevice' 为空,就使用 系统缺省打印机。 对于非 MS-Windows 的系统,先在一个临时文件写入 Postscript,然后用 'printexpr' 打印它。这时, [arguments] 可以在 'printexpr' 里通过 |v:cmdarg| 得 到。 否则的话,[arguments] 被忽略。'printoptions' 可以用来 指定纸张尺寸,是否双面打印,等等。 :[range]ha[rdcopy][!] >{filename} 同上,但把 Postscript 打印到文件 {filename}。 其中,"%" 等结构通过 |cmdline-special| 得到扩展。 需要小心的是,现存的同名文件将被不加提示的覆盖。 {仅当编译时加入 |+postscript| 特性才能有此功能} 在 MS-Windows 上应使用打印机驱动程序的 "输出到文件" 功能。 打印过程中显示完成的页号和百分比。要中断打印,按中断键 (CTRL-C 或者在 MS-系统 里。CTRL-Break)。 'printfont''printoptions' 选项控制打印输出。'printheader' 指定页眉的格式。 打印文件根据指定的边界 (margin) 排版,这不受当前窗口的 'wrap''linebreak' 设置影响。'printoptions' 里的 "wrap" 项可以用来关闭回绕。 打印的文本使用当前的高亮色彩,但有以下考虑: 1) 正常的背景色总是白色 (白纸的颜色)。 2) 白色文本和缺省前景总是黑色,这样你才能看得出来! 3) 如果 'background' 是 "dark",则颜色会加深,否则在白纸上它们因太亮而无法清晰 辨别。 ============================================================================== 2. 打印选项 *print-options* 这里提供改变打印方式的所有选项的细节。设置选项的一般信息见 |options.txt|*pdev-option* 'printdevice' 'pdev' 字符串 (缺省为空) 全局 |:hardcopy| 命令的感叹号 (!) 版本跳过打印机选择对话框,本选项指定此时所用的打 印机的名字。在 Win32 上,它必须和标准打印对话框里出现的打印机名字完全一致。 如果该选项为空,vim 会为 ":hardcopy!" 使用系统的缺省打印机。 *penc-option* *E620* 'printencoding' 'penc' 字符串 (缺省为空,除了: Windows、OS/2: cp1252, Macintosh: mac-roman, VMS: dec-mcs, HPUX: hp-roman8, EBCDIC: ebcdic-uk) 全局 设置打印时使用的字符编码。本选项告诉 Vim 使用 'runtimepath' 的 "print" 目录里 哪个打印字符编码文件。 本选项接受任何 |encoding-names| 里的值。任何能识别的名字被转换为 Vim 的标准名 字 - 详情见 'encoding'。Vim 不能识别的名字会被转换为小写形式,而且下划线被替换 成 '-' 符号。 如果 'printencoding' 为空或者 Vim 找不到该文件,那么它会用 'encoding' (如果 Vim 编译时加入 |+multi_byte| 而且此选项设为 8 位编码的话) 来找到打印字符编码文 件。如果 Vim 找不到字符编码文件,那么使用的是 "latin1" 打印字符编码文件。 如果 'encoding' 是多字节编码,Vim 会试图把字符转换为打印编码再进行打印 (如果 'printencoding' 为空,那么转换到 latin1)。转换到非 latin1 的打印编码需要 Vim 编译时加入 |+iconv| 特性。如果无法转换,打印会失败。任何不能转换的字符会被倒过 来的问号代替。 提供了四个打印字符编码文件,分别支持缺省的 Mac、VMS、HPUX 和 EBCDIC 字符编码, 而且也是这些平台上缺省使用的。Windows 和 OS/2 平台缺省使用代码页 1252 打印字符 编码。 *pexpr-option* 'printexpr' 'pexpr' 字符串 (缺省: 见下) 全局 {Vi 无此功能} {仅当编译时加入 |+printer||+postscript| 特性 才有效} 用于打印 |:hardcopy| 产生的 PostScript 文件的表达式。 要打印的文件名在 |v:fname_in|。 ":hardcopy" 命令的参数在 |v:cmdarg|。 该表达式必须在打印后负责删除文件。如果有错误,表达式必须返回非零值。如果没有 错,返回零或空字符串。 非 MS-Windows 或 VMS 系统的缺省就是简单地使用 "lpr" 来打印文件: > system('lpr' . (&printdevice == '' ? '' : ' -P' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) + v:shell_error < 在 MS-DOS、MS-Windows 和 OS/2 机器上,缺省是把文件复制到当前指定的 printdevice 上: > system('copy' . ' ' . v:fname_in . (&printdevice == '' ? ' LPT1:' : (' \"' . &printdevice . '\"'))) . delete(v:fname_in) < 在 VMS 机器上,缺省是把文件发送到缺省或者当前指定的 printdevice 上: > system('print' . (&printdevice == '' ? '' : ' /queue=' . &printdevice) . ' ' . v:fname_in) . delete(v:fname_in) < 如果你改变此选项,使用函数是避免转义所有的空格的简便方法。例如: > :set printexpr=PrintFile(v:fname_in) :function PrintFile(fname) : call system("ghostview " . a:fname) : call delete(a:fname) : return v:shell_error :endfunc 要记住有些打印程序在读入文件之前就返回控制权。如果你过早地删除文件,它不会被打 印。这些程序通常提供选项,在打印完成时让它们删除文件。 *E365* 如果表达式计算失败,或者产生非零值,你会得到错误信息。那种情况下,Vim 会删除文 件。非 MS-Windows 的缺省值里使用一个技巧: 加上 "v:shell_error" 会在 system() 调用失败时返回非零值。 为了安全原因,本选项不能在 |modeline||sandbox| 里设置。 *pfn-option* *E613* 'printfont' 'pfn' 字符串 (缺省为 "courier") 全局 |:hardcopy| 命令输出使用的字体名。它和 'guifont' 选项的格式一样,除了只能给出 一个字体的名字,而且不能使用特殊的 "guifont=*" 语法以外。 在 Win32 GUI 版本上,它指定字体名还有附加属性,就如同 'guifont' 选项那样。 其他系统上,只能识别 ":h11",其中 "11" 是字体的点数 (point) 大小。如果忽略,使 用 10 点字。 *pheader-option* 'printheader' 'pheader' 字符串 (缺省为 "%<%f%h%m%=Page %N") 全局 定义 |:hardcopy| 输出的页眉格式。该选项和 'statusline' 选项以同样的方式定义。 如果 Vim 编译时没有加入 |+statusline| 特性,本选项没有效果,而使用简单的缺省页 眉,其中只包含页号。同样的简单页眉也用在此选项为空的时候。 *pmbcs-option* 'printmbcharset' 'pmbcs' 字符串 (缺省为 "") 全局 设置 |:hardcopy| 产生 CJK 输出时使用的 CJK 字符集。目前,Vim 识别以下这些预先 定义的值: 值 描述 ~ 中文 GB_2312-80 (简体) GBT_12345-90 MAC Apple Mac Simplified Chinese GBT-90_MAC GB/T 12345-90 Apple Mac Simplified Chinese GBK GBK (GB 13000.1-93) ISO10646 ISO 10646-1:1993 中文 CNS_1993 CNS 11643-1993, Planes 1 & 2 (繁体) BIG5 ETEN Big5,带 ETen 扩展 ISO10646 ISO 10646-1:1993 日文 JIS_C_1978 JIS_X_1983 JIS_X_1990 MSWINDOWS Win3.1/95J (JIS X 1997 + NEC + IBM 扩展) KANJITALK6 Apple Mac KanjiTalk V6.x KANJITALK7 Apple Mac KanjiTalk V7.x 韩文 KS_X_1992 MAC Apple Macintosh Korean MSWINDOWS KS X 1992,带 MS 扩展 ISO10646 ISO 10646-1:1993 上面的值和 'printencoding' 只有特定的一些组合。下表显示合法的组合可能: euc-cn gbk ucs-2 utf-8 ~ 中文 GB_2312-80 x (简体) GBT_12345-90 x MAC x GBT-90_MAC x GBK x ISO10646 x x euc-tw big5 ucs-2 utf-8 ~ 中文 CNS_1993 x (繁体) BIG5 x ETEN x ISO10646 x x euc-jp sjis ucs-2 utf-8 ~ 日文 JIS_C_1978 x x JIS_X_1983 x x JIS_X_1990 x x x MSWINDOWS x KANJITALK6 x KANJITALK7 x euc-kr cp949 ucs-2 utf-8 ~ 韩文 KS_X_1992 x MAC x MSWINDOWS x ISO10646 x x 要设置打印日文文本所用的合适的编码和字符集,你需要做; > :set printencoding=euc-jp :set printmbcharset=JIS_X_1983 如果 'printmbcharset' 不是以上给出的值,就假定这是个自定义的多字节字符集,因而 没有它是否与 'printencoding' 的值兼容的检查。Vim 会在 'runtimepath' 里的 "print" 目录下寻找定义该字符集的文件。 *pmbfn-option* 'printmbfont' 'pmbfn' 字符串 (缺省为 "") 全局 这是逗号分隔的字段列表,用于 |:hardcopy| 生成的 CJK 输出使用的字体名。每个字体 名必须有一个字符前导,指示要使用的字体的风格,如下: r:{font-name} 用于普通字符的字体 b:{font-name} 用于粗体字符的字体 i:{font-name} 用于斜体字符的字体 o:{font-name} 用于粗体斜体字符的字体 执行 CJK 打印时,带有 r: 前缀的字体是必需的。其它字体名的描述符可选。如果某个 描述符不存在,使用另一个字体,如下: 如果 b: 不存在,使用 r: 如果 i: 不存在,使用 r: 如果 o: 不存在,使用 b: 有些 CJK 字体不包含 ASCII 代码范围内的字符编码。还有,在少量代码点上,有些 CJK ASCII 代码范围里的字符和传统的 ASCII 字符有差异。有两个附加的域可以用来控制 ASCII 代码范围内的字符打印。 c:yes 使用 Courier 字体打印 ASCII 代码范围内的字符。 c:no (缺省) a:yes 在 ASCII 代码范围内的代码使用 ASCII 字符集。 a:no (缺省) 下面的例子指定两个多字节字体,一个用于普通和斜体打印,一个用于粗体和粗体斜体打 印,它使用 Courier 打印 ASCII 代码范围内的代码,但使用国家字符集: > :set printmbfont=r:WadaMin-Regular,b:WadaMin-Bold,c:yes < *popt-option* 'printoptions' 'popt' 字符串 (缺省为 "") 全局 {Vi 无此功能} {仅当编译时加入 |+printer| 特性才有效} 这是逗号分隔的项目列表,控制 |:hardcopy| 的输出格式: left:{spec} 左边界 (缺省: 10pc) right:{spec} 右边界 (缺省: 5pc) top:{spec} 顶部边界 (缺省: 5pc) bottom:{spec} 底部边界 (缺省: 5pc) {spec} 是一个数字,后面跟 "in" 代表英寸,"pt" 代表点数 (1 点等于 1/72 英寸),"mm" 代表毫米,或者 "pc" 代表媒 介大小的百分比。 古怪的例子: left:2in,top:30pt,right:16mm,bottom:3pc 如果单位不能识别,不会出错。只是使用缺省值。 header:{nr} 保留作页眉的行数。 只填入第一行,所以如果 {nr} 为 2,有一个空行。页眉的格 式由 'printheader' 控制。 header:0 不打印页眉。 header:2 (缺省) 页眉使用两行 syntax:n 不使用语法高亮。这样更快,因而打印大文件也更实用。 syntax:y 使用语法高亮。 syntax:a (缺省) 如果打印机可以打印色彩或者灰色,使用语法高亮。 number:y 打印输出里包含行号。 number:n (缺省) 没有行号。 wrap:y (缺省) 回绕长行。 wrap:n 截断长行。 duplex:off 单面打印。 duplex:long (缺省) 双面打印 (如果可以),长边装订。 duplex:short 双面打印 (如果可以),短边装订。 collate:y (缺省) 逐份打印: 1 2 3,1 2 3,1 2 3 collate:n 非逐份打印: 1 1 1,2 2 2,3 3 3 jobsplit:n (缺省) 单个打印任务完成所有份数 jobsplit:y 每份使用不同的打印任务。用于 N-路后期处理。 portrait:y (缺省) 打印方向为竖向。 portrait:n 打印方向为横向。 *a4* *letter* paper:A4 (缺省) 纸张大小: A4 paper:{name} 纸张大小可见下表: {name} 厘米计的尺寸 英寸计的尺寸~ 10x14 25.4 x 35.57 10 x 14 A3 29.7 x 42 11.69 x 16.54 A4 21 x 29.7 8.27 x 11.69 A5 14.8 x 21 5.83 x 8.27 B4 25 x 35.3 10.12 x 14.33 B5 17.6 x 25 7.17 x 10.12 executive 18.42 x 26.67 7.25 x 10.5 folio 21 x 33 8.27 x 13 ledger 43.13 x 27.96 17 x 11 legal 21.59 x 35.57 8.5 x 14 letter 21.59 x 27.96 8.5 x 11 quarto 21.59 x 27.5 8.5 x 10.83 statement 13.97 x 21.59 5.5 x 8.5 tabloid 27.96 x 43.13 11 x 17 formfeed:n (缺省) 把换页字符 (0x0c) 看成普通的打印字符。 formfeed:y 遇到换页字符时,当前行从新页的第一行开始处继续打印。 没有给出某项目时,使用标明为 (缺省) 的项目。不需要总是给出这些值,尤其是可以使 用对话框来选择打印机和选项。 例如: > :set printoptions=paper:letter,duplex:off < ============================================================================== 3 PostScript 打印 *postscript-printing* *E455* *E456* *E457* *E624* 只要你有足够的磁盘空间,产生一个 PostScript 文件当无问题。你需要正确安装运行时 文件 (如果你能找到帮助文件,它们大概都已经安装好了)。 PostScript 打印有若干限制: - 'printfont' - 字体名被忽略 (总是用 Courier 家族字体 - 它应在所有 PostScript 打印机上可用) 但还能指定字体大小。 - 'printoptions' - 产生 PostScript 输出时使用了双面打印设置,但是否如此打印决 定于打印机本身。如果打印机不支持双面打印,则该设置应简单给予忽略。但是有些打 印机彻底不能打印。 - 8 位支持 - 尽管很多 8 位打印字符编码得到支持,还是有可能部分字符无法打印。这 决定于打印机所带的字体是否能识别该字符。丢失的字符会以一个倒转的问号代替,或 者如果该字体不能识别该字符的话,则留一个空格。安装新版的 Courier 字体家族可 能会使某一个编码里的字符完全得到支持。 - 多字节支持 - 目前,Vim 会试图把多字节字符转换为 'printencoding' (如果为空, latin1) 所指定的 8 位编码。不能成功转换的字符会显示为未知字符。如果 Vim 不 能完成该转换,打印将会失败。 ============================================================================== 4. 自定义 8 位打印字符编码 *postscript-print-encoding* *E618* *E619* 打印 8 位字符数据,如果要使用你自己的打印字符编码,你需要定义自己的 PostScript 字体编码。关于如果定义字体编码向量的细节超出了本帮助文件的范围。为此,你可查阅 Addison-Wesley 出版的 PostScript 语言参考手册第三版,或从 http://www.adobe.com 得到 PDF 版本。以下,说明一下如果使 Vim 找到并使用你自己的打印字符编码。 i. 为你的编码向量定义一个唯一的名字,以不与 Vim 使用的已识别的或标准的编码名 字冲突为原则 (这些编码可以参见 |encoding-names|)。最好是一个别人也不太可 能使用的名字。 ii. 把 $VIMRUNTIME/print/latin1.ps 复制到你的 'runtimepath' 里的 print 子目录 并换成你选好的唯一的名字。 iii. 编辑你换名了的 latin1.ps。把所有出现的 latin1 替代成你的编码名 (不要忘了 %%Title: 开头的那行)。同时,把字型名字 (glyph names) 数组改成你新定义的 编码向量。该数组必须恰好有 256 项,不然你无法打印! iv. 在 Vim 里,设置 'printencoding' 为你的唯一的编码名,然后打印你的文件。 Vim 会使用你自定义的打印字符编码。 如果除了 %%Title: 开头一行里的编码名字和 %%Version:: 开头的一行里的版本以外, 你修改了前三行的顺序或者任何别的内容,Vim 会报告此资源文件有错误。 [对通晓 PostScript 者的技术解释 - Vim 打印时,查找并使用和编码同名的文件。该文 件定义一个新的名为 /VIM-name 的 PostScript Encoding 资源,其中 name 即 Vim 会 使用的打印字符编码。] ============================================================================== 5. PostScript CJK 打印 *postscript-cjk-printing* *E673* *E674* *E675* Vim 支持打印中文、日文和韩文文件。要能正确地打印 CJK 文件,Vim 需要设置更多的 选项。 这些国家有许多标准字符集和编码,打印时两者都要指定。另外,CJK 字体通常没有斜体 字形的概念,为了在打印时达到强调的效果,需要使用不同的重量 (weight) 和风格 (stroke style)。因此,要指定打印时使用的字体,需要不同的方法。 'printencoding''printmbcharset' 选项分别指定编码和字符集。如果没有设置 'printencoding',就像一般使用那样,使用 'encoding'。如果设定 'printencoding', 打印时字符会被翻译成此编码。你要确保该编码和文件内容需要的字符集兼容,否则有些 字符可能打印不出来。 'printmbfont' 指定 CJK 打印要用的字体。该选项允许你指定在语法高亮时使用不同字 体风格: 普通、斜体、粗体和粗体斜体的字符使用不同的打印字体, Vim 不提供 CJK 字体。一些免费的中 (繁体) 日韩字体可以在这里得到: http://examples.oreilly.com/cjkvinfo/adobe/samples/ 在 readme 文件里可以找到这些字体的说明,它在 http://examples.oreilly.de/english_examples/cjkvinfo/adobe/00README 请阅读你的打印机文档,以了解如何安装新的字体。 CJK 字体可以很大,因为它们包含了数以千计的字形,即使如此,某个字体只包含了国家 标准的一个子集也是很常见的。如果你发现打印输出没有半宽的罗马字符,你需要在 'printmbfont' 里配置 Vim 使用 Courier 字体来打印半宽 ASCII 字符。如果你的字体 不包括其它字符,也许你需要找一个能够包含所有需要的字形的字体。 另一个 ASCII 字符的问题是若干国家字符集指定一些 ASCII 代码范围的代码使用不同的 字形。如果你用国家字符集打印 ASCII 文本,你可能会看到意想不到的字符。如果你需 要真正的 ASCII 代码打印,你需要用 'printmbfont' 来配置 Vim 使 ASCII 代码范围内 的代码输出 ASCII 字符。 可以定义你自己的多字节字符集,虽然这个过程不应轻易尝试。关于此过程的讨论超出了 这些帮助文件的范围。具体细节可见 http://www.adobe.com 提供的 PDF 文件格式的文 档 'Adobe CMap and CIDFont Files Specification, Version 1.0' 里的 CMap (字符映 射表) 文件。 ============================================================================== 6. PostScript 打印疑难解答 *postscript-print-trouble* *E621* 通常唯一说明打印 PostScript 出现问题的症状是你的打印结果没有出现。如果你运气 好,你也许会得到一页打印说明,告诉你哪个 PostScript 操作符产生了使打印无法继续 下去的错误。 有若干使打印失败的可能的原因: - prolog 资源文件版本错误。prolog 资源文件包含一些 Vim 用来打印的必需的 PostScript。每个 Vim 版本需要它一个不同的版本。确信你安装了正确的运行时的文 件,而且没有在你的 'runtimepath' 里的 print 目录里保留了一个旧版本的 prolog 文件。 - 纸张大小。有些 PostScript 打印机会因为不支持请求的纸张大小而中止打印。缺省, Vim 用 A4 纸。用 'printoptions' 找到和设置你打印机合用的纸张大小。如果你找不 到所用纸张的名字,度量打印纸的尺寸,然后和 'printoptions' 里支持的纸张大小列 表逐一比较,然后用宽_和_高都最接近的纸张。 注意: 实际的纸张尺寸和列出的大小 可能稍有差异。如果没有相近的纸张被列出,那你可以试试以下讨论的 PSUtils 里的 psresize 工具。 - 双面打印 (duplex)。通常,不支持双面打印的 PostScript 打印机只是忽略该请求。 但有的打印机就彻底放弃该打印任务。试试关掉 duplex 再打印。注意: 用 PSUtils 里的工具可以手动设置双面打印 - 见下。 - 逐份打印 (collated)。和双面打印一样,大多数不支持逐份打印的打印机只是忽略该 请求。有的或许不是这样。试试关掉逐份打印的选项。 - 语法高亮。有些打印管理代码不让含有语法高亮的 PostScript 文件在黑白打印机上打 印,即使唯一用到的颜色是黑色。试试关掉语法高亮。 一个安全的 printoptions 设置是: > :set printoptions=paper:A4,duplex:off,collate:n,syntax:n 把 "A4" 换成你的打印机纸最适合的纸张大小。 ============================================================================== 7. PostScript 工具 *postscript-print-util* 7.1 Ghostscript Ghostscript 是一个 PostScript 和 PDF 的解释器,从而可以显示和在非 PostScript 的打印机上打印 PostScript 和 PDF 文件。它还可以把 PostScript 文件转换成 PDF 文 件。 Ghostscript 可在多种平台上运行。 有三个可用的版本: - AFPL Ghostscript (以前的 Aladdin Ghostscript) 是对非商业用途免费的。它可如下 得到: http://www.cs.wisc.edu/~ghost/ - GNU Ghostscript 可在 GNU General Public License 下,从以下地址得到: ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu/ - 用于商业产品的一个商业版本。 更多关于 Ghostscript 的信息可以在这里找到: http://www.ghostscript.com/ 该发布包含对许多非 PostScript 打印机的标准支持。如果你没找到对你的打印机的支 持,查一下 Ghostscript 网站了解如何支持其他缺省没有支持的打印机。 7.2 Ghostscript 预览器 Ghostscript 界面十分原始,所以有不少图形化的前端程序。它们提供了方便的 PostScript 文件选择,不同放大倍数的预览,还有打印。具体细节可查看它们提供的文 档。 X11 - Ghostview。可如下取得: http://www.cs.wisc.edu/~ghost/gv/ - gv。基于 Ghostview。可如下取得: http://wwwthep.physik.uni-mainz.de/~plass/gv/ 这里也能找到 (也许不是最新的): http://www.cs.wisc.edu/~ghost/gv/ OpenVMS - 看起来,在主代码已经支持 (未经测试)。见: http://wwwthep.physik.uni-mainz.de/~plass/gv/ Windows 和 OS/2 - GSview。可如下取得: http://www.cs.wisc.edu/~ghost/gsview/ DOS - ps_view。可如下取得: ftp://ftp.pg.gda.pl/pub/TeX/support/ps_view/ ftp://ftp.dante.de/tex-archive/support/ps_view/ Linux - GSview。流行的 Windows 和 OS/2 预览器的 Linux 版本。可如下取得: http://www.cs.wisc.edu/~ghost/gsview/ - BMV。和 Ghostview 与 gv 不同,它不使用 X 而使用 svgalib。可如下取得: ftp://sunsite.unc.edu/pub/Linux/apps/graphics/viewers/svga/bmv-1.2.tgz 7.3 PSUtils PSUtils 是一组操作 Postscript 文档的工具程序。可以得到许多平台上的二进制发布和 完全的源代码。PSUtils 可如下得到: http://knackered.org/angus/psutils 我们感兴趣的工具包括: - psnup. 把 PS 文件转化为 N-路打印版本。 - psselect. 选择页范围和打印顺序。 - psresize. 改变页面大小。 - psbook. 重新排列顺序和页面排版,从而打印成册。 一个程序的输出可以作为另一个的输入,从而可以创建复杂的打印文档。 N-路 打 印 psnup 工具把一个 Vim 生成的 PostScript 文件转化为一个 n-路版本 (即在一物理页上 打印 n 个逻辑页)。最简单的生成 2-路输出的方法是先如下一个创建 PostScript 文 件: > :hardcopy > test.ps 然后在你的命令行上执行: > psnup -n 2 test.ps final.ps < 注意: 有些 Ghostscript 预览器可能会对 psnup 产生的文件给出警告 - 可以安全地忽 略。 最后,用你平台上的打印命令把 final.ps 输出到 PostScript 打印机上。(这以后,你 需要自己删除中间文件: 两个 PostScript 文件)。可以修改 'printexpr' 来执行这项打 印前的额外转换。 双 面 打 印 的 替 代 方 法 用 PS 工具 psselect 可以完成一个原始的双面打印任务。该工具有 -e 和 -o 选项, 可以分别打印一个 PS 文件的偶数页和奇数页。 先用 'hardcopy' 命令生成 PS 文件,然后如下生成只包含奇数和偶数页的新文件: > psselect -o test.ps odd.ps psselect -e test.ps even.ps 然后用你平台上普通的打印命令打印 odd.ps。然后取出打印输出,翻过来,重新放到取 纸器里。然后用你平台上的打印命令打印 even.ps。现在,所有的偶数页面应该出现在奇 数页的反面。 要记住以下几点: 1. 第一页的位置。如果打印奇数页时第一页出现在最上方,那你需要倒转奇数页打印的 顺序。这可以通过 psselect 的 -r 选项完成。这样可以保证第 2 页打印在第 1 页 的反面。 注意: 倒转奇数页的打印顺序比倒转偶数页更合适。因为原始的 PS 文件里可能有奇 数页。 2. 纸张方位。取出奇数页的打印输出时,你或者需要横向翻转 (沿着长边),或者需要纵 向翻转 (沿着短边),甚至有可能要旋转 180 度。这决定于打印机 - 桌上型的喷墨打 印机可能比看不见纸张打印的路径的办公室激光打印机更明显一点。 ============================================================================== 8. 换页字符 *printing-formfeed* 缺省,Vim 不对换页 |formfeed| 控制字符作任何特殊处理。设置 'printoptions' 的 formfeed 项,使得 Vim 可以识别换页字符,从而在新的一页里打出当前行。换页字符 提供了较为原始的打印控制。不过,还是有若干事情需要注意。 Vim 总是从包含换页字符的那行开始打印 (如果有相应设置,还包括行号),即使它是这 一行的第一个字符。这意味着,如果以换页字符开头的一行刚好在一页的第一行,Vim 就 会打印完全空白的一页。 因为行号在包含换页字符的一行的开始打印,在新页打印的该行的其余部分就不会有行号 (和 'printoptions' 里置位了 wrap 项时长行的回绕行的打印结果相同)。 如果换页字符是一行的最后一个字符,那么打印会从新页的第二行而不是第一行开始。这 是因为 Vim 在换页字符后处理行尾,从而在继续打印之前先往下移动了一行。 根据以上几点,我们推荐如果使用换页字符处理,关闭行号的打印,而且不要在行尾用换 页字符。即使如此,你还是需要调整换页符之前的行的数目,以防止偶尔出现的空白页。 ==============================================================================