我正在尝试将按字母顺序排列的类别标题移到左边距。我跟着这帖子按字母顺序排列参考书目,效果很好。我可以使用 marginpar 代替节标题,但它们出现在错误的行中,并且类别之间有额外的空间。相关代码是
\renewcommand*{\do}[1]{\defbibheading{#1}{\marginpar[left]{\hfill #1}}}
marginpar 浮动在前一行确实有道理,因为那是bibheading
被调用的地方,但我不明白间距的含义。类别之间似乎没有任何 或\baselineskip
vspace的组合。当我通过添加 将 marginpar 向下移动时,它只会偶尔与第一个类别条目对齐。\bibitemsep
\bibinitsep
\vspace{FANTASY_DIM}
这是我的当前代码产生的暴行:
我希望类别边距与其第一个条目对齐,并且所有参考书目条目之间的间距相等(类别之间没有多余的空格)。对于我的参考书目,我目前使用以下选项biblatex
:natbib=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}