我想要实现以下目标:
我希望单个页面由 N 个“区域”组成。
每个区域都有一个 x 起点、y 起点和 a
\hbox
(表示区域的内容)。此外,对于每个区域,我希望能够在原因范围内定义“锚点”。
我希望能够绘制从一个锚点指向另一个锚点的箭头。
在 TeX 中实现这一目标的最佳方法是什么?
答案1
这里有一个方法可以做到,但是还有什么其他方法tikz
:
内容放置在
\AnchoredRegion[<draw options>]{<name of region>}{x,y}{<content>}
在哪里:
<draw options>
是用于设置框样式的可选参数。如果您不想要框,可以使用fill=none
。如果您想要实心框draw=<color>
,请使用 等...<name of region>
是赋予此节点的名称,稍后可用于引用其位置x,y
是与页面西南角的偏移量。默认单位为x
,但如果您希望使用其他单位,您可以提供。例如,相当于或。y
cm
{1in,1in}
{2.54cm,2.54cm}
{2.54,2.54}
<content>
是要放置的内容
放置好盒子后,您可以根据需要用以下命令从一个盒子到另一个盒子画线:
\DrawLines[<draw options>]{<name of region>}{<name of region>}
这里仅展示了一小部分可用选项。有关其他绘制选项,请参阅tikz/pgf
用户手册。
笔记:
- 这确实需要两次运行。第一次确定位置,第二次进行绘图。
- 请注意,没有进行任何测试来确保您没有重叠的框。因此,如果不希望如此,您可能需要调整这些节点位置的
x
坐标。y
tikz
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\AnchoredRegion}[4][]{%
% #1= draw options
% #2= name of this node
% #3= x,y offset from south west of current page
% #4= content for node
\begin{tikzpicture}[overlay,remember picture, outer sep=0, inner sep=5pt]
\node [#1] (#2) at
($(current page.south west)+(#3)$)
{#4};
\end{tikzpicture}%
}
\newcommand{\DrawLines}[3][]{%
\begin{tikzpicture}[overlay,remember picture, outer sep=0, inner sep=5pt]
\draw [ultra thick, #1] (#2) to (#3);
\end{tikzpicture}%
}%
\newcommand*{\TextA}{\parbox{3.0cm}{\raggedright Some small text over two lines.}}%
\newcommand*{\TextB}{\parbox{3.0cm}{\raggedright Some longer piece of text that takes up three lines.}}%
\newcommand*{\TextC}{\parbox{3.0cm}{\raggedright Some even longer piece of text thatjust goes on and on and on and on..... Well you get the idea.}}%
\begin{document}
\AnchoredRegion[fill=yellow!40]{YellowRegion}{7,7}{\TextA}
\AnchoredRegion[fill=cyan!40]{BlueRegion}{7,10}{\TextB}
\AnchoredRegion[fill=orange!40]{OrangeRegion}{7,13}{\TextC}
\AnchoredRegion[fill=red!20]{RedRegion}{11,13}{\TextC}
\DrawLines[out=130,in=-130,-stealth, red]
{YellowRegion.west}{OrangeRegion.west}
\DrawLines[out=30,in=-90,-stealth, brown, dotted]
{YellowRegion.east}{RedRegion.south}
\DrawLines[-stealth, violet]{BlueRegion.south}
{YellowRegion.north}
\DrawLines[out=-150,in=120, distance=6cm, -stealth, green]
{YellowRegion.south}{OrangeRegion.north}
\end{document}