我喜欢使用 创建一个宏,它使用 将后面的括号组作为“参数”进行处理\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
代码。我能想到的最简单的方法是使用\everycr
token 参数。我使用 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}