我一直在编写一些代码来扩展宏并捕获字符和不可扩展的基元,因为它们到达 TeX 的胃里,我遇到了一个问题:由于我逐个收集字母,使用不可扩展的代码(至少\futurelet
),字母之间的字距和连字被破坏了。因此,最好是抓取字母,直到遇到非字母排版命令。但是,我的代码必须处理类似的事情
a b\ifdim\lastskip>0pt hi!\fi c
如果我在继续扩展之前排版,那么和b
之间的字距就会被破坏。但如果我先继续扩展,那么就会看到之前的空格,而不是应该有的样子。我的解决方案是在开始单词时插入一个,然后收集字母,执行扩展,然后删除给定的跳过并排版字母。这也确保了和其他都是零,这是应该的。b
c
\lastskip
0pt
\hskip 0pt\relax
\lastpenalty
为了确保我的解决方案正确,我需要知道哪些基元可以访问有关正在排版的内容的信息。在 TeX 中,至少有\lastkern
,\lastpenalty
和\lastskip
(没有 \lastbox
,因为它不可扩展)。pdfTeX 基元呢?XeTeX 基元(特别是,可以获取有关最后一个字符的信息)?LuaTeX 可能又是另一个麻烦,因为一切都可以通过 扩展来完成\directlua
:我无法控制。
答案1
对于 etex,有\lastnodetype
例如在这些例子中扩展为 0 和 1
aaa\the\lastnodetype bbb
aa\hbox{a}\the\lastnodetype bbb
\bye
不确定您在问题范围内考虑了哪些信息,例如\parshape
etex\parshapelength
等告诉您“有关当前段落的一些信息”,但也许您并不打算包括这一点(或者如果您这样做那么然后\leftskip
和\rightskip
)也许您的意思是当前水平列表而不是当前段落?