Sie sind hier

Eigene Koma-Variable löschen

Eine selbstdefinierte mit \setkomavar{foo}{bar} besetzte Variable lässt sich mit \setkomavar{foo}{} nicht mehr löschen.

Hallo.

In meinem scrlttr2-Template möchte ich für verschiedene Sprachen gerüstet sein. Außerdem definiere ich eigene Variablen wie frommobile.

Beispiel-Code:

\documentclass[ngerman]{scrlttr2}
\usepackage{babel}
\usepackage{lipsum}

\newkomavar{frommobile}
\newkomavar{mobileseparator}
\setkomavar{mobileseparator}{\usekomavar{phoneseparator}}
\setkomavar*{frommobile}{\usekomavar*{mobileseparator}\usekomavar{mobileseparator}}

\setkomavar{fromemail}{peter@pan.invalid}

\setkomavar{frommobile}{+49\,179~459xxxx}       % default
\setkomavar*{mobileseparator}{Mobile}           % default
\AfterPackage*{babel}{
    \addto{\extrasngerman}{
        \setkomavar{frommobile}{0179~459xxxx}
        \setkomavar*{mobileseparator}{Mobil}}
}
\newcommand*{\FootTab}{}
\makeatletter%
\ifkomavarempty{frommobile}{}{%
    \l@addto@macro\FootTab{\usekomavar*{frommobile}&\usekomavar{frommobile}\\}%
}%
\ifkomavarempty{fromemail}{}{%
    \l@addto@macro\FootTab{\usekomavar*{fromemail}&\usekomavar{fromemail}\\}%
}%
\makeatother
\firstfoot{\hfill
    \begin{tabular}[t]{ll}
        \FootTab
    \end{tabular}
}

\begin{document}
\begin{letter}{Peter Pan\\Nimmerland}
\opening{Hallo Peter,}
    \lipsum
\closing{Mit bester Empfehlung}
\end{letter}
\end{document}

Dabei definiere ich zuerst die internationale Form als Standard. Andere Sprachen werden erneut definiert, oder aber wieder gelöscht:

Problem:
Mit \setkomavar{fromemail}{} kann ich die Variable löschen, und \ifkomavarempty lässt die Zeile aus. Ok. Aber mit der eigenen Variable \setkomavar{frommobile}{} wird \ifkomavarempty trotzdem FALSE, und es bleibt immer eine Leerzeile stehen, auch wenn ich die Bezeichnung lösche:

\AfterPackage*{babel}{
    \addto{\extrasngerman}{
        \setkomavar{frommobile}{}
        \setkomavar*{mobileseparator}{}}
}

Habe ich frommobile und mobileseperator nicht richtig definiert nach Vorbild von fromphone?

Gruß,
Massimo

Bild von Markus Kohm

Lies zuerst einmal in den FAQ die Seite über signifikante Leerzeichen. Gerade in \addto-Code für Babel sollte man diesbezüglich sehr gut aufpassen. Sonst passiert einem leicht derselbe Fehler, der schon das Paket blindtext lange Zeit wenig brauchbar gemacht hat.

Desweiteren habe ich bereits darauf hingewiesen, dass man Spracherweiterungen besser so implementiert, wie das bereits scrlttr2 selbst macht. Deshalb werde ich auf diesen Teil Deiner Lösung nicht weiter eingehen. Wenn Du das unbedingt so machen willst, schau selbst, dass es auch funktioniert.

Für Deine eigentliche Frage ist entscheidend, wo Du \setkomavar{frommobile}{} aufrufst. Wenn Du das machst, nachdem Du die Tabellenzeilen zusammenbaust, dann ist die Entscheidung ja bereits mit dem nichtleeren frommobile gefallen. Wenn Du es davor machst, dann funktioniert es sehr wohl:

\documentclass[ngerman]{scrlttr2}
\usepackage{babel}
\usepackage{lipsum}

\newkomavar[%
  \usekomavar*{mobileseparator}%
  \usekomavar{mobileseparator}%
]{frommobile}
\newkomavar[\mobilename]{mobileseparator}
\setkomavar{mobileseparator}{\usekomavar{phoneseparator}}

\setkomavar{fromemail}{peter@pan.invalid}

\setkomavar{frommobile}{\internationalphoneprefix 179~459xxxx}

\AtBeginDocument{%
  \providecaptionname{english}{\mobilename}{Mobile}%
  \providecaptionname{german}{\mobilename}{Mobil}%
  \providecaptionname{ngerman}{\mobilename}{Mobil}%
  \providecaptionname{english}{\internationalphoneprefix}{+49\,}%
  \providecaptionname{german}{\internationalphoneprefix}{0}%
  \providecaptionname{ngerman}{\internationalphoneprefix}{0}%
}

\setkomavar{frommobile}{}

\newcommand*{\FootTab}{}
\makeatletter%
\ifkomavarempty{frommobile}{}{%
    \l@addto@macro\FootTab{\usekomavar*{frommobile}&\usekomavar{frommobile}\\}%
}%
\ifkomavarempty{fromemail}{}{%
    \l@addto@macro\FootTab{\usekomavar*{fromemail}&\usekomavar{fromemail}\\}%
}%
\makeatother
\firstfoot{\hfill
    \begin{tabular}[t]{ll}
        \FootTab
    \end{tabular}
}

\begin{document}
\begin{letter}{Peter Pan\\Nimmerland}
\opening{Hallo Peter,}
    \lipsum
\closing{Mit bester Empfehlung}
\end{letter}
\end{document}

Besser ist aber natürlich, einfach dafür zu sorgen, dass die Entscheidung immer mit dem Wert von frommobile getroffen wird, der dann auch verwendet wird:

\documentclass[ngerman]{scrlttr2}
\usepackage{babel}
\usepackage{lipsum}

\newkomavar[%
  \usekomavar*{mobileseparator}%
  \usekomavar{mobileseparator}%
]{frommobile}
\newkomavar[\mobilename]{mobileseparator}
\setkomavar{mobileseparator}{\usekomavar{phoneseparator}}

\setkomavar{fromemail}{peter@pan.invalid}

\setkomavar{frommobile}{\internationalphoneprefix 179~459xxxx}

\AtBeginDocument{%
  \providecaptionname{english}{\mobilename}{Mobile}%
  \providecaptionname{german}{\mobilename}{Mobil}%
  \providecaptionname{ngerman}{\mobilename}{Mobil}%
  \providecaptionname{english}{\internationalphoneprefix}{+49\,}%
  \providecaptionname{german}{\internationalphoneprefix}{0}%
  \providecaptionname{ngerman}{\internationalphoneprefix}{0}%
}

\newcommand*{\FootTab}{}
\makeatletter%
\firstfoot{%
  \ifkomavarempty{frommobile}{}{%
    \l@addto@macro\FootTab{\usekomavar*{frommobile}&\usekomavar{frommobile}\\}%
  }%
  \ifkomavarempty{fromemail}{}{%
    \l@addto@macro\FootTab{\usekomavar*{fromemail}&\usekomavar{fromemail}\\}%
  }%
  \hfill
  \begin{tabular}[t]{ll}
    \FootTab
  \end{tabular}
}
\makeatother

\begin{document}
\setkomavar{frommobile}{}
\begin{letter}{Peter Pan\\Nimmerland}
\opening{Hallo Peter,}
    \lipsum
\closing{Mit bester Empfehlung}
\end{letter}
\end{document}

Man könnte in dem Beispiel die Anweisung \setkomavar{frommobile}{} sogar noch hinter \begin{letter} verschieben.

Für Dein Problem mit der internationalen Vorwahl habe ich übrigens noch eine interessante weitere Lösung:

\documentclass[ngerman]{scrlttr2}
\usepackage{babel}
\usepackage{lipsum}

\newkomavar[%
  \usekomavar*{mobileseparator}%
  \usekomavar{mobileseparator}%
]{frommobile}
\newkomavar[\mobilename]{mobileseparator}
\setkomavar{mobileseparator}{\usekomavar{phoneseparator}}

\setkomavar{fromemail}{peter@pan.invalid}

\setkomavar{frommobile}{\internationalphoneprefix 179~459xxxx}

\newkomavar{mylanguage}
\setkomavar{mylanguage}{ngerman}

\makeatletter
\newcommand*{\internationalphoneprefix}{%
  \begingroup
    \usekomavar[\edef\@tempa]{mylanguage}% \@tempa als Wert von mylanguage
                                % definieren
    \edef\@tempb{\languagename}%
    \@onelevel@sanitize\@tempa% \catcodes angleichen
    \@onelevel@sanitize\@tempb% -"-
    \ifx\@tempa\@tempb 0\else +49\,\fi
  \endgroup
}
\makeatother

\AtBeginDocument{%
  \providecaptionname{english}{\mobilename}{Mobile}%
  \providecaptionname{german}{\mobilename}{Mobil}%
  \providecaptionname{ngerman}{\mobilename}{Mobil}%
}

\newcommand*{\FootTab}{}
\makeatletter%
\firstfoot{%
  \ifkomavarempty{frommobile}{}{%
    \l@addto@macro\FootTab{\usekomavar*{frommobile}&\usekomavar{frommobile}\\}%
  }%
  \ifkomavarempty{fromemail}{}{%
    \l@addto@macro\FootTab{\usekomavar*{fromemail}&\usekomavar{fromemail}\\}%
  }%
  \hfill
  \begin{tabular}[t]{ll}
    \FootTab
  \end{tabular}
}
\makeatother

\begin{document}
\begin{letter}{Peter Pan\\Nimmerland}
\opening{Hallo Peter,}
    \lipsum
\closing{Mit bester Empfehlung}
\end{letter}
\end{document}

Vielen Dank. Ich hab mein Template umgestellt wie im ersten Beispiel. Die zweite interessante Lösung verstehe ich nicht ganz, obwohl sie wahrscheinlich die Lösung zu meiner nächsten Frage ist. +49 bleibt für alle außer Deutsch gleich. Außerdem hab ich Variablen, die nur für manche Sprachen neugesetzt werden sollen (in Italien schreibt man LAND und STADT in Großbuchstaben). Gibt es etwas wie \providecaptionname{default}{}{} für alle Sprachen?

Wenn ich für eine Sprache die Variable löschen möchte, bekomme ich auch mit deiner Lösung in der Tabelle immer noch eine Leerzeile:

(Aufruf in dieser Reihenfolge)

allgemein.lco

\newkomavar{fromtitle}
\setkomavar{fromtitle}{\fromtitle}

persoenlich.lco

\AtBeginDocument{%
	\providecaptionname{english}{\fromtitle}{Mr}%
	\providecaptionname{ngerman}{\fromtitle}{}%
}

headfoot.lco

\newcommand*{\FootL}{}
\makeatletter%
\ifkomavarempty{fromtitle}{}{%
	\l@addto@macro\FootL{\usekomavar{fromtitle}\\}%
}%
\ifkomavarempty{fromname}{}{%
	\l@addto@macro\FootL{\usekomavar{fromname}\\}
}%
\makeatother
\begin{tabular}[t]{@{}l@{}}%
	\FootL
\end{tabular*}
Bild von Markus Kohm

Ich kann Dir aber so unmöglich sagen, was das ist, weil ich nicht weiß, was Du machst. Mein Minimalbeispiel zeigt jedenfalls, dass es keine Leerzeile gibt. Wenn Du es nicht glaubst, dann füge mal unmittelbar vor der Verwendung von \FootTab in meinem zweiten Beispiel ein \show\FootTab ein. Dann bekommst Du eine Pseudofehlermeldung, die lautet:

> \FootTab=macro:
->\usekomavar *{fromemail}&\usekomavar {fromemail}\\.
\@firstfoot ...in {tabular}[t]{ll} \show \FootTab 
                                                  \FootTab \end {tabular} 

Die erste Zeile der Meldung besagt, dass \FootTab ein Makro ist. Die zweite besagt, dass das Makro die Definition \usekomavar *{fromemail}&\usekomavar {fromemail}\\ besitzt. Es ist also genau die eine Zeile drin und keine weitere. Die dritte und vierte Zeile geben an, was der Auslöser der Fehlermeldung war, in dem Fall \show \FootTab, also keine echte Fehlermeldung.

..um zu zeigen, was ich meine.
Mit Option english ist die linke Tabelle korrekt, mit ngerman gibt es eine Leerzeile:

Minimal-Beispiel:

\documentclass[ngerman]{scrlttr2}
\usepackage{babel}
\usepackage{lipsum}
\setkomavar{fromname}{Peter Pan}\setkomavar{fromemail}{peter@pan.invalid}
\newkomavar{fromtitle}
\setkomavar{fromtitle}{\fromtitle}
\AtBeginDocument{%
        \providecaptionname{english}{\fromtitle}{Mr}%
        \providecaptionname{ngerman}{\fromtitle}{}%
        \providecaptionname{italian}{\fromtitle}{}}
\newcommand*{\FootL}{}
\newcommand*{\FootR}{}
\makeatletter%
\ifkomavarempty{fromtitle}{KEINTITEL}{%
        \l@addto@macro\FootL{\usekomavar{fromtitle}\\}}%
\ifkomavarempty{fromname}{}{%
        \l@addto@macro\FootL{\usekomavar{fromname}\\}}%
\ifkomavarempty{fromemail}{}{%
        \l@addto@macro\FootR{\usekomavar*{fromemail}&\usekomavar{fromemail}\\}}%
\makeatother
\firstfoot{%
        \begin{tabular}[t]{l}\FootL\end{tabular}\hfill
        \begin{tabular}[t]{ll}\FootR\end{tabular}}
\begin{document}\begin{letter}{Peter Pan}
\opening{Hallo Peter,}\lipsum\closing{Mit bester Empfehlung}
\end{letter}\end{document}
Bild von Markus Kohm

Du machst genau denselben Fehler, den ich Dir einschließlich zweier Lösungen haarklein erklärt habe, wieder. Die Entscheidung ob leer oder nicht wird in dem Fall sogar bereits getroffen, wenn die sprachabhängigen Begriffe noch gar nicht definiert sind. Was Du machst erinnert langsam aber sicher an wilden Aktionismus statt geplantem Vorgehen.

Geplantes Vorgehen wäre: Lesen, was ich schreibe. Anleitung studieren. Versuchen zu verstehen, was ich schreibe und vormache. Dann vorsichtig mit den einzelnen Bausteinen experimentieren.

Wilder Aktionismus wäre: Hier etwas aufschnappen, da etwas aufschnappen, ohne länger darüber nachzudenken, dies und das zusammenkopieren und mit eigenen Ideen vermischen.

Auf wilden Aktionismus komme ich schon deshalb, weil Du an verschiedenen Baustellen gleichzeitig hantierst, und dabei in extrem kurzen Zeitabständen neue Ideen präsentierst, in denen nicht ansatzweise zu finden ist, was ich erklärt habe. Die Zeit dazwischen reicht kaum, um meine Beiträge zu lesen, geschweige denn sie zu verstehen. Jedenfalls erkläre ich mir so, dass Du meine Lösungsvorschläge im Kern ständig ignorierst.

Sorry, aber ich habe schlicht nicht die Zeit, Dir ständig alles zu wiederholen und alles dreimal zu erklären. Vielleicht hat ja ein anderer hier mehr Zeit und Geduld.

Bild von Markus Kohm

Da sprachabhängige Begriffe per Definition von der Sprache abhängen, muss man sie auch für jede einzelne Sprache neu definieren. Allerdings: Wenn man von einer Sprache, die einen Begriff kennt, auf eine Sprache umschaltet, die den Begriff nicht kennt, dann wird der Begriff nicht gelöscht, sondern behält seine letzte Definition.

Comments for "Eigene Koma-Variable löschen" abonnieren