![環境定義でエラーが発生する](https://rvso.com/image/281483/%E7%92%B0%E5%A2%83%E5%AE%9A%E7%BE%A9%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B.png)
\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