Продолжаю свой путь в 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
работает нормально:
\сделать примечание{
использование \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
.