枚举中 align* 的垂直对齐

枚举中 align* 的垂直对齐

相关(但不相同)
将枚举中的数字与方程式对齐
在列表中显示方程式

今天早些时候,我问了一个关于在环境中对齐方程的问题enumerate,并得到了一个似乎适用于我给出的例子的答案,但事实证明我对我的问题还不够具体。

我使用align*环境,通常将其作为列表项的唯一部分。(如果您想知道为什么我不使用更多词语来介绍align*,这些大多是家庭作业解决方案,其中大部分工作是代数等。)

这是我的代码及其效果(中间线以上):

\begin{enumerate}
  \item \begin{align*}
    x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{align*}
  \item \begin{align*}
    \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                    &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
  \end{align*}
\end{enumerate}

悲伤的事

我试图使环境第一行的基线align*与数字的基线相同——我希望环境的第一行align*相对于其数字具有与图片后半部分相同的垂直位置(以相同的方式水平居中)。(附带问题:为什么开始之前有这么多空间align*?)

答案1

我一直在使用 Philippe Goutet 在此处发布的解决方案,但最近发现了一种更简单的解决方案,即使用aligned具有可选[t]对齐的环境:

  \item $\begin{aligned}[t]
    x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{aligned}$

得出的结果是:

在此处输入图片描述

笔记:

代码:

\documentclass{article}
\usepackage{showframe}
\usepackage{amsmath}

\begin{document}
\begin{enumerate}
  \item $\begin{aligned}[t]
    x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{aligned}$
  \item $\begin{aligned}[t]
    \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                    &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
  \end{aligned}$
\end{enumerate}
\end{document}

如果您希望它们水平居中(这是环境的默认设置),您可以在任一侧align添加:\hfill

  \item \hfill$\begin{aligned}[t]
    x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{aligned}$\hfill\null

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{showframe}
\usepackage{amsmath}

\begin{document}
\begin{enumerate}
  \item \hfill$\begin{aligned}[t]
    x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{aligned}$\hfill\null
  \item \hfill$\begin{aligned}[t]
    \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                    &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
  \end{aligned}$\hfill\null
\end{enumerate}
\end{document}

答案2

有一种方法可以使用 pdftex 原语自动测量 的开头\item和 第一行之间的间距。{align*}\pdfsavepossaveposzref 包为该功能提供了相当不错的界面。

代码的工作原理如下:将\mi宏放置在需要放置材料的位置,然后将\md(如果不喜欢这些名称,可以更改)放置在材料所在的位置。例如,

  \item \mi\begin{align*}\md
      x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{align*}

经过几次编译(最多可能需要 4 次),您将获得方程式和项目编号的完美对齐。

这是完整的代码,通过几个方程和一个表格展示了对齐是如何进行的。我还添加了一个我重新定义的变体,{align*}这样\mi和就\md不再是必需的(这样更容易输入)。

代码结果

\documentclass[12pt]{article}

\usepackage{amsmath}
\usepackage[savepos]{zref}

\makeatletter
\newcounter{autoenumvspace}
\setcounter{autoenumvspace}{0}
\newcommand{\mi}{\markitemstart}
\newcommand{\markitemstart}{%
  \addtocounter{autoenumvspace}{1}%
  \@ifundefined{autoenumvspacevalue\romannumeral\value{autoenumvspace}}%
    {\edef\autoenumvspace@value{0pt}}%
    {\edef\autoenumvspace@value{\csname autoenumvspacevalue\romannumeral\value{autoenumvspace}\endcsname}%
  }
  \ifnum\zposy{auto@enum@\number\value{autoenumvspace}@bottom}=%
        \zposy{auto@enum@\number\value{autoenumvspace}@top}
     \@ifundefined{autoenumvspacevalue\romannumeral\value{autoenumvspace}}%
     {}%
     {\immediate\write\@mainaux{\gdef\expandafter\noexpand\csname autoenumvspacevalue\romannumeral\value{autoenumvspace}\endcsname{\csname autoenumvspacevalue\romannumeral\value{autoenumvspace}\endcsname}}}%
  \else
     \ifdim\dimexpr\zposy{auto@enum@\number\value{autoenumvspace}@bottom}sp-\zposy{auto@enum@\number\value{autoenumvspace}@top}sp\relax=\autoenumvspace@value
        \immediate\write\@mainaux{\gdef\expandafter\noexpand\csname autoenumvspacevalue\romannumeral\value{autoenumvspace}\endcsname{\the\dimexpr\zposy{auto@enum@\number\value{autoenumvspace}@bottom}sp-\zposy{auto@enum@\number\value{autoenumvspace}@top}sp\relax}}%
     \else
        \edef\autoenumvspace@value{0pt}%
        \immediate\write\@mainaux{\gdef\expandafter\noexpand\csname autoenumvspacevalue\romannumeral\value{autoenumvspace}\endcsname{\the\dimexpr\zposy{auto@enum@\number\value{autoenumvspace}@bottom}sp-\zposy{auto@enum@\number\value{autoenumvspace}@top}sp\relax}}%
     \fi
  \fi
  \vspace*{-\autoenumvspace@value}%
  \leavevmode
  \zsavepos{auto@enum@\number\value{autoenumvspace}@top}%
  \vspace*{\autoenumvspace@value}%
}
\newcommand{\md}{\markdisplaystart}
\newcommand{\markdisplaystart}{%
  \zsavepos{auto@enum@\number\value{autoenumvspace}@bottom}%
}
\makeatother

\begin{document}

\section{Manual version}

\begin{enumerate}\belowdisplayskip=0pt \abovedisplayskip=0pt % optional
  \item \mi\begin{align*}\md
      x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{align*}
  \item \mi\begin{align*}\md
     \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                    &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
  \end{align*}
  \begin{enumerate}
      \item \mi\[\md x^n + y^n = z^n\]
      \item \mi\[\md \sum_{n=1}^{+\infty}{\frac{1}{n^2}} = \frac{\pi^2}{6}\]
      \item \mi
\begin{center}\begin{tabular}{|c|c|c|}
\hline
\md text & text & text \\
\hline
text & text & text \\
\hline
\end{tabular}\end{center}
  \end{enumerate}
\end{enumerate}

\section{Automatic version}

\begin{enumerate}\belowdisplayskip=0pt \abovedisplayskip=0pt % optional
\makeatletter
\renewenvironment{align*}{%
  \mi\start@align\@ne\st@rredtrue\m@ne\md
}{%
  \math@cr \black@\totwidth@
  \egroup
  \ifingather@
    \restorealignstate@
    \egroup
    \nonumber
    \ifnum0=`{\fi\iffalse}\fi
  \else
    $$%
  \fi
  \ignorespacesafterend
}
\expandafter\def\expandafter\[\expandafter{\expandafter\mi\[\md}
\makeatother
  \item \begin{align*}
      x^2 + y^2 &= x^2 + (iy)^2 \\
              &= (x + iy) (x - iy)
  \end{align*}
  \item \begin{align*}
     \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                    &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
  \end{align*}
  \begin{enumerate}
      \item \[ x^n + y^n = z^n\]
      \item \[ \sum_{n=1}^{+\infty}{\frac{1}{n^2}} = \frac{\pi^2}{6}\]
      \item \mi
\begin{center}\begin{tabular}{|c|c|c|}
\hline
\md text & text & text \\
\hline
text & text & text \\
\hline
\end{tabular}\end{center}
  \end{enumerate}
\end{enumerate}


\end{document}

答案3

align*如果您使用选项,您可以将数字作为公式标签放入环境的第一行leqno\tag*{1.}。如果您想获得自动编号,以下代码可以帮助您:

\documentclass[12pt,leqno]{article}
\usepackage{amsmath}
\newcounter{exercisenumber}
\setcounter{exercisenumber}{0}
\newcommand\leftnum{%
    \addtocounter{exercisenumber}{1}%
    \tag*{\phantom{99.}\llap{\arabic{exercisenumber}.}}%
    }
\begin{document}

\begin{align*}\leftnum
  x^2 + y^2 &= x^2 - (iy)^2 \\
            &= (x + iy) (x - iy)
\end{align*}
\begin{align*}\leftnum
  \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                  &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
\end{align*}

\end{document}

关于您在评论中提出的其他问题:我不知道您的目标输出是什么,但您可以尝试这个:

\newcounter{exercisenumber}
\newcounter{subnumber}
\setcounter{exercisenumber}{0}
\newcommand\leftnum{%
    \addtocounter{exercisenumber}{1}%
    \tag*{\phantom{99.}\llap{\arabic{exercisenumber}.}}%
    }
\newenvironment{subnumbering}{%
    \addtocounter{exercisenumber}{1}%
    \setcounter{subnumber}{0}
    \renewcommand\leftnum{%
        \addtocounter{subnumber}{1}%
        \tag*{\phantom{99(a)}\llap{%
              \ifnum\value{subnumber}=1 \arabic{exercisenumber}\fi
              (\alph{subnumber})}}%
        }
    }{}

答案4

@Herbert 的一个小变体版本。

\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}

\begin{enumerate}
   \item  \parbox[t]{\textwidth}{
   \vspace{-2.2em}\begin{align*}
        x^2 + y^2 &= x^2 + (iy)^2 \\
                  &= (x + iy) (x - iy)
   \end{align*}}
   \item \parbox[t]{\textwidth}{
   \vspace{-2.2em}\begin{align*}
        \frac{1}{n^2-4} &= \frac14 \frac{4}{(n-2)(n+2)} \\
                        &= \frac14 \left( \frac{1}{n-2}-\frac{1}{n+2} \right)
   \end{align*}}
\end{enumerate}

\end{document}

替代文本

相关内容