Use PNG ou PDF seletivamente para imagens TikZ externalizadas

Use PNG ou PDF seletivamente para imagens TikZ externalizadas

É possível solicitar o código de externalização de imagens TikZ para converter o PDF gerado em figuras PNG graças ao ImageMagics.

No entanto, isso dá maior peso à figura para algumas figuras leves.

O que eu gostaria é de ter um código de verificação de peso para escolher a figura mais leve das duas. Dessa forma, as figuras leves permaneceriam vetoriais (o que é o ideal), e as mais pesadas se tornariam PNG (o que permite um peso mais razoável, o que economiza espaço e tempo de exibição).

Eu trabalho com vários números que variam de 20ko a 9MO em sua função PDF externalizada. eles são gerados automaticamente a partir de loops, o que torna a seleção manual um problema.

Aqui está um MWE, onde idealmente a primeira figura seria vetorial, e a segunda PNG de forma automática (aqui eu forcei 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}

Basicamente, acho que pode ser possível adicionar algum código no arquivo /pgf/images/include external/.code, ver o tamanho e, com alguma lógica, decidir usar o PNG ou o PDF.

Responder1

Aparentemente você pode expandir da system callseguinte forma:

    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?"
    }

Isto lhe dará

Agora você pode programar sua lógica por shell.

Responder2

Com base na discussão com @Symbol 1 , cheguei a isto:

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

Ele cria uma subpasta onde copia a menor imagem, e então plota a partir dessa subpasta qualquer que seja a extensão.

No entanto, embora os comandos no makefile funcionem no shell, ifparece haver uma falha:

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

E as duas figuras da pasta são pdf (então ifé sempre falso, enquanto quando tento o comando no bash ele dá a resposta certa).

informação relacionada