我是第一次使用这个breqn
包。它看起来不错,但当一个方程式几乎可以容纳在页面上但又不完全容纳时,我得到了一个奇怪的行为:对齐完全错误。有办法解决这个问题吗?
为了举个例子,我使用了各种尺寸的 minipage 环境。\fbox
只是为了显示边框。
编译下面的例子,对于小尺寸和大尺寸都会得到很好的结果,但对于和15em
,第二个方程就会变得不合适。16em
17em
\documentclass{article}
\usepackage{breqn}
\newcommand{\myequation}[1]{
\fbox{
\begin{minipage}{#1}
Size #1:
\begin{dgroup*}
\begin{dmath*}
(x+\cdots+y+\cdots + z) - (x+\cdots + z) = 0
\end{dmath*}
\begin{dmath*}
A = 0
\end{dmath*}
\end{dgroup*}
Text
\end{minipage}
}
}
\begin{document}
\myequation{5em} \qquad \myequation{6em} \qquad \myequation{9em} \\
\myequation{13em} \qquad \myequation{15em} \\
\myequation{16em} \\
\myequation{17em} \\
\myequation{18em} \\
\myequation{30em}
\end{document}
对于 breqn 和 expl3 包的某些版本,可能需要将以下代码添加到序言中:
\ExplSyntaxOn
\cs_set_eq:NN \intexpr_eval:w \int_eval:w
\cs_set_eq:NN \intexpr_eval_end: \int_eval_end:
\ExplSyntaxOff
答案1
为了理解这里发生了什么,我稍微清理了一下代码,并使用了彩色规则而不是 fbox。我还使用了一个循环来排版各种框。这样,修改宽度和查看过渡点发生的情况就更容易了。
首先,我们看到一个排版框,其宽度足以容纳方程式。我们看到它正确地排版了这些方程式,将它们与等号对齐并居中。
现在,当我们改变框的宽度时会发生什么?TeX 开始压缩第一个方程以适应宽度限制。但是对于第二个方程,由于它适合,它将保持框的宽度不变。哎呀!这两个方程不再对齐,但有小的差异,直到大约 185pt 时,第一个方程被拉伸到 TeX 认为良好的方程显示。
breqn
接下来,我们通过在宽度处强制中断160pt
并排版以下框来查看算法中的逻辑问题以获得一些视觉线索:
显然,原来标记的打破方程的好位置和第二个方程对齐的位置是基于未拉伸 第一个方程。这应该经过另一次迭代,并根据等号的新位置进行检查,或者应该切换触发器以让 TeX 接管并将第二个方程定位在其自然位置。hsize
输入的方程式和类型的错误组合也会产生难以解决的问题,并且只会产生排版错误的框 QED?
这是一个新的 MWE:
\documentclass{article}
\usepackage{flexisym}
\usepackage{xcolor,lipsum}
\usepackage{breqn}
\overfullrule1pt
\fboxsep=0.4pt
\def\myequation#1{%
\hbox to 0pt{\color{orange}\rule{#1}{2pt}}
\hsize#1
Size #1:%
\begin{dgroup*}[frame={0.4pt},framesep=0pt,compact]
\begin{dmath*}
(x+\cdots+y+\cdots + z) - (x+\cdots +2) = 0
\end{dmath*}
\begin{dsuspend}
and
\end{dsuspend}
\begin{dmath*}[frame={0pt}]
a=0
\end{dmath*}
\end{dgroup*}
\hbox to 0pt{\color{orange}\rule{#1}{2pt}}
}
\parindent0pt
\begin{document}
\makeatletter
\@for\next:=160pt,165pt,190pt\do{%
\hsize\next
\myequation\next\par
}
\end{document}
为了修复它,需要手动干预(仅针对有问题的),修改如下:
\begin{dmath*}[frame={0pt}]
$a=0$
\end{dmath*}
左对齐或 \hbox to 91pt {\hfill $a=0$}
对齐,通过反复试验找到了 91pt。
您可以使用帕特里克\usepackage{lua-visual-debug}
来查看最终的拳击:
请注意,该框已使用更正后的参数绘制,如上所述。