包含连字符的连字符会破坏先前的连字符(LuaLaTeX)

包含连字符的连字符会破坏先前的连字符(LuaLaTeX)

我制作了一种用于音乐功能和声分析的字体,其中包含连字和其他 OpenType“魔法”。TobiW 在此主题在一个德语排版论坛上向我展示了如何在 LuaLaTeX 中使用包含连字(如-5_5和 )的字体(通过将s 设置为和)。-~\catcode~_

现在几乎所有功能都可以使用,但包含 -(连字符)的几个连续连字符无法使用 — 只有最后一个连字符可以由 LuaLaTeX 渲染。例如,-4-4-4应该给出 ⁴⁴⁴,但它给出的是 -4-4⁴。相反,_4_4_4它给出了预期的 ₄₄₄。

这几乎肯定是 ((Lua)La)TeX 的问题,Pango/Harfbuzz 正确地渲染了示例。TobiW 建议关闭 TeX 连字符(例如--–)并重新定义\hyphenchar,但都没有帮助。知道为什么连字符仍然如此特殊吗?

\documentclass{article}

\usepackage{fontspec}

\newcommand{\func}[1]{{%
\fontspec{Harmony}[RawFeature=-tlig]% turn off TeX ligatures
\hyphenchar\font=-1\relax% don’t use - for hyphenation
\catcode45=12\relax% 45=hyphen
\catcode95=12\relax% 95=underscore
\scantokens{#1\empty}% \scantokens makes catcode definitions apply to #1
}}


\begin{document}
\func{-4-4}
\func{_4_4}
\func{-- –}
\end{document}

提前感谢你的帮助!

PS,差点忘了:由于其他原因我必须使用 LuaLaTeX,因此使用 XeLaTeX(如果这有帮助的话)对我来说不是一个选择。

答案1

在 LuaTeX 中,你必须使用\exhyphenchar而不是\hyphenchar。此外,当段落结束且\hbox/\vbox组结束后,才会查询该值,因此你可以使用

\documentclass{article}

\usepackage{fontspec}
\newfontface\harmonyfont{Harmony}

\newcommand{\func}[1]{{%
  \leavevmode
  \exhyphenchar=-1
  \hbox{%
    \harmonyfont
    \catcode`\_=12
    \scantokens{#1}% \scantokens makes catcode definitions apply to #1
  }%
}}

\begin{document}
\func{-4-4}
\func{_4_4}
\end{document}

相关内容