在我的文档中,我经常将大写单词和缩写设置为小写,因为这样可以避免打断流程(大写单词会打断流程)。此外,许多单词(例如CUDA
)也是作为命令输入的,而不是直接作为文本输入。
到目前为止,我已在适当的位置手动将这些单词设置为小写字母(如\textsc{\cuda}
),但这会变得不必要地重复。我希望能够做的是定义一个命令,如在文本“模式”为普通罗马字母时以小写字母\cuda
打印CUDA
,CUDA
在文本模式为斜体时设置为大写字母。这样做的原因是我正在使用的字体不支持斜体小写字母。
因此,我希望能够检测当前正在使用哪种文本“模式”,并采取相应的行动。
下面我举了一个简单例子来说明我的观点:
\documentclass{article}
\usepackage{textcase}
\newcommand{\cudaString}{CUDA}
\newcommand{\cuda}{\textsc{\MakeTextLowercase{\cudaString}}}
\begin{document}
Set \cuda in small caps here,
\itshape but do not set \cuda in small caps here.
\end{document}
答案1
LaTeX 的“新字体选择方案”(NFSS)将字体信息存储在多个宏中。宏\f@shape
存储形状:n
直立、it
斜体和sc
小型大写字母。\f@series
存储系列:m
中等粗细和bx
粗体,同时\f@family
存储系列:cmr
罗马字体、cmss
无衬线字体和cmtt
等宽字体(取决于当前字体)。
因此,你可以使用以下方法测试小型大写字母
\makeatletter
\newcommand*{\IfSmallCapsTF}{%
\ifx\f@shape\my@test@sc
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\newcommand*{\my@test@sc}{sc}
\makeatother
\IfSmallCapsTF{true-code}{false-code}
答案2
你可能想要伪造的斜体小型大写字体:
\makeatletter
\DeclareRobustCommand{\SCorIT}[1]{%
\ifdim\fontdimen\@ne\font>\z@
\begingroup\check@mathfonts
\fontsize\sf@size\z@\selectfont
\MakeUppercase{#1}\endgroup
\else
\textsc{#1}%
\fi
}
\makeatother
\newcommand{\cuda}{\SCorIT{cuda}}
根据字体的不同,结果可能与预期一致。请注意,对于粗体,必须添加另一个测试。
如果您使用\MakeLowercase
或文本大小写定义首字母缩略词\MakeTextLowercase
,你应该将定义修改为
\makeatletter
\DeclareRobustCommand{\SCorIT}[1]{%
\ifdim\fontdimen\@ne\font>\z@
\begingroup\check@mathfonts
\fontsize\sf@size\z@\selectfont
\let\MakeTextLowercase\@firstofone % for textcase
\let\MakeLowercase\@firstofone % for standard LaTeX
\MakeTextUppercase{#1}\endgroup
\else
\textsc{#1}%
\fi
}
\makeatother
这将避免案件变更的累积。
该示例由以下代码生成:
\documentclass{standalone}
\usepackage{textcase}
\makeatletter
\DeclareRobustCommand{\SCorIT}[1]{%
\ifdim\fontdimen\@ne\font>\z@
\begingroup\check@mathfonts
\fontsize\sf@size\z@\selectfont
\let\MakeTextLowercase\@firstofone
\MakeTextUppercase{#1}\endgroup
\else
\textsc{#1}%
\fi
}
\makeatother
\newcommand{\cudaString}{CUDA}
\newcommand{\cuda}{\SCorIT{\MakeTextLowercase{\cudaString}}}
\begin{document}
\hbox{Set \cuda{} in small caps here,\strut}
\hbox{\itshape but do not set \cuda{} in small caps here.\strut}
\end{document}
答案3
从 的定义中窃取一点\em
(使用 看到latexdef em
),我们可以创建一个命令\SCorUC
,根据上下文将其参数排版为小写或大写:
\makeatletter
\newcommand{\SCorUC}[1]{\ifdim\fontdimen\@ne\font>\z@\MakeUppercase{#1}\else\textsc{#1}\fi}
\makeatother
\newcommand{\cuda}{\SCorUC{cuda}}