是否可以拿一个盒子并从中检索以下信息:
- 所有“顶级”内部框的列表;
- 所有中间的空间(字距和粘连:我忘记了另一种类型的空间吗?)?
你可能想知道我为什么要这样做。原因是我希望能够以自然的方式编写一段文本,然后将每个字符放在 TikZ 节点内而不改变间距。那这样我就可以引用公式中的各个术语(例如,为了在它们之间放置箭头)。
目前我通过执行以下操作来实现此目的:
\documentclass{article}
\usepackage{tikz}
\usetikzpackage{chains}
\begin{document}
\tikzstyle{node text}=
[start chain,
every node/.append style = {
on chain, inner sep = 0pt, outer sep = 0pt,
execute at begin node = \strut},
node distance = 0pt]
\newcommand{\NodeTextCell}[2][]{
\node [inner sep = 0pt, outer sep = 0pt, #1] (my node)
\tikz[node text]{
\foreach \letter [count = \n] in {#2}
\node (my node*\n) {\letter};
}
}
\begin{tikzpicture}
\NodeTextCell{A, {}\otimes{}, B, {}\otimes{}, C}
\draw (my node*1.north) to[bend left=30] (my node*3.north);
\end{tikzpicture}
\end{document}
这有点笨重,但如果有必要,我可以忍受。如果你能想出一个更好的方法用 TikZ 来做这件事,那也可以作为答案。谢谢!
答案1
在我看来,Luatex 对此提供了很好的支持,它有用于遍历框内容的原语(它使用更通用的类型化节点概念在内部表示)。
如果你对 Lua 有一定了解,并且读过前三章和第 4.10 节Luatex 手册,您将和我一样了解如何使用它。希望我们这里的一位真正的 Luatex 专家能够说出一些更实质性的东西。但在我看来,在 Luatex 中,答案是:
- \hboxes 是 类型的节点
hlist
,包含其顶级框作为其内容列表,框是列表中具有框类型的节点。Luatexnode.traverse
为此提供了一个迭代器原语 ,这比 有了很大的改进\lastbox
; - 我不太清楚 Luatex 中如何处理粘合,但我猜你想要的中间空间是具有或
glue
类型的同一列表的项目kern
(我也不确定其他节点是否可能有空间值)。然后node.dimension
给出空间的尺寸。
答案2
有\unhbox
和\unvbox
可以将盒子的内容解压到当前列表中。然后,您必须使用和遍历列表\lastskip
。\lastbox
这不适合胆小的人,但 Victor Eijkhout 的TeX 按主题分类以及 TeXbook。