仅更改无衬线字体系列的默认系列

仅更改无衬线字体系列的默认系列

我使用的是 pdfLaTeX 和支持浅色 ( l) 字体的无衬线字体系列。我想仅在调用(或) 时才替换默认的中等 ( m) 字体。l\sffamily\textsf

在下一个示例中,egreg 的解决方案仅能成功改变\mddefault罗马字体系列,但无法改变无衬线字体。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{lmodern}

\makeatletter
\renewcommand{\mddefault}{\ifx\f@family\sfdefault sbc\else bx\fi}
\makeatother

\setlength\parskip{\baselineskip}\setlength\parindent{0pt}

\begin{document}

\textrm{The brown fox jumps over the lazy dog}                 \\
{\usefont{T1}{lmr}{m}{n}The brown fox jumps over the lazy dog} \\ % medium
{\usefont{T1}{lmr}{b}{n}The brown fox jumps over the lazy dog} \\ % bold
{\usefont{T1}{lmr}{bx}{n}The brown fox jumps over the lazy dog}   % bold expanded

\textsf{The brown fox jumps over the lazy dog}                   \\
{\usefont{T1}{lmss}{sbc}{n}The brown fox jumps over the lazy dog}\\ % semi bold condensed
{\usefont{T1}{lmss}{m}{n}The brown fox jumps over the lazy dog}  \\ % medium
{\usefont{T1}{lmss}{bx}{n}The brown fox jumps over the lazy dog}    % bold expanded

\end{document}

在此处输入图片描述

然后我尝试使用\DeclareFontShape,但总是得到相同类型的错误。例如,使用第 425 页的示例LaTeX 伴侣

\documentclass{article}

\DeclareFontShape{0T1}{cmss}{m}{it}{ <-> sub * cmss/m/sl }{} 

\begin{document}
text
\end{document}

我收到错误:

在此处输入图片描述

答案1

有许多问题需要解决。首先,\mddefault以这种方式重新定义无济于事,\mddefault因为不是作为 的一部分执行\sffamily。第二个是传统的难题,由某些命令\long在上下文中而不\long在其他上下文中引起。

一种可能的解决方法是重新定义\curr@fontshape,它为 LaTeX 提供当前字体属性,以供 NFSS 稍后处理。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{pdftexcmds}
\renewcommand{\sfdefault}{SourceSansPro-LF}

\makeatletter
\def\curr@fontshape{%
  \f@encoding/\f@family/%
  \ifnum\pdf@strcmp{\f@series}{\mddefault}=\z@
    \ifnum\pdf@strcmp{\f@family}{\sfdefault}=\z@
      l%
    \else
      \f@series
    \fi
  \else
    \f@series
  \fi/\f@shape}
\makeatother

\begin{document}
\sffamily abcdef

\rmfamily abcdef
\end{document}

我使用 Source Sans Pro,因为它有“浅色”系列。如果需要根据当前系列更改其他字体属性,则需要进行更多测试。

在此处输入图片描述

答案2

我会使用\DeclareFontShape路线。主要问题是,您必须先知道系列(和编码),然后才能使用该命令。实现此目的的最简单方法是调用字体。因此,在上面的示例中,您可以使用以下命令将 m 系列替换为 sbc:

\usepackage{lmodern}
\sffamily %to make lmss known.
\DeclareFontShape{T1}{lmss}{m}{n}{ <-> sub * lmss/sbc/n }{}

您还可以复制T1lmss.fd并命名为例如,T1lmssl.fd然后根据自己的喜好将所有内容更改lmsslmssl并声明,然后用作lmssl无衬线字体系列。

相关内容