Eigener Befehl mit optionalem Argument und Fallunterscheidun

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Eigener Befehl mit optionalem Argument und Fallunterscheidun

von talueng » So 5. Sep 2010, 11:52

Danke, habe ich geändert. :) Vollständiger Code.
% Eigene Funktion für Zitate (kann statt \cite{key} verwendet).
% werden. Ergänzt typografisch korrekt formatierte Seitenangaben
% (geschützte Leerzeichen) samt "f." (bzw. "ff.") nach 
% folgender Logik: 
%
%    Zitieren von zwei Seiten:            S. [Seite] f.
%    Zitieren von drei bis fünf Seiten:   S. [Seite] ff.
%    Zitieren von mehr als fünf Seiten:   S. [von-bis]
%
% Aufruf:              \ct[seiten]{key}
%
% Parameter:
%   seiten (opt.) - Seitenangabe (einzelner Integer oder von-bis)
%   key - der BibTeX-Eintrag
%
% Beispiele:
%   \ct{Porter1980}
%   \ct[23]{Porter1980}
%   \ct[4-85]{Porter1980}
%
\newcounter{testA}
\makeatletter
\newcommand*\ct[2][]{%
  \cite{#2}\ifx\relax#1\relax\else, S.\,%
  \expandafter\Seite@i#1--\@nil\fi}
\def\Seite@i#1-#2-#3\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum \value{testA}=1
       \mbox{#1\,f.\xspace}\else\ifnum \value{testA}<6
         \mbox{#1\,ff.\xspace}\else#1--#2\fi\fi\fi}
\makeatother

von KOMA » So 5. Sep 2010, 11:21

talueng hat geschrieben:
\ifnum\thetestA=1
\theZählername sollte man nie für nummerische Vergleiche heranziehen, weil das die Ausgabe des Zählers ist und auch bei eigenen Zählern nicht sichergestellt ist, dass die nicht jemand aus irgendwelchen Gründen ändern. Besser ist, direkt den Wert des Zählers zu verwenden, also \value{Zählername} und damit in diesem Fall:
\ifnum \value{testA}=1
An dieser Stelle ist übrigens auch das Leerzeichen bzw. der Zeilenumbruch nach der 1 ganz wichtig, damit TeX das Lesen der Zahl wirklich beendet. Will man auf Nummer sicher gehen, kann man auch ein \relax hinter die Zahl stellen.

von talueng » So 5. Sep 2010, 10:38

Sehr schön, vielen Dank nochmal! :)

von CrazyHorse » So 5. Sep 2010, 08:32

talueng hat geschrieben: Vollständiger Code:
\newcounter{testA}
\makeatletter
\newcommand*\ct[2][]{%
  \cite{#2}\ifx\relax#1\relax\else, S.\,%
  \expandafter\Seite@i#1--\@nil\fi}
\def\Seite@i#1-#2-#3\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum\thetestA=1
       #1\,f.\else\ifnum\thetestA<6
         #1\,ff.\else#1--#2.\fi\fi\fi}
\makeatother 
ja, so sollte es eigentlich gleich sein ...

Herbert

von talueng » So 5. Sep 2010, 00:10

Jetzt funktioniert er zwar, gibt aber wieder falsches aus:

Aufruf:
Vgl. \ct[45]{Benner2009} \\%
Vgl. \ct[45-46]{Benner2009} \\%
Vgl. \ct[45-48]{Benner2009} \\%
Vgl. \ct[45-500]{Benner2009b} \\%
Vgl. Benner(2009a), S 45
Vgl. Benner(2009a), S 1f.
Vgl. Benner(2009a), S 1ff.
Vgl. Benner(2009b), S 1–23.
Offenbar habe ich die Fehlerstellen aber selbst gefunden, jedenfalls scheint es jetzt zu funktionieren. Vielleicht kannst Du trotzdem nochmal als zweites Auge drübergucken. Folgende Fehler habe ich geändert:

a) Hinter dem "S" fehlte ein Punkt -> "S."
b) Offenbar sind überall ein paar Rauten (#) verloren gegangen, weshalb es zu den fehlerhaften Ausgaben kam:
b1) 1f.\else\ifnum -> #1f.\else\ifnum
b2) 1ff.\else1--23. -> #1ff.\else#1--#2
c) Am Ende von b2) war ein Punkt zuviel
d) Ausserdem habe ich zwischen Seitenzahl und "f." (bzw. "ff.") noch der typografischen Schönheit halber ein geschütztes Leerzeichen eingefügt.

Vollständiger Code:
\newcounter{testA}
\makeatletter
\newcommand*\ct[2][]{%
  \cite{#2}\ifx\relax#1\relax\else, S.\,%
  \expandafter\Seite@i#1--\@nil\fi}
\def\Seite@i#1-#2-#3\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum\thetestA=1
       #1\,f.\else\ifnum\thetestA<6
         #1\,ff.\else#1--#2.\fi\fi\fi}
\makeatother 
Vielen Dank für die schöne Lösung, hätte ich alleine nie hinbekommen und hilft mir sehr!

von CrazyHorse » Sa 4. Sep 2010, 23:45

talueng hat geschrieben:Leider auch nicht. :( Das führt jetzt zu zwei Fehlermeldungen:
Bei mir nicht ...
\documentclass{article}

\newcounter{testA}
\makeatletter
\newcommand*\ct[2][]{%
  \cite{#2}\ifx\relax#1\relax\else, S\,%
  \expandafter\Seite@i#1--\@nil\fi}
\def\Seite@i#1-#2-#3\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum\thetestA=1
       1f.\else\ifnum\thetestA<6 
         1ff.\else1--23.\fi\fi\fi}
\makeatother

\begin{document}


Vgl. \ct{foo} \\%
Vgl. \ct[23]{foo} \\%
Vgl. \ct[23-24]{foo} \\%
Vgl. \ct[23-27]{foo} \\%
Vgl. \ct[24-500]{foo} 

\begin{thebibliography}{xxx}
\bibitem{foo}Foo, bar, baz 2010
\end{thebibliography}

\end{document}
Herbert

von talueng » Sa 4. Sep 2010, 23:12

Leider auch nicht. :( Das führt jetzt zu zwei Fehlermeldungen:
Runaway argument?
24]{Benner2009} \\Vgl. \ct[23-27]{Benner2009} \\Vgl. \ct[24-500]{BeETC.
! File ende while scanning use of \Seite@i.
! Extra \else.
\@include ...ediate \closeout \@partaux \fi \else
\deadcycles \z@ \@nameuse ...

von CrazyHorse » Sa 4. Sep 2010, 23:02

talueng hat geschrieben:Hallo Herbert, danke vielmals. Leider scheint es einen kleinen Haken zu geben:

Der folgende Aufruf:

Vgl. \ct{Benner2009} \\%
Vgl. \ct[23]{Benner2009} \\%
Vgl. \ct[23-24]{Benner2009} \\%
Vgl. \ct[23-27]{Benner2009} \\%
Vgl. \ct[24-500]{Benner2009b} \\%
führt bei mir zur Ausgabe:


Vgl. Benner(2009a) -- korrekt.
Vgl. Benner(2009a),S.23 -- korrekt.
Vgl. Benner(2009a),S.-1f. -- nicht korrekt.
Vgl. Benner(2009a),S.-1ff. -- nicht korrekt.
Vgl. Benner(2009b),S.-1–23-. -- nicht korrekt.
das war ein wenig schnell gestrickt ...
\def\Seite@i#1-#2-#3\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum\thetestA=1
       1f.\else\ifnum\thetestA<6 
         1ff.\else1--23.\fi\fi\fi}
sollte gehen.

Herbert

von talueng » Sa 4. Sep 2010, 22:26

Hallo Herbert, danke vielmals. Leider scheint es einen kleinen Haken zu geben:

Der folgende Aufruf:

Vgl. \ct{Benner2009} \\%
Vgl. \ct[23]{Benner2009} \\%
Vgl. \ct[23-24]{Benner2009} \\%
Vgl. \ct[23-27]{Benner2009} \\%
Vgl. \ct[24-500]{Benner2009b} \\%
führt bei mir zur Ausgabe:


Vgl. Benner(2009a) -- korrekt.
Vgl. Benner(2009a),S.23 -- korrekt.
Vgl. Benner(2009a),S.-1f. -- nicht korrekt.
Vgl. Benner(2009a),S.-1ff. -- nicht korrekt.
Vgl. Benner(2009b),S.-1–23-. -- nicht korrekt.

Re: Eigener Befehl mit optionalem Argument und Falluntersche

von CrazyHorse » Sa 4. Sep 2010, 22:07

talueng hat geschrieben:Ich möchte mir einen eigenen Zitationsbefehl basteln, der \cite{} ersetzt:

1. Argument: BibTeX-Key.
2. Argument: Seitenzahl (von).
3. Argument (optional): Seitenzahl (bis).

Aufruf dann als: \ct{BibTeXKey}{von}{bis} (z.B. \ct{Lee1990}{23}{40}
etwas abgeändert, das optionale Argument ist vorne:
\documentclass{article}

\newcounter{testA}
\makeatletter
\newcommand*\ct[2][]{%
  \cite{#2}\ifx\relax#1\relax\else, S\,%
  \expandafter\Seite@i#1-\@nil\fi}
\def\Seite@i#1-#2\@nil{%
  \ifx\relax#2\relax %    ohne -
    #1\else
    \setcounter{testA}{#2}%
    \addtocounter{testA}{-#1}%
    \ifnum\thetestA=1
       1f.\else\ifnum\thetestA<6 
         1ff.\else1-23.\fi\fi\fi}
\makeatother

\begin{document}

A~\ct{foo}
B~\ct[10]{foo}
C~\ct[1-2]{foo}
D~\ct[1-4]{foo}
E~\ct[17-33]{foo}

\begin{thebibliography}{xxx}
\bibitem{foo}Foo, bar, baz 2010
\end{thebibliography}

\end{document}
Herbert

Nach oben