luacode 中的 lstlisting 环境

luacode 中的 lstlisting 环境

我想将 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}

相关内容