我想将 lstlisting 环境(来自listings
包)的内容从 Lua 反馈给 TeX,但显然找不到 lstlisting 的结尾。如果将 lstlisting 替换为 verbatim,也会发生同样的情况。我该如何解决这个问题?
请注意,我希望 luacode 将 lstlisting 反馈给 TeX,而不是在这种情况下有效但不执行此操作的 hack。
\documentclass{article}
\usepackage{listings}
\usepackage{luacode,luatexbase}
\newcommand{\processfile}[1]{\directlua{processfile("#1")}}
\begin{luacode*}
function processfile(fn)
tex.print("\\begin{lstlisting}\n")
local f=assert(io.open(fn,"r"))
local t= f:read("*all")
f:close()
tex.print(t)
tex.print("\\end{lstlisting}\n")
end
\end{luacode*}
\begin{document}
\processfile{code.c}
\end{document}
答案1
以下方法似乎有效。但我不得不使用 luacode 环境。因此它不是“纯”luacode,但我没有找到在 lua 端执行 \detokenize 的方法。我还将处理改为逐行处理以获得正确的换行符。
\documentclass{article}
\usepackage{listings}
\newcommand{\processfile}[1]{\directlua{processfilebyline("#1")}}
\usepackage{luacode}
\begin{luacode}
function processfilebyline(fn)
tex.print("\\begin{lstlisting}")
local f=assert(io.open(fn,"r"))
while true do
local line = f:read("*line")
if line == nil then break end
tex.print(line)
end
f:close()
tex.print("\detokenize{\\end{lstlisting}}")
end
\end{luacode}
%
\begin{document}
\processfile{duck.tex}
\end{document}