我对最新版本的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^
定义所看到的。