✍️ 陈箫翰 , 田冬冬 • 📅 2025-12-11

# Linux/macOS 下的 GMT 中文支持

本文介绍如何让 GMT 在 Linux/macOS 下支持中文。

## ghostscript的中文支持

Linux 的中文字体较少，这里使用 Windows 下提供的四个基本字体：宋体、仿宋、黑体和楷体。 对于 Windows 和 Linux/macOS 的其他中文字体甚至日韩字体来说，方法类似。

首先新建目录，用于存放字体文件和配置文件:

    $ mkdir -p ~/.gmt/winfonts
    # -p 选项会自动创建 ~/.gmt 和 ~/.gmt/winfonts 两级目录

点击下载以下四种基本字体的字体文件：

- 宋体 `simsun.ttc`

- 仿宋 `simfang.ttf`

- 黑体 `simhei.ttf`

- 楷体 `simkai.ttf`

并复制到刚才新建的 `~/.gmt/winfonts/` 目录下。

用户也可以从 Windows 的系统字体目录（通常是 `C:\Windows\Fonts` ）中，找到这四种基本字体的字体文件。

在 `~/.gmt` 目录下创建字体配置文件 `cidfmap` （ghostscript无法直接识别 `${HOME}` 变量，所以请将下列语句复制粘贴到终端中执行）:

    cat > ~/.gmt/cidfmap << EOF
    /STSong-Light <</FileType /TrueType /Path (${HOME}/.gmt/winfonts/simsun.ttc) /SubfontId 0 /CSI [(GB1) 4] >> ;
    /STFangsong-Light <</FileType /TrueType /Path (${HOME}/.gmt/winfonts/simfang.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;
    /STHeiti-Regular <</FileType /TrueType /Path (${HOME}/.gmt/winfonts/simhei.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;
    /STKaiti-Regular <</FileType /TrueType /Path (${HOME}/.gmt/winfonts/simkai.ttf) /SubfontId 0 /CSI [(GB1) 4] >> ;
    EOF

## GMT的中文支持

ghostscript 查找文件时， 会搜寻 `gs -I` 选项中指定的目录。既可以在经典模式中使用 psconvert 的 -C 选项将 `cidfmap` 所在的目录传递给 `gs -I`。 也可以在现代模式中配置 begin 的选项，将参数先传递给 psconvert 的 -C 选项， 执行 end 时会调用 psconvert，再将参数传递给 `gs -I`：

    gmt begin 图片文件名 图片格式 C-I${HOME}/.gmt/

如果在中文绘图脚本中，有其他需要传递给 psconvert 命令的选项，例如 `-I+m0.5c -E720` 。可以去掉横杠后以逗号分隔，添加在后面：

    gmt begin 图片文件名 图片格式 C-I${HOME}/.gmt/,I+m0.5c,E720

接下来，还需要在 `~/.gmt`下创建字体配置文件 `PSL_custom_fonts.txt`:

    $ touch ~/.gmt/PSL_custom_fonts.txt
    # Linux系统
    $ gedit ~/.gmt/PSL_custom_fonts.txt
    # macOS系统
    $ open ~/.gmt/PSL_custom_fonts.txt

打开 GMT 字体配置文件，在文件中加入如下语句:

    STSong-Light--UniGB-UTF8-H  0.700    1
    STFangsong-Light--UniGB-UTF8-H  0.700    1
    STHeiti-Regular--UniGB-UTF8-H   0.700   1
    STKaiti-Regular--UniGB-UTF8-H   0.700   1
    STSong-Light--UniGB-UTF8-V  0.700    1
    STFangsong-Light--UniGB-UTF8-V  0.700    1
    STHeiti-Regular--UniGB-UTF8-V   0.700   1
    STKaiti-Regular--UniGB-UTF8-V   0.700   1

这几句话分别添加了宋体、仿宋、黑体和楷体四种字体的横排（H）和竖排（V）两种方式。

用 `gmt text -L` 命令查看 GMT 当前的字体配置:

    $ gmt text -L
    Font #  Font Name
    ------------------------------------
    0   Helvetica
    1   Helvetica-Bold
    ...    ......
    39 STSong-Light--UniGB-UTF8-H
    40 STFangsong-Light--UniGB-UTF8-H
    41 STHeiti-Regular--UniGB-UTF8-H
    42 STKaiti-Regular--UniGB-UTF8-H
    43 STSong-Light--UniGB-UTF8-V
    44 STFangsong-Light--UniGB-UTF8-V
    45 STHeiti-Regular--UniGB-UTF8-V
    46 STKaiti-Regular--UniGB-UTF8-V

其中 39-46 号字体为新添加的中文字体。 以后要用中文字体时，强烈建议直接指定字体的名字（如 `STSong-Light--UniGB-UTF8-H`）而不是字体的编号（如 `39`）。 因为编号取决于 `PSL_custom_fonts.txt` 中字体的添加顺序，不同机器上对应的编号可能不同， 而字体名字则具有很好的移植性。

## GMT 中文测试

备注

GMT 6.x 目前在处理中文时存在 BUG，可能会出现某些中文正常显示，某些 不正常显示的情况。需要使用如下命令来避免这一 BUG:

    gmt set PS_CHAR_ENCODING Standard+

测试脚本和成图效果如下：

    #!/usr/bin/env bash
    gmt begin GMT_Chinese png,pdf C-I${HOME}/.gmt/
    # GMT 处理中文存在一些已知BUG
    # 需要设置 PS_CHAR_ENCODING 为 Standard+ 以绕过这一BUG
    gmt set PS_CHAR_ENCODING Standard+
    gmt set FONT_TITLE 25p,STHeiti-Regular--UniGB-UTF8-H,black
    gmt set FONT_LABEL 15p,STSong-Light--UniGB-UTF8-H,black

    gmt text -R0/8/0/4 -JX12c/4c -Bxaf+l"X轴" -Byaf+l"Y轴" -BWSen+t"中文标题" -F+f << EOF
    2 3.5 25p,STSong-Light--UniGB-UTF8-H,black 中文宋体
    2 2.5 25p,STFangsong-Light--UniGB-UTF8-H,blue  中文仿宋
    2 1.5 25p,STHeiti-Regular--UniGB-UTF8-H,red   中文黑体
    2 0.5 25p,STKaiti-Regular--UniGB-UTF8-H,green 中文楷体
    4 3.5 25p,STSong-Light--UniGB-UTF8-V,black 中文宋体
    5 3.5 25p,STFangsong-Light--UniGB-UTF8-V,blue  中文仿宋
    6 3.5 25p,STHeiti-Regular--UniGB-UTF8-V,red   中文黑体
    7 3.5 25p,STKaiti-Regular--UniGB-UTF8-V,green 中文楷体
    EOF
    gmt end show

备注

生成的 PNG、JPG 格式的图片中可正常显示中文。 对于 PDF 格式，macOS 自带的预览工具无法正常显示中文， Adobe PDF Reader 可以正常显示中文，但竖排字体可能出现错位。