Biblatex:将 postnote 包装到括号中的 \cite 命令中

Biblatex:将 postnote 包装到括号中的 \cite 命令中

我使用具有 authoryear-comp 样式的 biblatex。默认情况下,该\cite命令打印没有括号的引文。我希望保留此行为,同时放置任何后记在引文后面的括号中,如下所示:参见作者 2020 (postnote)。对于其他引文命令,我仍然需要常规标点符号(默认情况下为逗号),例如\textcite应该生成作者 (2020, postnote) 和\parencite应该生成 (作者 2020, postnote)。

我尝试通过重新定义 来实现这一点,\cite这样\DeclareCiteCommand它就不会调用postnotebibmacro(插入postnotedelim),而是调用一个将参数包装在括号中的新宏。但是当我这样做时,我的 postnote 前面会出现一个不想要的分号。我可以用 来消除它,\nopunct但我仍然会得到一个不想要的空格,即使我添加 也不会消失\unspace。我不明白所有这些标点符号从何而来,因为我没有调用postnotedelim

梅威瑟:

\documentclass{article}

\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
    @article{myarticle,
        author = {Doe, John},
        year = {2020},
        title = {The Title}}    
\end{filecontents*}

\usepackage[style=authoryear-comp]{biblatex}

\addbibresource{\jobname.bib}

\DeclareFieldFormat{plainpostnote}{#1}

\newbibmacro{parenpostnote}{%
  \iffieldundef{postnote}
    {}
    {\addspace\mkbibparens{%\nopunct\unspace
     \printfield[plainpostnote]{postnote}}}}

\DeclareCiteCommand{\cite} %
  {\usebibmacro{cite:init}%
   \usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {}
  {\usebibmacro{parenpostnote}}

\begin{document}
    This is plain \cite[note]{myarticle} and this is text: \textcite[note]{myarticle} and this is parenthetical \parencite[note]{myarticle}.
\end{document}

输出:

在此处输入图片描述

所需输出:这是纯文本 Doe 2020(注释)并且这是文本:Doe(2020,注释)并且这是括号(Doe 2020,注释)。

答案1

这是一种快速的方法,它使用postnotedelimbiblatex版本中的上下文敏感的方法,并为后记字段格式引入了上下文敏感的包装器。

\documentclass{article}

\usepackage[style=authoryear-comp]{biblatex}

\DeclareDelimFormat[cite]{postnotedelim}{\addspace}

% default postnote wrapper does nothing
\newcommand*{\postnotewrapper}[1]{#1}
% \cite postnote wrapper wraps argument in round brackets
\newcommand*{\postnotewrappercite}{\mkbibparens}

\makeatletter
% apply context-sensitive wrapper
\DeclareFieldFormat{postnote}{%
  \ifcsundef{postnotewrapper\blx@delimcontext}
    {\postnotewrapper}
    {\csuse{postnotewrapper\blx@delimcontext}}%
  {\mkpageprefix[pagination][\mknormrange]{#1}}%
}
\makeatother

\addbibresource{biblatex-examples.bib}

\begin{document}
  This is plain \cite[note]{sigfridsson}
  and this is text \textcite[note]{sigfridsson}
  and this is parenthetical \parencite[note]{sigfridsson}.
\end{document}

这是简单的 Sigfridsson 和 Ryde 1998(注),这是 Sigfridsson 和 Ryde 的文本(1998,注),这是括号内的(Sigfridsson 和 Ryde 1998,注)。


问题代码中不理想的标点符号是由于没有使用标点符号跟踪器,而是直接在 bibmacro 中biblatex应用了格式化宏。如果您只是在 bibmacro 中写入,则标点符号不会通过标点符号跟踪器,而是直接打印。由于严重依赖标点符号跟踪器,您会得到像这样的奇怪结果,因为标点符号跟踪器没有被清除,当您调用时,其内容会打印在括号内。\mkbibparens\addspace\mkbibparens{...}authoryear-comp\printfield

相关内容