我使用具有 authoryear-comp 样式的 biblatex。默认情况下,该\cite
命令打印没有括号的引文。我希望保留此行为,同时放置任何后记在引文后面的括号中,如下所示:参见作者 2020 (postnote)。对于其他引文命令,我仍然需要常规标点符号(默认情况下为逗号),例如\textcite
应该生成作者 (2020, postnote) 和\parencite
应该生成 (作者 2020, postnote)。
我尝试通过重新定义 来实现这一点,\cite
这样\DeclareCiteCommand
它就不会调用postnote
bibmacro(插入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
这是一种快速的方法,它使用postnotedelim
新biblatex
版本中的上下文敏感的方法,并为后记字段格式引入了上下文敏感的包装器。
\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}
问题代码中不理想的标点符号是由于没有使用标点符号跟踪器,而是直接在 bibmacro 中biblatex
应用了格式化宏。如果您只是在 bibmacro 中写入,则标点符号不会通过标点符号跟踪器,而是直接打印。由于严重依赖标点符号跟踪器,您会得到像这样的奇怪结果,因为标点符号跟踪器没有被清除,当您调用时,其内容会打印在括号内。\mkbibparens
\addspace\mkbibparens{...}
authoryear-comp
\printfield