是否可以为align*
环境定义一个宏,或者允许方程显示模式多行支持$$ $$
?
我非常频繁地使用该align*
环境,典型的用法如下:
\begin{align*}
A &= B \\
&= C
\end{align*}
每次输入整个命令很麻烦,所以我尝试为它们定义一个宏:
\documentclass[10pt]{article}
\usepackage{geometry}% larger text width
\usepackage{amsmath}
\newcommand{\begin{align*}}{\bal}
\newcommand{\end{align*}}{\eal}
\begin{document}
text here
\end{document}
但这会引发错误,似乎是因为\begin
等不能适合定义\newcommand
:
! LaTeX Error: Command \begin already defined. (Line 5)
! Undefined control sequence. (Line 5)
! LaTeX Error: Command \end already defined. (Line 6)
! Undefined control sequence. (Line 6)
那么,可以执行以下操作之一吗?
- 为环境定义一个快捷方式
align*
。 - 获得显示模式的多行对齐支持
$$ $$
。 - 查找另一个创建具有可选编号的多行对齐方程的命令。
答案1
您要求的所有方面都是可能的,但是我建议您采用选项 #3。我将依次简要介绍每个方面。
- 为环境定义一个快捷方式
align*
。
您无法通过 执行此操作\newcommand
,正如您尝试过的那样(也无法通过 执行此操作\def
,这足以满足一些较简单的环境)。我将细节留给其他 帖子(H/T Phelype Oleinik 和 David Carlisle)。虽然您可以使用更复杂的代码来实现这一点,但这样做通常不是一个好主意(H/T David Carlisle)。
- 获得显示模式的多行对齐支持
$$ $$
。
目前没有很好的方法可以直接做到这一点,但有各种选项更一般地,最好考虑改进方程式对齐方法。
- 查找另一个创建具有可选编号的多行对齐方程的命令。
答案2
这是基于 LuaLaTeX 的实现第一个目标的方法。(通过实现第一个目标,就不再需要处理两个后备目标了,对吧?)这种方法允许您使用称为\bal
和\eal
的标记,如果放在一行的开头,将被替换为,\begin{align*}
并且\end{align*}
在处理的早期阶段,前TeX 完成其通常的工作。
请注意,仍然可以定义分别称为\bal
和的“真实” LaTeX 宏\eal
。只需确保它们永远不会在行首使用即可。
\begin{align*}
话虽如此,我认为手写并没有那么繁琐或麻烦\end{align*}
。
\documentclass{article}
\usepackage{amsmath} % for 'align*' env.
\usepackage{luacode} % for '\luaexec' macro
\luaexec{
function bal_eal ( s )
s = s:gsub ( "^\\bal" , "\\begin{align*}" )
s = s:gsub ( "^\\eal" , "\\end{align*}" )
return s
end
}
% Assign the Lua function to LuaTeX's 'process_input_buffer' callback:
\AtBeginDocument{\luaexec{luatexbase.add_to_callback(
"process_input_buffer", bal_eal, "baleal" )}}
% Define a separate macro called '\bal'
\newcommand\bal{Hello World}
\begin{document}
\noindent
An instance of \verb+\bal+ not at the start of a line: \bal.
\bal % <-- '\bal' occurs at start of line
A &= B \\
&= C
\eal % <-- '\eal' occurs at start of line
More text.
\end{document}