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

ПрограммированиеLaTeX
При вёрстке дипломной работы в LaTeX настал этап приведения её вида в соответствие хотя бы некоторым принятым стандартам. Соответственно, начались и поиски решения возникавших вопросов, в том числе стандартными средствами, то бишь путём гугления.

Первая мысль, возникшая после просмотра решений, найденных на разношёрстных форумах — «Я же не усну». Немного размышлений и оперативное пролистывание небезызвестных руководств Балдина, Сюткина и Львовского, подтвердивших результаты размышлений, позволили разобраться с вопросами гораздо более компактными, удобными и воспринимаемыми способами.

А примеров того, как лучше не делать, приведу два. Честно, они очень порадовали, т.к. свидетельствуют об изобретательности и энергичности их создателей.

Задача: получить заголовки без переносов слов, полностью выровненные по левому краю.
Источник: mix_mix с dxdy.ru

% Выравнивание по левому краю без переносов.
\newcommand{\MTKPsectAlignLeft}{%
  \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip%
  \leftskip\z@skip}

% Выравнивание по центру
\newcommand{\MTKPsectAlignCenter}{%
  \let\\\@centercr
  \rightskip\@flushglue\leftskip\@flushglue
  \parindent\z@\parfillskip\z@skip}

% Плюшки для удобства
\newcommand{\MTKPsectionAlign}{\MTKPsectAlignLeft}
\newcommand{\MTKPsubsectionAlign}{\MTKPsectAlignLeft}
\newcommand{\MTKPsubsubsectionAlign}{\MTKPsectAlignLeft}

% Для установки выравнивания секций в момент сборки
\newcommand{\MTKPsectAlign}[2]{%
  \expandafter\renewcommand\csname\string MTKP#1Align\endcsname{%
  \@nameuse{MTKPsectAlign#2}}}

% Стиль заголовка
\newcommand{\MTKPsectionStyle}{\normalfont\MTKPfontXXVIsize\it\MakeUppercase}

% Спасибо, luitzen
\renewcommand\section{\clearpage\@startsection {section}{1}{.em}%
                               {-15mm \@plus -3mm \@minus -2mm}%
                               {15mm \@plus 1mm \@minus 2mm}%
                               {\let\@hangfrom\@empty
                                \MTKPsectionAlign\MTKPsectionStyle}}

% Остальные заголовки так же.

% Теперь \chapter{Тра-ля-ля} будет без номера по центру
\newcommand\chapter{
  \begingroup\clearpage\MTKPsectAlign{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}{\raggedright\normalfont\bfseries}}
\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}{\raggedright\normalfont\bfseries}}
\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}{\raggedright\normalfont}}
\makeatother

\makeatletter
    \newcommand{\Section}[1]{
         \refstepcounter{section}
         \section*{\MakeTextUppercase{\arabic{section} #1}}
    \addcontentsline{toc}{section}{\arabic{section} #1}
    }
\makeatother


Решение локальное:
\section[Текст для содержания]{ТЕКСТ ДЛЯ \\ ОСНОВНОГО ДОКУМЕНТА}


Оба решения, конечно, при желании можно преобразовать и в глобальные макросы, которые достаточно будет однократно включить в преамбулу документа, но это тоже будет лишняя возня и затраты времени. К тому же не факт, что ваш макрос не сможет корректно обработать именно ваши заголовки благодаря наличию в них каких-либо хитрых моментов в виде, скажем, греческих букв или, не к ночи будь помянуты, математических выражений.

До сих пор практически не разбираюсь в макросах TeX (а приведённые выше нагромождения кода — и вовсе тёмный лес), и всегда успешно обхожусь более чем стандартными командами и классами. Единственное стороннее в моих конфигурациях miktex и texlive — те самые шрифты PsCyr, и то не всегда в них есть необходимость.

В качестве аналога проблемы приходит в голову извечное балансирование между написанием собственных реализаций каких-либо алгоритмов и использованием готовых библиотек. Даже аргумент, что исследователю виднее, какие нюансы могут образоваться в его задаче, и соответственно, его код будет их учитывать — далеко не всегда корректен. Во многих библиотеках практически всё уже учтено. Самые стандартные алгоритмы настолько хорошо испытаны, что ограничения на их применение уходят в математику, а не в ошибки реализации.

Так вот, вопрос. Риторический. Зачем изобретать велосипеды, если есть поистине элементарные в использовании и отлаженные средства? Тратить имеющийся выраженный потенциал на решение обыденных вопросов, упуская возможность оставить его побольше там, где он действительно необходим?
Теги:велосипедостроениемышлениеlatexмы не ищем легких путей
Хабы: Программирование LaTeX
+30
23,1k 127
Комментарии 31

Похожие публикации

Business expert (Posline)
от 250 000 до 300 000 ₽ОТП БанкМосква
Middle | High middle front-end разработчик (React + Typescript)
от 80 000 до 160 000 ₽CSSSRМожно удаленно
Программист C# (Senior)
от 180 000 ₽ГК «Системные Технологии»КалининградМожно удаленно
Reverse Engineer
от 3 500 до 4 000 $Hand2NoteМожно удаленно
Senior C++ Developer
от 250 000 до 450 000 ₽Scalable SolutionsМожно удаленно

Лучшие публикации за сутки