BibLaTeX + scrlayer-notecolumnへの旅を続けます。私はこう思いました。BibLaTeXが使えるようになれば、\marginpar
すべては簡単になりますしかし、そうではありません。
scrlayer-notecolumn
の を使用してサイドバーを作成したいと思います\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{
コメントアウトを使用すると\marginpar
正常に動作します:
\makenote{
使用して\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}
。
ただし、使用できる別のフック、フィールドのフィールド形式があります。フィールドを印刷するために使用する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}
テキスト内の引用印刷と余白内の引用印刷の両方が必要な場合は、 と を実行する独自のコマンドを定義する必要があり\cite
ます\tcite
。