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