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 \row bekomme. Ich hoffe, das war irgendwie verständlich für Euch und vielleicht habt ihr eine Idee und könnt mir da weiterhelfen.

gefragt 21 Sep '15, 09:03

Snoopy%20EL's gravatar image

Snoopy EL
1141813
Akzeptiert-Rate: 0%

bearbeitet 22 Sep '15, 09:13

saputello's gravatar image

saputello
11.1k174365

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

(21 Sep '15, 10:07) Snoopy EL

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...

(21 Sep '15, 10:16) Snoopy EL

Das Beispiel ist übrigens nicht lauffähig, sondern liefert einen Fehler!

(22 Sep '15, 07:55) saputello

Ich würde im Beispiel anregen, die Zeilen nicht per Befehl \row in die Tabelle zu schreiben, sondern direkt als Tabellenzeilen. Befehle zur Generierung von Tabellenzeilen sind nämlich keineswegs unkritisch. Zunächst wird so ein Befehl nämlich als Inhalt der ersten Spalte der neuen Tabellenzeile gelesen. Damit er mehr als eine Spalte generieren kann, sind diverse Bedingungen an ihn gestellt.

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 timesheet eine Umgebung und nicht einfach nur ein Befehl (ohne Argument) ist.

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.

Permanenter link

beantwortet 22 Sep '15, 08:54

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 23 Sep '15, 12:44

@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.
ich hoffe, ich hab das einigermaßen verständlich erklärt...

(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 #1#9 verwendet wird, um die Argumente anzugeben, sondern \ArgA\ArgZ:

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 \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.

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 der Umgebung einzufügen, sondern erst bei deren Verwendung als deren Inhalt anzugeben:

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 timesheet bei ihrer Verwendung kein Argument erhält, habe ich das Argument auch in der 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?.

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.

Permanenter link

beantwortet 22 Sep '15, 08:40

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 22 Sep '15, 13:02

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×257
×52
×18
×4

gestellte Frage: 21 Sep '15, 09:03

Frage wurde gesehen: 11,286 Mal

zuletzt geändert: 23 Sep '15, 12:44