Усложнение жизни в LaTeX

в 14:29, , рубрики: latex, велосипедостроение, мы не ищем легких путей, мышление, Программирование, метки: , , ,

При вёрстке дипломной работы в 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


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js