Continuando con mi viaje hacia BibLaTeX + scrlayer-notecolumn. Pensé,Una vez que tuviera BibLaTeX funcionando, \marginpar
todo sería fácil.. Pero no es así.
Quiero crear mi barra lateral usando scrlayer-notecolumn
's \makenote
.
MWE:
\documentclass{scrbook}
\usepackage{scrlayer-notecolumn}
% bib-file
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{Knu86,
author = {Knuth, Donald E.},
year = {1986},
title = {The \TeX book},
}
}
\end{filecontents}
\usepackage[backend=bibtex, citestyle=authoryear]{biblatex}
\addbibresource{\jobname}
\DeclareCiteCommand{\tcite}
{\usebibmacro{prenote}}
{ %loopcode
\usebibmacro{cite}
\makenote{\printfield{title}}
%\marginpar{\printfield{title}}
}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
hi
\makenote{a side note}
\tcite{Knu86}
\end{document}
\marginpar{
usar lo comentado \marginpar
funciona bien:
\hacernota{
el uso \makenote
no lo hace.
Con errores:
line 35: Undefined control sequence. \end{document} : Overwriting file `./dco2.bib'. : Using fall-back BibTeX(8) backend:(biblatex) functionality may be reduced/unavailable. : \clearnotecolumns while active non-layer page style. line 35: Flush note box `marginpar' : \pdfmdfivesum unavailable.
\makenote{\proteger
A mí esto me parece como si fuera frágil, así que solía protect
cambiar a\makenote{\protect\printfield{title}}
Lo que me dio básicamente el mismo conjunto de errores.
line 35: Undefined control sequence. \end{document}
: Overwriting file `./dco2.bib'.
: Using fall-back BibTeX(8) backend:(biblatex) functionality may be reduced/unavailable.
: \clearnotecolumns while active non-layer page style.
line 35: Note moved down from(scrlayer-notecolumn) 11.0pt to 15.08002pt(scrlayer-notecolumn) at note box `marginpar'
line 35: Flush note box `marginpar'
: \pdfmdfivesum unavailable.
Respuesta1
De hecho, este es un problema de expansión. \makenote
escribe en un archivo auxiliar. Por lo tanto, se utilizará la expansión de escritura. Pero \printfield{title}
no se ampliará al título. Y si lo protege, simplemente \printfield{title}
se escribirá en ese archivo. Esto no ayuda, porque si bien el estado de lectura del archivo auxiliar \printfield{title}
tampoco puede expandirse al título.
Entonces lo que necesitas es el título para ponerlo en el argumento de \makenote
. El enfoque estándar para hacerlo sería usar \edef\helpermacro{\printfield{title}}
or \protected@edef\helpermacro{\printfield{title}}
y luego usar \makenote{\helpermacro}
. Pero esto tampoco funcionaría, porque al usar el comando citar, \printfield{title}
se expandirá solo a \printfield {title}
.
Pero hay otro gancho que puedes usar, el formato de campo de field title
. Simplemente podemos definir un nuevo formato de campo makenote
que se usa \makenote
para imprimir un campo y usar este nuevo formato para imprimir el campo title
:
\documentclass{scrbook}
\usepackage{scrlayer-notecolumn}
\usepackage[backend=bibtex, citestyle=authoryear]{biblatex}
\addbibresource{biblatex-examples}
\DeclareFieldFormat{makenote}{\makenote{#1}}% define new makenote field format
\DeclareCiteCommand{\tcite}
{\usebibmacro{prenote}}
{ %loopcode
\usebibmacro{cite}%
\printfield[makenote]{title}% use makenote format to print field title
%\makenote{\printfield{title}}
%\marginpar{\printfield{title}}
}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
hi\makenote{a side note}
Here a \verb|\tcite{knuth:ct}|: \tcite{knuth:ct}
\end{document}
A diferencia del formato, también podría definir un nuevo contenedor \mkbibmakenote
similar a \mkbibfootnote
:
\documentclass{scrbook}
\usepackage{scrlayer-notecolumn}
\usepackage[backend=bibtex, citestyle=authoryear]{biblatex}
\addbibresource{biblatex-examples}
\newrobustcmd{\mkbibmakenote}[1]{%
\makenote*{\blxmkmakenote{#1}}%
}
\makeatletter
\newrobustcmd{\blxmkmakenote}[1]{%
\begingroup
\blx@blxinit
\blx@setsfcodes
\blx@postpunct@agroup
#1%
\endgroup
}
\makeatother
\DeclareCiteCommand{\tcite}[\mkbibmakenote]
{\usebibmacro{prenote}}
{%
\usebibmacro{author}%
\newunit
\usebibmacro{title}%
}
{\multicitedelim}
{\usebibmacro{postnote}}
\begin{document}
hi\makenote{a side note}
Here a \verb|\tcite{knuth:ct}|: \tcite{knuth:ct}done.
\end{document}
Si necesita ambos, una cita impresa en el texto y una cita impresa en el margen, debe definir su propio comando, que hace a \cite
y a \tcite
.