如果这个问题已经有人问过了,我很抱歉,但是搜索了大约 2 个小时后,我没有找到任何东西。
因此,我使用的是希腊 Linux Libertine 字体,它不提供小型大写字母,这意味着我必须定义命令\fauxsc{}
,如 egreg 所建议的那样这里。每当我将其用作 时,它都会正常工作\fauxsc{Text text text}
。但是,当我必须将其用作样式时(例如,如果我想在章节名称中使用小型大写字母,因此必须重新定义\titleformat{\chapter}
),它就无法工作,因为它需要文本作为参数。
换句话说,如果\fauxsc{...}
是 的替代方案\textsc{...}
,那么我正在寻找 的替代方案\scshape
。
答案1
欢迎!如果您提出此问题的原因是想要将其用作\textsc
章节标题,则可以使用explicit
此处的选项将标题文本包装在宏中。
\documentclass{article}
\usepackage[explicit]{titlesec}
\usepackage{graphicx}
\usepackage{plex-serif}
\usepackage{roboto}
% from https://tex.stackexchange.com/a/499046/194703
\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}
% explicit title format
\titleformat{name=\section}
[block]
{\large}
{\thesection}
{10pt}
{ \textsc{#1}}
[]
\begin{document}
\section{A Test Section}
\end{document}
请注意,如果您也想在目录中使用它,您也需要使用titletoc
并指示它使用\textsc
。请参阅这里举一个具体的例子。