如果我有一张像这样的桌子
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 上交叉发布我对德文版本的回答:
使用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