Tikz 矩阵内部使用命令进行 Foreach 循环

Tikz 矩阵内部使用命令进行 Foreach 循环

这个问题直接关系到TikZ 矩阵内的 Foreach。但是我无法用里面的宏来扩展它,例如:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}

\begin{document}
\newcommand{\somecommand}[1]{#1}
\begin{tikzpicture}
  \let\mymatrixcontent\empty
  \foreach \c in {a,b,c}{%
    \expandafter\gappto\expandafter\mymatrixcontent\expandafter{\somecommand{\c} \\}%
    % or
    % \xappto\mymatrixcontent{\expandonce{\somemacro{\c}\\}}
  }
  \matrix [matrix of nodes,ampersand replacement=\&] {
    \mymatrixcontent
  };
\end{tikzpicture}

\end{document}

我收到错误:错误:缺少} 插入。

答案1

如果你\show\mymatrixcontent在前面添加\matrix,你会看到扩展是

\c  \\\c  \\\c  \\

这不是你想要的。你必须先展开,\c然后才能将其作为参数提供给\somecommand。你可以这样做

\newcommand{\somecommand}[1]{#1}
\begin{tikzpicture}
  \let\mymatrixcontent\empty
  \def\gapptoaux#1{\gappto\mymatrixcontent{\somecommand{#1} \\}}
  \foreach \c in {a,b,c}{
    \expandafter\gapptoaux\expandafter{\c}
  }
  \matrix [matrix of nodes,ampersand replacement=\&] {
    \mymatrixcontent
  };
\end{tikzpicture}

答案2

我在不同的环境中遇到了完全相同的问题(循环计数器未在表格单元格中展开)。为了练习我对展开工作原理的理解,我尝试直接修复原始代码中有问题的行(在下面的代码中进行了注释)——再加两个\expandafters 就可以了。

Egreg 的解决方案看起来更漂亮、更简洁,但对于像我这样刚刚认识的人来说,这种粗略的方法可能更容易理解\expandafter。希望这对某些人有帮助。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}

\begin{document}
\newcommand{\somecommand}[1]{#1}
\begin{tikzpicture}
  \let\mymatrixcontent\empty
  \foreach \c in {a,b,c}{%
  %------------------------------
    % original code:
    %\expandafter\gappto\expandafter\mymatrixcontent\expandafter{\somecommand{\c} \\}%
    % changed to:
    \expandafter\gappto\expandafter\mymatrixcontent\expandafter{\expandafter\somecommand\expandafter{\c} \\}%
  %------------------------------
    % or
    % \xappto\mymatrixcontent{\expandonce{\somemacro{\c}\\}}
  }
  \matrix [matrix of nodes,ampersand replacement=\&] {
    \mymatrixcontent
  };
\end{tikzpicture}

\end{document}

相关内容