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

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

我倾向于使用 IBM Plex 字体,该字体没有小型大写字母 - 因此当我尝试使用时收到此消息\textsc字体形状T1/IBMPlexSerif-TLF/m/fscn' undefined (Font) using改为“T1/IBMPlexSerif-TLF/m/n”。

为了解决这个问题我使用\fauxsc使用 XeTeX/fontspec 伪造小型大写字母?),它似乎在pdflatex中起作用。

不过,真正时髦的做法是扩展\textsc这样的功能,当字体有小写字母时,它就使用小写字母;如果没有小写字母(例如 IBM Plex 中发生的情况),它不会给出错误,而是自动地切换到使用\fauxsc

这种事可能吗?

答案1

这是一个可能的解决方案,但如果您确实需要小型大写字母,请使用具有小型大写字母的字体。

\documentclass{article}
\usepackage{graphicx}
\usepackage{plex-serif}
\usepackage{roboto}

\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}

\textsc{Abc def}

\sffamily % this has true small caps

\textsc{Abc def}

\end{document}

这个想法是比较如果\scshape应用了,会选择哪种字体。如果 LaTeX 执行替换,\testA\testB两者都指向相同的字体。

在此处输入图片描述

相关内容