XeTeX:如何*全局*用另一个符号替换 ASCII 字符?

XeTeX:如何*全局*用另一个符号替换 ASCII 字符?

几个月前,我问过“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}

相关内容