我想编译pandoc
一个包含 CJK 元素(实际上是中文)的 Markdown 文档。那里该--latex-engine=xelatex
选项允许pandoc
编译 Unicode 字符。
但是,我尝试了
cjk.md:
Hello
你好
编译(在 bash 中)
pandoc -s -o cjk.pdf --latex-engine=xelatex cjk.md
但结果只显示.pdf
了Hello
,而你好
没有显示。我是不是错过了什么?
(昨天我在 Stack overflow 上问了这个问题,但是没有人关注我......那里的人让我感到害怕><” )
背景:我计划在 Math SE 中问很多问题,并希望尽量减少将它们转换为另一个方便在本地编译的文件的麻烦。普通话是我的母语,有时我希望用中文添加注释(仅供我自己参考)。如果我找不到一种简单的方法来在本地编译嵌入 LaTeX 且散布着少量中文单词的 Markdown 文档,我做所有这些事情的动力就会受到打击。
答案1
转换为 PDF 使用 LaTex 作为后端。您需要指定一个带有中文字形的合适主字体。您可以通过将以下部分放在 .md 文档的顶部来执行此操作,例如
---
mainfont: Noto Sans Mono CJK TC
---
然后使用 --latex-engine=xelatex 开关进行编译,您应该会得到所需的输出。注意:从终端运行 fc-list 以查看安装了哪些 CJK 字体。
答案2
如果您只需要在文档中呈现中文字符,则无需修改 Pandoc LaTeX 模板。以下内容编译良好:
---
CJKmainfont: Noto Sans CJK SC Regular
CJKoptions: AutoFakeBold
---
Hello
你好
**你好**
我使用以下命令来编译上述内容,
pandoc -t latex -o cjk.pdf --latex-engine=xelatex cjk.md
我已突出显示生成的中间文件所需的部分,LaTeX
如下所示:
\else % if luatex or xelatex
\ifxetex
\usepackage{mathspec}
\else
\usepackage{fontspec}
\fi
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
\usepackage{xeCJK}
\setCJKmainfont[AutoFakeBold]{Noto Sans CJK SC Regular}
\fi
如果你真的打算编辑 Pandoc 模板,那么最好让它灵活以备将来使用。不要硬编码你的选项,而是引入变量。因此,
$if(CJKmainfont)$
\usepackage{xeCJK}
\setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
$if(CJKsansfont)$
\setCJKsansfont[$for(CJKsansoptions)$$CJKsansoptions$$sep$,$endfor$]{$CJKsansfont$}
$endif$
$if(CJKmonofont)$
\setCJKmonofont[$for(CJKmonooptions)$$CJKmonooptions$$sep$,$endfor$]{$CJKmonofont$}
$endif$
$endif$
然后我们可以通过模板使用以下源作为输入,
---
CJKmainfont: STSong
CJKoptions: BoldFont=STHeiti,ItalicFont=STKaiti
CJKsansfont: STXihei
CJKsansoptions: BoldFont=STHeiti
CJKmonofont: STFangsong
---
Hello
你好
**你好**
这将为我们提供如下的中间 LaTeX 文件(我只是强调了重要的部分):
\else % if luatex or xelatex
\ifxetex
\usepackage{mathspec}
\else
\usepackage{fontspec}
\fi
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
\usepackage{xeCJK}
\setCJKmainfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STSong}
\setCJKsansfont[BoldFont=STHeiti]{STXihei}
\setCJKmonofont[]{STFangsong}
\fi
这样,您的模板更加灵活,因为这些选项可以直接从 Markdown 文件中更改。
答案3
解决了。我在 Stack Overflow 中输入了以下内容:这里。但是 SE 不喜欢我只发布一个链接(仅此而已),所以我现在将其复制到这里。
xelatex
Tl;dr:将编译器设置为 而不是 是不够的pdflatex
;还必须包含包xeCJK
,但对于它应该在何处,请参见下文。
在我的例子中,pandoc
读取 a .md
,将其转换为 a .tex
,然后调用编译器将其编译为 a .pdf
。因此,从理论上讲,我通常使用 tex 类编译器可以做的事情,也可以用 完成pandoc
--- 只是我必须指定所需的模板。
调用pandoc
其自己的 Latex 模板,我们可以cat
在终端通过预先编写的命令来调用:
pandoc -D latex > default.latex
这实际上是将一个新文件复制default.latex
到.
(当前目录)。我现在修改的就是这个。pandoc
编译时将此选项附加到:
--template=my-directory/my-template.latex
过去我输入中文字符(或更一般地说,CJK),我使用以
\documentclass[12pt]{article}
\usepackage{xeCJK}% use Latin font whenever possible
\usepackage{fontspec}% set Chinese fonts, as follows
\setCJKmainfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STSong}
\setCJKsansfont[BoldFont=STHeiti]{STXihei}
\setCJKmonofont{STFangsong}
% .... whatever xeCJK commands you use
字体应该是您的系统允许的字体;上面显示的字体是随 Mac 一起提供的。
但当我简单地将其粘贴到 pandoc 提供的模板中时,出现了许多神秘的错误消息
option clash for package XXXX....
这是因为 pandoc 提供的模板已经定义了xeCJK
。事实上,搜索这些行:
$if(CJKmainfont)$
\usepackage{xeCJK}
\setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
$endif$
这些行(引用部分)应该替换为
\usepackage{xeCJK}
\setCJKmainfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STSong}
% .... and so on, whatever you call from xeCJK
即 delete if
,因此xeCJK
始终会执行;否则,xeCJK
不会将行复制到中间.tex
文件。还有 delete \usepackage{fontspec}
,因为pandoc
默认情况下会调用它,否则中间文件中调用两次包时会出现错误消息.tex
。
抱歉,我没有跟踪我引用过的所有网站,但无论如何,没有一个网站能完全正确,或者已经过时了。最有帮助的是mb21,他在评论中建议我输出.tex
调试,之后我发现其中xeCJK
没有包含。
我在这个问题上花了十多个小时,但从现在起我可以愉快地在 markdown 文件中输入中文了。我把这个写下来是为了可怜的后人。