我想知道是否可以定制\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
由 控制的命令,如果出现问题,您或多或少只能靠自己,但这可能是最简单的解决方案。需要注意的是,您确实会失去的功能,这可能与您有关,也可能无关。在 的较新版本中,biblatex
autopunct
\autocite
biblatex
https://github.com/plk/biblatex/issues/733相关帖子可能会有所帮助。