逐字列出,尾部有空格

逐字列出,尾部有空格

我只是想\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),然后在输出中将其呈现为可见空格。

相关内容