这是我不明白的\futurelet
,在这种情况下,进入宏观\xfl
。我可以成功地做原型测试
\ifx\xfl x...
测试下一个标记是否为x
。如果为真,则表示\xfl
替换为x
。但是,如果我执行
\detokenize\expandafter{\xfl}
我没有得到x
我期望的,而只得到了不可扩展的\xfl
。
这是为什么?除了 ted 令牌之外,还有其他测试可以执行吗\ifx
?\futurelet
我真的无法捕获(并保存)该令牌吗?
\documentclass{article}
\usepackage[T1]{fontenc}
\def\fltest{\futurelet\xfl\pdecide}
\def\pdecide{%
\ifx\xfl x\relax[Next character is x]\else[Not x]\fi\par
(Can't detokenize\detokenize\expandafter{\xfl})\par
}
\begin{document}
\fltest xyz
\end{document}
我真正想要的是能够获取经过\futurelet
ted 的令牌并将其作为参数传递给 a \readlist
。但是此代码挂起了:
\documentclass{article}
\usepackage{listofitems}
\def\fltest{\futurelet\xfl\pdecide}
\def\pdecide{%
\setsepchar{x}% SEARCH FOR x IN NEXT LIST
\readlist\mylist{\xfl}\listlen\mylist[]:
}
\begin{document}
\fltest xyz
\end{document}
注意:siracusa 正确指出\xfl
不能用 替换x
,它是 x
。尽管如此,有些事情我能用 做,x
但用 做不到\xfl
。例如,我可以用 `x 获取 的 ascii 值x
,但不能用 `\xfl 获取相同的值。
答案1
和基\let
元\futurelet
创建隐式字符标记。因此,什么时候
\futurelet\foo\baz a
令牌\foo
是一个a
。这是不是扩展为 的宏a
。
\show
通过使用and我们可以看见这一点\meaning
:
\def\baz{\edef\test{\meaning\foo}\show\foo\show\test}
\futurelet\foo\baz a
你可以做任何事,\foo
不需要明确的字符标记。例如,如果我们
\let\bgroup={
我们可以做的
\hbox\bgroup <content>
但不是
\def\foo\bgroup <definition>
我们可以用来\meaning
分析文本,例如,如果我们知道这是一封信
\def\baz{%
\edef\test{\meaning\foo}%
\edef\test{\expandafter\bazaux\test\stop}%
\show\test
}
\edef\bazaux{\def\noexpand\bazaux\detokenize{the letter }##1\noexpand\stop{##1}}
\bazaux
\futurelet\foo\baz a
(当然可以先针对这种情况进行测试。)
答案2
我的 LaTeX 同事 Christian Tellechea 曾问过他隐式字符标记,快速返回一个宏(使用listofitems
包),他调用该\implicittomacro#1
宏,该宏采用隐式标记(仅限于 catcode 11 或 12)并将其转换为宏。
因此,在 Christian 的帮助下,我在问题末尾发布的 MWE 变得可行。在其中,宏\fltest
用于\futurelet
捕获未消化的下一个标记,然后可以一次针对多个匹配字符(此处为 和x
)进行测试y
。这比单纯的\ifx
测试更酷,因为测试一次只能与单个标记进行比较。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listofitems}
\def\implicittomacro#1{%
\def\next{\expandafter\implicittomacroi\meaning#1\implicittomacroi#1}%
\unless\ifcat a\noexpand#1%
\unless\ifcat.\noexpand#1%
\def\next{\errmessage{\string#1\space is not catcode 11 or
12}}%
\fi
\fi
\next
}
\expandafter\def\expandafter\implicittomacroi\expandafter
#\expandafter1\detokenize{er} #2\implicittomacroi#3{%
\def\implicittomacroii##1\implicittomacroii{\endgroup\def#3{##1}}%
\begingroup\endlinechar-1\everyeof{\noexpand}%
\expandafter\implicittomacroii\scantokens{#2\implicittomacroii}%
}
\def\fltest{\futurelet\xfl\pdecide}
\def\pdecide{%
\implicittomacro\xfl%
\setsepchar{x||y}% SEARCH FOR x or y AS THE NEXT CHARACTER
\readlist\mylist{\xfl}%
\ifnum\listlen\mylist[]>1\relax%
(Following undigested token is: \mylistsep[1])%
\else
(Following undigested token is NEITHER x nor y)%
\fi
}
\begin{document}
\fltest xyz
\fltest yzx
\fltest zxy
\end{document}