Ein Befehl soll ein Zeitintervall mit Anfangs- und Endzeitpunkt ausgeben. Der Endzeitpunkt wird als Argument übergeben. Die Länge des Zeitintervalls in Minuten ist als globale Variable gespeichert. Es kommt expl3 zum Einsatz. Wie kann der Anfangszeitpunkt berechnet werden?

Öffne in Overleaf
\documentclass{article}
\usepackage{xparse}
\usepackage{datetime2}

\ExplSyntaxOn

\int_const:Nn \c_meinmodul_dauer_int {20}

\NewDocumentCommand \Zeitintervall {m}
    {
        \str_set:Nx \l_tmpa_str {#1\c_colon_str 00}
        \DTMsavetime{l_meinmodul_endzeit}{\l_tmpa_str}

        Das~Zeitintervall~ist~\int_use:N \c_meinmodul_dauer_int ~
        Minuten~lang~und~dauert~von~<Anfangszeitpunkt>~
        bis~\DTMusetime{l_meinmodul_endzeit}.
    }

\ExplSyntaxOff

\begin{document}

\Zeitintervall{15:10}

\end{document}

gefragt 04 Mai '18, 13:47

Cletus's gravatar image

Cletus
1.4k14258
Akzeptiert-Rate: 83%


Das ist eigentlich simple Mathematik. Im folgenden Beispiel mache ich mir das Leben etwas leichter, indem ich davon ausgehe, dass der Zeitunterschied maximal 24 Stunden beträgt:

Öffne in Overleaf
\documentclass{article}
\usepackage{xparse}
\usepackage{datetime2}

\ExplSyntaxOn

\int_const:Nn \c_meinmodul_dauer_int {20}
\int_new:N \l__meinmodul_hours_int
\int_new:N \l__meinmodul_minutes_int
\int_new:N \l__meinmodul_diffhours_int
\int_new:N \l__meinmodul_diffminutes_int

\NewDocumentCommand \Zeitintervall {m}
    {
        \str_set:Nx \l_tmpa_str {#1\c_colon_str 00}
        \DTMsavetime{l_meinmodul_endzeit}{\l_tmpa_str}
        \int_set:Nn \l__meinmodul_hours_int { \DTMfetchhour {l_meinmodul_endzeit} }
        \int_set:Nn \l__meinmodul_minutes_int { \DTMfetchminute {l_meinmodul_endzeit} }
        \int_set:Nn \l__meinmodul_diffhours_int { \int_eval:n { \c_meinmodul_dauer_int / 60 } }
        \int_set:Nn \l__meinmodul_diffminutes_int { \int_eval:n { \c_meinmodul_dauer_int - \l__meinmodul_diffhours_int * 60 } }
        \int_sub:Nn \l__meinmodul_minutes_int \l__meinmodul_diffminutes_int
        \int_compare:nNnT \l__meinmodul_minutes_int < { 0 }
          { 
            \int_decr:N \l__meinmodul_hours_int
            \int_add:Nn \l__meinmodul_minutes_int { 60 }
          }
        \int_sub:Nn \l__meinmodul_hours_int \l__meinmodul_diffhours_int
        \int_compare:nNnT \l__meinmodul_hours_int < { 0 }
          { \int_add:Nn \l__meinmodul_hours_int { 24 } }
        \str_set:Nx \l_tmpa_str { \int_use:N \l__meinmodul_hours_int \c_colon_str \int_use:N \l__meinmodul_minutes_int \c_colon_str 00}
        \DTMsavetime{l_meinmodul_anfangszeit}{\l_tmpa_str}

        Das~Zeitintervall~ist~\int_use:N \c_meinmodul_dauer_int ~
        Minuten~lang~und~dauert~von~\DTMusetime{l_meinmodul_anfangszeit}~
        bis~\DTMusetime{l_meinmodul_endzeit}.
    }

\ExplSyntaxOff

\begin{document}

\Zeitintervall{15:10}

\end{document}
Permanenter link

beantwortet 04 Mai '18, 17:36

Ijon%20Tichy's gravatar image

Ijon Tichy
9.6k31227
Akzeptiert-Rate: 53%

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:

×2
×1

gestellte Frage: 04 Mai '18, 13:47

Frage wurde gesehen: 1,478 Mal

zuletzt geändert: 04 Mai '18, 17:36