---
author: 田冬冬, 陈箫翰
date: 2025-10-10
---

# 命令初探

上一节我们使用 GMT 绘制了第一张图，但是没有对其中的细节做任何介绍。
这一节我们将简单介绍一下 GMT 的命令。

## GMT 绘图脚本模板

GMT 在绘图时，总是以 {doc}`/module/begin` 开始，并以 {doc}`/module/end` 结束。
所有的**绘图命令**都放在 **begin** 与 **end** 之间，而非绘图命令可以放在
任何地方。

:::{note}
GMT 老用户可能会对此比较陌生。

GMT 自 6.0.0 版本开始，引入了一种全新的绘图命令执行模式，称之为现代模式。
GMT5 及之前的命令风格称之为经典模式。GMT6 既支持经典模式也支持现代模式。
现代模式与经典模式可以完成相同的绘图功能，但现代模式大大简化了绘图代码，
并极大避免了用户最容易出错的地方，因而推荐用户使用现代模式而非经典模式。

本手册将只使用现代模式，而不介绍经典模式。
GMT 新用户只需要按照本手册直接学习现代模式即可；
对于 GMT 老用户，建议阅读 {doc}`/migrating/classic2modern`
或者观看视频教程 [GMT6 新特性](https://www.bilibili.com/video/av73835957)，
并开始使用现代模式进行绘图。
:::

在前一节中我们使用 `gmt --new-script` 命令生成一个绘图模板。
忽略掉绘图模板中的注释语句，一个最最基本的 GMT 绘图脚本的模板是:

```
gmt begin
#
# 其它命令，包括 GMT 绘图命令、数据处理命令以及其它 UNIX 命令
#
gmt end show
```

你可以直接执行这个脚本，但是因为这里什么命令也没用，所以这个脚本不会生成任何图片。

绘图时我们通常需要指定图片文件名和图片格式，因而更实用的绘图脚本模板为:

```
gmt begin FigureName pdf
#
# 其它命令，包括 GMT 绘图命令、数据处理命令以及其它 UNIX 命令
#
gmt end show
```

- *FigureName* 指定了要生成的图片文件名，你可以指定任意文件名，
  但最好避免在文件名中使用特殊符号和空格。若不给定文件名，
  则默认文件名为 `gmtsession`
- 紧跟在图片文件名后的 **pdf** 指定了要生成的图片格式（若不指定格式，则默认图片格式为 PDF）。
  GMT 支持多种图片格式，pdf、ps、eps、jpg、png、bmp 等等。若想要一次性生成多种格式的图片，
  则可以使用逗号将多种格式连接起来，如 **pdf,png** 会同时生成 PDF 和 PNG 格式的图片
- **gmt end** 后面加上 **show**，则 GMT 会在绘图完成后，使用系统自带的阅读器
  软件自动打开生成的图片文件，供用户预览绘图效果

## 绘制第一张图

在 GMT 绘图脚本模板的基础上，向 **begin** 和 **end** 语句中间加入正确的 GMT 绘图命令，
即可实现用 GMT 绘图。

下面的脚本使用 {doc}`/module/coast` 绘制了一张全球地图。
执行该脚本，会生成文件名为 {file}`GlobalMap`、格式为 PDF 的图片文件，
并且 GMT 会在绘图结束后自动打开生成的图片文件。

```{eval-rst}
.. gmtplot:: first-plot.sh
    :width: 80%
    :caption: 使用 GMT 绘制的第一张图
```

:::{tip}
不理解 **gmt coast** 这一行命令的含义？没关系，稍后会详细介绍。
:::

:::{tip}
想了解 **gmt coast** 的具体用法？打开终端，敲入 `gmt docs coast`，
GMT 会自动帮你打开 **coast** 模块的说明文档。
:::

## GMT 命令格式

一个 GMT 命令通常由 **gmt** + **模块名** + **选项** + **参数** 构成。比如
上面的例子中:

```
gmt coast -Rg -JH15c -Gpurple -Baf -B+t"My First Plot"
```

- 所有的 GMT 命令都需要以 **gmt** 开头
- **coast** 是模块名，这个模块可以用于绘制海岸线
- **-R**、**-J**、**-G**、**-B**等以 **-** 开头的是模块的选项
- **-Baf** 中 **af** 是 **-B** 选项的参数
- **-B+t**"My First Plot" 中 **+t** 为 **-B** 的
  子选项，"My First Plot" 则是子选项 **+t** 的参数

关于 GMT 命令的几点说明：

- 若模块名以 **gmt** 开头，则模块名中的 **gmt** 可省略。
  比如 **gmt gmtset xxx xxx** 可简写为 **gmt set xxx xxx**
- 模块名、选项等均区分大小写
- 选项以 **-** 开头，后接**单个字符**表示某个选项，字符后接选项的参数以及子选项
- 子选项以 **+** 开头，后接**单个字符**以及子选项的参数
- 不以 **-** 开头的参数，通常都会被当做文件，GMT 会尝试去读取
- 各选项间以空格分隔，选项内部不能有空格。选项内部的字符串中若存在空格，
  在 Bash 下可以使用单引号或双引号括起来，而在 Windows 的 Batch 下则只能使用双引号。
