删除并存储标记列表/\toks 的头部

删除并存储标记列表/\toks 的头部

我得到了一个标记列表(无参数宏)\myTokenList,定义如下

\def\myTokenList{$(x + y)^2$, \ie, \(x^2+y^2+2xy\)}

我想将它拆分为第一个标记,其余的标记,获得与

\def\head{$}
\def\tail{(x + y)^2$, \ie, \(x^2+y^2+2xy\)}

在大多数情况下,使用下面的宏很容易做到这一点\split

\def\split#1#2\EndMark{\def\head{#1}\def\tail{#2}}
\expandafter\split\myTokenList\EndMark

但是当第一个标记是空格时,此方法会失败。事实上,它甚至会吞噬任意数量的空格。

使用\futurelet似乎有帮助,但是

  • 我更希望\head它是一个能够精确扩展为标记的宏(而不是让它扩展的东西)

  • 我不知道如何删除第一个标记,即使在\futurelet-ting之后

请注意,我无法控制给我的标记列表(括号将被不同处理):这是在 TeX 胃的通用调试包的上下文中。

答案1

一种可能的方法是\futurelet判断是否存在空格,然后据此进行分支。

\catcode`\@=11\relax
\def\:{\let\@sptoken= } \: %
\long\def\firstofone#1{#1}
\def\splitter#1{%
  \let\splitter@arg#1%
  \expandafter\futurelet\expandafter\@let@token\expandafter\splitter@aux#1%
}
\def\splitter@aux{%
  \ifcat\noexpand\@let@token\@sptoken
    \def\head{ }%
    \splitter@aux@ii
  \else
    \expandafter\splitter@aux@v
  \fi
}
\def\splitter@aux@ii{%
  \expandafter\splitter@aux@iii\splitter@arg\@nil
}
\def\splitter@aux@iii{%
  \afterassignment\splitter@aux@iv
  \firstofone{\let\@let@token= }%
}
\def\splitter@aux@iv#1\@nil{%
  \def\tail{#1}%
}
\def\splitter@aux@v{%
  \expandafter\splitter@aux@vi\splitter@arg\@nil
}
\long\def\splitter@aux@vi#1#2\@nil{%
  \def\head{#1}%
  \def\tail{#2}%
}
\catcode`q=10\relax
\def\test{q\space abc}
\splitter\test
\show\head
\show\tail
\bye

这需要一些改进,例如处理空或单个标记参数,但总体原则应该很清楚。

相关内容