我想在 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
\tikzmarknode
cfr 的回答很好成为
\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}