Tikzpicture automatisch auf die maximal mögliche Größe auf einer Seite skalieren

Tikzpicture automatisch auf die maximal mögliche Größe auf einer Seite skalieren

tikzIst es möglich, eine Abbildung mit dem darauf vorhandenen Text mithilfe bestimmter Parameter auf die für die Seite maximal mögliche Größe zu skalieren ? Gibt es beispielsweise Parameter, die

\usepackage{float}
\usepackage{tikz, pgfplots} 

\begin{document}

\begin{figure}[H]
\begin{tikzpicture}[scale = **SOMETHING_HERE_TO_AUTO_SCALE_TO_MAX_SIZE_ON_PAGE?**]
% ... code to draw figure
\end{tikzpicture}
\end{figure}

\end{document}

Der einzige Weg, wie ich dies erreichen konnte, war durch Versuch und Irrtum.

Damit meine ich, ich versuche

\begin{figure}[H]
\begin{tikzpicture}[scale = 1]
% ... code to draw figure
\end{tikzpicture}
\end{figure}

Es passt auf die Seite, kann ich es also vergrößern? Versuchen Sie es

\begin{figure}[H]
\begin{tikzpicture}[scale = 2]
% ... code to draw figure
\end{tikzpicture}
\end{figure}

Es ist zu groß, also verkleinere ich

\begin{figure}[H]
\begin{tikzpicture}[scale = 1.5]
% ... code to draw figure
\end{tikzpicture}
\end{figure}

Ok, es passt wieder. Kann ich es größer machen?

... usw.

Gibt es eine einfache Möglichkeit, mit der Latex das Bild automatisch auf die maximal mögliche Größe auf der aktuellen Seite mit dem gesamten bereits vorhandenen Text, anderen Abbildungen usw. anpasst?

Antwort1

Die eingefügte Abbildung ist bis zu einem gewissen Grad „fest“. Ich verwende also weder figuredie Umgebung noch eine andere floatUmgebung.

Die Idee ist einfach: Berechnen Sie die verbleibende Höhe der Seite

\dimexpr\pagegoal-\pagetotal-#1\relax

#1 ist standardmäßig der reservierte Speicherplatz für centerUmgebung und caption.4\baselineskip

Passen Sie es dann an die Breite und Höhe tikzpicturedes Felds an .\textwidth\dimexpr\pagegoal-\pagetotal-#1\relax

  • \getpicdimenwird verwendet, um die Originalgröße des Bildes zu erhalten.
  • \fittoboxwird verwendet, um das Bild in ein Feld mit fester Breite und Höhe einzupassen.
  • \fitremainingwird verwendet, um das Bild an den verbleibenden Platz auf der Seite anzupassen.
\documentclass{article}
\usepackage{tikz}
\usepackage{caption}
\usepackage{showframe}
\usepackage{lipsum}
\usetikzlibrary{fit, calc, positioning}
\usepackage{xparse}

\renewcommand*\ShowFrameColor{\color{red}}

\NewDocumentCommand { \getpicdimen } { s O{\picwidth} O{\picheight} +m }
  {
    \begin{pgfinterruptboundingbox}
    \begin{scope}[local bounding box=pic, opacity=0]
      \IfBooleanTF {#1}
        { \node[inner sep=0pt, fit=(#4)] {}; }
        { #4 }
    \end{scope}
    \path ($(pic.north east)-(pic.south west)$);
    \end{pgfinterruptboundingbox}
    \pgfgetlastxy{#2}{#3}
  }

\ExplSyntaxOn
\fp_new:N \l__scale_fp
\NewDocumentCommand { \fittobox } { O{\picwidth} O{\picheight} m m D(){0, 0} +m }
  {
    \getpicdimen[#1][#2]{#6}
    \fp_compare:nTF
      {
        % pic ratio
        \dim_ratio:nn { #1 } { #2 } >
        % box ratio
        \dim_ratio:nn { #3 } { #4 }
      }
      { \fp_set:Nn \l__scale_fp { \dim_ratio:nn { #3 } { #1 } } }
      { \fp_set:Nn \l__scale_fp { \dim_ratio:nn { #4 } { #2 } } }
    \begin{scope}[
      shift={($(#5) - \fp_use:N \l__scale_fp*(pic.center)$)},
      scale=\fp_use:N \l__scale_fp,
      nodes={transform~shape},
      ]
      #6
    \end{scope}
  }

\NewDocumentCommand { \fitremaining } { O{ 4\baselineskip } +m }
  {
    \fittobox{\textwidth}{\dimexpr\pagegoal-\pagetotal-#1\relax}{#2}
  }
\ExplSyntaxOff

\begin{document}
\lipsum[1]
\begin{center}
\begin{tikzpicture}
\fitremaining{
  \draw (0, 0) node[left, draw] {$A$} -- (1, 1) node[right, draw] {$B$};
}
\end{tikzpicture}
\captionof{figure}{Test figure}
\end{center}

Some other text.
\clearpage

\lipsum[1-3]
\begin{center}
\begin{tikzpicture}
\fitremaining{
  \draw (0, 0) node[left, draw] {$A$} -- (1, 1) node[right, draw] {$B$};
}
\end{tikzpicture}
\captionof{figure}{Test figure}
\end{center}
\clearpage
\end{document}

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

verwandte Informationen