Ich habe 3 Funktionen (alles funktioniert soweit)

alt text

Die Funktionen verwenden mehrfach die selben Hilfsgrößen

DayNo (Tagesnummer) verwendet: a, b, c, s, e, f DayName verwendet: a, b, c, s, e, f, g, d CW (Kalenderwoche) verwendet: a, b, c, s, e, f, g, d, n (alle Größen)

Frage: Das kann man doch sicher irgendwie zusammenfassen?

\def / \newcommand / \pgfmathsetmacro hat natürlich nicht funktioniert.

Öffne in Overleaf
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}

\begin{document}
\pgfmathtruncatemacro{\year}{2018}
\pgfmathtruncatemacro{\month}{10}
\pgfmathtruncatemacro{\day}{31}

\newcommand\Date{\year-\month-\day}
\def\Weekdayname{{"Montag","Dienstag","Mittwoch",
"Donnerstag","Freitag","Samstag","Sonntag"}}

% Kalenderwoche 
% https://www.tondering.dk/claus/cal/week.php
\pgfmathdeclarefunction{CW}{3}{% CW(year, month, day)
\pgfmathtruncatemacro{\a}{#2<3 ? #1-1 : #1}%
\pgfmathtruncatemacro{\b}{floor(\a/4)-floor(\a/100)+floor(\a/400)}%
\pgfmathtruncatemacro{\c}{floor((\a-1)/4)-floor((\a-1)/100)+floor((\a-1)/400)}%
\pgfmathtruncatemacro{\s}{\b-\c}%
\pgfmathtruncatemacro{\e}{#2<3 ? 0 : \s+1}%
%\f + 1 ist die Tagesnummer des Jahres
\pgfmathtruncatemacro{\f}{#2<3 ? 
#3-1+31*(\month-1) : #3+floor((153*(#2-3)+2)/5)+58+\s}%
%\pgfmathtruncatemacro{\f}{DayNo(\year,\month,\day)-1} % möglich
\pgfmathtruncatemacro{\g}{mod(\a+\b,7)}%
% \d ist die Tagesnamen-Nummer (0=Monday, 1=Tuesday, etc.)
\pgfmathtruncatemacro{\d}{mod(\f+\g-\e,7)}%
\pgfmathtruncatemacro{\n}{\f+3-\d}%
\pgfmathtruncatemacro{\CW}{\n<0 ? 53-floor((\g-\s)/5) : (
\n>(364+\s) ? 1 : floor(\n/7)+1)}%
\pgfmathparse{int(\CW)}%
}
\Date  $~\Rightarrow~$ \pgfmathparse{CW(\year,\month,\day)}Kalenderwoche \pgfmathresult

% Tagesnummer pgfmath
% https://www.tondering.dk/claus/cal/week.php
% https://texwelt.de/wissen/fragen/23485/
\pgfmathdeclarefunction{DayNo}{3}{% DayNo(year,month,day)
\pgfmathtruncatemacro{\a}{#2<3 ? #1-1 : #1}%
\pgfmathtruncatemacro{\b}{floor(\a/4)-floor(\a/100)+floor(\a/400)}%
\pgfmathtruncatemacro{\c}{floor((\a-1)/4)-floor((\a-1)/100)+floor((\a-1)/400)}%
\pgfmathtruncatemacro{\s}{\b-\c}%
\pgfmathtruncatemacro{\e}{#2<3 ? 0 : \s+1}%
\pgfmathtruncatemacro{\f}{#2<3 ? 
\day-1+31*(\month-1) : #3+floor((153*(#2-3)+2)/5)+58+\s}%
\pgfmathparse{int(\f+1)}
}
Tagesnummer zu \Date~ ist \pgfmathparse{DayNo(\year,\month,\day)}\pgfmathresult

% Tagesname
\pgfmathdeclarefunction{DayName}{3}{% CW(year, month, day)
\pgfmathtruncatemacro{\a}{#2<3 ? #1-1 : #1}%
\pgfmathtruncatemacro{\b}{floor(\a/4)-floor(\a/100)+floor(\a/400)}%
\pgfmathtruncatemacro{\c}{floor((\a-1)/4)-floor((\a-1)/100)+floor((\a-1)/400)}%
\pgfmathtruncatemacro{\s}{\b-\c}%
\pgfmathtruncatemacro{\e}{#2<3 ? 0 : \s+1}%
%\f + 1 ist die Tagesnummer des Jahres
\pgfmathtruncatemacro{\f}{#2<3 ? 
#3-1+31*(\month-1) : #3+floor((153*(#2-3)+2)/5)+58+\s}%
%\pgfmathtruncatemacro{\f}{DayNo(\year,\month,\day)-1} % möglich
\pgfmathtruncatemacro{\g}{mod(\a+\b,7)}%
% \d ist die Tagesnamen-Nummer (0=Monday, 1=Tuesday, etc.)
\pgfmathtruncatemacro{\d}{mod(\f+\g-\e,7)}%
%\pgfmathparse{int(\d)}% Day number
\pgfmathparse{\Weekdayname[\d]}% Day name
}
% \pgfmathparse{\Wochentagname[5]}\pgfmathresult
Das Datum \Date~ ist ein \pgfmathparse{DayName(\year, \month, \day)}\pgfmathresult

\end{document}

gefragt 02 Nov '18, 01:47

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 19 Feb '19, 08:04

saputello's gravatar image

saputello
11.1k174365

3

Was spricht gegen ein einfaches \newcommand? Übrigens habe ich glaube ich anderswo schon erwähnt, dass man Makronamen mit nur einem Buchstaben vermeiden sollte, da diese für die ganzen Akzente reserviert sind (\b, \c, \d) und dass man \day, \month und \year nicht überschreiben sollte, weil sonst das Datum im Rest des Dokuments nicht mehr stimmt.

(19 Feb '19, 04:15) Henri

Man kann dafür entgegen der Behauptung aus der Frage sehr gut \newcommand verwenden, indem man die gemeinsamen Teile der Formeln hierarchisch als Unterberechnungen definiert. Da im Beispiel die Berechnungen nicht in einem lokalen Kontext stattfinden, sollte man allerdings für alle mit \pgfmathtruncatemacro definierten Makros sicherstellen, dass sie nicht bereits anderweitig verwendet sind. Das ist auf zwei Arten möglich:

  • Verwendung von Makronamen, deren anderweitige Verwendung deutlich unwahrscheinlicher ist als \a, \b etc. Hier bietet sich beispielsweise ein Präfix an.
  • Vorausdefinition der Makros mit \newcommand, so dass ein Fehler gemeldet wird, falls der Makroname bereits anderweitig verwendet wird.

Im folgenden verwende ich den Präfix \DC (für date calculation). Dieser ist nicht so ganz 100% eindeutig, daher kombiniere ich das mit der \newcommand-Methode:

Öffne in Overleaf
\documentclass[margin=5mm, varwidth]{standalone}
\usepackage{tikz}

\newcommand*{\Year}{2018}
\newcommand*{\Month}{10}
\newcommand*{\Day}{31}

\newcommand*\Weekdayname{{"Montag","Dienstag","Mittwoch",
"Donnerstag","Freitag","Samstag","Sonntag"}}

\newcommand*{\DCa}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCb}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCc}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCd}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCe}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCf}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCg}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCs}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCn}{}% Sicherstellen, dass dieses Makro noch frei ist.
\newcommand*{\DCcommon}[3]{%
  \pgfmathtruncatemacro{\DCa}{#2<3 ? #1-1 : #1}%
  \pgfmathtruncatemacro{\DCb}{%
    floor(\DCa/4)-floor(\DCa/100)+floor(\DCa/400)
  }%
  \pgfmathtruncatemacro{\DCc}{%
    floor((\DCa-1)/4)-floor((\DCa-1)/100)+floor((\DCa-1)/400)
  }%
  \pgfmathtruncatemacro{\DCs}{\DCb-\DCc}%
  \pgfmathtruncatemacro{\DCe}{#2<3 ? 0 : \DCs+1}%
  \pgfmathtruncatemacro{\DCf}{#2<3 ? 
    #3-1+31*(#2-1) : #3+floor((153*(#2-3)+2)/5)+58+\DCs}%
}

\newcommand*{\DCcommonii}[3]{%
  \DCcommon{#1}{#2}{#3}%
  \pgfmathtruncatemacro{\DCg}{mod(\DCa+\DCb,7)}%
  % \d ist die Tagesnamen-Nummer (0=Monday, 1=Tuesday, etc.)
  \pgfmathtruncatemacro{\DCd}{mod(\DCf+\DCg-\DCe,7)}%
}

% Kalenderwoche 
% https://www.tondering.dk/claus/cal/week.php
\pgfmathdeclarefunction{CW}{3}{% CW(year, month, day)
  \DCcommonii{#1}{#2}{#3}%
  \pgfmathtruncatemacro{\DCn}{\DCf+3-\DCd}%
  \pgfmathtruncatemacro{\DCcw}{%
    \DCn<0 ? 53-floor((\DCg-\DCs)/5) : (\DCn>(364+\DCs) ? 1 : floor(\DCn/7)+1)
  }%
  \pgfmathparse{int(\DCcw)}%
}
\newcommand*{\CW}[3]{%
  \pgfmathparse{CW(#1,#2,#3)}\pgfmathresult
}

% Tagesnummer pgfmath
% https://www.tondering.dk/claus/cal/week.php
% https://texwelt.de/wissen/fragen/23485/
\pgfmathdeclarefunction{DayNo}{3}{% DayNo(year,month,day)
  \DCcommon{#1}{#2}{#3}%
  \pgfmathparse{int(\DCf+1)}%
}
\newcommand*{\DayNo}[3]{%
  \pgfmathparse{DayNo(#1,#2,#3)}\pgfmathresult
}

% Tagesname
\pgfmathdeclarefunction{DayName}{3}{% CW(year, month, day)
  \DCcommonii{#1}{#2}{#3}%
  \pgfmathparse{\Weekdayname[\DCd]}% Day name
}
\newcommand*{\DayName}[3]{%
  \pgfmathparse{DayName(#1,#2,#3)}\pgfmathresult
}

\begin{document}
\Year-\Month-\Day{} liegt in Kalenderwoche \CW\Year\Month\Day, ist der
\DayNo\Year\Month\Day. Tag des Jahres und ein \DayName\Year\Month\Day.
\end{document}

Ergebnis

Den \newcommand-Teil für \DCa bis \DCn könnte man sich sparen, indem man sicherstellt, dass die Berechnungen und damit die Definitionen lokal zu einer Gruppe ausgeführt werden. Dazu muss man nur drei der Makros ändern:

Öffne in Overleaf
\newcommand*{\CW}[3]{%
  \begingroup\pgfmathparse{CW(#1,#2,#3)}\pgfmathresult\endgroup
}
\newcommand*{\DayNo}[3]{%
  \begingroup\pgfmathparse{DayNo(#1,#2,#3)}\pgfmathresult\endgroup
}
\newcommand*{\DayName}[3]{%
  \begingroup\pgfmathparse{DayName(#1,#2,#3)}\pgfmathresult\endgroup
}

Würde man das als Paket datecalculation implementieren, würde man den Präfix \DC natürlich sinnvollerweise durch etwas wie \datecalc@ ersetzen und so die Chancen auf Eindeutigkeit weiter erhöhen. Da ich nebenbei auch noch für eine saubere Trennung von Definitionsteil (= Form) und Nutzung (= Inhalt) gesorgt habe, ist das Abtrennen als Paket ggf. denkbar einfach.

Permanenter link

beantwortet 19 Feb '19, 09:17

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 19 Feb '19, 10:08

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:

×19
×13

gestellte Frage: 02 Nov '18, 01:47

Frage wurde gesehen: 4,278 Mal

zuletzt geändert: 19 Feb '19, 10:13