带表情符号和象形文字的 Pandoc

pon*_*lus 10 unicode fonts xelatex emoji pandoc

有没有办法从包含 unicode、表情符号和象形文字的 Markdown 文件中获取 PDF?

\n\n

我正在运行这个测试:

\n\n
echo \':smile: \xe2\x86\x92 \xe2\x98\x85   \xe2\x9a\xa0\xef\xb8\x8f\' | pandoc -f markdown+emoji --latex-engine=xelatex -o foo.pdf\n
Run Code Online (Sandbox Code Playgroud)\n\n

与我所有的系统字体。

\n\n

到目前为止我得到的最好结果是:

\n\n\n\n

我尝试了一些不同的 pandoc 输入格式(-f / --from)和乳胶引擎,但没有成功。是否有完美的字体或关于如何实现这一目标的任何建议?

\n

Mig*_*elo 7

几天前,我正在寻找针对这个问题的解决方案,但找不到任何解决方案......所以我开发了自己的解决方案:一个Pandoc 过滤器,用于在生成的 PDF 中包含表情符号

但也存在一些妥协和限制:

  • 我必须使用template.tex文件,因此如果您已经使用模板,则必须将我的模板中的片段与您的模板合并。这可能是一个真正的痛苦......但我标记了我对 Pandoc 生成的原始文件所做的更改template.tex。至少这可以有所帮助。
  • 我没有使用Lua语言来制作过滤器的经验。所以我尝试了Python,但它没有像我预期的那样工作,因为我找不到一个库来将 unicode 表情符号代码点转换为我可以使用的东西。最后我用的是Javascript,所以NodeJS是必需的。此外,还必须安装一些 NPM 软件包。
  • 我曾经InkScape将在线资源中的 SVG 转换为 PDF,以便将它们插入到 PDF 中。这是必要的,因为 LaTeX 无法识别 SVG 图像格式。
  • 此时,我还没有时间实现过滤器的自动安装。查看 Git 存储库,然后从那里使用它......这是我能给出的最好建议。有一个示例脚本可将其转换readme.md为 pdf。我还提交了生成的 PDF
  • 我不知道它是否可以与xelatexlualatex以外的任何东西一起使用pdflatex,因为我只有时间使用 Pandoc 的默认引擎(即pdflatex.

使用表情符号过滤器

先决条件:PandocNodeJS

  1. 签出存储库

  2. 安装需要的NPM包:

    npm install
    
    Run Code Online (Sandbox Code Playgroud)
  3. 运行 Pandoc,传递过滤器、模板、正确的输入格式、表情符号源等。以下是用于从 readme.md 编译 example.pdf 的命令:

    pandoc --template="template.tex" -o example.pdf readme.md \
        --filter=emoji_filter.js -M emoji=noto-emoji --from gfm \
        -V links-as-notes=true -V colorlinks -V urlcolor=NavyBlue
    
    Run Code Online (Sandbox Code Playgroud)
    • --template="template.tex"指示存储库中存在的 template.tex 文件
    • -o example.pdf代表输出文件名
    • readme.md是输入文件名
    • --filter=emoji_filter.js表示表情符号过滤脚本文件名
    • -M emoji=noto-emoji是表情符号过滤器读取的元数据参数,以了解您想要哪种表情符号。此时有两个选择:noto-emojitwemoji。您可以在 unicode.org 上查看完整的表情符号列表
    • --from gfm是输入格式,gfm 表示 GitHub Flavored Markdown。我使用它是因为它可以将表情符号格式转换:__name__:为我的过滤器可以识别的 unicode 代码点。
    • 其他参数对此答案没有意义...它们用于调整链接在最终 PDF 中的显示方式。

我希望这个答案和表情符号过滤器能有所帮助!如有任何其他问题,请在评论中提问...也许您认为我应该发布并解释代码的某些部分。我真的不知道哪些部分可以帮助您提供简洁的答案,因为代码非常复杂。

无论如何,请随时询问=)