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, 10:00

cis's gravatar image

cis
6.1k11135224
Akzeptiert: 70%

geschlossen Gestern

Was hast du denn schon versucht?

(13 Jan, 16: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, 16: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.

(vor 2 Tagen) 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.)

(vor 2 Tagen) 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.

(Gestern) cis
Ergebnis 5 von 6 Alle anzeigen

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 Gestern

Henri's gravatar image

Henri
12.1k42235

bearbeitet Gestern

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×549
×195
×42

Frage gestellt: 13 Jan, 10:00

Frage wurde angeschaut: 95 Mal

Zuletzt aktualisiert: Gestern