scrlayer-notecolumn `\makenote` と `BibLaTeX`

scrlayer-notecolumn `\makenote` と `BibLaTeX`

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正常に動作します:

marginpar 動作デモ


\makenote{

使用して\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\makenotetitle

\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

関連情報