При вёрстке дипломной работы в LaTeX настал этап приведения её вида в соответствие хотя бы некоторым принятым стандартам. Соответственно, начались и поиски решения возникавших вопросов, в том числе стандартными средствами, то бишь путём гугления.
Первая мысль, возникшая после просмотра решений, найденных на разношёрстных форумах — «Я же не усну». Немного размышлений и оперативное пролистывание небезызвестных руководств Балдина, Сюткина и Львовского, подтвердивших результаты размышлений, позволили разобраться с вопросами гораздо более компактными, удобными и воспринимаемыми способами.
А примеров того, как лучше не делать, приведу два. Честно, они очень порадовали, т.к. свидетельствуют об изобретательности и энергичности их создателей.
Задача: получить заголовки без переносов слов, полностью выровненные по левому краю.
Источник: mix_mix с dxdy.ru
% Выравнивание по левому краю без переносов.
newcommand{MTKPsectAlignLeft}{%
let\@centercr@rightskip@flushglue rightskip@rightskip%
leftskipz@skip}
% Выравнивание по центру
newcommand{MTKPsectAlignCenter}{%
let\@centercr
rightskip@flushglueleftskip@flushglue
parindentz@parfillskipz@skip}
% Плюшки для удобства
newcommand{MTKPsectionAlign}{MTKPsectAlignLeft}
newcommand{MTKPsubsectionAlign}{MTKPsectAlignLeft}
newcommand{MTKPsubsubsectionAlign}{MTKPsectAlignLeft}
% Для установки выравнивания секций в момент сборки
newcommand{MTKPsectAlign}[2]{%
expandafterrenewcommandcsnamestring MTKP#1Alignendcsname{%
@nameuse{MTKPsectAlign#2}}}
% Стиль заголовка
newcommand{MTKPsectionStyle}{normalfontMTKPfontXXVIsizeitMakeUppercase}
% Спасибо, luitzen
renewcommandsection{clearpage@startsection {section}{1}{.em}%
{-15mm @plus -3mm @minus -2mm}%
{15mm @plus 1mm @minus 2mm}%
{let@hangfrom@empty
MTKPsectionAlignMTKPsectionStyle}}
% Остальные заголовки так же.
% Теперь chapter{Тра-ля-ля} будет без номера по центру
newcommandchapter{
begingroupclearpageMTKPsectAlign{subsection}{Center}%
subsection*{#1}%
addcontentsline{toc}{section}{#1}endgroup}
Решение локальное:
section[Текст для содержания]{raggedright Текст для\ основного документа}
Задача: получить заголовки без переносов слов, с верхним регистром в тексте и без оного — в содержании.
Источник: alex__, с gentoo.ru
makeatletter
renewcommand{l@section}{@dottedtocline{1}{0.4cm}{0.4cm}}
renewcommand{thesection}{arabic{section}}
renewcommand{section}{@startsection{section}{1}{1.25cm}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus.2ex}{raggedrightnormalfontbfseries}}
makeatother
%Оформление подразделов
makeatletter
renewcommand{l@subsection}{@dottedtocline{2}{0.8cm}{0.8cm}}
renewcommand{thesubsection}{arabic{section}.arabic{subsection}}
renewcommand{subsection}{@startsection{subsection}{2}{1.25cm}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus.2ex}{raggedrightnormalfontbfseries}}
makeatother
%Оформление под-подразделов
makeatletter
renewcommand{thesubsubsection}{arabic{section}.arabic{subsection}.arabic{subsubsection}}
renewcommand{subsubsection}{@startsection{subsubsection}{3}{1.25cm}{-3.5ex plus -1ex minus -.2ex}{2.3ex plus.2ex}{raggedrightnormalfont}}
makeatother
makeatletter
newcommand{Section}[1]{
refstepcounter{section}
section*{MakeTextUppercase{arabic{section} #1}}
addcontentsline{toc}{section}{arabic{section} #1}
}
makeatother
Решение локальное:
section[Текст для содержания]{ТЕКСТ ДЛЯ \ ОСНОВНОГО ДОКУМЕНТА}
Оба решения, конечно, при желании можно преобразовать и в глобальные макросы, которые достаточно будет однократно включить в преамбулу документа, но это тоже будет лишняя возня и затраты времени. К тому же не факт, что ваш макрос не сможет корректно обработать именно ваши заголовки благодаря наличию в них каких-либо хитрых моментов в виде, скажем, греческих букв или, не к ночи будь помянуты, математических выражений.
До сих пор практически не разбираюсь в макросах TeX (а приведённые выше нагромождения кода — и вовсе тёмный лес), и всегда успешно обхожусь более чем стандартными командами и классами. Единственное стороннее в моих конфигурациях miktex и texlive — те самые шрифты PsCyr, и то не всегда в них есть необходимость.
В качестве аналога проблемы приходит в голову извечное балансирование между написанием собственных реализаций каких-либо алгоритмов и использованием готовых библиотек. Даже аргумент, что исследователю виднее, какие нюансы могут образоваться в его задаче, и соответственно, его код будет их учитывать — далеко не всегда корректен. Во многих библиотеках практически всё уже учтено. Самые стандартные алгоритмы настолько хорошо испытаны, что ограничения на их применение уходят в математику, а не в ошибки реализации.
Так вот, вопрос. Риторический. Зачем изобретать велосипеды, если есть поистине элементарные в использовании и отлаженные средства? Тратить имеющийся выраженный потенциал на решение обыденных вопросов, упуская возможность оставить его побольше там, где он действительно необходим?
Автор: kbtsiberkin