Auch hier gefragt: https://tex.stackexchange.com/questions/410335/building-a-tikz-matrix-from-specific-datas


Wenn ich eine Tabelle des Typs

Öffne in Overleaf
1 | 3 | s   1 | 1 | r
5 | 3 | b   11 | 3 | b
3 | 1 | r   19 | 3 | s

habe (hier als Beispiel, es können auch mehr Spalten sein), in der jede Zelle drei Informationen enthält, wie bringe ich das am besten in eine TikZ-Matrix; unter Verwertung der Informationen; etwa:

alt text

Öffne in Overleaf
%\documentclass[11pt, landscape]{scrartcl}
\documentclass[border=3mm, varwidth]{standalone}
\usepackage[ngerman]{babel}
\usepackage{tikz, amsmath, amssymb}
\usetikzlibrary{matrix}

\begin{document}

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

SOLL: \\
\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}

gefragt 13 Jan '18, 16:00

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

geschlossen 15 Jan '18, 17:30

Was hast du denn schon versucht?

(13 Jan '18, 22:02) Henri

Mmmhh... gute Frage. Ich bin mir gar nicht so sicher gerade, in welche Richtung es gehen sollte. Mit einem Tipp oder Denkanstoß in die richtige Richtung, kann ich die Aufgabe sicher selbst lösen. Ich dachte heute, man muss vermutlich jede Zelle als eigenen Datensatz einlesen und das dann in einen anderen Datensatz stecken. Also quasi so viele Tabellen/Matrizen in einer Matrix, wie es Zellen gibt. Kann natürlich auch sein, dass ich damit auf dem falschen Dampfer bin.

(13 Jan '18, 22:19) cis

Ich habe heute gesehen, das es bei pgfplots einen matrixplot gibt. Das scheint mir sehr vielversprechend. https://tex.stackexchange.com/questions/305356/pgfplots-percentage-in-matrix-plot?rq=1 Vielleicht kann ich damit etwas basteln. Mir bereitet die Natur der Zellen ("3 Infos") Probleme; ich habe da keine gute Idee.

(14 Jan '18, 19:37) cis

OK, ich denke, ich werde dann mal mit pgfplost / matrix plot etwas erstellen. Und die Frage hier ggf. dann löschen. Nur die Dateneinlese ist mir da nicht klar, im Hinblick auf die Art der Zellen in meiner Tabelle. (Und ggf. gewisse Layoutansprüche, aber das sind dann triviale Zusatzaufgaben.)

(14 Jan '18, 21:42) cis

@Henri @Crosspost Habe ich aber oben angegeben. Da kam ein m.E. entscheidenender Tipp, und zwar: Ich glaube, die Ausgabe mit den Balken 1|2|a ist Mist, da es so in eine nichttriviale Einlese ausartet. Ich schließe daher die Frage und überlege mir, wie ich das neu aufziehen kann.

(15 Jan '18, 17:29) cis
Ergebnis 5 von 6 show 1 more comments

Mit lpeg lassen sich beliebige Dateiformate einlesen.

Öffne in Overleaf
\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}

alt text

Das ganze in eine Tabelle zu packen überlasse ich mal als Übung. In ConTeXt ist das natürlich mal wieder unendlich einfacher...

Öffne in Overleaf
\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

alt text

Permanenter link

beantwortet 15 Jan '18, 23:04

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 16 Jan '18, 00:44

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×730
×256
×58

gestellte Frage: 13 Jan '18, 16:00

Frage wurde gesehen: 6,314 Mal

zuletzt geändert: 16 Jan '18, 00:44