如果没有小写字母,请使用 \fauxsc

如果没有小写字母,请使用 \fauxsc

这是如果没有小写字母,请使用 \fauxsc

我需要使用 Chivo 字体,但由于未知原因,当microtype使用包时,只有第一次调用\textsc才能按预期工作。

此外,有没有办法扩展\fauxsc宏以使其能够适应数学?

以下是 MWE:

\documentclass{article}

\usepackage{graphicx}
\usepackage[familydefault]{Chivo}
\usepackage{microtype}

\let\textsc\relax
\DeclareRobustCommand{\textsc}[1]{%
  \sbox0{x\xdef\testA{\the\font}}%
  \sbox0{\scshape x\xdef\testB{\the\font}}%
  \ifx\testA\testB\fauxsc{#1}\else{\scshape #1}\fi
}

\makeatletter
\newlength\fake@f
\newlength\fake@c
\def\fakesc#1{%
  \begingroup
  \xdef\fake@name{\csname\curr@fontshape/\f@size\endcsname}%
  \fontsize{\fontdimen8\fake@name}{\baselineskip}\selectfont
  \MakeUppercase{#1}%
  \endgroup
}
\makeatother
\newcommand\fauxsc[1]{\fauxschelper#1 \relax\relax}
\def\fauxschelper#1 #2\relax{%
  \fauxschelphelp#1\relax\relax
  \if\relax#2\relax\else\ \fauxschelper#2\relax\fi
}
\def\Hscale{.83}\def\Vscale{.72}\def\Cscale{1.00}
\def\fauxschelphelp#1#2\relax{%
  \ifnum`#1>``\ifnum`#1<`\{\scalebox{\Hscale}[\Vscale]{\uppercase{#1}}\else
    \scalebox{\Cscale}[1]{#1}\fi\else\scalebox{\Cscale}[1]{#1}\fi
  \ifx\relax#2\relax\else\fauxschelphelp#2\relax\fi}


\begin{document}

With \verb+\testsc+

\textsc{Abc def}

\textsc{Ghi jkl} % Incorrect output when package microtype is used

\bigskip

\verb+\fauxsc+

\fauxsc{Abc def}

\fauxsc{Ghi jkl}

\bigskip

% \textsc{Case $x$ is odd} % Math (in this case, $x$) produces an error

\end{document}

在此处输入图片描述

答案1

首先,我同意 @egreg 的评论,认为仿小写字母一点也不美观,我根本不建议使用它们。话虽如此,以下是发生的情况和解决方法:

该问题是 pdflatex 字体扩展的副作用,它导致字体不一致(就\ifx)。我已经报告了这个问题这里一年前,但目前还不清楚是否会采取任何措施来解决这个问题,或者是否应该将其视为一个错误。

不过,有一个简单的解决方案,Hans 在上面提到的线程中提出了这个解决方案,那就是比较\fontname\font而不是\the\font,因此:

\DeclareRobustCommand{\textsc}[1]{%
  \sbox0{x\xdef\testA{\fontname\font}}%
  \sbox0{\scshape x\xdef\testB{\fontname\font}}%
  \ifx\testA\testB\fauxsc{#1}\else{\scshape #1}\fi
}

应该产生正确的(虽然不好看)仿小型大写字母。

相关内容