活跃角色让位于(非活跃)角色

活跃角色让位于(非活跃)角色

似乎如果 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}

相关内容