在 Latex 文件中使用 Lua 代码时,Lua 代码会将 Tex Latex 代码发送到生成 lua 代码的位置,然后插入到文档中。在扩展完成后但在文件编译为 pdf 之前查看 Latex 文件(内部)的内容会很有用。这在调试和许多其他情况下都很有用。
有办法这样做吗?一个小例子将有助于解释我的意思。
鉴于这个乳胶文件
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{luacode}
i=6
j=8
tex.print("\\begin{tabular}{|l|l|}\\hline")
tex.print(i.."&"..j)
tex.print("\\\\ \\hline")
tex.print("\\end{tabular}")
\end{luacode}
\end{document}
编译后得到 pdf 文件:
我现在想要看到的是 Lua 代码扩展后产生的 Latex 文件,它应该如下所示
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{tabular}{|l|l|}\hline
6 & 8 \\\hline
\end{tabular}
\end{document}
我至今还没找到可以实现这一目的的选项。
2015 年
更新
另一个例子可以清楚地说明这里问的是什么。我不仅想看到从 lua 代码段生成的 latex 代码,还想看到原始 latex 中所有 lua 代码全部展开后生成的完整 latex 文档。但这必须在不修改原始 latex 文档本身的情况下完成。
假设有这个虚拟管道:
Latex file -> Lua code expand -> Updated Latex (internal)-> lualatex ->pdf
我想在所有的 lua 代码展开后立即获取完整的 latex 代码/文件的副本。这是另一个例子。给定这个 Latex 文件输入:
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{luacode*}
i=6
j=8
tex.print("\\begin{tabular}{|l|l|}\\hline")
tex.print(i.."&"..j)
tex.print("\\\\ \\hline")
tex.print("\\end{tabular}")
\end{luacode*}
Our annual budget for the company is \luaexec{tex.print(200*15^3)} dollars as
shown in this list of items
\begin{luacode*}
tex.print("\\begin{itemize}")
for i=1,5 do
tex.print("\\item "..i^2)
end
tex.print("\\end{itemize}")
\end{luacode*}
And so on.
\end{document}
PDF 是
我想获取以下 latex 文件的副本,该文件中的所有 Lua 代码都已展开并消失,只剩下 Latex 代码。此文件可以保存到临时文件或任何位置,只要它是完整的 Latex 文件(如图所示)而不是零碎部分即可。当原始 Latex 文件的不同位置有大量 Lua 代码时,这在调试时非常有用。
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{tabular}{|l|l|}\hline
6 & 8 \\\hline
\end{tabular}
Our annual budget for the company is 675000 dollars as
shown in this list of items
\begin{itemize}
\item 1
\item 4
\item 9
\item 16
\item 25
\end{itemize}
and so on
\end{document}
我希望现在问题更加清楚了:)
答案1
原\directlua
语是可扩展的,因此只要我们制定代码来直接使用它,我们就可以显示结果:
\documentclass{article}
\begin{document}
The following is my table
\showtokens\expandafter{%
\directlua{
i=6
j=8
tex.print("\noexpand\\begin{tabular}{|l|l|}\noexpand\\hline")
tex.print(i.."&"..j)
tex.print("\noexpand\\\noexpand\\ \noexpand\\hline")
tex.print("\noexpand\\end{tabular}")
}%
}
\end{document}
请注意,这将不是与环境协同工作luacode
,环境在 TeX 中执行分配,因此不可扩展。这意味着我们必须在 TeX 到 Lua 步骤上做更多工作。
根据评论,将 Lua 代码写入文件的另一种方法是
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{luacode}
local i, j = 6, 8
local f = assert(io.open("\jobname.xxx", "w"))
local function mywrite(text)
tex.print(text)
f:write(text .. "\string\n")
end
mywrite("\\begin{tabular}{|l|l|}\\hline")
mywrite(i.."&"..j)
mywrite("\\\\ \\hline")
mywrite("\\end{tabular}")
\end{luacode}
\end{document}
(如果重复使用,将 Lua 代码放入单独的文件中是明智的,尤其是存储结果代码。)
答案2
除了使用,tex.print
您还可以使用print
。然后参数将写入标准输出(监视器),您可以控制它:
\documentclass{article}
\usepackage{luacode}
\begin{document}
The following is my table
\begin{luacode}
i=6
j=8
tex.print("\\begin{tabular}{|l|l|}\\hline")
tex.print(i.."&"..j)
tex.print("\\\\ \\hline")
tex.print("\\end{tabular}")
\end{luacode}
\begin{luacode}
i=6
j=8
print("\\begin{tabular}{|l|l|}\\hline")
print(i.."&"..j)
print("\\\\ \\hline")
print("\\end{tabular}")
\end{luacode}
\end{document}
并且在标准输出(不是日志文件)中你会看到:
[...]
(./demo.aux)\begin{tabular}{|l|l|}\hline
6&8
\\ \hline
\end{tabular}
[...]
您还可以定义自己的 Lua Print 函数来执行 TeX 和日志打印:
\documentclass{article}
\usepackage{luacode}
\begin{luacode}
function Print (string)
tex.print(string)
print(string)
end
\end{luacode}
\begin{document}
The following is my table
\begin{luacode}
i=6
j=8
Print("\\begin{tabular}{|l|l|}\\hline")
Print(i.."&"..j)
Print("\\\\ \\hline")
Print("\\end{tabular}")
\end{luacode}
\end{document}