Лекция 4 Типы данных, переменные, операции

advertisement
Лекция 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 служит для задержки передачи
параметра до исполнения следующей команды.
Download