我正在尝试使用来自一堆 csv 文件的输入来绘制一幅图。
我们以文件内容是一个简单的浮点数元组的情况为例:
>>> cat coords/right_corner.csv
8.000000000000000000e+00,-8.856910857039457241e-01
我编写了一个 lua 脚本来读取它,添加括号并打印它:
-- parse.lua
local M = {}
function M.coordinate(rpath)
file = io.open(rpath, "r")
tex.print(string.format([[(%s)]], file:read()))
-- print(string.format([[(%s)]], file:read()))
file:close()
end
return M
我想绘制一条给定长度的垂直线,其顶部位于这些坐标处。然后我想沿着该垂直线添加节点(1/3 和 2/3,或 1/4、1/2 和 3/4)。我想我要做的第一件事就是将文件中存储的坐标保存为 TikZ 坐标对象,以便以后可以引用它。
相应的 LaTeX 极小 WE 将是
%! TEX program = lualatex
\documentclass[border=3pt, tikz, 12pt]{standalone}
\usetikzlibrary{math}
\tikzmath{%
\H = 3;
}
\directlua{parse = require('parse')}
\begin{document}
\begin{tikzpicture}
% breaks
\coordinate (rightCorner) at \directlua{parse.coordinate('coords/right_corner.csv')};
% \coordinate (rightCorner) at (8.000000000000000000e+00,-8.856910857039457241e-01)
% ;
\end{tikzpicture}
\end{document}
但这会中断(mwe.tikz|| Runaway argument?
)。我的理解是,它应该评估下面的两行注释,它们运行良好。
tikzpicture
相反,如果我用 替换块的内容\draw[dotted, black] \directlua{parse.coordinate('coords/left_corner.csv')} -- ++(0,-\H);
,构建成功,但 pdf 输出为空白。同样,\directlua
用文件的预期输出替换位,即对坐标进行硬编码,效果很好。
\draw[dotted, black] (8.000000000000000000e+00,-8.856910857039457241e-01)
-- ++(0,-\H);
我错过了什么?我使用类似的构造来循环文件中的行,以绘制更复杂的形状,其中函数lua
很简单
for line in io.lines(rpath) do --single_floe.csv') do
tex.print(string.format([[(%s) -- ]], line))
end
cycle
在源中添加一个附加项tex
,它就可以正常工作。
答案1
好的,我不知道为什么,但是从 lua 脚本中删除括号打印并directlua
用括号括起来调用会产生预期的结果:
local M = {}
function M.coordinate(rpath)
file = io.open(rpath, "r")
tex.print(file:read())
file:close()
end
return M
%! TEX program = lualatex
\documentclass[border=3pt, tikz, 12pt]{standalone}
\usetikzlibrary{math}
\tikzmath{%
\H = 3;
}
\directlua{parse = require('parse')}
\begin{document}
\begin{tikzpicture}
\coordinate (rightCorner) at (\directlua{parse.coordinate('coords/right_corner.csv')});
\draw (rightCorner) -- ++(0,-\H);
\end{tikzpicture}
\end{document}
如果有人有解释,我仍然会接受!