kommutative Diagramme

Neue Frage »

Mathespezialschüler Auf diesen Beitrag antworten »
kommutative Diagramme
Hallo!
Ich würde in Latex gerne ein kommutatives Diagramm erstellen, wie es im Anhang auch dargestellt ist. Wie geht so etwas? Reichen dafür Latex-Befehle aus oder geht das nur durch Einbinden als Graphik? In letzterem Fall: Mit welchem Programm kann ich eine solche Graphik erstellen?

Vielen Dank!
Dual Space Auf diesen Beitrag antworten »
RE: kommutative Diagramme
Schau mal hier: ---> http://www.jmilne.org/not/CDGuide.pdf
Stefan_K Auf diesen Beitrag antworten »
Kommutative Diagramme
Hallo,

für solche Zwecke eignen sich xy-pic und amscd, jedoch auch größere Pakete wie PSTricks und TikZ. Da ich einige Sachen sowieso in TikZ schreibe, verwende ich dieses gleich auch für solche Diagramme, statt die schwer leserliche Syntax von Spezialpaketen wie z.B. xy-pic zu verwenden.

Hier ist ein komplettes Beispiel, das Dir obige Ausgabe mit TikZ erzeugt. Darin habe ich gleich nette features von TikZ verwendet wie matrix of math nodes und chains.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
\documentclass[a4paper,10pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,chains,matrix,positioning,scopes}
\makeatletter
\tikzset{join/.code=\tikzset{after node path={%
\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)%
edge[every join]#1(\tikzchaincurrent)\fi}}}
\makeatother
\tikzset{>=stealth',every on chain/.append style={join},
         every join/.style={->}}
\begin{document}
\centering
\begin{tikzpicture}
  \matrix (m) [matrix of math nodes, row sep=3em, column sep=3em]
    { A & B  & C  & D  & E \\
      A' & B' & C' & D' & E' \\ };
  { [start chain] \chainin (m-1-1);
    { [start branch=A] \chainin (m-2-1)
        [join={node[right] {$\scriptstyle\alpha$}}];}
    \chainin (m-1-2) [join={node[above] {$\scriptstyle f$}}];
    { [start branch=B] \chainin (m-2-2)
        [join={node[right] {$\scriptstyle\beta$}}];}
    \chainin (m-1-3) [join={node[above] {$\scriptstyle g$}}];
    { [start branch=C] \chainin (m-2-3)
        [join={node[right] {$\scriptstyle\gamma$}}];}
    \chainin (m-1-4) [join={node[above] {$\scriptstyle h$}}];
    { [start branch=D] \chainin (m-2-4)
        [join={node[right] {$\scriptstyle\delta$}}];}
    \chainin (m-1-5) [join={node[above] {$\scriptstyle k$}}];
        \chainin (m-2-5)
        [join={node[right] {$\scriptstyle\epsilon$}}];}
  { [start chain] \chainin (m-2-1);
    \chainin (m-2-2) [join={node[above] {$\scriptstyle f'$}}];
    \chainin (m-2-3) [join={node[above] {$\scriptstyle g'$}}];
    \chainin (m-2-4) [join={node[above] {$\scriptstyle h'$}}];
    \chainin (m-2-5) [join={node[above] {$\scriptstyle k'$}}]; }
\end{tikzpicture}
\end{document}


Ausgabe in png-Format.

Darin ist ein kleiner hack, ich habe join/.code geändert, mehr dazu kannst Du hier lesen:

Weitere Beispiele der Art:

Viele Grüße,

Stefan
Mathespezialschüler Auf diesen Beitrag antworten »

Vielen Dank, das hat mir super geholfen!
Mathespezialschüler Auf diesen Beitrag antworten »

Hallo!
Ich habe mittlerweile etwas weiterführende Fragen zu kommutativen Diagrammen, da ich doch desöfteren auch gerne Dreiecke oder ähnliche Diagramme benutzen würde, die sich mit amscd nicht erzeugen lassen.

xypic gefällt mir aus mehreren Gründen nicht: Die Pfeilspitzen finde ich hässlich, einen "hookrightarrow" kann ich erzeugen, indem ich vorne an den Schaft einen großen hässlichen Bogen "anklebe", was einfach nicht schön aussieht und dem "hookrightarrow" von der Ästhetik nicht wirklich nahe kommt.

Deswegen bin ich durchaus offen für die tikZ-Variante von Stefan. Ich habe nur leider noch nicht einmal die grundsätzliche Struktur dahinter verstanden. Was genau tun deine Definitionen in der Präambel? Vielleicht könntest du mir ganz kurz die Idee/Struktur hinter deiner Konstruktion erläutern?!

Wäre es denn damit möglich, auch Pfeile wie den "hookrightarrow" oder "twoheadrightarrow" in das Diagramm mit einzubauen? Kann ich gleichzeitig etwas über und unter den Pfeil schreiben?

Vielen Dank für die Mühe!
Mathespezialschüler Auf diesen Beitrag antworten »

Hallo nochmal!
Ich versuch es mal mit ein paar konkreten Fragen (ich sehe ein, dass mein letzter Beitrag vielleicht etwas zu allgemein war, sorry). Ich habe ein pdf mit ein paar Erklärungen gefunden und würde gern noch die restlichen Unklarheiten beseitigen.

  1. Wofür ist die "scopes"-Option gut?

  2. Kannst du mir vielleicht erklären, was genau der folgenden Code tut? Was passiert bei dieser if-else-Konstruktion?
    code:
    1:
    2:
    3:
    
    \tikzset{join/.code=\tikzset{after node path={%
    \ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)%
    edge[every join]#1(\tikzchaincurrent)\fi}}}



  3. code:
    1:
    
    \tikzset{>=stealth',every on chain/.append style={join},every join/.style={->}}

    Ist es richtig, dass hier zunächst die Pfeile (bzw. Pfeilspitzen) verstärkt werden, dann an jede Kante ein "join" angebunden wird, den du danach als Pfeilspitze definierst?

  4. Wofür ist dieses "[start chain]" gut? Was macht "\chainin (m-1-1)" danach? Zu dem Eintrag links oben führt ja gar kein Pfeil hin. Ist das nur zum Initialisieren der Pfeile zu den anderen Knoten?
  5. Was macht "[start branch=A]"?
  6. Ist der "scriptstyle"-Befehl dafür da, dass die Abbildungsnamen kleiner sind als Normalschriftgröße? Kann man das nicht vielleicht global definieren?
  7. In dem pdf, was ich oben verlinkt habe, wird ja im Prinzip nur mit "path" und "edge" anstelle von "chain" gearbeitet. Welche Vor- und Nachteile haben die beiden Varianten im Vergleich? Die Variante im pdf scheint auf den ersten Blick von der Syntax her etwas kürzer und einfacher zu sein.
  8. In dem pdf wird auch angesprochen, dass bei verschieden hohen Knotenzeichen die Kante schräg wird. Der Lösungsvorschlag (mit "text height" und "text depth") ist dort innerhalb eines tikzpictures angegeben. Kann man das auch global lösen?


Vielen Dank schon mal.
 
 
Stefan_K Auf diesen Beitrag antworten »
TikZ
Hallo,

ich hab leider monatelang keine Zeit gehabt, mich wieder mit TikZ zu beschäftigen, nur wenig mit LaTeX, durch die Arbeit. Kann mich kaum mehr in eigenen Code wieder reindenken. verwirrt

1. scopes schränkt die Gültigkeit von Definitionen auf Bereiche ein, das Laden der scopes-library vereinfacht die Schreibweise, statt \begin{scope} ... \end{scope} genügen dann geschweifte Klammern.

Bei 3. wird festgelegt, dass in der Kette verbunden wird, und zwar durch Pfeile, ausgewählt wird die stealth'-Pfeilspitze statt der Standardpfeilspitze.

In der TikZ-Dokumentation gibt es einen Abschnitt "Using chains", was die Fragen weiter beantworten kann. chains sehe ich hier eher als so-geht's-auch und im Blog als Studie, doch sind normale Pfade und Kanten einfacher zu verstehen und anzuwenden, das reicht völlig.

Viele Grüße,

Stefan
Mathespezialschüler Auf diesen Beitrag antworten »

Zitat:
Original von Stefan_K
ich hab leider monatelang keine Zeit gehabt, mich wieder mit TikZ zu beschäftigen, nur wenig mit LaTeX, durch die Arbeit.

Kein Problem, kann ich voll verstehen!

Ich glaube, mit dem Teil aus der tikZ-Doku hab ich ungefähr verstanden, was dein Quelltext tut.

Vielleicht hast du oder jemand anders noch irgendwann Zeit und Lust, sich mit folgendem "Formatierungsproblem" zu befassen. Falls nicht, ist auch nicht so schlimm. smile

Mit den normalen Pfaden und Kanten komm ich jetzt ganz gut klar. Wenn mein Diagramm aber sowohl sehr große als auch sehr kleine Objekte (Knoten) enthält, so verursacht die "text height=1.5ex,text depth=0.25ex"-Option, dass die Pfeile dann bis in die großen Objekte hineinzeigen. Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
\documentclass[11pt,parskip=half,headsepline,headinclude,headlines=3.25,DIV=14]{scrartcl}

\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{tikz}

\usetikzlibrary{matrix,arrows}

\DeclareMathOperator{\id}{id}

\newcommand{\rotsimeq}{\scriptsize{\rotatebox{180}{$\simeq$}}}

\tikzset{>=latex}

\begin{document}
\begin{center}
\begin{tikzpicture}[iso1/.style={above,sloped,inner sep=3pt},iso2/.style={below,sloped,inner sep=3pt}]
\matrix (m) [matrix of math nodes,row sep=3em,column sep=2.5em,text height=1.5ex,text depth=0.25ex]
{ M_j\otimes_AN & & M_j\otimes_AQ \\
\bigoplus\limits_{i\in I}~(M_i\otimes_AN) & & \bigoplus\limits_{i\in I}~(M_i\otimes_AQ) \\
\left(\bigoplus\limits_{i\in I}~M_i\right)\otimes_AN & & \left(\bigoplus\limits_{i\in I}~M_i\right)\otimes_AQ \\ };

\path[->] (m-1-1) edge node[auto] {$\scriptstyle\id_{M_j}\otimes f$} (m-1-3);
\path[->] (m-2-1) edge node[auto] {$\scriptstyle\bigoplus\limits_{i\in I}~\left(\id_{M_i}\otimes f\right)$} (m-2-3);
\path[right hook->] (m-3-1) edge node[auto] {$\scriptstyle\id_M\otimes f$} (m-3-3);

\path[right hook->] (m-1-1) edge node[auto,swap] {$\scriptstyle\alpha_N$} (m-2-1);
\path[left hook->] (m-1-3) edge node[auto] {$\scriptstyle\alpha_Q$} (m-2-3);
\path[->] (m-2-1) edge node[auto,swap] {$\scriptstyle\Phi_N$} node[iso1] {$\scriptstyle\simeq$} (m-3-1);
\path[->] (m-2-3) edge node[auto] {$\scriptstyle\Phi_Q$} node[iso2] {$\scriptstyle\rotsimeq$} (m-3-3);
\end{tikzpicture}
\end{center}

\end{document}

Ein Ändern der Parameter führt nur dazu, dass der Platz um die kleineren Objekte viel zu riesig aussieht. Wenn ich die Option aber ganz weglasse und wie oben ein



als Knoten habe, dann gehen die horizontalen Pfeile von diesem Objekt natürlich von der horizontalen Mitte des ganzen Objektes aus, was in diesem Fall ja nicht schön ist. Sie sollten lieber von der horizontalen Mitte bezüglich ausgehen. Ich habe das Problem mithilfe von großen Phantomklammern so zu lösen versucht:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
\begin{center}
\begin{tikzpicture}[iso1/.style={above,sloped,inner sep=3pt},iso2/.style={below,sloped,inner sep=3pt}]
\matrix (m) [matrix of math nodes,row sep=3em,column sep=2.5em]
{ M_j\otimes_AN & & M_j\otimes_AQ \\

\phantom{\bigg(} \bigoplus\limits_{i\in I}~(M_i\otimes_AN) \phantom{\bigg)} & 
& \phantom{\bigg(} \bigoplus\limits_{i\in I}~(M_i\otimes_AQ) \phantom{\bigg)} \\

\left(\bigoplus\limits_{i\in I}~M_i\right)\otimes_AN & & \left(\bigoplus\limits_{i\in I}~M_i\right)\otimes_AQ \\ };

\path[->] (m-1-1) edge node[auto] {$\scriptstyle\id_{M_j}\otimes f$} (m-1-3);
\path[->] (m-2-1) edge node[auto] {$\scriptstyle\bigoplus\limits_{i\in I}~\left(\id_{M_i}\otimes f\right)$} (m-2-3);
\path[right hook->] (m-3-1) edge node[auto] {$\scriptstyle\id_M\otimes f$} (m-3-3);

\path[right hook->] (m-1-1) edge node[auto,swap] {$\scriptstyle\alpha_N$} (m-2-1);
\path[left hook->]	(m-1-3) edge node[auto] {$\scriptstyle\alpha_Q$} (m-2-3);
\path[->] (m-2-1) edge node[auto,swap] {$\scriptstyle\Phi_N$} node[iso1] {$\scriptstyle\simeq$} (m-3-1);
\path[->] (m-2-3) edge node[auto] {$\scriptstyle\Phi_Q$} node[iso2] {$\scriptstyle\rotsimeq$} (m-3-3);
\end{tikzpicture}
\end{center}

Das klappt zwar ganz gut, allerdings treten wegen der Phantome nun Lücken zwischen dem Objekt und dem Pfeil auf. Wenn ich die inneren Phantome (die zwischen Objekt und Pfeil) entferne und nur die äußeren stehen lasse, dann sind diese Lücken nicht mehr da, dafür sind die Objekte aber vertikal nicht mehr zentriert.

Gibt es elegante Möglichkeiten, diese Probleme zu lösen?
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »