了解模板

了解模板

在我的論文中,我收到了一個 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

.禁用參考書目中句子結尾後的較大空間。也可以看看句子之間加倍空格


與 中的標準定義相比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它幾乎推薦了您展示的代碼。艾倫·霍尼格TeX Unbound:字體、圖形等的 LaTeX 和 TeX 策略顯示了類似的定義p。第546章。該定義在風格上與apalike.sty。我還發現了幾個.sty具有類似習慣用法的 LaTeX 2.09 使用enumi(http://mirrors.ctan.org/macros/latex209/contrib/misc/chapref.sty,http://mirrors.ctan.org/macros/latex209/contrib/misc/cites.sty)。也許程式碼的靈感來自於較舊的 LaTeX 2.09 程式碼?

相關內容