假设我有一个文件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),因为该文件必须在不同的计算机上运行,而我无法确保命令行工具是否可用。最后,文件名应该是#1
TeX 代码给出的参数 ( )。
答案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 换行符宏,并且\n
iis 是一个未定义的命令,你可以使用
\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()
}}
以防止扩张。