Ausführen der üblichen pdflatex-bibtex-Schleife auf
\documentclass{article}
\usepackage[american,ngerman]{babel}%%% The book is in German.
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{TheTerminator,
author={James Cameron},
title={The {Terminator}},
year=1984,
language={american}
}
@misc{TerminatorTwo,
author={James Cameron},
title={Terminator 2: Judgement Day},
year=1991,
language={american}
}
@misc{TerminatorThree,
author={Jonathan Mostow},
title={Terminator 3: Rise of the Machines},
year=2003,
language={american}
}
\end{filecontents}
\usepackage{babelbib} % Multilingual bibliographies
\begin{document}
Wir schauten \cite{TheTerminator,TerminatorTwo,TerminatorThree}.
\bibliographystyle{babalpha-fl-gs-sort}%%% Avoid problematic abbreviations such as SS and SA, see https://tex.stackexchange.com/a/441877/165772. Also disabmiguate "Ber89"; see https://tex.stackexchange.com/a/472956/165772.
\bibliography{\jobname}
\end{document}
ergibt die Ausgabe
Wir schauen [Cam84, Cam91, Mos03].
gefolgt von der Literaturliste. Wie kann man
Wir schauen [Cam84, Cam91 und Mos03].
automatisch (also nicht durch Schreiben von etwas wie \cite{TheTerminator, TerminatorTwo}, and \cite{TerminatorThree}
), ohne den Arbeitsablauf zu ändern, also weiterhin pdflatex, babel, babelbib, bibtex zu verwenden? Wir dürfen die Stildatei patchen (danke an @moewe!!!) und Makros schreiben.
Antwort1
Die Grundidee dieser Implementierung ist stark inspiriert vonJuan A. Navarro'SAntwortZu Natbib: Wie ersetzt man das letzte Komma in einer \citet-basierten Zitationsliste durch „und“?.
Wenn LaTeX die \cite
Liste verarbeitet, durchläuft es sie einfach \@for
und wendet für jedes Element dieselben Schritte an. Soweit ich weiß, gibt es keine einfache Möglichkeit, festzustellen, dass Sie bereits beim letzten Element sind, und daher ist ein kleiner Trick erforderlich, um vor dem letzten Zitat ein anderes Trennzeichen einzufügen.
Die Idee besteht hier im Wesentlichen darin, die Schleife um einen Schritt zu „verzögern“, was jedoch bedeutet, dass nach der Schleife ein zusätzlicher Verarbeitungsschritt hinzugefügt wird. Auf diese Weise wissen wir, wo der letzte Verarbeitungsschritt stattfindet.
\@citex
ist die Standarddefinition des LaTeX-Kernels und \@citexi
ist das Bit, das die Schleifenaktion ausführt.
\documentclass{article}
\usepackage[american,ngerman]{babel}
\usepackage{babelbib}
\makeatletter
\newcommand*{\@citexi}[1]{%
\if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi
\@ifundefined{b@#1}
{\hbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation `#1' on page \thepage \space undefined}}%
{\@cite@ofmt{\csname b@#1\endcsname}}}
\def\@citex[#1]#2{\leavevmode
\let\@last@citeb\relax
\let\@citea\@empty
\@cite
{\@for\@citeb:=#2\do
{\ifx\@last@citeb\relax\else
\@citea\def\@citea{,\penalty\@m\ }%
\@citexi{\@last@citeb}%
\fi
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\let\@last@citeb\@citeb}%
\ifx\@last@citeb\relax\else
\ifx\@citea\@empty\else
\ \btxandcomma{}\btxandshort{}\ %
\fi
\@citexi{\@last@citeb}%
\fi}
{#1}}
\makeatother
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@misc{TheTerminator,
author={James Cameron and Anne Elk},
title={The {Terminator}},
year=1984,
language={american}
}
@misc{TerminatorTwo,
author={James Cameron},
title={Terminator 2: Judgement Day},
year=1991,
language={american}
}
@misc{TerminatorThree,
author={Jonathan Mostow and Anne Elk and Emma Sigfridsson},
title={Terminator 3: Rise of the Machines},
year=2003,
language={american}
}
\end{filecontents}
\begin{document}
Wir schauten \cite{TheTerminator,TerminatorTwo,TerminatorThree}.
Wir schauten \cite{TheTerminator,TerminatorTwo}.
Wir schauten \cite{TheTerminator}.
\bibliographystyle{babalpha-fl}
\bibliography{\jobname}
\end{document}
Da der Bibliografiestil für die Antwort völlig irrelevant ist, habe ich ihn wieder geändert, babalpha-fl
um das Beispiel für diejenigen leichter zugänglich zu machen, die die Geschichte, wie babalpha-fl-gs-sort
es entstanden ist und wo man es bekommen kann, nicht verfolgt haben.