A definição do ambiente dá um erro

A definição do ambiente dá um erro
\documentclass{scrreprt}

\usepackage{fontspec}
\setmainfont{Linux Libertine O}

\usepackage{graphicx}

\usepackage{polyglossia}
\setdefaultlanguage[babelshorthands=true]{german}

% align in enumerate
\newenvironment{enumalign}[1][\textwidth]%
{\item \begin{minipage}[t]{#1} \vspace{-5.375ex} \begin{align*}}
{\end{align*} \end{minipage}}

\renewcommand*\thechapter{\arabic{chapter}}

\usepackage{color}

\newcommand*\defin[1]{\textcolor{red}{#1}}

\begin{document}

\begin{enumerate}
\begin{enumalign}
test
\end{enumalign}
\end{enumerate}

\end{document}

O LaTeX está me dizendo \begin{align*} on input line 511 ended by \end{enumalign}.que parece ter algo a ver com a forma como o LaTeX interpreta meu código e substitui macros - mas não consegui acertar.

Responder1

Este é o código correto:

\documentclass{scrreprt}

\usepackage{amsmath}

\usepackage{fontspec}
\setmainfont{Linux Libertine O}

\usepackage{graphicx}

\usepackage{polyglossia}
\setdefaultlanguage[babelshorthands=true]{german}

% align in enumerate
\makeatletter
\newenvironment{enumalign}[1][\linewidth]%
{\item\minipage[t]{#1}\vspace{-5.375ex}\start@align\@ne\st@rredtrue\m@ne}
{\endalign\endminipage}
\makeatother

\renewcommand*\thechapter{\arabic{chapter}}

\usepackage{color}

\newcommand*\defin[1]{\textcolor{red}{#1}}

\begin{document}

\begin{enumerate}
\begin{enumalign}
test
\end{enumalign}
\end{enumerate}

\end{document} 

Saída:

insira a descrição da imagem aqui

Primeiro de tudo, você tem que carregar amsmathse quiser usar align*no seu documento.

Além disso, o espaço disponível para o minipageé \linewidthe não \textwidth, então mudei.

E agora, tente ver por que você recebeu esse erro. Ambientes aninhados geralmente causam erros como o que você possui. Para contornar isso, você deve usar a forma de comando do ambiente (início e fim).

Por exemplo, a forma de comando do ambiente myenvé

\myenv     % same as \begin{myenv}
\endmyenv  % same as \end{myenv}

No seu caso, substituí \begin{minipage}por \minipagee \end{minipage}por \endminipage.

Sobre align*(sendo a forma com estrela), se você der uma olhada na definição do align*ambiente em amsmath.sty, verá

\newenvironment{align*}{%
  \start@align\@ne\st@rredtrue\m@ne
}{%
  \endalign
}

então, substituí \begin{align*}por \start@align\@ne\st@rredtrue\m@nee \end{align*}por \endalign.

Observe que, como egreg aponta em seu comentário, você pode substituir \start@align\@ne\st@rredtrue\m@nepor \@nameuse{align*}, que é um wrapper para \csname align*\endcsname.

informação relacionada