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 , pgf
um auf das Bildfeld zuzugreifen, bevor es gesetzt wird. Zu Beginn von hat \pgfsys@typesetpicturebox
das Bildfeld \pgfpic
die 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}
Die .log
Datei enthält den berechneten Skalierungsfaktor: 4,22034