我在使用 Minion Pro 和短音重音 (viasemtrans package
或 via ḫ) 时遇到了问题。我该如何适应此解决方案由@egreg 对此案例?
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Minion Pro}
\usepackage{semtrans}
\begin{document}
Test \U{h}. Test ḫ.
\end{document}
答案1
semtrans
对此不起作用,因为它使用\u
并且 Minion Pro 缺少组合短音(它缺少太多东西,因此对于大量工作来说并不真正有用)。
我们可以修补semtrans
定义以直接使用短音符(至少 Minion Pro 有某物在里面)。
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Minion Pro}
% from semtrans
\newcommand*\U[1]{{\oalign{#1\crcr\hidewidth
\vbox to .2ex{\hbox{\char"02D8}\vss}\hidewidth}}}
\newunicodechar{ḫ}{\U{h}}
\begin{document}
Test \U{h}. Test ḫ.
\end{document}
还考虑了斜体倾斜的版本:
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Minion Pro}
% from semtrans, with changes
\makeatletter
\newcommand*\U[1]{{%
\oalign{%
#1\crcr
\hidewidth
\vbox to .2ex{\hbox{\kern-\f@size\fontdimen1\font\char"02D8}\vss}%
\hidewidth\crcr
}%
}}
\makeatother
\newunicodechar{ḫ}{\U{h}}
\begin{document}
Test \U{h}. Test ḫ. Test \U{m}.
\itshape
Test \U{h}. Test ḫ. Test \U{m}.
\LARGE
Test \U{h}. Test ḫ. Test \U{m}.
\end{document}
答案2
LuaTeX 的回调机制总是让我惊叹不已。在这里我挂接了pre_linebreak_filter
。当我在节点列表中遇到带短音符的 h 时,我会用普通的 h 替换它,并在其后注入负的字距和降低的短音符。
在 TeX 级别上,这现在是完全透明的,不需要进行任何 catcode 更改。
\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Minion Pro}
\usepackage{luacode}
\begin{luacode*}
local function hbreve(head)
for n in node.traverse(head) do
if n.id == node.id("glyph") then
if n.char == 0x1e2b then
n.char = 0x68
local f = n.font
local slant = font.fonts[f].parameters.slant
local size = font.fonts[f].size / 2^16
local breve = node.new("glyph")
breve.font = f
breve.lang = tex.language
breve.char = 0x02D8
breve.width = n.width
local hbox = node.hpack(breve)
hbox.shift = n.height
head = node.insert_after(head,n,hbox)
local kern = node.new("kern")
kern.kern = -(n.width+breve.width+slant*size)/2
head = node.insert_after(head,n,kern)
local kern = node.new("kern")
kern.kern = (n.width-breve.width+slant*size)/2
head = node.insert_after(head,hbox,kern)
end
end
end
return head
end
luatexbase.add_to_callback("pre_linebreak_filter", hbreve, "hbreve")
\begin{document}
Test ḫ.
\itshape Test ḫ.
\end{document}