Ich versuche, ein TikZ-Diagram zu skalieren. Dafür verwende ich die scale-Option, sie zeigt jedoch keine Wirkung:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,arrows}
\tikzset{
  state/.style={circle, draw, minimum size=6ex},
  arrow/.style={-latex, shorten >=3pt, shorten <=3pt}}
\begin{document}
\begin{tikzpicture}[node distance=5em, scale=2]
  \node [state] (S1) {$S_1$};
  \node [state, right=of S1] (S2) {$S_2$};
  \draw [arrow, bend left=60]  (S1) to (S2);
  \draw [arrow, bend right=60] (S1) to (S2);
\end{tikzpicture}
\end{document}

Ausgabe TikZ-Grafik

Wieso geht das nicht? Sollte man es anders machen?

gefragt 20 Jul '13, 23:44

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

bearbeitet 21 Aug '13, 19:47

stefan's gravatar image

stefan ♦♦
18.3k163148


Die scale-Option führt laut Dokumentation nur zu einer Koordinatentransformation, d.h. sie wirkt nur, wenn Koordinaten betroffen sind. Die Linienstärke, die Größe der Pfeilspitzen oder Optionen wie shorten > sowie die Noden werden davon nicht beeinflusst. Bei manchen Dingen muss man auch austesten, ob die Skalierung wirkt oder nicht. Zum Beispiel wird die node distance nicht automatisch mit angepasst. Dadurch sieht man im Ausgangsbeispiel keinerlei Wirkung der scale-Option.

Deshalb ist hier noch ein Beispiel bei dem man die Wirkung der scale-Option auf Koordinaten an Hand einer eingezeichneten Strecke und eines roten Kreises sehen kann:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{
  state/.style={circle, draw, minimum size=6ex},
  arrow/.style={-latex, shorten >=3pt, shorten <=3pt}}
\newcommand\grafik{%
  \node [state] (S1) {$S_1$};
  \node [state, right=of S1] (S2) {$S_2$};
  \draw [arrow, bend left=60]  (S1) to (S2);
  \draw [arrow, bend right=60] (S1) to (S2);
  \draw[fill=red] (S1.east) -- ++(2.5em-1mm,0) +(1mm,0) circle [radius=1mm];}
\begin{document}

\begin{tikzpicture}[node distance=5em]
  \grafik % unskaliert
  \begin{scope}[xshift=4cm, scale=2]
    \grafik
  \end{scope}
  \begin{scope}[xshift=8cm, scale=0.5]
    \grafik
  \end{scope}
\end{tikzpicture}

\end{document}

alt text

Abhängig davon, was in der Grafik zusätzlich zu den Koordinatenangaben noch alles skaliert werden soll, gibt es unterschiedliche Anpassungsmöglichkeiten:

Abstände, die über node distance eingestellt werden: Sollen die Noden unverändert bleiben, aber die über node distance eingestellten Abstände trotzdem skaliert werden, dann muss diese Option von Hand angepasst werden.

Werden Teile einer TikZ-Abbildung unterschiedlich skaliert, dann kann man sich für die Zeichnung einen eigenen Skalierungsstil definieren, damit node distance jeweils mitskaliert wird:

\begin{tikzpicture}[
    myscale/.style={scale=#1, node distance=#1*5em},myscale=1]
  \grafik % unskaliert
  \begin{scope}[xshift=4cm, myscale=2]
    \grafik
  \end{scope}
  \begin{scope}[xshift=10cm, myscale=0.5]
    \grafik
  \end{scope}
\end{tikzpicture}

alt text

Auf dem gleichen Weg lassen sich natürlich auch die Linienbreite etc. beeinflussen.

Noden: @Stefan hat schon erklärt, wie durch die zusätzliche Angabe der scale-Option für einzelne oder alle Noden, diese und deren Inhalt ebenfalls skaliert werden können.

Noden und Abstände: Gibt man bei den betreffenden Noden oder einer scope oder für das gesamte tikzpicture die Option transform shape an, wird neben den Noden auch automatisch die node distance angepasst.

\begin{tikzpicture}[node distance=5em]
  \grafik % unskaliert
  \begin{scope}[xshift=5cm, scale=2, every node/.style={scale=2}] % Noden mitskalieren
    \grafik
  \end{scope}
  \begin{scope}[xshift=12cm, scale=2, transform shape] % Noden und Abstände mitskalieren
    \grafik
  \end{scope}
\end{tikzpicture}

alt text

Komplette Grafik: Soll die gesamte Zeichnung einschließlich der Schrift, der Linienstärke und der Größe der Pfeilspitzen sowie der shorten Optionen skaliert werden, dann kann man \scalebox verwenden. Das dafür benötigte graphicx-Paket wird von tikz bereits mitgeladen.

\begin{tikzpicture}[node distance=5em]
  \grafik
\end{tikzpicture}%
\hspace{1cm}
\scalebox{2}{% skalieren auf die doppelte Größe
  \begin{tikzpicture}[node distance=5em]
    \grafik
  \end{tikzpicture}%
}

alt text

Alternativ kann mit \resizebox aus dem gleichen Paket die gesamte Grafik auf eine vorgegebene Breite skaliert werden.

% Breite auf 15cm skalieren, Höhe wird durch Angabe von ! proportional angepasst
\resizebox{15cm}{!}{%
  \begin{tikzpicture}[node distance=5em]
    \grafik
  \end{tikzpicture}%
}

Mit beiden Befehlen können neben Zeichnungen auch Tabellen, Texte oder anderes Material skaliert werden. Weitere Informationen zu \scalebox, \resizebox sowie \resizebox* sind in der Anleitung der graphics-Sammlung zu finden.

Permanenter link

beantwortet 21 Jul '13, 20:49

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 07 Aug '13, 21:14

1

Die node distance wird mit dem TikZ-Koordinatensystem (Optionen x und y) verrechnet wenn es einheitenlose Werte enthält. Es ist also möglich mit node distance=5, x=2em, y=2em ebenfalls eine Skalierung um den Faktor 2 zu erreichen. (Sollte diese TikZ-Koordinatensystem-Skalierung nur für nodes passieren, bietet es sich natürlich an every node/.append style={x=2em, y=2em} zu setzen, sofern man nur per positioning positioniert.)

(25 Jul '13, 09:30) Qrrbrbirlbel

@Qrrbrbirlbel: Vielen Dank für den Hinweis. Am einfachsten ist es dann wohl gleich node distance=2*5em oder node distance=10em zu schreiben. Zumindest ist es wesentlich besser, als die Koordinaten explizit oder über shift-Optionen anzugeben. Ich hab das entsprechend geändert.

(25 Jul '13, 16:20) esdd

Skalieren und andere Transformationen wirken nicht auf nodes. Das ist so voreingestellt, weil man oft nicht den Text skalieren oder rotieren möchte, auch wenn man die eigentliche Grafik transformiert. Vom Handbuch zitiert: "Scaling text is evil". Man sollte besser die passende Schriftgröße wählen als eine auf andere Größe designte Schrift zu skalieren.

Doch es geht natürlich. Man kann auch für nodes eine Skalierung angeben, wie mit

\node [state, scale=2] (S1) {$S_1$};

oder es gleich für alle Knoten tun:

\begin{tikzpicture}[node distance=5em, every node/.style={scale=2}]

Es gibt jedoch noch die Option transform shape, die man ebenfalls für nodes oder die ganze Grafik setzen kann und dann wird die Transformation ebenfalls für node bzw. shape angewendet. Oft reicht damit die einfache Kombination:

\begin{tikzpicture}[node distance=5em, scale=2, transform shape]
  \node [state] (S1) {$S_1$};
  \node [state, right=of S1] (S2) {$S_2$};
  \draw [arrow, bend left=60]  (S1) to (S2);
  \draw [arrow, bend right=60] (S1) to (S2);
\end{tikzpicture}

Ausgabe mit skalierter Grafik

Permanenter link

beantwortet 21 Jul '13, 11:03

stefan's gravatar image

stefan ♦♦
18.3k163148
Akzeptiert-Rate: 49%

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:

×731
×18

gestellte Frage: 20 Jul '13, 23:44

Frage wurde gesehen: 59,049 Mal

zuletzt geändert: 21 Aug '13, 19:47