我想修改我的 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
。
请注意,如果使用 case(或者其他包,也许),可能很难追踪实际定义natbib
,因为它在 begin document 处重新定义了环境。但是,查看包代码会发现
\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
。