拓扑图(标记边)

拓扑图(标记边)

在 LaTeX 中创建此类图表的最佳方法是什么?Tikz 是最佳选择吗?

(这些特定实例的代码会很有用,但不是绝对必要的,因为我需要制作在精神上相似但不完全相同的图表。此外,这个问题几乎肯定之前已经被问过,所以我同样很感激之前的一个问题的链接——我只是不确定要搜索什么术语才能找到这样的帖子。)

编辑:查看了一些旧代码并得出

\begin{tikzpicture}

\draw[ultra thick,domain=0:1,samples=100, postaction={decorate}, decoration={markings, mark=at position 0.5 with {\arrow{stealth}}}] (0,1) -- (0,0);
\draw[ultra thick,domain=0:1,samples=100, postaction={decorate}, decoration={markings, mark=at position 0.5 with {\arrow{stealth}}}] (1,1) -- (0,1);
\draw[ultra thick,domain=0:1,samples=100, postaction={decorate}, decoration={markings, mark=at position 0.5 with {\arrow{stealth}}}] (1,0) -- (1,1);
\draw[ultra thick,domain=0:1,samples=100, postaction={decorate}, decoration={markings, mark=at position 0.5 with {\arrow{stealth}}}] (0,0) -- (1,0);

\node at (.5,-.2) {$a$};

\end{tikzpicture}

尽管这看起来相当笨重。

答案1

欢迎来到 TeX.SE!本答案利用了这个答案

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{decorations.markings}

\begin{document}
\tikzset{lab dis/.store in=\LabDis,
lab dis=0.3,
->-/.style args={at #1 with label #2}{decoration={
  markings,
  mark=at position #1 with {\arrow{>}; \node at (0,\LabDis) {#2};}},postaction={decorate}},
  -<-/.style args={at #1 with label #2}{decoration={
  markings,
  mark=at position #1 with {\arrow{<}; \node at (0,\LabDis)
  {#2};}},postaction={decorate}},
 -*-/.style={decoration={
  markings,
  mark=at position #1 with {\fill (0,0) circle (1.5pt);}},postaction={decorate}},
  }

\begin{tikzpicture}[>=latex]
 \draw[->-=at 0.125 with label {$b$},
 ->-=at 0.375 with label {$a$},
 -<-=at 0.625 with label {$b$},
 -<-=at 0.875 with label {$a$}] (0,0) rectangle (4,4);

 \draw[lab dis=-0.3,
 -*-=0,->-=at 0.125 with label {$b$},
 -*-=0.25,->-=at 0.375 with label {$a$},
 -*-=0.5,-<-=at 0.625 with label {$b$},
 -*-=0.75,-<-=at 0.875 with label {$a$}] (2,-4) circle (2.5);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这可能是一个选择

\documentclass[tikz, border = 10pt]{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usetikzlibrary{decorations.markings}

\def\nframes{30}
\def\frame{0}

\begin{document}

\foreach \frame in {0,0,0,0,1,...,\nframes}
{

\pgfmathsetmacro{\time}{\frame / \nframes}
\pgfmathsetmacro{\c}{20 + (3 - 20) / (1 + exp(-10 * (\time - 0.6)))}
\pgfmathsetmacro{\a}{20 + (1 - 20) / (1 + exp(-8 * (\time - 0.3)))}
\pgfmathsetmacro{\xrange}{3 + (180 - 3) / (1 + exp(-14 * (\time - 0.6)))}
\pgfmathsetmacro{\yrange}{3 + (180 - 3) / (1 + exp(-10 * (\time - 0.3)))}
\pgfmathsetmacro{\theta}{90 + (45 - 90) * \time}
\pgfmathsetmacro{\phi}{0 + (25 - 0) * \time}

\pgfplotsset{
  border one/.style={
    thick,
    red,
    samples y  = 0,
    variable   = \t,
    domain     = -\xrange:\xrange,
    postaction = {decorate},
    decoration = {markings,
                  mark = at position 0.48 with {\arrow{stealth}},
                  mark = at position 0.52 with {\arrow{stealth}}}
    },
  border two/.style={
    thick,
    green,
    samples y  = 0,
    variable   = \t,
    domain     = -\yrange:\yrange,
    postaction = {decorate},
    decoration = {markings, mark = at position 0.5 with {\arrow{stealth}}}
  }
}



\begin{tikzpicture}
\useasboundingbox (0, 0) rectangle (6, 6);
\begin{axis} [
    hide axis,
    view               = {\theta}{\phi},
    domain             = -\xrange:\xrange,
    y domain           = -\yrange:\yrange,
    samples            = 20,
    samples y          = 20,
    unit vector ratio  = 1 1 1,
    declare function   = {
      u(\x,\y) = (\c + \a * cos(\y)) * cos(\x);
      v(\x,\y) = (\c + \a * cos(\y)) * sin(\x);
      w(\x,\y) = \a * sin(\y);
    }
  ]

  \addplot3 [
    surf,
    color         = blue,
    opacity       = 0.01,
    faceted color = white,
    z buffer      = sort,
    fill opacity  = 0.5] ({u(\x, \y)}, {v(\x, \y)}, {w(\x, \y)});

  \addplot3 [border one] ({u(\t, \yrange)}, {v(\t, \yrange)}, {w(\t, \yrange)});
  \addplot3 [border one] ({u(\t, -\yrange)}, {v(\t, -\yrange)}, {w(\t, -\yrange)});
  \addplot3 [border two] ({u(\xrange, \t)}, {v(\xrange, \t)}, {w(\xrange, t)});
  \addplot3 [border two] ({u(-\xrange, \t)}, {v(-\xrange, \t)}, {w(-\xrange, t)});


\end{axis}
\end{tikzpicture}
}
\end{document}

在此处输入图片描述

免责声明只是一个有趣的动画,我知道这不是原作者想要的

答案3

您可以将节点放置在路径上,这应该会大大简化节点定位。您可能还想将箭头业务分解为style

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}

\begin{tikzpicture}[
  arrow inside/.style = {
    postaction={decorate},
    decoration={markings, mark=at position 0.5 with {\arrow{stealth}}}
  }
  ]

  \draw[arrow inside] (0,0) -- node [below] {$a$} (1,0);
  \draw[arrow inside] (0,1) -- node [above] {$a$} (1,1);
  \draw[arrow inside] (0,0) -- node [left] {$b$} (0,1);
  \draw[arrow inside] (1,0) -- node [left] {$b$} (1,1);

\end{tikzpicture}

\end{document}

在此处输入图片描述

答案4

另一种替代方法是使用元帖子. 用 编译这个lualatex

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
    path S, C;

    S = unitsquare shifted -(1/2, 1/2) scaled 100;
    C = fullcircle scaled 84 rotated 16 shifted 140 right;

    interim ahangle := 30;  % slimmer arrows...

    drawarrow subpath(0, 5/8) of S;
    drawarrow subpath(5/8, 13/8) of S;
    drawarrow subpath(4, 4-5/8) of S;
    drawarrow subpath(4-5/8, 4-13/8) of S;
    draw subpath(13/8, 4-13/8) of S;

    label.top("$a$", point 1/2 of S);
    label.top("$a$", point 5/2 of S);
    label.lft("$b$", point 3/2 of S);
    label.lft("$b$", point 7/2 of S);

    for t=0 upto 3:
        drawarrow subpath 2(t, t+1) of C;
        drawdot point 2t+3/4 of C withpen pencircle scaled 3;
        label(if odd t: "$b$" else: "$a$" fi, 9/8[center C, point 2t+7/4 of C]);
    endfor

endfig;
\end{mplibcode}
\end{document}

相关内容