以下文档无限循环:
\documentclass{article}
\usepackage{breqn}
\begin{document}
\newcommand{\allowbreaks}[2][,]{\begingroup
\catcode`#1=\active
\scantokens{%
\edef#1{%
\show\detokenize{#1}%
\detokenize{#1}%
\noexpand\allowbreak
\show0%
}%
#2%
}
\endgroup}
\allowbreaks{$,$}
\end{document}
LaTeX 显示
> the character ,.
,->\show ,
,\allowbreak \show 0
l.113 \allowbreaks{$,$}
?
反复。
如果我输入I\show
它的提示,它会给我
> the character ,.
,->\show ,,
\allowbreak \show 0
l.113 \allowbreaks{$,$}
也就是说,它扩展了一个字符,而不是一个宏。这怎么可能呢?
如果我注释掉该breqn
行,它就可以正常工作。我使用的是 pdfTeX,版本 3.1415926-1.40.10 (TeX Live 2009/Debian)。
答案1
当你说 时\detokenize{,}
,逗号就变成类别代码12的字符,所以\show,
会显示这个字符的含义。
将\edef
定义活动逗号扩展为
\show,,\allowbreak\show0
其中两个逗号的类别代码为 12。
但是当breqn
加载时,逗号有数学代码"8000
,你是在数学模式下!因此 TeX 遵循其规则:在显示逗号的含义后,它会找到另一个逗号,并且它的类别代码为 12 和数学代码"8000
,TeX 会用当前作为活动字符的含义替换它。也就是说,显示逗号并使用类别代码为 12 和数学代码的逗号"8000
……
哎呀,无限循环。:-)