외부화된 TikZ 그림에 선택적으로 PNG 또는 PDF 사용

외부화된 TikZ 그림에 선택적으로 PNG 또는 PDF 사용

ImageMagics 덕분에 생성된 PDF를 PNG 그림으로 변환하기 위해 TikZ 그림 외부화 코드를 요청할 수 있습니다.

그러나 이것은 일부 가벼운 피규어에 더 높은 피규어 무게를 제공합니다.

내가 원하는 것은 둘 중 가장 가벼운 것을 고르는 무게 확인 코드를 갖는 것입니다. 이렇게 하면 가벼운 그림은 벡터형으로 유지되고(이상적), 무거운 그림은 PNG가 됩니다(더 합리적인 무게를 허용하여 공간과 표시 시간을 절약합니다).

저는 PDF 외부화 기능을 통해 20ko에서 9MO에 이르는 꽤 많은 수치를 작업합니다. 루프에서 자동으로 생성되므로 수동 선택이 문제가 됩니다.

다음은 이상적으로 첫 번째 수치가 벡터이고 두 번째 PNG가 자동 방식인 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?"
    }

이것은 당신에게 줄 것입니다

이제 쉘로 논리를 프로그래밍할 수 있습니다.

답변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에서 명령을 시도하면 올바른 답이 제공됩니다).

관련 정보