向 bibitems 添加信息

向 bibitems 添加信息

对于讲座笔记/书籍项目,我遇到了以下问题:我有一个由 bibtex 处理的大量参考文献列表,这些条目来自大量的 bib 文件。现在,由于整个项目都是针对学生的,我想为特定参考文献添加一些建议,例如:

这是一本每个学生都必须看的标准教科书,对于本课程来说,第 3 章和第 4 章是最重要的。

当然,我可以将这样的行直接作为“注释”添加到 bib 文件中,但我不想用这样的我再也不需要的注释来破坏我的 bib 文件集合(想象一下这种注释偶然出现在期刊文章中)。

所以问题是:我是否可以修改 bibitem 命令的行为,以便我\bibnote{key}{text}在主文件中的某个地方有一个附加命令,获取 bibentry 的键并在其末尾添加一些文本,可能作为一个单独的段落。理想情况下,它会自动将内容直接写入 bbl 文件。

答案1

这是一个不需要更改样式文件的解决方案。它使用datatool包来收集笔记。还请注意,有 natbib 版本和不带 natbib 版本,请选择适合您需求的版本。

\documentclass[a4paper,10pt]{article}
\usepackage{natbib}
\usepackage{datatool}
\usepackage{etoolbox}

%% database for personal temporary notes
\DTLnewdb{bibnotes}

%% command for notes
\def\bibnote#1#2{%
  \DTLnewrow{bibnotes}
  \DTLnewdbentry{bibnotes}{mylabel}{#1}
  \DTLnewdbentry{bibnotes}{mynote}{#2}
}

%% patching the output
\makeatletter
%% if natbib is loaded
\patchcmd{\@lbibitem}%
  {\item[\hfil\NAT@anchor{#2}{\NAT@num}]}%
  {%
    \item[\hfil\NAT@anchor{#2}{\NAT@num}]%
    \DTLforeach[\DTLiseq{\mylabel}{#2}]{bibnotes}{\mylabel=mylabel,\mynote=mynote}{\textit{\mynote}}
  }{}{\message{^^JPatching failed^^J}}%

%% if natbib is not loaded
% \patchcmd{\@lbibitem}%
%   {\item[\@biblabel {#1}\hfill ]}%
%   {%
%     \item[\@biblabel {#1}\hfill ]%
%     \DTLforeach[\DTLiseq{\mylabel}{#2}]{bibnotes}{\mylabel=mylabel,\mynote=mynote}{\textit{\mynote}}
%   }{}{\message{^^JPatching failed^^J}}%
% \patchcmd{\@bibitem}%
%   {\item}%
%   {%
%     \item%
%     \DTLforeach[\DTLiseq{\mylabel}{#1}]{bibnotes}{\mylabel=mylabel,\mynote=mynote}{\textit{\mynote}}
%   }{}{\message{^^JPatching failed^^J}}%
\makeatother

\begin{document}

\cite{GhJaEn02,MeGa05,MuBeBoRo99}

\bibnote{GhJaEn02}{This is important }
\bibnote{GhJaEn02}{to understand chickens!}
\bibnote{MeGa05}{This is about penguins:}
\bibnote{MuBeBoRo99}{Cheese!}

\bibliographystyle{plainnat}
\bibliography{test}
\end{document}

在此处输入图片描述

答案2

如果是组合biblatex+biber选项,则可以使用映射功能将信息添加到 bibentry。这可以通过使用

\DeclareSourcemap{
  \maps{
    \map{
      \step[fieldset=entrykey, fieldvalue={<entryke>}]
      \step[fieldset=note, fieldvalue={text for <entrykey>}]
    }
  }
}

并对每个想要添加注释的参考资料使用地图。

或者另一种方法是引入一个新字段,notesonlyformystudent(并在文件中使用这样的字段.bib)。

\begin{filecontents}{biblatex-dm.cfg}
\DeclareDatamodelFields[type=field,datatype=literal]{notesonlyformystudents}
\DeclareDatamodelEntryfields{notesonlyformystudents}
\end{filecontents}

\DeclareFieldFormat{notesonlyformystudents}{#1}
\renewbibmacro{finentry}{\finentry\par\printfield{notesonlyformystudents}}

答案3

这是一个可以与biblatex和一起使用的解决方案bibtex

\makeatletter
\newcommand{\bibnote}[2]{\@namedef{#1note}{#2}}
\makeatother

因为biblatex必须重新定义finentrybiblatex 宏

\renewbibmacro{finentry}{\finentry\par\csname \thefield{entrykey}note\endcsname\finentry}

因为bibtex必须修改.bst书目样式,特别是重新定义fin.entry如下功能:

FUNCTION {fin.entry}
{ add.period$
  write$
  newline$
  "\par\csname " write$
  cite$ write$
  "note\endcsname" write$
  newline$
}

答案4

最简单的解决方案是使用 natbib。请阅读图片中附带的文档部分。合并需要使用 natbib 调用。

相关内容