Автоматическое масштабирование tikzpicture до максимально возможного размера на странице

Автоматическое масштабирование tikzpicture до максимально возможного размера на странице

Можно ли масштабировать tikzрисунок до максимально возможного размера для страницы с текстом, который на нем присутствует, используя некоторые параметры? Например, есть ли некоторые параметры, такие что

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

Единственный способ, которым я достиг этого, — это метод проб и ошибок.

Под этим я подразумеваю, что я пытаюсь

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

Он помещается на странице, могу ли я сделать его больше? Попробуйте

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

Он слишком большой, поэтому я уменьшаю его.

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

Хорошо, он снова подходит. Могу ли я сделать его больше?

... и т. д.

Есть ли простой способ автоматически подогнать Latex под максимально возможный размер изображения на текущей странице со всем текстом, другими рисунками и т. д., которые уже присутствуют?

решение1

Вставленная фигура в какой-то степени "фиксирована". Поэтому я не использую figureокружение или другое floatокружение.

Идея проста: рассчитать оставшуюся высоту страницы.

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

#1 — зарезервированное пространство для centerсреды и captionпо 4\baselineskipумолчанию.

Затем подогнать tikzpictureпо ширине \textwidthи высоте \dimexpr\pagegoal-\pagetotal-#1\relax.

  • \getpicdimenиспользуется для получения исходного размера изображения.
  • \fittoboxиспользуется для вписывания изображения в рамку фиксированной ширины и высоты.
  • \fitremainingиспользуется для размещения изображения на оставшемся пространстве страницы.
\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}

введите описание изображения здесь введите описание изображения здесь

Связанный контент