LuaLaTeX,逐字打印文本

LuaLaTeX,逐字打印文本

下面的代码使用luasocket.http来提取网页(为简单起见,我使用了文本文件的链接)。我曾经tex.sprint将其传回排版引擎。但是我更希望在verbatim环境中打印或最好使用listings环境。关于如何实现这一点,有什么建议吗?

\documentclass{article}
\usepackage[utf8]{luainputenc}
\begin{document}
\bgroup
\catcode`\%=12
\catcode`\_=12
\catcode`\^=12
\catcode`\&=12
\directlua{
local http = require("socket.http")
function url_encode(str)
  if (str) then
    str = string.gsub (str, "\string\n", "\string\r\string\n")
    str = string.gsub (str, "([^%w ])",
        function (c) return string.format ("%%%02X", string.byte(c)) end)
    str = string.gsub (str, " ", "+")
  end
  return str
end
function url_decode(str)
  str = string.gsub (str, "+", " ")
  str = string.gsub (str, "%%(%x%x)",
      function(h) return string.char(tonumber(h,16)) end)
  str = string.gsub (str, "\string\n", "\string\n")
  return str
end
 local page  = http.request( 'http://mirror-cybernet.lums.edu.pk/pub/ctan/dviware/screenview/vms/test.txt' )
tex.sprint(page)
}
\egroup
\end{document}

请注意,MWE 包含两个我还没用过的函数,用于对 url 进行编码和解码。我把它们留下来是为了方便你尝试不同的方法url。顺便说一句,我发现旧的“TeX”穿上新衣服后可以与网络对话,这真是太神奇了。

答案1

您的代码存在一些问题:

  1. 不要\usepackage[utf8]{luainputenc}在文档中使用,因为 utf8 是默认的
  2. 将 Lua 代码放在单独的文件中。如果不可行,请使用包luacode*中的环境luacode。请参阅关于luacode环境的问题。那你就不需要再去弄乱猫代码了。
  3. 您定义的两个函数未被使用(并且是不必要的)。

以下是适用于列表环境的解决方案:

\documentclass{article}
\usepackage{luacode}
\usepackage{listings}

\begin{document}

\begin{luacode*}
local http = require("socket.http")
local page  = http.request( 'http://mirror-cybernet.lums.edu.pk/pub/ctan/dviware/screenview/vms/test.txt' )

tex.print("\\begin{lstlisting}")
tex.print(page:gsub("\n","\r"))
tex.print("\\end{lstlisting}")
\end{luacode*}
\end{document}

答案2

FWIW,在 ConTeXt 中你可以简单地使用

\starttext
\typefile{http://mirror-cybernet.lums.edu.pk/pub/ctan/dviware/screenview/vms/test.txt}
\stoptext

从网络加载文件。如果指定了 URL,几乎所有文件加载宏都使用套接字库来下载(和缓存)文件。

如果您想手动执行此操作,请按照以下步骤操作:

\starttext
\startluacode
local http = require("socket.http")
local page  = http.request( 'http://mirror-cybernet.lums.edu.pk/pub/ctan/dviware/screenview/vms/test.txt' )
tex.print(string.format("\\starttyping %s \\stoptyping", page))
\stopluacode
\stoptext

(我无法让类似的代码在 LuaLaTeX 中运行,因为LaTeX 中的环境与ConTeXt 中的环境luacode使用不同的 catcode )luacode

相关内容