从盒子外面看不到盒子内的对齐标记

从盒子外面看不到盒子内的对齐标记

我真的不知道如何写标题,希望它足够清楚(如果有人建议更好的内容,我愿意更改它)。

我的问题如下:我想将不同的项目彼此对齐,但锚点位于已对齐的环境内(这当然会失败,因为在这个环境之外看不到它)。通常,我会给出几个函数定义,我希望它们之间有令人满意的水平和垂直对齐:水平对齐相对于列,垂直对齐相对于第一行的底部。这是一个 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&#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}

答案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}

相关内容