substitutefont 结果和 \f@family

substitutefont 结果和 \f@family

有没有办法检索 的结果字体系列substitutefont,例如使用\f@family? 似乎\f@family不受\substitutefont{<encoding>}{<family>}{<new-family>}语句的影响? 但替换本身是成功的。

\documentclass{article}

\usepackage{lmodern}
\usepackage[T2A,T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{substitutefont}
\substitutefont{T2A}{lmr}{cmr}

\begin{document}
\makeatletter
T1/lmr as expected: \f@encoding/\f@family

\fontencoding{T2A}\selectfont
T2A/cmr wanted, but T2A/lmr got instead: \f@encoding/\f@family
\makeatother
\end{document}

谨致问候,伊万

编辑1

因此,根据下面的答案和更多评论,我似乎应该改变方法以便cmr从中得到\f@family

实际上,这就是我真正想要实现的(所见即所得):

  • 如果T1正在使用字体编码,lmr则应使用(和其他 LM 系列),以便\f@family也扩展为lmr
  • 如果T2A正在使用字体编码,cmr(和其他 CM 系列)应该使用以便\f@family也扩展为cmr

原来的处理方式显然不能满足斜体部分。

答案1

\split@name您可以通过切换到所需的字体并使用内核中的宏拆分其名称来获取该系列。

\documentclass{article}
\usepackage{lmodern}
\usepackage[T2A,T1]{fontenc}

\DeclareFontFamilySubstitution{T2A}{lmr}{cmr}

\makeatletter
\newcommand{\printcurrentfont}{%
  \begingroup\escapechar=\m@ne
  \expandafter\expandafter\expandafter\split@name\expandafter\string\the\font\@nil
  \begin{tabular}{ll}
  Encoding: & \f@encoding \\
  Family:   & \f@family \\
  Series:   & \f@series \\
  Shape:    & \f@shape
  \end{tabular}%
  \endgroup
}

\newcommand{\encodingfamily}[1]{%
  \begingroup
  \fontencoding{#1}\selectfont
  \expandafter\expandafter\expandafter\split@name\expandafter\string\the\font\@nil
  \f@family
  \endgroup
}
\makeatother

\begin{document}

T1: \encodingfamily{T1}; T2A: \encodingfamily{T2A}

\bigskip

\csname f@family\endcsname\qquad
\printcurrentfont

\bigskip

\fontencoding{T2A}\selectfont

\csname f@family\endcsname\qquad
\printcurrentfont

\end{document}

enter image description here

如您所见,\f@family记录默认值“lmr”,但字体使用正确的名称“cmr”。这就是为什么在利用基于通过获得的字体选择器\split@name进行重新定义的两个宏中需要组的原因。\f@...\the\font

注意:请参阅编辑历史以了解使用该包的先前解决方案substitutefont,现已宣布过时。

答案2

返回的字体系列是正确的。

LaTeX 的字体系列声明为

\DeclareFontFamily{<encoding>}{<family name>}{}

然后使用以下方式将字体分配给该系列

\DeclareFontShape{<encoding>}{<family name>}{<series>}{<shape>}{
    <-> <TeX font name>
}{}

或者

\DeclareFontShape{<encoding>}{<family name>}{<series>}{<shape>}{<->ssub * <same or other family name>/<same or other series>/<same or other shape>}{}

或类似的东西。

<->ssub表示“静默替换”。它通常用于静默地将一个字体系列替换为另一个字体系列或将一个字体形状替换为另一个字体形状。例如,

\DeclareFontShape{T1}{yrd}{m}{si}{<->ssub * yrd/m/sc}{}

用形状规范中定义的字体来替代yrd/m/sc任何尝试在 T1 编码中使用形状的yrd/m/si字体。这是因为后者不存在 - 此字体中没有小型大写斜体。因此,改用小型大写直立字体。类似地,

\DeclareFontShape{T1}{yrd}{b}{it}{<->ssub * yrd/db/it}{}
\DeclareFontShape{T1}{yrd}{bx}{it}{<->ssub * yrd/b/it}{}

导致对定义的字体进行静默替换,就像yrd/db/it调用yrd/b/ityrd/bx/it一样。这意味着当yrdT1 编码中要求使用粗体或粗体扩展斜体时,将使用半粗体。这是因为该系列只有半粗体和中等粗体,因此\bfseries不会像预期的那样表现。

现在考虑一下

\substitutefont{T2A}{lmr}{cmr}

这相当于

\DeclareFontFamily{T2A}{lmr}{}
\DeclareFontShape{T2A}{lmr}{m}{n}{<->ssub * cmr/m/n}{}
\DeclareFontShape{T2A}{lmr}{m}{it}{<->ssub * cmr/m/it}{}
\DeclareFontShape{T2A}{lmr}{m}{sl}{<->ssub * cmr/m/sl}{}
\DeclareFontShape{T2A}{lmr}{m}{sc}{<->ssub * cmr/m/sc}{}
\DeclareFontShape{T2A}{lmr}{b}{n}{<->ssub * cmr/b/n}{}
\DeclareFontShape{T2A}{lmr}{b}{it}{<->ssub * cmr/b/it}{}
\DeclareFontShape{T2A}{lmr}{b}{sl}{<->ssub * cmr/b/sl}{}
\DeclareFontShape{T2A}{lmr}{b}{sc}{<->ssub * cmr/b/sc}{}
\DeclareFontShape{T2A}{lmr}{bx}{n}{<->ssub * cmr/bx/n}{}
\DeclareFontShape{T2A}{lmr}{bx}{it}{<->ssub * cmr/bx/it}{}
\DeclareFontShape{T2A}{lmr}{bx}{sl}{<->ssub * cmr/bx/sl}{}
\DeclareFontShape{T2A}{lmr}{bx}{sc}{<->ssub * cmr/bx/sc}{}

也就是说,就 LaTeX 而言,有一个T2A/lmr系列。该系列被定义为使用与相应字体相同的字体T2A/cmr,但这并不意味着后者家庭取代前者。它意味着构建了前一个系列,并且当T2A 中cmr请求该系列的各种系列和形状时,同样属于此编码系列的字体将被默默地替换。lmr

因此,字体系列的名称被准确返回。组成该系列的字体也属于另一个字体系列这一事实并不重要,因为您已请求lmr系列,并且不是T2A 的家庭cmr

答案3

cfr 在他的回答中解释了如何\substitutefont使用 实现ssub。但即使在 之后ssub,也有一种方法可以找到替换字体的系列名称:如果实际加载的字体是由 NFSS 加载的,则字体命令看起来像\T2A/cmr/m/n/10,因此所有信息都编码在字体命令的名称中。可以通过将此名称拆分为其组件来提取它:

\documentclass{article}

\usepackage{lmodern}
\usepackage[T2A,T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage{substitutefont}
\substitutefont{T2A}{lmr}{cmr}

\def\realfamilyhelper#1/#2/#3\relax{%
  \ifx\relax#2\relax
    \GenericError{(realfamily)\space\space}{NFSS is not active, unable to get family}{}{}%
  \else
    #2%
  \fi
}
\newcommand\realfamily{%
  \expandafter\expandafter\expandafter
  \realfamilyhelper
  \expandafter\string\the\font
  //\relax
}

\begin{document}
\makeatletter
T1/lmr as expected: \f@encoding/\realfamily

\fontencoding{T2A}\selectfont
T2A/cmr as expected: \f@encoding/\realfamily
\makeatother
\end{document}

enter image description here

相关内容