我需要添加线条或箭头来显示随着问题空间扩大而扩展的可能性。例如,我试图制作类似这样的内容(手动添加线条):
我可以找到在等式顶部添加箭头的例子如何在等式各部分之间画箭头来显示数学分配律(乘法)?我已经开始使用对齐块创建我想要的布局(如下所示),并且我试图用箭头连接各个部分,如链接问题所示,但我还没有制作出任何有用的东西。
\begin{align*}
&&&&(1, 1, 0, 0)&\\
&&(1, 0, 0, 0)&&(1,0,1,0)&\\
0&&(0, 1, 0, 0)&&(1,0,0,1)&\\
&&(0, 0, 1, 0)&&&\\
&&(0, 0, 0, 1)&&&
\end{align*}
这感觉有点粗糙,有人可以帮助我完成我开始的工作或建议一种更优雅的方式(也许使用表格来存储选项然后链接单元格)?
答案1
实现结果的一个简单方法是使用 TikZ 树构造:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[grow=right, sibling distance=20pt,level distance=2.65cm,
edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}]
\node {0}
child {node {(0, 0, 0, 1)}}
child {node {(0, 0, 1, 0)}}
child {node {(0, 1, 0, 0)}}
child {node {(1, 0, 0, 0)}
child {node {(1, 0, 0, 1)}}
child {node {(1, 0, 1, 0)}}
child {node {(1, 1, 0, 0)}}
};
\end{tikzpicture}
\end{document}
给出:
在哪里:
grow=right
意味着树朝着正确的方向生长;sibling distance=20pt
表示孩子之间的距离是20pt
(改变这个来增加或减少这个距离);level distance=2.65cm
表示不同层次的距离;edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}
重新定义从父节点到子节点的路径(为直线);如果不使用这种构造,路径就不完美,因为某些连接不是指向节点的左侧,而是指向它们的中心。
要与最终箭头建立连接,您只需更改:
edge from parent path={(\tikzparentnode.east) -- (\tikzchildnode.west)}
和:
edge from parent path={[-stealth](\tikzparentnode.east) -- (\tikzchildnode.west)}
通过使用\tikzmark
宏作为链接的答案,可以按如下方式进行:
- 宏定义:
% 参见参考: %在对齐或聚集环境中使用 tikzpicture 矩阵 \def\vertalignmath{\the\dimexpr\fontdimen22\textfont2\relax} \newcommand{\tikzmark}1{% \tikz[记住图片,覆盖,基线=-\vertalignmath] \node [坐标] (#1){}; }
使用\vertalignmath
是为了有正确的垂直设置; - 宏的使用
align
:\开始{对齐*} &&&&\tikzmark{d1}(1, 1, 0, 0)&\&&\tikzmark{b1}(1, 0, 0, 0)\tikzmark{c}&&\tikzmark{d2}(1,0,1,0)&\0\tikzmark{a}&&\tikzmark{b2}(0, 1, 0, 0)&&\tikzmark{d3}(1,0,0,1)&\&&\tikzmark{b3}(0, 0, 1, 0)&&&\&&\tikzmark{b4}(0, 0, 0, 1)&&& \结束{对齐*}
标记放在元素之前和之后:给出唯一的名称很重要; - 创建连接;另一个宏
\connect
定义另一个宏:\newcommand{\connect}1{% \tikz[记住图片,覆盖,基线=-\vertalignmath]{ \foreach \start/\end 在 {#1}{ \drawshorten <=2pt,shorten >=2pt--(\end); } } }
然后使用:\连接{a/b1,a/b2,a/b3,a/b4, c/d1,c/d2,c/d3}
以正确的方式连接标记。
完整代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
% see as reference:
% https://tex.stackexchange.com/questions/59658/use-of-tikzpicture-matrix-in-align-or-gather-environment#comment126261_59660
\def\vertalignmath{\the\dimexpr\fontdimen22\textfont2\relax}
\newcommand{\tikzmark}[1]{%
\tikz[remember picture,overlay,baseline=-\vertalignmath]\node[coordinate](#1){};
}
\newcommand{\connect}[1]{%
\tikz[remember picture,overlay,baseline=-\vertalignmath]{
\foreach \start/\end in {#1}{
\draw[shorten <=2pt,shorten >=2pt](\start)--(\end);
}
}
}
\begin{document}
\begin{align*}
&&&&\tikzmark{d1}(1, 1, 0, 0)&\\
&&\tikzmark{b1}(1, 0, 0, 0)\tikzmark{c}&&\tikzmark{d2}(1,0,1,0)&\\
0\tikzmark{a}&&\tikzmark{b2}(0, 1, 0, 0)&&\tikzmark{d3}(1,0,0,1)&\\
&&\tikzmark{b3}(0, 0, 1, 0)&&&\\
&&\tikzmark{b4}(0, 0, 0, 1)&&&
\end{align*}
\connect{a/b1,a/b2,a/b3,a/b4,
c/d1,c/d2,c/d3}
\end{document}
经过至少两次编译运行后,结果是:
为了有箭头,\connect
宏可以改为:
\newcommand{\connect}[2][-]{%
\tikz[remember picture,overlay,baseline=-\vertalignmath]{
\foreach \start/\end in {#2}{
\draw[#1,shorten <=2pt,shorten >=2pt](\start)--(\end);
}
}
}
然后使用:
\connect[-stealth]{a/b1,a/b2,a/b3,a/b4,
c/d1,c/d2,c/d3}
将产生: