Utilice selectivamente PNG o PDF para imágenes TikZ externalizadas

Utilice selectivamente PNG o PDF para imágenes TikZ externalizadas

Es posible solicitar el código de externalización de imágenes TikZ para convertir el PDF generado a figuras PNG gracias a ImageMagics.

Sin embargo, esto da un peso de figura más alto para algunas figuras ligeras.

Lo que me gustaría es tener un código de control de peso para escoger la figura más liviana de las dos. De esta forma, las figuras ligeras seguirían siendo vectoriales (lo cual es ideal) y las más pesadas pasarían a ser PNG (lo que permite un peso más razonable, lo que ahorra espacio y tiempo de visualización).

Trabajo con bastantes cifras que van desde 20ko hasta 9MO en su función de externalización de PDF. se generan automáticamente a partir de bucles, lo que hace que la selección manual sea un problema.

Aquí hay un MWE, donde lo ideal sería que la primera figura fuera vectorial, y la segunda PNG de forma automática (aquí lo forcé manualmente).

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]

\tikzset{
    png export/.style={
        % First we call ImageMagick; change settings to requirements
        external/system call/.add={}{; convert -density 100 -transparent white "\image.pdf" "\image.png"},
        % Now we force the PNG figure to be used instead of the PDF
        /pgf/images/external info,
        /pgf/images/include external/.code={
            \includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{##1.png}
        },
    }
}

\begin{document}

\begin{tikzpicture}
    \draw (0,0) circle (1) ;
\end{tikzpicture}

% Activate the plot as png
\tikzset{png export}

\begin{tikzpicture}
\foreach \xnum in {1,2,3,...,99,100}
{
    \draw (0,0) circle (1) ;
}
\end{tikzpicture}

\end{document}

Básicamente, creo que es posible agregar algo de código en el archivo /pgf/images/include external/.code, ver el tamaño y, con algo de lógica, decidir usar PNG o PDF.

Respuesta1

Aparentemente puedes expandir lo system callsiguiente:

    external/system call/.add={}{;
        convert -density 100 -transparent white "\image.pdf" "\image.png";
        wc -c "\image.pdf" | awk '{print "PDF is " $1}';
        wc -c "\image.png" | awk '{print "PNG is " $1}';
        echo "what is next? sir?"
    }

Esto te dará

Ahora puedes programar tu lógica mediante shell.

Respuesta2

Basado en la discusión con @Symbol 1, llegué a esto:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make]

\tikzset{
    png export/.style={
        % First we call ImageMagick; change settings to requirements
        external/system call/.add={}{; convert -density 100 -transparent white "\image.pdf" "\image.png";
            mkdir -p fig2plot;
            if [[ `wc -c "\image.pdf" | cut -d' ' -f1;` -lt `wc -c "\image.png" | cut -d' ' -f1;` ]];
            then cp "\image.png" fig2plot;
            else cp "\image.pdf" fig2plot;
            fi},
        % Now we force the PNG figure to be used instead of the PDF
        /pgf/images/external info,
        /pgf/images/include external/.code={
            \includegraphics[width=\pgfexternalwidth,height=\pgfexternalheight]{fig2plot/##1}
        },
    }
}

\begin{document}

% Activate the plot as png
\tikzset{png export}

\begin{tikzpicture}
    \draw (0,0) circle (1);
\end{tikzpicture}

\begin{tikzpicture}
\foreach \xnum in {1,2,3,...,99,100}
{
    \draw (0,0) circle (1) ;
}
\end{tikzpicture}

\end{document}

Crea una subcarpeta donde copia la imagen más pequeña, luego traza desde esa subcarpeta cualquiera que sea la extensión.

Sin embargo, aunque los comandos del archivo MAKE funcionan en el shell, ifparece tener un defecto:

/bin/sh: 1: [[: not found

Y ambas figuras en la carpeta son pdf (por lo que ifsiempre es falso, mientras que cuando intento el comando en bash me da la respuesta correcta).

información relacionada