使用 fontspec 或 XeTeX 命令替换字体中的某些字符

使用 fontspec 或 XeTeX 命令替换字体中的某些字符

这个问题听起来有点奇怪,但其实是有原因的。有没有办法fontspecXeTeX 命令只影响一种情况的字母——比如小写字母?例如,假设你想用另一种字体的小写字母替换一种字体中的所有小写字母。我认为答案可能与 David Carlisle 的答案有些相似:在 xelatex 中替换单个字母。有没有简单的方法可以做到这一点,还是需要逐个字符地完成?我对文本模式感兴趣。David 已经向我展示了如何在数学模式下做到这一点。我正在使用 OpenType 文本字体。

答案1

填写所有您认为的“小写”内容。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{Libertinus Serif}

\newfontfamily{\LCL}{Futura}% Lower Case Letters


\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\LOWERCASELETTERS

\count255=\numexpr`a-1\relax
\loop\ifnum\count255<`z
  \advance\count255 by 1
  \XeTeXcharclass \count255 \LOWERCASELETTERS
\repeat

\XeTeXinterchartoks 0 \LOWERCASELETTERS {\begingroup\LCL}
\XeTeXinterchartoks \LOWERCASELETTERS 0 {\endgroup}
\XeTeXinterchartoks 4095 \LOWERCASELETTERS {\begingroup\LCL}
\XeTeXinterchartoks \LOWERCASELETTERS 4095 {\endgroup}

\begin{document}

Some text AbCdE.

\end{document}

在此处输入图片描述

如果只想替换主字体,可以按如下方式修改。

\documentclass{article}
\usepackage{fontspec}

\setmainfont{Libertinus Serif}[
  NFSSFamily=mainfont,
]

\newfontfamily{\LCL}{Futura}% Lower Case Letters


\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\LOWERCASELETTERS

\count255=\numexpr`a-1\relax
\loop\ifnum\count255<`z
  \advance\count255 by 1
  \XeTeXcharclass \count255 \LOWERCASELETTERS
\repeat

% some syntactic sugar
\ExplSyntaxOn
\NewDocumentCommand{\replacemainfont}{}
 {
  \str_if_eq:eeT { \use:c { f@family } } { mainfont } { \LCL }
 }
\ExplSyntaxOff

\XeTeXinterchartoks 0 \LOWERCASELETTERS {\begingroup\replacemainfont}
\XeTeXinterchartoks \LOWERCASELETTERS 0 {\endgroup}
\XeTeXinterchartoks 4095 \LOWERCASELETTERS {\begingroup\replacemainfont}
\XeTeXinterchartoks \LOWERCASELETTERS 4095 {\endgroup}

\begin{document}

Some text AbCdE.

\textsf{Some text AbCdE.}

\texttt{Some text AbCdE.}

\end{document}

在此处输入图片描述

相关内容