将 biblatex 类别标题移至左边距 par

将 biblatex 类别标题移至左边距 par

我正在尝试将按字母顺序排列的类别标题移到左边距。我跟着帖子按字母顺序排列参考书目,效果很好。我可以使用 marginpar 代替节标题,但它们出现在错误的行中,并且类别之间有额外的空间。相关代码是

\renewcommand*{\do}[1]{\defbibheading{#1}{\marginpar[left]{\hfill #1}}}

marginpar 浮动在前一行确实有道理,因为那是bibheading被调用的地方,但我不明白间距的含义。类别之间似乎没有任何 或\baselineskipvspace的组合。当我通过添加 将 marginpar 向下移动时,它只会偶尔与第一个类别条目对齐。\bibitemsep\bibinitsep\vspace{FANTASY_DIM}

这是我的当前代码产生的暴行:

未对齐的参考书目类别边距

我希望类别边距与其第一个条目对齐,并且所有参考书目条目之间的间距相等(类别之间没有多余的空格)。对于我的参考书目,我目前使用以下选项biblatexnatbib=true

答案1

如果您只想要页边距中的字母,则无需查看参考书目类别和标题。

就像链接问题的答案一样,我们使用字段sortinit。这个想法是记住sortinit最后一个条目的并将其与当前条目的进行比较。如果两者不同,我们将打印该字段。现在我们只需要字段格式来将内容推入边距。您可以使用\marginpar它或使用自制宏。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[backend=biber, style=authoryear]{biblatex}

\makeatletter
\DeclareFieldFormat{margin:sortinit}{\printinmargin{\mkbibbold{#1}}}

\AtBeginBibliography{\global\undef\bbx@prevsortinit}

\providebool{bbx@inset}

\renewbibmacro{begentry}{%
  \ifbool{bbx@inset}
    {}
    {\iffieldequals{sortinit}\bbx@prevsortinit
       {}
       {\printfield[margin:sortinit]{sortinit}%
        \savefield{sortinit}\bbx@prevsortinit}}%
}

% inspired by egreg's (https://tex.stackexchange.com/users/4427/egreg)
% answer to https://tex.stackexchange.com/a/123451/35864
\newcommand{\printinmargin}[1]{%
  \strut\vadjust{\printinmargin@i{#1}}}
\newcommand{\printinmargin@i}[1]{%
  \vbox to 0pt{%
    \kern-\dimexpr\dp\strutbox+\ht\strutbox\relax
    \strut
    \hfill
    \rlap{\kern1.5em #1}%
    \vss
  }%
}
\makeatother

\addbibresource{biblatex-examples.bib}

\begin{document}
Lorem \autocite{sigfridsson}

\nocite{*}

\printbibliography
\end{document}

书目摘录,边缘标有 D、E、G。

相关内容