我正在尝试向文件中的 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}]
}
}
}