我目前正在探索使用 LuaTeX 生成 TikZ 代码的方法。使用该luacode*
环境似乎很顺利。但有时似乎更有意义的是使用 Lua 将小片段注入 TikZ 环境,而不是使用大量tex.sprint()
语句。这似乎是一个雷区。给出以下 MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage{luacode}
\begin{document}
\begin{tikzpicture}
\luadirect{tex.print("\string\\draw (0,0) to (1,1);")} % #1 works
\luaexec{tex.print("\\draw (0,0) to (1,1);")} % #2 works
\draw (0,0) to (\luaexec{tex.sprint("1,1")}); % #3 does not work
\draw (0,0) to (\luadirect{tex.sprint("1,1")}); % #4 works
\draw (0,0) to \luaexec{tex.sprint("(1,1)")}; % #5 doesn't work
\draw (0,0) to \luadirect{tex.sprint("(1,1)")}; % #6 doesn't work
\end{tikzpicture}
\end{document}
为什么 #1、#2 和 #4 有效,而 #3、#5 和 #6 无效?
答案1
这些错误与 Lua 没有直接关系,这只是 tikz 是否在某些时候允许宏或不可扩展的命令的问题,你会看到相同的错误,原因相同
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\def\zz{\draw (0,0) to (1,1);}\zz % #1 works
\def\zz{\draw (0,0) to (1,1);}\zz % #2 works
%\draw (0,0) to (\def\zz{1,1}\zz); % #3 does not work
\def\zz{1,1}\draw (0,0) to (\zz); % #4 works
%\draw (0,0) to \def\zz{(1,1)}\zz; % #5 doesn't work
%\def\zz{(1,1)}\draw (0,0) to \zz; % #6 doesn't work
\end{tikzpicture}
\end{document}
我发现它通常更容易使用\directlua
(可扩展),而不是 luacode 包装器,后者大多不可扩展,因为它们包括 catcode 分配以使字符“安全”