阅读盒子的内容

阅读盒子的内容

是否可以拿一个盒子并从中检索以下信息:

  • 所有“顶级”内部框的列表;
  • 所有中间的空间(字距和粘连:我忘记了另一种类型的空间吗?)?

你可能想知道我为什么要这样做。原因是我希望能够以自然的方式编写一段文本,然后将每个字符放在 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 中,答案是:

  1. \hboxes 是 类型的节点hlist,包含其顶级框作为其内容列表,框是列表中具有框类型的节点。Luatexnode.traverse为此提供了一个迭代器原语 ,这比 有了很大的改进\lastbox
  2. 我不太清楚 Luatex 中如何处理粘合,但我猜你想要的中间空间是具有或glue类型的同一列表的项目kern(我也不确定其他节点是否可能有空间值)。然后node.dimension给出空间的尺寸。

答案2

\unhbox\unvbox可以将盒子的内容解压到当前列表中。然后,您必须使用和遍历列表\lastskip\lastbox这不适合胆小的人,但 Victor Eijkhout 的TeX 按主题分类以及 TeXbook。

相关内容