动机
为了将箭头放在 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
键(可以更改),而是将选项end
和opt
应用于装饰中的箭头标记列表。
(请注意,对于固定间隔,该库还提供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
和>
。
因此,我的方法将基于“三重”处理程序initial
,get
并且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}
结果:
请注意,键现在可正确更新其值。