我怎样才能在 LaTeX 中绘制这种类型的框图?

我怎样才能在 LaTeX 中绘制这种类型的框图?

考虑:

图1

图 2

我知道简短的答案是“使用 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}

在此处输入图片描述

编辑: 如果您不喜欢边缘的文本沿箭头对齐,那么只需slopedevery 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}

您可能想要这个,sloped也可能会删除该选项: 在此处输入图片描述

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

相关内容