Prüfen, ob \newcommand\abc{} leer ist Thema ist als GELÖST markiert
Prüfen, ob \newcommand\abc{} leer ist
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.
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
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.
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.
- cgnieder
- Forum-Meister
- Beiträge: 730
- Registriert: Fr 22. Okt 2010, 18:37
- Wohnort: Herrenberg
- Kontaktdaten:
Wenn wirklich leer ist, also entspricht, könntest Du das mit einem Referenz-Makro überprüfen, vielleicht so:
Der Vorschlag versagt natürlich, wenn \abc gar nicht definiert wurde, oder wenn \abc über \newcommand definiert wurde... Du willst viell. eher sowas:
Gruß
\abc
\def\abc{}
\def\leer{} \def\abc{} \ifx\abc\leer leer \else nicht leer \fi
\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}
Zuletzt geändert von cgnieder am Fr 22. Apr 2011, 00:17, insgesamt 1-mal geändert.
Clemens
Paketauthor
Paketauthor
- bloodworks
- Moderator
- Beiträge: 1425
- Registriert: Mo 19. Jan 2009, 10:52
- Wohnort: /dev/null
\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.
[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.
Problem gelöst!
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!
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!
-
- Forum-Guru
- Beiträge: 252
- Registriert: Di 16. Mär 2010, 09:39
dein Code liefert _immer_ den Fall "nicht leer", leicht zu überprüfen mit: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}
\documentclass{report} \newcommand{\abc}[1]{% \ifx\abc\empty Leer \else nicht leer\fi } \begin{document} \abc{}\abc{bla} \end{document}
Herbert
- bloodworks
- Moderator
- Beiträge: 1425
- Registriert: Mo 19. Jan 2009, 10:52
- Wohnort: /dev/null
Ä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:
Das stimmt jetzt hoffentlich auch semantisch.
Grüße
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}
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.
[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.
- cgnieder
- Forum-Meister
- Beiträge: 730
- Registriert: Fr 22. Okt 2010, 18:37
- Wohnort: Herrenberg
- Kontaktdaten:
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.pospiech hat geschrieben:Mich würde interessieren warum das so sein muss.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
Ich hoffe, das ist so alles richtig...
Grüße,
Clemens
Clemens
Paketauthor
Paketauthor
-
- Forum-Guru
- Beiträge: 252
- Registriert: Di 16. Mär 2010, 09:39
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.cgnieder hat geschrieben: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.pospiech hat geschrieben:Mich würde interessieren warum das so sein muss.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
Ich hoffe, das ist so alles richtig...
\ifx#1\empty ist also immer falsch, denn #1 ist hier formal ein Zeichen und \empty ein MAkro.
Herbert