
Я не могу правильно зафиксировать размеры, savebox
пока tikzexternalize
включено.
Вот 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}
При такой компиляции основной *.log будет показывать правильные значения:
> \c_ellipse_width=10.0pt.
> \c_something=16.0pt.
В то время как tests/test_0.log изменит ширину и покажет:
> \c_ellipse_width=405.83112pt.
> \c_something=16.0pt.
Само собой разумеется, что на рисунке tests/test_0.png
будут отображены неверные значения.
Когда части кода tikzexternalize
закомментированы, основной *.log показывает:
> \c_ellipse_width=10.0pt.
> \c_something=16.0pt.
Содержимое *.pdf имеет правильные значения, отображенные в этом сценарии.
Как правильно измерить размеры включенного tikzpicture
устройства tikzexternalize
?
решение1
Как оказалось, проблема связана с оптимизациями tikz.
Чтобы избежать этой проблемы, просто отключите оптимизации с помощью \tikzset{external/optimize = false}
.
Решение:
\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}