假设我已经打开了“自由”连字,\fontspec[Ligatures=Rare]{Junicode}
但想要禁用 st 和 ct 连字;这可能吗?
答案1
在 TeX 中,可以通过在字母之间插入显式字距来拆分连字。例如,为了避免st
连字,我们可以s\kern0pt t
改为书写。虽然这很繁琐,但幸运的是xetex
提供了字符类的概念,它提供了在字符之间插入自定义标记的可能性,这些标记先前已分配给某个类。
我们继续定义两个类,一个用于c
和s
,一个用于t
:
\newXeTeXintercharclass\charclasscs
\newXeTeXintercharclass\charclasst
然后我们将角色分配给这些类别
\XeTeXcharclass`\c\charclasscs
\XeTeXcharclass`\s\charclasscs
\XeTeXcharclass`\t\charclasst
如果字符组合中左字符属于类\charclasscs
,右字符属于类\charclasst
,那么我们要插入字距\kern0pt
\XeTeXinterchartoks\charclasscs\charclasst={\kern0pt}
最后我们启用以下功能
\XeTeXinterchartokenstate=1 % or 0 to disable
完整的例子如下:
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Ligatures=Rare]{Junicode.ttf}
\newXeTeXintercharclass\charclasscs
\newXeTeXintercharclass\charclasst
\XeTeXcharclass`\c\charclasscs
\XeTeXcharclass`\s\charclasscs
\XeTeXcharclass`\t\charclasst
\XeTeXinterchartoks\charclasscs\charclasst={\kern0pt}
\begin{document}
st ct
\XeTeXinterchartokenstate=1
st ct
\end{document}
要恢复连字符,你必须使用更复杂的方法
\XeTeXinterchartoks\charclasscs\charclasst={%
\penalty10000\discretionary{-}{}{\kern0pt}%
\penalty10000\hskip0pt\relax}
为了完整起见,这里使用luatex
和selnolig
包裹。
\documentclass{article}
\pagestyle{empty}
\usepackage{fontspec,selnolig}
\setmainfont[Ligatures=Rare]{Junicode.ttf}
\nolig{ct}{c|t}
\nolig{st}{s|t}
\begin{document}
st ct
\end{document}