在我的一篇文章中,采用了作者编号引用格式(又称温哥华系统),
在文本中使用数字来引用参考列表中的编号条目
(引自维基百科)
当我编译文章的 TeX 相关文件时,分配给每个引文的编号由该引文在文章中的出现顺序决定。我打算在文章中插入一些新引文。但我想将它们添加到参考列表的末尾,以便分配给已经存在的参考文献的编号不会改变。如何做到这一点?
答案1
LaTeX 自动参考书目解决方案(BibTeX 和)的重点biblatex
在于您不必担心格式化和排序参考书目:所有内容都按照明确定义的方案排序。
问题在于,改变排序顺序并不容易。因此我强烈建议您接受当您添加或删除来源时参考书目编号可能会发生变化:这就是重点。
理论上,有一些方法可以阻止 BibTeX 正确排序参考书目。但这需要手动干预或不同的引用命令,在我看来,这违背了 LaTeX 引用和参考书目处理的目的。无论如何,这里有两个想法。
thebibliography
当你编译这样的文档时
\documentclass{article}
\begin{document}
lorem \cite{inbook-full}
ipsum \cite{article-full}
\bibliographystyle{unsrt}
\bibliography{xampl}
\end{document}
使用 LaTeX、BibTeX、LaTeX、LaTeX。BibTeX 将准备排版的参考书目写入文件.bbl
,然后 LaTeX 只需读取该文件并排版参考书目即可。
如果您现在想在参考书目末尾附加另一个引文,即使它可能在任何地方被引用,您也可以将文件的内容复制.bbl
到\bibliography
文档中的位置,然后在末尾手动添加引文条目
\documentclass{article}
\begin{document}
lorem \cite{order}
lorem \cite{inbook-full}
ipsum \cite{article-full}
\bibliographystyle{unsrt}
\newcommand{\noopsort}[1]{} \newcommand{\printfirst}[2]{#1}
\newcommand{\singleletter}[1]{#1} \newcommand{\switchargs}[2]{#2#1}
\begin{thebibliography}{1}
\bibitem{inbook-full}
Donald~E. Knuth.
\newblock {\em Fundamental Algorithms}, volume~1 of {\em The Art of Computer
Programming}, section 1.2, pages 10--119.
\newblock Addison-Wesley, Reading, Massachusetts, second edition, 10~January
{\noopsort{1973b}}1973.
\newblock This is a full INBOOK entry.
\bibitem{article-full}
L[eslie]~A. Aamport.
\newblock The gnats and gnus document preparation system.
\newblock {\em \mbox{G-Animal's} Journal}, 41(7):73+, July 1986.
\newblock This is a full ARTICLE entry.
\bibitem{order}
Ann Elk.
\newblock A Theory on Brontosauruses.
\newblock 1972.
\end{thebibliography}
\end{document}
您可以通过移动 中的条目来完全控制排序thebibliography
。缺点是您必须手动为引用的新来源创建条目(当然,它们可以通过在其他文档上正常运行 BibTeX 来获得)。
使用新的引用命令实现“自动”解决方案
以下解决方案创建一个新的引用命令\defercite
,其引用将添加到参考书目的末尾(按照它们在文本中出现的顺序)。
它的工作原理是在引用来源时不向文件发送引用请求.aux
,而是将其添加到列表中并在文档末尾写出引用请求。
(注意:此 MWE 假设 LaTeX 内核的标准定义\cite
,因为问题中没有 MWE,也没有提示可能使用其他包(例如cite
或)natbib
。如果您正在加载其中一个包,则可能需要不同的定义。)
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand*{\defercitelist}{}
\DeclareRobustCommand\defercite{%
\@ifnextchar [{\@tempswatrue\@defercitex}{\@tempswafalse\@defercitex[]}}
\def\@defercitex[#1]#2{\leavevmode
\let\@citea\@empty
\@cite{\@for\@citeb:=#2\do
{\@citea\def\@citea{,\penalty\@m\ }%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\listxadd{\defercitelist}{\@citeb}%
\@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}}
\newcommand*{\citeunsort@writecitation}[1]{%
\if@filesw\immediate\write\@auxout{\string\citation{#1}}\fi}
\AtEndDocument{%
\forlistloop{\citeunsort@writecitation}{\defercitelist}}
\makeatother
\begin{document}
order \defercite{incollection-full}
lorem \cite{inbook-full}
ipsum \cite{article-full}
\bibliographystyle{unsrt}
\bibliography{xampl}
\end{document}
如果你想完全控制排序,请删除该\AtEndDocument
块并添加
\nocite{<new key 1>,<new key 2>, ..., <new key n>}
在调用结束后,\bibliography
按照您希望条目在参考书目中出现的顺序进行操作。