我正在寻找一种方法来使用 BibLaTeX(按字母顺序引用和参考书目样式)突出显示我自己以前出版物的引用,例如在文本和参考书目中使用双括号作为引用标记。它应该如下所示:
This is a paper published by myself [[MS15]] and that is a paper published
by someone else [AB14].
References:
[[MS15]] Moser, S., ...., Title, Year.
[AB14] Author X., ...., Title, Year.
我有一个使用 BibTex 的有效解决方案。因此,我将“alphadin.bst”复制到我的 LaTeX 项目文件夹,并为用于我自己的出版物的自定义 bibtex 类型添加了一些附加条目:
FUNCTION {output.mybibitem}
{ newline$
"\bibitem[{[" write$
label write$%
"]}]{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem[" write$
label write$%
"]{" write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
[...]
FUNCTION {article}
{ output.bibitem
article.common
}
FUNCTION {myarticle}
{ output.mybibitem
article.common
}
这样我就可以将自定义条目添加到 Bibtex 文件(例如“myarticle”)。它们在引用标记和参考书目中都用双括号打印。
由于各种原因,我想切换到 BibLaTeX 和 Biber 作为后端。因此我的问题是:是否有类似的解决方案,甚至更好的方法来实现这一点?我不一定需要在参考书目文件中为“我的”出版物添加额外的类型。例如,也可以使用关键字和使用可用的标准类型。
我根本不喜欢拥有当前 BibTex 解决方案的本地修改版“alphadin.bst”。因此,如果我可以“修补”BibLaTeX 的行为,而不需要完全冗余的样式文件,那就太好了。
在此先非常感谢你们提供的任何有用的解决方案!
亲切的问候,
斯特芬
答案1
keyword
从编程角度来看,使用s 非常容易。因此,您只需添加keyowrds={mywork}
到条目中并使用标准条目类型即可。
@Article{Benji,
author = {Benji},
keywords = {mywork},
}
numeric
您可以numeric-verb
使用
\DeclareFieldFormat{labelnumberwidth}{\ifkeyword{mywork}{[\mkbibbrackets{#1}]}{\mkbibbrackets{#1}}}
\renewbibmacro*{cite}{%
\printtext[bibhyperref]{%
\ifkeyword{mywork}{[}{}%
\printfield{prefixnumber}%
\printfield{labelnumber}%
\ifkeyword{mywork}{]}{}%
\ifbool{bbx:subentry}
{\printfield{entrysetcount}}
{}}}
在goLaTeX 上有一个非常类似的问题楼主使用的style=ieee
这个方法很难正确使用。可以用xpatch
\makeatletter
\newtoggle{cbx@lastmywork}
\xpatchbibmacro{cite:comp:comp}
{\savefield{labelnumber}{\cbx@lastnumber}}
{\savefield{labelnumber}{\cbx@lastnumber}%
\ifkeyword{mywork}{\toggletrue{cbx@lastmywork}}{\togglefalse{cbx@lastmywork}}}
{}{}
\xpatchbibmacro{cite:dump}
{\printtext{\cbx@lastnumber}}
{\printtext[labelnumber]{\cbx@lastnumber}}
{}{}
\DeclareFieldFormat{labelnumber}{%
\ifboolexpr{test {\ifkeyword{mywork}} or togl {cbx@lastmywork}}
{[#1]}
{#1}}
\makeatother
因为numeric-comp
我们可以放弃修补cite:dump
,
\makeatletter
\newtoggle{cbx@lastmywork}
\xpatchbibmacro{cite:comp:comp}
{\savefield{labelnumber}{\cbx@lastnumber}}
{\savefield{labelnumber}{\cbx@lastnumber}%
\ifkeyword{mywork}{\toggletrue{cbx@lastmywork}}{\togglefalse{cbx@lastmywork}}}
{}{}
\DeclareFieldFormat{labelnumber}{%
\ifboolexpr{test {\ifkeyword{mywork}} or togl {cbx@lastmywork}}
{[#1]}
{#1}}
\makeatother
足够。
MWE 用于numeric
\documentclass{scrartcl}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@Article{Einstein,
author = {Einstein},
}
@Article{Benji,
author = {Benji},
keywords = {mywork},
}
\end{filecontents}
\usepackage[style=numeric]{biblatex}
\addbibresource{\jobname.bib}
\DeclareFieldFormat{labelnumberwidth}{\ifkeyword{mywork}{[\mkbibbrackets{#1}]}{\mkbibbrackets{#1}}}
\renewbibmacro*{cite}{%
\printtext[bibhyperref]{%
\ifkeyword{mywork}{[}{}%
\printfield{prefixnumber}%
\printfield{labelnumber}%
\ifkeyword{mywork}{]}{}%
\ifbool{bbx:subentry}
{\printfield{entrysetcount}}
{}}}
\begin{document}
Fremdquelle \cite{Einstein}
Eigenquelle \cite{Benji} and \cite{Benji,Einstein} and \cite{Einstein,Benji}
\printbibliography
\end{document}