在对齐内存储环境内容

在对齐内存储环境内容

现在我们来谈谈另一个一直困扰我的问题。

\documentclass[a4paper]{article}
\usepackage{amsmath,environ}
\def\storer#1{\def\data{#1}}
\makeatletter
\newenvironment{test}{\Collect@Body\storer}{%
  \begin{pmatrix}
  \data
  \end{pmatrix}
}
\makeatother
\begin{document}
This works
\begin{equation*}
 \begin{test}
  a & b \\ c & d
 \end{test}
\end{equation*}
This does not
\begin{align*}
\begin{test}
  a & b \\ c & d
\end{test}
\end{align*}
\end{document}

原因是,我想制作可扩展的矩阵,即我不想添加\scalebox{...}{....}矩阵,这不是一个好的用户界面。

目前我正在使用一种利用lrbox和的解决方案varwidth,虽然它可以起作用,但并不美观。

约瑟夫·赖特提到,这可能与双重排版巫术有关align

有想法吗?

答案1

最简单的方法是使用

\begin{align*}
{\begin{test}
  a & b \\ c & d
\end{test}}
\end{align*}

使用额外的支撑组,它就可以工作了。

失败的原因本质上是外部对齐不知道测试环境是一个对齐,因此&将其作为外部对齐的一部分,从而导致出错。

也许可以通过添加一些来避免显式分组

  \ifnum0=`}\fi

某处的群体,但AMS对齐是脆弱的野兽(已经在收集环境体来测量事物,因此在内部再次进行测量有点微妙(并且可能效率低下)您最好挂接到信息\if@mesuring并提取对齐已经收集的数据,而不是重新测量。


添加群组的版本ifnum

\documentclass[a4paper]{article}
\usepackage{amsmath,environ}
\def\storer#1{\def\data{#1}}
\makeatletter
\newenvironment{test}{%
\iffalse{\fi\ifnum 0=`}\fi
\Collect@Body\storer}{%
  \begin{pmatrix}
  \data
  \end{pmatrix}%
  \ifnum0=`{}\fi
}


\begin{document}
This works
\begin{equation*} \begin{test}  a & b \\ c & d \end{test}\end{equation*}
This does not
\begin{align*}
\begin{test}
  a & b \\ c & d
\end{test}
\end{align*}
\end{document}

相关内容