我得到了一个标记列表(无参数宏)\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
这需要一些改进,例如处理空或单个标记参数,但总体原则应该很清楚。