是否可以自定义 \autocite 和 \autocite* 以在 biblatex 中表现不同

是否可以自定义 \autocite 和 \autocite* 以在 biblatex 中表现不同

我想知道是否可以定制\autocite\autocite*以不同的方式表现,比如说像一样\autocite工作。\supercite\autocite*\textcite

更新:

在 Moewe 的回答之后,\autocite其工作原理如下\supercite。然后我复制了我以前的自定义以\supercite显示中的上标数字[],请参阅\DeclareCiteCommand{\supercite}...MWE 中的部分:

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

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


%%%% This is my customization of supercite
%%%% and it causes error
\DeclareCiteCommand{\supercite}[\mkbibsuperscript]
  {\usebibmacro{cite:init}%
   \let\multicitedelim=\supercitedelim
   \iffieldundef{prenote}
     {}
     {\BibliographyWarning{Ignoring prenote argument}}%
   \iffieldundef{postnote}
     {}
     {\BibliographyWarning{Ignoring postnote argument}}
  \bibopenbracket}%
  {\usebibmacro{citeindex}%
   \usebibmacro{cite:comp}}
  {}
  {\usebibmacro{cite:dump}\bibclosebracket}



\makeatletter
\renewcommand*{\autocite}{%
  \@ifstar
    {\textcite}
    {\supercite}}
\renewcommand*{\autocites}{%
  \@ifstar
    {\textcites}
    {\supercites}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
Lorem \autocite{sigfridsson} ipsum \autocite*{sigfridsson}.

Lorem \autocites{sigfridsson}{worman} ipsum \autocites*{sigfridsson}{worman}.

\printbibliography
\end{document}

由于\DeclareCiteCommand{\supercite}...在没有

\renewcommand*{\autocite}{%
  \@ifstar
    {\textcite}
    {\supercite}}

我进行了此更新,而不是提出新问题。

答案1

完全可以\...cite以不同的方式定义带星号和不带星号的命令版本\DeclareCiteCommand。不带星号的版本用 定义\DeclareCiteCommand{\jiewuzacite},带星号的版本用定义\DeclareCiteCommand*{\jiewuzacite}

然而,据我所知,对于多点命令来说,很难做到同样的事情。也就是说,你可以定义\DeclareMultiCiteCommand{\jiewuzacites}[<wrapper>]{\jiewuzacite}{\multicitedelim},但不能根据这个接口是否有星号来轻易更改包装器。因为\autocite这意味着\autocite/\autocite*将完全按照预期工作,但\autocites/\autocites*不会。

如果你认为带星号的版本需要独立\DeclareMultiCiteCommand,请在https://github.com/plk/biblatex/issues。目前,我认为biblatex加强加星号和不加星号版本之间的一致性是一件好事。事实上,我认为使用两个如此不同的引用命令(需要非常不同的语法结构才能融入句子)作为同一基本宏名称的加星号和不加星号版本有点冒险……

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

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


\makeatletter
% copy of \supercite from numeric.cbx
\DeclareCiteCommand{\jiewuzacite}[\mkbibsuperscript]
  {\iffieldundef{prenote}
     {}
     {\BibliographyWarning{Ignoring prenote argument}}%
   \iffieldundef{postnote}
     {}
     {\BibliographyWarning{Ignoring postnote argument}}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\supercitedelim}
  {}

% copy of \textcite from numeric.cbx
\DeclareCiteCommand*{\jiewuzacite}[\cbx@textcite@init\cbx@textcite]
  {\gdef\cbx@savedkeys{}%
   \citetrackerfalse%
   \pagetrackerfalse%
   \DeferNextCitekeyHook%
   \usebibmacro{textcite:init}}
  {\ifthenelse{\iffirstcitekey\AND\value{multicitetotal}>0}
     {\protected@xappto\cbx@savedcites{()(\thefield{multipostnote})}%
      \global\clearfield{multipostnote}}
     {}%
   \xappto\cbx@savedkeys{\thefield{entrykey},}%
   \iffieldequals{namehash}{\cbx@lasthash}
     {}
     {\stepcounter{textcitetotal}%
      \savefield{namehash}{\cbx@lasthash}}}
  {}
  {\protected@xappto\cbx@savedcites{%
     [\thefield{prenote}][\thefield{postnote}]{\cbx@savedkeys}}}

\DeclareAutoCiteCommand{jiewuza}{\jiewuzacite}{\jiewuzacite}
% we can't have different wrappers for starred/unstarred versions
% for the multicite commands, so re-use the single cite as
% multicite command ...   

\ExecuteBibliographyOptions{autocite=jiewuza}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
Lorem \autocite{sigfridsson} ipsum \autocite*{sigfridsson}.
\printbibliography
\end{document}

或者,你可以完全绕过biblatex这里的相关命令并自行实现\autocite

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

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


\makeatletter
\renewcommand*{\autocite}{%
  \@ifstar
    {\textcite}
    {\supercite}}
\renewcommand*{\autocites}{%
  \@ifstar
    {\textcites}
    {\supercites}}
\makeatother

\addbibresource{biblatex-examples.bib}


\begin{document}
Lorem \autocite{sigfridsson} ipsum \autocite*{sigfridsson}.

Lorem \autocites{sigfridsson}{worman} ipsum \autocites*{sigfridsson}{worman}.

\printbibliography
\end{document}

应该这样做,并且会为\autocite和而努力\autocites

一般情况下,我建议不要使用官方界面以外的任何方式重新定义\...cite由 控制的命令,如果出现问题,您或多或少只能靠自己,但这可能是最简单的解决方案。需要注意的是,您确实会失去的功能,这可能与您有关,也可能无关。在 的较新版本中,biblatexautopunct\autocitebiblatexhttps://github.com/plk/biblatex/issues/733相关帖子可能会有所帮助。

相关内容