抑制 XeLaTeX 中的特定连字符

抑制 XeLaTeX 中的特定连字符

有没有办法选择性地禁用 XeLaTex 中的特定连字符?我不知道怎么做。selnolig 包似乎可以满足我的需要,但我甚至不知道如何在 Mac 上将 Lualatex 与我的 Texshop 设置一起使用。

具体来说:我正在使用 XeLaTex,刚开始使用它,并试图弄清楚如何设置一些标准模板供我自己使用,例如学术论文。我主要使用 Linux Libertine O。我在使用 Adob​​e Caslon Pro 时遇到了同样的问题。

原因:我讨厌“Th”连字,尤其是在标题中。我从未在印刷品中看到过它。例如,《纽约客》杂志使用 Caslon,大多数连字都设置了,但从来没有 Th。我也从未在书中看到过它。(我知道这很挑剔)。

答案1

假设你能弄清楚如何在 TeXshop 中使用 LuaLaTeX 而不是 XeLaTeX(其实这并不是一个困难的转变),你确实可以使用该selnolig包来抑制Th连字全球贯穿整个文档。请考虑以下示例(在 TeXshop 下编译,从下拉菜单中选择“LuaLaTeX”):

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Adobe Caslon Pro}
\usepackage{selnolig}
\nolig{Th}{T|h} % suppress "Th" ligature globally
\begin{document}
The There They Then (Th-ligature disabled)

vs.
\selnoligoff %% suspend operation of selnolig's rules

The There They Then (Th-ligature re-enabled)
\end{document}

答案2

据我所知,没有官方方法可以禁用特定连字符。有两种解决方法:定义新映射(如 egreg 建议的那样)或使用该XeTeXinterchartokenstate机制。

我更喜欢后者。我首先定义两个字符类:FirstClassforTSecondClassfor h

\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\FirstClass
\XeTeXcharclass`T\FirstClass
\newXeTeXintercharclass\SecondClass
\XeTeXcharclass`h\SecondClass

T然后我指示 XeTeX 在和之间插入零尺寸粘连h

\XeTeXinterchartoks\FirstClass\SecondClass={\penalty\@M\hskip\z@}

请注意,我使用的是\hskip,它插入粘连,而不是\kern,它插入字距,因为后者有禁用连字的副作用。然而,粘连允许换行,我通过插入惩罚来禁用它。

T和 之间不会应用任何字距调整h,因此您可能需要调整粘合的宽度。

答案3

这是最不棘手的解决方案,但对我来说,它多次奏效。在编译之前,搜索并替换所有Th\Th带有尾随空格),用

\newcommand*\Th{T\kern0pt h}

这看起来可能不那么有趣,但我认为这已经足够了(它不会真正用大量的宏污染你的源代码,只是\Th偶尔而已)。

答案4

在 Linux Libertine 中,Th 连字符是基本连字符之一,因此您要么禁用它们全部,要么获得它。

一个解决方法是加载一个特殊的映射。复制tex-text.map你在 TeX 发行版中找到的文件并重命名tex-text-noth.map,添加一行底线,使其变成

; TECkit mapping for TeX input conventions <-> Unicode characters

LHSName "TeX-text-noth"
RHSName "UNICODE"

pass(Unicode)

; ligatures from Knuth's original CMR fonts
U+002D U+002D           <>  U+2013  ; -- -> en dash
U+002D U+002D U+002D    <>  U+2014  ; --- -> em dash

U+0027          <>  U+2019  ; ' -> right single quote
U+0027 U+0027   <>  U+201D  ; '' -> right double quote
U+0022           >  U+201D  ; " -> right double quote

U+0060          <>  U+2018  ; ` -> left single quote
U+0060 U+0060   <>  U+201C  ; `` -> left double quote

U+0021 U+0060   <>  U+00A1  ; !` -> inverted exclam
U+003F U+0060   <>  U+00BF  ; ?` -> inverted question

; additions supported in T1 encoding
U+002C U+002C   <>  U+201E  ; ,, -> DOUBLE LOW-9 QUOTATION MARK
U+003C U+003C   <>  U+00AB  ; << -> LEFT POINTING GUILLEMET
U+003E U+003E   <>  U+00BB  ; >> -> RIGHT POINTING GUILLEMET

; disable Th
U+0054 U+0068   <>      U+0054 U+200C U+0068

然后运行

teckit_compile tex-text-noth.map

并尝试以下示例

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Mapping=tex-text-noth]{Linux Libertine O}

\begin{document}
The
\end{document}

以下是我得到的结果:

在此处输入图片描述

您可以将文件移动到您的个人 TeX 树中(或将它们放在与您的主文件相同的文件夹中);在 Unix 系统上,您应该这样tex-text-noth.maptex-text-noth.tex

mkdir -p $(kpsewhich -var-value TEXMFHOME)/fonts/misc/xetex/fontmapping/noth
cp tex-text-noth.* $(kpsewhich -var-value TEXMFHOME)/fonts/misc/xetex/fontmapping/noth/

不知道您是否使用 MiKTeX,抱歉。

相关内容