Como usar \DeclareCiteCommand, com estilo

Como usar \DeclareCiteCommand, com estilo

Estou tentando algo semelhante a:Notas de rodapé do Biblatex na margem Na medida em que posso roubar o exemplo deles.

O que eu gostaria de fazer é ter o texto citado normalmente no texto principal, depois na barra lateral usando o nome do autor, depois a data, depois o nome da obra.

Para fins deste MWE, estou usando apenas látex base \marginpar. (No meu trabalho real, estou usando coisas da camada scrnote Koma. Mas isso realmente não importa, pois estou tentando entender o BibLaTeX)

MWE:

\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}

Saída MSE

Pode-se ver que o texto circulado em azul é perfeito. Mas o texto circulado em vermelho está errado porque é agrupado por campos. A razão para isto é óbvia, claro. Meu comando não processa por chave, ele processa todas as chaves juntas.

Meu comando atual é:

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

Acredito que quero substituí-lo por algo feito usando o BibLaTeX\DeclareCiteCommand

Então eu dei uma olhada:

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

Melhor trabalho

Isso funciona, podemos ver que tanto o círculo azul quanto o círculo vermelho estão bem, na medida em que são separados. Mas não estou me beneficiando do estilo dos nomes dos autores (por exemplo, sendo resumido apenas ao sobrenome, com base nas minhas configurações). E como não usei, \textciteapenas coloquei printnames{author}, também não estou me beneficiando de nenhum estilo.

Isto é (presumo) porque usei comandos de baixo nível para essas coisas. Como posso usar comandos de nível superior que respeitem o estilo/configuração

Responder1

Você não deve usar comandos de alto nível, como \citeauthorem um arquivo \DeclareCiteCommand. É possível fazer isso com \citeauthor{\thefield{entrykey}}, mas não é uma boa ideia.

Em vez disso, basta usar as bibmacros usadas para\citeauthor

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

Como no seu exemplo você queria recriar \textcite, numericeu optei.

\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}

saída de exemplo numérico, recortado


Com authoryearas coisas são mais fáceis

\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}

autor ano MWE

Responder2

\usebibmacro{<macroname>}permite invocar uma macro bib em um arquivo DeclareCiteCommand. No entanto, não permite invocar algo que foi definido usando DeclareCiteCommandso no \usebibmacro{citeauthor}.

Então o novo código poderia ser:

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

Executando isso, com um estilo de citação mais interessante definido no biblatex: \usepackage[citestyle=authoryear]{biblatex} dá:

Fixo

informação relacionada