
No puedo capturar correctamente las dimensiones savebox
mientras tikzexternalize
está 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.png
mostrará valores incorrectos.
Cuando partes del código relacionadas tikzexternalize
está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 tikzpicture
mientras tikzexternalize
está 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}