我可能应该提前说,这个问题是纯粹出于残忍的动机,如果无法回答或只是愚蠢,也提前道歉。我已经想到,当我输入 时NO
,XeLaTeX 应该用字符 № 替换它。这很容易实现:我只需复制映射tex-text
并添加连字。
LHSName "Numero"
RHSName "UNICODE"
pass(Unicode)
; establish numero ligature
U+004E U+004F > U+2116 ; NO
; ligatures from Knuth's original CMR fonts
[...]
然而,这样做之后,我发现我最喜欢的字体不包含数字字符。因此,为了使其工作,每次输入时我都需要切换字体NO
。除了手动操作外,我能想到的唯一解决方案是使 Unicode 数字处于活动状态,并像这样定义它:
\catcode`\№=\active
\def №{{\fontspec[Mapping=numero]{Mshtakan}NO}}
这种方法效果不错,而且不是最糟糕的解决方案。但它需要进行比我理想中更多的不方便的复制和粘贴,违背了连字定义的目的。我想,在理想的世界中,我可以删除字体映射更改并将序列“NO”定义为活动,然后执行如下操作:
\catcode`\NO=\active
\def NO{{\fontspec{Mshtakan}\char"2116}}
但是,如果存在激活两个连续字符的文档,那么一些相当激进的谷歌搜索并没有找到它。唯一想到的其他解决方案是用数字符号替换一个很少使用但可以输入的字符,但这似乎很草率。
我将非常感激任何建议。不过我怀疑我要么忽略了一些显而易见的令人尴尬的事情,要么试图强迫 TeX 做一些它根本不适合做的事情。
编辑并添加:
在我发布这篇文章之后,我发现一个非常相似的问题在这些论坛中。看起来另一种任意更改单个字符字体的方法是调整答案就在那里。以下是我得到的结果:
\XeTeXinterchartokenstate=1 % enable character classes
\newXeTeXintercharclass\CharNumero % create a new class
\XeTeXcharclass `№ \CharNumero % add № to the class
% Between any character of class 0 ["most characters are class 0 by default"] and \CharNumero change the font:
\XeTeXinterchartoks 0 \CharNumero = {\begingroup\fontspec{Mshtakan}}
% Between \CharNumero and any character end the group:
\XeTeXinterchartoks \CharNumero 0 = {\endgroup}
% Between a word boundary and \CharNumero change the font:
\XeTeXinterchartoks 255 \CharNumero = {\begingroup\fontspec{Mshtakan}}
% Between \CharNumero and a word boundary end the group:
\XeTeXinterchartoks \CharNumero 255 = {\endgroup}
虽然我最终使用了下面给出的答案,但因为我想NO
生成符号,所以如果有人遗漏了另一个字符,这可能会有用。
答案1
我看不出这有什么意义。不过,你可以测试 N 后面的下一个字符:
\documentclass{article}
\usepackage{fontspec}
\newfontface\Msh{Mshtakan}
\begin{document}
\makeatletter
\catcode`\N=\active
\def N{\@ifnextchar{O}{{\Msh\char"2116}\@gobble}{\string N}}
\makeatother
foo NO NOT No
\end{document}
答案2
满足您需求的最简单方法是
\usepackage{newunicodechar}
\newunicodechar{№}{{\mshtakan №}}
说完之后
\newfontfamily{\mshtakan}{Mshtakan}
这比每次调用更有效率\fontspec
。不需要花哨的地图文件。
然后你就可以正常输入了
foo №123