如何在 tikz-cd 中使用 tikzmark?

如何在 tikz-cd 中使用 tikzmark?

我想在 tikzcd 中使用 tikzmark。但是,即使以下示例也返回错误

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd} 
\usetikzlibrary{tikzmark}

\begin{document}

\begin{tikzcd}
\tikzmark{u1}A & B\\
C & \tikzmark{u2}D
\end{tikzcd}

\begin{tikzpicture}[remember picture,overlay]
\draw[->] (u1) edge (u2);
\end{tikzpicture}
\end{document}

错误报告是

包 tikz 错误:无法解析此坐标。\tikzmark{u1}A

tikz 包错误:无法解析此坐标。C & \tikzmark{u2}D

包 pgf 错误:没有已知的名为 u1 的形状。\draw[->] (u1)

包 pgf 错误:没有已知的名为 u1 的形状。\draw[->] (u1) edge (u2)

包 pgf 错误:没有已知的名为 u2 的形状。\draw[->] (u1) edge (u2)

包 pgf 错误:没有已知的名为 u2 的形状。\draw[->] (u1) edge (u2)

包 pgf 错误:没有已知的名为 u1 的形状。\draw[->] (u1) edge (u2)

标签可能已更改。请重新运行以确保交叉引用正确。

如何修复此类错误?

更新: 我试过

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd} 
\usetikzlibrary{tikzmark}

\begin{document}

\begin{tikzcd}[remember picture]
aaaaaa\subnode{u1}{A} & B\\
C & \subnode{u2}{D}ddddddd
\end{tikzcd}

\begin{tikzpicture}[remember picture,overlay]
\draw[->] (u1) edge (u2);
\end{tikzpicture}
\end{document}

和这个

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd} 
\usetikzlibrary{tikzmark}

\begin{document}

\begin{tikzcd}[remember picture]
aaaaaa\tikzmarknode{u1}{A} & B\\
C & \tikzmarknode{u2}{D}ddddddd
\end{tikzcd}

\begin{tikzpicture}[remember picture,overlay]
\draw[->] (u1) edge (u2);
\end{tikzpicture}
\end{document}

但他们都没有把箭头放在正确的位置。

更新: 如果我使用 LuaLaTex 而不是 XeLaTeX,则 \tikzmarknode 命令可以正常工作。

答案1

(注:我同意 marmot 的观点,特殊情况下我不会使用 tikzmark,但我知道这是一个简单的例子,它揭示了 tikzmark 中的一个错误。)

似乎当我修改 tikzmark 以使其可以在 tikzpictures 内部使用时,我无意中破坏了在节点内部使用它的能力(尽管我不确定这是否是推荐的用法!)。节点位于 tikzpicture 内部,但应视为不在内部。我目前对 tikzmark 是否位于 tikzpicture 内部的测试没有发现这一点。以下是更正后的测试:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/458387/86}
\usepackage{amsmath}
\usepackage{tikz-cd} 
\usetikzlibrary{tikzmark}

\makeatletter

\def\tikzmark{%
  \ifx\pgfpictureid\@undefined
  \let\tikzmark@next=\tikzmark@outside
  \else
  \relax
  \ifx\scope\tikz@origscope\relax
  \let\tikzmark@next=\tikzmark@outside
  \else
  \let\tikzmark@next=\tikzmark@inside
  \fi
  \fi
  \tikzmark@next%
}
\makeatother

\begin{document}

\begin{tikzcd}
\tikzmark{u1}A & B\\
C & \tikzmark{u2}D
\end{tikzcd}

\begin{tikzpicture}[remember picture,overlay]
\draw[->] (pic cs:u1) -- (pic cs:u2);
\end{tikzpicture}
\end{document}

我已经上传到github一旦 marmot 出色的测试团队回答了几个问题以确保我没有损坏其他东西,我就会将其发送给 CTAN!

答案2

修改后的答案:我可以通过切换到 来tikzmark与 进行协作。更准确地说,如果我重写tikz-cd\tikzmarknodecfr 的回答很好成为

\documentclass{article}
\usepackage{tikz-cd,amssymb}
\usetikzlibrary{tikzmark,quotes}
\begin{document}
\begin{tikzcd}
  x \in \tikzmarknode{u1}{U} \subseteq M \arrow{r}{f} & f(x) \in V \subseteq 
  \tikzmarknode{n}{N} \arrow{d}{\psi} \\
  \phi(x) \in \tikzmarknode{u2}{\phi(U)} \subseteq \mathbb{R}^{m} \arrow{r}{\psi f \phi^{-1}} & \psi(f(x)) \in \psi(V) \subseteq \mathbb{R}^{n}
\end{tikzcd}
\begin{tikzpicture}[overlay, remember picture]
  \draw [->] (u1) edge ["$\phi$", right] (u2.north -| u1);
\end{tikzpicture}
\end{document}

我明白了

在此处输入图片描述

这可能就是你所追求的。

我还要提一下,对于上面的例子,您可能不会使用,\tikzmark因为您已经在 Ti 中拥有对象Z 节点。

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd} 

\begin{document}

\begin{tikzcd}[remember picture]
A & B\\
C & D
\end{tikzcd}

\begin{tikzpicture}[remember picture,overlay]
\draw[->] (\tikzcdmatrixname-1-1) edge (\tikzcdmatrixname-2-2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容