![環境定義給出錯誤](https://rvso.com/image/281483/%E7%92%B0%E5%A2%83%E5%AE%9A%E7%BE%A9%E7%B5%A6%E5%87%BA%E9%8C%AF%E8%AA%A4.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
is\linewidth
和 not \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
。