我正在使用推荐的方法 符号/缩写和宏列表 当我第一次使用命令时自动生成命名法条目(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
已过时,请使用subfig
或subcaption
(尽管它们的语法不同)。