背景
我正在准备一系列简单的文档模板在我的个人网站上。为了让从未使用过这些内容的读者潘多克为了看到视觉输出,我添加了一些以允许 PDF、 DOCX 和 HTML <object class="responsive-embed">
的视觉输出显示 Visual Studio 代码插入vscode-pandoc。
问题
谢谢pandoc无法识别中文字符,我知道设置CJKmainfont
允许潘多克渲染 CJK 字符。但是,它破坏了现有的希腊字母 输出 PDF。
点击以上截图即可查看 我的页面。
方法
上述示例文档是在另一台设备上生成的。为了让你看到不理想的视觉输出,我准备了两个 MWE。
团体 | 目标 | 控制 |
---|---|---|
Markdown 源文件名 | cjk_article.md |
article.md |
文件内容中的希腊字母 | ✓ | ✓ |
文件内容中的 CJK 字符 | ✓ | ✗ |
mainfont |
Times New Roman |
Times New Roman |
CJKmainfont |
Noto Sans CJK SC |
缺席的 |
呈现的 CJK 字符 | ✓ | ✗ |
希腊字母间距 | ✗ | ✓ |
我选择standalone
而不是article
来documentclass
生成将使用 转换为 PNG 的 PDF 文件pdftoppm
,以便步骤和输出可重现。
$ diff -u {,cjk_}article.md
--- article.md 2023-04-08 12:59:46.415084100 +0200
+++ cjk_article.md 2023-04-08 13:02:34.029625600 +0200
@@ -1,6 +1,7 @@
---
documentclass: standalone
mainfont: Times New Roman
+CJKmainfont: Noto Sans CJK SC
---
-Section Ωαβ. Lôrém ipsùm dolor sit amet.
+Section Ωαβ. Lôrém 繁體 ipsùm 简体 dolor こんにちは sit 조선글 amet.
在编译过程中,我没有安装依赖项,因此调用了以下软件包的 MikTeX 的即时安装:
我点击了“安装”以安装缺少的软件包。系统抱怨缺少字体“NotoSansCJKSC”,我立即安装了该字体。
$ find -path './*article.md' -print0 | \
> while IFS= read -r -d '' file; do
> pandoc --pdf-engine=lualatex $file -o ${file%md}pdf
> done
Error producing PDF.
! Package fontspec Error: The font "NotoSansCJKSC" cannot be found.
For immediate help type H <return>.
...
l.27 \fi
在我的 MWE 中,我在回答链接的 TeX.SE 问题时使用了Noto Sans CJK SC
而不是 ,Noto Sans CJK TC
这是因为上面的屏幕截图中突出显示了 LaTeX 包的名称。
之后,我重复上述命令,错误信息消失了。为了产生可观察的结果(将包含在下一节中),我使用了pdftoppm
(随我的 MikTeX 安装一起提供)。
$ !find
find -path './*article.md' -print0 | while IFS= read -r -d '' file; do pandoc --
pdf-engine=lualatex $file -o ${file%md}pdf; done
$ find -name '*article.pdf' -exec sh -c \
> 'f="{}"; pdftoppm -png -r 450 "$f" "${f%.*}" 2>/dev/null' \;
$ which pdftoppm
/c/Users/sere/AppData/Local/Programs/MiKTeX/miktex/bin/x64/pdftoppm
备注:感谢{}
这是用于占位符操作的有用单行代码在 Unix.SE 上。我用 隐藏了以下警告信息2>/dev/null
。
MiKTeX requires Windows 10 (or greater): https://miktex.org/announcement/legacy-windows-deprecation
结果
以下是输出的 PNG
要以原始尺寸查看pdftoppm -png
输出,我建议单击这些图像以在单独的选项卡中查看它们。
问题
如何才能获得希腊字母(如控制组输出的屏幕截图所示)和 CJK 字符(如目标组输出的屏幕截图所示)之间的正确间距?
答案1
感谢采纳的答案如何在同一文档中使用重音拉丁字母 + 俄语 + 日语?(@JavierBezos 在评论中提到),我找到了解决此问题的方法。
\ltjsetparameter{jacharrange={-2}}
pandoc 提供header-includes
我可以在其中包含此行代码的变量。
关于线路
\usepackage{iftex}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures={TeX}}
我没有将它们包含在该 pandoc 变量中,因为它已经存在了pandoc 的默认模板,它将加载 LaTeX 包iftex
。
sansfont
和的配置monofont
不是这个问题的重点。我发现这些变量在以下 MWE 中是多余的。
babel-lang: english
babel-otherlangs: chinese, japanese, korean, greek
包含和/或排除这两行不会影响最终结果。pandoc 的用户手册提供了有关lang
和babelfonts
变量的更多详细信息。
梅威瑟:
---
documentclass: standalone
mainfont: Times New Roman
CJKmainfont: Noto Sans CJK SC
header-includes: |
\ltjsetparameter{jacharrange={-2}}
---
Section Ωαβ. Lôrém 繁體 ipsùm 简体 dolor こんにちは sit 조선글 amet.
输出: