![使用菜单键时出现堆栈溢出/无限递归](https://linux22.com/image/271629/%E4%BD%BF%E7%94%A8%E8%8F%9C%E5%8D%95%E9%94%AE%E6%97%B6%E5%87%BA%E7%8E%B0%E5%A0%86%E6%A0%88%E6%BA%A2%E5%87%BA%2F%E6%97%A0%E9%99%90%E9%80%92%E5%BD%92.png)
自从我从 TeX Live 2012 升级到 TeX Live 2013 后,我在使用自定义包时遇到了一些问题。该包提供了一些命令,这些命令旨在用作独立命令或嵌入到包\keys{}
提供的命令中menukeys
。这些命令使用我在某处学到的一种机制来允许使用可选参数 - 不知道这样做是否是个好主意,但到目前为止它一直有效。现在,由于某些我不完全理解的原因,系统进入无限循环,直到达到最大堆栈大小。有人能告诉我这里出了什么问题以及我可以做些什么来防止这种情况吗?
谢谢 Volker
梅威瑟:
\documentclass{scrartcl}
\usepackage{menukeys}
% This would usually be part of my custom package...
\makeatletter
\def\foobar{\@ifnextchar[\@foobar{\@foobar[]}}
\def\@foobar[#1]#2{foo=#1, bar=#2}
\makeatother
\begin{document}
without optional argument: \foobar{FOO}
with optional argument: \foobar[BAR]{FOO}
\keys{some key}
% the next line triggers the error: TeX capacity exceeded, sorry [input stack size=5000].
\keys{without optional argument: \foobar{FOO}}
\keys{with optional argument: \foobar[BAR]{FOO}}
\end{document}
答案1
的最新版本menukeys
引入了一些\edef
错误,每当\textbf
使用诸如或像您这样的脆弱命令时都会导致无限递归。
如果你打算在 的参数中使用它,你无论如何都应该定义\foobar
with ,但当前版本会以同样的方式失败。所以理想情况下你应该有\DeclareRobustCommand
menukeys
\DeclareRobustCommand\foobar{\@ifnextchar[\@foobar{\@foobar[]}}
如果将错误\edef
改为正确,\protected@edef
它可能会起作用。更好的是,你应该使用\newcommand
:
\newcommand{\foobar}[2][]{foo=#1, bar=#2}
无需明确使用\@ifnextchar
。
目前,使用
\protected\def\foobar{\@ifnextchar[\@foobar{\@foobar[]}}
可疑\edef
命令位于第 582、585、590 和 593 行。
如果我将中的可疑\edef
命令更改为,则不会显示错误。menukeys.sty
\protected@edef