自动命名法与子图断开

自动命名法与子图断开

我正在使用推荐的方法 符号/缩写和宏列表 当我第一次使用命令时自动生成命名法条目(nomencl 包),即

\defsym{\Rn}{\mathbb{R}^n}
[...]
the first occurance $\Rn$ generates an orrurance in the nomenclature,
[...]
the second occurance $\Rn$ does not.

这很好用,就像在符号/缩写和宏列表它也适用于\section{\Rn}图形标题,但是\subfigure[\Rn]{}如果这是宏的第一次出现,则在子图中使用时会失败。

演示错误的最小示例:

\errorcontextlines2
\documentclass[paper=a4,11pt]{scrbook}
\usepackage[refpage,noprefix]{nomencl}
\usepackage{subfigure}

\makeatletter
\newcommand*{\defsym}[3][]{\def#2{%
  \ifx\protect\@unexpandable@protect
    #3%
  \else
    \nomenclature{$#3$}{#1}\gdef#2{#3}#3%
  \fi}
}
\makeatother
\makenomenclature
\begin{document}
\defsym{\MeshMacro}{{\cal M}^{\rm mac}}
% $\MeshMacro$ works nicely
\begin{figure}
\subfigure[$\MeshMacro$ goes to hell]{ }
\end{figure}
\printnomenclature
\end{document}

错误信息是

! TeX capacity exceeded, sorry [input stack size=15000].
\nomenclature ->\protect \@nomenclature 

\MeshMacro ...cal M}^{\rm mac}\else \nomenclature 
                                                  {${\cal M}^{\rm mac}$}{}\g...

\MeshMacro ...al M}^{\rm mac}$}{}\gdef \MeshMacro 
                                                  {{\cal M}^{\rm mac}}{\cal ...
...
l.20 \subfigure[$\MeshMacro$ goes to hell]{ }

我怎样才能避免这个问题?

答案1

问题有两个方面。首先,该命令\MeshMacro很脆弱,因此应该加以保护。因此

\subfigure[$\protect\MeshMacro$ goes to hell]{ }

可以;但是,由于对象是在框内框中排版的,因此\MeshMacro命名文件中不会记录的使用情况。

但是,子浮动标题中第一次出现的问题\MeshMacro无法解决,因为它是标准的 TeX 功能。

另一方面,对于浮动对象,人们永远无法确定它们会落在哪里,并且第一次出现可能在对象用于文本之后结束。我的建议是避免在标题中使用此类宏。

请注意\cal\rm是过时的命令,你应该写

\defsym{\MeshMacro}{\mathcal{M}^\mathrm{mac}}

使用“官方支持”的命令。同样subfigure已过时,请使用subfigsubcaption(尽管它们的语法不同)。

相关内容