如何使用 spath3 包来为路径着色?

如何使用 spath3 包来为路径着色?

乔治·杜佩隆问题的解决方法 “Tikz:不带任何填充的阴影路径”绝对是我需要的,而且它是一个很好的解决方案。由于 spath package已经有了改进版本(spath3 package)并已在 CTAN 上发布,我想更改乔治·杜佩隆的解决方案spath3而是。但是,我是来自中国的 LaTeX 初学者,无法理解源代码spath3,尤其是代码中的 ExplSyntax。所以我只是更改了行

\usepackage{spath}% for "use path", from the TeX.SX 

在文件 fade-no-fill.sty

\usepackage{spath3}% for "use path", from the TeX.SX 

然后运行main.tex​​with pdflatex main.tex,我收到此错误消息:

! Package pgf Error: Unknown class 'spath'.

我只知道这一行

\pgfoonew \thepathsav=new spath(\tmppath)

在文件中 fade-no-fill.sty导致此错误。

现在我不知道该怎么办了!

有人可以帮我做到这一点吗?

如果您能提供一些关于如何使用该spath3包的解释,我们将不胜感激。

答案1

更新2021-07-13:此代码的最新版本位于https://tex.stackexchange.com/a/567029/86


首先,spath3 在 CTAN 上并且是 TeXLive 的一部分,因此不需要单独下载。

其次,在这种情况下使用它确实感觉有点过头了,但我对淡入淡出的工作方式了解不够,无法只提取所需的部分。需要的是保存和恢复路径的功能(这很容易做到spath3),但是恢复该路径的边界框(这应该可以在没有的情况下完成spath3,但我的初步实验惨遭失败)。

因此,这是修改后的原始代码spath3。它适用于原始答案中的代码,但我还没有在其他任何东西上测试过它。我还从原始代码中删除了一些不必要的代码。

原始文档保持不变:

\documentclass[tikz,border=5mm]{standalone}
%\url{https://tex.stackexchange.com/q/134283/86}
\usepackage{tikz}
\usepackage{fade-no-fill}
\begin{document}

\begin{tikzpicture}
  \draw[style=help lines] (0,-2) grid[step=1cm] (2,0);
  \path[
    fade path but don't fill={
      very thick,
      transparent!20,
      ->
    }{
      top color=blue!80,
      bottom color=green!80,
    },
  ] (0cm,0cm) .. controls +(0cm,-1cm) and +(0cm,1cm) .. (1cm,-2cm);


  \begin{scope}[x=0.5cm,y=0.5cm]
    % Circles, each with a distinct fading
    \foreach \i in {1,...,5}{
      \pgfmathsetmacro{\j}{18*\i}
      \path[
        fade path but don't fill={
          very thick,
          transparent!\j,
        }{
          top color=green!80,
          bottom color=blue!80,
          shading angle=45,
        },
      ] (1+\i,-\i) circle (\i mm);
    }

    % Circles, with a global fading
    \path[
      fade path but don't fill={
        very thick,
        transparent!60,
      }{
        top color=blue!80,
        bottom color=green!80,
      },
    ] foreach \i in {1,...,5}{
      (\i-1,-\i-3) circle (\i mm)
    };
  \end{scope}
\end{tikzpicture}

\end{document}

现在fade-no-fill.sty是:

%\url{https://tex.stackexchange.com/a/327713/86}
\usetikzlibrary{math}%
\usetikzlibrary{fadings}%
\usepackage{spath3}
\usetikzlibrary{arrows.meta}% needed so that bounding boxes correctly include arrows.

\ExplSyntaxOn
\cs_if_exist:NF \spath_set_current_softpath:n {

\cs_new_protected_nopar:Npn \spath_set_current_softpath:n #1
{
  \spath_get:nnN {#1} {min bb} \l__spath_tmpa_tl
  \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl

  \spath_get:nnN {#1} {max bb} \l__spath_tmpa_tl
  \exp_last_unbraced:NV \pgf@protocolsizes\l__spath_tmpa_tl

  \spath_get:nnN {#1} {path} \l__spath_tmpa_tl
  \pgfsyssoftpath@setcurrentpath\l__spath_tmpa_tl
}
}
\tikzset{restore~ soft~ path/.code={%
    \spath_set_current_softpath:n {#1}
  }
}
\ExplSyntaxOff

\tikzset{
  fade path but don't fill/.style 2 args={
    preaction={save spath=fadingpath,},
    postaction={
      /utils/exec={
        \coordinate (oldbb-ne) at (current bounding box.north east);
        \coordinate (oldbb-sw) at (current bounding box.south west);
        \pgfresetboundingbox
        \begin{tikzfadingfrompicture}[name=tempfade]%
        \pgfresetboundingbox
        \draw[restore soft path=fadingpath,#1];
        \coordinate (temp-fade-bb-ne) at (current bounding box.north east);
        \coordinate (temp-fade-bb-sw) at (current bounding box.south west);
        \coordinate (temp-fade-bb-center) at (current bounding box.center);
        \end{tikzfadingfrompicture}
        %
        \useasboundingbox (oldbb-ne) rectangle (oldbb-sw);
        %
        \tikzmath{
          coordinate \ctempfadebbcenter;
          \ctempfadebbcenter = (temp-fade-bb-center);
        }
        \tikzset{tempstyle/.style/.expand once={#2}}
        \path[
          path fading=tempfade,
          fit fading=false,
          fading transform={
            yshift=\ctempfadebbcentery,
            xshift=\ctempfadebbcenterx,
          },
          tempstyle,
        ] (temp-fade-bb-ne) rectangle (temp-fade-bb-sw);
      },
    },
  },
}

有趣的是,我不得不添加一个新命令\spath_set_current_softpath:n来确保淡入淡出能够拾取箭头。这将在某个时候进入,spath3这就是我将其包装在 中的原因\cs_if_exist:NF

相关内容