scrlayer-notecolumn `\makenote` с `BibLaTeX`

scrlayer-notecolumn `\makenote` с `BibLaTeX`

Продолжаю свой путь в BibLaTeX + scrlayer-notecolumn. Я подумал,как только я научу работать с BibLaTeX, \marginparвсе станет легко. Но это не так.

Я хочу создать свою боковую панель, scrlayer-notecolumnиспользуя \makenote.

МВЭ:

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

использование закомментированного кода \marginparработает нормально:

рабочая демонстрация marginpar


\сделать примечание{

использование \makenoteне делает.

не работает сделать заметку

С ошибками: 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{\protect

Мне кажется, что это было проявлением хрупкости, поэтому я использовала protect изменение, чтобы\makenote{\protect\printfield{title}}

защищенный

Что дало мне, по сути, тот же набор ошибок.

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.

решение1

Это действительно проблема расширения. \makenoteзаписывает во вспомогательный файл. Поэтому расширение записи будет использовано. Но \printfield{title}не будет расширено до заголовка. И если вы его защитите, просто \printfield{title}будет записано в этот файл. Это не помогает, потому что в то время как состояние чтения вспомогательного файла \printfield{title}не может также расшириться до заголовка.

Итак, вам нужен заголовок, чтобы поместить его в аргумент \makenote. Стандартный подход для этого — использовать \edef\helpermacro{\printfield{title}}или \protected@edef\helpermacro{\printfield{title}}, а затем использовать \makenote{\helpermacro}. Но это тоже не сработает, потому что при использовании команды cite \printfield{title}будет расширяться только до \printfield {title}.

Но есть еще один хук, который вы можете использовать, формат поля field title. Мы просто можем определить новый формат поля makenote, который используется \makenoteдля печати поля, и использовать этот новый формат для печати поля 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}

результат форматирования

В противоположность формату вы также можете определить новую оболочку, \mkbibmakenoteподобную \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}

результат обертки

Если вам нужны оба варианта: печать цитаты в тексте и печать цитаты на полях, вам придется определить собственную команду, которая выполняет команды a \citeи a \tcite.

Связанный контент