Разрешение

Разрешение

При экспорте tikzpicture в собственный файл pdf для публикаций я хочу иметь возможность указать точный размер и разрешение экспортируемого файла pdf. А именно, изображения шириной 8,5 см и разрешением 600 точек на дюйм.

МВЭ:

\documentclass[12pt]{standalone}

\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,arrows.meta,external}

\tikzexternalize

\begin{document}

\resizebox{8.5cm}{!}{
     \begin{tikzpicture}
            %some drawing here
     \end{tikzpicture}
    }

\end{document}

Затем используйте pdflatex -shell-escape TikzFigure.pdfдля создания фигуры.

решение1

Разрешение

TikZ по своей природе является векторной графической системой, и сгенерированный PDF-файл сохраняет это свойство. Конечно, растровые изображения могут быть включены и использованы в графике TikZ. Но TeX не является программой с возможностями обработки изображений. Он может включать только растровые изображения и может выполнять некоторые преобразования (например, масштабировать, вращать). Но он не может изменять данные изображения. Поэтому разрешение изображения не может быть изменено.

Масштабировать до конечной ширины

Следующие хаки во внутренних компонентах для pgfдоступа к графическому блоку до его набора. В начале \pgfsys@typesetpictureboxграфическое поле \pgfpicимеет нулевой размер, а начало координат изображения является точкой отсчета блока. Размеры изображения предоставляются другими регистрами \pgf@picminx, \pgfpicminy, ... Их можно использовать для расчета фактического значения с помощью масштабного коэффициента. Затем размер блока изменяется на масштабный коэффициент, а регистры обновляются в соответствии с масштабным коэффициентом.

Пример:

\documentclass[12pt]{standalone}

\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,arrows.meta,external}
\usepackage{etoolbox}

\tikzexternalize

\makeatletter
\newcommand*{\set@picwidth}[1]{%
  \edef\RequestedPicWidth{\the\dimexpr(#1)}%
  \edef\ActualPicWidth{\the\dimexpr\pgf@picmaxx-\pgf@picminx}%
  \ifx\RequestedPicWidth\ActualPicWidth
  \else
    \ifdim\ActualPicWidth>\z@
      \pgfmathsetmacro\ScaleFactor{\RequestedPicWidth/\ActualPicWidth}%
      \typeout{* Scale factor: \ScaleFactor}%
      \setbox\pgfpic=\hbox{%
        \scalebox{\ScaleFactor}{\box\pgfpic}%
      }%
      \pgf@picminx=\ScaleFactor\pgf@picminx
      \pgf@picmaxx=\ScaleFactor\pgf@picmaxx
      \pgf@picminy=\ScaleFactor\pgf@picminy
      \pgf@picmaxy=\ScaleFactor\pgf@picmaxy
      \pgf@shift@baseline=\ScaleFactor\pgf@shift@baseline
      \pgf@trimleft@final=\ScaleFactor\pgf@trimleft@final
      \pgf@trimright@final=\ScaleFactor\pgf@trimright@final
    \else
      \errmessage{The actual picture width (\ActualPicWidth) is not positive.}%
    \fi
  \fi
}
\newenvironment{picwidth}[1]{%
  \pretocmd\pgfsys@typesetpicturebox{\set@picwidth{#1}}{}{%
    \errmessage{Patching \noexpand\pgfsys@typesetpicturebox failed!}%
  }%
  \ignorespaces
}{%
  \ignorespacesafterend
}
\makeatother

\begin{document}
  \begin{picwidth}{8.5cm}
    \begin{tikzpicture}
      \draw (0, 0) circle[radius=1] node{Hello};
   \end{tikzpicture}%
  \end{picwidth}
\end{document}

Результат

Файл .logсодержит рассчитанный масштабный коэффициент: 4,22034

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