Определение среды выдает ошибку

Определение среды выдает ошибку
\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}

LaTeX сообщает мне, \begin{align*} on input line 511 ended by \end{enumalign}.что, похоже, это как-то связано с тем, как LaTeX интерпретирует мой код и заменяет макросы, но я не смог сделать это правильно.

решение1

Вот правильный код:

\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} 

Выход:

введите описание изображения здесь

Прежде всего, вам необходимо загрузить файл, amsmathесли вы хотите использовать его align*в своем документе.

Более того, доступное место для minipageесть \linewidthи нет \textwidth, поэтому я его изменил.

А теперь попробуйте понять, почему у вас эта ошибка. Вложенные среды часто вызывают ошибки, подобные той, что у вас. Чтобы обойти это, вам нужно использовать командную форму среды (begin и end).

Например, командная форма среды myenv:

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

В вашем случае я заменил \begin{minipage}на \minipageи \end{minipage}на \endminipage.

О align*(поскольку это отмеченная звездочкой форма), если вы посмотрите на определение окружающей align*среды в amsmath.sty, вы увидите

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

поэтому я заменил \begin{align*}на \start@align\@ne\st@rredtrue\m@neи \end{align*}на \endalign.

Обратите внимание, что, как указывает egreg в своем комментарии, вы можете заменить \start@align\@ne\st@rredtrue\m@neего на \@nameuse{align*}, который является оберткой для \csname align*\endcsname.

Связанный контент