Можно ли использовать другой шрифт всякий раз, когда в тексте встречается заглавная/верхняя буква?
Итак, если у меня есть предложение «Это какой-то текст», то я бы хотел, чтобы первая буква T была написана другим шрифтом, чем остальной текст.
Если у меня есть предложение «Это какой-то текст с аббревиатурой GMT», то я бы хотел, чтобы первые буквы T и GMT были бы отличны от остальных.
Аналогично, для фразы «Это текст, содержащий имя собственное: Лондон», я бы хотел, чтобы первые буквы T и L были разными шрифтами.
Я делюсь скриншотом того эффекта, который мне бы хотелось.
Мне нужно сделать это для всего документа (возможно, для нескольких глав). Поэтому я надеюсь найти способ сделать это автоматически, без необходимости менять каждую букву по отдельности.
решение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}
Вот результат.