如何在 \directlua{} 中使用 \n 替换空行

如何在 \directlua{} 中使用 \n 替换空行

假设我有一个文件file.txt包含

This is

a test

我想用以下代码替换 TeX 中的内容:

This is\par a test

\n我尝试使用 Lua,但在替换文本中坚持使用。

这是(不起作用的)代码:

% !TeX program = lualatex
\documentclass{article}

\begin{filecontents}{file.txt}
This is

a test
\end{filecontents}

\begin{document}
Test

\directlua{
   local file = io.open("file.txt")
   local fileedited = io.open("editedfile.txt", "w")
   local content = file:read "*a"
   file:close()
   contentedited = string.gsub(content, "\n\n", "\\par")
   fileedited:write(contentedited)
   fileedited:close()
}
\end{document}

我不必为此使用 Lua,但我不能使用任何命令行工具(shell escape),因为该文件必须在不同的计算机上运行,​​而我无法确保命令行工具是否可用。最后,文件名应该是#1TeX 代码给出的参数 ( )。

答案1

你必须逃避反斜杠

\documentclass{article}

\begin{filecontents}{file.txt}
This is

a test
\end{filecontents}

\begin{document}
Test

\directlua{
   local file = io.open("file.txt")
   local fileedited = io.open("editedfile.txt", "w")
   local content = file:read "*a"
   file:close()
   contentedited = string.gsub(content, "\string\n\string\n", "\string\\par ")
   fileedited:write(contentedited)
   fileedited:close()
}
\end{document}

答案2

的内容\directlua被展开,就像\write在 Lua 看到它们之前一样,所以你的\\是 latex 换行符宏,并且\niis 是一个未定义的命令,你可以使用

\directlua{\detokenize{
   local file = io.open("file.txt")
   local fileedited = io.open("editedfile.txt", "w")
   local content = file:read "*a"
   file:close()
   contentedited = string.gsub(content, "\n\n", "\\par")
   fileedited:write(contentedited)
   fileedited:close()
}}

以防止扩张。

相关内容