Skip to content

中文markdown转pdf

这里需要用个两个利器,就是“pandoc”和“xetex”。

pandoc

pandoc软件包提供了一个工具——markdown2pdf,它可以直接把markdown文件转化为pdf文件, 为我们省去了中间步骤等麻烦的东西,一步就位。但是当我们的文件中有中文时, 就得稍微设置一下了。那到底都要设置些什么呢?

TeX引擎

在生成pdf文件时,markdown2pdf其实还是先转换成了TeX文件的,然后用默认引擎pdflatex 来导出pdf。而对于排版引擎,我还是偏爱XeTeX的,毕竟人原生就支持unicode。pdflatex 虽然使用CJK宏包也能支持中文,但可选择字体实在是有点少了。

~~那么怎样让markdown2pdf默认使用XeTeX呢?很简单,只要加上"--xetex"选项就可以了。~~

新版的pandoc软件包去掉了markdown2pdf工具,转而直接使用 pandoc --latex-engine=pdflatex|lualatex|xelatex命令。

TeX模板

光选好了引擎还是不够的,模版也得设置一下。否则就会因为没有设定合适的字体,导致 最终中文还是显示不出来。

那模板要怎么写呢?一个简便的方法就是,使用pandoc -D latex > pandoc.template导出 pandoc的默认模板,然后修改一下字体就行了。

...
% 添加此行,设置默认字体
\setmainfont{Droid Sans Fallback}

$if(mainfont)$
  \setmainfont{$mainfont$}
$endif$
...

至于字体的名称,可以使用fc-list :lang=zh来查看。模板修改完毕后,我们 只要在生成时加上"--template="选项就OK了。

默认情况下,TeX引擎是按着英文的习惯来排版的,对于中文,会显得比较难看, 这时候可以考虑使用一下xeCJK宏包。xeCJK针对中文做了一些版式上的微调, 看起来会舒服点。

...
\else % if luatex or xelatex
  \usepackage{fontspec}

  \ifxetex
    \usepackage{xltxtra,xunicode}

    % 添加xeCJK宏包
    \usepackage{xeCJK}
    \setCJKmainfont{Droid Sans Fallback}
    \setCJKsansfont{Droid Sans Fallback}
    \setCJKmonofont{Droid Sans Fallback}

  \fi

  % 注释掉此行,否则会冲突
  %\defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}

  \newcommand{\euro}{€}

$if(mainfont)$
    \setmainfont{$mainfont$}
$endif$
...

但也仅仅就是舒服点了,倘若你想完全按着自己的想法来排版的话,还是 重头写一下这个模板文件吧。

XeTeX

XeTeX和上面提到的fc-list,都可以通过安装texlive这个发行版搞定。

生成

非常简单,综合上面的两个选项就可以: ~~markdown2pdf --template=./pandoc.template --xetex hello.md~~

新版本的pandoc中,已经去掉了markdown2pdf这个工具。相应的,pandoc 已经可以直接导出pdf了。用法基本没变,如下:

pandoc hello.md --latex-engine=xelatex --template=pandoc.template -o hello.pdf

Last update: 2022-12-14