Auflösung

Auflösung

Beim Exportieren eines Tikz-Bilds in eine eigene PDF-Datei für Veröffentlichungen möchte ich die genaue Größe und Auflösung der exportierten PDF-Datei angeben können. Insbesondere 8,5 cm Breite und 600 dpi Bilder.

MWE:

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

Verwenden Sie dann pdflatex -shell-escape TikzFigure.pdf, um die Figur zu erstellen.

Antwort1

Auflösung

TikZ ist von Natur aus ein Vektorgrafiksystem und die generierte PDF-Datei behält diese Eigenschaft. Natürlich können Bitmap-Bilder in die TikZ-Grafiken eingebunden und verwendet werden. TeX ist jedoch kein Programm mit Bildverarbeitungsfunktionen. Es kann nur Bitmap-Bilder einbinden und einige Transformationen durchführen (z. B. skalieren, drehen). Die Bilddaten kann es jedoch nicht ändern. Daher kann die Bildauflösung nicht geändert werden.

Auf endgültige Breite skalieren

Die folgenden Hacks in die internen Vorgänge von , pgfum auf das Bildfeld zuzugreifen, bevor es gesetzt wird. Zu Beginn von hat \pgfsys@typesetpictureboxdas Bildfeld \pgfpicdie Größe Null und der Ursprung des Bildes ist der Referenzpunkt des Felds. Die Abmessungen des Bildes werden von anderen Registern \pgf@picminx, \pgfpicminy, ... bereitgestellt. Sie können verwendet werden, um die tatsächliche Größe und dann den Skalierungsfaktor zu berechnen. Die Größe des Felds wird dann mit dem Skalierungsfaktor geändert und die Register werden entsprechend dem Skalierungsfaktor aktualisiert.

Beispiel:

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

Ergebnis

Die .logDatei enthält den berechneten Skalierungsfaktor: 4,22034

verwandte Informationen