有没有办法给\path
(内部mypath
样式)提供\draw
和\fill
命令的选项(理想情况下,路径应该绘制为红色然后填充为蓝色)?
\documentclass{standalone}
\usepackage{tikz}
\tikzset{%
mypath/.style = {%
insert path = {%
\pgfextra{%
\pgfinterruptpath
% This is the path that should receive the options
\path (0,0) rectangle (1,1);
\endpgfinterruptpath
}
}
}
}
\begin{document}
\begin{tikzpicture}
\draw[red,mypath];
\fill[blue,mypath];
\end{tikzpicture}
\end{document}
答案1
不确定这是否明智,但它不会破坏任何东西。在这种情况下,您只需要在开始新路径之前保存\tikz@mode
和。\tikz@options
您可以查看tikz.code.tex
并找出哪些键/样式使用了\tikz@addoption
和\tikz@addmode
(或者只是尝试使用选项)来找出可以传递到“内部路径”的其他一些内容。我认为也可以进行一些转换(如果它们使用\tikz@addtransform
)。我猜任何存储而不是立即应用的东西都是这类东西的候选者。
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\makeatletter
\tikzset{%
mypath/.style = {%
insert path = {%
\pgfextra{%
\let\tikz@mode@save=\tikz@mode
\let\tikz@options@save=\tikz@options%
\pgfinterruptpath
% This is the path that should receive the options
\path \pgfextra{\let\tikz@mode=\tikz@mode@save\let\tikz@options=\tikz@options@save}
(0,0) rectangle (1,1);
\endpgfinterruptpath
}
}
}
}
\begin{document}
\begin{tikzpicture}
\draw[red, line width=2pt, line join=round, mypath];
\fill[blue,mypath];
\end{tikzpicture}
\end{document}
正如所指出的,mypath
必须放在选项的最后。要正确解决这个问题原则上相当简单,只需要少量更改,但仍需要在这里粘贴大量代码。因此,一种简单但不明智的粗暴方法是添加一种在at end path
应用所有操作之前执行的样式。样式必须在任何“内部”路径之前被取消(我every path
在这里使用键来执行此操作),以避免无限递归。
理想情况下,at end path
将内容附加到一个宏,该宏将在每个路径的开头设置为空(即,\tikz@@command@path
重置其他所有内容),然后在开始时执行(如果非空)\tikz@finish
。
\tikzset{every path/.append style={at end path/.style={}}}
\let\tikz@finish@orig=\tikz@finish
\def\tikz@finish{%
\tikzset{at end path/.try}%
\tikz@finish@orig%
}
\tikzset{%
mypath/.style = {%
at end path/.style={
insert path = {%
\pgfextra{%
\let\tikz@mode@save=\tikz@mode
\let\tikz@options@save=\tikz@options%
\pgfinterruptpath
% This is the path that should receive the options
\path \pgfextra{\let\tikz@mode=\tikz@mode@save\let\tikz@options=\tikz@options@save}
(0,0) rectangle (1,1);
\endpgfinterruptpath
}
}
}
}
}