amsmath 对齐和宏的问题

amsmath 对齐和宏的问题

我最近确信使用alignover的好处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}

相关内容