Folgendes Dokument möchte ich erstellen: Open in Online-Editor
\documentclass[10pt,a4paper]{article} \usepackage{longtable} \usepackage{colortbl} \newcommand{\row}[9]{#1 & #2 & #3 & #4 & #5 & #6 & #7 & #8 & #9 \\ } \newenvironment{timesheet}[1] {\setlength{\tabcolsep}{0pt}% \begin{longtable} {@{}p{0.15\textwidth}p{0.15\textwidth}*7{p{0.1\textwidth}}} \multicolumn{2}{c}{} & \multicolumn{2}{c}{Arbeitszeit}& \multicolumn{2}{c}{Pausenzeit} \\[2ex] Tag & Datum & Kommen & Gehen & Kommen & Gehen & Std & Tage & Projekt \\[2ex] \endhead \row{?[datum]}{?[art]}{?[arbeit_von]}{?[arbeit_bis]}{?[pause_von]}{?[pause_bis]}{?[std]}{?[tage]}{?[projekt]} \hline }{\end{longtable}} \begin{document} \begin{timesheet} \end{timesheet} \end{document} Das klappt auch alles soweit ganz gut, nur möchte ich jetzt noch einen weiteren Parameter in der Row übergeben, nämlich den Wochentag, den ich (wie auch die anderen Werte) von einem anderen Programm übergeben bekomme. Da ich aber momentan schon 9 Parameter übergebe, weiß ich nun nicht weiter. Habe schon zig Seiten Google durch, aber nur so etwas, wie das hier gefunden: Open in Online-Editor
\newcommand*{\AnweisungmitvielenParameter}[9]{% \def\ArgA{#1}% \def\ArgB{#2}% \def\ArgC{#3}% \def\ArgD{#4}% \def\ArgE{#5}% \def\ArgF{#6}% \def\ArgG{#7}% \def\ArgH{#8}% \def\ArgI{#9}% \AnweisungmitnichtganzsovielenParametern } \newcommand*{\AnweisungmitnichtganzsovielenParametern}[1]{ \def\ArgJ{#1}% % Und hier können wir nun auf \ArgA bis ArgJ zugreifen } Allerdings weiß ich dann wiederum nicht, wie ich diese ganzen Parameter auch in meine |
Ich würde im Beispiel anregen, die Zeilen nicht per Befehl Darüber hinaus stellt es bei einer direkt geschriebenen Tabellenzeile kein Problem mehr dar, wenn mehr als neun Spalten verwendet werden. Sollen die Zellen noch speziell von LaTeX umformatiert werden, so ist das einfach möglich, indem man für jede Spalte bzw. jede Art von Spalten ein eigenes Makro schreibt, das die Formatierung übernimmt: Open in Online-Editor
\documentclass[10pt,a4paper,landscape,DIV=20]{scrartcl} \usepackage{longtable} \usepackage{colortbl} \newcommand*{\FormWochentag}[1]{#1} \newcommand*{\FormTag}[1]{#1} \newcommand*{\FormDatum}[1]{#1} \newcommand*{\FormKommen}[1]{#1} \newcommand*{\FormGehen}[1]{#1} \newcommand*{\FormStd}[1]{#1} \newcommand*{\FormTage}[1]{#1} \newcommand*{\FormProjekt}[1]{#1} \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 \FormWochentag{?[wochentag]} & \FormTag{?[datum]} & \FormDatum {?[art]} & \FormKommen{?[arbeit\_von]} & \FormGehen{?[arbeit\_bis]} & \FormKommen{?[pause\_von]} & \FormGehen{?[pause\_bis]} & \FormStd{?[std]} & \FormTage{?[tage]} & \FormProjekt{?[projekt]} \tabularnewline \hline }{\end{longtable}} \begin{document} \begin{timesheet} \end{timesheet} \end{document} Streng genommen würde ich sogar noch einen Schritt weiter gehen: Open in Online-Editor
\documentclass[10pt,a4paper,landscape,DIV=20]{scrartcl} \usepackage{longtable} \usepackage{colortbl} \newcommand*{\FormWochentag}[1]{#1} \newcommand*{\FormTag}[1]{#1} \newcommand*{\FormDatum}[1]{#1} \newcommand*{\FormKommen}[1]{#1} \newcommand*{\FormGehen}[1]{#1} \newcommand*{\FormStd}[1]{#1} \newcommand*{\FormTage}[1]{#1} \newcommand*{\FormProjekt}[1]{#1} \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} \tabularnewline[2ex] Wochentag & Tag & Datum & Kommen & Gehen & Kommen & Gehen & Std & Tage & Projekt \tabularnewline[2ex] \endhead }{ \hline \end{longtable} } \begin{document} \begin{timesheet} \FormWochentag{?[wochentag]} & \FormTag{?[datum]} & \FormDatum {?[art]} & \FormKommen{?[arbeit\_von]} & \FormGehen{?[arbeit\_bis]} & \FormKommen{?[pause\_von]} & \FormGehen{?[pause\_bis]} & \FormStd{?[std]} & \FormTage{?[tage]} & \FormProjekt{?[projekt]} \tabularnewline \FormWochentag{![wochentag]} & \FormTag{![datum]} & \FormDatum {![art]} & \FormKommen{![arbeit\_von]} & \FormGehen{![arbeit\_bis]} & \FormKommen{![pause\_von]} & \FormGehen{![pause\_bis]} & \FormStd{![std]} & \FormTage{![tage]} & \FormProjekt{![projekt]} \tabularnewline \end{timesheet} \end{document} Im Gegensatz zum ursprünglichen Beispiel ergibt es so auch einen Sinn, dass 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. beantwortet 22 Sep '15, 08:54 saputello @saputello, ich habe mich hier an Dein Beispiel gehalten und soweit läuft das auch sehr gut. Nun habe ich aber erfahren, dass ich es so in unserem Programm nicht verwenden kann, da ich die Daten nicht, wie angenommen, alle einzeln bekomme, sondern als kompletten Datensatz, beispielsweise so: {tag,datum}{art}{arbeit_von,arbeit_bis,pause_von,pause_bis}{std}{tage}{projekt}
(23 Sep '15, 11:52)
Snoopy EL
Es können programmseitig auch mal 35 oder 40 Datensätze sein.
Deshalb auch mein erster Ansatz mit /row oben im Beispiel. ich müsste dann allerdings einige Parameter kommasepariert trennen, dann habe ich aber wieder mehr als neun Parameter, die in die Tabellenzeile müssen.
(23 Sep '15, 11:52)
Snoopy EL
@Snoopy EL: Und? Wenn Du die Antworten zu beiden Fragen kombinierst, hast Du dann ja alles, was Du brauchst – unabhängig davon, ob der Ansatz insgesamt sinnvoll ist oder nicht. Und ob das nun 1 Datensatz, 35 oder 350 sind, ist doch vollkommen egal. Für die Antwort hier (im Gegensatz zu meiner zweiten Antwort) ist sogar egal, ob ein Datensatz aus 1, 10 oder 100 Feldern/Daten besteht.
(23 Sep '15, 12:05)
saputello
Aber wenn ich die Daten aus dem Datensatz separiere und in die Variablen schreibe und sie dann wieder ausgebe, weiß das Programm doch gar nicht, welche Daten nun zusammengehören, also das der erste Wert aus dem ersten Datensatz auch in die erste Spalte der Tabelle ggehöert und der zweite Wert in die zweite Spalte und nicht z.B. in die zweite oder dritte Zeile.
(23 Sep '15, 12:31)
Snoopy EL
@Snoopy EL: ??? Du kannst beliebig viele Zeilen in der Tabelle hinzufügen. Jede Zelle einer Tabelle ist für sich eine Gruppe. Alle Zeilen werden nacheinander abgearbeitet. Da kommt nichts durcheinander.
(23 Sep '15, 12:42)
saputello
|
Hier mal ein Beispiel, wie man Befehle definieren kann, in deren Definition nicht Open in Online-Editor
\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 Im Beispiel müssen Natürlich wäre es auch in diesem Fall sinnvoller, die Umgebung Open in Online-Editor
\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 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?. 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. beantwortet 22 Sep '15, 08:40 saputello |
Ah, okay, danke, ich werde das erstmal so ausprobieren. Aber vielleicht hast Du recht mit der form. Kannst Du mir vielleicht eine Quelle nennen, wo ich mich da einlesen kann oder so, hab auf die Schnelle jetzt nichts gefunden und will ja auch nicht, dass Du mir jetzt meinen kompletten Code schreibst... :D :D
Ach so und noch eine Frage dazu, wenn ich die Werte row durch die ArgA usw ersetze, kann ich aber doch in der row weiterhin nur 9 Parameter weitergeben oder steh ich da jetzt grad aufm Schlauch...
Das Beispiel ist übrigens nicht lauffähig, sondern liefert einen Fehler!