URW Palldio 字体(mathpazo
包)不提供粗体小写字母。为了解决这个问题,我想制作一个宏来通常使用小写字母,并在粗体文本中使用普通大写字母。
我尝试了这个代码:
\documentclass{minimal}
\usepackage[sc,osf]{mathpazo}
% Use small caps normally except in a bold font: switch to uppercase instead.
% This macro does not work: the `\ifx\f@series\bfdefault` test always fails.
\makeatletter
\DeclareRobustCommand{\mytextsc}[1]{%
\ifx\f@series\bfdefault%
\uppercase{#1}%
\else
{\scshape #1}%
\fi
}
\makeatother
% An other macro, where the same test is ok here !?
\newcommand\normal{\fontseries{\ifx\f@series\bfdefault\then m \fi}\selectfont}
\begin{document}
% this works OK
This is a \mytextsc{small caps} text.
% this fails
\textbf{This is a bold \mytextsc{upper case} text.}
% here the normal macro works
\textbf{This is a bold \mytextsc{upper \normal case} text.}
\end{document}
由于某些奇怪的原因,测试\ifx\f@series\bfdefault
在宏中总是失败\mytestsc
,尽管它在宏中运行良好\normal
。有什么想法可以纠正\mytextsc
宏吗?
答案1
2020 年更新
由于 latex 内核的变化 - 现在以更复杂的方式处理系列 - 这将不再起作用。现在最好针对\bfseries@rm
和进行测试\bfseries@sf
。也许将来还会有一个通用测试来检查一个人是否处于“粗体上下文”中。
我还建议不要使用 \uppercase,因为它无法正确处理重音符号。
\documentclass{article}
\usepackage[sc,osf]{mathpazo}
\usepackage[T1]{fontenc}
\usepackage{xparse}
\ExplSyntaxOn\makeatletter
\NewDocumentCommand{\mytextsc}{m}
{
\bool_if:nTF
{
\tl_if_eq_p:NN \f@series \bfseries@rm
||
\tl_if_eq_p:NN \f@series \bfseries@sf
}
{
\text_uppercase:n{#1}%
}
{
\textsc{#1}
}
}
\ExplSyntaxOff \makeatother
\begin{document}
This is a \textsc{small caps} \mytextsc{small caps} text.
\textbf{This is a bold \textsc{upper case} \mytextsc{upper text grüße} text.}
\sffamily
\textbf{This is a bold \textsc{upper case} \mytextsc{upper text grüße} text.}
\end{document}
旧的(过时的)答案。
\bfdefault
是一个长宏,\f@series
不是,所以两者都不同,测试总是给出 false。这也发生在你的“工作”normal
命令中,它总是给出\fontseries{m}
。在测试之前展开宏:
\DeclareRobustCommand{\mytextsc}[1]{%
\edef\@tempa{\f@series}\edef\@tempb{\bfdefault}%
\ifx\@tempa\@tempb%
\uppercase{#1}%
\else
{\scshape #1}%
\fi }
答案2
我不知道为什么\bfdefault
不能正确扩展,但你可以定义一个新的宏来做你想做的事情:
\makeatletter
\def\boldseriesname{bx}
\DeclareRobustCommand{\mytextsc}[1]{%
\ifx\f@series\boldseriesname\uppercase{#1}%
\else{\scshape #1}%
\fi}
\makeatother
答案3
根据威尔·罗伯逊:
您应该检查 Latex 警告以确保无误。