我最近确信使用align
over的好处eqnarray
,但我真的没有写
\begin{align}
...
\end{align}
每次我都只是做了我一直在做的事情:
\def\bea{\begin{align*}}
\def\eea{\end{align*}}
但是,align
似乎无法与我定义的命令一起使用。我甚至尝试了其他定义方法,使用\let
和\newcommand
,但似乎都不起作用。我总是得到相同的错误。举个例子,如果我输入:
\bea
E = mc^2
\eea
这很简单,我仍然得到:
失控参数?E &= mc^2 \eea
!段落在 \align* 完成之前结束。 \par
但是如果我写完整命令,它确实有效。为什么会这样?我该如何解决?我知道 LaTeX 只能扩展\eea
为\end{align*}
,所以不应该出现导致错误而错误不能出现的情况。
答案1
按照 Mico 的回答,这种tokcycle
方法还会提前检查所有标记,进行替换,然后排版结果。所以这里,\bea
和\eea
只是夸克,被标记循环丢弃和替换。
最棒的是,它还可以在 pdflatex 中运行,并且只需进行一次编译。只需将您的文档包装在 中即可\tokencyclexpress...\endtokencyclexpress
。
附文:必须将改变 catcode 的材料(例如逐字逐句)排除在环境之外。已编辑以支持使用#
。因此,只需根据需要结束并重新启动环境即可。
当然,这里的根本问题是您的源代码仍然使用会使您的合著者感到困惑并且您的编辑者会讨厌的语法。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{tokcycle,amsmath}
\Characterdirective{\whennotprocessingparameter#1{\addcytoks{#1}}}
\Macrodirective{
\ifx\bea#1\addcytoks{\begin{align}}\else
\ifx\eea#1\addcytoks{\end{align}}\else
\addcytoks{#1}\fi\fi}
\def\bea{\bea}
\def\eea{\eea}
\begin{document}
\tokencyclexpress
\tableofcontents
\hrulefill
\section{My equation}
\def\massmultiplier#1{m#1}
\meaning\massmultiplier
Here it is.
\bea
E &= \massmultiplier{c^2} \\
1+1 &= 2
\eea
Wasn't that great?
\endtokencyclexpress
\end{document}
答案2
如果你有空,并且能够用 LuaLaTeX 编译你的文档,那么你可以定义一个 Lua 函数,在处理的早期阶段分别用和替换所有\bea
和实例,\eea
\begin{align}
\end{align}
前TeX 开始其常规处理工作。
观察这个集合,\bea
并且\eea
可能看就像它们是普通的 LaTeX 宏一样。然而,事实并非如此。它们只是标记,将在预处理器阶段被真正的 LaTeX 指令替换。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath} % for align environment
\usepackage{unicode-math}
\usepackage{luacode} % for \luaexec macro
\luaexec{
function bea_eea ( s )
s = s:gsub ( "^\\bea" , "\\begin{align}" )
s = s:gsub ( "^\\eea" , "\\end{align}" )
return s
end
}
% Assign the Lua function to LuaTeX's "process_input_buffer" callback:
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
"process_input_buffer" , bea_eea , "beaeea" )}}
\begin{document}
\bea
E &= mc^2 \\
1+1 &= 2
\eea
\end{document}