Ejecutando el bucle habitual pdflatex-bibtex en
\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}
produce la salida
Wir schauten [Cam84, Cam91, Mos03].
seguido de la lista de literatura. ¿Cómo se puede conseguir
Wir scauten [Cam84, Cam91 y Mos03].
automáticamente (es decir, no escribiendo algo como \cite{TheTerminator, TerminatorTwo}, and \cite{TerminatorThree}
) sin cambiar el flujo de trabajo, es decir, ¿seguir usando pdflatex, babel, babelbib, bibtex? Se nos permite parchear el archivo de estilo (¡¡gracias a @moewe!!!) y se nos permite escribir macros.
Respuesta1
La idea general de esta implementación está fuertemente inspirada enJuan A. Navarro'srespuestaa Natbib: ¿Cómo reemplazar la última coma en una lista de citas basada en \citet con "y"?.
Cuando LaTeX procesa la \cite
lista, simplemente recorre la lista \@for
y aplica los mismos pasos para cada elemento. Hasta donde yo sé, todavía no existe una manera sencilla de saber que estás en el último elemento, por lo que se necesita un poco de astucia para insertar un separador diferente antes de la última cita.
La idea aquí es básicamente "retrasar" el ciclo un paso a costa de agregar un paso de procesamiento adicional después del ciclo. De esa manera sabemos dónde ocurre el último paso del procesamiento.
\@citex
es la definición estándar del kernel LaTeX y \@citexi
es el bit que realiza la acción del bucle.
\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}
Dado que el estilo de la bibliografía es completamente irrelevante para la respuesta, volví a cambiarlo para babalpha-fl
que el ejemplo sea más accesible para aquellos que no han seguido la historia de cómo babalpha-fl-gs-sort
nació y dónde conseguirlo.