尝试定义自定义对齐环境时出错

尝试定义自定义对齐环境时出错

我目前正在尝试创建一个具有自己的计数器的自定义环境。

\documentclass[a4paper,11pt]{report}
\usepackage[fleqn]{amsmath}
\newcounter{grammarcounter}

\newenvironment{grammar}{
   \refstepcounter{grammarcounter}
   \begin{equation*}
   \tag{$\Gamma_{\thegrammarcounter}$}
   }{\end{equation*}}
\numberwithin{grammarcounter}{chapter}

\begin{document}

\begin{grammar}
\label{gr:label}
E ::= E + E \\
E ::= a
\end{grammar}

\end{document}

这对于简单的方程式来说效果很好,但行拆分 \\ 在 equation* 环境中不起作用。理想情况下,我想用 align* 环境替换 equation* 环境。但是,当简单地将示例中的 equation* 替换为 align* 时,我收到 LaTeX 错误,指示输入行上的 \begin{align} .. 以 \end{grammar} 结束。

如何创建一个具有自己的计数器并尊重换行符的自定义方程环境?

答案1

我不知道为什么,但是你不能在新的环境定义中使用\begin{align}\end{align};你必须使用“低级”宏\align\endalign编辑:正如所指出的alexwlchan他的评论,您可以在第 6 节中找到更多详细信息amsmath包装上的技术说明

这里我使用了相当于align*环境的命令(参见赫伯特的回答定义自定义 align 和 align* 环境)。

grammarcounter请注意,如果您尝试在课程中的每个章节重置您的,您将收到错误article,因为后者没有章节;\section是课程中最高级的分段命令article。您的意思是

\numberwithin{grammarcounter}{section}

反而?

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath}

\newcounter{grammarcounter}[section]

\makeatletter
\newenvironment{grammar}
{%
  \refstepcounter{grammarcounter}
  \start@align\@ne\st@rredtrue\m@ne
  \tag{$\Gamma_{\thegrammarcounter}$}
}{%
  \endalign
}
\makeatother
 
\begin{document}

\section{Foo}

\begin{grammar}
\label{gr:label}
E &::= E + E \\
E &::= a     \\
E &::= b     
\end{grammar}

\begin{grammar}
\label{gr:label2}
E &::= E + E \\
E &::= a     \\
E &::= b     
\end{grammar}

\end{document}

答案2

您可以在环境中aligned嵌套:splitgrammar

\documentclass[a4paper,11pt]{report}
\usepackage[fleqn,tbtags]{amsmath}

\newcounter{grammarcounter}[chapter]
\renewcommand{\thegrammarcounter}{\thechapter.\arabic{grammarcounter}}

\newenvironment{grammar}
  {\refstepcounter{grammarcounter}
   \begin{equation*}
   \tag{$\Gamma_{\thegrammarcounter}$}}
  {\end{equation*}}

\begin{document}

\chapter{Start}

\begin{grammar}
\label{gr:label}
\begin{aligned}
E &::= E + E \\
E &::= a
\end{aligned}
\end{grammar}

\begin{grammar}
\label{gr:label-two}
\begin{split}
E &::= E + E \\
E &::= a
\end{split}
\end{grammar}

\end{document}

split不使用tbtags选项相当于aligned(数字将垂直居中)。所以我举了两个例子来展示差异,并添加了选项。

在此处输入图片描述

我不会将其设置grammar为自动多行环境,因为需要考虑间距问题。mlgrammar如果需要,您可以定义一个环境:

\newenvironment{mlgrammar}
  {\begin{grammar}\begin{aligned}}
  {\end{aligned}\end{grammar}}

答案3

巧合的是,我也在为语法制作自定义对齐环境。我没有使用左对齐方程(因此没有fleqn选项amsmath),但我确实希望语法左对齐。这是一个基于环境的解决方案,可以帮助处于类似情况的人:

\documentclass[a4paper,11pt]{report}

\usepackage{amsmath}
\let\nr\relax%          https://tex.stackexchange.com/a/512854/203081
\usepackage{nccmath}  % https://tex.stackexchange.com/a/467619/203081

\newlength{\grammarindent}
\setlength{\grammarindent}{3em}
\newcounter{grammarcounter}[chapter]
\renewcommand{\thegrammarcounter}{\thechapter.\arabic{grammarcounter}}

\newenvironment{grammar}
{%
    \refstepcounter{grammarcounter}%
    \begin{fleqn}[\grammarindent]\begin{equation*}\left\{\:\tag{$G_{\thegrammarcounter}$}\begin{aligned}%
}%
{%
    \end{aligned}\right.\end{equation*}\par\end{fleqn}% You need the \par to prevent \end{fleqn} from acting like a space.
}


\begin{document}

\begin{grammar}\label{gr:label}
    E &::= E + E \\
    E &::= a
\end{grammar}

\end{document}

nccmath提供fleqn环境。我不确定为什么上述答案不包括alignedgrammar环境内部,但我已经在这里这样做了,并且运行良好。

相关内容