背景

背景

背景

我正在准备一系列简单的文档模板在我的个人网站上。为了让从未使用过这些内容的读者pandoc 徽标为了看到视觉输出,我添加了一些以允许 PDF、 DOCX 和 HTMLHTML5 徽标 <object class="responsive-embed">的视觉输出显示PDF 徽标文字徽标HTML5 徽标VS 代码徽标 Visual Studio 代码插入vscode-pandoc

我的页面截图

问题

谢谢pandoc无法识别中文字符,我知道设置CJKmainfont允许pandoc 徽标渲染 CJK 字符。但是,它破坏了现有的希腊字母PDF 徽标 输出 PDF

我的页面 PDF 嵌入的屏幕截图
点击以上截图即可查看HTML5 徽标 我的页面

方法

上述示例文档是在另一台设备上生成的。为了让你看到不理想的视觉输出,我准备了两个 MWE。

团体 目标 控制
Markdown 源文件名 cjk_article.md article.md
文件内容中的希腊字母
文件内容中的 CJK 字符
mainfont Times New Roman Times New Roman
CJKmainfont Noto Sans CJK SC 缺席的
呈现的 CJK 字符
希腊字母间距

我选择standalone而不是articledocumentclass生成将使用 转换为 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 的即时安装:

  • 中日韩MikTeX 即时安装 xeCJK
  • luatexja-fontspec.styMikTeX 即时安装 luatexja-fontspec.sty
  • everyhook.styMikTeX 即时安装 everyhook.sty
  • svn-prov.styMikTeX 即时安装 svn-prov.sty
  • UniJIS2004-UTF32-HMikTeX 即时安装 UniJIS2004-UTF32-H
  • HaranoAjiMincho-Regular.otfMikTeX 即时安装 HaranoAjiMincho-Regular.otf

我点击了“安装”以安装缺少的软件包。系统抱怨缺少字体“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

Git Bash 错误
MikTeX 控制台
在我的 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

  • 目标群体 (✓ CJK)

    目标群体输出

  • 对照组 (✗ CJK)

    控制组输出

要以原始尺寸查看pdftoppm -png输出,我建议单击这些图像以在单独的选项卡中查看它们。

问题

如何才能获得希腊字母(如控制组输出的屏幕截图所示)和 CJK 字符(如目标组输出的屏幕截图所示)之间的正确间距?

期望输出
备注:以上截图是使用 MS Paint 制作的。

答案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 的用户手册提供了有关langbabelfonts变量的更多详细信息。

梅威瑟:

---
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.

输出:

输出数字

相关内容