Можно ли сделать так, чтобы система amsmath
предупреждала меня, когда уравнение слишком длинное, и переносила число на следующую строку?
Я ожидаю, что он либо выведет сообщение Equation (1) too long
на консоль, либо сделает (1)
деталь красной.
\documentclass[twocolumn]{article}
\usepackage{amsmath}
\begin{document}
\begin{equation}
A+B+C+D+R+F+G+H+I+J+L+M+N+O+P
\end{equation}
\end{document}
решение1
Я не хочу сказать, что это невозможно, но это определенно сложная проблема, поскольку она amsmath
зависит от \eqno
примитивных людей, которые должны выполнять эту работу для equation
окружающей среды.
\hsize=8cm
$$A+B+C+D+R+F+G+H+I+J+L+M+N+O+P\eqno(1)$$
\bye
Поэтому единственный способ, который я вижу, — это переопределить примитив \eqno
и измерить штрафы, чтобы увидеть, будет ли число перенесено на следующую строку.
Для align
семейства сред это немного проще, поскольку смещение тегов обрабатывается макросами, в которые вы просто вставляете свою пользовательскую ошибку или предупреждение.
\documentclass[twocolumn]{article}
\usepackage{amsmath}
\makeatletter
\def\place@tag{%
\iftagsleft@
\kern-\tagshift@
\if1\shift@tag\row@\relax
\errmessage{Equation too wide}%
\rlap{\vbox{%
\normalbaselines
\boxz@
\vbox to\lineht@{}%
\raise@tag
}}%
\else
\rlap{\boxz@}%
\fi
\kern\displaywidth@
\else
\kern-\tagshift@
\if1\shift@tag\row@\relax
\errmessage{Equation too wide}%
\llap{\vtop{%
\raise@tag
\normalbaselines
\setbox\@ne\null
\dp\@ne\lineht@
\box\@ne
\boxz@
}}%
\else
\llap{\boxz@}%
\fi
\fi
}
\makeatother
\begin{document}
\begin{align}
A+B+C+D+R+F+G+H+I+J+L+M+N+O+P
\end{align}
\end{document}
Другой возможностью было бы набрать уравнение дважды, но один раз с нулевой шириной (используя \vphantom
), так что число не может быть на второй строке. Затем сравнить высоту уравнения с обычным набором и с нулевой шириной. Если высота уравнения с обычным набором больше, чем у другого, произошел разрыв строки.
\documentclass[twocolumn]{article}
\usepackage{amsmath}
\usepackage{environ}
\NewEnviron{warnequation}{
\setbox0=\vbox{\begin{equation}\BODY\end{equation}}%
\setbox1=\vbox{\begin{equation}\vphantom{\BODY}\end{equation}}%
\ifdim\ht0>\ht1
\errmessage{Equation too wide}%
\fi
\box0
}
\begin{document}
\begin{warnequation}
A+B+C+D+R+F+G+H+I+J+L+M+N+O+P
\end{warnequation}
\end{document}