乔治·杜佩隆问题的解决方法 “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
。