![XeTeX:如何*全局*用另一个符号替换 ASCII 字符?](https://linux22.com/image/479687/XeTeX%EF%BC%9A%E5%A6%82%E4%BD%95*%E5%85%A8%E5%B1%80*%E7%94%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%AC%A6%E5%8F%B7%E6%9B%BF%E6%8D%A2%20ASCII%20%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
几个月前,我问过“EB Garamond”字体是否包含字母的短拱形版本f
。我现在已经找到了如何访问这封信的方法,因为它确实存在。写作
\newcommand\fshort{\XeTeXglyph\the\XeTeXglyphindex "f.short" \relax}
可以通过写信来访问这封信\fshort
。
写作
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myreplace}{m}
{
\tl_set:Nn \l__maxd_argument_tl { #1 }
\tl_replace_all:Nnn \l__maxd_argument_tl { f } { \fshort }
\tl_use:N \l__maxd_argument_tl
}
\tl_new:N \l__maxd_argument_tl
\ExplSyntaxOff
f
当文本被 包含时,将被替换为其短拱版本\myreplace{}
。
然而,这并不方便。我想全球f
用短拱形替换每个字符f
。
我已经尝试使用 catcodes,但是对于(某些) ASCII 字符它们不起作用。这个答案包含西里尔字符的程序运行良好:
\catcode`\Ё=\active
\defЁ{E}
\catcode`\ё=\active
\defё{e}
但是写类似的东西
\catcode`\f=\active
\deff{\fshort}
或者
\catcode`\f=\active
\def f{\fshort}
不起作用。此外这个问题没有解决我的问题。
大卫卡莱尔的解决方案有效!
如果您还想Q.short
与结合使用f.short
,请使用以下代码,并且必须按以下顺序编写:
\newcommand\fshortgobble[1]{\XeTeXglyph\the\XeTeXglyphindex "f.short" \relax}
\newXeTeXintercharclass\fclass
\XeTeXcharclass `f =\fclass
\XeTeXinterchartoks 0 \fclass {\fshortgobble}
\XeTeXinterchartoks \fclass \fclass {\fshortgobble}
\XeTeXinterchartoks 4095 \fclass {\fshortgobble}
\newcommand\Qshortgobble[1]{\XeTeXglyph\the\XeTeXglyphindex "Q.short" \relax}
\newXeTeXintercharclass\Qclass
\XeTeXcharclass `Q =\Qclass
\XeTeXinterchartoks 0 \Qclass {\Qshortgobble}
\XeTeXinterchartoks \Qclass \Qclass {\Qshortgobble}
\XeTeXinterchartoks 4095 \Qclass {\Qshortgobble}
答案1
你可以使用字符类
\documentclass{article}
\usepackage{fontspec}
\newcommand\fshortgobble[1]{\XeTeXglyph\the\XeTeXglyphindex "f.short" \relax}
\newXeTeXintercharclass\fclass
\XeTeXcharclass `f =\fclass
\XeTeXinterchartoks 0 \fclass {\fshortgobble}
\XeTeXinterchartoks \fclass \fclass {\fshortgobble}
\XeTeXinterchartoks 4095 \fclass {\fshortgobble}
\begin{document}
\setmainfont{EB Garamond}
f ff difficult football diff biff fence
\XeTeXinterchartokenstate=1
f ff difficult football diff biff fence
\end{document}