本地更改所选(单色)字体的比例而不指定其名称?

本地更改所选(单色)字体的比例而不指定其名称?

假设有一个自定义类,由于包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}。考虑一下是否值得这样做。

相关内容