在 DeclareCiteCommand 中显示 DOI

在 DeclareCiteCommand 中显示 DOI

我想DOI用 来显示\DeclareCiteCommand。我正在使用\documentclass{report}

我尝试过这个:

\documentclass{article}




\usepackage[backend=biber, sorting=none]{biblatex}
\addbibresource{references.bib}


\DeclareCiteCommand{\mycite}%
{
    \usebibmacro{prenote}\addspace
}%
{%
    \mkbibquote{\thefield{title}}%
    \addcomma\addspace by \printnames[][-\value{listtotal}]{author}%
    \addcomma\addspace \thefield{year}%
    \addcomma\addspace \mkbibitalic{\thefield{journaltitle}}%
    \addcomma\addspace \mkbibitalic{\thefield{volume}}%
    \mkbibparens{\thefield{number}}%
    \addcomma\addspace%
}
{}
{
    \usebibmacro{postnote}%
    \addspace%
    \mkbibparens{\url{\thefield{doi}}}%
    \adddot%
}


\begin{document}


\mycite{sampleentry}




\end{document}

在参考书目中,我把在《美国心理学会出版手册》第七版(2020 年)中找到的这个条目放进去了:

@article{sampleentry,
    author      =   {Wang, Xiaoye and Lind, Mats and Bingham, Geoffrey},
    year        =   {2018},
    month       =   {06},
    pages       =   {1513},
    title       =   {Large Continuous Perspective Change With Noncoplanar Points Enables Accurate Slant Perception},
    volume      =   {44},
    number      =   {10},
    journal     =   {Journal of Experimental Psychology: Human Perception and Performance},
    doi         =   {https://doi.org/10.1037/xhp0000553},
}

但是,我只得到了\thefield{doi}。还有其他命令可以打印 吗DOI

答案1

您不必使用\thefield进行打印。相反,请使用\printfield和 的朋友或更好的预定义 bibmacros 来打印您想要显示的全部数据。您也不应该让裸\addcomma\addspaces 到处乱飞。这些应该在\setunits 内部,以利用 的biblatex标点符号缓冲区。

如图所示,宏也存在引入大量不良空间的风险。

我建议采用以下方法,\printfield{doi}打印 DOI 效果很好。

然而,从逻辑上讲,在“postnote”代码中打印条目数据有点不寻常,而且可能有风险:如果您引用多个条目,您最终会得到最后一个键的数据。其他的将被忽略。将所有打印移到循环代码中可能更合乎逻辑,并且如果引用多个条目,可能会发出警告。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[backend=biber, style=authoryear]{biblatex}

\DeclareFieldFormat{ccdoi}{%
  \mkbibparens{%
    \ifhyperref
      {\href{https://doi.org/#1}{\nolinkurl{https://doi.org/#1}}}
      {\nolinkurl{https://doi.org/#1}}}}

\DeclareCiteCommand{\CustomCite}
  {\usebibmacro{prenote}}
  {\printfield{title}%
   \setunit{\addcomma\space}%
   \bibstring{byauthor}%
   \setunit{\addspace}%
   \printnames[default]{author}%
   \setunit{\addcomma\space}%
   \printdate
   \setunit{\addcomma\space}%
   \usebibmacro{journal+issuetitle}}
  {\multicitedelim}
  {\usebibmacro{postnote}%
   \setunit{\addspace}%
   \printfield[ccdoi]{doi}}

\addbibresource{biblatex-examples.bib}

\begin{document}
Lorem \autocite{sigfridsson}

\CustomCite{sigfridsson}

\CustomCite[381]{sigfridsson}

\printbibliography
\end{document}

“从静电势和电势矩推导原子电荷的方法比较”,作者:Emma Sigfridsson 和 Ulf Ryde,1998 年,《计算化学杂志》19.4(https://doi.org/10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P)


更新后的代码中存在以下问题

\url{\thefield{doi}}

根据定义,\url几乎逐字逐句地读取并打印其参数。在这种情况下,这意味着它产生的输出是\thefield{doi},这不是您想要的。(\mkbibparens{\thefield{doi}}而不是\mkbibparens{\url{\thefield{doi}}}会产生更符合您喜好的输出。但是您可能会遇到连字符和链接问题,因此绝对不建议这样做。)同样,您想改用\printfield{doi},因为这样\url可以正确使用(和朋友)。

答案2

看起来该postnote部分没有可以使用的命令。

\DeclareCiteCommand{\CustomCite}
{
    \usebibmacro{prenote}\addspace
}
{%
    \mkbibquote{\thefield{title}}%
    \addcomma\addspace by \printnames[][-\value{listtotal}]{author} %
    \addcomma\addspace \thefield{year} %
    \addcomma\addspace \mkbibitalic{\thefield{journaltitle}} %
    \addcomma\addspace \mkbibitalic{\thefield{volume}} %
    \mkbibparens{\thefield{number}} %
    \addcomma \addspace %
    \mkbibparens{\thefield{doi}} %
}
{}
{
    \usebibmacro{postnote} %
    \adddot %
}

相关内容