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
Code, hier editierbar zum Übersetzen:
\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)}%
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

gefragt 02 Nov '18, 01:47

cis's gravatar image

cis
9.6k104461491
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
Code, hier editierbar zum Übersetzen:
\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
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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
Code, hier editierbar zum Übersetzen:
\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
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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 ausblenden]

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

Frage-Themen:

×19
×13

gestellte Frage: 02 Nov '18, 01:47

Frage wurde gesehen: 4,512 Mal

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