我想要一个可以并排显示两个方程的环境。下面的方法可行,但是有没有办法使其成为专用的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
可能值为,或(但最后一个可能不是很有用)。align
c
t
b
\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}