✍️ 周茂

# LaTeX 表达式

绘图过程中，用户可能会需要特殊字符标注或者显示公式。 GMT 已经可以实现打印简单的特殊字符和转义序列， 但如果想实现更加复杂的特殊字符和公式，则需要借助功能强大的 LaTeX。

## 语法

GMT 自 6.2 开始支持在文本字符串中嵌入 LaTeX 表达式， 这些文本字符串包括使用 -B 选项 在标题、子标题或标签中指定的字符串， 也包括通过 text 模块添加的单行文本。 GMT 中 LaTeX 表达式可以用两种不同的写法表示:

1. 使用 `@[ ... @[`，如 `Plotting @[\Delta \sigma_{xx}^2@[`

2. 使用 `<math> ... </math>`，如 `Plotting <math>\Delta \sigma_{xx}^2</math>`

备注

1. 若要在 GMT 6.2 以前的版本使用 LaTeX，请参考 https://blog.seisman.info/gmt-latex/

2. LaTeX 数学符号可参考：《一份（不太）简短的 LaTeX2ε 介绍》 中的符号表章节

下面展示了一个在 GMT 中使用 LaTeX 表达式的例子。在轴标签、标题以及 text 模块中使用 LaTeX 表达式：

    #!/usr/bin/env bash
    gmt begin GMT_latex
        gmt basemap -R-200/200/0/50 -JX15c/4c \
            -BSwen+t"Use <math>\Delta g = 2\pi\rho Gh</math>" \
            -Bxaf+l"@[\nabla^4 \psi - \Delta \sigma_{xx}^2@[ (MPa)"
        gmt text -F+f15p << EOF
    0 15 Newton's integral: <math>V = \int_{v} \frac{\mathrm{d}m}{l}</math>
    0 30 Euler's formula: @[e^{ix} = \cos x + i \sin x@[
    EOF
    gmt end show

## GMT 字体和 LaTeX

LaTeX 是一个庞大且复杂的排版系统，有许多可选包，用户安装的 LaTeX 需包括所有 GMT 必须的包。 通过包管理器安装 LaTeX 的方法请见 GMT Wiki。 其中，GMT 必须的包和字体包括：

- 必需包：fontenc 和 inputenc

- 必需字体：helvet、mathptmx、courier、symbol、avantgar、bookman、newcent、mathpazo、zapfchan 和 zapfding

上述必需包已经默认包含在所有的 LaTeX 发行版中，必需字体则可以在终端中执行如下命令安装:

    tlmgr install collection-fontsrecommended

上述字体列表中的字体均可以匹配 GMT 中的字体。 因此，如果用户通过 FONT_TITLE 修改了标题默认的字体， GMT 将在后台生成的 LaTeX 脚本中把该字体设置为默认字体。 这种设置可以确保标题最终渲染的字体和用户设置的字体一致。

## 技术细节

GMT 中显示 LaTeX 表达式的原理： 如果在文本字符串中发现特殊标识（即 `@[` 对或 `<math> </math>` 对）， GMT 将使用 `latex` 和 `dvips` 命令（需提前安装 LaTeX 环境）把整行转换为 EPS 文件。 然后，将该 EPS 文件放置在对应的位置。

这里通过一个实例来帮助用户排查 LaTeX 安装中可能存在的问题。 假设用户使用 basemap 制作的图的标题为 `-B+t"Use @[\Delta g = 2\pi\rho Gh@["`。 GMT 会为该 LaTeX 表达式创建一个临时目录，其中包含一个名为 `gmt_eq.tex` 的文件：

    \documentclass{article}
    \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc}
    \usepackage{helvet}
    \begin{document}
    \thispagestyle{empty}
    \fontfamily{phv}\selectfont
    Use $\Delta g = 2\pi\rho Gh$
    \end{document}

由于 FONT_TITLE 设置为 Helvetica，LaTeX 文件将默认字体修改为 Helvetica（ helvet 包, 代码为 phv ），该 tex 文件会被转换为 DVI 文件:

    latex -interaction=nonstopmode gmt_eq.tex > /dev/null

接着，进一步将结果转换为 EPS 文件:

    dvips -q -E gmt_eq.dvi -o equation.eps

这两个命令通过 `gmt_eq.sh` 脚本（在 windows 下为 `gmt_eq.bat`）执行。 如果命令成功执行，GMT 将读取 EPS 文件 `equation.eps` 并放置在标题的位置。 如果脚本由于某些原因执行失败，GMT 将报错并指导用户在临时目录中进行进一步排查。 此时，用户可以运行 `latex` 命令来查看报错信息（但要去除重定向 `> /dev/null`）。 通常情况下，报错信息会显示问题出现的原因，即缺少某种字体或其他信息。 如果用户不能独立解决报错，请在 GMT 官方 GitHub 上提 issue 并提供 LaTeX 脚本和报错信息。