Tikz-matrix 通过循环,内部计算

Tikz-matrix 通过循环,内部计算

我看了这里
\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

对于 TiZ 矩阵,首先填充临时标记列表变量的间接方法似乎需要。对于更简单的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\\}%

我还将提供两种不同的方法

  1. .list通过处理程序和 PGFkeys 自己的“appto”(以密钥处理程序的形式.append)使用非分组循环,以及
  2. 通过使用我们可以在 PGFMath 内部使用的matrix自己的行计数器。\pgfmatrixcurrentrow

第一个替代解决方案\foreach在内部使用,因此您可以使用任何\foreach兼容列表(如{1,...,8,10,17,35.5})。由于我们使用样式,我们可以自动设置矩阵的内容,而无需再次指定它。

在这种情况下,第二种选择可能不是最简单的,但也不是那么无能为力。不过,对于更复杂的表格,该套餐可能值得投资。

代码

\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}

输出

在此处输入图片描述

相关内容