问题之后代码翻译器的宏,我听从了 polgab 的建议,使用了 pgf 解析器模块。
当我尝试解析空白时,我感到非常失望。我尝试了不同的东西,一开始,我没有找到好的东西。我读了这个问题逐个字母解析文本并发现这对其他人来说也是一个问题。
我终于找到了解决方案,但不明白它为什么有效:
\documentclass{minimal}
\usepackage{pgf}
\usepgfmodule{parser}
\pgfparserdef{myparser}{initial}{the letter a}{b}
\futurelet\mystrangemacro{ }
\pgfparserdef{myparser}{initial}{\meaning\mystrangemacro}{a}
\pgfparserdef{myparser}{initial}{alignment tab character &}{\pgfparserswitch{final}}
\begin{document}
\pgfparserparse{myparser}a a aa aa a&
\end{document}
我得到了预期的结果:bababbabbab。
但为什么它能工作呢?我尝试了很多不同的方法,最后尝试使用 Futurelet,它成功了!但如果我理解 Futurelet 的定义,我的代码就没有意义了。
谢谢您的回答 !
答案1
您的\futurelet
构造只是将命令名称定义为\let
空格的一种创造性方法。LaTeX 已经有一个\@sptoken
具有相同定义的标记。
> \mystrangemacro=blank space .
l.7 \show\mystrangemacro
?
> \@sptoken=blank space .
l.9 \show\@sptoken
LaTeX 使用结构
\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token
这可能同样难以理解。
你必须做一些事情的原因是,命令名称后的空格字符通常会被跳过,所以根本不要制作标记,即使你成功制作了一个空格标记,构造\let
也会丢弃空格标记,以便=
在可选符号周围可以选择空格
\let\a = \b
所以如果你想说
\let\mytoken = "a space character"
你必须通过不被丢弃的方式获取那里的空间标记。
\futurelet\mystrangemacro{ }
首先\let
执行\mystrangemacro
括号后面的标记,即空格标记(这里很巧妙,它\futurelet
实际上接受下一个标记,而不会丢弃空格),然后执行以下无害的标记(在垂直模式下),{ }
它不执行任何操作,只将其\mystrangemacro
定义为空格标记。(实际上,它的名称很糟糕,因为它没有被定义为宏,而是一个不可扩展的空间令牌,不过那只是一个名字而已。)