Verwenden Sie selektiv PNG oder PDF für externalisierte TikZ-Bilder

Verwenden Sie selektiv PNG oder PDF für externalisierte TikZ-Bilder

Dank ImageMagics ist es möglich, den Code zum Externalisieren von TikZ-Bildern aufzufordern, die generierten PDF-Dateien in PNG-Bilder zu konvertieren.

Dies führt jedoch bei einigen leichten Figuren zu einem höheren Figurengewicht.

Ich hätte gern einen Gewichtungsprüfcode, der die leichtere der beiden Figuren auswählt. Auf diese Weise würden leichte Figuren vektoriell bleiben (was ideal ist) und schwerere würden zu PNG (was eine vernünftigere Gewichtung ermöglicht, was Platz und Anzeigezeit spart).

Ich arbeite mit ziemlich vielen Abbildungen im Bereich von 20 KB bis 9 MB in ihrer PDF-Externalisierungsfunktion. Sie werden automatisch aus Schleifen generiert, was die manuelle Auswahl zu einem Problem macht.

Hier ist ein MWE, bei dem die erste Abbildung im Idealfall vektoriell und die zweite automatisch im PNG-Format wäre (hier habe ich es manuell erzwungen).

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

Grundsätzlich denke ich, dass es möglich sein könnte, etwas Code hinzuzufügen /pgf/images/include external/.code, um die Größe zu prüfen und mit etwas Logik zu entscheiden, ob PNG oder PDF verwendet werden soll.

Antwort1

system callAnscheinend kann man das wie folgt erweitern :

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

Dadurch erhalten Sie

Jetzt können Sie Ihre Logik per Shell programmieren.

Antwort2

Aufgrund der Diskussion mit @Symbol 1 bin ich zu folgendem Schluss gekommen:

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

Es erstellt einen Unterordner, in den das kleinste Bild kopiert wird, und plottet dann von diesem Unterordner aus, unabhängig von der Erweiterung.

Obwohl die Befehle im Makefile in der Shell funktionieren, ifscheint es dort einen Fehler zu geben:

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

Und beide Abbildungen im Ordner sind PDF (also ifist das immer falsch, während ich die richtige Antwort bekomme, wenn ich den Befehl in Bash eingebe).

verwandte Informationen