如果我使用\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{}