240 likes | 451 Vues
Лекция 4. Типы данных, переменные, операции. ТеХ как язык программирования.
E N D
Лекция 4 Типы данных, переменные, операции
ТеХ как язык программирования • Фактически, когда мы готовим текст на ТеХе, мы пишем программу, подчиняясь строгим формальным правилам (правда, не всегда явно выписанным, некоторую информацию удается извлечь только из авторского описания ТеХ-машины). • Эти правила превращают ТеХ в язык программирования. Как и в других языках, в нем можно найти (очень своеобразные) • Типы данных и соответствующие им операции, • Переменные, способы их описания и работы с ними, • Конструкции условного исполнения, переключателей и циклов, • Конструкции обменов с внешней памятью. • Некоторые из этих языковых компонент ТеХа и рассмотрены в этой лекции.
Числа и счетчики • В полиграфической системе нельзя обойтись без хотя быэлементарной арифметики. Арифметика нужна уже для счета страниц.На самом деле, вычислительные действия, производимые системой,очень серьезны, и пользователь располагает некоторыми возможностямидоступа к этой системе. Начнем с целочисленной арифметики. • Некоторые параметризованные системные макрокоманды требуют в качествепараметра целого числа. Это число может быть задано непосредственно,а может быть выработано какой-либо конструкцией. Непосредственная записьможет быть десятичной, восьмеричной или шестнадцатеричной.
Запись чисел • Десятичное число пишется как обычно. Перед восьмеричным числом ставится апостроф '. В записи шестнадцатеричных чисел кроме цифр используются большие буквы от A до F, а перед числом ставится двойная кавычка ". • Одно из важнейших применений этих форм записей — задание символов. • Базовые таблицы символов в исходном TeX-е включают по 128 позиций, нумеруемых от 0 до 127, или по-восьмеричному от '0 до '177, а в более современном ТеХе, допускающем восьмибитовую входную кодировку — до '377. Макрокоманда \char### определяет символ номер ### из текущей таблицы шрифтов. • В частности, макрокоманда для знака украинского Г: Ґ выглядит так: \def\Ge{\char128}
Целочисленные переменные • В ТеХе есть и аппарат переменных. Вы можете определить новую целочисленную переменную — счетчик — с помощью команды \newcounter. Например, \newcounter{rx} описывает счетчик rx с начальным значением, равным 0. • Установка нового значения счетчика (присваивание) производится оператором \setcounter, а приращение значений оператором \addtocounter. Первым операндом в этих командах является имя счетчика, а вторым — число. • Для того, чтобы использовать значение счетчика во втором операнде, его надо разыменовать с помощью команды \value: • \setcounter{rx}{7} % rx := 7 • \addtocounter{rx}{7} % rx +:= 7 • \addtocounter{rx}{-3} % rx +:= -3 • \setcounter{rx}{\value{ry}} % rx := ry • \addtocounter{rx}{\value{ry}} % rx +:= ry
Значение счетчика • Для вывода значения счетчика в текст используется команда (автоматически порождаемая), состоящая из \the и названия счетчика. Эта конструкция используется и для других типов переменных, о которых, может быть, еще будет идти речь. • В нашем примере командой будет \therx, и текст печатается в установленном вданный момент формате. Для принудительной смены формата числа, записанного в счетчик, используются следующие команды: • \newcounter{rx}\setcounter{rx}{17} • \arabic{rx} 17 Арабские цифры • \roman{rx} xviiМалые римские цифры • \Roman{rx}XVIIБольшие римские цифры • \alph{rx} qМалые латинские буквы, до 27 • \Alph{rx} QБольшие латинские буквы, до 27
Использование счетчиков • Можно предусмотреть иерархию счетчиков, обеспечивающую автоматический сброс подчиненных счетчиков (например, параграфов, рисунков, таблиц и т.д., для их автономной нумерации внутри каждой главы). • Вот пример. Я хочу нумеровать упражнения внутри каждой главы. Определим новый счетчик • \newcounter{exer}[chapter] • \renewcommand \theexer {\thechapter.\@arabic\c@exer} • В квадратных скобках подчинение этого счетчика счетчику chapter —каждое его изменение обнуляет счетчик exer. • Вторая строчка изменяет действие команды\theexer— номер упражнения будет печататься с номером главы и разделяю-щей точкой. Обратите внимание на использование слов, содержа-щих значок @, это возможно только в особом режиме определений.
Использование счетчиков (продолжение) • После этого мы можем использовать счетчик в новой команде; вот так • \def\NextExer{\Exercise~\refstepcounter{exer}\theexer} • Команда \refstepcounter увеличивает счетчик на 1, обнуляя все подчиненные ему счетчики и гарантируя правильную ссылку на номер счетчика (о чем мы будем говорить отдельно).
Единицы измерения для размеров • Линейные величины (размеры) могут выражаться в разных единицах, и TeX допускает использование довольно разнообразных единиц с естественным переводом одних в другие (внутреннее представление одно, отличие только при опреде-лении самих размеров). Нам естественно начать с обычных для нас метрических единиц — сантиметра cm и миллиметра mm. • Бытовая американская единица— это дюйм 2.54 см ( inch), обозначаемый in. Для непосредственного использования в полиграфических целях эти единицы не очень удобны, и традиционно используются более мелкие пункты, формальный размер которых 1/72 часть дюйма.
Пункты • В зависимости от того, какой дюйм взят за основу, меняется и размер пункта. Так, в русской полиграфии традиционно исполь-зуется старо-французский пункт dd, введенный основополож-ником измерений в полиграфии Ф. Дидо ( F. Didot), в английской и американской полиграфии либо старо-английский пункт pt (это самая распространенная единица), либо современный пункт bp (называемый еще большим пунктом). Их размеры таковы: • 1 dd = 0.377475 mm • 1 pt = 0.35146 mm • 1 bp = 0.352778 mm • Производные от этих размеров • пайка или пика (pica, pc) — 12 основных пунктов и, аналогично, цицеро (cicero, cc) — 12 пунктов Дидо. • Pica (лат) —свод правил для вычисления времени Пасхи и других праздников с переменной датой.
Размеры • Рекомендуется не злоупотреблять свободой использования единиц размеров (кстати, это относится и ко всем другим случаям), а выбрать минимальный удобный набор. • Теперь, используя названные единицы, можно ввести в употребление размеры как новый тип данных. • Размером или явной длиной называется число, записанное в одной из принятых в ТеХе систем записи (мы ограничимся обычными десятичными) и сопровождаемое единицей измерения: • 10pt 3cc 17.2cm • Имеются еще растяжимые длины, в которых, кроме основного размера, определяются еще возможные приращения с плюсом и минусом. Например, • 10pt plus 2pt minus 1pt
Команды с размерами • Некоторые команды требуют размера в качестве параметра. Здесьмы можем уже ввести в обращение команды вертикальной и горизонтальнойотбивки, т.е. дополнительного пробела; • \vspace{4pt} Вертикальная отбивка в 4 пункта • \vspace*{4pt} Вертикальная отбивка даже в начале страницы • \hspace{4pt}Горизонтальная отбивка в 4 пункта • \hspace*{4pt} Горизонтальная отбивка даже в начале строки • Можно вводить и переменные типа размер, такая переменная описываетсяс помощью \newlength, значение ей может присвоить команда \setlength, увеличить - \addtolength. • Перевод строки допускает в качестве факультативного параметра размердополнительного интерлиньяжа, например, • \\[6pt] % увеличение • \\[-4pt] % уменьшение
Использование размеров • Некоторые параметры набора заранее определены как размеры, их значениями можно пользоваться и даже менять внутри файла (однако, так, чтобы не ставить систему в трудное положение). Например, абзацный отступ определяется размером \parindent, а ширина текста — размером \textwidth. • Чтобы набрать текст с большим абзацным отступом (в 1/4 ширины текста) нужно изменить абзацный отступ: • \setlength{\parindent}{0.25\textwidth} • Результат будет таким:
Линейки • Важный типографский знак, размер которого может задаваться непосредственно, — это сплошной прямоугольник, который называется линейкой, так как обычно используется с сильно различающимися шириной и высотой. Тем не менее, и вертикальная и горизонтальная линейка — это просто прямоугольники \rule<длина><ширина>. Пример полезного прямоугольника — бабашка — квадратный прямоугольник , который сейчас любят ставить в конце доказательства вместо традиционного раньше Q.E.D. — Quod erat demonstrandum: • \def\QED{\rule{8pt}{8pt}}
Фигуры из линеек • Макрокоманда \rule имеет еще факультативный (optional) параметр,задающий подъем нижнего среза линейки над базовой линией наборастроки. Этот параметр, когда он используется, задается первыми в квадратных скобках. • Пример: \dachshund- прямоугольники немного сдвинуты назад,что достигается важной командой \kern, параметр которой —размер сдвига вправо — может принимать и отрицательные значения • \def\dachshund{\rule[6pt]{10pt}{6pt}\kern-1pt • \rule{30pt}{6pt}\kern-2.4pt\rule[6pt]{4.4pt}{12pt}} • Нужно еще упомянуть два очень важных размера. Они зависят от текущихустановок шрифтов: em и ex. Первый из них — этогоризонтальный размер, задаваемый \quad в текущем шрифте, а второй —вертикальный размер буквы х. Сравните, • {{\LARGE M\rule{2em}{1ex}x} и {\Large M\rule{2em} • {1ex}x} и {\large\tt M\rule{2em}{1ex}x}}
Условное исполнение • Д.Кнут применил в ТеХе очень интересную, в каком-то смысле первобытную, конструкцию для логических переменных. • Логическая переменная определяется как условие, при выполне-нии которого должны выполняться те или иные действия. Каждое такое условие имеет имя, состоящее из обязательного \if и произвольного дополнительного идентификатора, возьмем для определенности OK. • Условие вводится командой:\newif\ifOKи при этом автоматически описываются две команды OKtrue и OKfalse, устанавливающие состояние выполнения и нарушенияэтого условия. Условие используется в конструкциях • \ifOK Исполняемый текст \fi • \ifOK Текст-ДА \else Текст-НЕТ \fi
Применение условного исполнения • Вот простое и элегантное использование условной конструкции для того, чтобы варьировать текст в зависимости от того, окончательный это вариант или еще рабочий • (Получено по e-mail 11.4.1993, автор -Richard Tenney) • Описывается новое условие: \newif\ifdraft и устанавливаетсязначение черновик • \newif\ifdraft • \drafttrue • для значения чистовик достаточно закомментировать вторую строчку. В следующим за этим тексте можно пользоваться конструкциями • \ifdraftтекст для черновика • \else текст для окончательного набора • \fi
Стандартные условия • Исходный TeX включает несколько макрокоманд с параметрами и без,вырабатывающих условия. Рассмотрим некоторые из них. • Команда \ifmmode вырабатывает условие идет набор математическойформулы. Этим условием можно пользоваться для определения знака,который набирается только в математическом наборе, но можетиспользоваться и независимо. Например, • \def\bullt{\ifmmode\bullet\else$\bullet$\fi} • С помощью макроса \ifodd<число>можно проверить четное число или нечетное. Это важнов двухполосном наборе, т. е. в двухколонном набореполосыи при различном оформлении страниц разворота книги.
Переменный интерлиньяж • Вот пример интерлиньяжа, меняющегося через раз, в восточном бейтовом строении стиха (в газелях, например): • \newcounter{glN} • \def\glin{\addtocounter{glN}{1}% • \ifodd\theglN\\[-2pt]\else\\[10pt]\fi} • Дам турчанке из Шираза Самарканд, а если надо\glin • Бухару и в благодарность жажду родинки и взгляда.\glin • Дай вина. До дна. О, кравчий, ведь в раю уже не будет\glin • Муссалы дворцов роскошных и потоков Рукнабада.\glin
Сравнение чисел • Два целых числа можно сравнить с помощью макроса • \ifnum<число><отношение><число> • где параметр <отношение>может принимать значения <, > или =. Например, • \ifnum\thepage>15 ... \fi
Циклы • В ТеХе есть и циклы. • Для их организации используется конструкция из двух макрокоманд \loopи \repeat. При этом после \loopдолжна быть \if-овая команда, а макрос \repeatзавершает конструкцию. • С помощью цтклов можно нарисовать, например, вот такую картинку
Текст примера с предыдущей страницы • \newcounter{spa}\newcounter{i} • \def\rulefill{\leaders\hbox{\rule{0.5mm}{6pt}}\hfill} • \def\spala{\ifodd\thespa\rulefill\else\hfill\fi • \addtocounter{spa}{1}} • \def\spaline{\noindent\strut\setcounter{i}{15} • \loop\ifnum\thei>0 • \spala\addtocounter{i}{-1} • \repeat\hfill\strut} • \spaline\vskip-6pt\spaline\vskip-6pt • \spaline\vskip-6pt\spaline • \strut – это линейка нулевой ширины (знак, очень удобный для многих технических действий)
Переключатели. • Типичный пример использования конструкции переключателя даетмакрокоманда \today, которая использует три системныхмакроса \day, \monthи \year, вырабатывающиесоответственно день, месяц и год данного пропуска программы. • \def\today{\ifcase\month\orJanuary\or February\or March\or April\or May\or June\orJuly\or August\or September\or October\orNovember\or December\fi\space\number\day, \number\year} • Первая конструкция этой макрокоманды и есть переключатель. Он начинаетсяс \ifcase, за которым следует целочисленный параметр, в данномслучае вырабатываемый макросом \month. За ним следуют действия,соответствующие значениям параметра 0 и т. д., разделяемые макросом\or. Конструкция кончается закрывающейскобкой \fi. • Два других числовых параметра предваряются макросом\number, переводящим число в представляющую его строку.
Еще о формате представления даты • Программирование в ТеХе не так просто. Посмотрим другую форму представления даты, часто используемую в России: • \def\rustoday{\number\day/$\underline{\overline% • {\mbox{\rm\uppercase\expandafter{\romannumeral% • \month}}}}$--\number\year} • Сегодня • Здесь потребуются некоторые дополнительные объяснения. Команда \romannumeral аналогична команде \number, но переводит число в последовательность строчных римских цифр. Эти буквы в прописные переводит команда \uppercase{...}. Но, прямая запись \uppercase{\romannumeral\month} работает неправильно, так как команда \uppercase{...} берет следующий за ней текст и воспринимает его как строку. Макрокоманда \expandafter служит для задержки передачи параметра до исполнения следующей команды.