Unicode 变体选择器 (u+FE00) 不适用于 Noto Sans Myanmar(缅甸语)

Unicode 变体选择器 (u+FE00) 不适用于 Noto Sans Myanmar(缅甸语)

我无法让 Unicode 变体选择器字符正常工作。

缅甸语的 Unicode 范围还涵盖了许多泰语,例如掸语和艾顿语。在艾顿语中,字母形式有非常小的变化,由 u+FE00 字符处理。U+1000 (က) 是辅音 /k/,U+1000 U+FE00 (က︀) 是变体形式,在左下角添加了一个小点。

我在 macOS 上的 TexPad 中有一些文本,它在编辑器视图中显示点(即变体选择器字符正在工作),但是当我编译(XeLaTeX)时,它显示时没有点。

我正在使用 Noto Sans Myanmar,它通常会显示点。

梅威瑟:

\documentclass[12pt]{article}

\usepackage{fontspec}
\newfontfamily\myanmar{Noto Sans Myanmar}
% \newfontfamily\myanmar{Noto Sans Myanmar}[Variant=1] makes no difference

\begin{document}

% \addfontfeature{Variant=01} also has no effect

% with dots
{\myanmar က︀ိင︀်ꩫ︀ႃလ︀ႃ}

% no dots
{\myanmar ကိင်ꩫႃလႃ}

\end{document}

这是编辑器视图的屏幕截图,显示了在 SE 上不显示时出现的差异。

在此处输入图片描述

这是 MWE 的输出,它不根据需要使用变体:

在此处输入图片描述

明确转换为代码点,例如\symbol{"1000}\symbol{"fe00}\symbol{"102d}...将其进一步分解,并且所有变音符号均无法正确显示。\char"1000等也是如此。

关于如何解决这个问题有什么想法吗?

答案1

修正答案

根据评论的反馈,该Script=选项足以激活变体选择器(位于 U+FE00 的字形 VS1);并且语言设置没有效果(在这种情况下)。

带有点

另外,fontspec还允许重命名脚本标签(和其他内容)\newfontscript{Phake}{mym2}:。

所以你可以写类似

\newfontfamily\myanmara{Noto Serif Myanmar}[Colour=blue,Renderer=HarfBuzz,Script=Phake]

最近的 Lualatex 安装不需要该Renderer=HarfBuzz部件。

平均能量损失

\documentclass[12pt]{article}
\usepackage[table]{xcolor}
\usepackage{fontspec}
\usepackage{xparse}% not neeeded for up-to-date distr
\ExplSyntaxOn
    % a handy command
    \cs_set_eq:NN \fontfeature \fontspec_if_feature:nTF
\ExplSyntaxOff
\newcommand\showyes{{\usefont{T1}{lmr}{m}{n}Yes}}
\newcommand\showno{{\usefont{T1}{lmr}{m}{n}No}}

\newfontscript{Phake}{mym2}
\newfontlanguage{Karen}{KSW}
\newfontlanguage{Mon}{MON}
\newfontfamily\myanmara{Noto Serif Myanmar}[Colour=blue,Renderer=HarfBuzz,Script=Phake]
\newfontfamily\myanmarb{Noto Serif Myanmar}[Colour=red,Renderer=HarfBuzz,Script=Phake,Language=Karen]
\newfontfamily\myanmarc{Noto Serif Myanmar}[Colour=brown,Renderer=HarfBuzz,Script=Phake,Language=Mon]

\begin{document}

Has \verb|ss01|: {\myanmara \fontfeature{ss01}{\showyes}{\showno}}

%with dots (with variation selectors) (using Phake=mym2 script)

\bigskip
\begin{tabular}{ll}
\rowcolor{blue!15}
Language & Result \\
\hline
None & \myanmara က︀ိင︀်ꩫ︀ႃလ︀ႃ \\
Karen & \myanmarb က︀ိင︀်ꩫ︀ႃလ︀ႃ \\
Mon & \myanmarc က︀ိင︀်ꩫ︀ႃလ︀ႃ \\
\hline
\end{tabular}

%\bigskip
%with no dots
%
%{\myanmarb ကိင်ꩫႃလႃ}

\end{document}


赛莱特

赛拉特

私人使用区中有几百个字形,它们都具有 Unicode 值 = -1(“坏字符”),因此以传统方式访问它们(使用\UcharNNNNNNNNUnicode 代码点在哪里)不起作用:lualatex 和 xelatex 都无法通过这种方式访问​​它们。

在 Xelatex 中,有 XeTeX 原语允许通过字体中的位置编号访问字形。

TecKit 映射文件或 expl3 的正则表达式/查找替换功能将允许使用便捷的音译 ASCII 输入法。TecKit 映射使用 Unicode 代码点。

平均能量损失

\documentclass[12pt]{article}
\usepackage{multicol}
\usepackage{xcolor}
\usepackage{fontspec}

\newcommand\tl[1]{{\usefont{T1}{lmtt}{m}{n}\small#1}}
\font\myanmara="[NotoSerifMyanmar-Regular.ttf]'' at 12pt


\begin{document}

\myanmara 
က︀ိင︀်ꩫ︀ႃလ︀ႃ 

\tl{glyph count = }
\count255=\XeTeXcountglyphs\myanmara\relax
\tl{\the\count255}

\myanmara\XeTeXglyph130\XeTeXglyph384\XeTeXglyph134\XeTeXglyph406\XeTeXglyph146\XeTeXglyph373\XeTeXglyph150\XeTeXglyph373


\begin{multicols}{5}
\count255=1
\loop
\ifnum\count255 < \XeTeXcountglyphs\myanmara
\noindent
\centering
{\tl{\the\count255=}}
{\color{blue}\large\myanmara\XeTeXglyph\count255}
\par\noindent\centering
\tl{\tiny[\XeTeXglyphname\myanmara\count255]}\par
\ \par\hrule\par\ \par
\advance\count255 by 1
\repeat
\end{multicols}

\end{document}

路拉泰克斯

作为参考,也可以使用 lua 代码通过 Lualatex 中的索引/键访问字形。

直接的可以使用 luatex 的字体缓存信息来访问替代字形,而不是通过字体功能、变体选择器等间接访问,并且不是使用 HarfBuzz 作为字体渲染器。(HarfBuzz 通过连字表、替换表等以“正常”方式渲染所有字形 - 所有这些信息也都在字体缓存文件中。)

Luatex 通过其字体缓存了解字体,字体缓存是一组包含 lua-table 结构中的字体信息的文件。

在这种情况下,我们可以.../texlive/2020/texmf-var/luatex-cache/generic/fonts/otl/notoserifmyanmar-regular.lua使用命令加载文件require并遍历descriptions表及其子表,以获得这种类型的条目:

 ["descriptions"]={
...

  [983058]={
   ["boundingbox"]=13,
   ["index"]=130,
   ["name"]="ka_khm",
   ["unicode"]=4096,
   ["width"]=1037,
  },
...
}

其中[983058]是“内部键”,即字体中字形的槽号或 Unicode 代码点,["index"]是字形 ID (GID),["name"]是显而易见的,["unicode"]是此字形相关的 Unicode 代码点( 处的字形“ka” 4096)。当 HarfBuzz 用 OpenType 眼睛看到它时,字形“ka_khm”的 Unicode 将被映射到-1,因此无法通过这种方式直接访问。

(可以通过连字符绑定间接访问该字形:

    ["features"]=316,
    ["flags"]=117,
    ["index"]=13,
    ["name"]="s_s_14",
    ["nofsteps"]=1,
    ["order"]=139,
    ["steps"]={
     {
      ["coverage"]={
       [4096]={
        [65024]={
         ["ligature"]=983058,
        },

所以没有问题。

诀窍直接的获得这些替代品和替代物的途径是不是使用 HarfBuzz 作为字体渲染器。

所有字形

使用这种方法时,某些字形的位置会比较尴尬,因为这种方法将一些字形放在独立的位置,因此脱离了上下文。

平均能量损失

\documentclass{article}
\usepackage[table]{xcolor}
\usepackage{fontspec}
\usepackage{luacode}
\usepackage{multicol}
\usepackage{xparse}

\setlength{\columnsep}{0.3cm} \setlength{\columnseprule}{1pt}

\newfontfamily\flab{Noto Serif}% for labels
\newfontfamily\fmyan{NotoSerifMyanmar-Regular.ttf}

\let\nc\newcommand

%--------------------------------------
\begin{luacode}
    function openmyfontfile(xxx)
        local fft = require(xxx)
  
        tex.sprint("\\begin{multicols}{2}")

            for k, v in pairs(fft.descriptions) do
        
            for kk, vv in pairs(fft.descriptions[k]) do
        if kk == "name" then 
                    tex.sprint("\\noindent\\begin{tabular}{|l|l|c|}")
                    tex.sprint("\\hline")
                    tex.sprint("{\\flab\\small " .. k .. "}&")
                    tex.sprint("{\\flab\\small \\detokenize{"  .. vv .. "}}&")
                    tex.sprint("\\cellcolor{blue!12}\\Uchar" .. k .."\\\\")         
                    tex.sprint("\\hline")
                    tex.sprint("\\end{tabular}\\par")
            end
            end
            end
        
            tex.sprint("\\end{multicols}")

 end
\end{luacode}
\nc\doopenff[1]{%
{\directlua{openmyfontfile("#1")}}
}

%===============

\begin{document}
\fmyan
\doopenff{<..long path name..>/texlive/2020/texmf-var/luatex-cache/generic/fonts/otl/notoserifmyanmar-regular.lua}

\end{document}

原始答案

带有点

根据 github 链接上的提示,这些点存储在StylisticSet=1( ss01) 下。

它们可以通过脚本选项(Script=Myanmar)访问。

必须明确告知 Lualatex 使用 HarfBuzz 字体渲染器。在 Xelatex 中,它应该是默认设置。

平均能量损失

\documentclass[12pt]{article}

\usepackage{fontspec}
\newfontfamily\myanmar{Noto Serif Myanmar}[StylisticSet=1,Renderer=HarfBuzz,Script=Myanmar]
\newfontfamily\myanmarsans{Noto Sans Myanmar}[StylisticSet=1,Renderer=HarfBuzz,Script=Myanmar]

\begin{document}
Serif:

% with dots
{\myanmar က︀ိင︀်ꩫ︀ႃလ︀ႃ}

% no dots
{\myanmar ကိင်ꩫႃလႃ}

\bigskip
Sans Serif:

% with dots
{\myanmarsans က︀ိင︀်ꩫ︀ႃလ︀ႃ}

% no dots
{\myanmarsans ကိင်ꩫႃလႃ}

\end{document}

相关内容