非宏标记上的无限循环

非宏标记上的无限循环

以下文档无限循环:

\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……

哎呀,无限循环。:-)

相关内容