我对下面的代码有三个疑问。
- 我无法使用 xy-shift :参见最终结果
(2-2)++(6pt,2pt)
。实现此目的的标准方法是什么? - 该代码不是我的。我不明白
\p1
和的含义\x1
。其余代码对我来说并不神秘。;-) - 如何只使用
\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
有许多路径操作可与 TikZ 一起使用。
最常见的是
--
(直行至),-|
以及|-
以及.. controls ..
特别的to
(也是,edge
但更特别)。不过,还有一个:
没错,没什么:A搬去。当你写作时
\path (<coordinate>);
你已经指示 TikZ搬去
<coordinate>
。现在加号(
+
和++
)不再是路径操作的一部分,而是坐标规范。在这里我们区分+(<coordinate>)
描述坐标的相对的到最后一个绝对坐标和- 两个
++(<coordinate>)
也描述了一个坐标相对的到最后一个绝对坐标,而且还将新坐标设置为下一个绝对坐标。
在您的情况下,区分并不重要,因为
(minus.60)
无论如何您的下一个坐标都是绝对的。路径有两个操作:一条直线从
(c1) -- (c2) ++ (c3)
C1至C2和 1搬去(从C2)至C2 +C3 .如果你想C2 +C3作为路径操作的目标,你需要指定一坐标。这可以通过
([shift=(c2)] c3)
,([shift=(c3)] c2)
或者,- 有了
calc
图书馆,($(c2) + (c3)$)
我也会对起始坐标做同样的事情,尽管通常这并不重要,因为在您的情况下它
(2-2)
已经是边界框的一部分(是的,移动到更新边界框)并且您不装饰路径(一些装饰会通过移动做一些你不想要的事情)。语法
let … in
描述如下手册。\p1
实际上是\p{1}
(即可以使用所有内容,而不仅仅是数字:)\p{name}
。该
calc
库评估指定的坐标并将其存储X和是值(在画布坐标系中)在\x{name}
和中\y{name}
,\p{name}
然后扩展为\x{name}, \y{name}
。.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}