这个问题听起来有点奇怪,但其实是有原因的。有没有办法fontspec
XeTeX 命令只影响一种情况的字母——比如小写字母?例如,假设你想用另一种字体的小写字母替换一种字体中的所有小写字母。我认为答案可能与 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}