对于讲座笔记/书籍项目,我遇到了以下问题:我有一个由 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
必须重新定义finentry
biblatex 宏
\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$
}