Hallo zusammen,

ich habe gerade meine ersten Schritte mit TikZ gewagt und eine Abbildung erstellt, mit der ich sogar schon fast zufrieden bin. Einige Schwierigkeiten habe ich noch, bei denen ich mir gerne helfen lassen würde und darüber hinaus würde ich gerne wissen, was ihr von meinem Code generell haltet. Sprich: Ist er evtl. ineffizient, unschön, kann man ganz anders vorgehen, um die Abbildung im nachhinein evtl. leichter verändern zu können, wenn sich Seitenränder, Schriftarten o.ä. ändern?

Nun aber zu meinen Fragen:

  1. Wie bekomme ich es hin, dass der Text "Dieser Text soll linksbündig stehen" auch wirklich linksbündig steht? Die Option align=left hat scheinbar keinen Effekt.

  2. Wie kann man die drei Zeilen zu Beginn der Abbildung am = Zeichen ausrichten?

  3. Wie können die beiden schrägen Pfeile senkrecht auf die obere zentrale Kante des 1. bzw. 2. Blocks gesetzt werden?

Ich habe die relevanten Stellen für die Fragen im Code markiert, damit ihr sie besser findet.

Hier der Code:

\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern} 
\usepackage[ngerman]{babel}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{intersections,positioning,arrows,calc}

\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[
relang/.style={rectangle,draw,minimum width=13cm,minimum height=1cm,anchor=north west,align=left},
remittel/.style={rectangle,draw,minimum width=5cm,minimum height=1cm,anchor=north west,align=left},
reklein/.style={rectangle,draw,minimum width=3cm,minimum height=1cm,anchor=north west,align=center},
rerund/.style={rectangle,draw,minimum width=4cm,anchor=center,align=center},
pfeil/.style={semithick,->,shorten >=5pt,shorten <=5pt},
beschriftung/.style={rotate=90,anchor=north,text width=4cm,align=center}]

% Grid
%   \draw[step=0.5cm,very thin,gray] (0,0) grid(14,20);

% important coordinates are defined
    \coordinate (c_par) at (1,20);
    \coordinate (c_par1) at ($(c_par)-(0,1)$);
    \coordinate (c_strat1) at ($(c_par1)-(0,5)$);
    \coordinate (c_strat2) at ($(c_strat1)+(13,0)$);
    \coordinate (c_opt) at ($0.5*(c_strat1)+0.5*(c_strat2)-(0,4)$);

% Elemente
% 1. Frage --------------------------------------------------
    \node [relang](par) at (c_par){Dieser Text soll linksbündig stehen};

% 2. Frage --------------------------------------------------   
    \node [relang](par1) at (c_par1)    {$\mu=\text{Diese und die nächsten zwei Zeilen sollen am = ausgerichtet werden}$\\
                                             $i=\text{Beispieltext}$\\
                                             $\sigma=\text{Beispieltext}$};

    \node [remittel](strat1) at (c_strat1){Erste Zeile\\zweite Zeile\\dritte Zeile};
    \node [remittel,anchor=north east](strat2) at ($(c_strat1)+(13,0)$) {Erste Zeile\\zweite Zeile\\dritte Zeile};
    \node [remittel,anchor=north] (opt) at (c_opt)  {$a^2+b^2=c^2$};
    \node [reklein](prod1) at ($(c_strat1)-(0,7)$){1. Block};
    \node [reklein](prod2) at ($(c_strat1)-(0,8.5)$){Erste Zeile\\Zweite Zeile};
    \node [reklein,minimum height=4cm](prod3) at ($(c_strat1)-(0,10)$){Erste Zeile\\Zweite Zeile};
    \node [reklein,anchor=north east](prod4) at ($(c_strat2)-(0,7)$){2. Block};
    \node [reklein,anchor=north east](prod5) at ($(c_strat2)-(0,8.5)$){Erste Zeile\\Zweite Zeile};
    \node [reklein,anchor=north east](prod6) at ($(c_strat2)-(0,10)$){Erste Zeile\\Zweite Zeile};
    \node [reklein,anchor=north east](prod7) at ($(c_strat2)-(0,11.5)$){Erste Zeile\\Zweite Zeile};
    \node [reklein,anchor=north east](prod8) at ($(c_strat2)-(0,13)$){Erste Zeile\\Zweite Zeile};
    \node [rerund] (rund1) at ($0.5*(prod1)+0.5*(prod4)$) {mittleres Element 1};
    \node [rerund] (rund2) at ($0.5*(prod2)+0.5*(prod5)$) {mittleres Element 2};
    \node [rerund] (rund3) at ($(rund2)-(0,1.5)$) {mittleres Element 3};
    \node [rerund] (rund4) at ($0.5*(prod3)+0.5*(prod7)$) {mittleres Element 4};
    \node [rerund] (rund5) at ($(rund4)-(0,1.5)$) {mittleres Element 5};

% Verbindungen über Pfeile
    \draw [pfeil] (rund1) to (prod1);
    \draw [pfeil] (rund1) to (prod4);
    \draw [pfeil] (rund2) to (prod2);
    \draw [pfeil] (rund2) to (prod5);
    \draw [pfeil] (rund3.west) to (prod3);
    \draw [pfeil] (rund3) to (prod6);
    \draw [pfeil] (rund4) to (prod3);
    \draw [pfeil] (rund4) to (prod7);
    \draw [pfeil] (rund5.west) to (prod3);
    \draw [pfeil] (rund5) to (prod8);

    \draw [pfeil] (par1) to (opt);
    \draw [pfeil] (opt) to (rund1);

% 3. Frage --------------------------------------------------
    \draw [pfeil] (strat1) to (prod1);
    \draw [pfeil] (strat2) to (prod4);

% Beschriftungen am linken Seitenrand
    \node [beschriftung] (beschriftung1) at ($(par1.west)-(1,0)$) {Input Parameter};
    \node [beschriftung] (beschriftung2) at ($(strat1.west)-(1,0)$) {Ein etwas längerer\\ Beispieltext};
    \path let \p1=(opt) in node [beschriftung] (beschriftung3)at (0,\y1) {Ein etwas längerer Beispieltext\\mit mehr Text};
    \node [beschriftung,text width=8cm] at ($0.5*(prod1.north west)+0.5*(prod3.south west)-(1,0)$) {Ein etwas längerer Beispieltext\\mit mehr Text};

\end{tikzpicture}
\end{figure}
\end{document}

Vielen Dank schonmal für eure Hilfe.

gefragt 12 Aug '13, 13:22

josephine's gravatar image

josephine
944253035
Akzeptiert-Rate: 0%

bearbeitet 25 Aug '13, 13:56

cgnieder's gravatar image

cgnieder
22.1k253463

Es wäre besser, jede einzelne Frage mit einem entsprechend minimaleren Beispiel versehen für sich zu stellen als mehrere Fragen mit einer Frage erschlagen zu wollen. Das ist auch bezüglich der Klassifizierung der Frage besser.

(12 Aug '13, 17:21) saputello

@josephine In diesem Sinne habe ich eine Frage unten beantwortet, und schaue mir gern dann auch die anderen an, wenn sie separat gepostet sind. Das wäre wirklich prima zum Ordnen der Probleme und zum Wiederauffinden von Lösungen auf lange Sicht.

(12 Aug '13, 18:47) stefan ♦♦

@josephine Das führt zu einem weiterer Aspekt, wenn man mehrere Fragen in eine quetscht: Wenn drei Leute jeweils eine von drei Teilfragen vollständig beantworten, weißt Du nicht, wem Du den Haken geben sollst.

(12 Aug '13, 18:50) saputello

Der Text im 1. Node ist tatsächlich linksbündig. Das sieht man, wenn man eine weitere Zeile hinzufügt:

\documentclass{scrbook}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usetikzlibrary{intersections,positioning,arrows,calc}
\begin{document}
\begin{tikzpicture}[
    relang/.style={rectangle,draw,minimum width=13cm,minimum height=1cm,
                   anchor=north west,align=left}]
  \coordinate (c_par) at (1,20);
  \node [relang](par) at (c_par) {Dieser Text soll linksb"undig\\stehen};
\end{tikzpicture}
\end{document}

Ausgabe der Grafik

Der Text ist an sich linksbündig ausgerichtet, ist der Node größer und der Textblock als gesamtes ist zentriert platziert. Man kann jedoch stattdessen text width vorgeben:

relang/.style={rectangle,draw,text width=13cm,minimum height=1cm,
               anchor=north west,align=left}]

Ausgabe linksbündig

Den demonstrierenden Zeilenumbruch kannst Du natürlich wieder entfernen.

Permanenter link

beantwortet 12 Aug '13, 18:44

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 50%

Es sei eingemerkt, dass text width=13cm nicht das Gleiche ist wie minimum width=13cm, siehe meine Antwort. :)

(12 Aug '13, 19:28) Qrrbrbirlbel

Wie @saputello bemerkt, wäre es tatsächlich besser, die (guten und berechtigten) Fragen einzeln zu stellen.

Ich würde allerdings ganz allgemein die Erstellung eines solchen Diagramms etwas anders machen. Du lädst zum Beispiel die positioning-Library aber benutzt sie nicht mal. Die manuelle Positionierung der Nodes (hier sogar mithilfe der calc-Library) ist eher ungünstig da sehr unflexibel. Hier böte sich tatsächlich auch an, die Keys der positioning-Library zu verwenden, um eine konsistente und einfach nachträglich zu ändernde Platzierung zu erreichen.

Noch mehr scheint es sich hier auch zu lohnen, die matrix-Library (bzw. das \matrix-Makro, das es bereits ohne die gleichnamige Library gibt) zu verwenden. Bis auf einige wenige Nodes, die größer sind als eine Zelle, würde es die Erstellung einer solchen Graphik stark vereinfachen.


Deine nummerierten Fragen lassen sich relativ einfach beantworten:

  1. Die align-Option funktioniert leider nicht so.

    Sie richtet nur den Text innerhalb der (internen) TeX-Box aus, sofern du aber weder einene Zeilenumbruch \\ oder die text width-Option (die die Breite dieser Box direkt festlegt) nicht benutzt, ist diese Box nur so groß wie der Text in ihr drin.

    Was tun?
    Einige Möglichkeiten kommen mir in den Sinn: 1. Erstelle die Node ganz gewöhnlich ohne Text, aber mit einem \strut (damit die Box eine Höhe und Tiefe hat) und verwende eine weitere Node die dann linksbündig platziert wird (mithilfe der mid west- oder base west-Anchors):

        \node [relang](par) at (c_par){\strut};
        \node[anchor=base west] at (par.base west) {Dieser Text soll linksbündig stehen};
    
    1. Erstelle die Node ganz gewöhnlich, aber setze die text width-Option explizit (und zwar so, dass sie genauso breit ist wie die breiteste TeX-Box, die gerade so reinpassen würde:

      \node [
        relang,
        text width=\pgfkeysvalueof{/pgf/minimum width}-2*(\pgfkeysvalueof{/pgf/inner xsep})
      ] (par) at (c_par) {Dieser Text soll linksbündig stehen};
      
    2. In Verbindung mit der Node direkt darunter würde es sich auch anbieten, das rectangle split-Shape zu benutzen, in der man das Alignment für jeden Node-Part angeben kann. Nach dem Laden der shapes.multipart-Library kann man dann das Ganze in einer Node machen:

      \node[relang, rectangle split, rectangle split parts=2, rectangle split part align=left] (par1) at (c_par)
      {Dieser Text soll linksbündig stehen \nodepart{two}
        $\!\begin{aligned}
                \mu & =\text{Diese und die nächsten zwei Zeilen sollen am = ausgerichtet werden}\\
                  i & =\text{Beispieltext}\\
             \sigma & =\text{Beispieltext}
           \end{aligned}$};
      
  2. Ausrichtung am = schreit nach einer von amsmath’s Environments, hier passt die aligned-Environment, die man auch im Inline-Mathematik-Modus verwenden kann (aber ansonsten nicht sollte). Siehe Punkt 1.3.

  3. Es können mit dem Coordinate-Operator |- und -| Koordinaten erreicht werden, die senkrecht zu einer Koordinate und waagrecht zu einer anderen sind (dies ist die implizite Version des perpendicular cs). Da solche Pfade vermutlich öfters vorkommen, empfielt es sich ein to path-Style zu definieren, der einem die Arbeit abnimmt:

    \tikzset{
      *|/.style={% Asterisk und |
        to path={
          (\tikztostart-|\tikztotarget) -- (\tikztotarget) \tikztonodes}}}
    

    Jetzt muss man nur noch

    \draw [pfeil] (strat1.south) to[*|] (prod1);
    \draw [pfeil] (strat2.south) to[*|] (prod4);
    

    verwenden und die Pfeile sind senkrecht.

    Analog dazu kann man auch noch andere Styles definieren, die das ganze in waagrechter Richtung machen (also *-). Es bietet sich zusätzlich noch an zusätzliche Styles zu definieren, die das ganze an der Ziel-Node machen (also |* und -*). Darüber hinaus kann man die to paths auch noch so verbessern, dass sie selbst herausfinden, welche Node wo ist, so dass der richtige Anchor (in unserem Beispiel .south) automatisch verwendet wird (falls es denn übehaupt eine Node ist).

Permanenter link

beantwortet 12 Aug '13, 19:26

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

bearbeitet 12 Aug '13, 19:30

(Ich werde eine matrix-Lösung posten, wenn ich die Zeit dazu finde – und die Frage in dieser Form noch existiert.)

(12 Aug '13, 19:28) Qrrbrbirlbel

@Qrrbrbirlbel Ich befürchte, durch das ebenfalls gemischte Antworten wirst Du Josephine so zufriedenstellen, dass sie keinen Grund mehr hat, diese Frage zu splitten, schade. Ich empfehle in solchen Fällen, nur die erste Teilfrage zu beantworten und den Rest dann, wenn die Folgefrage da ist. Die erste Frage kann man immer noch anschließend reduzieren.

(12 Aug '13, 19:37) stefan ♦♦

@Qrrbrbirlbel Was tun hier? Diese Frage und Antwort irgendwann wieder löschen, weil sie zwar gut sind aber als schlechtes Beispiel zum Posten dienen? Oder die Antwort gleich erstmal kürzen und den betreffenden Teil später als separate Antwort senden? ;-)

(12 Aug '13, 19:40) stefan ♦♦

@saputello, @stefan, @Qrrbrbirlbel :

sorry für das formal schlechte Posting. Da ich als TikZ-Anfänger jedoch die "richtigen" Fragen nicht kenne, habe ich für meine erste Abbildung mal bewusst den ganzen Code gepostet, um auch Antworten auf Fragen zu bekommen, die ich selbst nie hätte stellen können. Wenn es für die Qualität des Forums nützlich ist, dann werde ich gerne die 3 einzelnen Fragen nochmal getrennt posten, damit die vielen guten Antworten nicht komplett verloren gehen. Sagt doch einfach Bescheid, ob das sinnvoll ist, dann setz ich mich nochmal mit kleineren MB ran.

(12 Aug '13, 20:08) josephine

@josephine Klasse, dass Du die 2. und 3. Teilfrage nochmal separat postest! Die Sammel-Frage hier können wir dann auf die 1. kürzen. Das ist sehr sinnvoll, so sammeln wir konkrete Fragen und Antworten gut sortiert, leicht auffindbar und auf einen Blick leicht erfassbar. Dafür geben wir uns auch gern Mühe.

(12 Aug '13, 20:16) stefan ♦♦

(Kommentar gepostet als ich nur Stefans Kommentare sah)

@stefan Du bist der mit den zwei Diamanten. Du kannst Frage sowie Antwort wieder löschen, wenn du es als so ungünstig empfindest, dass die Fragen wider Erwarten beantwort wurden. ;)

Ein Vorschlag: Diese Frage verwenden, um die Methodik zu beantworten (manuelles Positioning vs. positioning vs. \matrix), extra Fragen stellen für die anderen Sachen (sie aber trotzdem hier verwenden). Vor allem bei Nummer 3 (die orthogonalen Pfade) lassen sich ordentliche Styles definieren (wie in meinem letzten Absatz schon angedeutet).

(12 Aug '13, 20:29) Qrrbrbirlbel

@stefan: Kein Problem, die Nachwelt soll ja schließlich auch noch von euren Antworten profitieren. Poste jetzt gleich nochmal die 2. und 3. Frage seperat.

(12 Aug '13, 20:40) josephine
Ergebnis 5 von 7 show 2 more comments
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
×69
×35

gestellte Frage: 12 Aug '13, 13:22

Frage wurde gesehen: 12,702 Mal

zuletzt geändert: 25 Aug '13, 13:56