答案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}
這是結果。