使用 relsize 的强大命令出现脆弱错误

使用 relsize 的强大命令出现脆弱错误

我创建了一个据称很强大的命令,通过\DeclareRobustCommand{\plusplus}{\relsize{-3}{++}}它可以修改一些++符号,并在文档中使用它。但是,当我使用\relsize和设置了计数器hyperref的包时tocdepth,我得到了一个神秘的错误(至少对我来说)

参数失控?{\@tempcnta >\z@ \relax \advance \@tempcnta \m@ne \@tempdimb !超出 TeX 容量,抱歉 [主内存大小=10000000]。...\@tempcnta \m@ne \@tempdimb \@tempa \@tempdimb \relax l.15 \subsubsection{test\plusplus}

我甚至尝试增加内存大小,如您所见,最多增加到 10000000。并且,在我的完整文档中,错误变为

失控定义?->\protect 5.3.4 test\protect \<>-\kernel@ifnextchar [4]\<>-\@ifnextchar \ETC . ! TeX 容量超出,抱歉 [主内存大小=10000000]。 \new@ifnex tchar l.108 \subsection{test\plusplus}

我不明白为什么错误会改变。但是,下面的代码是我在删除错误之前得到的最短的代码。但是,我需要使用包hyperref和目录。我该如何解决这个问题?

\documentclass{book}

\usepackage{relsize}
\DeclareRobustCommand{\plusplus}{\relsize{-3}{++}}

\usepackage{hyperref}%remove hyperref and it compiles

\begin{document}

\setcounter{tocdepth}{3}%or remove teh tocdepth and it compiles
%but use both and it doesn't

\tableofcontents

\subsubsection{test\plusplus}

\end{document}

答案1

问题在于hyperref它试图扩展\plusplus并发现自己陷入了无限循环。

\plusplus解决方案:为书签提供特殊的定义。

\documentclass{book}

\usepackage{relsize}
\usepackage{hyperref}

\DeclareRobustCommand{\plusplus}{\relsize{-3}{++}}
\pdfstringdefDisableCommands{%
  \def\plusplus{++}%
}

\begin{document}

\tableofcontents

%%% the following would work also without \pdfstringdefDisableCommands
\section{test\texorpdfstring{\plusplus}{++}}

\section{test\plusplus}

\end{document}

对于“一次性”事件,使用\texorpdfstring{\plusplus}{++}更简单。这种\pdfstringDisableCommands方法更好,因为它不需要考虑命令对于书签是否安全。


您可以定义\plusplus不同的方式,而无需relsize

\documentclass{book}

\usepackage{hyperref}

\makeatletter
\DeclareRobustCommand{\plusplus}{%
  {\check@mathfonts\fontsize{\ssf@size}{\f@baselineskip}\selectfont++}%
}
\pdfstringdefDisableCommands{%
  \def\plusplus{++}%
}
\makeatother

\begin{document}

\tableofcontents

%%% the following would work also without \pdfstringdefDisableCommands
\section{test\texorpdfstring{\plusplus}{++}}

\section{test\plusplus}

\end{document}

在此处输入图片描述

如果要提高两个 + 符号,可以将定义改为

\makeatletter
\DeclareRobustCommand{\plusplus}{%
  \raisebox{.25ex}{\check@mathfonts\fontsize{\ssf@size}{\f@baselineskip}\selectfont++}%
}
\pdfstringdefDisableCommands{%
  \def\plusplus{++}%
}
\makeatother

在此处输入图片描述

相关内容