我怎样才能将粗体重新定义为“半粗体”?

我怎样才能将粗体重新定义为“半粗体”?

我正在使用支持半粗体 ( sb) 字体的字体系列,并且我希望在\textbf需要时使用它。我该如何重新定义\textbf才能做到这一点?我可以针对每个系列执行此操作,还是一次仅针对文档中的所有系列执行此操作?

答案1

字体通过五个属性来识别:

  1. 编码
  2. 家庭
  3. 系列(重量)
  4. 形状
  5. 尺寸

对于前四个属性,LaTeX 保留“默认”定义,包含在

  1. \encodingdefault
  2. \familydefault
  3. \seriesdefault
  4. \shapedefault

还有其他命令

  • 家庭默认值:\rmdefault,,\sfdefault\ttdefault
  • 系列默认值:\mddefault\bfdefault
  • 形状默认值:\updefault,,,\itdefault\sldefault\scdefault

当您调用\bfseries(或\textbf,内部调用\bfseries)时,LaTeX 会查看\bfdefault,其正常定义是

\newcommand{\bfdefault}{bx}

并且不会改变任何其他属性。

在较低级别上,LaTeX 还保持

  1. \f@encoding
  2. \f@family
  3. \f@series
  4. \f@shape
  5. \f@size\f@baselineskip

您的问题似乎在于无衬线字体系列具有“半粗体”形状,您希望在调用时选择该形状\bfseries,但罗马字体和打字机字体系列却没有。

如下定义

\makeatletter
\renewcommand{\bfdefault}{\ifx\f@family\sfdefault sb\else bx\fi}
\makeatother

会做正确的事情,除非你在切换到粗体字后调用更改家庭的命令。所以

\textrm{\textbf{x}}

可以工作,但是\textbf{\textrm{x}}不可以。

另一种方法是使用\DeclareFontShapeDavid Carlisle 解释的方法

\renewcommand{\bfdefault}{sb}
\DeclareFontShape{\encodingdefault}{\rmdefault}{sb}{n}
    {<->ssub*\rmdefault/bx/n}{}
\DeclareFontShape{\encodingdefault}{\rmdefault}{sb}{sl}
    {<->ssub*\rmdefault/bx/sl}{}

打字机字体系列也是如此。

如果您使用的话,fontspec情况会完全不同,因为您可以根据家庭情况修复粗体变体,如 rdhs 所解释的那样。

答案2

如果您已在使用fontspec,只需调整BoldFont每个家庭的设置:

\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
\setmainfont[BoldFont="Minion Pro Semibold"]{Minion Pro}
\setsansfont[BoldFont="Myriad Pro Semibold"]{Myriad Pro}

答案3

全局范围内你可以覆盖默认定义

 \newcommand\bfdefault{bx}

\renewcommand\bfdefault{sb}

对于单个面部来说,最简单的方法可能是使用像这样的命令(来自基础 ot1cmtt.fd 文件)

\DeclareFontShape{OT1}{cmtt}{bx}{n}
  {<->ssub*cmtt/m/n}{}

用非粗体 tt 字体替代粗体版本,只需调整您想要更改的字体系列的参数。

相关内容