Escalar automáticamente tikzpicture al tamaño máximo posible en una página

Escalar automáticamente tikzpicture al tamaño máximo posible en una página

¿Es posible escalar una tikzfigura al tamaño máximo posible para la página con el texto que está presente usando algunos parámetros? Por ejemplo, ¿existen algunos parámetros tales que

\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}

La única forma en que lo he logrado es mediante prueba y error.

Con esto quiero decir que intento

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

Cabe en la página, ¿puedo hacerlo más grande? Intentar

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

Es demasiado grande, así que lo reduzco.

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

Ok, encaja de nuevo. ¿Puedo hacerlo más grande?

... etc.

¿Existe una manera fácil para que Latex ajuste automáticamente la imagen al tamaño máximo posible en la página actual con todo el texto, otras figuras, etc. que ya están presentes?

Respuesta1

La figura insertada está "fija" hasta cierto punto. Entonces no uso figureel entorno ni otro floatentorno.

La idea es simple: calcular la altura restante de la página.

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

#1 es el espacio reservado para centerel entorno y caption, 4\baselineskipde forma predeterminada.

Luego ajuste el tikzpictureal cuadro de ancho \textwidthy alto \dimexpr\pagegoal-\pagetotal-#1\relax.

  • \getpicdimense utiliza para obtener el tamaño original de la imagen.
  • \fittoboxse utiliza para ajustar la imagen al cuadro de ancho y alto fijos.
  • \fitremainingse utiliza para ajustar la imagen al espacio restante de la página.
\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}

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

información relacionada