Hier mal ein Beispiel, wie man Befehle definieren kann, in deren Definition nicht `#1`…`#9` verwendet wird, um die Argumente anzugeben, sondern `\ArgA`…`\ArgZ`:
\documentclass[10pt,a4paper,landscape,DIV=20]{scrartcl}
\usepackage{longtable}
\usepackage{colortbl}
\makeatletter
\newcommand*{\CommandWithMacroArgs}[2]{%
\def\next{\@CommandWithMacroArgs{}{#1}{#2}}%
\@tempcnta=\@ne
\ifnum #2>\z@\else\def\next{#1}\fi
\next
}
\newcommand*{\CommandWithGlobalMacroArgs}[2]{%
\def\next{\@CommandWithMacroArgs{\global}{#1}{#2}}%
\@tempcnta=\@ne
\ifnum #2>\z@\else\def\next{#1}\fi
\next
}
\newcommand*{\@CommandWithMacroArgs}[4]{%
#1\@namedef{Arg\@Alph\@tempcnta}{#4}%
\expandafter\show\csname Arg\@Alph\@tempcnta\endcsname
\ifnum \@tempcnta<#3\relax
\advance\@tempcnta \@ne
\else
\def\next{#2}%
\fi
\next
}
\newcommand*{\NewCommandWithMacroArgs}[3]{%
\def#1{%
\expandafter\CommandWithMacroArgs\csname \string#1\endcsname{#2}%
}%
\@namedef{\string#1}{#3}%
}
\newcommand*{\NewCommandWithGlobalMacroArgs}[3]{%
\def#1{%
\expandafter\CommandWithGlobalMacroArgs\csname \string#1\endcsname{#2}%
}%
\@namedef{\string#1}{#3}%
}
\makeatother
\NewCommandWithGlobalMacroArgs{\row}{10}{%
\ArgA & \ArgB & \ArgC & \ArgD & \ArgE & \ArgF & \ArgG & \ArgH & \ArgI &
\ArgJ
}
\newenvironment{timesheet}%[1]% Die Umgebung wird unten ohne Argument verwendet, also sollte sie auch keines haben!
{\setlength{\tabcolsep}{0pt}%
\begin{longtable}
{@{}*{10}{p{0.1\textwidth}@{}}}
\multicolumn{2}{c}{} & \multicolumn{2}{c}{Arbeitszeit}& \multicolumn{2}{c}{Pausenzeit} \\[2ex]
Wochentag & Tag & Datum & Kommen & Gehen & Kommen & Gehen & Std & Tage & Projekt \\[2ex]
\endhead
\row{?[wochentag]}{?[datum]}{?[art]}{?[arbeit\_von]}{?[arbeit\_bis]}{?[pause\_von]}{?[pause\_bis]}{?[std]}{?[tage]}{?[projekt]} \tabularnewline
\hline
}{\end{longtable}}
\begin{document}
\begin{timesheet}
\end{timesheet}
\end{document}
Es ist zu beachten, dass die Schachtelung solcherart definierter Befehle vermieden werden sollte, das nach dem inneren Befehl `\ArgA` etc. die Argumente des inneren Befehls sind!
Im Beispiel müssen `\ArgA` etc. global definiert werden, weil sonst nach der ersten Spalte `\ArgB` etc. nicht mehr definiert sind. Es muss außerdem `\tabularnewline` außerhalb sind.
Natürlich wäre es auch in diesem Fall sinnvoller, die Umgebung `timesheet` als echte Umgebung zu definieren, also die `\row`-Anweisungen nicht bereits in der Definition von `\row` gesetzt werden, weil sonst der Umgebung einzufügen, sondern erst bei deren Verwendung als deren Inhalt anzugeben:
\documentclass[10pt,a4paper,landscape,DIV=20]{scrartcl}
\usepackage{longtable}
\usepackage{colortbl}
\makeatletter
\newcommand*{\CommandWithMacroArgs}[2]{%
\def\next{\@CommandWithMacroArgs{}{#1}{#2}}%
\@tempcnta=\@ne
\ifnum #2>\z@\else\def\next{#1}\fi
\next
}
\newcommand*{\CommandWithGlobalMacroArgs}[2]{%
\def\next{\@CommandWithMacroArgs{\global}{#1}{#2}}%
\@tempcnta=\@ne
\ifnum #2>\z@\else\def\next{#1}\fi
\next
}
\newcommand*{\@CommandWithMacroArgs}[4]{%
#1\@namedef{Arg\@Alph\@tempcnta}{#4}%
\expandafter\show\csname Arg\@Alph\@tempcnta\endcsname
\ifnum \@tempcnta<#3\relax
\advance\@tempcnta \@ne
\else
\def\next{#2}%
\fi
\next
}
\newcommand*{\NewCommandWithMacroArgs}[3]{%
\def#1{%
\expandafter\CommandWithMacroArgs\csname \string#1\endcsname{#2}%
}%
\@namedef{\string#1}{#3}%
}
\newcommand*{\NewCommandWithGlobalMacroArgs}[3]{%
\def#1{%
\expandafter\CommandWithGlobalMacroArgs\csname \string#1\endcsname{#2}%
}%
\@namedef{\string#1}{#3}%
}
\makeatother
\NewCommandWithGlobalMacroArgs{\row}{10}{%
\ArgA & \ArgB & \ArgC & \ArgD & \ArgE & \ArgF & \ArgG & \ArgH & \ArgI &
\ArgJ\tabularnewline
}
\newenvironment{timesheet}
{\setlength{\tabcolsep}{0pt}%
\begin{longtable}
{@{}*{10}{p{0.1\textwidth}@{}}}
\multicolumn{2}{c}{} & \multicolumn{2}{c}{Arbeitszeit}& \multicolumn{2}{c}{Pausenzeit} \\[2ex]
Wochentag & Tag & Datum & Kommen & Gehen & Kommen & Gehen & Std & Tage & Projekt \\[2ex]
\endhead
\hline
\endfoot
}{\end{longtable}}
\begin{document}
\begin{timesheet}
\row{?[wochentag]}{?[datum]}{?[art]}{?[arbeit\_von]}{?[arbeit\_bis]}{?[pause\_von]}{?[pause\_bis]}{?[std]}{?[tage]}{?[projekt]}
\end{timesheet}
\end{document}
BTW: Die die Umgebung `timesheet` bei ihrer Verwendung kein Argument erhält, habe ich das Ende Argument auch in der Tabellenzeile nicht zuverlässig erkannt werden kann.
Definition der Umgebung entfernt. Definiert man nämlich eine Umgebung mit obligatorischem Argument, ist ein solches natürlich auch bei der Verwendung der Umgebung unbedingt anzugeben.
Eine Alternative zu dem Konstrukt mit den Hilfsmakros für die Argumente wäre übrigens, keine quasi *nummerierten Argumente* zu verwenden, sondern ein key=value-Syntax. Siehe dazu: [Ist es möglich Befehle zu definieren, bei denen Argumente mit Hilfe von keys übergeben werden?](http://texwelt.de/wissen/fragen/8412).
Schlussbemerkung: Die seltsamen Zeileninhalte habe ich aus dem Beispiel übernommen und wie gewünscht eine zehnte Spalte hinzugefügt. Damit die Tabelle überhaupt auf die Seite passt, musste ich die Klasse ändern und Querformat einstellen.
Siehe auch meinen alternativen Vorschlag, den ich eher empfehlen würde. Die Lösung hier ist eher als Antwort auf die formal tatsächlich gestellte Frage (Befehl mit mehr als neun Argument) als das eigentliche Problem (generierte Tabelle mit teilweise zusätzlich formatierten Spalten) zu betrachten.