Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Frage zu newcommand

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.01.2013
    Beiträge
    8

    Frage zu newcommand

    Hallo,

    ich habe mir mittels newcommand ein eigenes Kommando angelegt, mit dem ich zu einer URL das Abrufdatum als Fußnote angeben kann, wobei das Datum optional ist. Das funktioniert soweit ganz gut, bis auf die Fälle, in denen das optionale Datum mit 11 oder 22 beginnt. Zum Testen habe ich auch doppelte Buchstaben probiert, was den gleichen Effekt hat.

    Könnt ihr mir bitte erklären, woher der Effekt kommt? Es lässt sich sicherlich eleganter lösen, aber ich habe keine weitere Idee, woher das Problem kommen kann.

    Das Beispiel:
    Code:
    \documentclass{scrreprt}
    \newcommand*\urls[2][\empty]
    { 
      \ifx#1\empty
        \url{#2}
      \else
        \url{#2}\footnote{Abruf am: #1} 
      \fi
    }
    \usepackage{hyperref}
    
    \begin{document}
    Fehler: \urls[22.02.2013]{http://www.google.de} 
    
    funktioniert (ohne Datum): \urls{http://www.google.de} 
    
    funktioniert (mit Leerzeichen): \urls[ 22.05.2013]{http://www.google.de}
    
    funktioniert: \urls[01.05.2013]{http://www.google.de}
    
    Fehler: \urls[11.05.2013]{http://www.google.de}
    
    Fehler: \urls[22.05.2013]{http://www.google.de}
    
    Fehler: \urls[zz.ww]{http://www.google.de}
    \end{document}
    Vielen Dank
    eisbaer

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Deine if-Abfrage geht einfach ins leere:

    Bei gleichem Token machst du:

    \ifx a a \empty

    a=a ist aber richtig. Somit gibt er empty aus.

    Du solltest hier mit xparse arbeiten:

    Code:
    \documentclass{scrreprt}
    \usepackage{xparse}
    \NewDocumentCommand\urls{ o m }%
    {% 
      \url{ #2 }%
       \IfNoValueF{#1}{\footnote{Abruf am: #1}}%
     }
    \usepackage{hyperref}
    
    \begin{document}
    Fehler: \urls[22.02.2013]{http://www.google.de} 
    
    funktioniert (ohne Datum): \urls{http://www.google.de} 
    
    funktioniert (mit Leerzeichen): \urls[ 22.05.2013]{http://www.google.de}
    
    funktioniert: \urls[01.05.2013]{http://www.google.de}
    
    Fehler: \urls[11.05.2013]{http://www.google.de}
    
    Fehler: \urls[22.05.2013]{http://www.google.de}
    
    Fehler: \urls[zz.ww]{http://www.google.de}
    \end{document}
    Marco

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Zitat Zitat von mechanicus Beitrag anzeigen
    Du solltest hier mit xparse arbeiten:
    Der Empfehlung kann ich mich nur anschließen. Im konkreten Fall hätte ich allerdings fast geschrieben, dass als Alternativ auch das von KOMA-Script bereitgestellt \ifstr ausreichen könnte:
    Code:
    \documentclass{scrreprt}
    \newcommand*\urls[2][]{%
      \url{#2}%
      \ifstr{#1}{}{}{\footnote{Abruf am: #1}}%
    }
    \usepackage{hyperref}
    
    \begin{document}
    Fehler: \urls[22.02.2013]{http://www.google.de} 
    
    funktioniert (ohne Datum): \urls{http://www.google.de} 
    
    funktioniert (mit Leerzeichen): \urls[ 22.05.2013]{http://www.google.de}
    
    funktioniert: \urls[01.05.2013]{http://www.google.de}
    
    Fehler: \urls[11.05.2013]{http://www.google.de}
    
    Fehler: \urls[22.05.2013]{http://www.google.de}
    
    Fehler: \urls[zz.ww]{http://www.google.de}
    \end{document}
    Ich sehe allerdings ein ganz anderes Problem bei dem Befehl. Da hier nicht mehr \url, sondern bereits \urls das Argument liest, funktioniert die Sonderbehandlung von Sonderzeichen nicht mehr:
    Code:
    \documentclass{scrreprt}
    \usepackage{xparse}
    \NewDocumentCommand\urls{ o m }%
    {% 
      \url{ #2 }%
       \IfNoValueF{#1}{\footnote{Abruf am: #1}}%
     }
    \usepackage{hyperref}
    
    \begin{document}
    Funktioniert: \url{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    Funktioniert nicht: \urls{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    
    \end{document}
    Bei Verwendung von \ifstr ist das übrigens genau dasselbe Problem. Bei Verwendung von xparse gibt es aber wenigstens Ansatzweise eine Lösung:
    Code:
    \documentclass{scrreprt}
    \usepackage{xparse}
    \NewDocumentCommand\urls{ o v }%
    {% 
      \url{ #2 }%
       \IfNoValueF{#1}{\footnote{Abruf am: #1}}%
     }
    \usepackage{hyperref}
    
    \begin{document}
    Funktioniert: \url{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    Funktioniert auch (fast): \urls{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    
    \end{document}
    Ich scheibe deshalb "ansatzweise", weil ich die xparse-Anleitung so deute, dass das nicht immer funktioniert und bei meinen Tests der zweite Link nicht geöffnet werden konnte, während der erste problemlos funktionierte. Also empfehle ich, auf diese Schreibfaulheitsanweisung eher zu verzichten.

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.01.2013
    Beiträge
    8
    Hallo mechanicus, hallo klops,

    vielen Dank für eure Antworten. Das mit der if-Abfrage war mir nicht klar, dass dort nur zeichenweise verglichen wird. Wieder was gelernt.

    Der xparse-Vorschlag funktioniert soweit, nur dass die Sonderzeichen in den URLs besonders behandelt werden müssen. Da werde ich wohl die "Schreibfaulheitsanweisung" [ (c) by klops ] wegwerfen und schön die Fußnoten einzeln setzen. War wohl nix mit erhofften Arbeitserleichterung :-(

    Vielen Dank
    eisbaer

  5. #5
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Zitat Zitat von eisbaer Beitrag anzeigen
    Das mit der if-Abfrage war mir nicht klar, dass dort nur zeichenweise verglichen wird.
    Das stimmt so nicht bei \ifx wird nicht zeichenweise, sondern die Expansion der ersten beiden Token nach \ifx verglichen. Was man jedoch beachten muss ist, dass TeX eine Makrosprache ist. Das bedeutet, dass die Argumente zu einer Anweisung direkt eingesetzt werden. Und wenn man jetzt "aa" als Argument übergibt, dann sind das eben genau zwei a-Token. Dagegen würde beispielsweise bei
    Code:
    \def\aa{aa}
    \def\bb{bb}
    \ifx\aa\bb gleich\else ungleich\fi
    die Expansion der Token \aa mit der Expansion der Token \bb verglichen, also "aa" mit "bb" und das Ergebnis wäre "ungleich". Noch einmal anders arbeitet \if. Dazu gibt es in der aktuellen DTK einen schönen Artikel von Rolf und Herbert.

    Näheres zu \ifx und \if ist aber auch TeX by Topic zu entnehmen. Anwendern sei aber ausdrücklich empfohlen, eher LaTeX-Anweisungen zu verwenden, bei denen sich bereits jemand Gedanken zu dem Problem gemacht hat. Neben dem l3-Paket xparse und \ifstr aus scrbase gibt es auch noch Pakete
    wie ifthen oder xstring. Bei Verwendung von pdflatex gibt es übrigens auch die Anweisung \pdfstrcmp, die im pdfTeX-Manual im Abschnitt Strings (bei mir 7.15 auf Seite 37) erklärt ist.

  6. #6
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    der Argumenttyp v steht eigentlich für "verbatim", was eben leichte Nachteile mit sich bringt.

    Du kannst auch den implementierten Hook nutzen:

    Code:
    \documentclass{scrreprt}
    \usepackage{xparse}
    \NewDocumentCommand\urls{ o }%
    {% 
      \IfNoValueF{#1}{\def\UrlRight{\footnote{Abruf am: #1}\gdef\UrlRight{}}}%
      \url%
     }
    \usepackage{hyperref}
    
    \begin{document}
    Funktioniert: \url{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    Funktioniert: \urls[asdsad]{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    Funktioniert: \urls{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    Funktioniert: \urls[asdsad]{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    \end{document}

  7. #7
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Zitat Zitat von mechanicus Beitrag anzeigen
    Hi,

    der Argumenttyp v steht eigentlich für "verbatim", was eben leichte Nachteile mit sich bringt.

    Du kannst auch den implementierten Hook nutzen:

    Code:
    \documentclass{scrreprt}
    \usepackage{xparse}
    \NewDocumentCommand\urls{ o }%
    {% 
      \IfNoValueF{#1}{\def\UrlRight{\footnote{Abruf am: #1}\gdef\UrlRight{}}}%
      \url%
     }
    ...
    Das zerstört aber die Schriftauswahl für die URLs wenn das optionale Argument benutzt wird. Die nehmen dann den Umgebungsfont statt Teletype.

    Grüße
    Clemens

  8. #8
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Eines der Probleme ist, dass \UrlRight noch im Mathemodus gesetzt wird. Deshalb vielleicht besser so:
    Code:
    \documentclass{scrreprt}
    \usepackage{hyperref}
    \makeatletter
    \def\Url@FormatString{%
     \UrlFont \Url@MathSetup 
     $\fam\z@ \textfont\z@\font
     \expandafter\UrlLeft\Url@String\UrlRight
     \m@th$%
     \ifx\UrlFootnote\@empty\else\footnote{\UrlFootnote}\fi
     \gdef\UrlFootnote{}%
    }%
    \makeatother
    \newcommand*{\UrlFootnote}{}
    \newcommand{\urls}[1][]{%
      \ifstr{#1}{}{}{\def\UrlFootnote{Zuletzt besucht: #1}}%
      \url
    }
    
    \begin{document}
    Funktioniert: \url{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    
    Funktioniert: \urls[asdsad]{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    
    Funktioniert: \urls{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    
    Funktioniert: \urls[asdsad]{http://projekte.dante.de/DTK/AutorInfo#Rechtschreibung}
    \end{document}

  9. #9
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Zitat Zitat von cgnieder Beitrag anzeigen
    Das zerstört aber die Schriftauswahl für die URLs wenn das optionale Argument benutzt wird. Die nehmen dann den Umgebungsfont statt Teletype.

    Grüße
    Hi

    ist mir gar nicht aufgefallen

    Gruß
    Marco

Lesezeichen

Berechtigungen

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