TikZ—从外部文件读取坐标

TikZ—从外部文件读取坐标

我正在尝试使用来自一堆 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}

如果有人有解释,我仍然会接受!

相关内容