使用 mathpazo 包编写粗体小写字母

使用 mathpazo 包编写粗体小写字母

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 警告以确保无误。

相关内容