tikzmarknode 中的锚点对齐

tikzmarknode 中的锚点对齐

以下代码会导致奇怪的行为:

\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}

奇怪的 tikznode 行为

当我不使用锚点(即 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}

产生相同的输出(在此示例中)。

相关内容