假设有一个自定义类,由于包titlesec
,它以大写形式打印部分标题。假设现在此类的用户希望单色字体为Scale = MatchLowercase
。如果部分标题同时包含主字体和单色字体,则后者看起来太小(请参阅下面的 MCE)。
如果\titleformat{\section}{...}
包含\setmonofont[Scale = MatchUppercase]{⟨chosen mono font⟩}
单色字体的大小,那就没问题了,但显然,该类无法预测用户选择的⟨单色字体⟩,所以这是一条死路。所以我尝试了\defaultfontfeatures[\ttfamily]{Scale = MatchUppercase}
不需要指定⟨单色字体⟩的类,但没有任何效果。
所以我的问题是:是否可以在不指定其名称的情况下在本地更改⟨所选单色字体⟩的比例?
默认情况下或使用\defaultfontfeatures[\ttfamily]{Scale = MatchUppercase}
: 看起来不太好
\begin{filecontents*}[overwrite]{myclass.cls}
\ProvidesExplClass
{myclass}
{2021/06/08}
{0.1}
{
My Nice Class
}
\NeedsTeXFormat{LaTeX2e}
\LoadClass { article }
%
\RequirePackage{fontspec}
\RequirePackage{titlesec}
%
\AddToHook{begindocument/before}{%
\titleformat{\section}{
\normalfont
\Large
% \setmonofont[Scale = MatchUppercase]{RobotoMono}
% \defaultfontfeatures[\ttfamily]{Scale = MatchUppercase}
\bfseries
\text_uppercase:n
}{\thesection}{1em}{}{}
}
\end{filecontents*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{myclass}
\setmainfont{KpRoman}
\setsansfont{KpSans}
\setmonofont[Scale = MatchLowercase]{RobotoMono}
\begin{document}
Foo\texttt{bar}OOf
\section{Foo\texttt{bar}OOf}
\end{document}
:\setmonofont[Scale = MatchUppercase]{⟨chosen mono font⟩}
看起来不错,但不现实
\begin{filecontents*}[overwrite]{myclass.cls}
\ProvidesExplClass
{myclass}
{2021/06/08}
{0.1}
{
My Nice Class
}
\NeedsTeXFormat{LaTeX2e}
\LoadClass { article }
%
\RequirePackage{fontspec}
\RequirePackage{titlesec}
%
\AddToHook{begindocument/before}{%
\titleformat{\section}{
\normalfont
\Large
\setmonofont[Scale = MatchUppercase]{RobotoMono}
% \defaultfontfeatures[\ttfamily]{Scale = MatchUppercase}
\bfseries
\text_uppercase:n
}{\thesection}{1em}{}{}
}
\end{filecontents*}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{myclass}
\setmainfont{KpRoman}
\setsansfont{KpSans}
\setmonofont[Scale = MatchLowercase]{RobotoMono}
\begin{document}
Foo\texttt{bar}OOf
\section{Foo\texttt{bar}OOf}
\end{document}
答案1
一种方法是定义一个新的字体系列,也许
\newfontfamily\alttt{RobotoMono}[Scale=MatchUppercase]
\DeclareTextFontCommand\textalttt{\alttt}
這可以讓你寫入\section{Foo\textalttt{bar}OOf}
。
或者,您也可以\addfontfeature
像下面这样:
\DeclareTextFontCommand\textrescale{\addfontfeature{Scale=MatchUppercase}}
然后你就可以写了\section{Foo\texttt{\textrescale{bar}}OOf}
。
更复杂的解决方案是将当前等宽缩放比例保存在变量中,例如\ttscale
,然后重新定义\ttfamily
为应用\addfontfeature{Scale=\ttscale}
。考虑一下是否值得这样做。