Emoji(絵え文も字じ)是聊天软件和社交平台的常客,也几乎成为了一种新的「世界语」。虽然 LATEX 以排版严肃的学术类文章见长,但偶尔卖个萌也不为过。

背景

Emoji 其实是文字的一种,换句话说它们是对应有 Unicode 码位的。而微信、QQ 等聊天工具,为了抹平平台差异以防出现歧义,实际上是用了自己的一套东西,复制出去就会原形毕露,得到 [奸笑]、[旺柴] 这样的字符串。

在之前引擎没有支持的时候,也有人在 LATEX 中实现过类似的想法,即先把 emoji 导出为图片,再通过一些命令插入,比如:

这样的机制虽然简单可靠,但毕竟插图不是文字,过多的图片不便于下载和交换(完整的支持至少需要近千个图片文件,这恐怕也是 TEX Live 不收录的原因),也不能自由地切换样式(字体)。不过,Lua­TEX 最近加入了一些功能,使得我们现在也可以在 LATEX 中以字体的形式直接使用 emoji。

基本方法

2019 年,Luigi Scarso 等人为 Lua­TEX 添加了 HarfBuzz 库支持,构建了另一个分支 LuaHB­TEX。随后,LATEX 的开发版本就改用它代替原来的 Lua­TEX;在 TEX Live 2020 中 LuaHB­TEX 也将成为默认的 Lua­TEX 引擎。因此,为了使用 emoji 字体,我们需要改用 lualatex-dev 命令编译。

另一方面,显示 emoji 还需有字体的支持。主流操作系统都配有设计精良的字体:

  • Windows 中是 Segoe UI Emoji

  • macOS 中是 Apple Color Emoji

  • Ubuntu 等 Linux 系统大多配有开源的 Noto Color Emoji

在最新版的 TEX Live 中,则包含有 Twemoji Mozilla 和 Noto Color Emoji,它们均是开源免费的。

与普通字体类似,我们可以使用 fontspec 提供的命令来声明字体,但注意需要加上选项 Renderer=HarfBuzz[1]。在文档中直接输入想要的表情,就可以使用了:

\documentclass{article}
\usepackage{fontspec}
\newfontface\EmojiFont{Twemoji Mozilla}[Renderer=HarfBuzz]
\begin{document}The cat eats apple:  {\EmojiFont