循环遍历网格文件

循环遍历网格文件

我有一个包含如下数据的网格文件:

5
4
0 0 0 0 0
0 1 1 2 0
0 2 2 1 0
3 0 0 3 1

其中 5 是网格的宽度,4 是高度,网格中的每个数字对应一个海拔。如果需要,我可以剪掉 5 和 4。

我想将其显示为 LaTeX 中的彩色方块网格,并在每个方块的中心印上数字。

我知道如何使用 TikZ 绘制矩形和标签,所以我想我可以搞清楚这部分。但读取数据(并将数字转换为颜色)让我很困惑。有什么想法可以告诉我该怎么做吗?

答案1

Lualatex 解决方案:

\begin{tikzpicture}
\directlua{grid = readGridFile("example.dat"); 
           plot(grid)}
\end{tikzpicture}
\end{document}

结果

现在是整个文档。请注意,我使用包filecontents将排版示例所需的所有文件包含在单个源中。您可以filecontents*在第一次编译后安全地删除这些环境,因为您将拥有所需的文件example.datgridlua.lua

\documentclass{standalone}
\usepackage{luacode}
\usepackage{tikz}
\usepackage{filecontents}

\begin{filecontents*}{gridlua.lua}
function readGridFile(filename)
  local f, columns, rows
  local grid={}
  f = io.open(filename, "r")
  columns = tonumber( f:read("*line") )    -- To convert it to int
  rows    = tonumber( f:read("*line") )
  for i = 1, rows, 1 do
     local row = {}
     line = f:read("*line")
     for data in line:gmatch("%w+") do table.insert(row, data) end
     table.insert(grid, row)
  end
  return grid
end

function plot(grid)
  for i,row in ipairs(grid) do
    for j, data in ipairs(row) do
        tex.print(string.format(
             "\\node[data, style%d] at (%d,%d) (data%d%d) {%d};", 
             data, j, -i, j, i, data))
    end
    tex.sprint("\\par")
  end
end
\end{filecontents*}

\begin{filecontents*}{example.dat}
5
4
0 0 0 0 0
0 1 1 2 0
0 2 2 1 0
3 0 0 3 1
\end{filecontents*}

\directlua{dofile("gridlua.lua")}

\begin{document}
\tikzset{
    data/.style = {draw, rectangle, inner sep=0pt, minimum width=1cm, 
        minimum height = 1cm},
    style0/.style = { fill=white },
    style1/.style = { fill=yellow!60 },
    style2/.style = { fill=orange!60 },
    style3/.style = { fill=red!80 },
}

\begin{tikzpicture}
\directlua{grid = readGridFile("example.dat"); 
           plot(grid)}
% You can even point to some particular datum:
% \draw[<-, shorten <=-5pt] (data42) to[bend left] +(3,2) node[right]{See here};
\end{tikzpicture}
\end{document}

lua 代码生成 tikz 命令来创建图形网格,并为每个节点分配一个自动名称,即dataXY。例如,左上角的 0 将被命名为data11,左下角的 1 将被命名为data54

相关内容