以下代码会导致奇怪的行为:
\begin{align*}
\sum\limits_{i=1}^{3}\sum\limits_{j=1}^{4} a_{ij}&=
\tikzmarknode{red1}{\highlight[red!20]{\sum\limits_{j=1}^{3}a_{1j}}} +
\tikzmarknode{green1}{\highlight[green!20]{\sum\limits_{j=1}^{3}a_{2j}}} +
\tikzmarknode{blue1}{\highlight[blue!20]{\sum\limits_{j=1}^{3}a_{3j}}}\\
&\\&=
\tikzmarknode{red2}{\highlight[red!20]{a_{11} + a_{12} + a_{13} + a_{14}}} +
\tikzmarknode{green2}{\highlight[green!20]{a_{21} + a_{22} + a_{23} + a_{24}}} +
\tikzmarknode{blue2}{\highlight[blue!20]{a_{31} + a_{32} + a_{33} + a_{34}}}\\
\end{align*}
\begin{tikzpicture}[overlay, remember picture]
\draw[->] (pic cs:red1.south) to (pic cs:red2.north);
\draw[->] (pic cs:green1) to (pic cs:green2);
\draw[->] (pic cs:blue1) to (pic cs:blue2);
\end{tikzpicture}
当我不使用锚点(即 green1、green2、blue1 和 blue2)时,它的行为符合预期*,但如果我尝试将箭头锚定在 tikzmarknode 的南面或北面(即 red1 和 red2),则会出现在图片的左下方。如果我将 red2.north 更改为 red2,那么该锚点就可以了,但 red1.south 仍然坚持位于左下方。
关于如何解决这个问题有什么建议吗?
*这不是我最终想要的,但至少它能正常工作。
答案1
您的问题的技术原因是pic cs:
在此处不合适。也就是说,严格来说,由于您没有显示前言,我不知道您的代码中什么是合适的。假设您正在加载库tikzmark
,则它不合适。更详细地说, 的更高版本tikzmark
有一个命令\tikzmarknode
,您可能会使用也可能不会使用它(没有前言很难判断)。如果您正在使用它,那么您实际上并没有使用它的功能。您可以忘记所有这些\highlight
东西,只需使用 的选项中的相应指令即可\tikzmarknode
。这也解决了您的问题中提到的问题。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\begin{document}
\begingroup\tikzset{every tikzmarknode/.append style={inner sep=3pt,rounded
corners}}
\begin{align*}
\sum\limits_{i=1}^{3}\sum\limits_{j=1}^{4} a_{ij}&=
\tikzmarknode[fill=red!20]{red1}{\sum\limits_{j=1}^{4}a_{1j}} +
\tikzmarknode[fill=green!20]{green1}{\sum\limits_{j=1}^{4}a_{2j}} +
\tikzmarknode[fill=blue!20]{blue1}{\sum\limits_{j=1}^{4}a_{3j}}\\
\\
&=
\tikzmarknode[fill=red!20]{red2}{a_{11} + a_{12} + a_{13} + a_{14}} +
\tikzmarknode[fill=green!20]{green2}{a_{21} + a_{22} + a_{23} + a_{24}} +
\tikzmarknode[fill=blue!20]{blue2}{a_{31} + a_{32} + a_{33} + a_{34}}
\end{align*}\endgroup
\begin{tikzpicture}[overlay, remember picture,>=stealth,very thick]
\draw[->,red!20] (red1.south) to[out=-90,in=120,looseness=0.3] (red2.north);
\draw[->,green!20] (green1) to[out=-90,in=120,looseness=0.3] (green2);
\draw[->,blue!20] (blue1) to[out=-90,in=135,looseness=0.3] (blue2);
\end{tikzpicture}
\end{document}
目前 CTAN 上的版本tikzmark
修复了一些错误GitHub 版本。因此,您可以从那里下载,或者暂时使用:
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\newcommand{\tikznode}[3][]{%based on https://tex.stackexchange.com/a/402466/121799
\ifmmode%
\tikz[remember picture,baseline=(#2.base),inner sep=0pt] \node[#1] (#2) {$#3$};%
\else
\tikz[remember picture,baseline=(#2.base),inner sep=0pt] \node[#1] (#2) {#3};%
\fi}
\begin{document}
\begingroup\tikzset{every node/.append style={inner sep=3pt,rounded
corners}}
\begin{align*}
\sum\limits_{i=1}^{3}\sum\limits_{j=1}^{4} a_{ij}&=
\tikznode[fill=red!20]{red1}{\sum\limits_{j=1}^{4}a_{1j}} +
\tikznode[fill=green!20]{green1}{\sum\limits_{j=1}^{4}a_{2j}} +
\tikznode[fill=blue!20]{blue1}{\sum\limits_{j=1}^{4}a_{3j}}\\
\\
&=
\tikznode[fill=red!20]{red2}{a_{11} + a_{12} + a_{13} + a_{14}} +
\tikznode[fill=green!20]{green2}{a_{21} + a_{22} + a_{23} + a_{24}} +
\tikznode[fill=blue!20]{blue2}{a_{31} + a_{32} + a_{33} + a_{34}}
\end{align*}\endgroup
\begin{tikzpicture}[overlay, remember picture,>=stealth,very thick]
\draw[->,red!20] (red1.south) to[out=-90,in=120,looseness=0.3] (red2.north);
\draw[->,green!20] (green1) to[out=-90,in=120,looseness=0.3] (green2);
\draw[->,blue!20] (blue1) to[out=-90,in=135,looseness=0.3] (blue2);
\end{tikzpicture}
\end{document}
产生相同的输出(在此示例中)。