我想在下图中在 $f_2$ 处添加一个指向 $Q$ 的箭头。
它应该与线平行,我希望这个最小的例子就足够了。
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw (0,3) -- node[anchor=south west] {$f_2$} ($cm,0)-(5pt,5pt)$);
% Circle and the Q
\fill[black] ($ (4cm,0) - (5pt,5pt)$) circle (5pt)
node (Q) [anchor=south,above=1pt] {$Q$};
\end{tikzpicture}
\end{document}
我寻找解决方案但只找到如何制作带有标记的多个箭头。
答案1
根据您的需要(连接 $f_2$ 和 Q 的箭头,但它与另一条给定的线平行?或者仅仅是与给定线平行且距离给定的箭头?)解决方案会有所不同。
我的方法适用于第二种情况。你有一条任意线(A)--(B)
,你想在该线的上方(或下方)放置一条与给定线平行的线段。
为了做到这一点,我定义了一种称为的样式,parallel sement
用作to
命令的一部分,它使用了三个键:
segment distance
到线的距离(A) -- (B)
(如果为负数,则线段将位于该线下方)。默认情况下为1mm
。segment length
线段的长度(以任意单位表示)。如果您不提供单位,它将是线段一半的一小部分(A)--(B)
(因此,如果您设置,segment length=2
您将获得一条长度等于的线(A)--(B)
,但如果您设置,segment length=2mm
您的线段长度将恰好为 2mm。默认情况下为5ex
。segment pos
是线段中心相对于线 的位置(A)--(B)
。它是总长度的一小部分,因此,如果您指定 ,segment pos=0.5
线段将位于 的中心(A)--(B)
,而 则将segment pos=1
位于 的中心(B)
。默认情况下为0.5
。
以下代码显示了此样式的定义以及三次使用该样式的示例,其中上述键的值不同。结果之后,我将对其工作原理进行一些解释。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\usetikzlibrary{calc}
\tikzset{
parallel segment/.style={
segment distance/.store in=\segDistance,
segment pos/.store in=\segPos,
segment length/.store in=\segLength,
to path={
($(\tikztostart)!\segPos!(\tikztotarget)!\segLength/2!(\tikztostart)!\segDistance!90:(\tikztotarget)$) --
($(\tikztostart)!\segPos!(\tikztotarget)!\segLength/2!(\tikztotarget)!\segDistance!-90:(\tikztostart)$) \tikztonodes
},
% Default values
segment pos=.5,
segment length=3ex,
segment distance=1mm,
},
}
\begin{tikzpicture}
\coordinate (A) at (0,3);
\coordinate (B) at (4,0);
\draw (A) -- node[anchor=south west] {$f_2$} (B);
\draw[->] (A) to[parallel segment] (B);
\draw[->,blue] (A) to[parallel segment,
segment pos=.2] (B);
\draw[->, red] (A) to[parallel segment,
segment length=5ex,
segment distance=2mm,
segment pos=.8] (B);
\end{tikzpicture}
\end{document}
结果:
怎么运行的
让我们剖析一下样式定义:
parallel segment/.style={
segment distance/.store in=\segDistance,
segment pos/.store in=\segPos,
segment length/.store in=\segLength,
这部分只是提取已经解释过的键的值并将这些值存储到宏中,这些宏将用于构建段。
to path={
($(\tikztostart)!\segPos!(\tikztotarget)!\segLength/2!(\tikztostart)!\segDistance!90:(\tikztotarget)$) --
($(\tikztostart)!\segPos!(\tikztotarget)!\segLength/2!(\tikztotarget)!\segDistance!-90:(\tikztostart)$) \tikztonodes
},
这部分定义了用户写入时将绘制的路径的形状。 Tikz 已在名为和的宏中(A) to[parallel segment] (B)
为我们存储了起点(A
在示例中)和终点(B
在示例中)的坐标,但为了更容易输入和阅读说明,我将这些点称为和。\tikztostart
\tikztoend
A
B
那么,路径是如何构建的呢?如您所见,它的形式如下:
(some complex expression) -- (some other complex expression) \tikztonodes
除了最后一个\tikztonodes
由于我无法理解的原因而需要之外,剩下的只是两点之间的一条直线,“复杂表达式”只计算这两个点,这两个点就是要绘制的线段的起点和终点。
因此让我们检查一下第一个“复杂表达式”(将\tikztostart
和翻译\tikztotarget
为 和A
,B
哪个更短且更容易理解):
($(A)!\segPos!(B)!\segLength/2!(A)!\segDistance!90:(B)$)
此表达式多次使用插值运算符!x!
。每次它都应用于其左侧表达式的结果坐标,因此让我们从左到右阅读:
($(A)!\segPos!(B)
是线上的一点A--B
,位置由 给出\segPos
。默认情况下,它是 0.5,所以这代表 的中点A--B
。!\segLength/2!(A)
意思是:从计算点(的中间)向A--B
移动长度。因此,使用默认值,这将使我们处于从 中心向 方向的一个点。\segLength/2
A
2.5ex
A--B
A
!\segDistance!90:(B)
\segDistance
意思是:从该点开始,沿垂直于 的方向移动 量thispoint--B
(90
是角度,因此是垂直的)。因此,使用默认值,这将使我们垂直于 移动 1 毫米A--B
。
经过所有这些插值后,我们得到的点就是所需线段的起点。
您可以尝试解读并理解该段另一端的语法。
最后,为这些键分配一些默认值:
segment pos=.5,
segment length=3ex,
segment distance=1mm,
我希望这个解释能有所帮助。
答案2
我不知道你是如何创建节点的Q
。因此,这是一次盲目尝试:
\documentclass{scrartcl}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw (0,3) -- node[anchor=south west] (f) {$f_2$} (4,0) node[anchor=south west] (q) {$Q$};
\draw[-latex] (f) -- (q);
\end{tikzpicture}
\end{document}
您可以通过减少箭头来使箭头靠近字母,inner sep
例如
\draw (0,3) -- node[anchor=south west,inner sep=1pt] (f) {$f_2$} (4,0) node[anchor=south west,inner sep=1pt] (q) {$Q$};
编辑:
稍微调整一下 节点 f 2和 Q 以及它们的above
尺寸,就可以画出所需的线:inner sep
labelling
\documentclass{scrartcl} %borceux, handbook of categorical algebra
\usepackage{tikz} %mac lane, categories for the working mathematician
\usetikzlibrary{calc,patterns}
\begin{document}
\begin{tikzpicture}
\tikzstyle{ground}=[fill,pattern=north east lines,draw=none,pattern color=gray]
\coordinate (A) at (0cm,0cm);
\coordinate (B) at (0cm,3cm);
\coordinate (C) at (4cm,0cm);
\coordinate (B1) at ($ (B)+(5pt,0pt)$); % x koordinate des oberen lagers
\coordinate (B2) at ($ (B)-(0pt,5pt)$); %y koordinate des oberen lagers
\coordinate (C1) at ($ (C)+(-5pt,0pt)$); % x koordinate des unteren lagers
\coordinate (C2) at ($ (C)+(0,5pt)$); %y koordinate des unteren Lagers
\draw [|<->|, very thin]
($ (A)-(12pt,0) $)--node[fill=white]{3}($ (B)-(12pt,0pt)$);
\draw {} (A)--node[ground,anchor=east,minimum height=3.25cm,yshift=-0.125cm]{} (B);
\draw [very thick]
($(B1)+(B2)-(B)$) --node[anchor=south west,above=4pt,inner sep=1pt](f){$f_2$}($(C1)+(C2)-(C)$);
\draw [|<->|,very thin]
($ (A)-(0cm,12pt)$)-- node[fill=white]{4}($(C)-(0,12pt)$);
\draw (A) -- node[ground,anchor=north,minimum width=4cm]{}(C);
\draw (C) -- node[ground,anchor=west,minimum height=3.25cm,yshift=-0.125cm]{} +(0,3cm);
%Pfeile
\draw [<-,shorten <=1mm, very thick] (B1)-- +(0,0.75cm)node[anchor=south]{$f$};
\draw [<-,shorten <=1mm, very thick] (B2) -- +(-0.75cm,0)node[anchor=east]{$f_1$};
\draw [<-,shorten <=1mm, very thick] (C2) -- +(0.75cm,0)node[anchor=west]{$f_3$};
\draw [<-,shorten <=1mm, very thick] (C1) -- +(0,-0.75cm)node[anchor=north]{$f_4$};
%oben links wände für Lager
\draw [very thick] (B) -- + (10pt,0);
\draw [very thick] (B) -- +(0,-10pt);
\fill [black,opacity=0.5] ($ (B1)+(B2)-(B) $) circle (5pt) node[anchor=south west]
{\textcolor{black}{$P$}};
\fill [black,opacity=0.5] ($(C1)+(C2)-(C)$) circle (5pt)
node[anchor=south, above=4pt,inner sep=1pt](q){\textcolor{black}{$Q$}};
\draw[-latex] (f) -- (q);
\end{tikzpicture}
\end{document}
答案3
倾斜的图像可以很容易地构建与另一条图像平行(或切线)的线。
下面的两张图片可以说明这一点:
parallel line = <dimen>:<offset>
创建一条长度为 2 × 的线<dimen>
,位于<offset>
其原点上方。parallel line from node = <dimen>:<node>
创建一个从 边界 开始<node>
、长度为 的箭头<dimen>
。
代码(仅限图片)
\documentclass[tikz]{standalone}
\tikzset{
pics/parallel line/.style args={#1:#2}{code={
\path[yshift={#2}, pic actions] (left:{#1}) -- (right:{#1});}},
pics/parallel line from node/.style args={#1:#2}{code={
\path[path only, overlay] (#2) -- coordinate[at start](@)+(right:1pt);
\path[pic actions] (@) -- +(right:{#1});}}}
\begin{document}
\begin{tikzpicture}
\draw (0, 3) -- node[auto] {$f_2$}
pic foreach[count=\i]\pos in {near start, midway, near end}
[draw, sloped, ->, \pos,
yscale = iseven \i ? -1 : 1] {parallel line = 2mm:3mm}
+(4, -3);
\draw (2, 3) -- node[auto] (f2) {$f_2$}
pic[draw, sloped, ->] {parallel line from node = 4mm:f2}
+(4, -3);
\end{tikzpicture}
\end{document}
输出(仅图片)
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta, calc, ext.positioning-plus, patterns.meta, quotes}
\tikzset{
Tikz/.tip=Classical TikZ Rightarrow,
Measure/.tip={Tikz[] Bar[]},
every pin edge/.code=, % remove default
math node/.style={execute at begin node=$, execute at end node=$},
pics/parallel line/.style args={#1:#2}{code={
\path[yshift={#2}, pic actions] (left:{#1}) -- (right:{#1});}},
pics/parallel line from node/.style args={#1:#2}{code={
\path[path only, overlay] (#2) -- coordinate[at start](@)+(right:1pt);
\path[pic actions] (@) -- +(right:{#1});}},
% adapted from https://tex.stackexchange.com/a/675018/16595
dim line distance/.initial=.2cm,
dim line style/.style={-Measure},
dim line text/.style={midway,auto=false,font=\footnotesize},
pics/dim line/.style args={#1--#2}{code={
\path[path only] ($(#1)!\pgfkeysvalueof{/tikz/dim line distance}!90:(#2)$) coordinate(@1)
-- node[dim line text,style/.expand once=\tikzpictextoptions,alias=@]{\tikzpictext}
($(#2)!\pgfkeysvalueof{/tikz/dim line distance}!-90:(#1)$)coordinate(@2);
\path[dim line style, line to, pic actions] (@) edge (@1) edge (@2);}}}
\begin{document}
\begin{tikzpicture}[
point/.style={
shape=circle, fill, draw=none, inner sep=+0pt, outer sep=+0pt, minimum size=+10pt},
every label quotes/.append style={math node, inner sep=+.15em},
every pin quotes/.append style= math node,
> = Tikz,
dim line delim/.style=path only, dim line distance=5mm,
]
\path[pattern={Dots[distance=2pt]}, pattern color=cyan!70!black]
(0, 3) coordinate (Py) |- coordinate (Px) (4,0) coordinate (Qx)
|- ([xshift=3mm]4, 3) |- ([shift={(-3mm, -3mm)}]Px) |- cycle;
\pic[gray, "3"] {dim line=Px--Py};
\pic[gray, "4"] {dim line=Qx--Px};
\draw (0,3) |- (4,0) -- (4,3);
\path[gray] node[point, anchor=corner north west, "P" above right] (P) at (0, 3) {}
node[point, anchor=corner south east, "Q" above] (Q) at (4, 0) {};
\draw[very thick] (P.center) to
node[auto, math node] (f2) {f_2}
pic [->, draw, sloped] {parallel line from node = 6mm:f2}
(Q.center);
\path[<-, very thick, quotes mean pin, pin distance=6mm, shorten <=+.3333em]
node also ["f" above] (P)
node also ["f_1" left] (P)
node also ["f_3" right] (Q)
node also ["f_4" below] (Q);
\end{tikzpicture}
\end{document}