Prüfen, ob \newcommand\abc{} leer ist Thema ist als GELÖST markiert

Klassen und Pakete zur einfachen Umsetzung individueller Vorstellungen


Gast

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

Beitrag 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.

Gast

Ergänzung

Beitrag 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.

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag 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ß
Zuletzt geändert von cgnieder am Fr 22. Apr 2011, 00:17, insgesamt 1-mal geändert.
Clemens
Paketauthor

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag 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}

[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


Gast

Problem gelöst!

Beitrag 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!

CrazyHorse
Forum-Guru
Forum-Guru
Beiträge: 252
Registriert: Di 16. Mär 2010, 09:39

Beitrag 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

Benutzeravatar
bloodworks
Moderator
Moderator
Beiträge: 1425
Registriert: Mo 19. Jan 2009, 10:52
Wohnort: /dev/null

Beitrag 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
[1] Nützliche Webdokumente für Anfänger und Fortgeschrittene
[2]Minimalbeispiel | [3]FAQ
[4]Regelwerk | [5] Knigge
Wenn nicht anderst angegeben ist mein System: texlive 2012, pdflatex, x86-64, Snow Leopard utd.
Angehöriger der Liga zur Verwendung von texdoc
texdoc mathmode koma l2picfaq l2tabu lshort-en
Achtung: Aufforderungen ein Minimalbeispiel oder mehr Erklärungen zu einer Frage zu liefern sind keine persönlichen Angriffe. Sie dienen viel mehr dazu die Kommunikation zwischen Fragendem und potentiellen Helfern zu erleichtern und zu präzisieren.


pospiech
Moderator
Moderator
Beiträge: 247
Registriert: Do 3. Jul 2008, 11:40
Wohnort: Hannover
Kontaktdaten:

Beitrag 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.

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag 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
Clemens
Paketauthor

CrazyHorse
Forum-Guru
Forum-Guru
Beiträge: 252
Registriert: Di 16. Mär 2010, 09:39

Beitrag 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

Antworten