传递给插入路径样式内的路径的选项

传递给插入路径样式内的路径的选项

有没有办法给\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
          }
        }
      }
  }
}

相关内容