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}
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}}
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, \textcite
apenas 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 \citeauthor
em 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
, numeric
eu 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}
Com authoryear
as 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}
Responder2
\usebibmacro{<macroname>}
permite invocar uma macro bib em um arquivo DeclareCiteCommand
. No entanto, não permite invocar algo que foi definido usando DeclareCiteCommand
so 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á: