检测当前正在使用哪种文本“模式”(正常、斜体、粗体等)?

检测当前正在使用哪种文本“模式”(正常、斜体、粗体等)?

在我的文档中,我经常将大写单词和缩写设置为小写,因为这样可以避免打断​​流程(大写单词会打断流程)。此外,许多单词(例如CUDA)也是作为命令输入的,而不是直接作为文本输入。

到目前为止,我已在适当的位置手动将这些单词设置为小写字母(如\textsc{\cuda}),但这会变得不必要地重复。我希望能够做的是定义一个命令,如在文本“模式”为普通罗马字母时以小写字母\cuda打印CUDACUDA在文本模式为斜体时设置为大写字母。这样做的原因是我正在使用的字体不支持斜体小写字母。

因此,我希望能够检测当前正在使用哪种文本“模式”,并采取相应的行动。

下面我举了一个简单例子来说明我的观点:

\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}}

相关内容