![查看 LaTeX 传递给 Lua 的内容以及 Lua 传递给 LaTex 的内容](https://linux22.com/image/433753/%E6%9F%A5%E7%9C%8B%20LaTeX%20%E4%BC%A0%E9%80%92%E7%BB%99%20Lua%20%E7%9A%84%E5%86%85%E5%AE%B9%E4%BB%A5%E5%8F%8A%20Lua%20%E4%BC%A0%E9%80%92%E7%BB%99%20LaTex%20%E7%9A%84%E5%86%85%E5%AE%B9.png)
当编写如下代码时
\documentclass{article}
\directlua{dofile("myLuaFunctions.lua")}
\newcommand*{\myFunction}[3]{%
\directlua{tex.print(myFunction(#1, #2, #3))}%
}
\begin{document}
\myFunction{3}{5}{7}
\end{document}
我倒要看看 :
- Lua 从 LaTex 接收什么
- (La)TeX 从 Lua 接收什么
关于 1. 我已阅读http://cahiers.gutenberg.eu.org/cg-bin/article/CG_2010___54-55_13_0.pdf将此代码放在 TeX 文件的开头就足以查看 Lua 接收到的内容:
\newrite\luadebug
\immediate\openout\luadebug luadebug.lua
\AtEndDocument{\immediate\closeout\luadebug}
\newcommand\directluadebug{\immediate\write\luadebug}
但仅仅将它放在我的 TeX 文件的开头就会出现编译错误。\newrite 无法识别。我收到一条消息,如无法识别的序列...
关于 2。有没有办法让 Lua 写入 TeX 文档中,看看它是否写入了预期的字符串?
欢迎任何其他调试技巧,我对该过程的理解确实有限。
答案1
我现在使用的(在问题中引用的文章和评论中给出的更正以及另一条评论中引用的问题的帮助下)是以下内容,即使不是最佳的:
LaTeX 文件示例
\newwrite\luadebug
\immediate\openout\luadebug luadebug.lua
\AtEndDocument{\immediate\closeout\luadebug}
\newcommand\directluadebug{\immediate\write\luadebug}
\documentclass{article}
\usepackage{tcolorbox,graphicx,tikz}
\directlua{dofile("placeTextNode.lua")}
\newcommand*{\textNode}[2]{%
% The following is added around \directlua to see Lua output into LaTeX
% It allows you to see the Lua output but it breaks the compilation though.
%\showtokens\expandafter{%
% \directluadebug (command defined on top) instead of \directlua if I want to write in luadebug.lua file what is passed to Lua.
% It modifies the final pdf output unfortunately and I have to put
% \directlua back when I want to generate my pdf
\directlua{%
tex.print(textNode("\luaescapestring{\unexpanded{#1}}", #2))
}
%}
}
\usepackage[paperwidth=120pt, paperheight=120pt, margin=10pt]{geometry}
\begin{document}
\begin{tcolorbox}[boxsep=0pt, left=0pt, right=0pt, top=0pt, bottom=0pt, sharpish corners, opacityframe=0, opacityback=0, boxrule=0pt]
\begin{tikzpicture}[x=1pt, y=1pt]
\draw[line width=0mm, white] (0,0) -- (100,0) -- (100,100) -- (0, 100);
\textNode{abc\\ def}{50}
\end{tikzpicture}
\end{tcolorbox}
\end{document}
- 其中前四行定义了 \directluadebug,我根据上面文件中的注释用它来代替 \directlua,以查看 Lua 从 LaTeX 接收到的内容。即使它改变/修改了 pdf 输出,我也只是使用它并将其删除。
- 我使用
\showtokens\expandafter{...}
相同的 \directlua 来查看 Lua 写入 LaTeX 的内容,即使这会破坏编译。Lua 输出写在编译输出中,这很方便。不幸的是,即使写入正确的 LaTeX,编译也会中断:即使在注释包装器时,\showtokens\expandafter{...}
编译也会再次运行。
关联 placeTextNode.lua 示例
function textNode(t, x)
return "\\draw[xshift=" .. plus30(x) .. ", yshift=50, text width=20] node[draw, anchor=north west]{" .. t .. "};"
end
function plus30(x)
return x + 30
end
如果您有更好的解决方案,请毫不犹豫地在带有完整示例的专门答案中展示您的做法。例如,与其等效的\directluadebug
不会改变行为,或者与其等效的\showtokens\expandafter{...}
不会破坏编译。