如果缺少小型大写字母,则自动恢复为全大写

如果缺少小型大写字母,则自动恢复为全大写

如果我使用\textsc{xyz}没有小写字母的字体(例如 Latin Modern Sans),结果将以小写字母排版。是否可以自动恢复为全大写?我无法手动执行此操作,因为我想在宏中使用小写字母。

\documentclass{article}

\begin{document}
\newcommand{\acronym}[1]{\textsc{#1}}

\acronym{abc} is an acronym.

\begin{description}
\item [\textsc{\acronym{abc}}] Trying to use \textbackslash{}acronym with LM Sans
\item[ABC] This is what it should look like
\end{description}
\end{document}

在此处输入图片描述

答案1

我最初的回答让 OP 参考了我的\fauxsc宏,但这不是 OP 想要的。重要的是,OP 希望自动识别字体中小写字母的可用性。

因此,我修改了答案,以\detectsc检测是否存在小写字母。它的工作原理是假设\textsc在没有小型大写字母的情况下,调用 会转换为等效\textup的。为了检测这种情况,它会在两个相应的框中放置\textsc{i}\textup{i}。然后比较这两个框的宽度和高度。如果它们相同,则小型大写字母一定缺失,因此\let\textsc\uppercase,这是 OP 在没有小型大写字母字体的情况下所期望的行为。

REEDITED,因此如果 检测到有效的 sc 字体\detectsc,则 的原始定义\textsc将恢复或保持不变,视情况而定。如果 sc 在一个字体系列中有效,但在另一个字体系列中无效,这一点很重要。

这是我的 MWE,可以在 pdflatex(使用 lmodern)和 xelatex(使用 Myriad Pro)下编译,得到两种不同的结果:

\documentclass{article}

\usepackage{ifxetex}

\ifxetex
  \def\compiler{XeLaTeX}
  \usepackage{fontspec}
  \defaultfontfeatures{Mapping=tex-text}
  \setsansfont{Myriad Pro}
\else
  \def\compiler{pdfLaTeX}
  \usepackage{lmodern}
  \usepackage[T1]{fontenc}
\fi

\let\svtextsc\textsc

\newcommand\detectsc{%
  \setbox0=\hbox{\textsc{i}}%
  \setbox2=\hbox{\textup{i}}%
  \let\textsc\svtextsc%
  \ifdim\wd0=\wd2\ifdim\ht0=\ht2\let\textsc\uppercase\fi\fi
}

\begin{document}
Compiler: \compiler
\sffamily
%\itshape% ALSO WORKS IF ITSHAPE ACTIVATED

\detokenize{\sffamily:}\par
\textsc{Abc} before \detokenize{\detectsc}\par
\detectsc \textsc{Abc} after \detokenize{\detectsc}\par
Resetting \detokenize{\textsc}\rmfamily\let\textsc\svtextsc\par
\detokenize{\rmfamily:}\par
\textsc{Abc} before \detokenize{\detectsc}\par
\detectsc \textsc{Abc} after \detokenize{\detectsc}
\end{document}

\textsc这里(使用 lmodern)检测和之间的区别\textup,它保持\textsc完整。

在此处输入图片描述

但在 xelatex (使用 Myriad Pro sans) 下,它检测不到和\sffamily之间的区别,因此它重新定义为。然而,在中,它将恢复或保留完整的定义。\textup\textsc\textsc\uppercase\rmfamily\textsc{}

在此处输入图片描述

相关内容