我想插入从“Foo”指向表中四个不同行的那些行。
我尝试插入图片,但效果不太好(请忽略线条质量较差以及表格与上面的表格不相似):
这是一个最简单的例子:
\documentclass[12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{graphicx}
\usepackage{multirow}
\usepackage{array}
\pagestyle{empty}
\begin{document}
\setlength{\extrarowheight}{5pt}
\begin{tabular}{ c c c c c c }
& & A & B & C & D \\ \cline {2-6}
\multirow{4}{*}{Foo \includegraphics[scale=0.5]{IMAGE HERE}} & 1 & foo A1 & foo B1 & foo C1 & foo D1 \\
& 2 & foo A2 & foo B2 & foo C2 & foo D2 \\
& 3 & foo A3 & foo B3 & foo C3 & foo D3 \\
& 4 & foo A4 & foo B4 & foo C4 & foo D4 \\
\end{tabular}
\end{document}
显然,如果您知道一种不使用图像的“Tex-native”方式来实现此目的,插入图像时图像质量不可避免地会变差,那么这将是一个完美的解决方案。
答案1
与我提供的解决方案类似如何在等式各部分之间画箭头来显示数学分配律(乘法)?, 您可以使用\tikzmark
使用在正文旁边添加大括号。线的每个端点都用 标识\tikzmark
,宏\DrawLines
在每个节点之间绘制线。
您可以调整shorten <=<size>
参数,使线条稍晚一些开始,这样可以达到不错的效果。结果如下shorten <=7pt
:
in=<angle>
也可以通过指定和选项来获得曲线out=<angle>
。例如,使用\DrawLinesCurved
而不是DrawLines
您将获得:
笔记:
- 这需要运行两次。第一次用于确定线条的起点和终点,第二次用于绘制线条。
- 4 条线的颜色作为参数传递给
\DrawLines
。 - 我
-latex
在这里使用了箭头,但如果不需要箭头,可以删除此选项。 - 我曾经
\raisebox
调整过文本的位置(按照评论中的要求)。
代码:
\documentclass[12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{graphicx}
\usepackage{array}
\usepackage{tikz}
\usetikzlibrary{calc,shapes}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawLinesCurved}[4]{%
\begin{tikzpicture}[overlay,remember picture,-latex,shorten >=1pt,shorten <=1pt, thick]
\draw[out=80, in=180, #1] (a.north) to (b.north west);
\draw[out=40, in=180, #2] (a.north) to (c.north west);
\draw[out=320, in=180, #3] (a.north) to (d.north west);
\draw[out=275, in=180, #4] (a.north) to (e.north west);
\end{tikzpicture}
}
\newcommand{\DrawLines}[4]{%
\begin{tikzpicture}[overlay,remember picture,-latex,shorten >=1pt,shorten <=1pt, thick]
\draw[#1] (a.north) to (b.north west);
\draw[#2] (a.north) to (c.north west);
\draw[#3] (a.north) to (d.north west);
\draw[#4] (a.north) to (e.north west);
\end{tikzpicture}
}
\pagestyle{empty}
\begin{document}
\setlength{\extrarowheight}{5pt}
\raisebox{-12pt}{Foo\tikzmark{a}}\hspace*{1.0cm}
\begin{tabular}[c]{ c c c c c c }
& A & B & C & D \\ \cline {2-6}
\tikzmark{b}1 & foo A1 & foo B1 & foo C1 & foo D1 \\
\tikzmark{c}2 & foo A2 & foo B2 & foo C2 & foo D2 \\
\tikzmark{d}3 & foo A3 & foo B3 & foo C3 & foo D3 \\
\tikzmark{e}4 & foo A4 & foo B4 & foo C4 & foo D4 \\
\end{tabular}
\DrawLines{red}{blue}{green}{orange}
\end{document}
答案2
\documentclass[12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{graphicx}
\usepackage{multirow}
\usepackage{array,calc,pict2e}
\pagestyle{empty}
\begin{document}
\setlength{\extrarowheight}{5pt}
\setlength\unitlength{\baselineskip + \extrarowheight}
\begin{tabular}{ c c c c c c }
& & A & B & C & D \\ \cline {2-6}
\multirow{4}{*}{\begin{picture}(1,1)
\put(.5,.5){\makebox(0,0)[r]{foo }}
\put(.5,.5){\vector(2,3){1}}
\put(.5,.5){\vector(2,1){1}}
\put(.5,.5){\vector(2,-1){1}}
\put(.5,.5){\vector(2,-3){1}}
\end{picture}} & 1 & foo A1 & foo B1 & foo C1 & foo D1 \\
& 2 & foo A2 & foo B2 & foo C2 & foo D2 \\
& 3 & foo A3 & foo B3 & foo C3 & foo D3 \\
& 4 & foo A4 & foo B4 & foo C4 & foo D4 \\
\end{tabular}
\end{document}
答案3
为了补充 Peter 的精彩回答,我使用了matrix
库。这可能会有用,因为您已经输入了表格格式,所以我只是复制并粘贴了它。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,calc}
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes] (footable) {
&A & B & C & D \\
1 & foo A1 & foo B1 & foo C1 & foo D1 \\
2 & foo A2 & foo B2 & foo C2 & foo D2 \\
3 & foo A3 & foo B3 & foo C3 & foo D3 \\
4 & foo A4 & foo B4 & foo C4 & foo D4 \\
};
\draw (footable-2-1.north west) -- (footable-2-5.north east);
\node (Foo) at ([xshift=-1cm]$(footable-3-1.west)!0.5!(footable-4-1.west)$) {Foo};
\foreach \x in {2,...,5}{
\draw (Foo) -- (footable-\x-1);%replace (Foo) with (Foo.east) to focus the arrow origins
}
\end{tikzpicture}
\end{document}
因此,matrix
库基本上允许我们输入表格数据。然后我们放置一个节点,该节点的坐标是通过获取第 3 行和第 4 行的中间点并通过库-1cm
在水平轴上移动来计算的calc
。然后一个foreach
参数绘制线条。