我想使用 来\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
中引用的映射可以提供精确的功能(包括映射多个代码点)(编辑:但显然仅限于“纯文本”,而不是命令),但并不优雅,不包含在同一个文本/源文件中,并且需要单独的工具。Mapping
fontspec
还有\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