
Я хотел бы внести изменения в заголовок моего bibtex, и это можно сделать, изменив \bibname. Но когда дело доходит до уменьшения количества места между заголовком "Библиография" и записями ниже, я хочу знать, сколько места там изначально отведено.
В целом, мне интересно, как работает внутреннее устройство bibtex. Я не могу найти никакой документации по этому поводу. Поэтому мои вопросы:
- Где я могу найти информацию о том, как bibtex форматирует страницы библиографии?
- А точнее, что определяет величину пробела между заголовком и записями ниже?
решение1
Вывод BibTeX — это .bbl
файл, содержащий thebibliography
среду. Определение этой среды — обязанность класса документа.
Обычно это что-то вроде
\section*{\refname}
\begin{list}{<code>}
<bib items>
\end{list}
для занятий без глав и
\chapter*{\bibname}
\begin{list}{<code>}
<bib items>
\end{list}
Это может меняться в зависимости от загруженных пакетов; например, natbib
вмешивается в этот, но использует \bibsection
макрос, который по сути эквивалентен \section*
или \chapter*
в случаях выше.
Вы можете найти определение, используя texdef
из командной строки. Например, командная строка
texdef -t latex -c article -s thebibliography
выведет
% article.cls, line 570:
\newenvironment{thebibliography}[1]
{\section*{\refname}%
\@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}%
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\@openbib@code
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\sloppy
\clubpenalty4000
\@clubpenalty \clubpenalty
\widowpenalty4000%
\sfcode`\.\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
Для его изменения необходимы \makeatletter
и \makeatother
.
Обратите внимание, что может быть трудно отследить фактическое определение в случае natbib
использования (или других пакетов, возможно), поскольку оно переопределяет среду в начале документа. Однако, просмотр кода пакета показывает
\renewenvironment{thebibliography}[1]{%
\bibsection
\parindent\z@
\bibpreamble
\bibfont
\list{\@biblabel{\the\c@NAT@ctr}}{\@bibsetup{#1}\global\c@NAT@ctr\z@}%
\ifNAT@openbib
\renewcommand\newblock{\par}%
\else
\renewcommand\newblock{\hskip .11em \@plus.33em \@minus.07em}%
\fi
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.\@m
\let\NAT@bibitem@first@sw\@firstoftwo
\let\citeN\cite \let\shortcite\cite
\let\citeasnoun\cite
}{%
\bibitem@fin
\bibpostamble
\def\@noitemerr{%
\PackageWarning{natbib}{Empty `thebibliography' environment}%
}%
\endlist
\bibcleanup
}%
Изменение пробела между заголовком и первым элементом — это просто вставка подходящей \vspace
команды перед \list
, в обоих случаях.