¿Cómo utilizar correctamente Savebox con tikz externalize?

¿Cómo utilizar correctamente Savebox con tikz externalize?

No puedo capturar correctamente las dimensiones saveboxmientras tikzexternalizeestá activado.

Aquí está el MWE:

\documentclass {article}

\RequirePackage {tikz}
\RequirePackage {expl3}

\usetikzlibrary {shapes}
\usetikzlibrary {external}

% Make every {tikzpicture} block as separate *.png image.
\tikzexternalize [prefix = tests/]
\tikzsetfigurename {test_}
\tikzset{export as png/.style={external/system call/.add = {}{; convert -density 300 -resize 800x600 "\image.pdf" "\image.png"}}}
\tikzset{export as png}

\ExplSyntaxOn

    \tikzset{external/export~next = false} % This is needed for savebox to work.

    \newsavebox \sandbox
    \savebox \sandbox
    {
        \begin {tikzpicture}
            \node [ellipse, minimum~size = 10pt] { };
        \end {tikzpicture}
    }

    \dim_const:Nn \c_ellipse_width {\the\wd\sandbox\space}
    \dim_const:Nn \c_something {16pt}

\ExplSyntaxOff



\begin {document}

    \ExplSyntaxOn

        \dim_log:N \c_ellipse_width
        \dim_log:N \c_something

        \begin {tikzpicture}

            \dim_log:N \c_ellipse_width
            \dim_log:N \c_something
            \node [ellipse, align = center] {\the\c_ellipse_width \\ \the\c_something};

        \end {tikzpicture}

    \ExplSyntaxOff

\end {document}

Cuando se compila así, el *.log principal mostrará los valores correctos:
> \c_ellipse_width=10.0pt.
> \c_something=16.0pt.

Mientras que tests/test_0.log cambiará el ancho y mostrará:
> \c_ellipse_width=405.83112pt.
> \c_something=16.0pt.

No hace falta decir que la imagen tests/test_0.pngmostrará valores incorrectos.

Cuando partes del código relacionadas tikzexternalizeestán comentadas, el *.log principal muestra:
> \c_ellipse_width=10.0pt.
> \c_something=16.0pt.

El contenido *.pdf tiene valores correctos dibujados en este escenario.

¿Cómo puedo medir correctamente las dimensiones tikzpicturemientras tikzexternalizeestá encendido?

Respuesta1

Resulta que el problema está relacionado con las optimizaciones de tikz.
Para evitar este problema, simplemente deshabilite las optimizaciones con \tikzset{external/optimize = false}.

Solución:

\documentclass {article}

\RequirePackage {tikz}
\RequirePackage {expl3}

\usetikzlibrary {shapes}
\usetikzlibrary {external}

% Make every {tikzpicture} block as separate *.png image.
\tikzexternalize [prefix = tests/]
\tikzsetfigurename {test_}
\tikzset{export as png/.style={external/system call/.add = {}{; convert -density 300 -resize 800x600 "\image.pdf" "\image.png"}}}
\tikzset{export as png}
\tikzset{external/optimize = false} % <--------------------------------

\ExplSyntaxOn

    \tikzset{external/export~next = false} % This is needed for savebox to work.

    \newsavebox \sandbox
    \savebox \sandbox
    {
        \begin {tikzpicture}
            \node [ellipse, minimum~size = 10pt] { };
        \end {tikzpicture}
    }

    \dim_const:Nn \c_ellipse_width {\the\wd\sandbox\space}
    \dim_const:Nn \c_something {16pt}

\ExplSyntaxOff



\begin {document}

    \ExplSyntaxOn

        \dim_log:N \c_ellipse_width
        \dim_log:N \c_something

        \begin {tikzpicture}

            \dim_log:N \c_ellipse_width
            \dim_log:N \c_something
            \node [ellipse, align = center] {\the\c_ellipse_width \\ \the\c_something};

        \end {tikzpicture}

    \ExplSyntaxOff

\end {document}

información relacionada