Sie sind hier

variablen aus scrlttr2 vergleichen

Anforderung:
Variablen sollen abhängig von ihren Inhalten formatiert werden. Konkret betrifft dies die Setzung der Signatur. Sind die Inhalte der Variablen "fromname" und "signature" identisch, soll ein Abstand zwischen Gruß und Signature mit
\@setplength{sigbeforevskip}{2\baselineskip}
gesetzt werden.
Andernfalls kann davon ausgegangen werden, dass "signature" eine Graphik enthält, bei der dann
\@setplength{sigbeforevskip}{0\baselineskip}
angebracht ist.

Lösungsansätze und Problem:
Lösungen über die Befehle \ifthenelse (xifthen) oder \ifdefstrequal (etoolbox) bringen leider nicht das gewünscht Resultat, da die Variablen immer als verschieden interpretiert werden, selbst wenn
\setkomavar{signature}{\usekomavar{fromname}}
benutzt wurde.

Minimalbeispiel

\RequirePackage{filecontents}
\begin{filecontents}{myloc.lco}
%%eine loc.datei, die nur Formatierung beinhaltet
\usepackage{etoolbox,xifthen}
\AtBeginLetter{%
%%	1. variante: xifthen
	\ifthenelse{\equal{\usekomavar{fromname}}{\usekomavar{signature}}}
		{\setkomavar{signature}{gleich}}
		{\setkomavar{signature}{ungleich}}
%%	2. Variante: etoolbox
%	\ifdefstrequal{\usekomavar{fromname}}{\usekomavar{signature}}
%		{\setkomavar{signature}{gleich}}
%		{\setkomavar{signature}{ungleich}}
%		{\@setplength{sigbeforevskip}{2\baselineskip}}
%		{\@setplength{sigbeforevskip}{0\baselineskip}}%falls signature verschieden (Bild) dann hochziehen
	}
\end{filecontents}
 
 
\documentclass[myloc]{scrlttr2}
 
\usepackage[ngerman]{babel}
 
\begin{document}
%%Daten
\setkomavar{fromname}{Mini}
\setkomavar{signature}{%\includegraphics[height=30px]{signatureMini}\\*
	\usekomavar{fromname}}
 
%%Brief
\begin{letter}{Mickey}
\opening{Lieber Mickey,}
Briefinhalt
\closing{Gru\ss}
\end{letter}
\end{document}

Das kann aus zwei Gründen nicht funktionieren:

  1. \usekomavar hat eine Sternvariante und ein optionales Argument und ist damit nicht voll expandiertbar.
  2. Wenn man \def\foo{A} und \def\bar{\foo} miteinander vergleicht, so sind die beiden i. a. nicht identisch.

Das zweite Problem könnte man mit \edef statt \def lösen, das geht aber wegen des ersten Problems nicht.

Vermutlich musst Du Dir da etwas anderes einfallen lassen.

Wer sich selbst zu wichtig nimmt, braucht von anderen nicht mehr wichtig genommen zu werden.

Eine schnelle (aber eher unschöne, da auf internen Makros beruhende) Lösung könnte folgendermaßen aussehen: Ersetze

\ifthenelse{\equal{\usekomavar{fromname}}{\usekomavar{signature}}}

durch

\ifthenelse{\equal{\scr@fromname@var}{\scr@signature@var}}

Wenn du dann die Daten im Dokument mit

\setkomavar{fromname}{Mini}
\setkomavar{signature}{%\includegraphics[height=30px]{signatureMini}\\*
Mini}

setzt, sollte der Test funktionieren.

Bild von Markus Kohm

Wenn man innerhalb der einen Variable nicht auf eine andere Variable zugreift, dann braucht man nicht auf Interna zurück zu greifen, sondern kann den dokumentierten, sauberen Weg beschreiten:

\documentclass{scrlttr2}
 
\setkomavar{fromname}{Mini}
\setkomavar{signature}{Mini}
 
\begin{document}
 
\usekomavar[\edef\TestA]{fromname}
\usekomavar[\edef\TestB]{signature}
 
\ifx\TestA\TestB \else un\fi gleich
 
\end{document}

Ein Problem tritt erst auf, wenn wie ursprünglich gefordert auch,

\setkomavar{signature}{\usekomavar{fromname}}

funktionieren soll. Dann funktioniert aber auch der Hack mit den internen Makros nicht. Also würde ich gleich darauf verzichten und etwas wie:

\documentclass{scrlttr2}
 
\makeatletter
\newcommand*{\ifvariablesexpandsame}[2]{%
  \begingroup
    \usekomavar[\protected@edef\@tempa]{#1}%
    \usekomavar[\protected@edef\@tempb]{#2}%
    \ifx\@tempa\@tempb
      \endgroup
      \expandafter\@firstoftwo
    \else
      \endgroup
      \expandafter\@secondoftwo
  \fi
}
\makeatother
 
\setkomavar{fromname}{Mini}
\setkomavar{signature}{Mini}
 
\begin{document}
 
\ifvariablesexpandsame{fromname}{signature}{}{un}gleich
 
\end{document}

greifen.

@Ratte: Danke für den Hinweis, mit dem man wieder mehr versteht

@MHP: das ist zwar nicht ganz so sauber, aber hilft mir schon mal weiter

Solch ein Test, der Inhalte von Variablen überprüft wäre sicherlich auch für andere Zwecke gut. Bsp, wenn man aus Versehen Daten doppelt eingibt, aber nur einfach ausgeben möchte. Ich denke da an falsche Benutzereingaben mittels

\newkomavar{frombanknumber}
\setkomavar{frombanknumber}{1234567}
\newkomavar{frombankBLZ}
\setkomavar{frombankBLZ}{1234567}

wobei ein automatischer Test ein Warnung ausgibt, wenn beide irrtümlich identisch deklariert sind. Oder beide Variablen führen bei langen .lco Dateien irgendwann mit

\setkomavar{frombank}{1234567}

zu unliebsamen Redundanzen.

Comments for "variablen aus scrlttr2 vergleichen" abonnieren