如何使用 BibTex 创建参考文献列表(用于引用的项目)和参考书目(用于其他阅读材料/未引用的项目)

如何使用 BibTex 创建参考文献列表(用于引用的项目)和参考书目(用于其他阅读材料/未引用的项目)

我目前正在使用 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.bblcited.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.auxcited.bbl

7. 运行BibTexaddreading 文件。

结果是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}

部分页面

相关内容