动机

动机

动机

为了将箭头放在 TikZ 路径内,我定义了一个 TikZ 样式arrow inside。为了使其更具可移植性,我希望它接受这样的参数

\draw[arrow inside={pos = 0.1, end = |}] (1,-0.5) -- (1,1.5);

这样我就可以用定义箭头的位置pos和箭头的类型来定义箭头end如果没有给出参数,它将恢复为默认值。

在此处输入图片描述

到目前为止我尝试过

为了实现上图,我写了下面的代码片段。问题是这些值正确地存储在我定义的宏中,但没有被更新,现在我也不知道如何保留默认值。

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\makeatletter
\tikzset{
    arrow inside/pos/.store in = \arrow@inside@pos,
    arrow inside/end/.store in = \arrow@inside@end,
    arrow inside/pos = 0.5,
    arrow inside/end = >,
    arrow inside/.style = {
        postaction = {
            decorate,
            decoration={
                markings,
                mark=at position \arrow@inside@pos with {\arrow{\arrow@inside@end}}
            }
        }
    },
}
\makeatother
\begin{document}
\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[arrow inside={pos = 0.1, end = |}] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]
\end{document}

可能相关:

答案1

杰克他的现在删除了答案。您传递给的选项arrow inside不会被应用,因为它们只是被抓取而不会被使用(即“吞噬”),类似于#1

\newcommand*{\myCommand}[1]{Foobar Rhubarb}% no "#1" in its definition

您需要添加#1您的.style定义。

但不要使用.store in处理程序,而要考虑使用只存储值的键。这样,您就不必添加另一层抽象(PGFkeys 已经使用特定的“命名空间”),如果 PGFkeys 已经使用,则.initial无需添加自己的宏。\arrow@inside@…/tikz/arrow inside/…

为了避免出现/.cd内部问题,我会使用将路径设置为的.style特定键。set arrow inside/tikz/arrow inside

参考

代码

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\tikzset{
  set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
  set arrow inside={pos/.initial=.5, end/.initial=>},
  arrow inside/.style={
    set arrow inside={#1},
    postaction={
      decorate,
      decoration={
        markings,
        mark=at position \pgfkeysvalueof{/tikz/arrow inside/pos}
             with \arrow{\pgfkeysvalueof{/tikz/arrow inside/end}}
      }
    }
  },
}
\begin{document}
\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[arrow inside={pos = 0.1, end = |}] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]
\end{document}

输出

在此处输入图片描述

但为什么要停在那里呢?

有时用户希望在路径(部分路径)上使用多个箭头,我意识到在评论中应该做得更好。

以下解决方案不再使用pos键(可以更改),而是将选项endopt应用于装饰中的箭头标记列表。

(请注意,对于固定间隔,该库还提供mark=between positions <start> and <end> step <step> with <marking>。)

代码

\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{decorations.markings}
\tikzset{
  set arrow inside/.code={\pgfqkeys{/tikz/arrow inside}{#1}},
  set arrow inside={end/.initial=>, opt/.initial=},
  /pgf/decoration/Mark/.style={
    mark/.expanded=at position #1 with
    {\noexpand\arrow[\pgfkeysvalueof{/tikz/arrow inside/opt}]
      {\pgfkeysvalueof{/tikz/arrow inside/end}}}},
  arrow inside/.style 2 args={
    set arrow inside={#1},
    postaction={decorate,decoration={
        markings,Mark/.list={#2}}}},
}
\begin{document}
\tikz[thick]
  \draw[
    arrow inside={
      end=|,
      opt=red!\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}0!blue
    }{0, .05, .15, .3, .5, .7, .85, .95, 1},
  ] (0,0) to[bend left] (4,0);
\end{document}

输出

在此处输入图片描述

答案2

我建议采用不同的方法,但不是最佳方法(见pgfkeys 密钥处理程序 .get 和 .store 起什么作用?),但它确实有效。事实上,代码中的一个问题是,arrow style键内部没有继承正确的路径/tikz/arrow inside/key-name。为了使其正常工作,您可以执行以下操作:

\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[/tikz/arrow inside/pos = 0.4,/tikz/arrow inside/end = |,arrow inside] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]

在我看来,这不太方便。另一个问题是,如果你定义一个使用键执行某些操作的样式,则必须设置这些键,而不是在样式内部设置,而是在之前设置,就像我对上面的代码所做的那样。请注意:

\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[arrow inside={/tikz/arrow inside/pos = 0.4,/tikz/arrow inside/end = |}] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]

不执行任何操作,因为键仍然分别具有值0.5>

因此,我的方法将基于“三重”处理程序initialget并且store in将允许您使用:

arrow inside={pos = 0.4,end = |}

里面\draw

首先我要定义键:

\pgfkeys{/arrow inside/.cd,
  pos/.initial  = 0.5,
  pos/.get      = \arrow@inside@pos,
  pos/.store in = \arrow@inside@pos,
  end/.initial  = >,
  end/.get      = \arrow@inside@end,
  end/.store in = \arrow@inside@end,
}

它们在路下面,/arrow inside/所以我们稍后应该处理它们。

其次,我将定义一个样式来放置箭头:

place arrow/.style = {
    postaction = {
        decorate,
        decoration={
            markings,
            mark=at position \arrow@inside@pos with {\arrow{\arrow@inside@end}}
        }
    }
},

该样式属于通常的/tikz/路径,而不是键。为了将键和上述样式结合起来,我定义:

arrow inside/.style={place arrow,/arrow inside/.cd,#1}

作为一种“放置”箭头的样式,通过改变默认路径/tikz/,允许您使用以前定义的键。

阿姆韦:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\makeatletter
\pgfkeys{/arrow inside/.cd,
  pos/.initial  = 0.5,
  pos/.get      = \arrow@inside@pos,
  pos/.store in = \arrow@inside@pos,
  end/.initial  = >,
  end/.get      = \arrow@inside@end,
  end/.store in = \arrow@inside@end,
}
\tikzset{arrow inside/.style={place arrow,/arrow inside/.cd,#1},
    place arrow/.style = {
        postaction = {
            decorate,
            decoration={
                markings,
                mark=at position \arrow@inside@pos with {\arrow{\arrow@inside@end}}
            }
        }
    },
}
\makeatother
\begin{document}

\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[arrow inside={pos = 0.4,end = |}] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]


\[ \int_{
    \tikz[scale=0.3]{
        \path[fill=lightgray] (0,0) rectangle (1,1);
        \draw (1.5,1) -- (0,1) -- (0,0) -- (1.5,0);
        \draw[arrow inside={pos = 0.7,end = stealth}] (1,-0.5) -- (1,1.5);
    }
} \vec{B} \cdot \vec{n} \, df \]

\end{document}

结果:

在此处输入图片描述

请注意,键现在可正确更新其值。

相关内容