我尝试用箭头连接两个任意表。下面的代码示例应该演示如何操作:假设我们想将 A 中的“1”与 B 中的“5”连接起来,将 A 中的“2”与 B 中的“7”连接起来,依此类推。我希望有“弯曲”箭头(据我所知,软件包tikz
提供了它们),而不是“直”箭头。
是否可以将“普通”表格元素与tikz
节点或图纸相结合?如果可以,怎么做?如果不行,有没有一种纯粹的tikz
方法来解决这个问题?谢谢任何建议或提示!
\documentclass[12pt,a4paper,twoside]{scrartcl}
\begin{document}
\begin{center}
\begin{tabular}{c c c c c c}
$A$ & 1 & 2 & 3 & 4 &
\end{tabular}
\vspace{15mm}
\begin{tabular}{c c c c c c c c c c }
$B$ & \fbox{5} & 6 & \fbox{7} & 8 & \fbox{9} & 10 & \fbox{11} & 12 &
\end{tabular}
\end{center}
\end{document}
答案1
你的意思是这样的吗:
笔记:
这确实需要两次运行。第一次确定位置,第二次进行绘图。
来自
\tikzmark
在正文旁边添加大括号。
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\DrawArrow}[3][]{%
% #1 = draw options
% #2 = left point
% #3 = right point
\begin{tikzpicture}[overlay,remember picture]
\draw [very thick, -stealth, #1] ($(#2)+(0.25em,-0.3ex)$) to ($(#3)+(0.25em,2.5ex)$);
\end{tikzpicture}%
}%
\begin{document}
\begin{center}
\begin{tabular}{c c c c c c}
$A$ & \tikzmark{topA}1 & \tikzmark{topB}2 & \tikzmark{topC}3 & \tikzmark{topD}4 &
\end{tabular}
\vspace{15mm}
\begin{tabular}{c c c c c c c c c c }
$B$ & \fbox{\tikzmark{bottomA}5} & 6 & \fbox{\tikzmark{bottomB}7} & 8 & \fbox{\tikzmark{bottomC}9} & 10 & \fbox{\tikzmark{bottomD}11} & 12 &
\end{tabular}
\DrawArrow[red, out=-90, in=90]{topA}{bottomA}
\DrawArrow[olive, out=-90, in=90]{topB}{bottomB}
\DrawArrow[blue, out=-90, in=90]{topC}{bottomC}
\DrawArrow[brown, out=-90, in=90]{topD}{bottomD}
\end{center}
\end{document}
答案2
使用 PSTricks。
\documentclass[preview,border=12pt,12pt]{standalone}
\usepackage{pst-node}
\psset
{
mnode=r,
rowsep=2cm,
colsep=0.5cm,
}
\def\c{[mnode=circle] }
\begin{document}
\offinterlineskip
\begin{psmatrix}
& & A & 1 & 2 & 3 & 4\\
B & \c 5 & 6 & \c 7 & 8 & \c 9 & 10 & \c 11 & 12
\foreach \i/\j in {4/2,5/4,6/6,7/8}
{\nccurve[angleA=-90,angleB=90,nodesep=3pt]{->}{1,\i}{2,\j}}
\end{psmatrix}
\end{document}
警告:
mnode
并非\psframebox
开箱即用。我们可以通过\psframebox
手动包装每个项目来规避它,但这将需要更多击键!mnode=circle
将用来\pscirclebox
包裹物品。不幸的是,\pscirclebox
没有选项可以调整其半径。这导致每个圆圈的大小将根据所包含物品的大小而变化。只有framesep
可以调整边框。真遗憾!
答案3
这是一个使用该tikz-cd
包的非常简短的解决方案:
\documentclass{standalone}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[out=-90, in=90, column sep=small, row sep=15mm]
& & A & 1 \arrow{dll} & 2 \arrow{dl} & 3 \arrow{d} & 4 \arrow{dr} \\
B & \fbox{5} & 6 & \fbox{7} & 8 & \fbox{9} & 10 & \fbox{11} & 12
\end{tikzcd}
\end{document}
结果是这样的:
请注意,通过此方法创建的表条目将自动处于数学模式。任何不希望出现此行为的条目都应将其文本括在命令中\text{}
。