Executando o loop usual pdflatex-bibtex em
\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}
produz a saída
Wir schauten [Cam84, Cam91, Mos03].
seguido pela lista de literatura. Como alguém pode conseguir
Wir schauten [Cam84, Cam91 e Mos03].
automaticamente (ou seja, não escrevendo algo como \cite{TheTerminator, TerminatorTwo}, and \cite{TerminatorThree}
) sem alterar o fluxo de trabalho, ou seja, ainda usando pdflatex, babel, babelbib, bibtex? Temos permissão para corrigir o arquivo de estilo (obrigado @moewe!!!) e escrever macros.
Responder1
A ideia geral desta implementação é fortemente inspirada emJuan A. Navarroderesponderpara Natbib: Como substituir a última vírgula em uma lista de citações baseada em \citet por “e”?.
Quando o LaTeX processa a \cite
lista, ele apenas percorre a lista \@for
e aplica as mesmas etapas para cada item. Até onde eu sei, não há uma maneira simples de saber se você já está no último item e, portanto, é necessário um pouco de truque para inserir um separador diferente antes da última citação.
A idéia aqui é basicamente "atrasar" o loop em uma etapa ao custo de adicionar uma etapa de processamento adicional após o loop. Dessa forma, sabemos onde acontece a última etapa do processamento.
\@citex
é a definição padrão do kernel LaTeX e \@citexi
é o bit que executa a ação do loop.
\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}
Como o estilo da bibliografia é completamente irrelevante para a resposta, voltei para babalpha-fl
tornar o exemplo mais facilmente acessível para quem não acompanhou a história de como babalpha-fl-gs-sort
nasceu e onde obtê-lo.