I am trying to load a whole lot of CSV's using \pgfplotstableread and dynamically assign them a macro name from a \pgfplotsinvokeforeach loop. I tried \csname but suspect this is totally the wrong approach!

    \pgfplotstableread{../Data/My#1data-##1.csv}{\csname \##1\endcsname}

I cannot do it with \foreach as the loaded tables would be local to that environment. (I tried with \foreach \gender/\name in {NoGender/\NoGender.... with no success)

And then how can I access these in future loops which create the graphs?

  • remove the backslash from ##1 and use only one e.g. #1
    – percusse
    Feb 3, 2015 at 11:05
  • @percusse, with: \pgfplotstableread{../Data/Mydata-##1.csv}{\csname #1\endcsname} I get an error: 'too many }'s and Extra \endcsname \PlotsAuto
    – SpmP
    Feb 3, 2015 at 21:08
  • Also edited question to fully reflect the command, using #1 in the filename worked when manually doing \pgfplotstableread for every line, how can this work when using #1 from pgfplotsinvokeforeach?
    – SpmP
    Feb 3, 2015 at 21:15
  • ...also if (as it sometimes does) the filename contains a number straight after where the ##1 would be expanded. i.e. MySubData-NoGender2yr.csv, how can I handle this as it looks like ``My{}Data-##12yr.csv`
    – SpmP
    Feb 3, 2015 at 21:25
  • Put a space afterwards
    – percusse
    Feb 3, 2015 at 21:39

1 Answer 1


It appears to be an expansion issue as usual. But please don't do this number involving macro stuff. It is really unnecessary complication. Consider a batch file name treatment instead.

a b
1 2
3 4
a b
5 6
7 8

       \endgroup\noexpand\pgfplotstableread{My#1data-##1.csv}{\csname ##1\endcsname}}%
\expandafter\pgfplotstabletypeset\csname Male23\endcsname
\expandafter\pgfplotstabletypeset\csname Female4yr\endcsname

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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