在 XeLaTeX 中我定义了以下命令:
\newcommand*{\PoETeX}{P\kern -.15em\raisebox{-0.21em}{O}\kern -.05em E\TeX}
作为一种简单(非稳健)的方式来创建一个模仿的愚蠢标志\LaTeX
。
它工作正常,直到我尝试用以下类似方法将其插入到目录中:
\addcontentsline{toc}{section}{\PoETeX}
此时我得到以下信息xelatex
:
! \reserved@a 的参数有一个额外的 }。\par l.11 \addcontentsline{toc}{section}{\PoETeX}
该问题似乎是由以下原因引起的\raisebox
— 取出 raisebox,或使用\addcontentsline*
可消除错误。
下面是一个最小的例子:
\documentclass[a4paper,11pt]{article}
\begin{document}
\thispagestyle{empty}
\newcommand*{\PoETeX}{P\kern -.15em\raisebox{-0.21em}{O}\kern -.05em E\TeX}
\addcontentsline{toc}{section}{\PoETeX}
\section*{\PoETeX}
\begin{verse}
There once was a poem called \PoETeX\\
That's name sounded somewhat /pəˈθɛtɛk/.\\
\hspace*{2em}It was really quite sad,\\
\hspace*{2em}to see pronunciation so bad,\\
And to read such a terrible /ˈlɪme(ə)rɛk/!
\end{verse}
\end{document}
答案1
如果你打算经常在移动参数中使用\PoETeX
,最好使用
\DeclareRobustCommand*{\PoETeX}{%
P\kern -.15em\raisebox{-0.21em}{O}\kern -.05em E\TeX}
因此您不必\protect
在很多地方放置命令前面的内容。
粗略地说,使用 定义命令\DeclareRobustCommand
就像\protect
在需要时在命令前面加上 一样。不要养成定义全部像这样的命令:仅在必要时使用该技术。
替代定义:
\protected\def\PoETeX{%
P\kern -.15em\raisebox{-0.21em}{O}\kern -.05em E\TeX}
这实际上比更有效\DeclareRobustCommand
,但具有使用低级命令的缺点。
答案2
您需要保护脆弱的命令\PoETeX
:
\addcontentsline{toc}{section}{\protect\PoETeX}