Лекция 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} \addtocounter{rx}{7} \addtocounter{rx}{-3} \setcounter{rx}{\value{ry}} \addtocounter{rx}{\value{ry}} % % % % % rx rx rx rx rx := +:= +:= := +:= 7 7 -3 ry 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} \vspace*{4pt} \hspace{4pt} \hspace*{4pt} Вертикальная отбивка в 4 пункта Вертикальная отбивка даже в начале страницы Горизонтальная отбивка в 4 пункта Горизонтальная отбивка даже в начале строки • Можно вводить и переменные типа размер, такая переменная описывается с помощью \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\or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\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 служит для задержки передачи параметра до исполнения следующей команды.