我目前正在使用该tikz
库在 Latex 中绘制一些自动机的状态图,并且我目前正在努力自定义我的起始箭头。默认的起始箭头虽然很清晰,但不是我想要的。我希望能够使用基本上大的大于号 (>) 来指示初始节点而不是箭头。我知道有办法做到这一点,因为我的教科书(语言和机器,Sudkamp 第 3 版)有这些漂亮的乳胶图纸,具有这个确切的功能:
这与我的绘图类似,但没有相同的起始箭头:
我可以意识到他可能用 的某种变体更改了循环的箭头>=latex
,但我不知道如何initial
像他那样自定义箭头。有没有简单的方法可以像这样用 自定义起始箭头tikz
,尤其是用,tikzset
这样就不必在每次绘图中都重新做一次?我的代码(用于生成第二幅图像)目前
\documentclass[12pt]{article}
\usepackage[left=1in, right=1in, top=1in, bottom=1in]{geometry}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}
\usepackage{tikz}
\usepackage{mathtools}
\usetikzlibrary{automata,positioning,arrows,calc}
% (failed attempts to replicate Sudkamp's arrow commented out below)
%\tikzset{initial text={}}
%\tikzset{initial distance=0.01cm}
\begin{document}
\begin{center}
\begin{tikzpicture}[shorten >=1pt, node distance=3cm,auto,]
\node[state,initial] (q0) {$q_0$};
\node[state] (q1) [right of=q0] {$q_1$};
\node[state,accepting] (q2) [below of=q1] {$q_2$};
\path[->] (q0) edge [loop above] node {a} ()
(q0) edge node {b} (q1)
(q1) edge node {a} (q2)
(q1) edge [loop above] node {b} (q1)
(q2) edge [loop right] node {a} ()
(q2) edge node {b} (q0);
\end{tikzpicture}
\end{center}
\end{document}
答案1
请告诉我这是否是您想要的(我不确定我是否理解了您的问题)。
我在手册中搜索了一下tikz
,最接近第一张图片中第一个箭头的箭头似乎是Classical TikZ Rightarrow
。
如果您想要像第一张图片中那样的其他箭头,请使用-Stealth
。
arrows
已被弃用,请改用arrows.meta
。
\documentclass[12pt]{article}
\usepackage[left=1in, right=1in, top=1in, bottom=1in]{geometry}
\usepackage{mathtools, amssymb}
\usepackage{bm}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows.meta,calc,decorations.markings}
\begin{document}
\begin{center}
\begin{tikzpicture}[shorten >=1pt, node distance=3cm,auto,]
\node[state] (q0) {$q_0$};
\path[decoration={markings,mark=at position 1 with \arrow{Classical TikZ Rightarrow[length=2mm]}}, decorate] (q0.west);
\node[state] (q1) [right of=q0] {$q_1$};
\node[state,accepting] (q2) [below of=q1] {$q_2$};
\path[->] (q0) edge [loop above] node {a} ()
(q0) edge node {b} (q1)
(q1) edge node {a} (q2)
(q1) edge [loop above] node {b} (q1)
(q2) edge [loop right] node {a} ()
(q2) edge node {b} (q0);
\end{tikzpicture}
\end{center}
\end{document}
否则,画两条简单的线,我也在Stealth
这里使用了技巧,向您展示区别:
\documentclass[12pt]{article}
\usepackage[left=1in, right=1in, top=1in, bottom=1in]{geometry}
\usepackage{mathtools, amssymb}
\usepackage{bm}
\usepackage{tikz}
\usetikzlibrary{automata,positioning,arrows.meta}
\begin{document}
\begin{center}
\begin{tikzpicture}[shorten >=1pt, node distance=3cm,auto]
\node[state] (q0) {$q_0$};
\draw (q0.west) -- ++(-2mm,2mm);
\draw (q0.west) -- ++(-2mm,-2mm);
\node[state] (q1) [right of=q0] {$q_1$};
\node[state,accepting] (q2) [below of=q1] {$q_2$};
\path[-Stealth] (q0) edge [loop above, >=Stealth] node {a} ()
(q0) edge node {b} (q1)
(q1) edge node {a} (q2)
(q1) edge [loop above, >=Stealth] node {b} (q1)
(q2) edge [loop right, >=Stealth] node {a} ()
(q2) edge node {b} (q0);
\end{tikzpicture}
\end{center}
\end{document}
PS = Zarko 提醒我mathtools
已加载amsmath
,我已将后者从我的 MWE 中删除。
答案2
简单使用符号$>$怎么样?
\documentclass[12pt]{article}
\usepackage[left=1in, right=1in, top=1in, bottom=1in]{geometry}
\usepackage{mathtools, amssymb}
\usepackage{bm}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, automata, positioning, quotes}
\begin{document}
\begin{center}
\begin{tikzpicture}[auto,
shorten > = 1pt,
node distance = 3cm and 3cm]
\node[state] (q0) {$q_0$};
\node[inner sep=0pt,outer sep=-1pt,left=0pt of q0.west]{$>$};
\node[state] (q1) [right of=q0] {$q_1$};
\node[state,accepting] (q2) [below of=q1] {$q_2$};
\path[->] (q0) edge [loop above] node {a} ()
(q0) edge ["b"] (q1)
(q1) edge ["a"] (q2)
(q1) edge [loop above, "b"] (q1)
(q2) edge [loop right, "a"] ()
(q2) edge ["b"] (q0);
\end{tikzpicture}
\end{center}
\end{document}
离题:\mathtools
取代了amsmath
,因此仅加载就足够了mathtools
。