# Using Macros within Loop

I was wondering if there is a way to use macro within a \foreach loop. For example some of my defined locals are:

\newcommand{\labA}{Adult}
\newcommand{\labC}{Child}


In the main text, what I want to do is generate a for loop with A B C, but present the \labA, \labB and \labC. For example

\foreach \age in {A,B,C}
{
(I want to show \lab\age here)
}


However, \lab\age does not seem to work, and I was wondering if there is a way to show local that contains local (A, B, and C) from the loop.

You can construct the control sequence name using a \csname...\endcsname pair:

\documentclass{article}

\usepackage{pgffor}

\newcommand{\labC}{Child}

\begin{document}

\foreach \age in {A,B,C} {%
Age~\age: \csname lab\age\endcsname\par
}

\end{document}


A rather flexible implementation with xparse and expl3:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\agename}{m}
{
\str_case:nnF { #1 }
{
{C}{Child}
}
{You~fool!}
}
\NewDocumentCommand{\xforeach}{m +m}
{
\clist_map_inline:nn { #1 } { #2 }
}
\ExplSyntaxOff

\begin{document}

\xforeach{A,B,C}{%
Age #1: \agename{#1}\par
}

\end{document}


As you see, the “variable” in the loop is denoted by #1 instead of defining a dummy macro.

The code is almost straightforward: the macro \agename checks its argument against the list of correspondences. The “false branch” might be a better error catching function, at present it just prints “You fool!”.

The \xforeach macro is a user's level version of \clist_map_inline:nn: each item in the comma separated list given as first argument is used as #1 in what's specified in the second argument.