怎么运行的

怎么运行的

我想在下图中在 $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}

结果:

结果2

怎么运行的

让我们剖析一下样式定义:

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\tikztoendAB

那么,路径是如何构建的呢?如您所见,它的形式如下:

(some complex expression)  -- (some other complex expression) \tikztonodes

除了最后一个\tikztonodes由于我无法理解的原因而需要之外,剩下的只是两点之间的一条直线,“复杂表达式”只计算这两个点,这两个点就是要绘制的线段的起点和终点。

因此让我们检查一下第一个“复杂表达式”(将\tikztostart和翻译\tikztotarget为 和AB哪个更短且更容易理解):

($(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/2A2.5exA--BA
  • !\segDistance!90:(B)\segDistance意思是:从该点开始,沿垂直于 的方向移动 量thispoint--B90是角度,因此是垂直的)。因此,使用默认值,这将使我们垂直于 移动 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 seplabelling

\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}

输出

在此处输入图片描述

相关内容