pandoc无法识别中文字符

pandoc无法识别中文字符

我想编译pandoc一个包含 CJK 元素(实际上是中文)的 Markdown 文档。那里--latex-engine=xelatex选项允许pandoc编译 Unicode 字符。

但是,我尝试了
cjk.md:

Hello
你好

编译(在 bash 中)

pandoc -s -o cjk.pdf --latex-engine=xelatex cjk.md

但结果只显示.pdfHello,而你好没有显示。我是不是错过了什么?

(昨天我在 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 不喜欢我只发布一个链接(仅此而已),所以我现在将其复制到这里。


xelatexTl;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


致谢:[1] [2] [3]

抱歉,我没有跟踪我引用过的所有网站,但无论如何,没有一个网站能完全正确,或者已经过时了。最有帮助的是mb21,他在评论中建议我输出.tex 调试,之后我发现其中xeCJK没有包含。

我在这个问题上花了十多个小时,但从现在起我可以愉快地在 markdown 文件中输入中文了。我把这个写下来是为了可怜的后人。

相关内容