如何防止变音字符与逐字字符中的下一个字符重叠?(字体特定?)

如何防止变音字符与逐字字符中的下一个字符重叠?(字体特定?)

我正在使用 Xetex 制作一份包含 APL 编程语言代码的文档。在该语言中,字符¯用于表示负数。问题是,当我逐字输入¯字符时,它会自动与下一个字符重叠,因为它是变音符号。我可以通过输入所有¯带有空格的实例来防止这种情况,如 中所示¯ 10。这将呈现为¯10文档中的样子,但问题是,如果有人想将代码从 PDF 复制并粘贴到终端或编辑器中,粘贴的代码将带有空格:¯ 10。这是一个语法错误。

这个问题似乎与我通过 fontspec 加载的特定字体有关。它被称为 PragmataPro,是一种商业字体,因此如果您还没有它,您可能不希望只是为了测试而获取它。

我搜索并找到了各种解决此类问题的方法,但在本例中都不起作用。我使用的是 Xetex,因此 microtype 包\DisableLigatures不是一个选项;我使用 Xetex 来获得 OpenType 支持。我尝试输入一个选项来禁用连字,如下所示:

\setmonofont[Scale=1,Ligatures=NoCommon]{PragmataPro Mono}

但失败了,我收到以下错误消息:

Package fontspec Warning: OpenType feature 'Ligatures=CommonOff' (liga) not
(fontspec)                available for font 'PragmataPro Mono' with script
(fontspec)                'CustomDefault' and language 'Default'.


Package fontspec Warning: OpenType feature 'Ligatures=CommonOff' (liga) not
(fontspec)                available for font 'PragmataPro Mono' with script
(fontspec)                'CustomDefault' and language 'Default'.


Package fontspec Warning: OpenType feature 'Ligatures=CommonOff' (liga) not
(fontspec)                available for font 'PragmataPro Mono/B' with script
(fontspec)                'CustomDefault' and language 'Default'.


Package fontspec Warning: OpenType feature 'Ligatures=CommonOff' (liga) not
(fontspec)                available for font 'PragmataPro Mono/I' with script
(fontspec)                'CustomDefault' and language 'Default'.


Package fontspec Warning: OpenType feature 'Ligatures=CommonOff' (liga) not
(fontspec)                available for font 'PragmataPro Mono/BI' with script
(fontspec)                'CustomDefault' and language 'Default'.

这些变体都是 OpenType 字体,但它们似乎不支持关闭¯连字的功能。

下面是一个代码示例,用于重现该问题——如果您恰好有 PragmataPro 字体。该问题可能特定于此字体,但如果有某种方法可以禁用逐字块内的所有连字行为,那将有所帮助。您可以尝试将标准文章类和 acmart 类与此文档一起使用,行为是相同的。删除 PragmataPro 行可以解决问题,但这是我想在文档中使用的字体。

\documentclass{article}
%\documentclass{acmart}
\usepackage{fontspec}

\setmonofont[Scale=1,Ligatures=NoCommon]{PragmataPro Mono}

\begin{document}

\begin{verbatim}
¯ 10 ← displays right, copy/paste is broken
¯10  ← displays wrong but can be copied OK
\end{verbatim}

\end{document}

答案1

字符 U+00AF MACRON 不是变音符号:在 Unicode 中,它们被归类为 COMBINING 或 MODIFIER 字符。

您的字体可能将 U+00AF 的宽度设置为零,或者具有非标准连字符。

无论哪种情况,你都可以用一个技巧让 XeTeX 让它看起来是“独立的”:

\usepackage{newunicodechar}

\newunicodechar{¯}{\makebox[0.5em][l]{¯}}

诀窍在于,在大多数等宽字体中,字符的宽度为半个 em(如果该字体不是这种情况,则可能需要进行调整)。因此,该框将为字符提供宽度并破坏可能的连字符。

请注意,这也适用于文档中的每个 U+00AF 字符(但我猜这并不是什么问题)。

相关内容