了解模板

了解模板

为了完成我的论文,我拿到了一个 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{...}; Referencesvs \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.styhttp://mirrors.ctan.org/macros/latex209/contrib/misc/cites.sty)。也许该代码受到了旧版 LaTeX 2.09 代码的启发?

相关内容