Как использовать \DeclareCiteCommand со стилем

Как использовать \DeclareCiteCommand со стилем

Я пытаюсь сделать что-то похожее на:Сноски Biblatex на полях В той мере, в какой я могу украсть их пример.

Я бы хотел, чтобы текст цитировался в основном тексте обычным образом, а затем в боковой панели с указанием имени автора, затем даты, а затем названия работы.

Для целей этого MWE я просто использую базовый латекс \marginpar. (В своей реальной работе я использую Koma scrnote-layer stuff. Но это не имеет значения, поскольку я пытаюсь понять BibLaTeX)

МВЭ:

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  @book{Knu86,
    author = {Knuth, Donald E.},
    year = {1986},
    title = {The \TeX book},
  }
  @BOOK{KandR,
    AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
    TITLE     = {{The C Programming Language Second Edition}},
    PUBLISHER = {Prentice-Hall, Inc.},
    YEAR      = {1988},
}  
\end{filecontents}

\usepackage[]{biblatex}
\addbibresource{\jobname}


\newcommand{\tcite}[1]{
    \textcite{#1}
    \marginpar{
        \citeauthor{#1}, 
        \citeyear{#1}. 
        \citetitle{#1}  
    }
} 

% doc
\begin{document}
\blindtext
\tcite{Knu86}
\blindtext
\tcite{Knu86,KandR}
\blindtext
\end{document}

Выход МСП

Видно, что текст, обведенный синим, идеален. Но текст, обведенный красным, неправильный, потому что он собран по полям. Причина этого, конечно, очевидна. Моя команда не обрабатывает по ключу, она обрабатывает все ключи вместе.

Моя текущая команда:

\newcommand{\tcite}[1]{
    \textcite{#1}
    \marginpar{
        \citeauthor{#1}, 
        \citeyear{#1}. 
        \citetitle{#1}  
    }
} 

Я думаю, что я хочу заменить его чем-то, сделанным с использованием BibLaTeX\DeclareCiteCommand

Поэтому я решил попробовать:

\DeclareCiteCommand{\tcite}
{   % prenote
    \usebibmacro{prenote}%
}
{   %loopcode
    \printnames{author}%
    \marginpar{
        \printnames{author}, 
        \printfield{year}. 
        \printfield{title}  
    }
}
{   %sepcode
    \multicitedelim%
}
{\usebibmacro{postnote}}

Лучше работать

Это работает, мы видим, что и синие кружки, и красные кружки хороши, поскольку они раздельные. Но я не получаю выгоды от стилизации имен авторов (например, сокращенных до фамилии, исходя из моих настроек). И поскольку я не использую, \textciteа просто вставляю printnames{author}, то я не получаю выгоды от какой-либо стилизации там.

Это (я предполагаю) потому, что я использовал команды низкого уровня для этих вещей. Как я могу использовать команды более высокого уровня, которые уважают стиль/конфигурацию

решение1

Не следует использовать высокоуровневые команды, такие как \citeauthorв \DeclareCiteCommand. Это можно сделать с помощью \citeauthor{\thefield{entrykey}}, но это не очень хорошая идея.

Вместо этого просто используйте bibmacros, которые используются для\citeauthor

\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

Поскольку в вашем примере вы хотели воссоздать \textcite, numericя выбрал .

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Knu86,
  author = {Knuth, Donald E.},
  year = {1986},
  title = {The \TeX book},
}
@BOOK{KandR,
  AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
  TITLE     = {{The C Programming Language Second Edition}},
  PUBLISHER = {Prentice-Hall, Inc.},
      YEAR      = {1988},
}  
\end{filecontents}

\usepackage[]{biblatex}


\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

\makeatletter
\DeclareCiteCommand{\cbx@textcite}
  {\usebibmacro{textcite:init}}
  {\usebibmacro{citeindex}%
   \usebibmacro{textcite}%
   \setunit{}%
   \marginpar{\usebibmacro{sidecite}}%
   \setunit{%
     \ifbool{cbx:parens}
       {\bibcloseparen\global\boolfalse{cbx:parens}}
       {}%
     \textcitedelim}}
  {}
  {\usebibmacro{textcite:postnote}}
\makeatother

\addbibresource{\jobname.bib}

% doc
\begin{document}
\blindtext
\textcite{Knu86}
\blindtext
\textcite{Knu86,KandR}
\blindtext
\end{document}

числовой пример вывода, обрезанный


С authoryearвещами все проще

\documentclass{article}
\usepackage{blindtext}


% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Knu86,
  author = {Knuth, Donald E.},
  year = {1986},
  title = {The \TeX book},
}
@BOOK{KandR,
  AUTHOR    = {Kernighan, Brian W. and Ritchie, Dennis M.},
  TITLE     = {{The C Programming Language Second Edition}},
  PUBLISHER = {Prentice-Hall, Inc.},
      YEAR      = {1988},
}  
\end{filecontents}

\usepackage[style=authoryear]{biblatex}


\newbibmacro{sidecite}{%
  \printnames{labelname}%
  \setunit{\printdelim{nametitledelim}}%
  \printfield[citetitle]{labeltitle}%
  \setunit{\addperiod\space}%
  \printfield{year}}

\DeclareCiteCommand{\tcite}
  {\usebibmacro{prenote}}%
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}%
   \marginpar{\usebibmacro{sidecite}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\addbibresource{\jobname.bib}

% doc
\begin{document}
\blindtext
\tcite{Knu86}
\blindtext
\tcite{Knu86,KandR}
\blindtext
\end{document}

авторгод MWE

решение2

\usebibmacro{<macroname>}позволяет вам вызывать bib-макрос в DeclareCiteCommand. Однако он не позволяет вам вызывать что-то, что само по себе было определено с помощью DeclareCiteCommandso no \usebibmacro{citeauthor}.

Таким образом, новый код может быть следующим:

\DeclareCiteCommand{\tcite}%
{\usebibmacro{prenote}}% prenote
{   %loopcode
    \usebibmacro{cite}%
    \marginpar{\usebibmacro{cite}, \printfield{title} \\
}
}
{\multicitedelim}% sepcode
{\usebibmacro{postnote}}

Запуск этого кода с более интересным стилем цитирования, установленным в biblatex:, \usepackage[citestyle=authoryear]{biblatex} дает:

Зафиксированный

Связанный контент