Minion Pro 和短音重音

Minion Pro 和短音重音

我在使用 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}

在此处输入图片描述

相关内容