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.

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$
share|improve this question
    
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 '12 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 '12 at 17:34
add comment

1 Answer

up vote 5 down vote accepted

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}
share|improve this answer
    
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? –  rainmaker Feb 26 '12 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 '12 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 '12 at 18:16
    
And one more thing: instead of \expandaftering after \fi, you could use Knuth's \let\next=... trick. –  mbork Feb 26 '12 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 '12 at 18:20
show 1 more 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.