Biblatex: изменить textcite для autocite = footnote

Aug 20 2020

Можно ли переопределить \textciteпри использовании, autocite=footnoteчтобы имена авторов помещались в текст, а остальная часть цитаты помещалась в сноску? В его нынешнем виде \textciteпечатаются имена авторов вместе с годом в тексте. Мне кажется, что стиль, который я предлагаю, будет более последовательным.

Для дополнительной информации, можно ли исключить имена авторов из сносок, созданных этой новой версией \textcite?

Вот минимальный пример:

\documentclass{article}
\usepackage[style=authoryear, autocite=footnote]{biblatex}
\addbibresource{biblatex-examples.bib}
\begin{document}
A citation\autocite{knuth:ct:a} in a sentence.
Important works are those by \textcites{bertram}{markey}.
Another important work is by \textcite{knuth:ct:b}.

\textbf{Instead, I would like the output to be:}
A citation\autocite{knuth:ct:a} in a sentence.
Important works are those by \citeauthor{bertram} and \citeauthor{markey}\autocites{bertram}{markey}.
Another important work is by \citeauthor{knuth:ct:b}\autocite{knuth:ct:b}.
\end{document}

Ответы

2 moewe Aug 20 2020 at 12:59

\textciteРеализация verboseстилей делает что - то подобное, так что мы можем просто скопировать о \textciteсвязанном коде с verbose.cbx.

\documentclass{article}
\usepackage[style=authoryear, autocite=footnote]{biblatex}

\makeatletter
\renewbibmacro*{textcite}{%
  \ifnameundef{labelname}
    {\printfield[citetitle]{labeltitle}}
    {\printnames{labelname}}}

\newbibmacro*{textcite:init}{%
  \citetrackerfalse%
  \pagetrackerfalse%
  \iffirstcitekey
    {\global\undef\cbx@lasthash}
    {}}

\newbibmacro*{textcite:count}{%
  \stepcounter{textcitetotal}%
  \ifnumgreater{\value{uniquelist}}{\value{maxnames}}
    {\ifnumgreater{\value{uniquelist}}{\value{textcitemaxnames}}
       {\setcounter{textcitemaxnames}{\value{uniquelist}}}
       {}}
    {\ifnumless{\value{labelname}}{\value{maxnames}}
       {\ifnumgreater{\value{labelname}}{\value{textcitemaxnames}}
          {\setcounter{textcitemaxnames}{\value{labelname}}}
          {}}
       {\ifnumgreater{\value{maxnames}}{\value{textcitemaxnames}}
          {\setcounter{textcitemaxnames}{\value{maxnames}}}
          {}}}}

\DeclareCiteCommand{\cbx@textcite}
  {\usebibmacro{textcite:init}}
  {\iffieldequals{namehash}{\cbx@lasthash}
     {}
     {\iffirstcitekey
        {}
        {\textcitedelim}%
      \stepcounter{textcitecount}%
      \usebibmacro{textcite}%
      \savefield{namehash}{\cbx@lasthash}}}
  {}
  {}

\DeclareCiteCommand{\textcite}[\cbx@textcite@init\cbx@textcite\footcite]
  {\usebibmacro{textcite:init}%
   \gdef\cbx@savedkeys{}%
   \DeferNextCitekeyHook}
  {\ifthenelse{\iffirstcitekey\AND\value{multicitetotal}>0}
     {\protected@xappto\cbx@footcite@args{%
        (\thefield{multiprenote})(\thefield{multipostnote})}}
     {}%
   \xappto\cbx@savedkeys{\thefield{entrykey},}%
   \iffieldequals{namehash}{\cbx@lasthash}
     {}
     {\usebibmacro{textcite:count}%
      \savefield{namehash}{\cbx@lasthash}}%
   \ifnumequal{\value{citecount}}{\value{citetotal}}
     {\protected@xappto\cbx@textcite@args{{\cbx@savedkeys}}%
      \protected@xappto\cbx@footcite@args{%
        [\thefield{prenote}][\thefield{postnote}]{\cbx@savedkeys}}%
      \iflastcitekey
        {\protected@xappto\cbx@textcite@args{\thefield{postpunct}}%
         \protected@xappto\cbx@footcite@args{\nopunct}}
        {}}
     {}}
  {}
  {}

% textcite has nested \DeclareCiteCommand definitions for textcite and we want to use
% the normal textcite context
\DeclareDelimcontextAlias{cbx@textcite}{textcite}

\newrobustcmd{\cbx@textcite@init}[3]{%
  \setcounter{textcitetotal}{0}%
  \setcounter{textcitecount}{0}%
  \setcounter{textcitemaxnames}{0}%
  \def\cbx@textcite@args{#1}\def\cbx@footcite@args{#2}#3%
  \cbx@textcite@args\empty\cbx@footcite@args\empty}

\DeclareMultiCiteCommand{\cbx@textcites}{\cbx@textcite}{}
\DeclareMultiCiteCommand{\textcites}
  [\cbx@textcites@init\cbx@textcites\footcites]{\textcite}{}

\let\cbx@textcites@init\cbx@textcite@init
\pretocmd{\cbx@textcites@init}{%
  \UseNextMultiCiteHook%
  \AtNextMultiCite{%
    \renewbibmacro{multiprenote}{}%
    \renewbibmacro{multipostnote}{}}}{}{}

\makeatother



\addbibresource{biblatex-examples.bib}
\begin{document}
\null\vfill % only for this example!

A citation\autocite{knuth:ct:a} in a sentence.
Important works are those by \textcites{bertram}{markey}.
Another important work is by \textcite{knuth:ct:b}.

\textbf{Instead, I would like the output to be:}
A citation\autocite{knuth:ct:a} in a sentence.
Important works are those by \citeauthor{bertram} and \citeauthor{markey}\autocites{bertram}{markey}.
Another important work is by \citeauthor{knuth:ct:b}\autocite{knuth:ct:b}.
\end{document}