GNU Ghostscript

作者:Robert A. Kiesling

在 TeX 文档中查看封装的 PostScript 回收标志本应很简单。然而,显示器上却出现了一个空白区域,标志本应出现在那里。快速浏览了我所有的 LaTeX 文档,包括 xdvi 的手册页,都没有找到答案。似乎 xdvi 无法显示 dvi 输出中的 TeX \special 命令;在这种情况下,是嵌入的 PostScript 图像。我认为这是 xdvi 以及 TeX 的一个主要缺点。毕竟,在页面上结合文本和图形不是计算机出版的全部内容吗?为什么 TeX,世界上最复杂的排版系统之一,会受到缺少 PostScript 预览器的限制?或者说,需要 PostScript 打印机的限制?俗话说,千里之行,始于足下。我即将描述的这段旅程,通过一个一直安静地位于我的 /usr 分区子目录中的实用程序,使我在专业品质出版方面取得了相当大的进步。

这个实用程序就是 Ghostscript。GNU Ghostscript 3.33 版本是图形程序中的瑞士军刀。本质上,它是一个 PostScript 语言解释器。更具体地说,Ghostscript 将 PostScript 代码渲染到您系统上的任何位图设备,无论是屏幕、打印机还是 G3 传真文件。手册页上说,“Ghostscript 是一种类似于 Adobe Systems 的 PostScript 语言的编程语言,而 PostScript 语言又类似于 Forth。”(这句话几乎逐字摘自以下书籍:Adobe Systems, Incorporated: PostScript: 语言教程和食谱, Addison-Wesley, 1986。)如果字体不可用,Ghostscript 也会从自己的库中替换字体来渲染文档,缩放和旋转文本,并执行 PostScript 闻名的任何其他排版技巧。尽管任务看起来很复杂,但不需要 PostScript 语言的知识。在大多数情况下,只需稍微尝试一下命令行选项即可。然而,Ghostscript 的 PostScript 解释器是完全可访问的。

如果我想在 DVI 输出页面的底部打印 EPS 回收标志,我会在我的 LaTeX 输入文件中插入以下命令

\usepackage{graphics} ... \vfil \includegraphics{recycle.eps}

然后,只需使用命令行运行 teTeX 的输入文件

pslatex letter.tex
然后使用 dvips 将 teTeX 的 dvi 输出转换为 PostScript
dvips -f <letter.dvi >letter.ps
-f 命令行选项告诉 dvips 充当过滤器,从标准输入读取并写入标准输出。现在,我们有了一个可以打印的 PostScript 文件。Ghostscript 以您系统上的任何位图设备(无论是 VGA 显示器还是激光打印机)都能理解的格式对此文件进行成像。

Ghostscript 的命令行选项非常多。请查看 ghostscript 的 USE.DOC 文件以获得完整描述。您可以使用以下命令查看简要摘要

gs -help | less

例如,如果我想在惠普 DeskJet 打印机上打印文件 letter.ps,我将使用命令行

gs -q -dNOPAUSE -sDEVICE=deskjet
/-sOutputFile=-\
         letter.ps quit.ps >gs.out
第一个选项 -q 抑制向控制台发送消息。但是,要在批处理模式下运行 Ghostscript,仅靠 -q 选项是不够的。这是因为 Ghostscript 在运行时使用自己的 PostScript 代码来输出图像。

从命令行,我们定义了几个变量,第一个是 NOPAUSE,它告诉 Ghostscript 的 showpage() 例程在每次页面输出后不要暂停。当在屏幕上查看输出时,最好不要设置 NOPAUSE,让 Ghostscript 提示您依次查看每个页面。

接下来,我们设置 DEVICE 变量。在上面的示例中,输出设备是 HP Deskjet。Ghostscript 的字典中定义了其命令行帮助中记录的所有设备的输出参数。

下一个需要定义的变量是 OutputFile。在这里,我们将其设置为 - 或标准输出。这是 Ghostscript 将其图像写入的文件。然而,在大多数情况下,Ghostscript 没有提供显示该图像的方法。我们稍后会讲到这一点。然后在命令行上将 letter.ps 指定为我们的目标输入文件。

当我们使用 pslatex 命令写入文件时,LaTeX 使用它可用的字体度量;也就是说,它使用 Computer Modern Roman 作为其默认字体。但是,pslatex 命令已在 teTeX 中实现,以便 dvips(执行 DVI 到 PostScript 的转换)将请求 PostScript 字体。这些字体可以通过打印机或软件提供。在后一种情况下,Ghostscript 使用其自身库中的 Type 1 字体生成输出图像。

最后,我们输入文件 quit.ps。此文件是 Ghostscript 标准库的一部分,只是命令 quit 后跟换行符。它像任何其他输入一样被读入 Ghostscript 解释器。

查看图像

在屏幕上查看图像仅稍有困难。Linux 版 Ghostscript 附带 X11 和 SVGALib 支持。这两个版本的可执行文件都应位于 /usr/bin 目录中:gs-with-X11 和 gs-without-X11。您可以使用其实际文件名运行任一版本,但更常见的实现是使用从实际可执行文件到 gs 命令的软链接。在任何一种情况下,可执行文件的权限都应设置为 setuid root,以便它可以访问显示器。我们将描述如何将 Ghostscript 用作 PostScript 预览器,同时使用 X Window 系统和 SVGALib。

使用 X11 的 Ghostscript

X Window 系统提供了 Ghostscript 否则需要提供的大量显示支持。因此,它无疑是将 Ghostscript 用作预览器的最佳方式。与上面的示例一样,我们希望将 letter.tex 通过 LaTeX 传递,然后使用命令行将输出转换为 PostScript

pslatex letter.tex; \
        dvips -f <letter.dvi >letter.ps

同样,我们需要为 gs 指定 DEVICE 字符串,对于 X 显示器,它只是 X11。Ghostscript 将 X11 显示帧视为标准输出,X 显示服务提供几何形状以显示整个页面。像 FVWM 这样的虚拟窗口管理器已经提供了在整个页面上滚动视图的功能。然后,ghostscript 命令很简单

gs -r72 -sDEVICE=X11 letter.ps
这将为我们在屏幕上提供实际大小的页面,因为我们使用 -r 开关覆盖了默认分辨率。

VGA 显示器提供大约 72 点/英寸的分辨率,因此清晰的实际大小的美国信纸页面将无法完全显示在屏幕上。这就是为什么我们依赖 FVWM 或其他虚拟窗口管理器来在整个页面上滚动视图。Ghostscript 在您的 X 显示器上绘制一个页面高度的窗口。一次大约可以看到页面的一半。当然,您可以通过将输出分辨率指定为 36dpi 来以实际尺寸的两倍查看整个页面。

执行 Ghostscript 命令最简单的方法是在 xterm 窗口中。页面显示在显示 Ghostscript 命令的子进程的窗口中。Ghostscript 将其消息写入标准错误,此处为 xterm。在 xterm 窗口中按 enter 键告诉 showpage 显示 Ghostscript 输出的每个后续页面。您可以通过在您的 ~/.Xdefaults 文件中添加以下行来设置默认分辨率

Ghostscript*xResolution: 72 Ghostscript*yResolution: 72

然后将默认值与其他 X 服务器默认值合并

xrdb -merge ~/.Xdefaults
如果未指定分辨率,则页面将以 300dpi 显示在屏幕上,约为其实际尺寸的四分之一,这在 640x480 视图中无需滚动即可看到。
使用 SVGALib 的 Ghostscript

当在没有 X11 支持的情况下使用 VGA 显示器时,事情会变得稍微困难一些。标准的 Linux tty 设备没有为在完整的美国信纸大小的图像上分页提供现成的规定。此外,Ghostscript 的 SVGALib 例程必须提供几何形状和分辨率信息才能预览图像。以下信息特定于我的 Compaq 笔记本电脑 Chanel3,它具有 16 色 640x480 标准 VGA 显示器、GNU Ghostscript 3.33 版本和 SVGALib 版本 libvga.so.1.2.10。您需要调整参数以适应您的硬件,但基本过程应该类似。

Ghostscript 识别的各种硬件配置的设置列在 use.doc 文件和 gs 手册页中。对于 Linux 虚拟控制台,DEVICE 字符串为“linux”;即

/dev/tty1 - /dev/tty9

此字符串对应于虚拟控制台的 /etc/termcap 条目。-r 分辨率参数是 SVGALib 识别的几十种 VGA 模式之一。Ghostscript 定义了与标准宽度 x 高度表示法对应的个位数模式编号。Ghostscript 手册页中有一个完整列表。在本例中,模式 4 是 16 色 640x480 VGA。以下大部分信息取决于 SVGALib 是否为您的特定显示器提供有关显示几何形状的信息。Ghostscript 需要此信息才能显示任何内容。首先,必须向其提供显示器的纵横比(显示器的宽度与其高度之比),以便正确缩放字体。

几何形状参数 (-g) 告诉 Ghostscript 显示尺寸。Ghostscript 将输出页面缩放到我们指定的几何形状。我们稍后会解决这个问题。设置这些参数后,我们的 Ghostscript 命令是

gs -sDEVICE=linux -r4 -g640x480 letter.ps

请记住,gs 实际上是指向可执行文件 /usr/bin/gs-without-X11 的链接。在这里,我们通过指定比实际屏幕尺寸大两倍的显示几何形状来告诉 Ghostscript 显示完整页面。这为我们提供了一个比视频显示器略大两倍的页面。要使虚拟显示器(PostScript 术语中的“设备空间”)的大小加倍,我们使用命令行

gs -sDEVICE=linux -r4 -g640x960 letter.ps
这使我们可以实际大小查看打印页面的上半部分。要查看页面的下半部分,我们可以将图像的 Y 原点偏移量指定为美国信纸大小页面的一半
gs -sDEVICE=linux -r4 -g640x960 -dYO=5.5
letter.ps
默认单位是英寸。图像的 X 原点也可以类似地移动。
Ghostscript 作为文档后处理器和预览器

将 Ghostscript 集成到您的系统中并不困难。例如,如果您经常在 Emacs 的 LaTeX 模式下编写文档,则以下 bash 脚本会获取 Emacs 的 tex-buffer 命令的 DVI 输出,将其转换为 PostScript,然后通过 Ghostscript 后处理输出。最后,它将输出发送到打印假脱机程序。此脚本 gsprint(参见 清单 1)可以直接由 Emacs 的 tex-print 命令调用。请注意,调用 Ghostscript 然后将输出假脱机到 lpr 守护程序的命令都应在一行中键入。

此脚本的更短版本 gspreview(参见 清单 2)预览文档,并且可以在 X11 下由 Emacs 的 tex-view 命令调用。Emacs 将 TeX DVI 文件的名称作为其 tex-print 和 tex-view 命令的参数提供。您需要做的就是指定外部命令的名称。首先,确保脚本位于搜索路径中的目录中(我将 /usr/local/bin 用于我的 shell 脚本)。使用以下命令授予它们执行权限

chmod a+x gsprint gspreview

然后将 清单 3 中显示的 elisp 代码添加到您的 .emacs 文件中。每当您在 TeX 模式或 LaTeX 模式下使用 tex-print 或 tex-view 命令(ctrl-c ctrl-pctrl-c ctrl-v,分别)时,这些 shell 脚本都会被调用,并且它们的命令会使用最近的 TeX 命令的 DVI 输出执行。

下一个 bash 脚本,我将其命名为 pvga(参见 清单 4),使用 Ghostscript 在非 X VGA 显示器上预览输出。它以 TeX DVI 输出文件的名称和两个可选参数作为参数:要输出的页面列表和每个页面的 Y 原点偏移量。此脚本可以从命令行运行,也可以用作更复杂的 VGA 预览器的核心例程。您要查看的页面列表(根据 dvips 文档格式化)必须在 Y 偏移量之前指定。

盒子中的 PostScript(虚拟的)

您可以轻松地将 TeX 的 Computer Modern 字体替换为 Ghostscript 的可缩放字体。默认情况下,dvips 调用 MakeTeXPK 程序,该程序又调用 MetaFont,以生成硬盘上不存在的物理 Computer Modern 字体。

使用位图字体而不是可缩放字体打印速度更快,但使用 Adobe 标准编码的可缩放字体提供完整的 Adobe 字符集,包括 Computer Modern 字体不提供的字距调整和连字对。使用速度合理的硬件,您可以关闭 dvips 的字体生成功能,几乎不会注意到速度差异。Dvips 为此目的提供了 -V 命令行开关。bash 脚本 vgspreview(参见 清单 5)是上面 gspreview 的修改版。请记住在 -V 开关后指定 zero,这会关闭字体生成工具。

结论

Ghostscript 可以轻松执行许多其他任务

  1. 创建传真。

  2. 创建可由 Adobe 的 Acrobat Reader 读取的 PDF 文件。

  3. 生成多种不同的图形格式。

  4. 与其他公司的 GUI 显示器一起工作,特别是 Windows 和 Macintosh。

由于 Ghostscript 解释 PostScript 语言,因此您可以直接使用 PostScript 进行编程,可以通过 Ghostscript 的命令解释器或使用嵌入在 TeX 和 LaTeX 文件中的 \special 命令。本文仅触及了这个免费程序的功能以及 Ghostscript 可以在您的桌面上执行行业标准成像的众多方式的皮毛。

词汇表

GNU Ghostscript
当 Robert Kiesling 不参与 PostScript 和 TeX 的复杂性时,他正在从事他的“真正”写作。这包括几部小说,以及出现在全国文学杂志和报纸上的小说、诗歌和非小说作品。当他不忙于上述任何一项时,他正忙于维护 Linux FAQ,为小型出版社提供编辑支持,并在 rkies@cpan.org 回复电子邮件。
加载 Disqus 评论