
É 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 call
seguinte 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, if
parece 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).