Ich habe eine Zeichnung mit TikZ erstellt und habe darin eine Menge lange Pfade als Hilfslinien/-kreise. Wenn ich meine Zeichnung compiliere, nimmt sie so viel Platz weg, als wären die Pfade Linien, was ja auch soweit klar ist. Gibt es dennoch die Möglichkeit, den Compiler anzuweisen, nach der Erstellung das Dokumentes nach dem tatsächlich benötigtem Platz zu schauen und das Bild entsprechend anzupassen?

gefragt 28 Mär '14, 14:22

jan_lde's gravatar image

jan_lde
1165712
Akzeptiert-Rate: 0%

bearbeitet 06 Mär '16, 09:23

saputello's gravatar image

saputello
11.1k174365

Willkommen auf der TeXwelt! :) Wenn ich Dich richtig verstanden habe, suchst Du sowas wie TikZ' clip-Option.

(28 Mär '14, 14:32) cgnieder

\path[use as bounding box] (0,0) rectangle (1,1); Die Koordinaten muss man natürlich noch anpassen.

(28 Mär '14, 14:45) Henri

Werden keine weiteren Vorgaben gemacht, berücksichtigt TikZ bei der Ermittlung der Bounding Box alle verwendeten Pfade, auch wenn sie weder gezeichnet noch gefüllt werden und damit gar nicht sichtbar sind. Die Bounding Box ist dabei der rechteckige Platz, der dann im Dokument für die Abbildung frei gehalten wird.

Die Beispiele dienen nur der Illustration. Die eigentliche Bounding Box ist jeweils rot und die eigentlich nicht gezeichneten Hilfslinien sind grün.

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\usepackage{blindtext}
\begin{document}
\begin{tikzpicture}[very thick,
  hilfslinie/.style={draw,green!50!black,green,thin}
]
  \draw[name path=dreieck](0,0)coordinate[label=above left:A](A)
    --(3,-1)coordinate[label=below:B](B)--(4.5,3)coordinate[label=above:C](C)--cycle;
  \path[hilfslinie,name path=kreis1](A)circle[radius=2cm];
  \path[name intersections={of=kreis1 and dreieck,by={h1,h2}}];
  \path(h1)[hilfslinie,name path=kreis2]circle[radius=1cm];
  \path(h2)[hilfslinie,name path=kreis3]circle[radius=1cm];
  \path[hilfslinie,name path=g,name intersections={of=kreis2 and kreis3}]($(A)!8cm!(intersection-2)$)--(A);
  \draw[blue,name intersections={of=dreieck and g}](intersection-2)--(A);
   %Bounding Box zeichnen
  \draw[red](current bounding box.south west)rectangle(current bounding box.north east);
\end{tikzpicture}

\blindtext
\end{document}

alt text

Über die Optionen overlay, use as bounding box und clip bzw. die Befehle \useasboundingbox und \clip, den Befehl \pgfresetboundingbox und die Umgebung pgfinterruptboundingbox lässt sich die Berechnung der Bounding Box aber beeinflussen. Mit Ausnahme von clip werden die Pfade aber trotzdem gezeichnet und können deshalb „überstehen“ und gegebenenfalls den umgebenden Text überlappen.

overlay

  • Pfade mit dieser Option werden bei der Ermittlung der Bounding Box ignoriert.
  • gleiche Wirkung wie Umgebung pgfinterruptboundingbox

In obigem Beispiel könnte man die Option einfach bei der Stildefinition für die Hilfslinien ergänzen, so dass sie für alle Pfade mit diesem Stil gilt:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\usepackage{blindtext}
\begin{document}
\begin{tikzpicture}[very thick,
  hilfslinie/.style={draw,green!50!black,green,thin,
                     overlay % kein Einfluss auf Bounding Box
  }
]
  \draw[name path=dreieck](0,0)coordinate[label=above left:A](A)
    --(3,-1)coordinate[label=below:B](B)--(4.5,3)coordinate[label=above:C](C)--cycle;
  \path[hilfslinie,name path=kreis1](A)circle[radius=2cm];
  \path[name intersections={of=kreis1 and dreieck,by={h1,h2}}];
  \path(h1)[hilfslinie,name path=kreis2]circle[radius=1cm];
  \path(h2)[hilfslinie,name path=kreis3]circle[radius=1cm];
  \path[hilfslinie,name path=g,name intersections={of=kreis2 and kreis3}]($(A)!8cm!(intersection-2)$)--(A);
  \draw[blue,name intersections={of=dreieck and g}](intersection-2)--(A);
   %Bounding Box zeichnen
  \draw[red](current bounding box.south west)rectangle(current bounding box.north east);
\end{tikzpicture}

\blindtext
\end{document}

alt text

use as bounding box bzw. \useasboundingbox

  • Der mit dieser Option oder diesem Befehl angegebene Pfad wird für die Ermittlung der Bounding Box verwendet. Alle nachfolgenden Pfade werden dagegen für die weitere Berechnung nicht mehr berücksichtigt.
  • Haben vorher erstellte Pfade bereits eine größere Bounding Box erzeugt, wird diese jedoch nicht verkleinert. Ist das dennoch gewünscht muss man zusätzlich vorher \pgfresetboundingbox nutzen.
  • Falls die Option innerhalb einer scope gesetzt wird, so beschränkt sich die Wirkung auf diese.

In obigem Beispiel könnte man das wie folgt einfügen:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{intersections,calc}
\usepackage{blindtext}
\begin{document}
\begin{tikzpicture}[very thick,
  hilfslinie/.style={draw,green!50!black,green,thin}
]
  \draw[name path=dreieck](0,0)coordinate[label=above left:A](A)
    --(3,-1)coordinate[label=below:B](B)--(4.5,3)coordinate[label=above:C](C)--cycle;
  \useasboundingbox(A)--(B)--(C)--cycle;
  \path[hilfslinie,name path=kreis1](A)circle[radius=2cm];
  \path[name intersections={of=kreis1 and dreieck,by={h1,h2}}];
  \path(h1)[hilfslinie,name path=kreis2]circle[radius=1cm];
  \path(h2)[hilfslinie,name path=kreis3]circle[radius=1cm];
  \path[hilfslinie,name path=g,name intersections={of=kreis2 and kreis3}]($(A)!8cm!(intersection-2)$)--(A);
  \draw[blue,name intersections={of=dreieck and g}](intersection-2)--(A);
   %Bounding Box zeichnen
  \draw[red](current bounding box.south west)rectangle(current bounding box.north east);
\end{tikzpicture}

\blindtext
\end{document}

alt text

clip bzw. \clip

  • Alle nachfolgenden Pfade werden auf die Größe des mit dieser Option angegebenen Pfades beschnitten. Damit verändern nachfolgende Pfade die Größe der Abbildung nicht mehr.
  • Schon vorher erstellte Pfade werden nicht beschnitten.
  • Die Wirkung der Option bzw. des Befehles beschränkt sich auf die aktuelle scope.

Im Beispiel ist die Beschränkung des Beschneidens mittels scope nötig, da sonst die rot gezeichnete Bounding Box mit weggeschnitten würde. (Alternativ könnte man das Zeichnen der Bounding Box vor das Clippen schieben und würde das gleiche Ergebnis erhalten).

Open in writeLaTeX
  \begin{scope}
      \draw[name path=dreieck](0,0)coordinate[label=above left:A](A)
        --(3,-1)coordinate[label=below:B](B)--(4.5,3)coordinate[label=above:C](C)--cycle;
      \clip(A)--(B)--(C)--cycle;
      ...
   \end{scope}
   %Bounding Box zeichnen
   \draw[red](current bounding box.south west)rectangle(current bounding box.north east);

alt text

Mit einer Kombination von beiden Befehlen, könnte man auch die Bounding Box auf den wesentlichen Teil der Zeichnung beschränken, aber innerhalb von diesem die Hilfslinien mit anzeigen lassen:

Open in writeLaTeX
  \draw[name path=dreieck](0,0)coordinate[label=above left:A](A)
    --(3,-1)coordinate[label=below:B](B)--(4.5,3)coordinate[label=above:C](C)--cycle;
  \useasboundingbox(A)--(B)--(C)--cycle;
  \clip[preaction={draw=red}](current bounding box.south west)rectangle(current bounding box.north east);

alt text

\pgfresetboundingbox

  • Mit diesem Befehl kann die bisher ermittelte Bounding Box zurück gesetzt / gelöscht werden. In deren Berechnung fließen dann nur die nachfolgenden Pfade ein.
  • Kann benutzt werden um anschließend mit use as bounding box eine neue Bounding Box festzulegen.

Umgebung pgfinterruptboundingbox

  • Am Anfang der Umgebung wird die bisher ermittelte Bounding Box der gesamten Abbildung gespeichert. Diese wird dann am Ende der Umgebung wieder hergestellt. Sämtliche Pfade innerhalb der Umgebung haben deshalb keinerlei Einfluss auf die Bounding Box der gesamten Abbildung.
  • gleiche Wirkung wie Option overlay
Permanenter link

beantwortet 30 Mär '14, 22:34

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 21 Apr '14, 00:25

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
×7
×4
×4

gestellte Frage: 28 Mär '14, 14:22

Frage wurde gesehen: 11,006 Mal

zuletzt geändert: 06 Mär '16, 09:23