如何删除 doi 字段中的前缀(如果存在)

如何删除 doi 字段中的前缀(如果存在)

当我下载引文时,它们有时会在实际 doi 前面包含 doi 字段中的条目http://dx.doi.org/- 例如来自 ScienceDirect (elsevier)。我不想每次下载引文时都检查并最终更改这一点。我实际上找到了一个可行的解决方案(即使它实际上涵盖了不同的问题),它使用\DeclareSourcemapBiblatex:将 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

相关内容