TikZ - xy 移位和 let 的使用

TikZ - xy 移位和 let 的使用

我对下面的代码有三个疑问。

  1. 我无法使用 xy-shift :参见最终结果(2-2)++(6pt,2pt)。实现此目的的标准方法是什么?
  2. 该代码不是我的。我不明白\p1和的含义\x1。其余代码对我来说并不神秘。;-)
  3. 如何只使用\x1半径的 80%?
\documentclass{standalone}

\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{calc}
\begin{document}

$det = \begin{NiceArray}{ccc}
    u &           & v       \\
    x & \kern.1pt & x'      \\
    y & \kern.1pt & y'
\CodeAfter
  \SubMatrix|{2-1}{3-3}|
    \begin{tikzpicture}
     \path (2-2.north) 
           -- 
           node[red,circle,inner sep=1pt] (minus) {$-$} 
           (3-2.south);
           
     \draw [red,->] 
           let \p1=($(minus.east)-(minus.center)$) in
           (2-2)++(-6pt,2pt) 
           to[out=0,in=150]
           (minus.60)
           arc[start angle=60,end angle=-240,radius=\x1]
           to[out=30,in=180] 
           (2-2)++(6pt,2pt);
    \end{tikzpicture}
\end{NiceArray}
= ...$

\end{document}

这会产生以下不必要的输出。

在此处输入图片描述

答案1

  1. 有许多路径操作可与 TikZ 一起使用。

    最常见的是--(直行至),-|以及|-以及.. controls ..特别的to(也是,edge但更特别)。

    不过,还有一个:
    没错,没什么:A搬去

    当你写作时

    \path (<coordinate>);
    

    你已经指示 TikZ搬去 <coordinate>

    现在加号(+++)不再是路径操作的一部分,而是坐标规范。在这里我们区分

    1. +(<coordinate>)描述坐标的相对的到最后一个绝对坐标和
    2. 两个++(<coordinate>)也描述了一个坐标相对的到最后一个绝对坐标,而且还将新坐标设置为下一个绝对坐标。

    在您的情况下,区分并不重要,因为(minus.60)无论如何您的下一个坐标都是绝对的。

    路径有两个操作:一条直线从(c1) -- (c2) ++ (c3)C1C2和 1搬去(从C2)至C2 +C3 .

    如果你想C2 +C3作为路径操作的目标,你需要指定坐标。这可以通过

    1. ([shift=(c2)] c3)
    2. ([shift=(c3)] c2)或者,
    3. 有了calc图书馆,($(c2) + (c3)$)

    我也会对起始坐标做同样的事情,尽管通常这并不重要,因为在您的情况下它(2-2)已经是边界框的一部分(是的,移动到更新边界框)并且您不装饰路径(一些装饰会通过移动做一些你不想要的事情)。

  2. 语法let … in描述如下手册

    \p1实际上是\p{1}(即可以使用所有内容,而不仅仅是数字:)\p{name}

    calc库评估指定的坐标并将其存储X值(在画布坐标系中)在\x{name}和中\y{name}\p{name}然后扩展为\x{name}, \y{name}

  3. .8*\x1应该可以。不过,你还需要进行调整minus.60

代码

\documentclass{standalone}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{calc}
\begin{document}
$det = \begin{NiceArray}{ccc}
    u &           & v       \\
    x & \kern.1pt & x'      \\
    y & \kern.1pt & y'
\CodeAfter
  \SubMatrix|{2-1}{3-3}|
    \begin{tikzpicture}
     \path (2-2.north) 
           -- 
           node[red,circle,inner sep=1pt] (minus) {$-$} 
           (3-2.south);
           
     \draw [red,->] 
           let \p1=($(minus.east)-(minus.center)$) in
           (2-2) ++(-6pt,2pt) % fine but maybe better:
                              % a. ([shift={(-6pt,2pt)}] 2-2)
                              % b. ($(2-2)+(-6pt,2pt)$)
           to[out=0,in=150]
           ([xshift=-.1*\x1]minus.60) % adjusting this also!
           arc[start angle=60,end angle=-240,radius=.8*\x1]
           to[out=30,in=180] 
           ([shift={(6pt,2pt)}] 2-2) % or with calc:
                                     % ($(2-2)+(6pt,2pt)$)
           % node[above left=2pt,scale=.2,black]{\p1}
           ;
    \end{tikzpicture}
\end{NiceArray}
= ...$
\end{document}

输出

\p1我在输出中添加了一个带有文本的节点。上面的代码中该行已被注释。

在此处输入图片描述

答案2

这是一个更简单的版本,并进行了一些其他修正:

  • 使用选项first-row使得矩阵具有正确的垂直位置。
  • 使用内置坐标nicematrix
  • \cdots
  • vNiceArray将自动放置分隔符

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\begin{document}

$det = \begin{vNiceArray}{ccc}[first-row]
    u && v  \\
    x && x' \\
    &\color{red}-&\\
    y && y'
\CodeAfter
  \begin{tikzpicture}
    \draw[->, red, looseness=2](1.5-|2) to[out=0, in=0](3.5-|2.5) to[out=180, in=180] (1.5-|3);
  \end{tikzpicture}
\end{vNiceArray}
= \cdots$

\end{document}

或者如果您希望只有 2 行 2 列,则可以将其放置-为节点:

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usepackage{nicematrix}
\usetikzlibrary{calc}
\begin{document}

$det = \begin{vNiceArray}{c!{\hspace{5mm}}c}[first-row]
    u & v  \\
    x & x' \\[5mm]
    y & y'
\CodeAfter
  \begin{tikzpicture}
    \draw[->, red, looseness=2](1-1.east) to[out=0, in=0]($(2-1)!.5!(2-2)$)node[above=1mm]{$-$} to[out=180, in=180] (1-2.west|-1-1);
  \end{tikzpicture}
\end{vNiceArray}
= \cdots$

\end{document}

相关内容