确定 TikZ 矩阵中的列数

确定 TikZ 矩阵中的列数

给定一个接受矩阵作为参数的宏

\newcommand{tabler}[1]{\matrix(m)[matrix of nodes, ampersand replacement=\&]{#1};}

我想确定矩阵 m 中的列数,以便能够从最高列开始对它们进行迭代。

背景/动机:

给出一个列宽为n以及 (* x) 矩阵,我想将列宽应用于矩阵的列,从列开始-n+1。

想象一下我想做的事情:

\tabler{col 1\&col 2\&col 3\&col 4}{3,1,3}
|--col 1--|--col 2--|--col 3––|--col 4––|
          | width 3 | width 1 | width 3 |

确定了最高的列后,我会对这些列进行迭代,类似于使用的技术这里,从顶部开始,按相反顺序应用列样式。

编辑澄清:实际上,我正在尝试将列宽列表应用于n最右边的列。我不知道如何使用 tikz 样式命令column x/.stlye(索引为 1)直接访问最高列。Python 样式列表索引(l[-1]返回列表的最后一个元素l)同样有用。

更新:按照@Kevin C 指向\pgf@matrix@numberofcolumns宏的指针,我尝试(但没有成功)使用 pgfkeys 键处理程序打印矩阵中的列数.store in(但老实说,我不完全理解扩展规则)。

示例代码:

\documentclass{scrartcl}

\usepackage{xparse, tikz}
\usetikzlibrary{matrix}

\makeatletter
\newcommand\totcol{\pgf@matrix@numberofcolumns}
\makeatother

\pgfkeys{
/tabler/execute macro/.style = {/tabler/save/.expand once=#1},
/tabler/save/.store in=\numcols
}

\NewDocumentCommand\tabler{m}{
    \matrix(m)[/tabler/execute macro={\totcol},
            matrix of nodes,
            ampersand replacement=\&] at (0,0)
    {#1};
    \node at (0,0) {\numcols{}};
}

\begin{document}

\begin{tikzpicture}
\tabler{a \& b\& c \& d \& e\\}
\end{tikzpicture}

\end{document} 

这失败了Undefined control sequence [...] \numcols——我遗漏了什么?

如果有更好/更优雅的方法来完成我所概述的内容,请告诉我。

答案1

PGF 有一个内部宏,用于存储矩阵中的列数:\pgf@matrix@numberofcolumns。因此,您可以通过输入以下代码来访问它:

\makeatletter
\newcommand\totcol{\pgf@matrix@numberofcolumns}
\makeatother

在序言中,并使用\totcol来对样式做任何你需要的事情。

答案2

Herr K. 的回答是正确的。但是,为了充分理解这个答案,还有两个细节可能很重要。

  1. \pgf@matrix@numberofcolumns是一个计数,即 LaTeX 计数器的 TeX 版本。这从 中可以看出pgfmodulematrix.code.tex。因此,要使用它,您需要\the或类似的东西。
  2. 最方便的检索方法是使用execute at end matrix。这是一个 pgf 密钥,似乎在 pgfmanual 中找不到它。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{matrix}
\makeatletter
\tikzset{store number of columns in/.style={execute at end matrix={
\xdef#1{\the\pgf@matrix@numberofcolumns}}},
store number of rows in/.style={execute at end matrix={
\xdef#1{\the\pgfmatrixcurrentrow}}}}
\makeatother
\begin{document}
\begin{tikzpicture}
\matrix[matrix of nodes,store number of columns in=\mymatcols,
store number of rows in=\mymatrows] (mat){
a & b & c & d & e\\
a & b & c & d & e\\
a & b & c & d & e\\
};
\draw[latex-latex] ([yshift=1ex]mat.north west) -- ([yshift=1ex]mat.north east)
node[midway,fill=white]{\mymatcols};
\draw[latex-latex] ([xshift=-1ex]mat.north west) -- ([xshift=-1ex]mat.south west)
node[midway,fill=white]{\mymatrows};
\end{tikzpicture}
\end{document}

在此处输入图片描述

因为这是相关信息,所以我还添加了一种检索行数的方法。

相关内容