Сначала поговорим о том, чем является 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. Хотелось бы написать и про набор формул, но к сожалению сил не хватает (потом выложу исходник книги Львовского).
alpha.rar -> emtex.rar |
betta.r00 -> emtex.r00 |
gamma.r01 -> emtex.r01 |
Пришлось придумать такой фокус с названиями, потому что narod не позволяет держать на сервере слишком больших файлов. Полученый архив нужно распаковать в корневой каталог диска C:. Ну а что делать дальше вы прочтёте в тексте который валяется внутри архива. Кроме того в каталоге C:\emtex\doc\llang\ вы сможете найти исходник книги Львовского. Мне самому остаётся только рассказать про команды программы просмотра .DVI файлов.
Мне кажется что в тексте внутри архива я забыл упомянуть про некую программку позволяющую без усилий рисовать картинки. Называется она TeXCAD.exe. Правда для того чтобы использовать картинки нарисованые в этом редакторе, нужно подключить к своему документу как-то там прикладной макропакет. Мне сейчас лень копаться в TeX-е и искать его имя. Если хотите чтобы я его вспомнил, то напишите мне по почте.
/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-а представлет собой пакет макроопределений команд (макро пакет). Лично мне в своей жизни приходилось сталкиваться с такими макропакетами как :
здесь бу бу бу ... место для истории и прочей бурды..
LaTeX по русски читается как Латех (у многих незнакомых с техом (у тех которые читают его так как он читается) людей это слово первым делом ассоциируется с материалом из которых делают презервативы).
Файл с раширением TeX предствляет собой обычный текстовой файл, в котором между словами вставленны команды. Команды эти начинаются с обратного слеша. Во например \relax. Есть такая замечательная команда как relax, которая ничего не делает. Сам \ можно нарисовать с помошью команды \backslash. Ещё есть такая весёлая вещь как фигурные скобки. Они служат для выделения груп в тесксте.
plain TeX | \TeX |
AmS-TeX | \AmSTeX |
LaTeX | \LaTeX |
LaTeX2e | \LaTeXe |
Sli-TeX | \SliTeX |
PiC-TeX | \PiCTeX или просто \PiC |
Для справки Pic TeX в принципе не макропакет, а некая графическая примочка, позволяющая что-то там рисовать (я её содержимым не разу не интересовался).
\centerline{Hello !!!} \vskip .5cm Hello world ! \vfill \eject \end
Plain TeX это самый простой в обращении макропакет.
\centerline не трудно догадаться по названию что эта команда выравнивает указанный текст по центру.
\vskip .5cm отступает на пол сантиметра по вертикали.
\vfill заполняет оставшуюся часть страницы пробелами.
\eject посылает получную страницу в выходной файл.
\end команда которой должен любой тескт. Вообще в Plain для обозначения конца лучше использовать такую команду \bye которая эквивалентна такому набору команд как \vfill\eject\end
\documentstyle{amsppt} Hello world ! \enddocument
первая команда не является обязательной.
\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.
\documentclass{article} \begin{document} Hello world ! \end{document}
итак documentclass здесь кроме основных классов (report, book, article, letter) есть ещё несколько классов про которые не написано даже в книжках, наличие всех их в LaTeX я не проверял. Кроме в LaTeX2e есть возможность создавать свои классы, но это уже немного выбивается за рамки первоначальной темы страницы, поэтому рассказывать про это я буду в последнюю очередь. И так поехали :
\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\fr{какая-нибудь фраза}Теперь вместо своей фразы в текте можно писать просто \fr. Очень удобен тот факт что команду можно определять русскими буквами. Вообще в TeX-е есть несколько команд макроопределения и две команды макроприсваивания. Кроме того макроопределение может иметь параметры. При желании даже можно переопределить саму команду макроопределения. Например так чтобы она составляла список определяемых ею команд. Можно придумать команду которая уничтожает все определения занесённые в это список. Очень полезно если вы использутете какой-либо прикладной макропакет и начиная с некоторого места в тексте он вам больше не нужен, тогда используя этот фокус, можно стереть его из памяти. Но об этом потом.
Вот вкратце о том как выглядят эти названия
plain | plain TeX | ||||||||
rplain | plain TeX (руссифицированный) | ||||||||
AmS-TeX | AmSTeX
raltx11 | AmS-LaTeX старый
| lplain | LaTeX
| rlplain | LaTeX (руссифицированный)
| LaTeXe | LaTeX 2 epsilon
| |
\rm | обычный (романский тип) |
\sl | наклонный |
\it | курсив |
\tt | пишущая машинка |
\bf | жирный |
Если по правде, то эти команды не являются командами низкого уровня. Они определены ввиде команд для загрузки шрифтов, в ещё макропакете Plain TeX. В LaTeX2e можно делать по другому. Например напечатать слово курсивом можно вот так : \textit{text}. И шрифтов там что-то около десяти (не хочу всё это сюда выписывать).
значения регистрам вы можете присваивать следующим образом
\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 деление
\def\a{aaa} { \def\a{bbb} } \message{\a}
Сначала опеределем команду \a как aaa , потом открываем группу, определяем команду \a как bbb , потом закрываем группу. Выводим определённую нами команду. Вы результате на экран выводится команда \a определённая как aaa , потому что определение bbb осталось внутри группы. Аналогичным образом скобки действуют на изменение регистров и прочую муру.
Аналогично предыдущему случаю TeX забудет последнее значение счётчика, как только группа будет закрыта.\count0=9 { \count0=33 }
Итак в 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
Например \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, но про это потом.
Например вы хотитетт поставить все эти символы в игнор - \def\do#1{\catcode'#1=9}\dospecials
\let\deff\def \deff\def{\message{test}\deff}
\toksdef\relax=3 делает \relax эквивалентом токена \toks3. А \toks3 является переменной чем-то похожей на регистр в который можно занести всё что душе угодно (см. где-то там в тексте).
\diamondpar{text...} абзац в форме ромба.
\squarepar{text...} абзац в форме квадрата.
\heartpar{text...} абзац в форме сердца.
\shapepar\nutshape{text...} абзац шестиугольной формы в круглым отверстием.
(c) Proteus 2002