关于 \futurelet 的一个问题

关于 \futurelet 的一个问题

这是我不明白的\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}

在此处输入图片描述

我真正想要的是能够获取经过\futureletted 的令牌并将其作为参数传递给 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}

在此处输入图片描述

相关内容