![如果没有小写字母,请使用 \fauxsc](https://linux22.com/image/459620/%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E5%B0%8F%E5%86%99%E5%AD%97%E6%AF%8D%EF%BC%8C%E8%AF%B7%E4%BD%BF%E7%94%A8%20%5Cfauxsc.png)
我需要使用 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
}
应该产生正确的(虽然不好看)仿小型大写字母。