Выборочно используйте PNG или PDF для внешних изображений TikZ

Выборочно используйте PNG или PDF для внешних изображений TikZ

Благодаря ImageMagics можно запросить код для экспорта изображений TikZ, чтобы преобразовать сгенерированные PDF-файлы в рисунки PNG.

Однако это обеспечивает больший вес некоторых легких фигур.

Мне бы хотелось иметь код проверки веса, чтобы выбрать самую легкую фигуру из двух. Таким образом, легкие фигуры оставались бы векторными (что идеально), а более тяжелые становились бы PNG (что позволяет получить более разумный вес, что экономит место и время отображения).

Я работаю с большим количеством фигур размером от 20 килобайт до 9 МО в их внешней функции PDF. Они генерируются автоматически из циклов, что делает ручной выбор проблематичным.

Вот MWE, где в идеале первая фигура должна быть векторной, а вторая - PNG автоматическим способом (здесь я вручную это принудительно сделал).

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

По сути, я думаю, что можно было бы добавить какой-то код в /pgf/images/include external/.code, чтобы посмотреть на размер и, используя некоторую логику, решить, использовать PNG или PDF.

решение1

Видимо, можно расширить system callследующим образом:

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

Это даст вам

Теперь вы можете программировать свою логику с помощью оболочки.

решение2

Основываясь на обсуждении с @Symbol 1, я пришел к следующему:

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

Он создает подпапку, в которую копирует наименьшее изображение, а затем строит график из этой подпапки независимо от расширения.

Однако, хотя команды в makefile работают в оболочке, ifпохоже, в них есть один недостаток:

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

И оба рисунка в папке — PDF (поэтому ifвсегда ложно, тогда как когда я пробую команду в bash, она дает правильный ответ).

Связанный контент