Resolución

Resolución

Al exportar una imagen tikz a su propio archivo pdf para publicaciones, quiero poder especificar el tamaño exacto y la resolución del archivo pdf exportado. En concreto imágenes de 8,5 cm de ancho y 600 ppp.

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}

Luego úsalo pdflatex -shell-escape TikzFigure.pdfpara crear la figura.

Respuesta1

Resolución

TikZ es por naturaleza un sistema de gráficos vectoriales y el archivo PDF generado mantiene esta propiedad. Por supuesto, las imágenes de mapa de bits se pueden incluir y utilizar en los gráficos de TikZ. Pero TeX no es un programa con capacidades de procesamiento de imágenes. Sólo puede incluir imágenes de mapa de bits y puede realizar algunas transformaciones (por ejemplo, escalar, rotar). Pero no puede cambiar los datos de la imagen. Por lo tanto, la resolución de la imagen no se puede cambiar.

Escalar al ancho final

Lo siguiente piratea las partes internas para pgfacceder al cuadro de imagen, antes de componerlo. Al principio de \pgfsys@typesetpicturebox, el cuadro de imagen \pgfpictiene tamaño cero y el origen de la imagen es el punto de referencia del cuadro. Las dimensiones de la imagen las proporcionan otros registros \pgf@picminx, \pgfpicminy, ... Con ellos se puede calcular el valor real y luego el factor de escala. Luego se cambia el tamaño del cuadro según el factor de escala y los registros se actualizan según el factor de escala.

Ejemplo:

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

Resultado

El .logarchivo contiene el factor de escala calculado: 4.22034

información relacionada