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