Verschachtelte if-then-else Struktur in LaTeX?

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


talueng
Forum-Anfänger
Forum-Anfänger
Beiträge: 39
Registriert: Mo 31. Mai 2010, 13:32

Verschachtelte if-then-else Struktur in LaTeX?

Beitrag von talueng »

Ich benötige einen Befehl, der mir von zwei Zeitangaben im Format HH:MM die Differenz berechnet im Format HH Stunden, MM Minuten, also z.B.

Beginn 10:30
Ende 12:15
Differenz 1 Stunde, 45 Minuten

Ich habe dank Google dazu auch fertigen LaTeX-Code gefunden und war in der Lage, diesen etwas meinen Bedürfnissen anzupassen. Leider komme ich aber an der Stelle nicht weiter, wo man folgende Fallunterscheidungen machen müsste:
- Wenn 1 Stunde, dann "Stunde" sonst "Stunden" schreiben
- Wenn 1 Minute, dann "Minute" sonst "Minuten" schreiben
- Wenn 0 Stunden, dann ganz weglassen
- Wenn 0 Minuten, dann ganz weglassen

Leider habe ich mit if-then-else-Strukturen in LaTeX keine Erfahrung. Vielleicht kann jemand von Euch helfen. Hier der Code:
% function to compute the difference between two times hh:mm
\newcount\hours
\newcount\minutes
%
\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}
%
\newcommand{\sub}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}%
\expandafter\gettime#2\relax{\subhrs}{\submins}%
\hours=\hrs\relax
\advance\hours by -\subhrs\relax
\minutes=\mins\relax
\advance\minutes by -\submins\relax
\ifnum\minutes>59\relax
\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi
\ifnum\hours>23\relax
\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi
\ifnum\hours>0\relax
\ifnum\minutes<10\relax
\xdef#1{\number\hours\,Stunden, 0\number\minutes\,Minuten}%
\else
\xdef#1{\number\hours\,Stunden, \number\minutes\,Minuten}%
\fi
\fi
\ifnum\hours=0\relax
\ifnum\minutes<10\relax
\xdef#1{0\number\minutes\,Minuten}%
\else
\xdef#1{\number\minutes\,Minuten}%
\fi
\fi
}
[/code]

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2525
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

\ifthenelse

Beitrag von Stefan Kottwitz »

Hallo talueng,

willkommen im Forum!
Du könntest das ifthen-Paket verwenden, das bietet einen Befehl \ifthenelse.

Viele Grüße,

Stefan

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Angesichts der bereits im Code-Schnippsel vorgeführten Fallunterscheidungen (bezüglich größer Null und kleiner zehn) ist die Lösung eigentlich naheliegend. Folgende Änderung bei den 14 Zeilen vor der schließenden geschweiften Klammer am Ende:
\ifnum\hours>0\relax
\ifnum\minutes<10\relax
\xdef#1{\number\hours\,Stunde\ifnum\hours=1\relax\else n\fi, 0\number\minutes\,Minute\ifnum\minutes=1\relax\else n\fi}%
\else
\xdef#1{\number\hours\,Stunde\ifnum\hours=1\relax\else n\fi, \number\minutes\,Minute\ifnum\minutes=1\relax\else n\fi}%
\fi
\fi
\ifnum\hours=0\relax
\ifnum\minutes<10\relax
\xdef#1{0\number\minutes\,Minute\ifnum\minutes=1\relax\else n\fi}%
\else
\xdef#1{\number\minutes\,Minute\ifnum\minutes=1\relax\else n\fi}%
\fi
\fi
Das ganze ist mangels vollständigen Minimalbeispiels (← dies ist ein geprüfter Link mit relevanten Informationen!) ungetestet.

talueng
Forum-Anfänger
Forum-Anfänger
Beiträge: 39
Registriert: Mo 31. Mai 2010, 13:32

Beitrag von talueng »

Danke Euch beiden! Hatte mir dann zunächst das o.g. Paket angeguckt, das mir aber Fehler geschmissen hat. Anschließend habe ich mir nochmals genau den Code angeguckt und irgendwann dann auch den \ifnum-Befehl verstanden und bin damit zu einer eigenen Lösung gekommen.

Für Interessierte die Lösung untenstehend.
% function to compute the difference between two times hh:mm
\newcount\hours
\newcount\minutes
%
\def\gettime#1:#2\relax#3#4{\def#3{#1}\def#4{#2}}
%
\newcommand{\sub}[2]{\expandafter\gettime#1\relax{\hrs}{\mins}%
\expandafter\gettime#2\relax{\subhrs}{\submins}%
\hours=\hrs\relax
\advance\hours by -\subhrs\relax
\minutes=\mins\relax
\advance\minutes by -\submins\relax
\ifnum\minutes>59\relax
\advance\minutes by -60\relax
\advance\hours by 1\relax
\else
\ifnum\minutes<0\relax
\advance\minutes by 60\relax
\advance\hours by -1\relax
\fi
\fi
\ifnum\hours>23\relax
\advance\hours by -24\relax
\else
\ifnum\hours<0\relax
\advance\hours by 24\relax
\fi
\fi

\ifnum\hours>0\relax
  \ifnum\hours=1\relax
    % 1 Stunde
    \ifnum\minutes<10\relax
      \ifnum\minutes=0\relax
        \xdef#1{\number\hours\,Stunde}%
      \else
        \ifnum\minutes=1\relax
          \xdef#1{\number\hours\,Stunde, 0\number\minutes\,Minute}%
        \else
          \xdef#1{\number\hours\,Stunde, 0\number\minutes\,Minuten}%
        \fi
      \fi
    \else
      \xdef#1{\number\hours\,Stunde, \number\minutes\,Minuten}%
    \fi
  \else
    % x Stunden
    \ifnum\minutes<10\relax
      \ifnum\minutes=0\relax
        \xdef#1{\number\hours\,Stunden}%
      \else
        \ifnum\minutes=1\relax
          \xdef#1{\number\hours\,Stunden, 0\number\minutes\,Minute}%
        \else
          \xdef#1{\number\hours\,Stunden, 0\number\minutes\,Minuten}%
        \fi
      \fi
    \else
      \xdef#1{\number\hours\,Stunden, \number\minutes\,Minuten}%
    \fi
  \fi
\else
  \ifnum\minutes<10\relax
	  \ifnum\minutes=1\relax
	    \xdef#1{0\number\minutes\,Minute}%
	  \else
	    \xdef#1{0\number\minutes\,Minuten}%
	  \fi
	\else
	  \xdef#1{\number\minutes\,Minuten}%
	\fi
\fi
}

Antworten