不使用 Bibtex 按出现顺序对参考书目进行排序

不使用 Bibtex 按出现顺序对参考书目进行排序

有没有办法在不使用 Bibtex 的情况下按出现顺序对参考书目进行排序?我使用以下格式来排列参考书目

\begin{thebibliography}{}
\bibitem{ref1}{reference1}
\bibitem{re2} {reference2}
\end{thebibliography}

我尝试使用\bibliographystyle{unsrt},但没有效果。

答案1

通常 BibTeX 会负责对您的参考书目进行排序。而且 BibTeX 在这方面做得相当好,所以我强烈建议您让 BibTeX 对您的参考书目进行排序。如果您使用.bib文件,那么在需要更改样式时,重新使用您的参考书目数据会容易得多。

在引用顺序排序 ( unsrt) 的情况下,如果您另外接受语法上的细微变化,您可以thebibliography通过一些低级黑客攻击来自动对参考书目进行排序\bibitem

通常情况下,\bibitem的工作方式类似于\item,并且只接受一个参数(输入键)和一个可选参数(固定标签),输入数据本身不是 的参数\bibitem。要使下面的代码正常工作,输入数据需要是 的参数\bibitem。这意味着 中的条目thebibliography不能看起来像

\bibitem{foo} Lorem Ipsum.
\bibitem[bar]{bar} Dolor sit amet.

它们看起来一定像

\bibitem{foo}{Lorem Ipsum.}
\bibitem[bar]{bar}{Dolor sit amet.}

由于您的问题中已经提到了这些括号,我相信这对您来说不是什么大问题。

您可能需要运行 LaTeX 三次,直到所有引用标签都正确解析,但是当需要进一步运行时,您应该收到重新运行警告。

主要思想是,每当您\cite输入一个条目时,LaTeX 都会将键写入所有条目键的列表中。这是通过文件\citation中的宏实现的.aux,这意味着完整的引用顺序可在文档开头找到,但需要运行两次 LaTeX。

thebibliography它分为两个步骤,首先它收集所有条目及其数据(这就是我们需要附加参数的原因,这样\bibitem才能获取数据),然后第二步按照条目列表给出的顺序打印条目。

代码基于LaTeX 内核和 的\citation标准定义。对于不同的文档类或软件包(例如或 ),定义可能需要稍作调整(尽管代码已经与 兼容)。\bibitemthebibliographyarticle.clscitenatbibhyperref

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\usepackage{etoolbox}
%\usepackage{hyperref}

\makeatletter
\newcommand*{\lodbib@citeorder}{}
\newcommand*{\lodbib@notcited}{}% catch entries that were not cited

% macro in aux file
\def\citation{%
  \forcsvlist{\citation@i}}

\def\citation@i#1{%
  \ifinlist{#1}{\lodbib@citeorder}
    {}
    {\listxadd{\lodbib@citeorder}{#1}}}

\let\ltxorig@lbibitem\@lbibitem
\let\ltxorig@bibitem\@bibitem

% save bibitems
\def\@lbibitem[#1]#2#3{%
  \csdef{lodbib@savedlabel@#2}{#1}%
  \@bibitem{#2}{#3}}

\def\@bibitem#1#2{%
  \xifinlist{#1}{\lodbib@citeorder}
    {}
    {\listadd{\lodbib@notcited}{#1}}%
  \csdef{lodbib@savedentry@#1}{#2}}

\renewenvironment{thebibliography}[1]
     {\settowidth\labelwidth{\@biblabel{#1}}}
     {\def\@noitemerr
       {\@latex@warning{Empty `thebibliography' environment}}%
      \section*{\refname}%
      \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}%
      \list{\@biblabel{\@arabic\c@enumiv}}%
           {\leftmargin\labelwidth
            \advance\leftmargin\labelsep
            \@openbib@code
            \usecounter{enumiv}%
            \let\p@enumiv\@empty
            \renewcommand\theenumiv{\@arabic\c@enumiv}}%
      \sloppy
      \clubpenalty4000
      \@clubpenalty \clubpenalty
      \widowpenalty4000%
      \sfcode`\.\@m
      \lodbib@biblistloop
      \endlist}

\def\lodbib@biblistloop{%
  \forlistloop{\lodbib@bibitem}{\lodbib@citeorder}%
  \ifdefvoid{\lodbib@notcited}
    {}
    {\forlistloop{\lodbib@bibitem}{\lodbib@notcited}}}

\def\lodbib@bibitem#1{%
  \ifcsundef{lodbib@savedlabel@#1}
    {\ltxorig@bibitem{#1}}
    {\ltxorig@lbibitem[\csuse{lodbib@savedlabel@#1}]{#1}}%
  \csuse{lodbib@savedentry@#1}}
\makeatother


\begin{document}
\cite{ref2} and \cite{ref3} and \cite{ref1}

\begin{thebibliography}{C}
\bibitem{ref1}{AAAA}
\bibitem{ref2}{BBBB}
\bibitem[C]{ref3}{CCCC}
\bibitem{ref4}{DDDD}
\end{thebibliography}

\cite{ref2}
\end{document}

引用:“[1] 和 [C] 和 [2]”,参考书目:“[1] BBBB//[C] CCCC//[2] AAAA//[3] DDDD”

编辑:修复cite软件包,请参阅无需 Bibtex 即可按出现顺序引用多个参考文献

相关内容