scrlayer-notecolumn `\makenote` con `BibLaTeX`

scrlayer-notecolumn `\makenote` con `BibLaTeX`

Continuando con mi viaje hacia BibLaTeX + scrlayer-notecolumn. Pensé,Una vez que tuviera BibLaTeX funcionando, \marginpartodo 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 \marginparfunciona bien:

demostración de trabajo de margenpar


\hacernota{

el uso \makenoteno lo hace.

no funciona tomar nota

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

protegido

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. \makenoteescribe 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 makenoteque se usa \makenotepara 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}

resultado del formato

A diferencia del formato, también podría definir un nuevo contenedor \mkbibmakenotesimilar 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}

resultado del contenedor

Si necesita ambos, una cita impresa en el texto y una cita impresa en el margen, debe definir su propio comando, que hace a \citey a \tcite.

información relacionada