我真的不知道如何写标题,希望它足够清楚(如果有人建议更好的内容,我愿意更改它)。
我的问题如下:我想将不同的项目彼此对齐,但锚点位于已对齐的环境内(这当然会失败,因为在这个环境之外看不到它)。通常,我会给出几个函数定义,我希望它们之间有令人满意的水平和垂直对齐:水平对齐相对于列,垂直对齐相对于第一行的底部。这是一个 MWE:
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{amsfonts}
\newcommand*\Rset{\mathbb{R}}
\newcommand*\mapping[5]{%
\begingroup
\setlength\arraycolsep{0.2em}%
\begin{array}{ccccc}%
{#1}&\colon&{#2}&\longrightarrow&{#3}\\
&&{#4}&\longmapsto&{#5}%
\end{array}%
\endgroup
}%
\begin{document}
\begin{align*}
&\mapping f\Rset\Rset x{x^2,}&
&\mapping M\Rset\Rset x{x^{42},}\\*[2ex]
&\mapping{\mathrm{Function}}XYx{\dfrac1{1+\dfrac1{1+x^2}},}&
&\mapping U\Rset\Rset x{x.}
\end{align*}
\end{document}
到目前为止,我唯一的选择是将环境的 放在&
命令align*
前面\mapping
,这样水平对齐就从函数名称的开头开始。我怎样才能将 放在环境&
内部array
,以便环境看不到它array
,而外部align*
环境可以看到它?
更不用说可怕的垂直对齐了!
也许你会有一个完全不同(且更好)的方法来实现这一点,但无论如何,我想知道这是否有可能(以一种简单的方式)。
答案1
如果我理解正确的话,你只是想&
在第一个参数之后将其移到你的定义中:
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{amsfonts}
\newcommand*\Rset{\mathbb{R}}
\newcommand*\mapping[5]{%
#1&%
\begingroup
\setlength\arraycolsep{0.2em}%
\begin{array}[t]{cccc}%
\colon&\longrightarrow\\
&\longmapsto%
\end{array}%
\endgroup
}
\begin{document}
\begin{align*}
\mapping f\Rset\Rset x{x^2,}&
\mapping M\Rset\Rset x{x^{42},}\\*[2ex]
\mapping{\mathrm{Function}}XYx{\dfrac1{1+\dfrac1{1+x^2}},}&
\mapping U\Rset\Rset x{x.}
\end{align*}
\end{document}
答案2
坚持你正在做的方式的一种方法是向\mapping
宏添加一个可选的第一个参数,该参数指定冒号之前的最宽元素,并使用它\makebox
来确保该元素占用适当的空间:
笔记:
- 根据 egreg 的评论,指定
[t]
可选的第一个参数来array
提供所需的垂直对齐。 - 第一个参数是可选的,如果没有指定,
\mapping
则默认为第一个必需参数。\IfStrEq
包裹xstring
用于测试第一个参数是否为空。如果您不想使用附加包,则可以不使用附加包来进行此比较。 - 宏
\widthof
来自包裹calc
。 - 宏
\makebox
和\widthof
期望文本参数因此需要在这些宏的参数内进入数学模式。
代码:
\documentclass{article}
\usepackage{xstring}
\usepackage{calc}
\usepackage{amsmath}
\usepackage{amsfonts}
\newcommand*\Rset{\mathbb{R}}
\newcommand*{\WidestElement}{}%
\newcommand*\mapping[6][]{%
\begingroup
\setlength\arraycolsep{0.2em}%
\IfStrEq{#1}{}{%
\def\WidestElement{#2}% default \WidestElement to same as #2
}{%
\def\WidestElement{#1}% \WidestElement was specified
}%
\begin{array}[t]{ccccc}%
\makebox[\widthof{$\WidestElement$}][r]{$#2$}&\colon&{#3}&\longrightarrow&{#4}\\
&&{#5}&\longmapsto&{#6}%
\end{array}%
\endgroup
}%
\begin{document}
\begin{align*}
&\mapping[\mathrm{Function}]{f}{\Rset}{\Rset}{x}{x^2,}&
&\mapping{M}{\Rset}{\Rset}{x}{x^{42},}\\*[2ex]
&\mapping{\mathrm{Function}}{X}{Y}{x}{\dfrac1{1+\dfrac1{1+x^2}},}&
&\mapping{U}{\Rset}{\Rset}{x}{x.}
\end{align*}
\end{document}