我如何根据文本是否为 \scshape 来更改文本?

我如何根据文本是否为 \scshape 来更改文本?

创建类似宏的最简单方法是什么\ifscshape{sc case}{else}(类似于例如\ifdraft{}{}),以便

\newcommand{\cec}{\ifscshape{CEC}{\textsc{Cec}}}

In normal text, the acronym \cec{} should be printed in small caps.

\textsc{But if surrounded by small caps, \cec{} should be printed in uppercase.}

会输出类似这样的内容

在此处输入图片描述

\emph与斜体如何交互类似?


编辑:

我尝试使用\scacronym(@TiMauzi 答案中的宏的改编版),它在常规文本中非常有效,但在标题内会中断。

平均能量损失

\documentclass{scrbook}

\usepackage{microtype,xspace,libertine}

\setkomafont{disposition}{\normalcolor\rmfamily}
\addtokomafont{chapter}{\scshape\lsstyle}

\usepackage{ifthen}
\makeatletter
\newcommand{\scacronym}[1]{%
    \ifthenelse{\equal{\f@shape}{sc}}{\uppercase{#1}}{\textsc{#1}}\xspace}
\makeatother

\begin{document}
    \chapter{Shapes \& Types of \scacronym{Cec}}
    
    In normal text, the acronym \scacronym{Cec} should be printed in small caps.\\
    \textsc{But if surrounded by small caps, \scacronym{Cec} should be printed in uppercase.}
\end{document}

当我尝试编译这个时,我得到了大量类似的错误,一些如下所示。这里发生了什么事?我该如何修复它?


编辑2:

@TiMauzi 使用etoolbox解决上述问题的更新解决方案:

在此处输入图片描述

然而,如果此宏应该应用于目录条目和页眉/页脚,则最好使用\DeclareRobustCommand而不是 来定义它\newcommand

\makeatletter
\DeclareRobustCommand{\scacronym}[1]{%
    \ifdefstring{\f@shape}{sc}{\uppercase{#1}}{\textsc{#1}}\xspace}
\makeatother

答案1

请查看以下 MWE:

\documentclass{scrartcl}

\usepackage{ifthen}

\makeatletter
\newcommand{\ifscshape}[2]{%
    \ifthenelse{\equal{\f@shape}{sc}}{#1}{#2}%
}
\makeatother

\newcommand{\cec}{\ifscshape{\uppercase{Cec}}{\textsc{Cec}}}

\begin{document}
In normal text, the acronym \cec{} should be printed in small caps.

\textsc{But if surrounded by small caps, \cec{} should be printed in uppercase.}
\end{document}

我在这里使用了包ifthen,使用命令\f@shape将(当前字体形状作为输出)与字符串进行比较。在文本中,您应该在命令后面放置,这样强调的文本后面就会有一个空格。sc\equal{}\cec

笔记:在命令中\ifscshape,我将原来的第一个参数更改为CEC,以便\uppercase{Cec}更好地呈现并与进行区分\textsc。不过,无论哪种方式都可以。

编辑1:

如果该命令应该在分段命令中工作,则使用包etoolbox是更好的选择:

\documentclass{scrartcl}

\usepackage{etoolbox}

\makeatletter
\newcommand{\ifscshape}[2]{%
    \ifdefstring{\f@shape}{sc}{#1}{#2}%
}
\makeatother

\newcommand{\cec}{\ifscshape{CEC}{\textsc{Cec}}}

\begin{document}
\section{The Acronym \cec}
This is the section's content using \cec{} or \textsc{also \cec}.
\end{document}

而不是使用\ifthenelse命令\ifdefstring,将命令的内容与给定的字符串进行比较。总的来说,这种方法似乎比使用\ifthen包的方法更稳定。当然,所使用的部分字体应该支持小写字母变体。

编辑2:

将第二个解决方案调整为@schoekling 的第二个 MWE,以下应该有效:

\documentclass{scrbook}

\usepackage{microtype,xspace,libertine}

\setkomafont{disposition}{\normalcolor\rmfamily}
\addtokomafont{chapter}{\scshape\lsstyle}

\usepackage{etoolbox}
\makeatletter
\newcommand{\scacronym}[1]{%
    \ifdefstring{\f@shape}{sc}{\uppercase{#1}}{\textsc{#1}}\xspace}
\makeatother

\begin{document}
    \chapter{Shapes \& Types of \scacronym{Cec}}
    
    In normal text, the acronym \scacronym{Cec} should be printed in small caps.\\
    \textsc{But if surrounded by small caps, \scacronym{Cec} should be printed in uppercase.}
\end{document}

第三个 MWE 的输出。

笔记:如果文档是使用 LuaLaTeX 编译的,则这种方法似乎有效,但使用 XeLaTeX 或 PDFLaTeX 等编译时则无效。

相关内容