LXF94 LaTeX

Зміст

Початок програмування

ЧАСТИНА 11 Завершуючи цей довгий цикл статей,Євген Балдінподивиться на LaTeX очима професійного програміста.

LaTeX не просто дає можливість набирати текст – він дозволяє його програмувати, а отже перекладати частину своєї роботи на комп'ютер. Звичка думати – одна з найнезвичайніших особливостей розумної людини. Вона дозволяє заощаджувати сили та час.

Створюємо свої …

…команди, оточення та інше. Проста набридлива проблема, що виникла в процесі набору, напевно вирішена, і не один раз. З іншого боку, при наростаючій кваліфікації буває простіше винайти цей велосипед заново у зручній на даний момент формі, наприклад:

Нові команди часто створюються для комбінацій, які використовуються виключно в математичному оточенні. Команда \ensuremath забезпечує оточення незалежно від поточного режиму:

Команда \xspace з однойменного пакета додає в кінці команди пропуск у разі, якщо за нею не слід розділових знаків, тобто позбавляє необхідності самому вставляти явний пропуск після команди.

Є три основні структури, які дозволяють створювати свої або перейменувати вже наявні макроси:

\newcommand визначає нову команду. Якщо така команда існує, то при компіляції генерується помилка. \renewcommand перевизначає вже існуючу команду. У свою чергу, \providecommand створює нову команду, якщо на момент опису такої команди не було, і нічого не робить інакше.

У кожному з цих макросів є два обов'язкові параметри: це ім'я команди та її опис. Якщо команді необхідно передати параметр/параметри, перший необов'язковий аргумент (N) повинен прийнятизначення від одного (1) до дев'яти (9). У LXF85 (див. диск, що додається) обговорювався макрос для дублювання знака у формулі при переносі її на наступний рядок (\(a+b\hmc\)):

Замість знака ґрат (#) із цифрою після нього при компіляції макросу підставляється відповідний параметр. В даному випадку параметр був лише один, і можна сказати, що його значення зберігається в змінній #1.

Зірочка (*) в кінці макросу \newcommand накладає на переданий параметр команди \hm додаткову умову: у ньому не повинно бути порожніх рядків і команди \par. У деяких випадках це полегшує налагодження коду.

Наявність другого необов'язкового параметра макросах визначення нових команд дозволяє визначити перший параметр створюваної команди як параметр за промовчанням:

Для визначення нового оточення використовується команда \newenvironment, наприклад:

Формальний опис цієї команди схожий на \newcommand:

Так само, як і у випадку \newcommand, створеному оточенню можна передавати параметри. Підставляти параметри можна лише у коді, що відкриває оточення. Крім створення нового оточення, можна також перевизначати вже наявні за допомогою аналогічної команди \renewenvironment.

У розділі, присвяченому опису презентаційного класу beamer (LXF85), згадувалося ще про можливість створювати нові іменовані оточення за допомогою команди \newtheorem:

latex

Команда \newtheorem має дві форми:

Кожна з форм має по два відповідні обов'язкові аргументи та по одному необов'язковому. У першому випадку це ім'я вже існуючої теореми, з якою слід мати спільну нумерацію. У другому випадку як необов'язковий параметр передається ім'я вже існуючого лічильника, на основі якого будуєтьсянумерація. Про те, що таке лічильники та як їх визначати, йтиметься далі.

Лічильники та інші змінні

«Інші змінні» вже обговорювалися в розділі «Розміри» та змінні «довжини» (LXF89). Операції з цими змінними виконувались за допомогою команд \newlength, \setlength та \addtolength. Аналогічно, в LaTeX представлена ​​і цілочисленна арифметика з використанням лічильників як змінних:

Новий лічильник створюється за допомогою команди \newcounter. Під час створення він ініціалізується нулем. Створення лічильника є глобальної операцією, тобто за компіляції інформація про нього не зникне, навіть якщо новий лічильник був визначений усередині оточення. Для присвоєння лічильнику іншого значення використовується команда \setnewcounter, а зміни на якесь певне число - \addtocounter.

На відміну від довжин, основна роль яких – пам'ятати розміри певного боксу, лічильники використовуються для відображення будь-якої структурної інформації. Тому особлива увага приділяється уявленню значення лічильника у тексті. Щоб просто відобразити чисельне значення лічильника за допомогою арабських цифр, використовується команда \ Arabic. Для римської числової нотації необхідно скористатися командою \Roman і \roman - великі та малі літери відповідно. Лічильник може бути також представлений буквою алфавіту: \alph - латинська рядкова, \asbuk - кирилична рядкова і Asbuk - кирилична велика.

У стандартних класах вже визначено набір лічильників, у яких зберігаються номери сторінки (лічильник page), розділу (відповідно, лічильники part, chapter, section, subsection, subsubsection тощо), підрядкового примітки (лічильник footnote), плаваючих оточень (лічильник figure і table) та формул (equation). При створенні лічильника такожавтоматично створюється команда з префіксом \the перед ім'ям лічильника. Виклик такої команди виводить значення лічильника. При виведенні номера розділу, плаваючого об'єкта, рівняння тощо використовуються саме такі команди, тому, перевизначивши \the-команду, можна трохи змінити стиль, наприклад, наступна команда наказує надалі маркувати всі сторінки в римському стилі:

За підсумками лічильників можна організовувати ієрархічні структури, тобто можна вказувати залежності:

При створенні нового лічильника можна створити зв'язок з існуючим, вказавши ім'я існуючого лічильника як необов'язкового параметра. У прикладі вище лічильник Dep залежить від лічильника Main. Цей зв'язок проявляється у тому, що зі збільшенням значення базового лічильника (Main) на одиницю з допомогою команди \stepcounter підлеглий лічильник (Dep) обнуляється. Зазвичай новий лічильник встановлюють підпорядкування лічильникам розділів (section).

Команда \refstepcounter відрізняється від \stepcounter тим, що крім обнулення всіх залежних лічильників, \refstepcounter визначає значення, що виводиться командою посилання \ref, як текст, що створюється \the-командою:

Тут визначено оточення Problem та однойменний лічильник. Лічильник Problem залежить від лічильника розділу. Висновок лічильника \theProblem перевизначений як номер розділу, за яким слідує вже сам лічильник. Усередині оточення лічильник Problem збільшується на одиницю за допомогою команди \refstepcounter. Результат використання нового оточення представлений у наступному прикладі:

При роботі зі змінними LaTeX також можуть допомогти такі пакети:

  • calc Макропакет із колекції tools для арифметичних обчислень, що вже згадувався в розділі calc (LXF89). Цей пакет перевизначає команди типу \newcounter так,що в них можна використовувати арифметичні вирази, хоч і з деякими обмеженнями. Подробиці у файлі calc.pdf.
  • ifthen Макропакет, у якому визначено команди умовного переходу \ifthenelse і циклу \whiledo. Подробиці у файлі ifthen.pdf. Також

можна придивитися до вдосконаленої версії цього пакету xifthen.

  • fmtcount Надає різні формати (двійковий, вісімковий, шістнадцятковий і т.д.) відображення лічильників (fmtcount.pdf).
  • multido Визначає оператор циклу \multido (multido.pdf).
  • tokenizer Дозволяє розбивати текстові списки на елементи (tokenizer.pdf).
  • totpages Дає можливість дізнатися кількість сторінок у документі тощо (totpages.pdf).
  • xkeyval Покращена версія пакета keyval, який дозволяє передавати/приймати як параметри пари значень «key=value» (xkeyval.pdf).

Створюємо свій пакет

Припустимо, що ви вже володієте мистецтвом програмування серед LaTeX. Щоб поширити свої напрацювання, слід організувати вихідні тексти у зручному для подальшої підтримки, передачі та встановлення вигляді. Можна і не намагатися, якщо вас не цікавить кінцевий результат, але знати, як правильно влаштований пакет, корисно і новачкові, оскільки ефективне навчання програмування пов'язане з вивченням вже існуючого коду.

У LaTeX-спільноті прийнято розповсюджувати свої пакети та документацію до них у вигляді автономних файлів з розширенням dtx (DTX-файли). Для автоматичного встановлення пакетів використовуються інструкції, записані у файлах з розширенням ins (INS-файли). Для більш докладної інформації слід звернутися до інструкції «How to Package Your LaTeX Package», створеної Скота Пакіним [Scott Pakin]. Файлdtxtut.pdf, як завжди, можна знайти у стандартній поставці LaTeX або на CTAN. Разом із документацією йдуть файли прикладів [c]skeleton.dtx та [c]skeleton.ins.

За роботу з DTX-файлами відповідає пакет doc і супутня утиліта DOCSTRIP (файл docstrip.pdf). Основна ідея пакету doc полягає у поєднанні коду з документацією, що полегшує підтримку та розвиток пакету.

Інсталяційний INS-файл

Для вилучення коду та документації з DTX-пакета слід написати спеціальний інсталяційний файл. Набір інструкцій досить стереотипний:

Пакетний файл DTX

Рядок «//v» потрібно замінити на дату, версію та короткий опис відповідно. Закінчити пролог необхідно такими словами, що створюють основну документацію:

У пролозі можна вказувати ще кілька інструкцій, які уточнюють формат документації.

Користувальницька документація

Перш за все слід врахувати, що переважний обсяг описів для пакетів LaTeX зроблений англійською мовою. Для цього є досить вагомі підстави, пов'язані з розміром англомовної аудиторії.

До стандартних LaTeX-команд секціонування рівня paragraph додаються \DescribeMacro і DescribeEnv.

Навіть якщо припустити, що найкраща документація для програміста – це сам код, то для нормальної людини описовий текст все одно буде кращим. Проблема суміщення коду та опису є основною причиною виникнення «грамотного програмування».

Код зазвичай починається відразу ж за документацією користувача:

Команда \StopEventually<> зазначає початок коду і приймає як параметр команду, яку слід виконати наприкінці документації – наприклад, роздрукувати алфавітний покажчик \PrintIndex.

Будь-який кодслід обрамляти за допомогою оточення Macrocode. Це дозволить включити його до друкованої документації. Є дві особливості для цього оточення, які слід враховувати:

  • Між % і \begin має бути рівно чотири (4) пробіли. Аналогічне правило діє і для \end,
  • Усередині оточення має бути тексту, що починається з %. Всередині оточення environment і macros може бути кілька вставок коду та тексту.

Пакетування

Часто LaTeX-пакети поширюються як одного DTX-файла. Існує спосіб включити інсталяційний INS-файл у файл пакету:

Слід лише прибрати заключну команду \endbatchfile, щоб LaTeX міг скомпілювати інше.

Всі. Для розповсюдження свій пакет краще помістити на CTAN. Для вивантаження слід звернутися до http://www.ctan.org/upload. Завжди потрібний короткий README з описом. Зібрана документація у вигляді PDF-файлу також є гарним тоном.

Побажання

Документуйте кожен крок. Пишіть якнайбільше якісного тексту, оскільки його мало не буває. Живучість програми визначається як кодом, а й описом. "Світле майбутнє" за грамотним програмуванням.

LaTeX-цикл у Linux Format добіг кінця. Правду кажучи, я сам за цей час дізнався багато нового для себе. Сподіваюся, мені вдалося поділитись цими знаннями з вами. У цій інформації немає жодної чорної магії – все просто і логічно, і ця інформація корисна, оскільки дозволяє автоматизувати одне з найскладніших ремесел людської цивілізації – створення книг. Пишіть тексти, великі та маленькі: вони не пропадуть.

Політика створення назв команд у TeX-подібному середовищі така, що для нових пакетів необхідно вигадувати нові команди. Це зроблено длязабезпечення абсолютної сумісності згори донизу. На жаль, подібна політика у разі бездумного використання слів може призвести до «захоплення» відповідних поєднань. Прикладом правильного іменування служить пакет listings, де замість, здавалося б, відповідного за назвою оточення listing використовується lstlisting.