答案1
使用 XeLaTeX 编译时您可以使用该\XeTeXinterchartoks
机制。
这个想法是定义一个由拉丁大写字符组成的字符类,其十六进制字符代码为 0041(A)至 005A(Z)。
然后,定义从所有其他字符到这个新类的转换。其他字符的单词边界为 0 或 4095 类。在此转换中,您可以插入\cal
下一个大写字母作为参数。如果我理解正确的话,如果第一个字母后面有更多大写字母,则插入此宏将触发另一个转换,因此后续字母也将显示为 的参数\cal
。
MWE 主要基于XeLaTeX:如何为非拉丁文本中的拉丁文本指定不同的字体系列?和更改 Xelatex 中主字体的数字大小:
\documentclass{article}
\XeTeXinterchartokenstate = 1\relax
\newXeTeXintercharclass\ucletterclass
\ExplSyntaxOn
\int_step_inline:nnnn {"0041}{1}{"005A}
{ \XeTeXcharclass #1 = \ucletterclass }
\ExplSyntaxOff
\def\mycal#1{$\cal{#1}$}
\XeTeXinterchartoks 0 \ucletterclass = {\mycal}
\XeTeXinterchartoks 4095 \ucletterclass = {\mycal}
\begin{document}
This is some text.
This is some text with an acronym in it GMT
This is some text with a proper name in it: London
\end{document}
结果:
\XeTeXinterchartokenstate = 0\relax
请注意,如果您需要某处不变的大写字母,您可以暂时关闭转换机制。
答案2
我分享我的代码/解决方案,希望它能帮助到其他人。这是基于 Marijn 的回答和该帖子中的链接。
\documentclass[a4paper,11pt]{book}
\usepackage[default]{frcursive}
\XeTeXinterchartokenstate = 1\relax
\newXeTeXintercharclass\ucletterclass
\ExplSyntaxOn
\int_step_inline:nnnn {"0041}{1}{"005A}
{ \XeTeXcharclass #1 = \ucletterclass }
\ExplSyntaxOff
\def\mycal#1{$\cal{#1}$}
\XeTeXinterchartoks 0 \ucletterclass = {\begingroup \fontfamily{phv}\fontseries{m}\fontshape{n}\selectfont}
\XeTeXinterchartoks \ucletterclass 0 = {\endgroup}
\XeTeXinterchartoks 4095 \ucletterclass = {\begingroup \fontfamily{phv}\fontseries{m}\fontshape{n}\selectfont}
\XeTeXinterchartoks \ucletterclass 4095= {\endgroup}
\begin{document}
This is some text.
This is some text with an acronym in it GMT
This is some text with a proper name in it: London
\end{document}
结果如下。