我正在使用 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 字符(但我猜这并不是什么问题)。