我正在使用支持半粗体 ( sb
) 字体的字体系列,并且我希望在\textbf
需要时使用它。我该如何重新定义\textbf
才能做到这一点?我可以针对每个系列执行此操作,还是一次仅针对文档中的所有系列执行此操作?
答案1
字体通过五个属性来识别:
- 编码
- 家庭
- 系列(重量)
- 形状
- 尺寸
对于前四个属性,LaTeX 保留“默认”定义,包含在
\encodingdefault
\familydefault
\seriesdefault
\shapedefault
还有其他命令
- 家庭默认值:
\rmdefault
,,\sfdefault
\ttdefault
- 系列默认值:
\mddefault
,\bfdefault
- 形状默认值:
\updefault
,,,\itdefault
\sldefault
\scdefault
当您调用\bfseries
(或\textbf
,内部调用\bfseries
)时,LaTeX 会查看\bfdefault
,其正常定义是
\newcommand{\bfdefault}{bx}
并且不会改变任何其他属性。
在较低级别上,LaTeX 还保持
\f@encoding
\f@family
\f@series
\f@shape
\f@size
和\f@baselineskip
您的问题似乎在于无衬线字体系列具有“半粗体”形状,您希望在调用时选择该形状\bfseries
,但罗马字体和打字机字体系列却没有。
如下定义
\makeatletter
\renewcommand{\bfdefault}{\ifx\f@family\sfdefault sb\else bx\fi}
\makeatother
会做正确的事情,除非你在切换到粗体字后调用更改家庭的命令。所以
\textrm{\textbf{x}}
可以工作,但是\textbf{\textrm{x}}
不可以。
另一种方法是使用\DeclareFontShape
David 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 字体替代粗体版本,只需调整您想要更改的字体系列的参数。