![是否可以定义在必要时自动换行的原子数学块?](https://linux22.com/image/432794/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%AE%9A%E4%B9%89%E5%9C%A8%E5%BF%85%E8%A6%81%E6%97%B6%E8%87%AA%E5%8A%A8%E6%8D%A2%E8%A1%8C%E7%9A%84%E5%8E%9F%E5%AD%90%E6%95%B0%E5%AD%A6%E5%9D%97%EF%BC%9F.png)
我正在为一家期刊撰写论文,该期刊以双栏格式出版,但提交的稿件必须是单栏格式。这意味着,我必须确保公式在两种格式下都正确格式化。这里的挑战在于,双栏格式的水平空间比单栏格式小得多。因此,一种可能性是手动拆分所有公式,使其适合双栏格式。但是,这样做的缺点是它们在单栏稿件中看起来格式很奇怪。解决这个问题的最佳做法是什么?
我知道两个包breqn
和autobreak
,但据我所知,它们都不能正常工作。加载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}