![Понимание шаблона](https://rvso.com/image/391708/%D0%9F%D0%BE%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0.png)
Для моей диссертации мне дали шаблон 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
Устанавливает параметры для разрыва строки, см.Что означает \суетливый, \небрежный, \экстренно растянутый, \терпимость, \плохой?. Эта настройка обычно хороша для избежания переполнения, но может давать неудовлетворительный результат для длинных абзацев текста. Для библиографии это, вероятно, приемлемо.
\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
в начальном коде, все изменения, внесенные в эту команду в документе, будут недействительными.
Кстати, я нашелhttp://kb.mit.edu/confluence/x/YJ47который рекомендует почти тот же код, что вы показали. Алана Хенига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?