我只是想\verb
好玩而已。它应该像 LaTeX 星号版本一样:\verb<some-char><arbitrary chain of chars not containing it><same char again>
应该按照行和空格排版这些字符\tt
,其中空格是可见的。
我设法让它工作
\def\eol{\hfill\break}
\def\activateas#1#2{%
\catcode #1 13%
\lccode`\~ #1%
\lowercase{\let~#2}%
}
\def\verb#1{%
\begingroup%
\def\do##1{\catcode`##1 12}%
\dospecials%
\activateas{`#1}\endgroup%
\activateas{`\^^M}\eol%
\tt}
\dospescials
是一个纯 TeX 宏,它执行\do
,<space><VT><SOH>\{}$&#%~_^
您必须\do
自己提供;
\activateas
它派上用场:它获取某个东西的字符代码,使其处于活动状态,并将\let
其等于第二个参数。
剩下的问题
非常棘手,因为 TeX 构建时总是会忽略这些:我该如何处理尾随空格(例如排版 markdown)?
答案1
在 TeX 中,删除尾随空格的过程很早就发生了(当文件中的一行被被放置进入 TeX 的缓冲区)。因此,这是在缓冲区的字符根据其 catcode 进行解释之前,甚至 LuaTeX 也process_input_buffer
无济于事(因为输入缓冲区不包含尾随空格)。但是使用 LuaTeX 和回调open_read_file
,如果您将所有内容放在不同的文件中,则可以实现您想要的\input
。
例如,您可以将以下内容放入trailing.lua
:
function trail_space_env(filename)
-- A table containing a "reader" function for reading a line.
local ret = {}
ret.file = io.open(filename)
ret.reader =
function(t)
local line = t.file:read()
if line == nil then return line end
-- If line ends with space, append U+200C (ZWNJ)
return line:gsub(' $', ' ')
end
return ret
end
callback.register('open_read_file', trail_space_env)
(请注意,上面的替换字符串是一个空格,后跟 ZWNJ 字符),主 TeX 文件中的内容如下(取自您的问题;仅添加了最后两行):
\def\eol{\hfill\break}
\def\activateas#1#2{%
\catcode #1 13%
\lccode`\~ #1%
\lowercase{\let~#2}%
}
\def\verb#1{%
\begingroup%
\def\do##1{\catcode`##1 12}%
\dospecials%
\activateas{`#1}\endgroup%
\activateas{`\^^M}\eol%
\tt}
\directlua{dofile('trailing.lua')}
\input everything
以及以下内容everything.tex
:
Regular text.
\verb!
There are two trailing whitespaces here.
See them?
!
Regular text again.
\bye
然后你会得到:
答案2
没有办法保留这些空格,因为它们在输入被拆分成 token 并分配 catcode 之前就被 TeX 删除了。根据TeX 按主题分类,第 2.2 节,这被引入“用于具有块存储的系统,并且可以避免混淆,因为这些空间在编辑器中很难看到。”
一个解决方法是使用不同的字符(没有代码 32),然后在输出中将其呈现为可见空格。