Выделите tikz-forest с затененной стрелкой

Выделите tikz-forest с затененной стрелкой

Я только что обнаружил externalizeи хочу использовать его в своем документе, который содержит много деревьев с затененными стрелками. Стрелки затенены с помощью какого-то "хака", который я нашел на этом сайте (к сожалению, я не могу найти исходник в данный момент). Он работает отлично ---хотя и медленно --- при использовании в моем документе, но дает сбой при вынесении во внешнюю среду.

Я получаю эту ошибку

! Extra }, or forgotten \endgroup.
\pgf@externalend ->\unskip \egroup \egroup 
                                           {\def \pgf@external@trim {0}\def ...
l.88   \end{forest}

К сожалению, я не эксперт по Tex и не могу понять, что не так. Вот MWE:

\documentclass[a4paper,12pt, twoside,dvipsnames]{article}

\usepackage[dvipsnames]{xcolor}

\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize[mode=list and make, prefix=ext-tikz/]
\usepackage[external]{forest}

\usetikzlibrary{fadings, arrows.meta}


\makeatletter
\newif\iftikz@shading@path

\tikzset{
    % There are three circumstances in which the fading sep is needed:
    % 1. Arrows which do not update the bounding box (which is most of them).
    % 2. Line caps/joins and mitres that extend outside the natural bounding 
    %    box of the path (these are not calculated by PGF).
    % 3. Other reasons that haven't been anticipated.
    fading xsep/.store in=\pgfpathfadingxsep,
    fading ysep/.store in=\pgfpathfadingysep,
    fading sep/.style={fading xsep=#1, fading ysep=#1},
    fading sep=0.0cm,
    shading path/.code={%
        % Prevent this stuff happning recursively.
        \iftikz@shading@path%
        \else%
            \tikz@shading@pathtrue%
            % \tikz@addmode installs the `modes' (e.g., fill, draw, shade) 
            % to be applied to the path. It isn't usualy for doing more
            % changes to the path's construction.
            \tikz@addmode{%
                \pgfgetpath\pgf@currentfadingpath%
                % Get the boudning box of the current path size including the fading sep
                \pgfextract@process\pgf@fadingpath@southwest{\pgfpointadd{\pgfqpoint{\pgf@pathminx}{\pgf@pathminy}}%
                    {\pgfpoint{-\pgfpathfadingxsep}{-\pgfpathfadingysep}}}%%
                \pgfextract@process\pgf@fadingpath@northeast{\pgfpointadd{\pgfqpoint{\pgf@pathmaxx}{\pgf@pathmaxy}}%
                    {\pgfpoint{\pgfpathfadingxsep}{\pgfpathfadingysep}}}%
                % Clear the path
                \pgfsetpath\pgfutil@empty%                          
                % Interrupt the path and picture to create a fading.
                \pgfinterruptpath%
                \pgfinterruptpicture%
                    \begin{tikzfadingfrompicture}[name=.]
                        \path [shade=none,fill=none, #1] \pgfextra{%
                            % Set the softpath. Any transformations in #1 will have no effect.
                            % This will *not* update the bounding box...
                            \pgfsetpath\pgf@currentfadingpath%
                            % ...so it is done manually.
                            \pgf@fadingpath@southwest
                            \expandafter\pgf@protocolsizes{\the\pgf@x}{\the\pgf@y}%
                            \pgf@fadingpath@northeast%
                            \expandafter\pgf@protocolsizes{\the\pgf@x}{\the\pgf@y}%
                        };
                        % Now get the bounding of the picture.
                        \xdef\pgf@fadingboundingbox@southwest{\noexpand\pgfqpoint{\the\pgf@picminx}{\the\pgf@picminy}}%
                        \xdef\pgf@fadingboundingbox@northeast{\noexpand\pgfqpoint{\the\pgf@picmaxx}{\the\pgf@picmaxy}}%
                        %
                    \end{tikzfadingfrompicture}%
                \endpgfinterruptpicture%
                \endpgfinterruptpath%
                % Install a rectangle that covers the shaded/faded path picture.                                
                \pgfpathrectanglecorners{\pgf@fadingboundingbox@southwest}{\pgf@fadingboundingbox@northeast}%
                % Make the fading happen.
                \def\tikz@path@fading{.}%
                \tikz@mode@fade@pathtrue%
                \tikz@fade@adjustfalse%10pt
                % Shift the fading to the mid point of the rectangle
                \pgfpointscale{0.5}{\pgfpointadd{\pgf@fadingboundingbox@southwest}{\pgf@fadingboundingbox@northeast}}%
                \edef\tikz@fade@transform{shift={(\the\pgf@x,\the\pgf@y)}}%
            }%
        \fi%
    }
}

\begin{document}

\begingroup
    \centering
    \begin{forest}
        [, phantom, for children={fit=band}, s sep'+=60pt
            [ 2, name=l1 ]
            [ 2, name=r1 ]
        ]
        \path [left color=orange, right color=MidnightBlue, shading path={draw=transparent!0, dashed, -Latex}] (l1) .. controls ++(0,-1) and ++(0,-1) .. (r1);
    \end{forest}
\endgroup

\end{document}

Я попытался максимально сократить пример, но он все равно остается большим количеством кода. Часть tikzsetскопирована с этого сайта, и я, честно говоря, понятия не имею, что она делает — хотя она работает, если не forestвынесена во внешнюю среду.

Редактировать: Проблема, похоже, ограничивается forestэтим tikzpicture, который можно вынести за пределы системы без проблем:

\begin{tikzpicture}
    \path [left color=orange, right color=MidnightBlue, shading path={draw=transparent!0, dashed, -Latex}] (0,1) .. controls ++(0,-1) and ++(0,-1) .. (1,1);
\end{tikzpicture}

Связанный контент