Verwendung von babel und datetime in scrlttr2 schlägt fehlt

Klassen und Pakete zur einfachen Umsetzung individueller Vorstellungen


godi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 75
Registriert: Mi 11. Feb 2015, 13:49

Verwendung von babel und datetime in scrlttr2 schlägt fehlt

Beitrag von godi »

Hallo,

ich will in einem scrlttr2 Dokument babel mit der Option ngerman und datetime verwenden.
Leider schlägt dies fehl. Folgende Fehlermeldung wird ausgegeben:
! TeX capacity exceeded, sorry [input stack size=5000].
\sym@date ->\if@orgdate \sym@date
\else \num@date \fi
l.32 \opening{Dear Recruiter,}
Das ganze hört sich nach einem rekursiven Aufruf an der nicht abgebrochen wird. Jedoch verstehe ich nicht wo und warum.

Hier ist ein Beispiel das diesen Fehler auslöst:
\documentclass[]{scrlttr2}
\usepackage{blindtext} 

% babel und datetime in Kombination mit scrlttr2 ergibt einen Fehler:
% ! TeX capacity exceeded, sorry [input stack size=5000].
% \sym@date ->\if@orgdate \sym@date
% \else \num@date \fi
% l.32 \opening{Dear Recruiter,}
\usepackage[ngerman]{babel}
\usepackage{datetime}

\setkomavar{subject}{Cover Letter}

\newdate{testDate}{10}{3}{2015}

\begin{document}

\begin{letter}{%
HR Dept. --- Corporation\\%
123 Pleasant Lane\\%
12345 City, State%
}

\opening{Dear Recruiter,}
\blindtext[1]
\closing{See you on \displaydate{testDate}}

\end{letter}
\end{document}

Hat jemand eine Idee wie ich den Fehler beseitige bzw umgehen kann?

godi

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Die beiden Pakete treten sich komplett auf die Füße.

scrlttr2 fügt das hier an \datengerman an:
\let\sym@date=\today%
      \def\num@date{#2}%
      \def\today{\if@orgdate\sym@date\else\num@date\fi}%
Dieser Code geht implizit davon aus, dass davor in \datengerman ein \def\today{...} steht, und \let\sym@date diese Definition kopiert. datetime fügt dort aber nur eine Definition von \formatdate ein, und damit bekommt man eine Schleife, wenn \datengerman mehrmals aufgerufen wird.

Ich bin mir nicht sicher, wer das korrigieren sollte. Ich neide zu datetime: dort könnte einfach vor in jedem \dateXXX-Befehl noch die \today-Definition hinzufügt werden. Du könntest ja mal Nicola Talbot anschreiben.

godi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 75
Registriert: Mi 11. Feb 2015, 13:49

Beitrag von godi »

Danke für deine Bemühungen!

Ich habe Nicola Talbot angeschrieben.
Mal sehen ob was zurückkommt.

Aber bis dahin werde ich wohl keine Möglichkeit haben dies zu umgehen, oder?

Zu dem @ Operator:
Da habe ich mich schon öfters gefragt was der macht, habe aber noch keine Erklärung gefunden.
Ich habe den schon an erster Position des Kommandonamen gesehen (\@name) als auch wie hier mitten im Namen.

Gibt es dazu einen Wikieintrag den ich noch nicht gefunden habe oder sonstige Infos dazu? Habe leider noch nichts sinnvolles gefunden.

godi

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

@ ist kein Operator. Befehlsnamen bestehen auch einem Backslash \ + Buchstaben. Was dabei ein "Buchstabe" ist, ist in TeX nicht fest vorgegeben und kann jederzeit geändert werden.

Normalerweise sind in Dokumenten a-z und A-Z Buchstaben,
in Paketen a-z, A-Z + @,
und in expl3-Paketen (z.B. siunitx) a-z, A-Z, _ und :.

godi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 75
Registriert: Mi 11. Feb 2015, 13:49

Beitrag von godi »

Danke für deine Ausführung.

Habe soeben eine Antwort bekommen:
it looks as though babel has changed so that it now sets the date formats at the beginning of the document instead of when it's loaded. This means it's now overriding datetime's definitions. A fix is to save and restore the definition of \today:
\documentclass[]{scrlttr2}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage{datetime}
\let\orgtoday\today % save datetime's version of \today

\setkomavar{subject}{Cover Letter}

\newdate{testDate}{10}{3}{2015}

\begin{document}
\let\today\orgtoday % restore datetime's version of \today

\begin{letter}{%
HR Dept. --- Corporation\\%
123 Pleasant Lane\\%
12345 City, State%
}

\opening{Dear Recruiter,}
\blindtext[1]
\closing{See you on \displaydate{testDate}}

\end{letter}
\end{document}

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

Da irrt sich Nicola. babel ist nicht das Problem, sondern die Klasse, mit scrartcl oder article gibt es keine Probleme. Und ihr Fix hilft auch nur temporär:
\documentclass[]{scrlttr2}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage{datetime}
\let\orgtoday\today % save datetime's version of \today
\newdate{testDate}{10}{3}{2015}
\begin{document}
\let\today\orgtoday 
\selectlanguage{ngerman}
\selectlanguage{ngerman} %Problem
\today

\end{document} 
Ein besserer Fix wäre sowas:
\documentclass[]{scrlttr2}
\usepackage{blindtext}

\usepackage[ngerman]{babel}
\usepackage{datetime}
\let\orgtoday\today % save datetime's version of \today
\pretocmd\datengerman{\def\today{\orgtoday}}{}{}

\newdate{testDate}{10}{3}{2015}

\begin{document}

\selectlanguage{ngerman}
\selectlanguage{ngerman}
\today

\end{document} 
Aber im Prinzip muss man das für jede Sprache machen.

godi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 75
Registriert: Mi 11. Feb 2015, 13:49

Beitrag von godi »

Danke für deinen besseren Fix!

Ich habe gerade ein wenig nachgelesen ob es möglich ist Kommandos erst zur Laufzeit zusammenzustellen. So könnte es für jede Sprache umgesetzt werden. Gefunden habe ich \csname, was jedoch in dieser Konstellation nicht funktioniert.
\let\orgtoday\today
\pretocmd {\csname date\languagename \endcsname} {\def\today{\orgtoday}}{}{}
Bei einfachen Sachen funktioniert dies super:
\newcommand* \testngerman {It works}
\newcommand* {\test} {\csname test\languagename \endcsname}

Benutzeravatar
u_fischer
Forum-Meister
Forum-Meister
Beiträge: 4267
Registriert: Do 22. Nov 2012, 11:09
Kontaktdaten:

Beitrag von u_fischer »

\expandafter\pretocmd \csname date\languagename \endcsname{\def\today{\orgtoday}}{}{} 
\cspreto{date\languagename}{\def\today{\orgtoday}} müsste auch gehen. (siehe Doku von etoolbox)

godi
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 75
Registriert: Mi 11. Feb 2015, 13:49

Lösung

Beitrag von godi »

Hallo,

ja dein Lösungsvorschlag funktioniert auch mit etoolbox. :)

Hier nochmal ein Beispiel mit Lösung, falls es jemand benötigt:
\documentclass[]{scrlttr2}
\usepackage{blindtext} 

\usepackage[ngerman]{babel}
\usepackage{datetime}
\usepackage{etoolbox}


% Workaround für Fehler bei Verwendung von datetime in Kombination mit scrlttr2
\let\orgtoday\today
% Lösung ohne etoolbox
\expandafter\pretocmd \csname date\languagename \endcsname{\def\today{\orgtoday}}{}{} 
% Lösung mit etoolbox
%\cspreto{date\languagename}{\def\today{\orgtoday}}


\setkomavar{subject}{Cover Letter}

\newdate{testDate}{10}{3}{2015}

\begin{document}

\begin{letter}{%
HR Dept. --- Corporation\\%
123 Pleasant Lane\\%
12345 City, State%
}

\opening{Dear Recruiter,}
\blindtext[1]
\closing{See you on \displaydate{testDate}}

\end{letter}
\end{document}
godi

Antworten