我目前正在使用 Mac 版 Texshop (LaTex) 上的 {report} 类撰写我的博士论文。我使用 BibTex 编译了我的参考文献列表,在其中我创建了一个名为“数据库”的库,其中包含我读过的所有文本。
使用命令:
\bibliography{database}
在序言中,我可以生成文中引用的参考文献的参考书目。
或者
使用以下命令:
\nocite{database}
在序言中,我可以生成我图书馆中编译的所有参考文献的参考书目(包括引用的参考文献和附加阅读材料)。
如何获得两个不同的部分,一个用于引用参考文献,一个用于补充阅读?
答案1
我同意有更好的方法。但是,在原始作者给出的限制内,这里有一个相当复杂的方法。
假设您的文档名为document.tex
,您的引用在 中database.bib
,并且您希望将 中所有database.bib
未明确引用的参考文献都放在 附加阅读材料 中:
1. 按原样编译文档
\documentclass{article}
\bibliographystyle{plain}
\begin{document}
Some text \cite{Acevedo12}.
\bibliography{database}
\end{document}
这样 document.aux
文件就会包含\citation{key}
每个引文的条目。在本例中,它包含一个条目\citation{Acevedo12}
。
2. 运行BibTex
这将创建 document.bbl
格式化的参考部分文件。该\bibliography
命令类似于\input{document.bbl}
下文中的命令,并将按如下方式使用。
3. 重命名document.bbl
为cited.bbl
这将保存所引用参考文献的格式化书目。
4. 添加\nocite{*}
并重新编译您的文档
\documentclass{article}
\bibliographystyle{plain}
\begin{document}
Some text \cite{Acevedo12}.
\nocite{*}
\bibliography{database}
\end{document}
这将导致document.aux
文件包含命令\citation{*}
,该命令将指示BibTex
包含库中的所有引用。
5. 运行BibTex
这将创建一个新document.bbl
文件,其中包含库中针对参考文献部分格式化的所有参考文献。
6. 创建一个新的.tex
文档(假设名为addreading.tex
),内容如下并编译
\documentclass{article}
\bibliographystyle{plain}
\usepackage{etoolbox}
\usepackage{ifthen}
\makeatletter
\newcounter{citedrefcount}%
\newcommand\setcited[2]{\expandafter\gdef\csname citedref#1\endcsname{#2}}
\newcommand\addcited[1]{\stepcounter{citedrefcount}\setcited{\thecitedrefcount}{#1}}%
\newcommand\getcited[1]{\csuse{citedref#1}}%
\newcommand\adduncited[1]{%only add if the reference key is not contained within the cited references
\newcount\temp\aloop\temp=1 step 1 until {\thecitedrefcount} do {%
\gdef\uncited{\cite{#1}}
\ifthenelse{\equal{\getcited{\@arabic\temp}}{#1}}%compare the citation key to the \temp citedref key
{%citekey matches a citedref. redefine \uncited to do nothing and end the loop
\gdef\uncited{\relax}%
\temp=\thecitedrefcount}%
{%citekey does not match checked citedref. do nothing (keep definition of \uncited)
}} \endaloop\temp
\uncited%execute \uncited (does nothing if reference is already in the cited list, cites the reference if it is not citedyet).
}
\makeatother
%%% Basic Loop
%Taken from David Salomon's The Advanced TeXbook pg 191
\def\aloop#1=#2 {%
\long\def\next step ##1 until ##2 do ##3 \endaloop#1{%
##3%
\advance#1 by ##1
\ifnum#1>##2\relax\else\next step ##1 until ##2 do ##3 \endaloop#1 \fi%
}%end of \next
#1=#2 \next}%end of \aloop
\begin{document}
\def\bibitem#1{\addcited{#1}}
\input{cited.bbl}
\def\bibitem#1{\adduncited{#1}}
\input{document.bbl}
\bibliography{database}
\end{document}
这会将文件中的引用键document.bbl
与文件中的引用键进行比较cited.bbl
,仅将文件中不存在的引用键(即未在原始文档中引用)添加到文件\citation{key}
中。addreading.aux
cited.bbl
7. 运行BibTex
addreading 文件。
结果是addreading.bbl
,这是原始文档中未引用的参考文献的格式化参考文献部分。
8.最后修改原文档,引用两个.bbl文件
\documentclass{article}
\bibliographystyle{plain}
\begin{document}
Some text \cite{Acevedo12}.
\input{cited.bbl}
\renewcommand\refname{Additional Reading}
\input{addreading.bbl}
\end{document}
编辑:
重新定义the bibliography
环境以考虑任一参考部分中的最大参考数量,使得枚举能够继续,并且在几次运行后对齐是正确的。
\documentclass{article}
\bibliographystyle{plain}
\usepackage{ifthen}
\newcounter{allcitations}%counter to hold the total number of citations
\gdef\maxsubcitations{0}%maximum number of citations in a citation list (determines the space necessary for the enumeration
\makeatletter
\let\oldthebib\thebibliography
\let\oldendthebib\endthebibliography
\renewenvironment{thebibliography}[1]{%redefine thebibliography environment to have a running count and align based on the largest number of citations
\oldthebib{\maxsubcitations}%
\ifthenelse{#1>\maxsubcitations}%
{%
\gdef\maxsubcitations{#1}
\immediate\write\@auxout{\noexpand\gdef\noexpand\maxsubcitations{#1}}
}{}
\addtocounter{\@listctr}{\theallcitations}
}{%
\addtocounter{allcitations}{\c@enumiv}
\oldendthebib}
\makeatother
\begin{document}
Some text \cite{Acevedo12}.
\input{cited.bbl}
\renewcommand\refname{Additional Reading}
\input{addreading.bbl}
\end{document}