我无法让 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(“坏字符”),因此以传统方式访问它们(使用\UcharNNNN
,NNNN
Unicode 代码点在哪里)不起作用: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}