Verwendung von babel und datetime in scrlttr2 schlägt fehlt

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Verwendung von babel und datetime in scrlttr2 schlägt fehlt

Lösung

von godi » Mo 2. Mär 2015, 12:58

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

von u_fischer » Mo 2. Mär 2015, 12:29

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

von godi » So 1. Mär 2015, 21:30

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}

von u_fischer » So 1. Mär 2015, 17:26

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.

von godi » So 1. Mär 2015, 17:07

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}

von u_fischer » So 1. Mär 2015, 16:31

@ 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 :.

von godi » So 1. Mär 2015, 16:18

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

von u_fischer » So 1. Mär 2015, 15:43

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.

Verwendung von babel und datetime in scrlttr2 schlägt fehlt

von godi » So 1. Mär 2015, 13:23

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

Nach oben