有没有办法在不使用 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
标准定义。对于不同的文档类或软件包(例如或 ),定义可能需要稍作调整(尽管代码已经与 兼容)。\bibitem
thebibliography
article.cls
cite
natbib
hyperref
\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}
编辑:修复cite
软件包,请参阅无需 Bibtex 即可按出现顺序引用多个参考文献。