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.
В раздела за излъчващия клас на презентация (LXF85) беше спомената друга възможност за създаване на нови наименувани среди с помощта на командата \newtheorem:

Командата \newtheorem има две форми:
Всеки формуляр има два съответни задължителни аргумента и един незадължителен. В първия случай това е името на вече съществуваща теорема, с която трябва да има съвместна номерация. Във втория случай името на вече съществуващ брояч се предава като незадължителен параметър, на базата на който се изгражда броячът.номериране. За това какви са броячите и как да ги определим, ще обсъдим допълнително.
Броячи и други променливи
„Други променливи“ вече бяха обсъдени в „Дефинирани „размери“ и променливи „дължини“ (LXF89). Операциите с тези променливи бяха извършени с помощта на командите \newlength, \setlength и \addtolength. По подобен начин LaTeX въвежда целочислена аритметика, използвайки броячи като променливи:
Нов брояч се създава с помощта на командата \newcounter. Когато е създаден, той се инициализира на нула. Създаването на брояч е глобална операция, тоест информацията за него няма да изчезне по време на компилация, дори ако нов брояч е дефиниран в средата. Командата \setnewcounter се използва за присвояване на различна стойност на брояча, а \addtocounter се използва за промяна на определено число.
За разлика от дължините, чиято основна роля е да запомнят размерите на конкретна кутия, броячите се използват за показване на някакъв вид структурна информация. Затова се обръща специално внимание на представянето на контрастойността в текста. За да покажете просто числовата стойност на брояча с арабски цифри, използвайте командата \arabic. За запис с римски цифри трябва да използвате командите \Roman и \roman - съответно главни и малки букви. Броячът може да бъде представен и с буква от азбуката: \alph - малка латиница, \asbuk - малка кирилица и \Asbuk - главна кирилица.
Стандартните класове вече дефинират набор от броячи, които съхраняват номера на страници (брояч на страници), раздел (съответно броячи част, глава, раздел, подраздел, подраздел и т.н.), бележка под линия (брояч на бележки под линия), плаващи среди (броячи на фигури и таблици) и формули (уравнение). Когато създавате брояч,автоматично се създава команда с \префикса преди името на брояча. Извикването на такава команда показва стойността на брояча. Когато извеждате номер на раздел, плаващ обект, уравнение и други подобни, това са командите, които се използват, така че чрез предефиниране на командата \the-command, можете да промените малко стила, например, следната команда предписва в бъдеще да етикетирате всички страници в римски стил:
На базата на броячи можете да организирате йерархични структури, тоест можете да зададете зависимости:
Когато създавате нов брояч, можете да създадете връзка към съществуващ, като посочите името на съществуващия брояч като незадължителен параметър. В горния пример броячът Dep зависи от главния брояч. Тази връзка се проявява във факта, че когато стойността на основния брояч (Main) се увеличи с единица с помощта на командата \stepcounter, подчиненият брояч (Dep) се нулира на нула. Обикновено новият брояч се настройва да бъде подчинен на броячите на секциите.
Командата \refstepcounter се различава от \stepcounter по това, че в допълнение към нулирането на всички зависими броячи, \refstepcounter дефинира изходната стойност от командата \ref reference като текста, произведен от \the-command:
Тук се дефинират проблемната среда и броячът със същото име. Броячът за проблеми зависи от брояча на дяловете. Изходът \theProblem брояч е предефиниран като номер на раздел, последван от самия брояч. В средата броячът на проблемите се увеличава с единица с помощта на командата \refstepcounter. Резултатът от използването на новата среда е показан в следния пример:
Следните пакети също могат да помогнат при работа с променливи на LaTeX:
- calc Макрос пакет от колекцията инструменти за аритметични изчисления, вече споменат в раздела 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, която позволява предаване/получаване на двойки ключ=стойност като параметри (xkeyval.pdf).
Ние създаваме нашия пакет
Да предположим, че вече владеете изкуството на програмирането в средата на LaTeX. За да разпространявате вашите разработки, трябва да организирате изходния код във форма, удобна за по-нататъшна поддръжка, прехвърляне и инсталиране. Не е нужно да опитвате, ако не се интересувате от крайния резултат, но знанието как пакетът е правилно организиран също е полезно за начинаещ, тъй като ефективното обучение по програмиране е пряко свързано с изучаването на съществуващ код.
В общността на LaTeX е обичайно техните пакети и тяхната документация да се разпространяват като самостоятелни .dtx файлове (.dtx файлове). Пакетите се инсталират автоматично с помощта на инструкции, написани в .ins файлове (.ins файлове). За повече информация вижте Как да пакетирате вашия LaTeX пакет от Скот Пакин. Файлdtxtut.pdf, както обикновено, може да бъде намерен в стандартната дистрибуция на LaTeX или в CTAN. Заедно с документацията са примерните файлове [c]skeleton.dtx и [c]skeleton.ins.
Пакетът doc и придружаващата го помощна програма DOCSTRIP (docstrip.pdf файл) отговарят за работата с DTX файлове. Основната идея на пакета doc е да комбинира код с документация, което улеснява поддържането и разработването на пакета.
Инсталационен .ins файл
За да извлечете кода и документацията от DTX пакета, напишете специален файл за настройка. Наборът от инструкции е доста стереотипен:
Партиден DTX файл
Редът " / / v " трябва да бъде заменен съответно с дата, версия и кратко описание. Прологът завършва със следните думи, които създават основната документация:
В пролога можете да посочите определен брой инструкции, които определят формата на генерираната документация.
Потребителска документация
На първо място, трябва да се отбележи, че по-голямата част от описанията на LaTeX пакетите са на английски език. Има доста основателни причини за това, свързани с размера на англоезичната аудитория.
\DescribeMacro и \DescribeEnv се добавят към стандартните команди за разделяне на ниво абзац на LaTeX.
Дори ако приемем, че най-добрата документация за един програмист е самият код, то за нормален човек описателният текст пак ще бъде за предпочитане. Проблемът с комбинирането на код и описание е основната причина за появата на "грамотното програмиране".
Кодът обикновено започва веднага след потребителската документация:
\StopEventually<> маркира началото на кода и приема като параметър команда, която трябва да бъде изпълнена в края на документацията - например отпечатайте азбучния индекс \PrintIndex.
Всеки кодтрябва да бъдат рамкирани със среда на макрокод. Това ще позволи включването му в печатна документация. Има две характеристики за тази среда, които трябва да имате предвид:
- Трябва да има точно четири (4) интервала между % и \begin. Същото правило важи за \end,
- В тази среда не трябва да има текст, започващ с %. В средите и макросите може да има множество вмъквания на код и текст.
Опаковане
Често LaTeX пакетите се разпространяват като единичен DTX файл. Има начин да включите инсталационния .ins файл в пакетния файл:
Просто трябва да премахнете последната команда \endbatchfile, за да може LaTeX да компилира останалото.
Всичко. За разпространение е най-добре да поставите пакета си на CTAN. За изтегляне, моля, вижте http://www.ctan.org/upload. Винаги е необходим кратък README с описание. Компилираната документация като PDF файл също е добра идея.
прощална дума
Документирайте всяка стъпка. Пишете колкото се може повече качествен текст, тъй като никога няма достатъчно. Оцеляването на една програма се определя не само от кода, но и от описанието. "Светло бъдеще" за компетентно програмиране.
Цикълът на LaTeX във формат Linux приключи. Честно казано, през това време научих много нови неща за себе си. Надявам се, че успях да споделя това знание с вас. В тази информация няма черна магия - всичко е просто и логично и тази информация е полезна, тъй като ви позволява да автоматизирате един от най-сложните занаяти на човешката цивилизация - създаването на книги. Пишете текстове, големи и малки: те няма да бъдат загубени.
Политиката за именуване на команди в подобна на TeX среда е такава, че трябва да се измислят нови команди за нови пакети. Създаден е заосигуряване на абсолютна съвместимост отгоре надолу. За съжаление, подобна политика, в случай на необмислено използване на думи, може да доведе до "улавяне" на подходящи комбинации. Пример за правилно именуване е пакетът списъци, където lstlisting се използва вместо привидно подходящата среда за списъци.