带有 minipage 和 align* 的自定义环境

带有 minipage 和 align* 的自定义环境

我想要一个可以并排显示两个方程的环境。下面的方法可行,但是有没有办法使其成为专用的newenvironment

  \documentclass[10pt]{article}
    \begin{document}
    \begin{minipage}{0.5\linewidth}
      \begin{equation}
        y_1(x)=x^2
      \end{equation}
    \end{minipage}
    \hspace{0.5cm}
    \begin{minipage}{0.5\linewidth}
      \begin{equation}
        y_2(x)=2x+1
      \end{equation}
    \end{minipage}
  \end{document}

我的尝试如下:

\newenvironment{sidebyside}[1]
{%
  \begin{minipage}{#1\linewidth}
  \csname align*\endcsname
}{%
  \csname endalign*\endcsname
  \end{minipage}
}

这会出现错误:

LaTeX Error: \begin{minipage} on input line ... ended by \end{sidebyside}.

答案1

也许更简单的语法会帮助你:

\documentclass{article}
\usepackage{amsmath}
\usepackage{lipsum} % just for the example

\newlength{\sbswidth}
\newenvironment{sidebysideeq}[1][0.5]
 {\[% start equation
  \setlength{\sbswidth}{#1\linewidth}%
  \minipage{\sbswidth}
  \centering
  $\!\aligned
 }
 {\endaligned$\endminipage\]}
\newcommand{\breaksideeq}{%
  \endaligned$\endminipage
  \setlength{\sbswidth}{\dimexpr\linewidth-\sbswidth}%
  \minipage{\sbswidth}
  \centering
  $\!\aligned
}

\begin{document}

\lipsum*[2]
\begin{sidebysideeq}
  y_1(x)=x^2
\breaksideeq
  y_2(x)=2x+1
\end{sidebysideeq}
\lipsum*[3]
\begin{sidebysideeq}[0.3]
  y_1(x)&=x^2\\
  y_2(x)&=x^3-x
\breaksideeq
  y_3(x)=2x+1+a+b+c+d+e+f+g
\end{sidebysideeq}
\lipsum[2]
\end{document}

可选参数指定为左侧部分保留sidebysideeq的分数,默认值为 0.5。\linewidth

在此处输入图片描述

可以轻松添加键值接口来设置环境的更多方面:这里我使用一个键来表示左分数和反向垂直对齐。默认值相当于left=0.5和。的align=c可能值为,或(但最后一个可能不是很有用)。alignctb

\documentclass{article}
\usepackage{amsmath,keyval}
\usepackage{lipsum} % just for the example

\makeatletter
\define@key{SBS}{left}{\def\SBS@left{#1}}
\define@key{SBS}{align}{\def\SBS@align{#1}}
\def\SBS@left{0.5}
\def\SBS@align{c}

\newlength{\sbswidth}
\newenvironment{sidebysideeq}[1][]
 {\[% start equation
  \setkeys{SBS}{#1}%
  \setlength{\sbswidth}{\SBS@left\linewidth}%
  \minipage[\SBS@align]{\sbswidth}
  \centering
  $\!\aligned[\SBS@align]
 }
 {\endaligned$\endminipage\]}
\newcommand{\breaksideeq}{%
  \endaligned$\endminipage
  \setlength{\sbswidth}{\dimexpr\linewidth-\sbswidth}%
  \minipage[\SBS@align]{\sbswidth}
  \centering
  $\!\aligned[\SBS@align]
}
\makeatother

\begin{document}
\lipsum*[2]
\begin{sidebysideeq}
  y_1(x)=x^2
\breaksideeq
  y_2(x)=2x+1
\end{sidebysideeq}
\lipsum*[3]
\begin{sidebysideeq}[left=0.3,align=t]
  y_1(x)&=x^2\\
  y_2(x)&=x^3-x
\breaksideeq
  y_3(x)=2x+1+a+b+c+d+e+f+g
\end{sidebysideeq}
\lipsum[2]
\end{document}

在此处输入图片描述

如果想要支持\tag,那么应该采取更复杂的方法。

\documentclass{article}
\usepackage{amsmath,keyval,environ}
\usepackage{lipsum} % just for the example

\makeatletter
\define@key{SBS}{left}{\def\SBS@left{#1}}
\define@key{SBS}{align}{\def\SBS@align{#1}}
\def\SBS@left{0.5}
\def\SBS@align{c}

\newlength{\sbswidth}
\NewEnviron{sidebysideeq}[1][]{%
  \par\centering
  \setkeys{SBS}{#1}%
  \penalty\predisplaypenalty
  \if\SBS@align t\vskip-\baselineskip\vskip\prevdepth\fi
  \setlength{\sbswidth}{\SBS@left\linewidth}%
  \expandafter\make@sidebysideeq\BODY\@nil
}

\def\make@sidebysideeq#1\breaksideeq#2\@nil{%
  \begin{minipage}[\SBS@align]{\sbswidth}
  \vskip-\baselineskip\vskip\abovedisplayskip
  \begin{align*}#1\end{align*}
  \vskip\belowdisplayskip
  \end{minipage}%
  \setlength{\sbswidth}{\dimexpr\linewidth-\sbswidth}%
  \begin{minipage}[\SBS@align]{\sbswidth}
  \vskip-\baselineskip\vskip\abovedisplayskip
  \begin{align*}#2\end{align*}
  \vskip\belowdisplayskip
  \end{minipage}
}
\makeatother


\begin{document}
\lipsum*[2]
\begin{sidebysideeq}[align=t]
  y_1(x)=x^2
\breaksideeq
  y_2(x)=2x+1
\end{sidebysideeq}
\lipsum*[3]
\begin{sidebysideeq}[left=0.3,align=t]
  y_1(x)&=x^2 \tag{*}\\
  y_2(x)&=x^3-x
\breaksideeq
  y_3(x)=2x+1+a+b+c+d+e+f+g
\end{sidebysideeq}
\lipsum[2]
\end{document}

在此处输入图片描述

答案2

您可以使用environ包裹并过上简单的生活;)

\documentclass[10pt]{article}
\usepackage{environ}
\NewEnviron{sidebyside}[1]
{%
  \begin{minipage}{#1\linewidth}
  \begin{equation}
  \BODY
  \end{equation}
  \end{minipage}%
}
\begin{document}

\noindent
\begin{sidebyside}{0.5}
  y_1(x)=x^2
\end{sidebyside}%
\begin{sidebyside}{0.5}
  y_2(x)=2x+1
\end{sidebyside}

\end{document}

在此处输入图片描述

也可以将宽度选项设为可选。

\documentclass[10pt]{article}
\usepackage{environ}
\NewEnviron{sidebyside}[1][0.5]
{%
  \begin{minipage}{#1\linewidth}
  \begin{equation}
  \BODY
  \end{equation}
  \end{minipage}%
}
\begin{document}

\noindent
\begin{sidebyside}
  y_1(x)=x^2
\end{sidebyside}%
\begin{sidebyside}
  y_2(x)=2x+1
\end{sidebyside}

\end{document}

所以\begin{sidebyside}除非0.5\linewidth你指定\begin{sidebyside}[0.4]

答案3

\begin{minipage}\end{minipage}在环境定义中不起作用,并且会触发错误

\begin{minipage} on input line 16 ended by \end{sidebyside}.

由于 的方式align*被处理(它多次读取内容以计算比对);当此内部处理完成时,\begin{minipage}将错误地与 匹配,\end{sidebyside}并发生错误。如果您使用equation而不是align,那么您可以使用\begin{minipage}\endminipage,例如。

这是一种可能性,\minipage改用\end{minipage}:

\documentclass[10pt]{article}
\usepackage{amsmath}

\newenvironment{sidebyside}[1]
{%
  \minipage{#1\linewidth}
  \csname align*\endcsname
}{%
  \csname endalign*\endcsname
  \endminipage
}

\begin{document}

\noindent
\begin{sidebyside}{0.5}
  y_1(x)=x^2
\end{sidebyside}%
\begin{sidebyside}{0.5}
  y_2(x)=2x+1
\end{sidebyside}

\end{document}

在此处输入图片描述

相关内容