3

I'm looking for a command \takeargs{n} (in either TeX or LaTeX) such that

f \takeargs{n} {x_1} ... {x_n} = f\ x_1\ ...\ x_n

, that is (if I understood that part)

\takeargs{0} =
\takeargs{n} \sometoken = \ \sometoken \takeargs{n-1}

Background: In my document, I define some functions (in Haskell-Syntax, which uses spaces for function application). On my constant striving towards don't-ever-repeat-yourself, I'd like to have newcommands for them defined automatically as I go, so I can write

\declarefunction{LaunchRockets}{2}{Coords}{Warhead}{IO ()}
% ^ Prints the function name and type and creates \CallLaunchRockets
% ...
Let $p$ be the target coordinates. Then for a huge boom we could e.g.
do a $\CallLaunchRockets p \Nuclear$ ...
% ^ Expands to $\mycodefont{LaunchRockets}\ p\ \Nuclear$
2
  • If you want to specify n arguments why not just put the space in manually? Unless the elements (or tokens) are generic of sorts.
    – Werner
    Feb 26, 2012 at 17:26
  • So you want the TeX equivalent of the C command int array[3] = {0,1,2}; except taking functions instead of int, and with a command to print out the whole array?'
    – Canageek
    Feb 26, 2012 at 17:34

1 Answer 1

5

What about this (plain-TeX) code? (Note: I did it in 5 minutes without thorough testing, there might be some bug, but it seems to work. Also, I used exactly your idea of a tail-recursive structure.)

\documentclass{article}

\newcount\takeargscount
\def\takeargs#1{%
  \takeargscount=#1
  \ifnum\takeargscount>0
    \expandafter\dotakeargs
  \fi
}
\def\dotakeargs#1{%
  \advance\takeargscount by -1
  \takeargsseparator #1\takeargs{\the\takeargscount}%
}
\def\takeargsseparator{ }


\begin{document}
\takeargs{3}{a}{b}{c}

\end{document}
6
  • Awesome! Thanks a lot! Have I understood your code correctly in that \expandafter prevents the \fi from coming too early, so \dotakeargs can eat the next token?
    – srs
    Feb 26, 2012 at 17:36
  • Well, I'm not exactly sure (my copy of The TeXbook is at work;)), but expanding \fi means that \dotakeargs sees the next token instead of \fi. So I think you are exactly right.
    – mbork
    Feb 26, 2012 at 18:15
  • Also, I guess that eTeX's \numexpr might help making the code shorter, but I'm not sure (and don't have time to try it now, sorry). Anyway, I'm glad you like this;).
    – mbork
    Feb 26, 2012 at 18:16
  • And one more thing: instead of \expandaftering after \fi, you could use Knuth's \let\next=... trick.
    – mbork
    Feb 26, 2012 at 18:17
  • @rainmaker: {a}, {b}, {c} are 3 items. Why then do you need to put 3 to lead them?
    – Ahmed Musa
    Feb 26, 2012 at 18:20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .