
tikz
Ist 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 figure
die Umgebung noch eine andere float
Umgebung.
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 center
Umgebung und caption
.4\baselineskip
Passen Sie es dann an die Breite und Höhe tikzpicture
des Felds an .\textwidth
\dimexpr\pagegoal-\pagetotal-#1\relax
\getpicdimen
wird verwendet, um die Originalgröße des Bildes zu erhalten.\fittobox
wird verwendet, um das Bild in ein Feld mit fester Breite und Höhe einzupassen.\fitremaining
wird 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}