Seite 1 von 2

Prüfen, ob \newcommand\abc{} leer ist

Verfasst: Do 21. Apr 2011, 22:30
von Gast
Hi,

ich habe schon verschiedenes versucht, um zu prüfen, ob ein Befehl \abc zwar mit \newcommand erstellt wurde, aber dessen Inhalt leer ist.

Ich möchte also sinngemäß prüfen, ob:

\newcommand\abc{}

und habe es versucht mit:

ifthenelse{equals{\abc}{\empty}}{}{}
ifthenelse{equals{\abc}{}}{}{}

und einigen anderen Ansätzen, die ich nicht mehr reproduzieren kann.

Ich finde keine Lösung und bin auf eure Hilfe angewiesen.

Ergänzung

Verfasst: Do 21. Apr 2011, 22:38
von Gast
Ich vergaß:

Das schwierige ist, dass die Definition \abc in meinem Fall nur entweder eine Bildeinfügung enthält oder eben gar nichts:

\newcommand{\abc}{\includegraphics[width=2cm]{tex_brief_unterschrift}}

Ich möchte in einem Brief, in Abhängigkeit davon, ob \abc (definiert in der Präambel) ein Bild enthält oder nicht an späterer Stelle im closing einen vertikalen Abstand (als Ersatz für einen Unterschrift scan) einfügen oder eben nicht.

Das macht das Beispiel vielleicht etwas plastischer.

Verfasst: Do 21. Apr 2011, 23:07
von cgnieder
Wenn
\abc
wirklich leer ist, also
\def\abc{}
entspricht, könntest Du das mit einem Referenz-Makro überprüfen, vielleicht so:
\def\leer{}

\def\abc{}

\ifx\abc\leer
 leer
\else
 nicht leer
\fi
Der Vorschlag versagt natürlich, wenn \abc gar nicht definiert wurde, oder wenn \abc über \newcommand definiert wurde... Du willst viell. eher sowas:
\documentclass{minimal}
\begin{document}
\makeatletter
\newcommand\leer{}
\newcommand\testabc{\@ifundefined{abc}{gibt's nicht}{\ifx\abc\leer leer\else nicht leer\fi}}
\makeatother
\testabc%-> gibt's nicht

\newcommand\abc{}
\testabc%-> leer

\renewcommand\abc{voll}
\testabc%-> nicht leer
\end{document}
Gruß

Verfasst: Do 21. Apr 2011, 23:46
von bloodworks
\documentclass{report}

\newcommand{\abc}[1]{%
\ifx\abc\empty
\relax%wichtig % macht nix, wenn leer
\else 
#1% % hier wichtig
\fi
}

\begin{document}
1\abc{}2\abc{bla}3\abc{}4\abc{bla}
\end{document}


Problem gelöst!

Verfasst: Fr 22. Apr 2011, 02:11
von Gast
Danke euch für die Hilfe!

Mein Problem ist gelöst!

Ich favorisiere Lösung#1 von cgnieder, habe aber die Umsetzung mittels eigenem Prüfkommando von bloodworks gewählt.

Ich hatte die Möglichkeit, auf "leere" übergebene Parameter zu prüfen zwar schon vorher im Netz gefunden, für mein Problem aber nicht als relevant erachtet.

Lösung:

Ich definiere auf jedenfall einen Befehl \unterschrift (\abc in meiner Beschreibung) der mit einem scan oder eben gar nicht befüllt ist.

Außerdem definiere ich einen Prüfbefehl \pUnterschrift nach eurer Vorlage, an den ich später zwangsweise \unterschrift als Parameter übergebe. Ist \unterschrift mit einem scan befüllt, so wird er expandiert, ist kein scan definiert, so expandiert \pUnterschrift einen vertikalen abstand.

Im closing wird \pUnterschrift\unterschrift aufgerufen.


---

Das war zwar vielleicht verwirrend, erzielt aber genau den Effekt den ich bewirken wollte.

Danke nochmal!

Verfasst: Fr 22. Apr 2011, 07:53
von CrazyHorse
bloodworks hat geschrieben:
\documentclass{report}

\newcommand{\abc}[1]{%
\ifx\abc\empty
\relax%wichtig % macht nix, wenn leer
\else 
#1% % hier wichtig
\fi
}

\begin{document}
1\abc{}2\abc{bla}3\abc{}4\abc{bla}
\end{document}

dein Code liefert _immer_ den Fall "nicht leer", leicht zu überprüfen mit:
\documentclass{report}

\newcommand{\abc}[1]{%
\ifx\abc\empty
Leer
\else
nicht leer\fi
}

\begin{document}
\abc{}\abc{bla}
\end{document} 
Du kannst nicht zweimal \abc verwenden, du meinst \ifx#1\empty, was aber auch falsch ist. Das hier geht: \ifx\relax#1\relax Leer \else nicht leer\fi

Herbert

Verfasst: Fr 22. Apr 2011, 12:55
von bloodworks
Ähmm ja du hast recht Herbert... peinlich... Das war ja auch irgendwie gar nicht nach was der Fragesteller gefragt hat... Ehrlich gesagt war ich ganz besoffen von der Vorstellung das ohne zweiten Befehl hinzubekommen.
Das hier sollte aber etwa das sein, was der FS will:
\documentclass{report}

\newcommand{\abc}[1]{%
\ifx\relax#1\relax \def\getabc{}
\else 
\def\getabc{#1}
\fi
}

\begin{document}
Hier sollte nix stehen:\abc{}
\getabc \\
Hier aber:
\abc{blabla}
\getabc \\
\end{document}

Das stimmt jetzt hoffentlich auch semantisch.
Grüße

Verfasst: Sa 23. Apr 2011, 09:56
von pospiech
CrazyHorse hat geschrieben: Du kannst nicht zweimal \abc verwenden, du meinst \ifx#1\empty, was aber auch falsch ist. Das hier geht: \ifx\relax#1\relax Leer \else nicht leer\fi
Mich würde interessieren warum das so sein muss.

Verfasst: Sa 23. Apr 2011, 10:54
von cgnieder
pospiech hat geschrieben:
CrazyHorse hat geschrieben: Du kannst nicht zweimal \abc verwenden, du meinst \ifx#1\empty, was aber auch falsch ist. Das hier geht: \ifx\relax#1\relax Leer \else nicht leer\fi
Mich würde interessieren warum das so sein muss.
Wenn mich nicht alles täuscht, dann vergleicht \ifx die beiden folgenden Makros auf Gleichheit. Wenn nun #1 gar nichts enthält, wird bei \ifx#1\empty das \empty mit was auch immer darauf folgt verglichen. Bei \ifx\relax#1\relax wird, wenn #1 fehlt, \relax mit \relax verglichen, was dann wahr ist.

Ich hoffe, das ist so alles richtig...

Grüße,
Clemens

Verfasst: Sa 23. Apr 2011, 15:42
von CrazyHorse
cgnieder hat geschrieben:
pospiech hat geschrieben:
CrazyHorse hat geschrieben: Du kannst nicht zweimal \abc verwenden, du meinst \ifx#1\empty, was aber auch falsch ist. Das hier geht: \ifx\relax#1\relax Leer \else nicht leer\fi
Mich würde interessieren warum das so sein muss.
Wenn mich nicht alles täuscht, dann vergleicht \ifx die beiden folgenden Makros auf Gleichheit. Wenn nun #1 gar nichts enthält, wird bei \ifx#1\empty das \empty mit was auch immer darauf folgt verglichen. Bei \ifx\relax#1\relax wird, wenn #1 fehlt, \relax mit \relax verglichen, was dann wahr ist.

Ich hoffe, das ist so alles richtig...
nein, es werden _immer_ die folgenden beiden Token verglichen, also #1 und \empty, aber: Mit \ifx werden die beiden Token vor dem ersten Vergleich nicht expandiert. Ist ein Token ein Zeichen und das andere ein Makro ist der Vergleich falsch, sind beide kein Makro, so sind sie nur gleich wenn sie sowohl den gleichen Zeichencode als auch die gleiche Kategorie haben. Sind beide Token ein Makro, so werden beide einmalig expandiert und der darausfolgende Ersatztext verglichen.

\ifx#1\empty ist also immer falsch, denn #1 ist hier formal ein Zeichen und \empty ein MAkro.

Herbert