这是一个非常简单的图表,基本上我想要得到的结果是这样的:
其中三个方程式向左对齐。我尝试过使用 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
(例如方程编号)。(表示左)宏是一个包装器,
它添加一个水平空间并移动标记,使其位于行的中间(而不是其基线)。\tml
l
\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
使用\tikzmarknode
Ti 中定义的一个不太简单(简短)的解决方案钾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}