创建类似宏的最简单方法是什么\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}
笔记:如果文档是使用 LuaLaTeX 编译的,则这种方法似乎有效,但使用 XeLaTeX 或 PDFLaTeX 等编译时则无效。