假设我在 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 问题。我想到的两个可以实现类似功能的工具是
\subnode
随tikzmark
库一起提供,- 装饰
text effects along path
还允许您访问表达式的每个字符。
很有可能他们允许您使用分解节点执行您想执行的操作。