我怎样才能在 LaTeX 中制作出像这样的排列整齐的图表?

我怎样才能在 LaTeX 中制作出像这样的排列整齐的图表?

这是一个非常简单的图表,基本上我想要得到的结果是这样的:

所需图表

其中三个方程式向左对齐。我尝试过使用 TikZ 和 Tikz-cd,但这是我能得到的最好的结果(我使用 hphantoms,因此箭头更靠左):

\begin{center}
    \begin{tikzcd}[row sep = tiny, column sep = -1 em]
        \hphantom{a} \arrow[dd, leftrightarrow, bend right = 60] & x = \sin{t} \\ 
        \hphantom{aa} & \dfrac{dx}{dt} = \cos{t} \\ 
        \hphantom{aaa} & \dfrac{d^2x}{dt^2} = -\sin{t}
    \end{tikzcd}
\end{center}

产生

我得到的图表

因此箭头和方程式都没有对齐(但是,对齐方程式才是最重要的)。

我怎样才能做得更好?提前谢谢。

答案1

可以用 来做tikz-cd。只需使用一列并设置text width=0mm。但我建议如果符号=对齐,效果会更好。正如@Qrrbrbirlbel 评论的那样,align*环境与 一起使用tikzmark才是最佳选择。

还要注意,如果您有额外的列,这个textwidth=0技巧就会失败。相反,请使用text width=2cm(或您选择的任何内容)并添加start anchor=west, end anchor=west到箭头中。

\documentclass{article}

\usepackage{tikz-cd, amsmath}

\begin{document}
\begin{center}
    \begin{tikzcd}[row sep = tiny, text width=0mm]
         x = \sin{t}\arrow[dd, leftrightarrow, bend right = 60] \\ 
         \dfrac{dx}{dt} = \cos{t} \\ 
         \dfrac{d^2x}{dt^2} = -\sin{t}
    \end{tikzcd}
\end{center}
\end{document}

答案2

在以下两个解决方案中,您都会看到值,这是TikZ 中节点的.3333em默认值。inner xsep

由于我们甚至没有 TikZmark 解决方案中的节点,因此我们将手动添加它。TikZ-CD 解决方案用于inner xsep=0pt将节点紧密打包在一起,但使用outer xsep=.3333em锚点边框来再次定位到它通常所在的位置。

蒂克兹马克

这允许完全控制amsmath(例如方程编号)。(表示左)宏是一个包装器,
它添加一个水平空间并移动标记,使其位于行的中间(而不是其基线)。\tmll\tikzmark.5ex

代码

\documentclass[varwidth]{standalone}
\usepackage{tikz,amsmath}
\usepackage{esdiff}
\usetikzlibrary{tikzmark,arrows.meta}
\tikzset{tm/.style={overlay, remember picture}}
\newcommand*\tml[2][]{%
  \llap{\tikzmark[#1]{#2,baseline=-.5ex}\hspace{.3333em}}}
\begin{document}
\begin{align}
             \tml{a} x & = \sin t  \\
             \diff x t & = \cos t  \\
  \tml{b} \diff[2] x t & = -\sin t
\end{align}
\tikz[tm] \draw[Latex-Latex]
  (pic cs:b) to[bend left=60] ({pic cs:a}-|{pic cs:b});
\end{document}

输出

在此处输入图片描述

TikZ-CD

使用 TikZ-CD 您将不会获得任何方程编号(尽管我们可以将其全部放在环境中equation以获得至少一个数字)。

注意第二列中{}前面的。这确保了周围的间距是正确的。(AMSmath 的环境会自动插入它。)==

代码

\documentclass[varwidth]{standalone}
\usepackage{tikz-cd}
\usepackage{esdiff}
\usetikzlibrary{ext.node-families}% https://ctan.org/pkg/tikz-ext
\tikzcdset{
  left connect/.style={
    bend right=60, Latex-Latex, start anchor=west, end anchor=west},
  align col/.style 2 args={
    /tikz/column #1/.append style={
      node family={
        text width=\tikzmatrixname-\the\pgfmatrixcurrentcolumn,
        text width align=#2}}}}
\begin{document}
\begin{center}
\begin{tikzcd}[
  row sep=0pt, column sep=0pt, nodes={inner xsep=0pt, outer xsep=.3333em},
  align col=1right, align col=2left,
]
  x \ar[dd, left connect] & {} = \sin t \\
                \diff x t & {} = \cos t \\
             \diff[2] x t & {} = -\sin t
\end{tikzcd}
\end{center}
\end{document}

输出

在此处输入图片描述

答案3

使用\tikzmarknodeTi 中定义的一个不太简单(简短)的解决方案Z 库tikzmark,正如@Qrrbrbirlbel 在他的评论中所建议的:

\documentclass{article}
\usepackage{tikz}           % <---
\usetikzlibrary{arrows.meta,
                tikzmark}   % <---
\tikzset{>=Straight Barb,
         is/.style = {inner xsep=3pt}
         }

\usepackage{amsmath}
\usepackage{esdiff}

\begin{document}

\begin{align*}
\tikzmarknode[is]{a}{x} & = \sin t \\
        \diff x t   & = \cos t \\
\tikzmarknode[is]{b}{\diff[2] x t} & = -\sin t
\end{align*}
    \begin{tikzpicture}[overlay, remember picture]
\draw [red, very thick, <->] (a.south -| b.west) to[bend right=45] (b.west);
    \end{tikzpicture}
\end{document}

为了获得最终结果,您需要编译 MWE 三次。

在此处输入图片描述

答案4

一个简短的 PSTricks 示例。运行lualatex

\documentclass{article}
\usepackage{amsmath}
\usepackage{esdiff}
\usepackage{pst-node}
\begin{document}
    
    \begin{align*}
        \rnode{A}{\phantom{d^2}x} &= \sin t \\
        \diff x t & = \cos t \\
        \rnode{B}{\diff[2] x t} & = -\sin t
        \nccurve[arrowinset=0,angle=180]{<->}{B}{A}
    \end{align*}
    
\end{document} 

在此处输入图片描述

相关内容