Cómo utilizar \DeclareCiteCommand, con estilo

Cómo utilizar \DeclareCiteCommand, con estilo

Estoy intentando algo similar a:Notas a pie de página de Biblatex al margen En la medida en que pueda robarles el ejemplo.

Lo que me gustaría hacer es citar el texto en el texto principal normalmente, luego en la barra lateral usando el nombre del autor, luego la fecha y luego el nombre del trabajo.

Para los propósitos de este MWE solo estoy usando látex base \marginpar. (En mi trabajo real estoy usando material de capa de notas de Koma. Pero eso realmente no importa ya que estoy tratando de entender 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}

salida MSE

Se puede ver que el texto con un círculo azul es perfecto. Pero el texto con círculo rojo es incorrecto porque está clasificado por campos. La razón de esto es obvia, por supuesto. Mi comando no procesa por clave, procesa todas las claves juntas.

Mi comando actual es:

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

Creo que quiero reemplazarlo con algo hecho con BibLaTeX.\DeclareCiteCommand

Así que le di un golpe:

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

Mejor trabajando

Esto funciona, podemos ver que tanto el círculo azul como el rojo están bien en cuanto a estar separados. Pero no me estoy beneficiando del estilo de los nombres de los autores (por ejemplo, estar abreviado solo al apellido, según mi configuración). Y como no tengo usos, \textcitesino que simplemente los pongo printnames{author}, tampoco me beneficio de ningún estilo allí.

Esto se debe (supongo) a que he usado los comandos de bajo nivel para estas cosas. ¿Cómo puedo usar comandos de nivel superior que respeten el estilo/configuración?

Respuesta1

No debe utilizar comandos de alto nivel como \citeauthoren un archivo \DeclareCiteCommand. Es posible hacerlo con \citeauthor{\thefield{entrykey}}, pero no es una gran idea.

En su lugar, utilice simplemente los bibmacros que se utilizan para\citeauthor

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

Como en tu ejemplo querías recrear \textcitede numeric, elegí.

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

salida de ejemplo numérico, recortada


Con authoryearlas cosas son más fáciles

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

autoraño MWE

Respuesta2

\usebibmacro{<macroname>}te permite invocar una macro bib en un archivo DeclareCiteCommand. Sin embargo, no le permite invocar algo que se definió usando DeclareCiteCommandso no \usebibmacro{citeauthor}.

Entonces el nuevo código podría ser:

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

Al ejecutar esto, con un estilo de cita más interesante establecido en biblatex: \usepackage[citestyle=authoryear]{biblatex} se obtiene:

Fijado

información relacionada