使用嵌入式收集定义新环境时遇到问题

使用嵌入式收集定义新环境时遇到问题

我查看了解决方案如何在自定义环境中嵌入收集环境? 但事情对我来说仍然不起作用:

梅威瑟:

\documentclass[border=6pt]{standalone}
\usepackage{amsmath}

\newenvironment{mygather}
  {%%
     \begin{minipage}{2in}
       \csname gather*\endcsname
  }{%%
       \csname endgather*\endcsname
     \end{minipage}%%
  }

\begin{document}

  \begin{mygather}
      y = x^{2} - 3x + 5
  \end{mygather}

\end{document}

答案1

\gather*命令发现它在minipage环境中,因此向前查找 。但直到执行时\end{minipage}它才存在,因此继续查找。以下可能有效:\end{mygather}\gather*

\newenvironment{mygather}
  {%%
     \minipage{2in}
       \csname gather*\endcsname
  }{%%
       \csname endgather*\endcsname
     \endminipage%%
  }

在此重写中,\minipage不是环境。封闭环境是mygather,因此\gather*向前查找\end{mygather},并找到它。我说它“可能有效”,因为尽管它可以很好地编译,并且 MWE 中没有错误,但我真的不知道你想要实现什么。

答案2

当您使用 时\csname gather*\endcsnameamsmath它足够聪明,能够知道它在哪个环境中被调用,从而吸收所有文本,直到\end出现相应的命令。对于您的代码,它确定已在 中调用minipage,但它无法 \end{minipage},它埋藏在结尾的代码里。

因此,就像 Dan 建议的那样,您可以使用\minipage\endminipage。但这不会给出良好的输出(我\fbox在它周围添加了以下内容只是为了清楚地显示问题):

在此处输入图片描述

这是为什么呢?因为你用一个显示来开始一个段落,这是不应该的。

解决方法是备份\baselineskip

\documentclass[border=6pt]{standalone}
\usepackage{amsmath}

\newenvironment{mygather}
  {%%
   \minipage{2in}
   \vspace{-\baselineskip}
   \csname gather*\endcsname
  }{%%
    \csname endgather*\endcsname
    \endminipage
  }

\begin{document}

\fbox{\begin{mygather}
      y = x^{2} - 3x + 5
  \end{mygather}}

\end{document}

在此处输入图片描述

一个更简单的方法是

\documentclass[border=6pt]{standalone}
\usepackage{amsmath}

\newenvironment{mygather}
  {%%
   \minipage{2in}
   \centering$\!\gathered
  }{%%
    \endgathered$
    \endminipage
  }

\begin{document}

\fbox{\begin{mygather}
      y = x^{2} - 3x + 5
  \end{mygather}}

\end{document}

相关内容