Hallo, ich erzeuge ein Dokument und habe folgende Ausgangssituation.

Open in Online-Editor
\documentclass[10pt,a4paper]{article}
\usepackage{longtable}

\newcommand{\row}[9]{#1 & #2 & #3 & #4 & #5 & #6 & #7 & #8 & #9 \\ }       
%Tabellenzeile (Tag, Art, Kommen, Gehen, Kommen, Gehen, Std., Tage, Projekt

\newenvironment{timesheet}[1]
{\begin{longtable}{lllllllll}   
\multicolumn{2}{c}{} & \multicolumn{2}{c}{Arbeitszeit}& \multicolumn{2}{c}{Pausenzeit}                   \\[2ex]

Tag  & Art   & Kommen    & Gehen & Kommen    & Gehen     & Std       & Tage  & Projekt   \\[2ex]

\endhead

\row{Freitag, 01.05.2015}{U}{08:00}{17:00}{12:00}{13:00}{8,00}{1,00}{BMW}

\hline

}{\end{longtable}}

\begin{document}

\begin{timesheet}

\end{timesheet}

\end{document}

Ich bekomme die Daten für row von einem anderen Programm übergeben, allerdings werden wie bei "Tag" zu sehen, der Wochentag und das Datum gemeinsam kommasepariert in einem Parameter übergeben.

Ich würde gern wissen, wie ich diese nun trennen und in einzelnen Spalten (Tag UND Datum) darstellen?

Sollte etwas nicht verständlich sein, bitte gern fragen. :)

gefragt 22 Sep '15, 11:04

Snoopy%20EL's gravatar image

Snoopy EL
1141813
Akzeptiert-Rate: 0%

bearbeitet 22 Sep '15, 11:30

Wenn Du schon danach fragst: Warum kann das Programm die \row-Anweisung nicht direkt als Tabellenzeile mit & als Spaltentrenner erzeugen? Das wäre doch die einfachste Lösung.

Warum wird ein Umgebung definiert, die gar keinen Inhalt hat, statt die \row-Anweisungen (oder direkt die Tabellenzeilen) als Inhalt einer Umgebung (sei es eine entsprechend definierte timesheet oder ein allgemeinere Tabelle) zu verwenden?

(22 Sep '15, 11:11) saputello
2

Dein Beispiel ist doch Quatsch. Du definierst row mit 9 Argumenten und benutzt dann nur 6. Und die Tabelle hat mit der Frage gar nichts zu tun. Nur wer deine früheren Fragen gesehen hat, versteht vielleicht was das soll. Warum investierst du nicht ein paar Minuten und machst ein besseres Beispiel?

(22 Sep '15, 11:12) Ulrike Fischer

Saputello, ich muss die Daten so in eine Tabellenzeile verpacken, dass später die Darstellung auch noch veränderbar ist. Die einzelnen Werte stehen zwar fest, aber wir geben jetzt erstmal vor, sie in einer Tabelle darzustellen, es kann aber sein, dass jemand das später anders haben möchte. Deshalb definiere ich die Anweisung mitsamt Spaltentrenner bereits im newcommand.

Vielleicht versteif ich mich gerade zu sehr auf mein Beispiel und auf das, was ich schon so probiert habe und es gibt einen viel besseren Ansatz, den ich nur nicht sehe... :-(

(22 Sep '15, 11:21) Snoopy EL

Du verwendest aber gerade kein \newcommand, sondern völlig unsinnig ein \newenvironment. Ich habe deshalb die Frage etwas allgemeiner aufgefasst und entsprechend beantwortet. Dass das u. U. gar keine Tabelle werden soll, wäre ein Grund mehr, das Problem allgemeiner anzugehen. Auch dann wäre es sinnvoller, \row in die Umgebung (statt in ihre Definition) zu schreiben und eben ggf. die Umgebung anders zu definieren. Dabei würde dann ggf. auch die Umgebung die Definition von \row vorgeben. So wie jetzt ist es wirklich nicht sinnvoll!

(22 Sep '15, 11:37) saputello

Vielleicht versteh ich Dich falsch oder meinen Code, aber ich definiere doch über das newcommand die row und definiere dann per newenvironment die Umgebung in der row dann verwendet werden soll, in diesem Fall eben die longtable.

Oder bin ich jetzt völlig auf dem falschen Dampfer und hab das Prinzip einfach noch nicht verstanden..?? :-(

(22 Sep '15, 12:02) Snoopy EL

Ja, Du hast das Prinzip nicht verstanden. Umgebungen definiert man dann, wenn deren Inhalt, also das zwischen \begin{foo} und \end{foo} in spezieller Weise formatiert werden soll. Du hast aber gar keinen Inhalt in timesheet. Damit ist es unsinnig an der Stelle eine Umgebung zu verwenden!

(22 Sep '15, 12:23) saputello

Okay, soweit kann ich Dir folgen und es klingt so, als wäre es genau das, was ich ja machen will mit den Daten, die ich von extern bekomme. Könntest Du mir dafür einen besseren Ansatz verraten oder bräuchtst Du dafür mehr Infos...?! Ich will mich hier einfach nicht noch mehr verzetteln, nachher weiss ich gar nicht mehr weiter, auch wenn ihr mir hier echt schon super geholfen habt, bei dem ein oder anderen Problem. :)

(22 Sep '15, 12:33) Snoopy EL

Ich habe Dir bereits im zweiten Beispiel einer meiner Antworten auf Deine andere Frage zu dem Thema gezeigt, wie man eine Umgebung richtig einsetzt. Du kannst dort statt der einzelnen Befehle für jede Spalte auch einen Befehl einsetzen, der die ganze Zeile generiert. Ein entsprechendes Beispiel habe ich nun in der zweiten Antwort zum Verständnis noch ergänzt. Wobei das, wie mehrfach erwähnt, nicht ideal wäre und bei komplexeren Befehlen auch einmal daneben geht.

(22 Sep '15, 12:42) saputello

Mir ist übrigens gerade noch ein Fehler in Deinem Code aufgefallen. timesheet wird bei Dir als Umgebung mit einem obligatorischen Argument definiert. Du verwendest aber gar kein Argument beim Aufruf. Das passt nicht zusammen! Vielleicht solltest Du Dich einmal etwas grundlegender mit den Prinzipien von LaTeX und der Definition eigener Befehle und Umgebungen befassen. Für so etwas reicht eine Kurzeinführung eher nicht. Manche ausführliche Einführung behandelt das wenigstens etwas.

(22 Sep '15, 12:54) saputello
2

Ich verstehe dich nicht. Warum benutzt du erzeugst du nicht eine normale csv-Datei aus deinen Daten und benutzt dann datatool?

(22 Sep '15, 13:02) Ulrike Fischer

Ulrike Fischer: Das ist ja nett gemeint, mit der Idee einer CSV-Datei, aber dafür reicht mein Wissen dann doch nicht. Ich denke ich werde saputellos Rat befolgen, mich noch einmal in Ruhe mit dem ganzen Thema befassen und nochmal ganz von vorn anfangen. Trotzdem danke für Eure Hilfe!

(23 Sep '15, 08:45) Snoopy EL

@Snoopy EL: Wenn Du andere Leute als den Verfasser der Frage oder Antwort direkt ansprechen willst, solltest Du den @ Operator verwenden und beispielsweise @Snoopy EL schreiben.

Zum Thema datatool gibt es bereits einige Beiträge hier auf TeXWelt.

(23 Sep '15, 09:27) saputello

@Snoopy EL: Wissen kann man sich aneignen. datatool hat eine Dokumentation mit diversen Beispielen.

(23 Sep '15, 10:23) Ulrike Fischer

@Ulrike Fischer, nach Rücksprache mit Kollegen ist die CSV-Variante keine Alternative für uns.

(23 Sep '15, 11:54) Snoopy EL
1

Ich habe ja stark den Verdacht, dass die Kollegen einfach zu faul sind, einen Report/Export zu erstellen, der die Daten so liefert, wie sie für Dich günstig wären. Stattdessen laden sie die Arbeit, die Daten nachträglich so umzuformen, wie sie benötigt werden, auf das Satzbackend und denjenigen ab, der das programmieren soll. Das ist zwar verständlich, aber in der Tat nicht wirklich sinnvoll. Ulrikes Anregung mit CSV und datatool ist dabei bereits ein Kompromiss, allerdings ein sehr guter, da er sehr universell ist. Er bietet u. a. die Möglichkeit nur die gewünschten Felder auszugeben.

(23 Sep '15, 12:00) saputello
Ergebnis 5 von 15 show 10 more comments

Allgemein kann man Argumente auch als delimited arguments, also als Argumente mit einem Begrenzer definieren. Das geht allerdings nicht auf LaTeX-Ebene, sondern nur auf TeX-Ebene:

Open in Online-Editor
\documentclass{standalone} 
\makeatletter
\newcommand*\TagUndDatum[1]{\expandafter\@TagUndDatum#1\@nil}
\newcommand*\@TagUndDatum{}% sichergehen, dass nichts umdefiniert wird
\def\@TagUndDatum#1,#2\@nil{Argument 1: #1, Argument 2: #2}
\makeatother
\begin{document}
\TagUndDatum{Freitag, 01.05.2015}
\makeatother
\end{document}

Schaut man ganz genau hin, dann ist hier allerdings am Anfang von Argument 2 noch ein zusätzliches Leerzeichen. Das kommt daher, dass eben im Argument nach dem Komma auch noch ein solches steht. Um das los zu werden, muss man es zum Teil der Begrenzung des ersten Argument machen von \@TagUndDatum machen:

Open in Online-Editor
\documentclass{standalone} 
\makeatletter
\newcommand*\TagUndDatum[1]{\expandafter\@TagUndDatum#1\@nil}
\newcommand*\@TagUndDatum{}% sichergehen, dass nichts umdefiniert wird
\def\@TagUndDatum#1, #2\@nil{Argument 1: #1, Argument 2: #2}
\makeatother
\begin{document}
\TagUndDatum{Freitag, 01.05.2015}
\end{document}

Dann muss allerdings auch sichergestellt sein, dass dieses Leerzeichen immer vorhanden ist. Sollte man das nicht sicherstellen können, so kann man beispielsweise xstring verwenden, um einen entsprechenden Test einzubauen:

Open in Online-Editor
\documentclass{article} 
\usepackage{xstring}
\makeatletter
\newcommand*\TagUndDatum[1]{\expandafter\@TagUndDatum#1\@nil}
\newcommand*\@TagUndDatum{}% sichergehen, dass nichts umdefiniert wird
\def\@TagUndDatum#1,#2\@nil{Argument 1: #1, Argument 2: \IfBeginWith{#2}{ }{\StrGobbleLeft{#2}{1}}{#2}}
\makeatother
\begin{document}
\TagUndDatum{Freitag, 01.05.2015}

\TagUndDatum{Freitag,01.05.2015}
\end{document}

Das Paket bietet übrigens auch selbst bereits eine Möglichkeit, Strings anhand anderer Strings (beispielsweise einem Komma) zu unterteilen. Näheres dazu verrät die Anleitung.

Open in Online-Editor
\documentclass{standalone} 
\usepackage{xstring}
\newcommand*\TagUndDatum[1]{\StrSubstitute{#1}{, }{&}}
\begin{document}
\begin{tabular}{ll}
\TagUndDatum{Freitag, 01.05.2015}\\
\end{tabular}
\end{document}

Was hier im einfachen Beispiel funktioniert, kann bei komplexeren Anwendungen allerdings auch schon einmal problematisch werden und zu noalign-Fehlern führen.

Permanenter link

beantwortet 22 Sep '15, 11:33

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 22 Sep '15, 11:47

@saputello, könntest Du mir vielleicht noch erklären, was genau der Befehl @nil in Deinem ersten Beispiel macht?!

(25 Sep '15, 12:12) Snoopy EL

@Snoopy EL: Genau dasselbe wie das Komma bzw. das Komma gefolgt von einem Leerzeichen: Es begrenzt das Argument, in dem Fall nach hinten. Ohne das, wäre #2 kein delimited Argument und daher bestünde #2 nur aus dem ersten Zeichen nach der Begrenzung des ersten Arguments.

(25 Sep '15, 12:39) saputello
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:

×254
×4

gestellte Frage: 22 Sep '15, 11:04

Frage wurde gesehen: 8,362 Mal

zuletzt geändert: 25 Sep '15, 12:39