PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu newcommand



eisbaer
05-06-2013, 13:52
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:


\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

mechanicus
05-06-2013, 16:15
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:


\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

klops
05-06-2013, 16:35
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:

\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:
\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:
\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.

eisbaer
05-06-2013, 17:16
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

klops
06-06-2013, 07:40
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
\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 (http://www.ctan.org/texbytopic) 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.

mechanicus
06-06-2013, 11:24
Hi,

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

Du kannst auch den implementierten Hook nutzen:


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

cgnieder
07-06-2013, 16:05
Hi,

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

Du kannst auch den implementierten Hook nutzen:


\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

klops
07-06-2013, 16:41
Eines der Probleme ist, dass \UrlRight noch im Mathemodus gesetzt wird. Deshalb vielleicht besser so:
\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}

mechanicus
07-06-2013, 18:12
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 :confused:

Gruß
Marco