我正在使用 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 不会\egat
gather
不是扩展任何宏,因此没有机会“意识到”这些宏将扩展为\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
如果问题是定义一个自定义环境我们可以一劳永逸地重新定义,比如说,要么,要么gather
,gather*
正如 OP 指出的那样她的/他的一条评论(当然,从 切换gather
到align
或反之亦然,似乎不太明智!),应该注意的是,这——我再说一遍,对于一个环境—是这要归功于 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}
并检查一切是否按预期运行。
以下几点值得注意:
这是不是例如,有必要说
\newenvironment*{myalign} {\csname align*\endcsname} {\csname endalign*\endcsname}
因为
\csname endalign*\endcsname
和\endalign
,以及\csname endgather*\endcsname
和\endgather
,是完美的同义词。写如下内容可能更明显
\newenvironment*{mygather}{\begin{gather}}{\end{gather}}
但这确实不是工作。
比如说,加价的好处
\begin{mygather} ... \end{mygather}
超过
\bgather ... \egather
前者集成到 LaTeX 的环境系统中,利用其名称检查功能;因此,如果您
mygather
在\end
声明中拼错了名称,您将收到一条有意义的错误消息。另一方面,如果您拼错了参数分隔符(如)\egather
,(La)TeX 将吞噬文件的其余部分,然后很可能以一些神秘的错误消息停止。(当然,我们假设拼错关键字\end
本身的可能性要小得多,因为许多编辑器会自动提供它。)