用 Sublime Text 和 Pandoc 编译 Markdown

因为手头有一个小文档要交,没有过于繁琐的排版要求,所以就用 Markdown + Pandoc 的形式 来完成。

一开始用的是 VS Code,但是每次打开它的时候都要等待,所以就想能不能用反应迅速的 Sublime Text 来完成编译的工作。

提到的所有使用方式都是根据我的习惯而定制的,不保证适用于更多人。比如没有对将文件名修改为 Sublime Text 中的变量 $file_name 格式,将所有要处理的变量全都放在 build.sh 中进行。只要明白工作原理:Pandoc + LaTex 即可,链条上的各种工具都有各种替代方案。

安装程序

  • MacTex
  • Pandoc
  • Sublime Text

绑定扩展名称

为了将用于生成 PDF 的 Markdown 文件和普通的 Markdown 文件区分开来,我将前者扩展名设定为 .pandoc-md。在 Sublime Text 中进行绑定:View -> Syntax -> Open all current extension as... -> Markdown Extended

准备参数设置

下文提到的所有 1.yaml1.pandoc-md 之类的,都是为了我写起来方便而已~

Pandoc 直接编译 Markdown 为 PDF 会发生中文消失的问题,所以需要指定使用的字体。同时也可以对格式做一些简单的处理。相关的元数据因为较多,我将其独立成了 1.yaml 文件,内容如下:

---
title:
date:
author:
documentclass:
  - ctexart
fontsize: 20pt
mainfont: TimesNewRomanPSMT
CJKmainfont: STSongti-SC-Regular
header-includes:
  - \title{}
  - \usepackage[b5j,left=2.cm,right=2.5cm,top=3cm,bottom=3cm]{geometry}
  - \usepackage{ctex}
  - \usepackage{fvextra}
  - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
  - \usepackage{hyperref}
  - \pagestyle{plain}
  - \hypersetup{colorlinks=true, linkcolor=black}
  - \usepackage{indentfirst}
  - \setlength{\parindent}{2em}
  - \usepackage{titling}
  - \renewcommand\maketitlehooka{\null\mbox{}\vfill}
  - \renewcommand\maketitlehookd{\vfill\null}
---

准备编译脚本

在目录下建立脚本文件 build.sh,内容如下:

pandoc\
    --pdf-engine xelatex\
    --filter pandoc-citeproc\
    --bibliography refer.bib\
    --csl nature.csl\
    1.pandoc-md 1.yaml -o 1.pdf

其中 filterbibliographycsl 三个参数只在有参考文献时才使用。简化的格式如下:

pandoc\
  --pdf-engine xelatex\
  1.pandoc-md 1.yaml -o 1.pdf

准备 Sublime Text 的编译指令

再 Sublime Text 界面中,依次点击 Tools -> Build System -> New Build System,即可进入编辑界面,将如下代码覆盖进去即可:

{
    "shell_cmd": "sh build.sh;open $file_base_name.pdf",
    "working_dir": "${project_path:${folder}}",
}

编译文件

打开扩展名为 .pandoc-md 的文件,编辑好 YAML 格式的文件,并确定 build.sh 中的文件名正确(三者在同一个目录下)。Cmd + B 稍等片刻,PDF 就出现了。

参考资料

  1. sainho, 第八章:用 Ulysses 搞定学术文档 - 少数派
  2. ringsaturn, 将中文 Markdown 文件转换为 PDF(一种可靠的方法)
Comments
Write a Comment