在 \halign 之后执行 token

在 \halign 之后执行 token

我喜欢使用 创建一个宏,它使用 将后面的括号组作为“参数”进行处理\halign。处理后,应该执行一个标记(宏)。使用\hbox我可以直接在左括号后使用\aftergroup\mytoken来执行右括号后的操作。但是,这不适用于\halign因为每个单元格都是自己的组,并且\aftergroup会将某些东西放在下一个单元格中。我还想使用一些递归\aftergroup宏,它总是将自己放在下一个单元格中,直到到达最后一个单元格。但这会破坏\noalign在 之后添加的任何代码\cr(或\\在 LaTeX 中),而且一开始就很棘手。

有没有办法使用\afterassignment,或者在之后\aftergroup执行宏的其他方法?或者在 之前放置并使用作为外部组的结尾也可以。}\halign\egroup}

\documentclass{article}

\def\mytab{%
    \afterassignment\dotab
    \let\dummy=%
}
\def\dotab{%
    \AFTERHALIGN\dosomethingafterwards
    \halign\bgroup
        \hfil\ignorespaces##\unskip\cr
}
\def\dosomethingafterwards{...}

\begin{document}

\mytab{%
    A \cr
    B \cr
    C \cr
}

\end{document}

答案1

简短的回答:这很难,也许不可能提供一个完全强大的解决方案,因为找出给定的 cr 是否是最后一个非常困难:在 之后\cr,TeX 会向前扫描,忽略空格(至少是普通的 (32,10) 个空格)和\crcr,并扩展除 eTeX 受保护的控制序列之外的所有其他内容,直到找到不可扩展的标记。然后 TeX 插入模板,但以下情况除外:

  • \noalign开始在表格行之间插入一个新组
  • \omit正常启动细胞,但不插入模板
  • catcode 2 标记(右括号或\egroup)结束\halign

我能想到的另外两件与 TeX 正在做的事情有交互的事情是 和\aftergroup\everycr\cr(或非冗余\crcr,即 TeX 在 之后扫描时不会忽略的\cr)之后,插入 的内容\everycr,紧接着是\aftergroup-ed 标记,然后是文件中的后续字符。正如我所解释的那样,TeX 会读取生成的标记列表,并在读取过程中进行扩展,忽略空格和\crcr

因此,我们需要检测任何 之后的右括号\cr。这需要一个不可扩展的\futurelet,正如您所说,这会破坏机制。解决方案是,其中\noalign检查下一个标记是什么,然后关闭该组(它将在页面中插入一个高度为零的垂直框,但我认为这不会改变输出。\everycr{\noalign\bgroup\test}\test\noalign

代码。我能想到的最简单的方法是使用\everycrtoken 参数。我使用 eTeX只插入出现在外部表中而不是嵌套表中的\currentgrouplevel特殊位。外部组也并不是真正需要的(只是为了将更改保留在本地)。主要思想是在每个之后插入一个以检查这是否是最后一个 cr(如果我们找到一个右括号)。我猜这可能与冗余/非冗余的交互不好,并且还有其他缺点。我注释掉了:如果你担心最后一个不会立即跟在右括号后面,它会很有用。\noalign\cr\everycr\cr\noalign\bgroup\futurelet...\crcr\romannumeral-\`0\cr

\def\mytab{%
    \begingroup
    \everycr\expandafter{%
        \expandafter\mytabcr
        \the\expandafter\currentgrouplevel\expandafter;%
        \the\everycr}%
    \afterassignment\dotab
    \let\dummy=%
}
\def\dotab{%
    \halign\bgroup
        \hfil\ignorespaces##\unskip\cr
}
\def\mytabcr#1;{%
    \ifnum\numexpr#1-2=\currentgrouplevel %not sure about that 2
        \noalign\bgroup
            \expandafter\mytabcrX %\romannumeral-`0%
    \fi}
\def\mytabcrX{\futurelet\mytabcrtoken\mytabcrtest}
\def\mytabcrtest{%
    \ifcat\noexpand\mytabcrtoken\egroup
        \aftergroup\mytabcrend
    \else
        \egroup
    \fi}
\def\mytabcrend{\egroup\dosomethingafter\endgroup}

相关内容