3

Using the following code, how can I insert a label (or a node or a coordinate) to each mark!

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, decorations.markings}
\begin{document}
\begin{tikzpicture}
\def\gap{0.2}
\def\bigradius{3}
\def\littleradius{0.5}
%
\draw[cyan](0,0)coordinate(h) (-1*\bigradius,0) -- (1*\bigradius,0) (0,-1*\bigradius) -- (0,1*\bigradius);
%
\draw[color=blue, line width=2pt, decoration={markings,
mark=at position 0.2455 with {\arrow[color=red]{stealth}},
mark=at position 0.765 with {\arrow[color=green]{stealth}},
mark=at position 0.87 with {\arrow[color=brown]{stealth}},
mark=at position 0.97 with {\arrow[color=orange]{stealth}}},
postaction={decorate}, preaction={fill=yellow!60, fill opacity=.4}]
let
 \n1={asin(\gap/2/\bigradius)},
 \n2={asin(\gap/2/\littleradius)}
in (\n1:\bigradius) arc (\n1:360-\n1:\bigradius) -- (-\n2:\littleradius) arc (-\n2:-360+\n2:\littleradius) -- cycle;
%
\node[red] at (h) {H};
\end{tikzpicture}
\end{document}

enter image description here

Hany
  • 4,709

2 Answers2

7

You can simply add the nodes when you draw the arrows. Notice that here the coordinate (-.3,.3) is a local coordinate relative to the coordinate of your mark.

enter image description here

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc, decorations.markings}
\begin{document}
\begin{tikzpicture}
\def\gap{0.2}
\def\bigradius{3}
\def\littleradius{0.5}
%
\draw[cyan](0,0)coordinate(h) (-1*\bigradius,0) -- (1*\bigradius,0) (0,-1*\bigradius) -- (0,1*\bigradius);
%
\draw[color=blue, line width=2pt, decoration={markings,
mark=at position 0.2455 with {\arrow[color=red]{stealth} \node[color=red] at (-.3,.3) {$a$};},
mark=at position 0.765 with {\arrow[color=green]{stealth} \node[color=green] at (-.3,.3) {$b$};},
mark=at position 0.87 with {\arrow[color=brown]{stealth} \node[color=brown] at (-.3,.3) {$c$};},
mark=at position 0.97 with {\arrow[color=orange]{stealth} \node[color=orange] at (-.3,.3) {$d$};},
},
postaction={decorate}, preaction={fill=yellow!60, fill opacity=.4}]
let
 \n1={asin(\gap/2/\bigradius)},
 \n2={asin(\gap/2/\littleradius)}
in (\n1:\bigradius) arc (\n1:360-\n1:\bigradius) -- (-\n2:\littleradius) arc (-\n2:-360+\n2:\littleradius) -- cycle;
%
\node[red] at (h) {H};
\end{tikzpicture}
\end{document}
Jinwen
  • 8,518
  • @Hany No, they are not in a separate position. As I said, the coordinate given is local, so when you change your mark position the label shall move accordingly. – Jinwen Mar 12 '23 at 07:25
  • @– Jinwen. Thank you very much for your answer. I am sorry, I did not concentrate well, that is why I deleted my comment when I realized that your answer is what I needed. Before posting my question, I tried inserting the nodes, as you did in your answer, but I missed adding the semicolon. – Hany Mar 12 '23 at 07:31
3

You can just add the nodes to the markings. This code uses bent arrows from https://tex.stackexchange.com/a/676562/292811, which may look prettier.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,bending,calc, decorations.markings,hobby}
\begin{document}
\begin{tikzpicture}[>={Stealth[length=0.3cm,bend]},
    % stolen from https://tex.stackexchange.com/a/676562/292811
    colored bent arrow at/.style args={#1/#2/#3}{decoration={markings,
        mark=at position {#1*\pgfdecoratedpathlength-0.15cm} with {\coordinate (bent arrow 1);},
        mark=at position {#1*\pgfdecoratedpathlength-0.05cm} with {\coordinate (bent arrow 2);},
        mark=at position {#1*\pgfdecoratedpathlength} with {#3},
        mark=at position {#1*\pgfdecoratedpathlength+0.05cm} with {\coordinate (bent arrow 3);},
        mark=at position {#1*\pgfdecoratedpathlength+0.15cm} with {\coordinate (bent arrow 4);
        \draw[style/.expand once=#2,-{Stealth[length=0.3cm,bend]}] (bent arrow 1) to[curve through={(bent arrow 2) .. (bent arrow 3)}]  (bent arrow 4) ;}
    }}]
\def\gap{0.2}
\def\bigradius{3}
\def\littleradius{0.5}
%
\draw[cyan](0,0)coordinate(h) (-1*\bigradius,0) -- (1*\bigradius,0) (0,-1*\bigradius) -- (0,1*\bigradius);
%
\draw[color=blue, line width=2pt,
    colored bent arrow at/.list={0.2455/red/{\node[above left,red]{$a$};},
        0.765/green/{\node[below,green]{$b$};},
        0.87/brown/{\node[above,brown]{$c$};},
        0.97/orange/{\node[above,orange]{$a$};}},
    %decoration={markings,
        % mark=at position 0.2455 with {\arrow[color=red]{stealth}},
        % mark=at position 0.765 with {\arrow[color=green]{stealth}},
        % mark=at position 0.87 with {\arrow[color=brown]{stealth}},
        % mark=at position 0.97 with {\arrow[color=orange]{stealth}}},
    postaction={decorate}, preaction={fill=yellow!60, fill opacity=.4}]
let
 \n1={asin(\gap/2/\bigradius)},
 \n2={asin(\gap/2/\littleradius)}
in (\n1:\bigradius) arc (\n1:360-\n1:\bigradius) -- (-\n2:\littleradius) arc (-\n2:-360+\n2:\littleradius) -- cycle;
%
\node[red] at (h) {H};
\end{tikzpicture}
\end{document}

enter image description here