\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
,所以我更改了它。
现在,试着看看为什么会出现这个错误。嵌套环境经常会导致类似这样的错误。为了避免这种情况,您必须使用环境的命令形式(开始和结束)。
例如,环境的命令形式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
。