在我的論文中,我收到了一個 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{...}
;References
vs\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 程式碼?