当我下载引文时,它们有时会在实际 doi 前面包含 doi 字段中的条目http://dx.doi.org/
- 例如来自 ScienceDirect (elsevier)。我不想每次下载引文时都检查并最终更改这一点。我实际上找到了一个可行的解决方案(即使它实际上涵盖了不同的问题),它使用\DeclareSourcemap
(Biblatex:将 doi-url 转换为 doi 字段)。将下面来自另一个问题的代码添加到我的MWE中就可以了。
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[ % copies url to doi field if it starts with http://dx.doi.org/
fieldsource=url,
match=\regexp{http://dx.doi.org/(.+)},
fieldtarget=doi,
]
\step[ % removes http://dx.doi.org/ string from doi field
fieldsource=doi,
match=\regexp{http://dx.doi.org/(.+)},
replace=\regexp{$1}
]
}
\map{ % removes url + urldate field from all entries that have a doi field
\step[fieldsource=doi, final]
\step[fieldset=url, null]
\step[fieldset=urldate, null]
}
}
}
完整的MWE如下:
\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage{filecontents}
\usepackage{xcolor}
\usepackage[babel]{csquotes}
\usepackage[backend=biber,style=chem-angew,mcite,subentry]{biblatex}
\usepackage{hyperref}
\hypersetup{%
colorlinks,
linkcolor={red!0!black},
citecolor={blue!0!black},
urlcolor={blue!80!black}
}
\ExecuteBibliographyOptions{citetracker=true,sorting=none,maxcitenames=10,doi=false,url=false,isbn=false,hyperref=true,backref=false}
\DefineBibliographyStrings{ngerman}{
andothers = {\textit{et~al\adddot}}
}
% Number of each bibliography entry in brackets
\DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}}
\makeatletter
\newtoggle{cbx@togcite}
% Citation number superscript in brackets
\renewcommand\@makefntext[1]{%
\iftoggle{cbx@togcite}
{\@textsuperscript{\normalfont[\@thefnmark]}\enspace #1}
{\@textsuperscript{\normalfont\@thefnmark}\enspace #1}%
\global\togglefalse{cbx@togcite}}
% Citation number superscript in brackets (for babel french)
\ifdef{\@makefntextFB}{%
\renewcommand\@makefntextFB[1]{%
\iftoggle{cbx@togcite}
{\@textsuperscript{\normalfont[\@thefnmark]}\enspace #1}
{\@textsuperscript{\normalfont\@thefnmark}\enspace #1}%
\global\togglefalse{cbx@togcite}}}{}
%---------------------------------------------------------------
% Mostly verbatim from Joseph Wright
% http://www.texdev.net/2010/03/08/biblatex-numbered-citations-as-footnotes/
\DeclareCiteCommand{\sfcite}[\cbx@superscript]%
{\usebibmacro{cite:init}%
\let\multicitedelim=\supercitedelim
\iffieldundef{prenote}
{}
{\BibliographyWarning{Ignoring prenote argument}}%
\iffieldundef{postnote}
{}
{\BibliographyWarning{Ignoring postnote argument}}}
{\usebibmacro{citeindex}%
\usebibmacro{sfcite}%
\usebibmacro{cite:comp}}
{}
{\usebibmacro{cite:dump}}
\newbibmacro*{sfcite}{%
\ifciteseen
{}
{\xappto\cbx@citehook{%
\global\toggletrue{cbx@togcite}%
\noexpand\footnotetext[\thefield{labelnumber}]{%
\fullcite{\thefield{entrykey}}\addperiod}}}}
\newrobustcmd{\cbx@superscript}[1]{%
\mkbibsuperscript{\mkbibbrackets{#1}}%
\cbx@citehook%
\global\let\cbx@citehook=\empty}
\let\cbx@citehook=\empty
%---------------------------------------------------------------
\makeatother
\begin{filecontents}{\jobname.bib}
@Article{Frank1953,
author = {Frank, F. C.},
title = {On spontaneous asymmetric synthesis},
journal = {Biochim. Biophys. Acta},
year = {1953},
volume = {11},
pages = {459-463},
doi = {http://dx.doi.org/10.1016/0006-3002(53)90082-1},
url = {http://www.sciencedirect.com/science/article/pii/0006300253900821},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\newbibmacro{string+doiurlisbn}[1]{%
\iffieldundef{doi}{%
\iffieldundef{url}{%
\iffieldundef{isbn}{%
\iffieldundef{issn}{%
#1%
}{%
\href{http://books.google.com/books?vid=ISSN\thefield{issn}}{#1}%
}%
}{%
\href{http://books.google.com/books?vid=ISBN\thefield{isbn}}{#1}%
}%
}{%
\href{\thefield{url}}{#1}%
}%
}{%
\href{https://doi.org/\thefield{doi}}{#1}%
}%
}
\DeclareFieldFormat{journaltitle}{\usebibmacro{string+doiurlisbn}{\mkbibemph{#1}}}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[ % copies url to doi field if it starts with http://dx.doi.org/
fieldsource=url,
match=\regexp{http://dx.doi.org/(.+)},
fieldtarget=doi,
]
\step[ % removes http://dx.doi.org/ string from doi field
fieldsource=doi,
match=\regexp{http://dx.doi.org/(.+)},
replace=\regexp{$1}
]
}
\map{ % removes url + urldate field from all entries that have a doi field
\step[fieldsource=doi, final]
\step[fieldset=url, null]
\step[fieldset=urldate, null]
}
}
}
\begin{document}
\chapter{Title}
\null\vfill\noindent
Citation.\sfcite{Frank1953}
\printbibliography
\end{document}
我的问题是:是否有其他解决方案可以仅删除http://dx.doi.org/
doi 字段中存在的 if?并且(因为我想了解更多信息但找不到准确的描述)它有什么作用$1
?通过反复试验,我了解到它指的是实际的 doi。但我认为 a$
总是需要另一个符号(数学模式)。在此之后,Texmaker 将我的所有代码都染成绿色,这让我很烦。有没有办法改变这种情况?
答案1
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[ % removes http://dx.doi.org/ string from doi field
fieldsource=doi,
match=\regexp{http://dx.doi.org/(.+)},
replace=\regexp{$1}
]
}
}
}
就足够了。
这是通过正则表达式匹配实现的。如果doi
字段包含字符串http://dx.doi.org/
,则之后的所有内容都由 收集(.+)
,收集到的字符串将“保存”在变量 中$1
。这与 TeX 及其数学模式无关,这是 Perl 正则表达式(实际上,此代码由在 Perl 上运行的 Biber 执行,文档中的内容只是 Biber 运行其正则表达式的指令)。这就是为什么我们需要“保护”宏中的特殊字符\regex
。
如果 TeXmaker 认为这会启动数学模式,那就太不幸了。也许您可以通过在%$
后面添加 来欺骗它\regexp{$1}
。但实际上这只是您的编辑器的语法高亮有点问题,而不是 TeX。
但是,约瑟夫的评论当然是正确的,您的文件首先.bib
就不应该包含该http://dx.doi.org/
字段- 它应该只包含裸 DOI。doi
您还可以使用以下命令进行过滤https://doi.org/
。https://dx.doi.org/
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[
fieldsource=doi,
match=\regexp{https?://(dx.)?doi.org/(.+)},
replace=\regexp{$2}
]
}
}
}
这里$1
要么是dx.
或为空,真正的 DOI 保存在 中$2
。