ConTeXt:使用无色表情符号字体

ConTeXt:使用无色表情符号字体

例如,我喜欢使用 Twemoji 字体[1]。Fedora 提供了一个使用 Google 的 Noto Emoji 工具[3] 构建的 TrueType 变体[2]。此外,Mozilla 还提供了一个 COLR/CPAL 版本[4]。

我无法使用任何以与 Noto Emoji 字体相同的方式构建的 TrueType 表情符号字体。这还包括 Android Emoji、EmojiOne 和 NotoColorEmoji。错误是:

! error:  (file /usr/share/fonts/twemoji/Twemoji.ttf) (ttf): sfnt table not foundmtx-context     | fatal error: return code: 1

我无法使用任何颜色版本,即 COLR/CPAL Twemoji Mozilla。竞争字体颜色提案是新的,但我希望字体显示时没有颜色(黑色)。事实上,字形是存在的,可以从 PDF 中复制;它只是透明的。

\definefallbackfamily   [mainface] [serif] [twemoji] [range={miscellaneoussymbolsandpictographs}]
\definefontfamily       [mainface] [serif] [DejaVu Serif]
\definefontfamily       [mainface] [sans]  [DejaVu Sans]
\definefontfamily       [mainface] [mono]  [DejaVu Sans Mono]

\setupbodyfont[mainface]

\definesymbol[link][\utfchar{"1F517}]

\starttext
A\symbol[link]B
\stoptext

跟进

作为文献,还有继续前行,第四章:再次使用表情符号这基本上是答案中链接的演示文稿的详细版本,并解释了我的大部分后续问题:

  1. \emoji命令要求已定义“emoji”字体同义词。我可以确认这是通过命令完成的,\define*family尽管您仍必须传递features={colr=yes,}或通过 定义的任何名称\definefontfeature

  2. 独立链接表情符号仅需要colr=yes。文档解释了(并附有示例)为什么还应为覆盖字体启用ccmp和功能 - 基本上是为了组合表情符号。dist

  3. 为了完整起见,我在我的问题中描述了其他表情符号字体,如下所示mtxrun --script fonts --list --all --pattern='*emoji*'

    • google-android-emoji/AndroidEmoji.ttf

      非彩色(无需任何功能)

    • eosrei-emojione/emojione-android.ttf

      位图

    • EmojiOne/OpenType.SVG.v3.1.2/emojione-svg.otf

      非彩色(无需任何功能)+ svg

      注意:两种方法都可以。虽然 svg 功能使 ConTeXt 使用 inkscape 生成字形,但这些字形的位置与常规字形完全相同(与位图字形相反),并且以黑白方式绘制,没有颜色。这让我认为 ConTeXt 并没有绘制转换后的字形。虽然字形显然来自 EmojiOne v2,但这种字体被宣传为 EmojiOne v3。

    • google-noto-emoji/NotoColorEmoji.ttf

      位图

    • google-noto-emoji/NotoEmoji-Regular.ttf

      非彩色(无需任何功能)

    • Twemoji.ttf

      位图

      注意:此字体的转换非常丑陋。


    我应该指出,位图(可能还有 svg)字体的字形定位低于标准:图像底部与基线对齐。此外,初始转换过程(位图->png->tma->tmc)非常慢,最终结果是栅格化的:在高缩放级别下看起来会像素化。

  4. 考虑签名\definefontfeature [...] [...] [.=.]。第一个参数显然是任意的用户定义功能名称,稍后可通过字体名称进行选择,例如,[name:twemojimozilla*default,overlay]使用\definefont\definefontsynonym。此示例同时启用“默认”和“覆盖”功能,“默认”由 ConTeXt 预定义为:

    default:liga=yes,kern=yes,tlig=yes,trep=yes
    

    根据文档,我也应该能够使用\definefontsynonym[emoji][name:twemojimozilla][features=overlay],但那不起作用。

    我不明白的是 的第二个参数\definefontfeature,即[default]中的\definefontsynonym[emoji][name:twemojimozilla*default,overlay]。它起什么作用?

  5. 当我尝试强制使用灰度调色板时,重新创建工作流程在答案中提到的在线演示幻灯片第 15 页但是用 替换TwemojiMozilla字体时seguiemj,出现此错误:

    ! error:  (vf command): commands has to be a tablemtx-context     | fatal error: return code: 1
    

    您介意用正确的方法更新您的答案吗?

资料来源:

  1. https://github.com/twitter/twemoji
  2. https://src.fedoraproject.org/cgit/rpms/twitter-twemoji-fonts.git/
  3. https://github.com/googlei18n/noto-emoji/issues/9
  4. https://github.com/mozilla/twemoji-colr

答案1

您必须激活正确的字体功能。我使用了Mozilla Twemoji 字体(我找不到其他的 TTF 文件)。

2017 年 ConTeXt 会议。幻灯片可在线获取(PDF)。

\definefontfeature
  [overlay]
  [default]
  [ccmp=yes,
   colr=yes,
   dist=yes]

\definefontsynonym
  [emoji]
  [file:TwemojiMozilla.ttf*overlay]

\starttext

\emoji{link}

\stoptext

在此处输入图片描述


如果您想要不同的颜色,则必须定义一个自定义调色板以与colr字体功能一起使用。这里的问题是,字体的默认调色板相当复杂,因此按照您想要的方式为表情符号的某些元素着色绝对不是一件容易的事。如果您只想切换到“某种单色”,下面的解决方案应该足够了。

\usemodule[fonts-emoji]

\definefontcolorpalette
  [emojibw]
  [middlegray]

\definefontfeature
  [overlay]
  [default]
  [ccmp=yes,
   colr=emojibw,
   dist=yes]

\definefontsynonym
  [emoji]
  [file:TwemojiMozilla.ttf*overlay]

\definefont
  [emojifont]
  [emoji]

\starttext

\emoji{man}

\emojifont\ShowEmoji[^man]

\stoptext

在此处输入图片描述

相关内容