Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 24

Thema: expandieren von befehlen

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.07.2007
    Beiträge
    29

    expandieren von befehlen

    Hi Leute!

    Gibt es Möglichkeiten vor bzw. nach einem schon vorhandenen Befehl etwas anzufügen, ohne den Namen des Befehls selbst zu ändern oder das originale Makro umzudefinieren?

    Ich hab heute eine relativ lange Arbeit mit TeX verfasst und bin im Nachhinein auf ein kleines Problem gestoßen. Da ich relativ viel Mathematik in der Arbeit hab, sind dort auch viele Quantoren vorhanden. Nun ist der Abstand nach (und vor) einem "\exists" etwas zu klein für meinen Geschmack.

    Wäre dankbar für jeden Vorschlag.
    Micha

  2. #2
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Ltd83 Beitrag anzeigen
    Ich hab heute eine relativ lange Arbeit mit TeX verfasst und bin im Nachhinein auf ein kleines Problem gestoßen. Da ich relativ viel Mathematik in der Arbeit hab, sind dort auch viele Quantoren vorhanden. Nun ist der Abstand nach (und vor) einem "\exists" etwas zu klein für meinen Geschmack.
    Code:
    \DeclareMathSymbol{\exists}{\mathbin}{symbols}{"39}
    Herbert

  3. #3
    Registrierter Benutzer
    Registriert seit
    19.07.2007
    Beiträge
    29
    Danke für die Antwort! Das funktioniert natürlich, hätte man drauf kommen können Aber wir ist das jetzt: kann ich Befehle irgendwie "verlängern"? Wäre für mein LaTeX-Wissen mal ganz interessant.

    Grüße,
    Micha

  4. #4
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Ltd83 Beitrag anzeigen
    Danke für die Antwort! Das funktioniert natürlich, hätte man drauf kommen können Aber wir ist das jetzt: kann ich Befehle irgendwie "verlängern"? Wäre für mein LaTeX-Wissen mal ganz interessant.
    Code:
    \documentclass[12pt]{article}
    \newcommand*\EsIst{Es ist }
    \parindent=0pt
    
    \begin{document}
    
    \EsIst
    
    \makeatletter\g@addto@macro{\EsIst}{wie es ist!}\makeatother
    
    \EsIst
    
    \let\EsIstAlt\EsIst
    \renewcommand*\EsIst{\EsIstAlt\ und nicht anders!}
    
    \EsIst
    
    \end{document}
    Herbert

  5. #5
    Registrierter Benutzer Avatar von Stefan_K
    Registriert seit
    05.04.2007
    Ort
    Hamburg
    Beiträge
    3.534

    \expandafter

    Hallo Micha,

    siehe vllt. auch Using \expandafter for macro redefinitions, mit \expandafter kann man das alternativ tun, sogar lokal, während \g@addto@macro global wirkt:
    Code:
    \expandafter\def\expandafter\EsIst\expandafter{\EsIst wie es ist!}
    Wenn man das gruppiert bzw. die Wirkung z.B. durch geschweifte Klammern begrenzt, hat das Makro danach wieder den ursprünglichen Code.

    Viele Grüße,

    Stefan

  6. #6
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Stefan_K Beitrag anzeigen
    siehe vllt. auch Using \expandafter for macro redefinitions, mit \expandafter kann man das alternativ tun, sogar lokal, während \g@addto@macro global wirkt:
    Code:
    \expandafter\def\expandafter\EsIst\expandafter{\EsIst wie es ist!}
    Wenn man das gruppiert bzw. die Wirkung z.B. durch geschweifte Klammern begrenzt, hat das Makro danach wieder den ursprünglichen Code.
    wenn schon, dann richtig:
    Code:
    \expandafter\long\expandafter\def\expandafter\EsIst\expandafter{\EsIst wie es ist!}
    Herbert

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.07.2007
    Beiträge
    29
    Danke euch beiden nochmals.

    Die Sache mit expandafter hab ich auch schon gelesen, nur nicht verstanden. Aber implementieren kann man es ja trotzdem. Leider funktioniert das nicht so wirklich. Ich kann doch ein Makro definieren, dass mir das dann vornimmt, oder? ungefähr so:

    Code:
    \newcommand{\commandexp}[2]{\expandafter\def\expandafter#1\expandafter{#1 #2}}
    
    \commandexp{\exists}{\quad}%oder sowas
    Dachte ich jedenfalls. Nur funktioniert das leider nicht (speicherüberlauf). Mit
    Code:
    \commandexp{\EsIst}{wie es ist.}
    funktionierts aber.

    Zweites Problem damit. Wenn ich die Kommando-Expansion mit optionalem Argument definiere
    Code:
    \newcommand{\commandexp}[3][]{\expandafter\def\expandafter#2\expandafter{#1 #2 #3}}
    also auch einen Vorsatz erlauben will, funktioniert das überhaupt nicht (Selbst mit dem \long-Zusatz). Warum?

    Es juckt mich in den Fingern dieses Problem zu lösen, auch wenns nicht wirklich wichtig ist

  8. #8
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Ltd83 Beitrag anzeigen
    Die Sache mit expandafter hab ich auch schon gelesen, nur nicht verstanden. Aber implementieren kann man es ja trotzdem. Leider funktioniert das nicht so wirklich. Ich kann doch ein Makro definieren, dass mir das dann vornimmt, oder? ungefähr so:
    du solltest \expandafter ganz schnell vergessen und erst dann wieder darauf zurückkommen, wenn du den ganzen anderen Mechanismus erstmal verstanden
    hast. Beispielsweise den Unterschied zwischen \newcommand und \def
    Die \expandafter-Orgie ist außerdem nicht immer erfolgreich ...
    Es ist besser, du gehst von dem LaTeX-konformen Fall aus:

    Code:
    \documentclass[12pt]{article}
    
    \let\Exists\exists
    \renewcommand\exists{\Exists\quad}
    
    \begin{document}
    
    $\exists A$
    
    \end{document}
    Herbert

  9. #9
    Registrierter Benutzer
    Registriert seit
    19.07.2007
    Beiträge
    29
    Ok. Dann mach ichs eben so Danke für die flotten und informativen Antworten.

    Ich werd mich jetzt in die Tiefen der LaTeX-Programmierung begeben und den Unterschied zwischen \def, \let, \relax etc., bzw. zu verstehen versuchen, was dieses \expandafter eigentlich tut. (wäre natürlich auch für jede PM diesbezüglich dankbar ).

    Bis dann,
    Micha

  10. #10
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Zitat Zitat von Ltd83 Beitrag anzeigen
    Ok. Dann mach ichs eben so Danke für die flotten und informativen Antworten.

    Ich werd mich jetzt in die Tiefen der LaTeX-Programmierung begeben und den Unterschied zwischen \def, \let, \relax etc., bzw. zu verstehen versuchen, was dieses \expandafter eigentlich tut. (wäre natürlich auch für jede PM diesbezüglich dankbar ).

    Bis dann,
    Micha
    Hallo

    im Internet findest du einiges:
    http://www.matthiaspospiech.de/blog/...u-expandafter/

    Gruß
    Marco

  11. #11
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Ltd83 Beitrag anzeigen
    Ok. Dann mach ichs eben so Danke für die flotten und informativen Antworten.

    Ich werd mich jetzt in die Tiefen der LaTeX-Programmierung begeben und den Unterschied zwischen \def, \let, \relax etc., bzw. zu verstehen versuchen, was dieses \expandafter eigentlich tut. (wäre natürlich auch für jede PM diesbezüglich dankbar ).
    Ich will mir den Befehl \123 definieren, was normalerweise gar nicht geht,
    da Ziffern nicht Teil eines Makronames sein können. Es gibt aber
    \csname123\endcsname, woraus TeX \123 macht und ausführt. Also könnte man denken,
    dass
    Code:
    \newcommand{\csname123\endcsname}{foo}
    gehen sollte. Geht aber nicht, weil jetzt der Befehl \newcommand\csname zuerst
    bearbeitet wird, was zu einem Fehler führt. Man muss also zuerst
    \csname123\endcsname ausführen lassen, _bevor_ \newcommand aktiv wird,
    also:
    Code:
    \newcommand\expandafter{\csname123\endcsname}{foo}
    Geht aber auch nicht, weil jetzt zuerst \newcommand\expandafter ausgeführt wird,
    wieder ein Fehler.
    Code:
    \documentclass[12pt]{article}
    
    \expandafter\newcommand\expandafter{\csname123\endcsname}{foo}
    
    \begin{document}
    \csname123\endcsname
    \end{document}
    Jetzt klappt es, weil es von links heißt
    Code:
    \expandafter%  führe erst das nach \newcommand aus
      \newcommand%
         \expandafter%   führe erst das nach der Klammer aus
             {\csname123\endcsname}{foo}
    Dadurch bleibt dann intern \newcommand\123{foo} übrig.

    Herbert

  12. #12
    Registrierter Benutzer Avatar von Stefan_K
    Registriert seit
    05.04.2007
    Ort
    Hamburg
    Beiträge
    3.534

    \long

    Hallo Herbert,

    Zitat Zitat von voss Beitrag anzeigen
    wenn schon, dann richtig:
    Code:
    \expandafter\long\expandafter\def\expandafter\EsIst\expandafter{\EsIst wie es ist!}
    das sehe ich nicht so. \long ist für ein parameterloses Makro nicht sinnvoll.
    Oder was möchtest Du damit erreichen?

    Stefan

  13. #13
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von Stefan_K Beitrag anzeigen
    das sehe ich nicht so. \long ist für ein parameterloses Makro nicht sinnvoll.
    Oder was möchtest Du damit erreichen?
    Ich verstehe ja, dass du immer deine vielen \expandafter anbringen
    willst, aber es funktioniert eben bei jeder Menge an Befehlen nicht!

    Code:
    \expandafter\def\expandafter\exists\expandafter{\exists\quad}
    das war das Ausgangsproblem und auch da geht deine Lösung nicht!

    Herbert

  14. #14
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.863
    Moin moin,
    Zitat Zitat von voss Beitrag anzeigen
    Ich verstehe ja, dass du immer deine vielen \expandafter anbringen
    willst, aber es funktioniert eben bei jeder Menge an Befehlen nicht!
    ich nicht so ganz, für zumindest einfache Sachen wie bei dem hier vorgestellten \EsIst, genügte da nicht auch so etwas wie
    Code:
    \edef\EsIst{\EsIst\ noch was}
    ? Ok, bei
    Zitat Zitat von voss Beitrag anzeigen
    Code:
    \expandafter\def\expandafter\exists\expandafter{\exists\quad}
    das war das Ausgangsproblem und auch da geht deine Lösung nicht!
    geht das genauso in die Hose ... aber was macht dann \g@addto@macro hier? Oder hab ich das falsch angewendet?
    Code:
    \documentclass{article}
    \makeatletter\g@addto@macro{\exists}{\quad}\makeatother
    \begin{document}
    $\exists A$
    \end{document}
    liefert bei mir
    Code:
    ! TeX capacity exceeded, sorry [input stack size=5000].
    und entsprechend keinen Output -- genauso wie bei der \expandafter-Orgien, selbst mit dieser hier:
    Code:
    \expandafter\long\expandafter\def\expandafter\exists\expandafter{\exists\quad}
    aber Du sagtest ja bereits
    Zitat Zitat von voss Beitrag anzeigen
    Die \expandafter-Orgie ist außerdem nicht immer erfolgreich ...
    Und mit der dort vorgestellten Variante
    Zitat Zitat von voss Beitrag anzeigen
    Code:
    \let\Exists\exists
    \renewcommand\exists{\Exists\quad}
    funktioniert es ja auch wunderbar, selbst wenn man \renewcommand* oder gar \def statt \renewcommand hier verwendet: die Redefinition von \exists kommt also durchaus ohne \long aus.;-)

    MfG
    Rainer
    There's nothing a good whack with a hammer won't fix!

  15. #15
    Registrierter Benutzer Avatar von voss
    Registriert seit
    10.04.2005
    Beiträge
    5.045
    Zitat Zitat von rais Beitrag anzeigen
    geht das genauso in die Hose ... aber was macht dann \g@addto@macro hier? Oder hab ich das falsch angewendet?
    Code:
    \documentclass{article}
    \makeatletter\g@addto@macro{\exists}{\quad}\makeatother
    \begin{document}
    $\exists A$
    \end{document}
    liefert bei mir
    Code:
    ! TeX capacity exceeded, sorry [input stack size=5000].
    und entsprechend keinen Output -- genauso wie bei der \expandafter-Orgien, selbst mit dieser hier:
    Code:
    \expandafter\long\expandafter\def\expandafter\exists\expandafter{\exists\quad}
    Die Verfahren \g@addto@macro ist faktisch das gleiche wie die \expandafter.-Orgie,
    kann also nur funktionieren, wenn das zu erweiternde Makro selbst erstmal
    überhaupt ein Makro ist und dann noch expandierbar. \exists ist kein Makro.
    Was es ist, kannst du dir mit \meaning\exists anzeigen lassen. Da keine
    Expandierbarkeit vorliegt, kommt es automatisch zu einer Rekursion.

    Und mit der dort vorgestellten Variante
    funktioniert es ja auch wunderbar, selbst wenn man \renewcommand* oder gar \def statt \renewcommand hier verwendet: die Redefinition von \exists kommt also durchaus ohne \long aus.;-)
    Jedes Makro ohne Parameter kommt ohne long aus, es ist nur ein guterStil
    Code:
    \newcommand*
    zu nehmen, wenn man kein Argument oder Argumente ohne Absätze hat.

    Herbert

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •