Предупреждать меня, когда номер уравнения переносится на следующую строку

Предупреждать меня, когда номер уравнения переносится на следующую строку

Можно ли сделать так, чтобы система 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}

Связанный контент