考虑:
我知道简短的答案是“使用 TikZ”。但是,TikZ 非常强大,当我需要复杂的图表时我会使用它。但我相信对于像下面这样的简短任务还有其他更好的选择。这就是我问的原因。
例如,我们可以简单地在方程式中使用 \boxed{} 来使用 amsmath 框住该方程式。同样,我只想框住一些文本并在其中放置一些箭头。有没有 TikZ 的替代品可以完成这个小任务?如果没有,您能给出如何绘制下面任何一个特定图形的提示吗?
最糟糕的情况是,假设没有其他替代 TikZ 的方法。然后我尝试了以下代码:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}
\tikzstyle{arrow} = [thick,->,>=stealth]
\begin{tikzpicture}
\draw (0,0) -- (4,0) -- (4,1) -- (0,1) -- cycle node(b1) {Box 1};
\draw (8,0) -- (12,0) -- (12,1) -- (8,1) -- cycle node(b2) {Box 2};
\draw [arrow] (b1) -- (b2);
\end{tikzpicture}
\end{document}
但它没有给出我想要的输出。例如,我无法将文本放在矩形内。此外,如何固定箭头位置?如何在箭头中间写文字?此代码给了我以下图片:
PS:这些示例图像摘自 Jakob Schwichtenberg 的《No-nonsense Classical Mechanics》一书。
答案1
这是使用 的两个图表的解决方案tikz-cd
。使用 选项cells={nodes={draw}}
将在每个单元格周围绘制框。
\documentclass{article}
\usepackage{tikz-cd}
\tikzset{smalltext/.style={"\textup{\small #1}" description}}
\begin{document}
\[\begin{tikzcd}[cells={nodes={draw}}, row sep=2cm, column sep=3cm]
\textup{equation of motion}
\arrow[r, smalltext=describes]
\arrow[d, smalltext=initial condtions]
& \textup{system abstractly}\\
\textup{solution}\arrow[r, smalltext=describes] & \textup{evolution of concrete preparation of system}
\end{tikzcd}\]
\vspace{2cm}
\[\begin{tikzcd}[cells={nodes={draw}}, row sep=2cm, column sep=2cm]
& \textup{Equation of Motion} \\
& \textup{Newtonian Mechanics}\arrow[u, smalltext=Newton's Second Law] \\
\textup{Hamiltonian Mechanics}\arrow[uur, bend left, smalltext=Hamilton's Equations]
& \textup{Classical Mechanics} \arrow[u, smalltext=Physical Space]\arrow[l, bend right=20, smalltext=Phase Space]\arrow[r, bend left=20, smalltext=Configuration Space]
& \textup{Lagrangian Mechanics}\arrow[uul, bend right, smalltext=Euler-Lagrange Equation]\arrow[ll,<->,bend left, smalltext=Legendre Transform]
\end{tikzcd}\]
\end{document}
答案2
一个稍微高级一点的解决方案是重新设计文本框,我会将内容写成两行。通过这个图表(在我看来)变得更紧凑、更易于阅读。所有图像元素都定义了通用样式。对不起,我不清楚应该如何将文本定向到垂直箭头。现在我猜应该沿箭头倾斜:
\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
positioning,
quotes}
\begin{document}
\begin{tikzpicture}[
node distance = 22mm and 33mm,
box/.style = {draw, minimum size=3em, align=center},
every edge/.style = {draw, -Straight Barb},
every edge quotes/.append style = {font=\small, fill=white,
anchor=center, align=center, sloped},
]
\scoped[nodes=box]
{
\node (eqm) {Equation\\ of Motion};
\node (sa) [right=of eqm] {System\\ Abstractly};
\node (sol) [below=of eqm] {Solution};
\node (ev) [below=of sa] {Evolution of Concrete\\
Preparation of System};
}
%%%%
\path (eqm) edge ["Initial\\ Condition"] (sol)
(eqm) edge ["Describes"] (sa)
(sol) edge ["Describes"] (ev);
\end{tikzpicture}
\end{document}
编辑:
如果您不喜欢边缘的文本沿箭头对齐,那么只需sloped
从every edge quotes
样式中删除选项:
every edge quotes/.append style = {font=\small, fill=white,
anchor=center, align=center},
那么编译的结果就变成:
答案3
(做得好!)我不确定我理解的对不对,但这里有两个变体(但见下文)。大型 pgf 手册很好地描述了您的选择,该手册从一章到下一章从粗略到精细(因此,即使它非常庞大,也值得一读并遵循)。
\documentclass[10pt, border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs}
\begin{document}
\tikz {
\node (eqm) [draw] at (0,0) {Equation of Motion};
\node (sa) [draw] at (10,0) {System Abstractly};
\node (sol) [draw] at (0, -4) {Solution};
\node (ev) [draw] at (10, -4) {Evolution of Concrete Preparation of System};
\draw [->] (eqm) -- node [left] {\small{Initial Condition}} (sol);% <<<
\draw [->] (eqm) -- node [sloped] {\small{Describes }} (sa);% <<<
\draw [->] (sol) -- node [sloped, above] {\small{Describes }} (ev);
}
\end{document}
\draw [->] (eqm) -- node [sloped, fill=white] {\small{Describes }} (sa);% <<<
答案4
感谢@MS-SPO的评论,我发布了我自己问题的答案。但是,我仍然无法弄清楚一个小细节。那就是是否可以将文本放在箭头中间而不是箭头上方。我现在使用以下代码得到了下图。
\documentclass[10pt, border=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs}
\begin{document}
\tikz {
\node (eqm) [draw] at (0,0) {Equation of Motion};
\node (sa) [draw] at (10,0) {System Abstractly};
\node (sol) [draw] at (0, -4) {Solution};
\node (ev) [draw] at (10, -4) {Evolution of Concrete Preparation of System};
\draw [->] (eqm) -- node [sloped, above] {\small{Initial Condition}} (sol);
\draw [->] (eqm) -- node [sloped, above] {\small{Describes }} (sa);
\draw [->] (sol) -- node [sloped, above] {\small{Describes }} (ev);
}
\end{document}