我看了这里
\expandonce{\pgfmathprint{\n+1}} \expandonce{\&} Text
并尝试在 matrixcontent-loop 内部使用。
但这不起作用。我该怎么办?
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}
\begin{document}
\begin{tikzpicture}[
declare function={ f(\n)=0.5*\n; },
]
\let\mymatrixcontent\empty
\foreach \n in {1,...,8}{%%
\xappto\mymatrixcontent{
%\expandonce{\pgfmathprint{f(\n)}} \expandonce{\&} works not
%\expandonce{\pgfmathprint{\n+1}} \expandonce{\&} works not too
\expandonce{\pgfmathprint{1+1}} \expandonce{\&} works
}
\gappto\mymatrixcontent{\\}
}%%
\matrix[matrix of nodes, ampersand replacement=\&](m){
\mymatrixcontent
};
\end{tikzpicture}
\end{document}
答案1
你想扩大\n
,所以像
\xappto\mymatrixcontent{%
\noexpand\pgfmathprint{\n} \noexpand\&
\noexpand\pgfmathprint{f(\n)} \noexpand\&
\noexpand\pgfmathprint{\n+1} \noexpand\\
}
在标准设置下\noexpand\&
可能只是\&
,但并不会造成损害,而且如果以某种方式得到不同的定义\noexpand
则是必要的。\&
您可以采用不同的方式来进行。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\ExplSyntaxOn
\NewDocumentCommand{\intstep}{O{1}mm}
{
\int_step_inline:nnn { #1 } { #2 } { #3 }
}
% emulation of etoolbox \appto
\ProvideDocumentCommand{\appto}{mm}
{
\tl_put_right:Nn #1 { #2 }
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[declare function={f(\n)=0.5*\n;}]
\def\mymatrixcontent{}
\intstep{8}{
\appto\mymatrixcontent{\pgfmathprint{#1} \& \pgfmathprint{f(#1)} \& \pgfmathprint{#1+1} \\}
}
\matrix[matrix of nodes, ampersand replacement=\&](m){
\mymatrixcontent
};
\end{tikzpicture}
$\tikzset{declare function={f(\n)=0.5*\n;}}
\begin{array}{ccc}
\intstep{8}{\pgfmathprint{#1} & \pgfmathprint{f(#1)} & \pgfmathprint{#1+1} \\}
\end{array}$
\end{document}
该\intstep
命令将起点(默认 1)作为可选参数,然后是两个必需参数,即上限和要执行的操作的模板,其中当前索引用 表示#1
。
对于 Ti钾Z 矩阵,首先填充临时标记列表变量的间接方法似乎需要。对于更简单的array
方法则不是这样。
答案2
宏\expandonce
只会扩展它前面的内容,这里\pgfmathprint
,而且只扩展一次。它肯定不会扩展,\n
而这正是你想要的。我建议
\xappto\mymatrixcontent{\noexpand\pgfmathprint{f(\n)}}
\gappto\mymatrixcontent{\&\\}
防止\pgfmathprint
扩展。无需扩展\&
,这仅在内部正确定义\matrix
。甚至
\gappto\mymatrixcontent{\pgfmathprint}
\xappto\mymatrixcontent{{f(\n)}}% double braces!
\gappto\mymatrixcontent{\&\\}
要不就
\xappto\mymatrixcontent{%
\noexpand\pgfmathprint{f(\n)}\noexpand\&\noexpand\\}%
我还将提供两种不同的方法
.list
通过处理程序和 PGFkeys 自己的“appto”(以密钥处理程序的形式.append
)使用非分组循环,以及- 通过使用我们可以在 PGFMath 内部使用的
matrix
自己的行计数器。\pgfmatrixcurrentrow
第一个替代解决方案\foreach
在内部使用,因此您可以使用任何\foreach
兼容列表(如{1,...,8,10,17,35.5}
)。由于我们使用样式,我们可以自动设置矩阵的内容,而无需再次指定它。
在这种情况下,第二种选择可能不是最简单的,但也不是那么无能为力。不过,对于更复杂的表格,pgfplotstable该套餐可能值得投资。
代码
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}
\begin{document}
% 0. using \foreach and etoolbox
\begin{tikzpicture}[declare function={f(\n)=0.5*\n;}]
\def\mymatrixcontent{$x$\&$f(x)$\\}
\foreach \n in {1,...,8}{
\xappto\mymatrixcontent{
\noexpand\pgfmathprint{\n}
\noexpand\&
\noexpand\pgfmathprint{f(\n)}\noexpand\\}}
\matrix[matrix of nodes, ampersand replacement=\&] (m) {\mymatrixcontent};
\end{tikzpicture}
% 1. using .list and PGFkeys (w/o etoolbox)
\begin{tikzpicture}[declare function={f(\n)=0.5*\n;},
row builder/.style={
/mymatrixcontent/.initial=$x$\&$f(x)$\\,
@row builder/.list={#1},
node contents=\pgfkeysvalueof{/mymatrixcontent}},
@row builder/.style={
/mymatrixcontent/.append=#1 \& \pgfmathprint{f(#1)} \\}]
\matrix (m) [
matrix of nodes, ampersand replacement=\&,
row builder={1,...,8}];
\end{tikzpicture}
% 2. using row counter
\begin{tikzpicture}[declare function={f(\n)=0.5*\n;}]
\matrix[
matrix of nodes, ampersand replacement=\&, nodes in empty cells,
column 1/.append style={nodes={node contents=\pgfmathprint{int(\pgfmatrixcurrentrow-1)}}},
column 2/.append style={nodes={node contents=\pgfmathprint{f(\pgfmatrixcurrentrow-1)}}},
row 1 column 1/.style={nodes={node contents=$x$}},
row 1 column 2/.style={nodes={node contents=$f(x)$}}
] (m) { \& \\ \& \\ \& \\ \& \\ \& \\ \& \\ \& \\ \& \\ \& \\};
\end{tikzpicture}
\end{document}