根据特定数据构建 TikZ 矩阵

根据特定数据构建 TikZ 矩阵

如果我有一张像这样的桌子

1 | 3 | s   1 | 1 | r
5 | 3 | b   11 | 3 | b
3 | 1 | r   19 | 3 | s

这是一个例子,可能会有更多的列或行),其中每个单元格包含3条信息:<denominator>|<numerator>|<color>

<color>:r = 红色,b = 蓝色,s = 标准(黑色)。

我怎样才能将其放入应用信息的 TikZ 矩阵中?

在此处输入图片描述

因为在 TikZ 中,可视化的可能性多种多样,例如:

在此处输入图片描述

左图:一张相当大的桌子的可视化效果。右图:另一张可视化效果

梅威瑟:

%\documentclass[11pt, landscape]{scrartcl}
\documentclass[border=3mm, varwidth]{standalone}

\usepackage{tikz, amsmath, amssymb}
\usetikzlibrary{matrix}  

\begin{document}

IS:  
\begin{verbatim}
1 | 3 | s               1 | 1 | r
5 | 3 | b              11 | 3 | b
3 | 1 | r              19 | 3 | s
\end{verbatim}

SHALL: \\
\begin{tikzpicture}
\matrix (m) [       
ampersand replacement=\&,
matrix of math nodes, 
nodes in empty cells,
]
{%
\frac13 \& |[text=red]|1 \\
|[text=blue]|\frac53 \& |[text=blue]|\frac{11}{3} \\
|[text=red]|3  \&  \frac{19}{3} \\
};
\end{tikzpicture}

\end{document}

答案1

由于这个问题引起了很多关注,我将在 TeXwelt 上交叉发布我对德文版本的回答:

Tikz-Matrix 从特定数据创建


使用lpeg您可以解析任意数据格式。

\documentclass{article}

\usepackage{luacode}
\usepackage{xcolor}
\colorlet{s}{black}
\colorlet{b}{blue}
\colorlet{r}{red}

\begin{luacode*}
local lpeg = assert(require"lpeg")
local C, P, R, S = lpeg.C, lpeg.P, lpeg.R, lpeg.S

local space = S(" \t")^0
local line = S("\n\r")^0

local integer = space * R("09")^1 / tonumber
local sep = space * P("|")
local color = space * C(R("az"))

local function col(num, denom, color)
   if (denom == 1) then
      tex.sprint(string.format("\\textcolor{%s}{$%d$}",color,num))
   else
      tex.sprint(string.format("\\textcolor{%s}{$\\frac{%d}{%d}$}",color,num,denom))
   end
end

local function row()
   tex.sprint("\\medbreak")
end

local entry = ((integer * sep * integer * sep * color / col)^1 * line / row)^1

function parse(tab)
   entry:match(tab)
end
\end{luacode*}

\begin{document}

\begin{luacode*}
parse[[
1 | 3 | s               1 | 1 | r
5 | 3 | b              11 | 3 | b
3 | 1 | r              19 | 3 | s
]]
\end{luacode*}

\end{document}

替代文本

将所有内容放入表格中留作练习。在 ConTeXt 中这当然要容易得多...

\definecolor[s][black]
\definecolor[b][blue]
\definecolor[r][red]

\startluacode
local lpeg = assert(require"lpeg")
local C, P, R, S = lpeg.C, lpeg.P, lpeg.R, lpeg.S

local space = S(" \t")^0
local line = S("\n\r")^0

local integer = space * R("09")^1 / tonumber
local sep = space * P("|")
local color = space * C(R("az"))

local function col(num, denom, color)
   if (denom == 1) then
      context.NC(string.format("\\color[%s]{$%d$}",color,num))
   else
      context.NC(string.format("\\color[%s]{$\\frac{%d}{%d}$}",color,num,denom))
   end
end

local function row()
   context.NC()
   context.NR()
end

local entry = ((integer * sep * integer * sep * color / col)^1 * line / row)^1

function parse(tab)
   context.startTABLE{ frame="off", align="middle,lohi" }
   entry:match(tab)
   context.stopTABLE()
end
\stopluacode

\starttext

\startluacode
parse[[
1 | 3 | s               1 | 1 | r
5 | 3 | b              11 | 3 | b
3 | 1 | r              19 | 3 | s
]]
\stopluacode

\stoptext

替代文本

相关内容