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 01 Nov '18, 20:47

cis's gravatar image

cis
9.2k19196319
Akzeptiert: 62%

bearbeitet 19 Feb, 02:04

saputello's gravatar image

saputello
10.4k73659

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.

(18 Feb, 22:15) Henri
1

~ gefolgt von einem Leerzeichen ergibt übrigens zwei Leerzeichen, wobei das erste keinen Umbruch erlaubt. Du meinst vermutlich „\Date{} “ oder „\Date\ ” statt „\Date~ “.

(19 Feb, 04:11) Ijon Tichy

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, 03:17

Ijon%20Tichy's gravatar image

Ijon Tichy
8.7k31022

bearbeitet 19 Feb, 04:08

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×16
×12

Frage gestellt: 01 Nov '18, 20:47

Frage wurde angeschaut: 739 Mal

Zuletzt aktualisiert: 19 Feb, 04:13