Внутренние детали Bibtex

Внутренние детали Bibtex

Я хотел бы внести изменения в заголовок моего bibtex, и это можно сделать, изменив \bibname. Но когда дело доходит до уменьшения количества места между заголовком "Библиография" и записями ниже, я хочу знать, сколько места там изначально отведено.

В целом, мне интересно, как работает внутреннее устройство bibtex. Я не могу найти никакой документации по этому поводу. Поэтому мои вопросы:

  1. Где я могу найти информацию о том, как bibtex форматирует страницы библиографии?
  2. А точнее, что определяет величину пробела между заголовком и записями ниже?

решение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, в обоих случаях.

Связанный контент