環境定義でエラーが発生する

環境定義でエラーが発生する
\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

関連情報