XeLaTeX 是否有类似 DeclareUnicodeCharacter 但支持 Unicode 字素簇(即多个代码点的单位)的功能?

XeLaTeX 是否有类似 DeclareUnicodeCharacter 但支持 Unicode 字素簇(即多个代码点的单位)的功能?

我想使用 来\DeclareUnicodeCharacter定义以十进制或十六进制形式表示的 Unicode 字符的映射,并使用替代表达式或图形来替换 Unicode 字符。例如:

\DeclareUnicodeCharacter{014F}{\u{o}}

虽然这个具体的例子很好,但 Unicode 字符不仅仅是单个代码点,而且字素簇即多个代码点组成的序列,形成一个单元和一个可见字符。例如:

U+006E U+0303= ñ(有时,还有类似这样的等价物U+00F1

看起来该命令\DeclareUnicodeCharacter来自inputenc包,并且仅支持0和之间的值10FFFF,这对于单个代码点来说已经足够了,但可能无法为组合字素簇提供任何方法。但是当使用 XeLaTeX 时,实现不是来自inputenc,对吗?

那么inputenc,有没有办法映射字素簇,而不仅仅是单个代码点?例如:

\DeclareUnicodeCharacter{006E0303}{...}
# or
\DeclareUnicodeCharacter{006E,0303}{...}

编辑:

用例类似于\DeclareUnicodeCharacter\newunicodechar(可能没有完整的额外包),但对于多个代码点而不是单个代码点的单元,为了创建风俗映射。

似乎在的属性TECkit中引用的映射可以提供精确的功能(包括映射多个代码点)(编辑:但显然仅限于“纯文本”,而不是命令),但并不优雅,不包含在同一个文本/源文件中,并且需要单独的工具。Mappingfontspec

还有\XeTeXinterchartoks,但这实际上并不会使定义易于编写,尤其是对于多个单独的字素簇(而不是字符块)。

答案1

您的问题令人困惑,因为\DeclareUnicodeCharacter它没有为 xelatex 定义。

但是,如果我理解用例的话,就可以使用 XeTeX 字符类(尽管我并不推荐这样做)。

这仅检测 n 后跟一个组合波浪号,并用\fbox构造替换该对。

在此处输入图片描述

\documentclass{article}

\XeTeXinterchartokenstate=1

\newXeTeXintercharclass\nclass

\XeTeXcharclass `\n \nclass

\XeTeXinterchartoks 0 \nclass = {\ntest}
\XeTeXinterchartoks 4095 \nclass = {\ntest}

\def\ntest#1{\futurelet\next\ntestb}

\def\ntestb{%
 \ifx\next ^^^^0303%
    \fbox{An n-tilde combining pair}%
    \expandafter\eatnext
    \else
      {\XeTeXinterchartokenstate=0 n}%
    \fi}

\def\eatnext#1{}

\begin{document}



noo  ñ   abcñxyz  oon

\end{document}

答案2

您不需要任何此类工具,它就可以开箱即用。

下面是一个使用纯 XeTeX 的示例,以表明什么都不需要。在第一个调用中,我使用n后跟 U+0303 COMBINING TILDE,在第二个调用中,我直接使用ñ

%%% print the Unicode point of the given string and the result
\def\test#1{%
  \unicodestring#1\relax
  --- #1
}

\font\testfont="[Junicode.ttf]:mapping=tex-text"

\def\unicodestring#1#2{%
  (\the\numexpr`#1\relax)\space
  \ifx#2\relax\else
    (\the\numexpr`#2\relax)\space
  \fi
}

\testfont

\test{ñ}

\test{ñ}

\bye

在此处输入图片描述

答案3

映射就是您键入的输入。(因此您需要一种输入法。最简单的方法是直接输入。)

OpenType 字体文件包含复合字形(连字)的规则。字体塑造引擎(例如,使用 Xelatex 时为 HarfBuzz)应用这些规则。

您不需要重新发明轮子。

结合

平均能量损失

\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}\newcommand\textnote[1]{{\color{blue}$\leftarrow$ #1}}
\begin{document}
\symbol{110} + \ \symbol{771} = \symbol{110}\symbol{771} : (U+006E U+0303)

\symbol{241} : (U+00F1)

a\symbol{771} b\symbol{771} c\symbol{771} d\symbol{771} e\symbol{771} \textnote{Combining Diacritical Mark}

ᲀᲁᲂᲃᲄᲅᲆᲇᲈ \textnote{Cyrillic Extended-C}

\end{document}

添加

^^^^对于普通的 xetex,如果您没有键盘覆盖、操作系统语言选择、​​字符映射、正则表达式替换等,则可以使用符号。

脱字符

平均能量损失

%xetex
\font\testfont="[NotoSerif-Regular.ttf]:mapping=tex-text"

\testfont

^^^^006e^^^^0303 using \space ^^^^0302 ^^^^0302 ^^^^0302 ^^^^0302  notation.

\bye

相关内容