似乎如果 I \let\amp&
,对齐标签&
可以在任何地方被替换\amp
(例如,在 的前言和正文中\halign
)。也可以使字符&
active ,并通过 赋予其相同的含义\catcode`\&=13
\let&\amp
。似乎&
已分配给对齐标签的active 可以在使用&
对齐标签的任何地方使用。&
这个想法很通用:我们可以定义一个宏,以一个角色作为参数,将其活动版本设置为自身(使用其当前的 catcode),最后使该角色活动。这使用了一个\lccode
技巧,由 Phillipe Goutet 描述。
\def\activate#1{\begingroup
\lccode`\~=`#1%
\lowercase{\endgroup \let~#1}%
\catcode`#1=13\relax}
这里有一个例子来说明这个操作不会破坏我能想到的大多数用途$
,&
例如,等。特别是$$...$$
仍然可以被识别,宏参数也是如此。
\activate &
\halign{#&#\cr a&b\cr}
\activate $ \activate ^ \activate _
$$ x^2_2 + y^2_2 $$
\activate #
\def\myshow#1{\show#1}
\myshow #
\bye
所以我的问题是:“这种方法有什么缺点?”它允许\futurelet
修复了对齐方式预览的问题。
答案1
这种方法的一个缺点是,先前定义的宏如果参数文本中包含这些特殊字符,将停止工作。编写良好的软件包会在调用此类宏之前将这些字符的 catcode 更改为预定义值,但您永远不知道。有时这也是不可行的,例如当宏应该完全可扩展时。
一般来说,在 TeX 执行找到的标记的每个上下文中,你的重新定义应该与原始定义相同,例如在正常装箱模式中,但在扫描模式。
答案2
此类活动字符使原始字符的工作方式与原始字符完全相同,除了在类别代码更改之前定义的宏的分隔参数以及\csname...\endcsname
构造内。
\def\delimited#1&{}
\let\amp&
\catcode`&=\active
\let&\amp
{\delimited...&} % BOOM: & is not seen
\csname &\endcsname % BOOM
\bye
第二种情况发生在尝试将\let\amp&
etc 添加到使用 的 LaTeX 文件的开头时amsmath
。这是由于\newhelp
使用\csname...\endcsname
构造来存储帮助消息,其中一个包含&
。可以通过&
在 内部本地重新定义来避免这种情况\newhelp
:
\let\amp&
\catcode`&=\active
\let&\amp
\RequirePackage{amsgen}
\def\newhelp#1#2{\edef&{\string&}%
\newtoks#1#1\expandafter{\csname #2\endcsname}% old def of \newhelp
\let&\amp}
\RequirePackage{amsmath}
\relax
或者让它处于活动状态但仅等于对齐选项卡,\begin{document}
因为对齐选项卡仅在表格内部有用,而表格通常不会出现在文档外部:
\def\alignmenttab{&}
\catcode`&=\active
\let&\alignmenttab % macro!
\AtBeginDocument{\expandafter\let\expandafter&\alignmenttab}
%
\documentclass{article}
\usepackage{amsmath}
% ...
\begin{document}