我正在使用align
LaTeX 数学模式提供的环境排版一些表达式。这是我的 MWE:
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\begin{document}
\begin{align*}
a &= b \\
&\Longrightarrow c \\
&= d
\end{align*}
\end{document}
如果每个关系右侧的表达式能够垂直对齐就好了
a = b
==> c
= d
只需使用align
环境中的工具即可——即不使用任何类型的数组,或手动插入空格等\quad
。关系的定位方式(左对齐、居中……)对我来说并不重要,只要它看起来好的。
提前致谢!
编辑:这里有一个不那么简单的例子,以便感觉哪种解决方案可能比其他解决方案更好。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\newcommand{\app}[2]{#1~#2}
\newcommand{\papp}[2]{\left(#1~#2\right)}
\newcommand{\sub}[2]{\left[#1\middle/#2\right]}
\begin{document}
\begin{align*}
\app{(\lambda a.\lambda b.\app{\papp{a}{b}}{a})}{F}
&= \app{(\lambda a.\lambda b.\app{\papp{a}{b}}{a})}{(\lambda x.\lambda y.y)} \\
&\Rightarrow_{\beta} \lambda b.(\app{\papp{a}{b}}{a})\sub{\lambda x.\lambda y.y}{a} \\
&= \lambda b.\papp{\papp{a}{b}\sub{\lambda x.\lambda y.y}{a}}{a\sub{\lambda x.\lambda y.y}{a}}
\end{align*}
\end{document}
答案1
我建议采用一种基于eqparbox
包的方法,它允许使用简单的语法:我定义一个\alignedsymbols
命令,带有一个强制参数(要对齐的数学符号),以及一个可选参数:c, l, r
;c 是默认值。一个简单的align
环境就可以了:
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{eqparbox}
\newcommand\alignsymbols[2][c]{\mathrel{\eqmakebox[S][#1]{$#2$}}{}} % optional argument is c (default), l or r
\begin{document}
\begin{align*}
a & \alignsymbols{=}b & a & \alignsymbols[l]{=}b & a & \alignsymbols[r]{=} b \\%
& \alignsymbols{\Longrightarrow}c & & \alignsymbols[l]{\Longrightarrow}c & & \alignsymbols[r]{\Longrightarrow}c \\%
& \alignsymbols{>}d & & \alignsymbols[l]{>}d & & \alignsymbols[r]{>}d
\end{align*}
\end{document}
答案2
您可以使用alignat*
具有优势的array
;我看到的关系符号的唯一可能对齐方式是向左对齐,否则等号会从任何地方悬挂下来。
我还建议对你的宏进行一些更改,\papp[\big]
在最后一行使用,以便外括号可以增加它们的大小(它们不会对\left
and执行此操作\right
)。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath,mathtools}
\newcommand{\app}[2]{#1\mspace{6mu}#2}
\DeclarePairedDelimiterX{\papp}[2]{(}{)}{%
#1\mspace{6mu}#2%
}
\DeclarePairedDelimiterX{\sub}[2]{[}{]}{%
#1\delimsize/#2%
}
\newcommand{\lrel}[1]{#1{}&&}
\begin{document}
\begin{alignat*}{2}
\app{(\lambda a.\lambda b.\app{\papp{a}{b}}{a})}{F}
&\lrel{=} \app{(\lambda a.\lambda b.\app{\papp{a}{b}}{a})}{(\lambda x.\lambda y.y)} \\
&\lrel{\Rightarrow_{\beta}} \lambda b.(\app{\papp{a}{b}}{a})\sub{\lambda x.\lambda y.y}{a} \\
&\lrel{=} \lambda b.\papp[\big]{\papp{a}{b}\sub{\lambda x.\lambda y.y}{a}}{a\sub{\lambda x.\lambda y.y}{a}}
\end{alignat*}
\end{document}
答案3
alignat
允许指定水平对齐的“宽度”(更确切地说是方程列的数量)
查看原版与alignat*
版本之间的差异。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\begin{document}
Original version with \verb+align*+
\begin{align*}
a &= b \\
&\Longrightarrow c \\
&= d
\end{align*}
Version with \verb+alignat*+
\begin{alignat*}{2}
a &= & b \\
&\Longrightarrow{} &c \\
&= &d
\end{alignat*}
\end{document}
答案4
关系符号右对齐
以下示例使用空白将 移至左侧。假设真实示例左侧\Longrightarrow
不止一个,箭头也可能带有注释,否则看起来会好得多。a
\Rightarrow
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\begin{document}
\begin{align*}
a &= b \\
&\mathrel{\hphantom{=}\llap{$\Longrightarrow$}} c \\
&= d
\end{align*}
\end{document}
关系符号居中
由于方程式没有编号,方程系统也可以通过 来设置array
。关系符号放在中间一列,周围的间距用 明确设置\;
。
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\begin{document}
\begin{gather*}
\begin{array}{@{}r@{\;}c@{\;}l@{}}
a &=& b \\
&\Longrightarrow& c\\
&=& d
\end{array}
\end{gather*}
\end{document}
单元格设置在\textstyle
,但\displaystyle
可以明确指定(与此处的简单变量无关):
\documentclass[a4paper,12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{amsmath}
\begin{document}
\begin{gather*}
\begin{array}{
@{}
>{\displaystyle}r
@{\;}>{\displaystyle}c@{\;}
>{\displaystyle}l@{}
}
a &=& b \\
&\Longrightarrow& c\\
&=& d
\end{array}
\end{gather*}
\end{document}