在 tikz 中,我可以将单个长节点写为多个短节点吗?

在 tikz 中,我可以将单个长节点写为多个短节点吗?

假设我在 tikz 中有以下内容:

\node[right] at (0,0) {$A=\{1\}$};

但我想将其写成五个单独的节点,每个节点代表上面的一个字符。换句话说,每个节点一个:

A

=

{

1

}

我花了很长时间进行实验,但没有发现明显的规律。事实上,

\documentclass{beamer}
\usepackage{tikz}
\usefonttheme[onlymath]{serif}

\begin{document}

\begin{frame}
\begin{tikzpicture}[scale=1]
\node[right] at (0,0) {$A=\{1\}$};
\end{tikzpicture}

\end{document}

大致相当于

\documentclass{beamer}
\usepackage{tikz}
\usefonttheme[onlymath]{serif}

\begin{document}

\begin{frame}
\begin{tikzpicture}[scale=1]
\node[right] at (0,0.04) {$A$};
\node[right] at (0.405,-0.025) {$=$};
\node[right] at (0.805,0) {$\{$};
\node[right] at (1,0.03) {$1$};
\node[right] at (1.18,0) {$\}$};
\end{tikzpicture}
\end{frame}

\end{document}

真的吗?有更好的方法吗?

答案1

这不是一个严肃的答案,而只是一个按照你想要的方式执行的代码。

\documentclass{article}
\usepackage{tikz}
\usepackage{soul}
\newcounter{nodepart}
\usetikzlibrary{positioning}
\makeatletter
\DeclareRobustCommand*{\SplitMathNodes}{%
  \SOUL@setup
  \def\SOUL@preamble{\setcounter{nodepart}{0}}%
  \def\SOUL@everytoken{\stepcounter{nodepart}%
    \ifnum\value{nodepart}=1
     \node[inner sep=0pt] 
     (\pgfkeysvalueof{/tikz/nodepart}-\number\value{nodepart}) {$\the\SOUL@token$};
    \else
     \node[inner sep=0pt,
        base right=0pt of \pgfkeysvalueof{/tikz/nodepart}-\the\numexpr\value{nodepart}-1]
    (\pgfkeysvalueof{/tikz/nodepart}-\number\value{nodepart})   {$\the\SOUL@token$};
    \fi}%
  \SOUL@
}
\makeatother
\begin{document}
\begin{tikzpicture}[nodepart/.initial=A]
\SplitMathNodes{A=\{1\}}
\foreach \X in {1,...,\number\value{nodepart}}
{\draw[stealth-] (\pgfkeysvalueof{/tikz/nodepart}-\X)--(\pgfkeysvalueof{/tikz/nodepart}-\X|-0,1em) node[above,font=\tiny\sffamily]{\X};}
\end{tikzpicture}
\end{document}

在此处输入图片描述

如您所见,它将您的表达式分解为原子,并将其转换为节点。使用键base right可以让我们避免使用显式坐标。

到目前为止,一切都很好。间距通常不会很大。更糟糕的是,您无法E=mc^2在表达式中输入类似的东西,因为它无法理解^。您可能可以修复其中一些问题,但最终永远无法完美地获得真正的 LaTeX 输出。

不过,在我看来,这可能是一个 XY 问题。我想到的两个可以实现类似功能的工具是

  • \subnodetikzmark库一起提供,
  • 装饰text effects along path还允许您访问表达式的每个字符。

很有可能他们允许您使用分解节点执行您想执行的操作。

相关内容