我使用的是 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
然后根据自己的喜好将所有内容更改lmss
为lmssl
并声明,然后用作lmssl
无衬线字体系列。