选择性地使用 PNG 或 PDF 作为外部化的 TikZ 图片

选择性地使用 PNG 或 PDF 作为外部化的 TikZ 图片

可以要求外部化 TikZ 图片的代码借助 ImageMagics 将生成的 PDF 转换为 PNG 图形。

然而,这会使一些较轻的身材显得更重。

我希望有一个重量检查代码来选择两者中最轻的图形。这样,轻的图形将保持矢量(这是理想的),而较重的图形将变为 PNG(这允许更合理的重量,从而节省空间和显示时间)。

我在 PDF 外部化函数中处理了大量从 20ko 到 9MO 的数字。它们是从循环中自动生成的,这使得手动选择成为一个问题。

这是一个 MWE,其中理想情况下第一个图形应该是矢量的,第二个图形是自动的(这里我手动强制执行)。

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

这将给你

现在您可以通过 shell 来编写您的逻辑程序。

答案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 中的命令在 shell 中可以运行,但if似乎存在一个缺陷:

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

文件夹中的两个图都是 pdf(因此if始终是错误的,而当我在 bash 中尝试该命令时,它会给出正确的答案)。

相关内容