为了完成我的论文,我拿到了一个 TeX 模板,我试图在做任何多余或无用的事情之前理解代码。我弄清楚了大部分内容,但有一段代码我无法解读:
\makeatletter
\def\thebibliography#1{\chapter*{References\@mkboth
{REFERENCES}{REFERENCES}}\list
{[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}\leftmargin\labelwidth
\advance\leftmargin\labelsep
\usecounter{enumi}}
\def\newblock{\hskip .11em plus .33em minus .07em}
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}
\makeatother
它就在参考书目之前。
有人能帮我理解这种晦涩难懂的语言吗?
答案1
缩进略有不同,代码如下
\makeatletter
\def\thebibliography#1{%
\chapter*{References\@mkboth{REFERENCES}{REFERENCES}}%
\list
{[\arabic{enumi}]}
{\settowidth\labelwidth{[#1]}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\usecounter{enumi}}%
\def\newblock{\hskip .11em plus .33em minus .07em}%
\sloppy
\clubpenalty4000
\widowpenalty4000
\sfcode`\.=1000\relax}
\makeatother
\thebibliography
它修改了构成开始代码基础的命令
\begin{thebibliography}{<longest label>}
\bibitem{<key>} <entry text>
\end{thebibliography}
详细
\chapter*{References\@mkboth{REFERENCES}{REFERENCES}}%
首先,代码排版了一个未编号的章节参考并在两边添加了页眉,内容为参考。
\list
{[\arabic{enumi}]}
参考书目使用计数器排版为列表enumi
(有点不寻常,标准实现使用计数器enumiv
,但通常这并不重要)。标签编号/标签用方括号括起来
{\settowidth\labelwidth{[#1]}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\usecounter{enumi}}%
这是标准内容,它针对这种情况设置了一个具有合理边距的列表。
\def\newblock{\hskip .11em plus .33em minus .07em}%
定义插入的额外可拉伸空间\newblock
。\newblock
这是许多参考书目样式发出的命令,用于分隔参考书目中的较大信息块。它允许视觉分离,并且可以通过其额外的拉伸性帮助改善换行。
\sloppy
设置换行参数,请参阅\fussy、\sloppy、\emergencystretch、\tolerance、\hbadness 是什么意思?。此设置通常可以很好地避免过满,但对于较长的文本段落,结果可能会不太理想。对于参考书目,这可能是可以接受的。
\clubpenalty4000
\widowpenalty4000
设置参数以控制寡妇和孤儿。请参阅如何防止出现孤儿线?和https://texfaq.org/FAQ-widows。
\sfcode`\.=1000\relax
.
禁用参考书目中句末 s 后的较大空格。另请参阅句子之间有双倍空格。
与 中的标准定义相比report.cls
( 中的相同book.cls
, 中的略有不同article.cls
)
\newenvironment{thebibliography}[1]
{\chapter*{\bibname}%
\@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}%
\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}
\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
我们注意到以下差异:
- 您的代码仅重新定义了开始代码(大概结束代码保持不变)。
- 您的代码使用
enumi
而不是enumiv
。实际上,这种差异几乎无关紧要。 - 标准代码在代码具有硬编码值(
[...]
vs\@biblabel{...}
;References
vs\bibname
; )的某些地方具有可定制的宏。- 特别是标准类会打印
\bibname
,默认为参考书目,而你的代码有参考硬编码。这大概是您的代码与“正常使用”的标准定义之间唯一可见的差异(假设的标准定义\def\@biblabel#1{[#1]}
在您的定义中是硬编码的)。
- 特别是标准类会打印
- 由于您的代码
\newblock
在开始代码中重新定义,因此对文档中该命令所做的所有更改都将无效。
FWIW我发现http://kb.mit.edu/confluence/x/YJ47它推荐了你展示的代码。Alan Hoenig 的TeX Unbound:字体、图形等的 LaTeX 和 TeX 策略显示了类似的定义第 546 页. 该定义在风格上与apalike.sty
我还发现几个 LaTeX 2.09.sty
中有类似的用法,使用enumi
(http://mirrors.ctan.org/macros/latex209/contrib/misc/chapref.sty,http://mirrors.ctan.org/macros/latex209/contrib/misc/cites.sty)。也许该代码受到了旧版 LaTeX 2.09 代码的启发?