我想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\addspace
s 到处乱飞。这些应该在\setunit
s 内部,以利用 的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}
更新后的代码中存在以下问题
\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 %
}