是否可以定义在必要时自动换行的原子数学块?

是否可以定义在必要时自动换行的原子数学块?

我正在为一家期刊撰写论文,该期刊以双栏格式出版,但提交的稿件必须是单栏格式。这意味着,我必须确保公式在两种格式下都正确格式化。这里的挑战在于,双栏格式的水平空间比单栏格式小得多。因此,一种可能性是手动拆分所有公式,使其适合双栏格式。但是,这样做的缺点是它们在单栏稿件中看起来格式很奇怪。解决这个问题的最佳做法是什么?

我知道两个包breqnautobreak,但据我所知,它们都不能正常工作。加载breqn会立即破坏我的整个文档(即使我没有在任何地方使用它,构建也会失败)。加载可以正常autobreak工作,但“自动中断”环境会产生错误。

我基本上想要的是一个环境,我可以将方程的原子部分放入其中,然后根据可用的水平空间大小自动排列在一行或多行中,就像我chunk在这里使用假设的环境一样:

\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{amssymb}
\begin{document}
\begin{gather}
    \begin{chunk} % <--
    f\colon \mathbb R \to \mathbb R,
    \end{chunk}   % <--
    \begin{chunk} % <--
    f\left(x\right) = 2x
    \end{chunk}   % <--
\end{gather}
\end{document}

根据可用的水平空间量,我希望此代码能够生成

在此处输入图片描述

或者

在此处输入图片描述

有这样的事吗?如果没有,还有什么最佳做法?

答案1

我怀疑这在一般意义上是否有希望奏效,但我能够在这个有限的例子中让它发挥作用。特别是,aligned当边距太小时,人们必须考虑他们希望某些东西如何工作……我不确定是否有一个明显的答案。尽管如此,我还是提供了一个编辑,可能为处理它提供了第一次尝试。

我创建了一个breakable环境,(在本例中),我在 内部调用了gather,它将以正常方式应用方程标签。 breakable创建一个[b]对齐的 minipage\linewidth减去一些 delta 以允许标签宽度。delta 是 的一个可选参数。环境在 minipage、居中、 、松散和 中breakable设置内联数学。\onehalfspacing\displaystyle

环境中的内容可以在\chunk{}宏中设置,宏本身设置在不可破坏的框中(可选参数可以设置数学样式)。 \allowbreak在设置框后调用,以允许额外的换行。

对于需要在完整 的一部分内断开的内容\linewidth,例如长 的一侧align,我尝试通过环境来处理interbreakable,它具有与 类似的参数语法breakable。但是,在这里,小页面是右对齐的并且是顶部对齐的。此外,可选的维度参数不仅应考虑标签宽度,还应考虑不属于环境的其他行部分的宽度interbreakable(因此,它通常需要增加默认值,请参阅最后的讨论)。

在 MWE 中,我不在\chunk内使用 s interbreakable,只是因为这些术语足够短,可以避免在错误的位置换行。但是,如果需要的话,它应该可以工作(我认为)。

\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{amssymb,setspace,environ}
\newcommand\chunk[2][\displaystyle]{\sbox0{$#1#2$}\box0\allowbreak}
\newenvironment{breakable}[1][30pt]
{\begin{minipage}[b]{\dimexpr\linewidth-#1}\sloppy\centering
  \onehalfspacing$\displaystyle}
{$\end{minipage}}
\NewEnviron{interbreakable}[1][30pt]{
  \setbox2=\hbox{$\displaystyle\BODY$}%
  \ifdim\wd2 > \dimexpr\linewidth-#1\relax\wd2=\dimexpr\linewidth-#1\relax\fi
  \begin{minipage}[t]{\wd2}\sloppy\raggedright
  \onehalfspacing$\displaystyle\BODY$\end{minipage}}
%\textwidth=1.5in
\usepackage[showframe,pass]{geometry}
\begin{document}
Here is my first equation:
\begin{gather}
\begin{breakable}
    \chunk{f\colon \mathbb R \to \mathbb R,}\quad
    \chunk{f\left(x\right) = 2x}
\end{breakable}
\end{gather}
And now, for the even more complicated next equation,
\begin{gather}
\begin{breakable}
    \chunk{f\colon \mathbb R \to \mathbb R,}\quad
    \chunk{f\left(x\right) = 2x^2 + 3x,} \text{ and }
    \chunk{f'\left(0\right) = 0}
\end{breakable}
\end{gather}
Look, Mom!! I can do align after a fashion.
\begin{align}
  y &= \begin{interbreakable}[60pt]m_1x^3 + m_2x^2 
    + m_3x + b\end{interbreakable}\\
  E &= \begin{interbreakable}[60pt]mc^2 + \strut\log (ac) 
    - \int_0^1 x\,dx\end{interbreakable}
  \end{align}
\end{document}

在此处输入图片描述

使用较小的\textwidth未注释的:

在此处输入图片描述

为了研究可选参数对的影响interbreakable,MWE60pt在等式 3 中使用。如果我将其设置得太小,比如说40pt,等式会变得更宽并挤掉标签,标签必须向下移动:

在此处输入图片描述

如果我把它弄得太大,比如说80pt,那么它会使环境的可用空间太窄,并且会比需要的更频繁地中断:

在此处输入图片描述

答案2

您可以执行类似这样的操作,根据线宽生成这两种布局之一。请注意,这是作为文档级别选择进行编码的,而不是对每个表达式的测量。

在此处输入图片描述

在此处输入图片描述

\documentclass
[twocolumn]
{scrartcl}
\usepackage{amsmath}
\usepackage{amssymb}
\ifdim\linewidth<250pt
  \let\zaligned\aligned
  \let\endzaligned\endaligned
\else
   \def\zaligned{\,\let\\=\relax}
   \def\endzaligned{}
\fi

\begin{document}
\begin{gather}
\begin{zaligned}
    f\colon \mathbb R \to \mathbb R,\\
    f\left(x\right) = 2x
\end{zaligned}
\end{gather}
\end{document}

答案3

autobreak\MoveEqLeft[0]如果将其作为第一个“块”插入,则可以用于这个特定的例子(请注意,在autobreak环境中块边界表示为换行符):

\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{autobreak}
\allowdisplaybreaks

\begin{document}

Full width:
\begin{align}
  \begin{autobreak}
    \MoveEqLeft[0]
    f\colon \mathbb R \to \mathbb R, \qquad
    f\left(x\right) = 2x
  \end{autobreak}
\end{align}

3\,cm:\\
\begin{minipage}{3cm}
\begin{align}
  \begin{autobreak}
    \MoveEqLeft[0]
    f\colon \mathbb R \to \mathbb R, \qquad
    f\left(x\right) = 2x
  \end{autobreak}
\end{align}
\end{minipage}

\end{document}

在此处输入图片描述

相关内容