如何为“聚集”环境的开始和结束创建快捷方式

如何为“聚集”环境的开始和结束创建快捷方式

我正在使用 sharelatex,发现了这种奇怪的行为。在下面的代码中,前两个方程式无法编译,而后两个方程式可以编译。

由于这些方法不起作用,有人能告诉我另一种创建环境快捷方式的方法gather吗?

\documentclass{article}
\usepackage{amsmath}

\def\bg{\begin{gather}}
\def\eg{\end{gather}}
\newcommand{\bgat}{\begin{gather}}
\newcommand{\egat}{\end{gather}}
\newcommand{\be}{\begin{equation}}
\newcommand{\ee}{\end{equation}}

\begin{document}\noindent

try \#1
    \bgat
        2 + 2 = 4\\
        \frac{\sqrt{y}}{x^2} = a
    \egat

try \#2
    \bg
        2 + 2 = 4\\
        \frac{\sqrt{y}}{x^2} = a
    \eg

try \#3
    \be
        2 + 2 = 4
    \ee

try \#4
    \begin{gather}
        2 + 2 = 4\\
        \frac{\sqrt{y}}{x^2} = a
    \end{gather}

\end{document}

答案1

您可以使用带有分隔参数的宏来执行所需的操作。但正如 Bernard 所说,最好只是配置编辑器以插入完整环境。

我没有深入研究它,但我怀疑它\begin{gather}正在明确寻找\end{gather}。由于它隐藏在您的 中\eg,因此找不到它。

使用带有分隔参数的宏看起来像这样:

\documentclass{article}
\usepackage{amsmath}

\def\bg#1\eg{%
    \begin{gather}%
    #1%
    \end{gather}%
}

\begin{document}

\bg
2+2 = 4\\
\frac{\sqrt{y}}{x^2} = a
\eg

\end{document}

答案2

gather软件包的多行显示数学环境(例如)amsmath设置为查找明确的硬编码终止字符串(例如),\end{gather}以确定何时到达环境的末尾。您的尝试 #1 和 #2 无法工作的原因是 LaTeX在扫描前定位环境末尾时只“看到”\eg和。但是,在此扫描前阶段,LaTeX 不会\egatgather不是扩展任何宏,因此没有机会“意识到”这些宏将扩展为\end{gather}

因此,虽然可以创建 LaTeX 宏作为\begin{gather}单行环境 和 的缩写equation,但基于宏的方法将无法用于\egat\eg。但是,如果您可以自由使用 LuaLaTeX,则可以采用预处理器方法,如以下示例所示。(如果您对细节感到好奇:示例代码设置了一个在处理的早期阶段运行的 Lua 函数。该函数扫描所有输入行并“动态”替换出现在行末的所有 实例\eg。请注意,字符串中\end{gather}的 实例确实\eg\verb+\eg+不是由Lua函数进行操作。

在此处输入图片描述

% !TeX program = lualatex
\documentclass{article}
\usepackage{amsmath,luacode}

%% OK to create LaTeX shortcut macros for "equation" env.
\newcommand{\be}{\begin{equation}}
\newcommand{\ee}{\end{equation}}
%% OK to create LaTeX macro to abbreviate "\begin{gather}"
\newcommand{\bg}{\begin{gather}}

%% Preprocessor approach to handle abbrev. for "\end{gather}"
\begin{luacode}
function do_gather ( s )
   return s:gsub ( "\\eg$" , "\\end{gather}" )
end
luatexbase.add_to_callback ( "process_input_buffer", do_gather , "do_gather" )
\end{luacode}

\begin{document}

\noindent
\verb+gather+ environment: \verb+\bg+ and \verb+\eg+
    \bg
        2 + 2 = 4\\ 
        \frac{\sqrt{y}}{x^2} = a
    \eg
\verb+equation+ environment: \verb+\be+ and \verb+\ee+
    \be
        2 + 2 = 4
    \ee
\end{document}

答案3

如果问题是定义一个自定义环境我们可以一劳永逸地重新定义,比如说,要么,要么gathergather*正如 OP 指出的那样她的/他的一条评论(当然,从 切换gatheralign或反之亦然,似乎不太明智!),应该注意的是,这——我再说一遍,对于一个环境这要归功于 Michael J. Downes 十五/二十年前编写的代码,这些代码在集成到包中后amsmath,成为了包的基础environs。以下代码为一个工作示例:

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\usepackage{amsmath}

\newenvironment*{mygather}{\gather}{\endgather}
% \newenvironment*{mygather}{\csname gather*\endcsname}{\endgather}
\newenvironment*{myalign}{\align}{\endalign}
% \newenvironment*{myalign}{\csname align*\endcsname}{\endalign}



\begin{document}

A customized \texttt{gather} environment:
\begin{mygather}
    1+1+1+1 = 4\\
    \frac{\sqrt{y}}{x^2} = a
\end{mygather}

A customized \texttt{align} environment:
\begin{myalign}
    1+1+1+1 &= 4\\
    \frac{\sqrt{y}}{x^2} &= a
\end{myalign}

\end{document}

您可以注释掉以下两行:

\newenvironment*{mygather}{\gather}{\endgather}

\newenvironment*{myalign}{\align}{\endalign}

并取消注释以下代码:

% \newenvironment*{mygather}{\csname gather*\endcsname}{\endgather}

% \newenvironment*{myalign}{\csname align*\endcsname}{\endalign}

并检查一切是否按预期运行。

以下几点值得注意:

  1. 这是不是例如,有必要说

    \newenvironment*{myalign}
        {\csname align*\endcsname}
        {\csname endalign*\endcsname}
    

    因为\csname endalign*\endcsname\endalign,以及\csname endgather*\endcsname\endgather,是完美的同义词。

  2. 写如下内容可能更明显

    \newenvironment*{mygather}{\begin{gather}}{\end{gather}}
    

    但这确实不是工作。

  3. 比如说,加价的好处

    \begin{mygather} ... \end{mygather}
    

    超过

    \bgather ... \egather
    

    前者集成到 LaTeX 的环境系统中,利用其名称检查功能;因此,如果您mygather\end声明中拼错了名称,您将收到一条有意义的错误消息。另一方面,如果您拼错了参数分隔符(如)\egather,(La)TeX 将吞噬文件的其余部分,然后很可能以一些神秘的错误消息停止。(当然,我们假设拼错关键字\end本身的可能性要小得多,因为许多编辑器会自动提供它。)

相关内容