我已经定义了以下命令来排版“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
)来自xparse
或expl3
带有的方法\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}