biblatex 多个源图:将字段添加到条目

biblatex 多个源图:将字段添加到条目

我正在尝试向文件中的 biblatex 条目添加一个字段tex。我目前无法将规则应用于一个条目,然后将其他规则应用于其他条目。

我定义了一个添加字段的命令。它有些问题,但我不知道是什么问题:

\newcommand{\addnotetoentry}[2]{%
  \DeclareSourcemap{%
  \maps[datatype=bibtex]{%
    \map[overwrite]{%
      \step[fieldsource=entrykey,match=\regexp{^#1$},final]%
      \step[fieldset=note,fieldvalue={#2}]%
    }%
  }%
}%
}

用法如下:

\addnotetoentry{a}{one note --- hello my friend}
\addnotetoentry{b}{another note}

梅威瑟:

\documentclass[12pt,letterpaper]{article}
\usepackage[backend=biber,style=alphabetic-verb,doi=false,eprint=false]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{jobname.bib}
@ARTICLE{a,
   author = {Doe, J.},
   title = {The Title},
   journal = {The Journal},
}
@ARTICLE{b,
   author = {Smith, J.},
   title = {The New Title},
   journal = {The Same Journal},
}
\end{filecontents}
\addbibresource{jobname.bib}

\newcommand{\addnotetoentry}[2]{%
  \DeclareSourcemap{%
  \maps[datatype=bibtex]{%
    \map[overwrite]{%
      \step[fieldsource=entrykey,match=\regexp{^#1$},final]%
      \step[fieldset=note,fieldvalue={#2}]%
    }%
  }%
}%
}
\addnotetoentry{a}{one note}
\addnotetoentry{b}{another note}
\AtEveryBibitem{\printfield{note}\clearfield{note}\item}

\begin{document}

\nocite{*}
\printbibliography
\end{document}

我在输出的参考中只得到一个注释(我定义的最后一条):

有缺陷的输出

答案1

Biber 的问题\DeclareSourcemap在于它只能在文档中使用一次(仅执行最后一个实例,所有其他调用将被忽略)*,因此很难使用 实现宏\DeclareSourcemap

如果您只是想对一些参考书目条目添加评论,我们可以采用不同的方法。

\newcommand*{\writecomment}[2]{\csdef{localcomment#1}{#2}}

我们\writecomment定义一个宏localcomment<entrykey><entrykey>如同在 ) 中给出的一样,#1其取值为#2

然后可以将该宏localcomment<entrykey>用作\csuse{localcomment<entrykey>}

每个元素之前:

\AtEveryBibitem{\csuse{localcomment\thefield{entrykey}}\item}

或者在每个元素之后:

\renewbibmacro*{finentry}{%
  \finentry
  \ifcsdef{localcomment\thefield{entrykey}}
    {\\\csuse{localcomment\thefield{entrykey}}}
    {}%
}

\csuse如果其参数不是有效的命令序列,将不会执行任何操作;这意味着,如果宏不是通过\writecomment此创建的,则根本不会有任何输出。

这个解决方案的另一个优点是,我们不必摆弄该note字段,也不会覆盖现有的note字段。

使用\writecomment很简单:\writecomment{<entrykey>}{<note>}

\writecomment{a}{first comment}
\writecomment{b}{second comment}

平均能量损失

\documentclass{article}
\usepackage[backend=biber,style=alphabetic-verb,doi=false,eprint=false]{biblatex}
\begin{filecontents}{jobname.bib}
@ARTICLE{a,
   author = {Doe, J.},
   title = {The Title},
   journal = {The Journal},
}
@ARTICLE{b,
   author = {Smith, J.},
   title = {The New Title},
   journal = {The Same Journal},
}
@ARTICLE{c,
   author = {Miller, J.},
   title = {The New Title},
   journal = {Won't Get A Comment},
}
\end{filecontents}
\addbibresource{jobname.bib}

\newcommand*{\writecomment}[2]{\csdef{localcomment#1}{#2}}
\AtEveryBibitem{\csuse{localcomment\thefield{entrykey}}\item}

\writecomment{a}{first comment}
\writecomment{b}{second comment}

\begin{document}
  \nocite{*}
  \printbibliography
\end{document}

在此处输入图片描述

* 我找不到任何文件来支持这一说法,但我确信它是正确的。

答案2

因此显然你不能向\DeclareSourcemap 一个乳胶文件中添加多个,因为它只考虑了最后一个。


一种解决方案是仅声明一个源映射并手动修改条目

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite]{
      \step[fieldsource=entrykey,match=\regexp{^a$},final]
      \step[fieldset=note,fieldvalue={one note}]
    }
    \map[overwrite]{
      \step[fieldsource=entrykey,match=\regexp{^b$},final]
      \step[fieldset=note,fieldvalue={another note}]
    }
  }
}

相关内容