latex pgf / tikz 数组 / 循环遍历 pgf 键与 nicematrix 组合

latex pgf / tikz 数组 / 循环遍历 pgf 键与 nicematrix 组合

我正在尝试实现这一点,在文本中(这里在 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}

在此处输入图片描述

如果有其他要求,请考虑提出单独的问题。

相关内容