运行通常的 pdflatex-bibtex 循环
\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}
输出结果
我们看到 [Cam84, Cam91, Mos03]。
接下来是文献列表。如何获取
我们看到 [Cam84、Cam91 和 Mos03]。
自动(即不是通过编写类似的东西\cite{TheTerminator, TerminatorTwo}, and \cite{TerminatorThree}
)而不改变工作流程,即仍然使用 pdflatex、babel、babelbib、bibtex?我们可以修补样式文件(感谢@moewe!!!)并允许编写宏。
答案1
这个实现的总体思路很大程度上受到以下启发:胡安·A·纳瓦罗的回答到 Natbib:如何用“and”替换基于 \citet 的引用列表中的最后一个逗号?。
当 LaTeX 处理\cite
列表时,它只是循环遍历列表\@for
并对每个项目应用相同的步骤。据我所知,没有简单的方法可以判断您已经到达最后一个项目,因此需要一些技巧才能在最后一个引用之前插入不同的分隔符。
这里的想法基本上是“延迟”循环一步,代价是在循环后添加额外的处理步骤。这样我们就知道最后一个处理步骤发生在哪里。
\@citex
是来自 LaTeX 内核的标准定义,\@citexi
是执行循环操作的位。
\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}
由于书目风格与答案完全无关,我将其改回,babalpha-fl
以便那些不了解babalpha-fl-gs-sort
它是如何诞生以及从何处获得它的故事的人更容易理解这个例子。