给定一个接受矩阵作为参数的宏
\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. 的回答是正确的。但是,为了充分理解这个答案,还有两个细节可能很重要。
\pgf@matrix@numberofcolumns
是一个计数,即 LaTeX 计数器的 TeX 版本。这从 中可以看出pgfmodulematrix.code.tex
。因此,要使用它,您需要\the
或类似的东西。- 最方便的检索方法是使用
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}
因为这是相关信息,所以我还添加了一种检索行数的方法。