章节标题中的 \newcommand 和 \raisebox

章节标题中的 \newcommand 和 \raisebox

我已经定义了以下命令来排版“C++”:

\newcommand{\Cpp}{C\raisebox{-.23ex}{\texttt{++}}}

在段落中使用该命令可以按预期工作。但是,我无法在章节标题中使用它。我似乎与有关\raisebox

这里有一个:

\documentclass[11pt]{article}

\newcommand{\Cpp}{C\raisebox{-.23ex}{\texttt{++}}}

\begin{document}    
\section{\Cpp} % doesn't work! because of \raisebox ?
\Cpp-Compiler
\end{document}

我如何重新定义\Cpp命令以使其在章节标题中起作用?

答案1

这种高度脆弱的内容应该放在\protect或 前面(如果扩展不是问题的话)\DeclareRobustCommand而不是\newcommand

或者,使用\robustify来自etoolbox\NewDocumentCommand(或\DeclareDocumentCommand)来自xparseexpl3带有的方法\cs_new_protected_nopar

\documentclass[11pt]{article}

\usepackage{etoolbox} % for robustify
\usepackage{xparse}

\DeclareRobustCommand{\Cpp}{C\raisebox{-.23ex}{\texttt{++}}}
\newcommand{\OtherCpp}{C\raisebox{-.23ex}{\texttt{++}}}
\newcommand{\YetAnotherCpp}{C\raisebox{-.23ex}{\texttt{++}}}
\newrobustcmd{\EvenYetAnotherCpp}{C\raisebox{-.23ex}{\texttt{++}}}
\NewDocumentCommand{\EvenMoreAnotherCpp}{}{C\raisebox{-.23ex}{\texttt{++}}}

\ExplSyntaxOn
\cs_new_protected_nopar:Npn \CppWithExpl {
  C\raisebox{-.23ex}{\texttt{++}}
}
\ExplSyntaxOff

\robustify{\YetAnotherCpp}

\begin{document}    
\tableofcontents
\section{\Cpp}
\section{\protect\OtherCpp\ with \texttt{\textbackslash protect}} 
\section{\YetAnotherCpp\ with \texttt{\textbackslash robustify}} 
\section{\EvenYetAnotherCpp\ with \texttt{\textbackslash newrobustcmd}} 
\section{\EvenMoreAnotherCpp\ with \texttt{\textbackslash NewDocumentCommand}} 
\section{\CppWithExpl\ with \texttt{\textbackslash cs\_new\_protected\_nopar}}
\Cpp-Compiler 

\end{document}

在此处输入图片描述

相关内容