Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
no comment

19 Feb '19, 10:08

gast3's gravatar image

gast3
(ausgesetzt)

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: \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}{ \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][1]][1] 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: \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. [1]: https://texwelt.de/wissen/upfiles/test_20190219_084406.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

19 Feb '19, 09:48

gast3's gravatar image

gast3
(ausgesetzt)

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: \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][1]][1] 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: \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. 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. [1]: https://texwelt.de/wissen/upfiles/test_20190219_084406.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

19 Feb '19, 09:28

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

19 Feb '19, 09:17

gast3's gravatar image

gast3
(ausgesetzt)

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×