Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Consider this MWE:

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

\begin{document}
\begin{tikzpicture}
\matrix [matrix of nodes] {
a \\
b \\
c \\
};
\end{tikzpicture}
\end{document}

It might be convenient to fill the matrix with a foreach loop:

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

\begin{document}

\begin{tikzpicture}
\matrix [matrix of nodes] {
\foreach \c in {a,b,c}{
\c \\
}
};
\end{tikzpicture}
\end{document}

This however fails with the message

 ! Extra }, or forgotten
 \endgroup.

It seems like the ending brace of \foreach bothers the matrix node. Can a matrix be populated with \foreach and how?

share|improve this question
add comment

1 Answer 1

up vote 13 down vote accepted

\foreach isn't expandable and the grouping is most likely causing some issues as well. I would recommend to use the loop outside the matrix and accumulate the rows in a macro which then only has to be expanded. The etoolbox package provides \gappto (global append to; \xappto would cause issues with fragile content) which can be used here. There is also \g@addto@macro provided by the LaTeX kernel, if you don't want to rely on e-TeX and don't mind to have to use \makeatletter/\makeatother.

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

\begin{document}

\begin{tikzpicture}
    \let\mymatrixcontent\empty
    \foreach \c in {a,b,c}{%
        \expandafter\gappto\expandafter\mymatrixcontent\expandafter{\c\\}%
        % or
        %\xappto\mymatrixcontent{\expandonce{\c\\}}
    }
    \matrix [matrix of nodes] {
        \mymatrixcontent
    };
\end{tikzpicture}

\end{document}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.