我正在尝试实现这一点,在文本中(这里在 nicematrix 环境中)我可以将元素添加到 pgf 键(可能是类似数组或简单扩展字符串的东西),稍后我想对这些元素进行迭代。
我目前所得到的(不起作用:/)
\documentclass[10pt, a4paper]{article}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\pgfkeys{/try1/.code={\def\addArray{#1}}}
\begin{align*}
\begin{bNiceMatrix}[name=mymatrix]
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bNiceMatrix}
\end{align*}
\begin{tikzpicture}[remember picture,overlay]
\pgfkeys{/try1={1-3/2-3/2}}
\draw (0,0) node {\try1};
\foreach \x/\y/\z in {\try1}
\draw (mymatrix-\x) ++(.75em,0) -- ++(.75em,0) node [anchor=west]{\tiny \z} |- ($ (mymatrix-\y) + (0.75em,0) $);
\end{tikzpicture}
\end{document}
/try1/.initial={...}
我已经尝试过直接通过并添加来设置值,/try1/.add={...}{}
但到目前为止没有任何效果。
我确实需要帮助,因为我对 pgfkeys 不太熟悉,而且我在搜索时发现没有任何方法可以起作用。
有什么建议么?
编辑:对于@schroedingers 猫的问题:目标是这样的(但有一个新的环境):
\begin{bNiceMatrix}[name=mymatrix]
1 & 2 & 3 \\
4 & 5 & 6 \\ \add[2]{1}
7 & 8 & 9 \\
\end{bNiceMatrix}
应该是写高斯消元法的东西。我的想法是,我将收集所有 add/swap/mult 命令,将它们转换为 tikz 命令,然后在关闭环境后最后执行它们bNiceMatrix
。
我之所以要收集它们而不是仅在一个命令中指定所有转换,是因为这样我就可以访问 nicematrix 的内部计数器/宏来获取当前行号(至少我应该能够做到)。我必须解决的一个问题是,由于某种原因,我无法访问在pNiceMatrix
同一align
环境中创建的 tikz 节点。
答案1
您的密钥将其参数转发给\addArray
宏,但您使用的\try1
宏并不存在。因此,初步估计您可以直接使用\addArray
。
\documentclass[10pt, a4paper]{article}
\usepackage{nicematrix}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\pgfkeys{/try1/.code={\def\addArray{#1}}}
\begin{align*}
\begin{bNiceMatrix}[name=mymatrix]
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bNiceMatrix}
\end{align*}
\begin{tikzpicture}[remember picture,overlay]
\pgfkeys{/try1={1-3/2-3/2}}
%\draw (0,0) node {\addArray};
\foreach \x/\y/\z in \addArray
\draw (mymatrix-\x) ++(.75em,0) -- ++(.75em,0) node [anchor=west]{\tiny \z} |- ($ (mymatrix-\y) + (0.75em,0) $);
\end{tikzpicture}
\end{document}
当然,让它更加通用可能更有意义。您只需为代码添加一个键,然后使用/.list
键处理程序来获取循环。
\documentclass[10pt, a4paper]{article}
\usepackage{nicematrix}
\usepackage{tikz}
\tikzset{add annotation/.code={%
\foreach \x/\y/\z in {#1}
\draw ([xshift=1ex]\pgfkeysvalueof{/tikz/atticus/matrix name}-\x.east)
-- ++(.75em,0) node
[anchor=west,font=\tiny]{ \z} |-
([xshift=1ex]\pgfkeysvalueof{/tikz/atticus/matrix name}-\y.east);
},atticus/.cd,matrix name/.initial=mymatrix}
\begin{document}
\begin{align*}
\begin{bNiceMatrix}[name=mymatrix]
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bNiceMatrix}
\end{align*}
\begin{tikzpicture}[remember picture,overlay]
\tikzset{add annotation/.list={1-3/2-3/2,2-3/3-3/a}}
\end{tikzpicture}
\end{document}
如您所见,硬编码mymatrix
也被 pgf 键替换,并且路径已被修改为涉及更少的硬编码值。
附录:我认为这应该是一个单独的问题,因为它与原始问题有很大不同。然而,这里有一个堆叠密钥的版本。
\documentclass[10pt, a4paper]{article}
\usepackage{nicematrix}
\usepackage{tikz}
\let\mylist\relax
\pgfkeys{/try1/.code=\ifx\mylist\relax
\edef\mylist{#1}%
\else
\edef\mylist{\mylist,#1}%
\fi,/atticus/.cd,matrix name/.initial=mymatrix
}
\begin{document}
\begin{align*}
\begin{bNiceMatrix}[name=mymatrix]
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9 \\
\end{bNiceMatrix}
\end{align*}
\begin{tikzpicture}[remember picture,overlay]
\pgfkeys{/try1={1-3/2-3/2}}
\pgfkeys{/try1={2-3/3-3/3}}
\foreach \x/\y/\z in \mylist
{
\draw ([xshift=1ex]\pgfkeysvalueof{/atticus/matrix name}-\x.east)
-- ++(.75em,0) node
[anchor=west,font=\tiny]{ \z} |-
([xshift=1ex]\pgfkeysvalueof{/atticus/matrix name}-\y.east);
}
\end{tikzpicture}
\end{document}
如果有其他要求,请考虑提出单独的问题。