![如何使用 XeTeX 和 LuaTeX 为梵语生成复合变音字体?](https://linux22.com/image/259141/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20XeTeX%20%E5%92%8C%20LuaTeX%20%E4%B8%BA%E6%A2%B5%E8%AF%AD%E7%94%9F%E6%88%90%E5%A4%8D%E5%90%88%E5%8F%98%E9%9F%B3%E5%AD%97%E4%BD%93%EF%BC%9F.png)
我正在尝试使用一种本身不支持所有符号的字体(Minion Pro)来表示梵语的变音符号。因此,它们以某种方式由 XeTeX 组合起来。这在使用时几乎可以正常工作:
\documentclass{scrartcl}
\usepackage{xunicode,xltxtra}
\usepackage{fontspec,newunicodechar}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Minion Pro}
\newunicodechar{Ṛ}{\d{R}}
\newunicodechar{ṛ}{\d{r}}
\newunicodechar{Ṝ}{\={\d{R}}}
\newunicodechar{ṝ}{\={\d{r}}}
\newunicodechar{Ḷ}{\d{L}}
\newunicodechar{ḷ}{\d{l}}
\newunicodechar{Ḹ}{\={\d{L}}}
\newunicodechar{ḹ}{\={\d{l}}}
\newunicodechar{ṃ}{\d{m}}
\newunicodechar{ḥ}{\d{h}}
\newunicodechar{Ṭ}{\d{T}}
\newunicodechar{ṭ}{\d{t}}
\newunicodechar{Ḍ}{\d{D}}
\newunicodechar{ḍ}{\d{d}}
\newunicodechar{Ṅ}{\.{N}}
\newunicodechar{ṅ}{\.{n}}
\newunicodechar{Ṇ}{\d{N}}
\newunicodechar{ṇ}{\d{n}}
\newunicodechar{Ṣ}{\d{S}}
\newunicodechar{ṣ}{\d{s}}
\begin{document}
a A
ā Ā
i I
ī Ī
u U
ū Ū
ṛ Ṛ
ṝ Ṝ
ḷ Ḷ
ḹ Ḹ
e E
ai Ai
o O
au Au
ṃ ḥ
k K
c C
ṭ Ṭ
t T
p P
kh Kh
ch Ch
ṭh Ṭh
th Th
ph Ph
g G
j J
ḍ Ḍ
d D
b B
gh Gh
jh Jh
ḍh Ḍh
dh Dh
bh Bh
ṅ Ṅ
ñ Ñ
ṇ Ṇ
n N
m M
y Y
r R
l L
v V
ś Ś
ṣ Ṣ
s S
h H
\end{document}
但是 Ḹ、ḹ、Ṝ 和 ṝ 上方的长音符号位置不对,而且比 ā、ī 等上方的长音符号要细。我该怎么办?
第二个问题:这在 LuaTeX 中完全失败。xltxtra 似乎是实现此功能所必需的。但 LuaTeX 不支持此功能。我尝试使用此代码:https://tex.stackexchange.com/a/20791/19458
但是下面的点比 i-dot 大。使用 XeTeX 的上述解决方案并非如此。有没有办法在 LuaTeX 中更好地实现这一点?有可能吗?
答案1
以下方法似乎有效:
\documentclass{scrartcl}
\usepackage{fontspec,newunicodechar}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Minion Pro}
\UndeclareUTFcomposite[\UTFencname]{x1E0C}{\d}{D}
\UndeclareUTFcomposite[\UTFencname]{x1E0D}{\d}{d}
\UndeclareUTFcomposite[\UTFencname]{x1E25}{\d}{h}
\UndeclareUTFcomposite[\UTFencname]{x1E36}{\d}{L}
\UndeclareUTFcomposite[\UTFencname]{x1E37}{\d}{l}
\UndeclareUTFcomposite[\UTFencname]{x1E43}{\d}{m}
\UndeclareUTFcomposite[\UTFencname]{x1E46}{\d}{N}
\UndeclareUTFcomposite[\UTFencname]{x1E47}{\d}{n}
\UndeclareUTFcomposite[\UTFencname]{x1E5A}{\d}{R}
\UndeclareUTFcomposite[\UTFencname]{x1E5B}{\d}{r}
\UndeclareUTFcomposite[\UTFencname]{x1E62}{\d}{S}
\UndeclareUTFcomposite[\UTFencname]{x1E63}{\d}{s}
\UndeclareUTFcomposite[\UTFencname]{x1E6C}{\d}{T}
\UndeclareUTFcomposite[\UTFencname]{x1E6D}{\d}{t}
\UndeclareUTFcomposite[\UTFencname]{x1E44}{\.}{N}
\UndeclareUTFcomposite[\UTFencname]{x1E45}{\.}{n}
\makeatletter
\let\d\relax
\DeclareRobustCommand{\d}[1]
{\hmode@bgroup
\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup}
\let\.\relax
\DeclareRobustCommand{\.}[1]{\accent"02D9#1}
\DeclareRobustCommand{\MACRON}[1]{\accent"AF#1}
\makeatother
\newunicodechar{Ḍ}{\d{D}}
\newunicodechar{ḍ}{\d{d}}
\newunicodechar{ḥ}{\d{h}}
\newunicodechar{Ḷ}{\d{L}}
\newunicodechar{ḷ}{\d{l}}
\newunicodechar{ṃ}{\d{m}}
\newunicodechar{Ṇ}{\d{N}}
\newunicodechar{ṇ}{\d{n}}
\newunicodechar{Ṛ}{\d{R}}
\newunicodechar{ṛ}{\d{r}}
\newunicodechar{Ṣ}{\d{S}}
\newunicodechar{ṣ}{\d{s}}
\newunicodechar{Ṭ}{\d{T}}
\newunicodechar{ṭ}{\d{t}}
\newunicodechar{Ṅ}{\.{N}}
\newunicodechar{ṅ}{\.{n}}
\newunicodechar{Ḹ}{\d{\MACRON{L}}}
\newunicodechar{ḹ}{\d{\MACRON{l}}}
\newunicodechar{Ṝ}{\d{\MACRON{R}}}
\newunicodechar{ṝ}{\d{\MACRON{r}}}
\begin{document}
\parbox{.5\textwidth}{
a A
ā Ā
i I
ī Ī
u U
ū Ū
ṛ Ṛ
ṝ Ṝ
ḷ Ḷ
ḹ Ḹ
e E
ai Ai
o O
au Au
ṃ ḥ
k K
c C
ṭ Ṭ
t T
p P
kh Kh
ch Ch
ṭh Ṭh
th Th
ph Ph
g G
j J
ḍ Ḍ
d D
b B
gh Gh
jh Jh
ḍh Ḍh
dh Dh
bh Bh
ṅ Ṅ
ñ Ñ
ṇ Ṇ
n N
m M
y Y
r R
l L
v V
ś Ś
ṣ Ṣ
s S
h H
}
\end{document}
正如您所看到的,有必要撤消所做的一些工作xunicode
(这些工作会自动加载fontspec
,无需明确加载)。此外,必须重新定义一些标准重音,否则它们将不会使用主文档字体。
2017 年更新
上述提供的宏fontspec
是使用euenc
选项加载的。另一方面,新的默认 TU 编码不会使用\d
或\.N
和声明复合词\.n
,因此代码更简单。
\documentclass{scrartcl}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Minion Pro}
\makeatletter
\let\d\relax
\DeclareRobustCommand{\d}[1]
{\hmode@bgroup
\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup}
\let\.\relax
\DeclareRobustCommand{\.}[1]{\accent"02D9#1}
\DeclareRobustCommand{\MACRON}[1]{\accent"AF#1}
\makeatother
\newunicodechar{Ḍ}{\d{D}}
\newunicodechar{ḍ}{\d{d}}
\newunicodechar{ḥ}{\d{h}}
\newunicodechar{Ḷ}{\d{L}}
\newunicodechar{ḷ}{\d{l}}
\newunicodechar{ṃ}{\d{m}}
\newunicodechar{Ṇ}{\d{N}}
\newunicodechar{ṇ}{\d{n}}
\newunicodechar{Ṛ}{\d{R}}
\newunicodechar{ṛ}{\d{r}}
\newunicodechar{Ṣ}{\d{S}}
\newunicodechar{ṣ}{\d{s}}
\newunicodechar{Ṭ}{\d{T}}
\newunicodechar{ṭ}{\d{t}}
\newunicodechar{Ṅ}{\.{N}}
\newunicodechar{ṅ}{\.{n}}
\newunicodechar{Ḹ}{\d{\MACRON{L}}}
\newunicodechar{ḹ}{\d{\MACRON{l}}}
\newunicodechar{Ṝ}{\d{\MACRON{R}}}
\newunicodechar{ṝ}{\d{\MACRON{r}}}
\begin{document}
\parbox{.5\textwidth}{
a A
ā Ā
i I
ī Ī
u U
ū Ū
ṛ Ṛ
ṝ Ṝ
ḷ Ḷ
ḹ Ḹ
e E
ai Ai
o O
au Au
ṃ ḥ
k K
c C
ṭ Ṭ
t T
p P
kh Kh
ch Ch
ṭh Ṭh
th Th
ph Ph
g G
j J
ḍ Ḍ
d D
b B
gh Gh
jh Jh
ḍh Ḍh
dh Dh
bh Bh
ṅ Ṅ
ñ Ñ
ṇ Ṇ
n N
m M
y Y
r R
l L
v V
ś Ś
ṣ Ṣ
s S
h H
Ḹ ḹ
Ṝ ṝ
}
\end{document}