Сначала поговорим о том, чем является TeX. Сразу же оговорюсь, что произносится это слово не как "текс", а именно как "тех". Объясняется это (по словам автора, Дональда Кнута), тем, что TeX есть сокращение от греческого слова, от которого происходит слово technology (так же Кнут обращает внимание на то, что это греческое слово еще обозначает искусство). Поэтому X в слове TeX есть не "заглавное икс" а греческое "заглавное хи". Кроме того, буква E в слове TeX, если правильно записывать название программы, немного ниже букв T и X, т.е. на самом деле логотип выглядит примерно так: TEX. В случае, когда такой набор невозможен, используют запись "TeX". Я тоже буду придерживаться последнего набора, потому что TEX не так хорошо смотрится на web-страничке.

p.s. Эту прочуственную речь я утащил на сайте у Калинина www.kalinin.ru (чур в институте сильно меня не бить) Очень уж не хотелось набирать его самому. Про сам TeX я знаю очень очень много, но тратить время на его описание мне совсем не хочется. Поэтому я буду писать этот текст по чуть чуть (зато каждый день).

Коротко о главном

TeX это система набора предназначеная для создания книг и особеено для книг, которые содержат очень много математики. Приготовив рукописи в формате TeX вы тем самым объясните компьютеру, как преобразовать рукопись в странцы,

Причём тут я

С этой замечательное системой я познакомился, сразу после того как на свет появилась книга Д. Кнута - "Всё про TeX". Если точнее то это была не сама книга, а её перевод. Я конечно нигде не записывал дату её покупки, но насколько я помню, купил я её почти сразу после того как её перевели. Так что если посмореть на дату входа книги, то с TeX-ом я знаком с 93 года. И я считаю TeX полноценным языком программирования. Так отложите в сторону оранжевую книжку С.М. Львовского (она написана для слабаков) и покрепче держите свою крышу. Представте себе язык в котором нет привычных вам команд перехода, нет циклов (зато рекурся есть). И всю программирование на TeX-е напоминает некие граматики. То есть циклы и операторы выбора о краней мере сделать самому и пользоваться потом сколько влезет. TeX очень необычная программа. В мои планы входит рассказать вам немного про то как пользоваться TeX-ом; самое страшное - про то как писать на низкоуровневых команадх TeX-а (плоть до создания макро вирусов на TeX-е) ну и возможно про служебные команды пакета LaTeX2e. Хотелось бы написать и про набор формул, но к сожалению сил не хватает (потом выложу исходник книги Львовского).

Где достать и как запустить

Вообще, когда я начал лепить эту страницу, то я первым делом выложил свою версию emTeX-а на сайт. Но проклятый narod сказал что файлы размером более 5 метров на сайте держать нельзя. Проще всего просто поставить себе на компьютер UNIX (LINUX), у них TeX всегда есть. Итак вы должны скачать три файла alpha.rar, betta.r00, gamma.r01, потом переименовать их следующим образом :
alpha.rar -> emtex.rar
betta.r00 -> emtex.r00
gamma.r01 -> emtex.r01

Пришлось придумать такой фокус с названиями, потому что narod не позволяет держать на сервере слишком больших файлов. Полученый архив нужно распаковать в корневой каталог диска C:. Ну а что делать дальше вы прочтёте в тексте который валяется внутри архива. Кроме того в каталоге C:\emtex\doc\llang\ вы сможете найти исходник книги Львовского. Мне самому остаётся только рассказать про команды программы просмотра .DVI файлов.

Мне кажется что в тексте внутри архива я забыл упомянуть про некую программку позволяющую без усилий рисовать картинки. Называется она TeXCAD.exe. Правда для того чтобы использовать картинки нарисованые в этом редакторе, нужно подключить к своему документу как-то там прикладной макропакет. Мне сейчас лень копаться в TeX-е и искать его имя. Если хотите чтобы я его вспомнил, то напишите мне по почте.

Команды программы просмотра

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

Команды которые вводят

.....

Комадная строка

Страницы
/b* номер первой страницы *
/e* номер последней страницы *
/d* двухстороння печать [-eo] по умолчанию -
/n# количество сторон
/k# количесто сторон котрые нужно пропустить в начале
/z+ это кажется порядок печати [-+] по умолчанию -. (модно выводить страницы в обратном порядке)
/l* размер левого отступа листов
/t* размер правого отступа листов
/h* высота листов
/w* ширина листов
/tr# разорот листов (0 - листы стоят вертикально)
/aw* ширина страниц (по умолчанию 8.5in)
/ah* высота страниц (по умолчанию 11in)
/al* левый отсуп листов (по умолчанию 1in)
/at* верхний отступ страниц (по умолчанию 1in)
/ax* X смещение для чётных страниц (0in)
/ay* Y смещение для чётных страниц (0in)
/ac# количество колонок (1)

......

.....

Примеры простых текстов

Как я уже говорил TeX представляет собой специализированный язык программирования. А каждая система на базе TeX-а представлет собой пакет макроопределений команд (макро пакет). Лично мне в своей жизни приходилось сталкиваться с такими макропакетами как :

Plain TeX AmSTeX LaTeX LaTeX 2epsilon (сокращённо LaTeX2e) AmSppt Springer

здесь бу бу бу ... место для истории и прочей бурды..

LaTeX по русски читается как Латех (у многих незнакомых с техом (у тех которые читают его так как он читается) людей это слово первым делом ассоциируется с материалом из которых делают презервативы).

Файл с раширением TeX предствляет собой обычный текстовой файл, в котором между словами вставленны команды. Команды эти начинаются с обратного слеша. Во например \relax. Есть такая замечательная команда как relax, которая ничего не делает. Сам \ можно нарисовать с помошью команды \backslash. Ещё есть такая весёлая вещь как фигурные скобки. Они служат для выделения груп в тесксте.

Вставка логотипа TeX-а в текст

plain TeX \TeX
AmS-TeX \AmSTeX
LaTeX \LaTeX
LaTeX2e \LaTeXe
Sli-TeX \SliTeX
PiC-TeX \PiCTeX или просто \PiC

Для справки Pic TeX в принципе не макропакет, а некая графическая примочка, позволяющая что-то там рисовать (я её содержимым не разу не интересовался).

Простейший пример для Plain TeX

\centerline{Hello !!!}
\vskip .5cm
Hello world !
\vfill
\eject
\end

Plain TeX это самый простой в обращении макропакет.

\centerline не трудно догадаться по названию что эта команда выравнивает указанный текст по центру.

\vskip .5cm отступает на пол сантиметра по вертикали.

\vfill заполняет оставшуюся часть страницы пробелами.

\eject посылает получную страницу в выходной файл.

\end команда которой должен любой тескт. Вообще в Plain для обозначения конца лучше использовать такую команду \bye которая эквивалентна такому набору команд как \vfill\eject\end

Простейший пример для AmSTeX

\documentstyle{amsppt}
Hello world !
\enddocument

первая команда не является обязательной.

Простейший пример для LaTeX

\documentstyle{article}
\begin{document}
Hello world !
\end{document}

Любой должен начинаться с команды \documentstyle. В качастве параметра этой команды вы можете использовать одно из следующих слов article, letter, book, report. Перед началом самого документа (begin{document}) в так называемой преамбуле текста можно указать такие вещи как :

все перечисленные параметры будут прилеплены перед самым началом документа. Дата будет прилеплена в любом случае. Если вы не укажете дату, то в начале документа автоматически будет нарисована текущая дата. Если вы не хотите видеть дату, то укажите вместо неё пустое поле \date{}.

\usepackage{tabularX} подключение пакета. С помощью этой команды вы можете подключить к вашему основному макропакету какую нибудь отдельно написанную примочку (прикладной макропакет). Или несколько примочек, написав несколько команд usepackage или перечислить имена через запятую. Например \usepackage{html} (если память не изменает) подключает пакет позволяющий влючать в ваш документ HTML страницы (про него я напишу).

Вообще по структуре документа LaTeX ничем не отличается от LaTeX2e (вернее LaTeX2e от него не отличатеся). С той разницей что LaTeX2e вместо documentstyle использует documentclass. Так что лучше сразу переду к LaTeX2e.

Простейший пример для LaTeX 2epsilon

\documentclass{article}
\begin{document}
Hello world !
\end{document}

итак documentclass здесь кроме основных классов (report, book, article, letter) есть ещё несколько классов про которые не написано даже в книжках, наличие всех их в LaTeX я не проверял. Кроме в LaTeX2e есть возможность создавать свои классы, но это уже немного выбивается за рамки первоначальной темы страницы, поэтому рассказывать про это я буду в последнюю очередь. И так поехали :

Не простой пример для LaTeX 2epsilon

\def\target{LaTeX2e}
\ifx\target\fmtname\else
\newlinechar`^^J
\message{^^JThis text use width \target^^J}
\message{*** Press ENTER ***^^J}
\read-1to\line
\nonstopmode
\read-1to\line
\fi
\documentclass{minimal}
\begin{document}
Hello !!!
\enddocument

Вот это моё маленькое изобретение. Для моего TeX-а этот фокус оказался черезвычайно удобным. Если попытаться запустить этот текст не в LaTeX 2epsilon, то он скажет вам что для данного текста не предназначен и вежливо остановится. (я вот ещё не решил : рассказать вам как создавать формулы или сразу начинать сказку про команды).

\def\target{LaTeX2e}

\def это команда служит для определения. Например если в вашем тексте часто встречается какая-нибудь фраза, то вы можете сделать для неё макро определение и использовать вместо неё более короткое слово.
\def\fr{какая-нибудь фраза}
Теперь вместо своей фразы в текте можно писать просто \fr. Очень удобен тот факт что команду можно определять русскими буквами. Вообще в TeX-е есть несколько команд макроопределения и две команды макроприсваивания. Кроме того макроопределение может иметь параметры. При желании даже можно переопределить саму команду макроопределения. Например так чтобы она составляла список определяемых ею команд. Можно придумать команду которая уничтожает все определения занесённые в это список. Очень полезно если вы использутете какой-либо прикладной макропакет и начиная с некоторого места в тексте он вам больше не нужен, тогда используя этот фокус, можно стереть его из памяти. Но об этом потом.

\ifx\target\fmtname ... \else ... \fi

\ifx выполняет сравнение двух следующих за ней токенов. Если их содержимое совпадает, то выполняются команды идущие до \else. Если не совпадают, то выполняются команды идющие после \else. Действие \ifx кончается после команды \fi. Основной прикол в том что \ifx пытается раскрыть оба свои аргумента. То есть если не создавать макроопределение \target, а вместо него подставить сразу {LaTeX2e}, то это условие никогда выполняться не будет. Здесь мы сравниваем название макропакета с необходимым нам. Любой макропакет содержит в себе имя и дату своего последнего изменения (\fmtname \fmtversion).

Вот вкратце о том как выглядят эти названия
plain plain TeX
rplain plain TeX (руссифицированный)
AmS-TeX AmSTeX
raltx11 AmS-LaTeX старый
lplain LaTeX
rlplain LaTeX (руссифицированный)
LaTeXe LaTeX 2 epsilon

\newlinechar`^^J

Задаёт символ обозначающий перевод строки.

\message

Выдаёт сообщение на экран, во время компиляции текста.

\read -1 to \line

Вообще эта команда нужна для работы с файлами. Но для того чтобы работать с файлом нужно его открыть. А команде указать фаловый поток (то есть номер файлового потока вместо -1). \read номер потока должен лежать в пределах от 0 до 15, если мне память не ихменяет. Если номер больше 15 или меньше нуля, то данные будут читаться с клавиатуры. В этом примере она нужна только для того чтобы дождаться нажатия ENTER.

\nonstopmode

У TeX-а предусмотренно три режима работы. Активируются они с помошью следютщих команд

\read -1 to \line

Опять жта же команда, но уже в nonstop режиме. В nonstopmode и batchmode любое обращиние к клавиатуре вызывает аварийное завершение компиляции. (такой вот хитрый способ прекратить компиляцию).

\enddocument

Ещё одна тонкость. В \end{document} скобки можно не писать. Но я бы не советовал этим злоупотреблять - это не красиво.

Шрифты

\rm обычный (романский тип)
\sl наклонный
\it курсив
\tt пишущая машинка
\bf жирный

Если по правде, то эти команды не являются командами низкого уровня. Они определены ввиде команд для загрузки шрифтов, в ещё макропакете Plain TeX. В LaTeX2e можно делать по другому. Например напечатать слово курсивом можно вот так : \textit{text}. И шрифтов там что-то около десяти (не хочу всё это сюда выписывать).

Счётчики

TeX имеет 256 регистров, называемых \count0,...\count255 , каждый из которых может хранить целое число в диапазоне от -2147483647 до +2147483647 включительно. Также TeX имеет 256 регистров содержащих размер \dimen0,...\dimen255. 256 регистров содержащих клей \skip0,...\skip255. И 256 регистров содеращих математический клей \muskip0,...\muskip255. Тут я правда забежал немного в перёд. Нас пока что ничего кроме регистов count не интересует.

значения регистрам вы можете присваивать следующим образом

\count0=455
\count<число>=<число>
\dimen<число>=<размер>
\skip<число>=<клей>
\muskip<чилос>=<математический клей>

Не спешите огорчатся насчёт того что регистров всего 256. В ассеблере например регистры по пальцам можно пересчитать, то это ничуть ограничивает его возможности. Кроме того я видел в некоторых UNIX слегка подпорченые версии TeX в которых регистров сколько душе угодно, но надёятся на них не стоит (этот изврат не сильно распространён).

Есть ещё один ньюанс, про который дядя Кнут никому не сказал. Равно с принципе можно и не ставить, а вместо него писать пробел или ничего не писать

\count0 22 записали в 0 регистр число 22

\count0\count4 скопиромали в 0 регистр содержимое 4 регистра

Замечание

Первые несколько счётчиков обычно использует сам макро пакет. В частности \count0 .. \count9 обычно используют для нумерации страниц, Поэтому применять регистры в открытую плохая манера (можно применять эти счётчики для кратковременных целей внутри небольшых групп.). Лучше всего использовать такую команду как \newcount. Она не является командой низкого уровня, но определена во всех существующих на сегодня макропакетах. Команда эта просто выделяет вам ещё не занятый счётчик и присваивает ему имя. Например \newcount\n найдёт ещё не занятый счётчик и присвоит ему имя \n. Для дальнейшего использования слово \count вам уже не понадобится. \n\count4 \advance\n\count5. Есть ещё такая команда (зашитая уже в самом TeX-е) как \defcount , которая просто слепо берёт счётчик в указанным вами номером и присваивает ему имя. \defcount\n=6 обозвали шестой счётчик как \n.

Если по правде , то кроме \newcount в макропакетах есть аналогичные команды для выделения размеров, боксов, файлов и т.д. (\newdimen например).

Ещё одно замечание. Не следует применять размеры (боксы, клей) с номером 255 - они нужны для каких-то служебных целей, а каких не помню.

Добавление (вычитание)

\advance\count0 by 15
\advance\count<число>=<число>
\advance\dimen<число>=<размер>
\advance\skip<число>=<клей>
\advance\muskip<число>=<математический клей>

Не помню сказал ли вам про это дядя Кнут, но частицу by писать вовсе не обязательно

\count0 45 прибавили 45 к 0 регистру

\count0-\count5 вычли из 0 регистра 5 регистр

Умножеие (деление) Умножние деление происходит только нацело. Делить и умножать можно всё : целые регистры, размеры и клей.

multiply\dimen4 by 3 умножение

divide\skip5 by 2 деление

Группы

Те из вас кто когда-дибо пытался программировать, наверняка сталкивался с понятием блочной структуры (begin... end). Если вы хотите рассматривать часть рукописи как одну еденицу, то вам нужно указать где эта чать начинается, а где заканчивается. Для это цели в TeX-е применяются фигурные скобки (на самом деле вместо скобок можно перейти на использование любых символов, но про это позже). Команда оперелённая внутри некоторой группы, не видимы за пределами группы. Постараюсь объяснить это на примерах.

\def\a{aaa} { \def\a{bbb} } \message{\a}

Сначала опеределем команду \a как aaa , потом открываем группу, определяем команду \a как bbb , потом закрываем группу. Выводим определённую нами команду. Вы результате на экран выводится команда \a определённая как aaa , потому что определение bbb осталось внутри группы. Аналогичным образом скобки действуют на изменение регистров и прочую муру.

\count0=9 { \count0=33 }

Аналогично предыдущему случаю TeX забудет последнее значение счётчика, как только группа будет закрыта.

Ещё одно применение скобок.

Категории

Некоторые из вас наверняка сталкивались с таким понятием как UNICODE кодировка. В один прекрасный день микрософт вдруг решил что ему некуда девать память и решил угрохать на каждую букву по два байта. То есть каждый символ этой замечательной кодировки представляет собой два байта (байт на символ и байт на номер языка, к которому символ принадлежит). TeX хранит буквы набраных вами слов ввиде некого подобия UNICODE кодировки. Каждой букве в памяти копьютера приписана некая категория.

Итак в TeX существует 256 символов, которые разделяются на 16 категорий :

0сигнальный символ\
1начало группы{
2конец группы}
3математический ключ$
4табулятор&
5конец строки<return>
6параметр#
7верхний индекс^
8нижний индекс_
9игнорируемый символ<null>
10пробел
11букваA-Z a-z
12другой символ
13активный символ~
14символ коментария% 15ошибочный символ<delete>

Категории любых вводимых символов можно изменять с помощбю команды catcode

\catcode`\{=11

\catcode`D=7

Команлы catcode влияет лишь на то как TeX будет воспринимать встречаемые символы, изменять категории символов уже занесённые в память он не может. Например :

\catcode`5=10
\def\test{\catcode`5=11\line55}
\catcode`5=12
\test

Цифра '5', которая хранится внутри макроопределения \text будет иметь 10 категорию, поскольку для цифры '5' перед вводом макроопределения test была установлена 10 категория.

Команда сравнения \ifx учитывает категории символов. Если сравниваемые ей образцы будут состоять из одинковых знаков, но знаки будут иметь разную категорию, то образцы будут считаться разными.

\catcode`1=10 \def\line1{test1}
\catcode`1=12 \def\line2{test1}
\ifx\line1\line2\else\newlinechar`^^J \message{Не совпали^^J} \fi

Вы можете узнавать текущую категорию символов используя команду catcode

\count19=\catcode`F заносит в 19 счётчик текушую категорию символа F.

Если вы хотите чтобы TeX не уничтожал два пробела идущих подряд (т.е. не игнорировал лишние пробелы), измените категорию пробела \catcode`\ =11

Категория изменённая внутри группы будет восстанавлена как только группа закроется. Группу может закончить любой символ с категорией 2. {\catcode`\>=2 > > завершит действие группы и вернёт символу > его прежнюю категорию.

Значение сигнального символа \ с помошью команды catcode изменить не получиться. Для этого необходимо изменить значение служебного регистра \escapechar

Опеределения и присваивания

  1. \def\a{aaa} как вы уже догадались - это команда определения. Точнее обычная команда определения.
  2. \gdef\a{aaa} эквивалент глобального опеределния, т.е. команд \global\def\a{aaa}
  3. \edef\a{aaa\b} определение с раскрытием параметров. Разница между \def и \edef в том что \def не интерспетирует значение своего тела, а хранить определение так как она было заданно. То есть \def\a{aaa\b} создаёт опеределние \a внутри которого содержится фраза aaa и команда \b. А саму команду \b можно определить позже. До того как вы задействуете опеределение \a содержимым команды \b никто интересовать не станет.

    Например \def\a{\a} \a опередеет команду \a как сслыку на саму себя, а следующим шагом вызыает это самое \a в резльтате чего определение зацикливается на последней команде (самый быстрый из известных мне способов повесить TeX во время компиляции текста).

    Ещё пример \def\b{111} \def\a{-x\b} \def\b{222} \message{\a} выводит на экран слово -x222.

    Так вот команда \edef не запомитает тело определения в его изначальном ввиде. Она раскрывает все определения , которые находит внутри своего тела и запоминает их уже ввиде готового текста.

    \def\b{111} \edef\a{-x\b} \def\b{222} \message{\a} выводит на экран слово -x111.

    p.s. вообще для игр с раскрытием есть такая штука, как \expandafter, но про это потом.

  4. \xdef\a{aaa\c} команда сочетающая свойства \edef и \gdef. То есть глобальное определение с раскрытием параметров.
  5. \globaldefs это если я не ошибаюсь, то это переменная. Если её значение не равно нулю, то все присваивания автоматически расцениваются как глобальные (ума не приложу зачем Кнут эту бредовую переменную приделал.
  6. \dospecial эта команда служит для массового изменения категорий символов \ { } $ & # ^ _ % ~ ^^A ^^K

    Например вы хотитетт поставить все эти символы в игнор - \def\do#1{\catcode'#1=9}\dospecials

  7. \let команда присваивания макоопределений. У этой команды есть одно интересное применение. Например вы хоти заставить команду присваивания выводить на экран слово test каждый раз когда вы хотите сделать макроопределение.

    \let\deff\def \deff\def{\message{test}\deff}

  8. \futurelet \futurelet\cs<токен1><токен2> действует \let\cs = <токен2><токен1><токен2>. По действию чем-то напоминает \expandafter, но думаю что так сразу понять это будет не просто, поэтому объяснять эту команду я буду потом.
  9. \toksdef команда позволяющая играться с лексическим анализатором TeX-а.

    \toksdef\relax=3 делает \relax эквивалентом токена \toks3. А \toks3 является переменной чем-то похожей на регистр в который можно занести всё что душе угодно (см. где-то там в тексте).

Параметры определений

....

Более интересные команды

....

Внутренние переменные

....

Взлом UNIX-а через TeX (сложный пример)

Создание макровируса на TeX-е (сверхсложный пример)

....

О визуальных командах

...

Наиболее полезные служебные команды LaTeX2e

...

Описание наиболее интересных прикладных макропакетов.

В данный момент в TeX-е существует около 200 различных прикладных макропакетов. Переписывать или тем более дописывать книгу Мительбаха я не хочу. Тем более что нет ни сил ни времени. (по TeX я и так могу вечно писать, впрочем как и про всё остальное). И вообще у меня завтра зачёты по ФАНу и теории компиляции. Поэтому я просто обращю внимание на пару интерных пакетов макропакетов.

Layout

Геометрические параметры макета полосы набора. Если вы собираетесь пользоваться TeX-ом, то советую просто запомнить это магическое слово Layout. Пакропакет Layout, команда layout. Думаю что здесь не нужно слов. Просто напечатайте это на принтере и повесьте на стенку.

tabularx

TabularX - очень мощный пакет, про который обязан знать каждый смертный. tabularx это обычная таблица, такая же как и tabular. За исключением того что в некоторых колонках вместо r, l или с можно вписать букву X. Колонки с буквой X предназначены для того чтобы вписать в них очень большое количество текста, не раставляя позиций переноса в тексте. Таблица сама подберёт ширину этих колонок так чтобы высота текста в них была одинаковой. Очень удобная примочка. Допускаются также все извраты с командами преабулы в описании колонок.

shapepar

Фигурные абзацы в тексте. Макропакет shapepar. Сама команда shapepar втавляется в начале абзаца, в качестве параметра (фигурных скобках) команда принимает форму абзаца. После скобок идёт сам текст абзаца. Кроме того в пакете существует четыре формы, которые заданы заранее.

\diamondpar{text...} абзац в форме ромба.

\squarepar{text...} абзац в форме квадрата.

\heartpar{text...} абзац в форме сердца.

\shapepar\nutshape{text...} абзац шестиугольной формы в круглым отверстием.

html

Макропакет typehtml. Позволяет включать в текст настоящие html страницы (в смысле изображение с них). Делается это с помощью команды \htmlinput{filename}, которая включает в ваш текст указаный html файл. Были там кажется команды делающие вставки в текст небольние html вставки, не используя внешние файлы, но тут уж извините наизусть не помню (давно это было). Разумеется что html файл должен быть обычным и не замысловатым html файлом, а не гадостью нашпигованой Java скриптами, стилями или прочей отравой, иначе пакет просто ничего не поймёт, а вы вместо текста получите бред сивой кобылы.

(c) Proteus 2002

Hosted by uCoz