biblatex 文内引用,具有不同的 maxbibnames

biblatex 文内引用,具有不同的 maxbibnames

我使用 biblatex 和 biber。在我的正文中,我很高兴有标准的默认\textcite显示,它(取决于 maxbibnames 可能会给出许多作者的名字)。这个标准默认也是我希望在参考文献中看到的(\printbibliography)。

但是,我有一张文献综述表,我并不希望看到所有作者都显示出来。部分原因是我想将姓名放入表格列中,并在右侧显示更多信息。在这里,而且只有在这里,我才真正希望 maxbibnames=1。容易吗?

理想情况下,更好的版本可以让我发明自己的\citemystyle。我想添加期刊缩写,例如Smith et.al. (AER, 2021)。我会在我的 *.bib 文件中添加一个期刊缩写字段;然后,

\newcommand{\citemystyle}[1]{\citeauthorlastname[1]{#1}\citeetalifnany{#1}~%
                                            (\citejournalabbrev{#1}, \citeyear{#1}}

其中[1]尝试指定 citeauthorlastname 仅应获取第一作者的姓氏。

然后我就可以写作文了\citemystyle{smith2021aer},它就会神奇地给我Smith et.al. (AER, 2021)

我可能对 biblatex/biber 要求过高,但过去我对它的灵活性感到惊讶...哎呀,有时答案甚至很简单。如果很难,请不要花太多时间在这上面。我可以手动复制文本。

答案1

您可以使用字段并通过shortjournal定义新命令。我们将 限制为 1 ,并加载宏的修改版本,称为。此宏仅在给定字段时执行,并添加逗号和空格。\mytextcite\DeclareCiteCommandmaxnames\setcounter{maxnames}{1}textcitemytextcite\usebibmacro{shortjournal}shortjournal

\begin{filecontents*}[overwrite]{\jobname.bib}
@article{bertram,
  author       = {Bertram, Aaron and Wentworth, Richard},
  title        = {Gromov invariants for holomorphic maps on {Riemann} surfaces},
  journaltitle = {J.~Amer. Math. Soc.},
  shortjournal = {JAMS},
  date         = 1996,
  volume       = 9,
  number       = 2,
  pages        = {529-571}}
\end{filecontents*}
\documentclass{article}
\usepackage[style=authoryear]{biblatex}
  \addbibresource{\jobname.bib}

\newbibmacro*{shortjournal}{%
  \iffieldundef{shortjournal}{}
  {\printfield{shortjournal}\setunit{\addcomma\space}}}

\newbibmacro*{mytextcite}{%
  \ifnameundef{labelname}
  {\iffieldundef{shorthand}
    {\usebibmacro{cite:label}%
      \setunit{%
        \global\booltrue{cbx:parens}%
        \printdelim{nonameyeardelim}\bibopenparen}%
      \ifnumequal{\value{citecount}}{1}
      {\usebibmacro{prenote}}
      {}%
      \usebibmacro{shortjournal}%
      \usebibmacro{cite:labeldate+extradate}}
    {\usebibmacro{cite:shorthand}}}
  {\printnames{labelname}%
    \setunit{%
      \global\booltrue{cbx:parens}%
      \printdelim{nameyeardelim}\bibopenparen}%
    \ifnumequal{\value{citecount}}{1}
    {\usebibmacro{prenote}}
    {}%
      \usebibmacro{shortjournal}%
\usebibmacro{citeyear}}}

\DeclareCiteCommand{\mytextcite}
{\boolfalse{cbx:parens}}
{\setcounter{maxnames}{1}%
  \usebibmacro{citeindex}%
  \iffirstcitekey
  {\setcounter{textcitetotal}{1}}
  {\stepcounter{textcitetotal}%
    \textcitedelim}%
  \usebibmacro{mytextcite}}
{\ifbool{cbx:parens}
  {\bibcloseparen\global\boolfalse{cbx:parens}}
  {}}
{\usebibmacro{textcite:postnote}}

\begin{document}
  \textcite{bertram}
  \mytextcite{bertram}
    \printbibliography
\end{document}

考虑到您的需要,可以用一种更简单的方式定义该命令,但这样它可以被更广泛地使用(我相信)。

\newcommand{\mytextcite}[1]{%
  \citeauthor*{#1} (\citefield{#1}{shortjournal}, \citeyear{#1})}

相关内容