Lua扩展之后可以查看latex代码吗?

Lua扩展之后可以查看latex代码吗?

在 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 文件:

Mathematica graphics

我现在想要看到的是 Lua 代码扩展后产生的 La​​tex 文件,它应该如下所示

\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 是

Mathematica graphics

我想获取以下 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}

相关内容