新命令中带上标的 breqn

新命令中带上标的 breqn

我对最新版本的breqn.sty处理newcommand以上标开头的 的行为感到不满。考虑以下代码

\documentclass{article}
\usepackage{breqn}
\newcommand{\hc}{^\dagger}
\begin{document}
\begin{dmath}
  A\hc
\end{dmath}
\end{document}  

此代码不会停止编译,并会挂起此错误:

! Missing { inserted.
<to be read again> 
                   \penalty 
l.6   A\hc

! Missing } inserted.
<inserted text> 
                }
l.7 \end{dmath}

(请注意,旧版本breqn.sty没有给我带来这个问题。)

但是,如果我仅将其替换\hc^\dagger,则一切正常。此外,如果我将其替换dmath为任何标准数学环境,它都可以正常工作(我已经使用这个特定的环境newcommand多年了)。

以上标开头是不是不好的做法newcommand?有没有办法修改我的代码\hc,让上面的代码正常工作?

答案1

这种方式breqn相当复杂,因此我并不惊讶它在您给出的例子中失败了。我建议严格遵守上标的正式允许语法:

\documentclass{article}
\usepackage{breqn}
\newcommand{\hc}{^{\dagger}}
\begin{document}
\begin{dmath}
  A\hc
\end{dmath}
\end{document}  

正如 Bruno 所观察到的,这与类别代码有关。以下内容也适用

\documentclass{article}
\usepackage{breqn}
\catcode`\^=12 %
\newcommand{\hc}{^\dagger}
\begin{document}
\begin{dmath}
  A\hc
\end{dmath}
\end{document}  

就像breqn构成^‘其他’字符。

效果很好。

答案2

为了补充约瑟夫的回答和布鲁诺的评论,这里是对情况的一些分析。

布雷克将所有数学代码更改为,"8000以便数学模式下的字符表现得像宏;并且还更改命令的含义,例如\dagger

^A和的含义\dagger变为

> ^=macro:
#1->\mathsup {\protect \subsupstyle #1}.

> A=\protected\long macro:
->\@sym A\math_sym_Var:Nn \mg@Latin {41}.

> \dagger=\protected\long macro:
->\@sym \dagger \math_sym_Bin:Nn \mg@bin {79}.

其中\mathsup是通常类别 7 的别名^

按照\newcommand{\hc}{^\dagger}序言中给出的,仍然有类别 7,并且在扩展^时仍然如此。但是数学模式下类别 7 的一个重要属性是它会不断扩展下一个标记,直到找到不可扩展的标记(并且它最好是 mathchardef 标记或 chardef 标记或左括号)。经过大量扩展后,在本例中呈现为,这不是它后面的好标记。\hc^^\penalty

最安全的定义是

\begingroup\lccode`?=`^
  \lowercase{\endgroup\newcommand{\hc}{?{\dagger}}}

或者

{\catcode`^=12 \gdef\hc{^{\dagger}}}

因为此时更改 catcode^可能会很危险。也许发出

\catcode`^=12
\newcommand{\hc}{^{\dagger}}

之前\begin{document}可能不会产生意想不到的后果。无论如何,应避免\hc使用 catcode 7进行定义^,因为它可能会干扰布雷克:两者之间有很大区别

\mathsup{\protect\subsupstyle \dagger}

\mathsup{\dagger}

后者是 LaTeX 使用 catcode 7^定义所看到的。

相关内容