% This file generates the user manual; TeX it, don't read it!

\def\tangref{3} % where the main explanation of CTANGLing is given
\input cwebmac
\def\page{\box255 } \normalbottom
\parskip 0pt plus 1pt
\def\RA{\char'31 } % right arrow
\def\hang{\hangindent 4em\ignorespaces}
\font\eightrm=cmr8
\font\ninerm=cmr9
\font\ninett=cmtt9
\font\eighttt=cmtt8
\font\twelvett=cmtt12
\font\quoterm=cmssq8
\font\quoteit=cmssqi8
\font\authorfont=cmr12
\font\sectionfont=cmbx12

\def\pb{\.{|...|}}
\def\v{\.{\char'174}} % vertical (|) in typewriter font
\def\lpile{\def\cr{\hfill\endline}\matrix} % I only use \lpile by itself
\abovedisplayskip=.5\abovedisplayskip
\belowdisplayskip=.5\belowdisplayskip
\abovedisplayshortskip=.5\abovedisplayshortskip
\belowdisplayshortskip=.5\belowdisplayshortskip
\advance\baselineskip by -.5pt
\advance\pageheight by \baselineskip % the manual just got a bit longer
\advance\fullpageheight by \baselineskip
\setpage

\outer\def\section #1.{\penalty-500\bigskip
        \centerline{\sectionfont\def\.##1{{\twelvett##1}} #1}\nobreak\vskip 6pt
        \everypar{\hskip-\parindent\everypar{}}}

\def\lheader{\mainfont\the\pageno\hfill\sc\runninghead\hfill}
\def\rheader{\hfill\sc\runninghead\hfill\mainfont\the\pageno}
\def\runninghead{руководство пользователя {\tentt CWEB} (версия 3.0)}

% This verbatim mode assumes that ! marks are !! in the text being copied.
\def\verbatim{\begingroup
  \def\do##1{\catcode`##1=12 } \dospecials
  \parskip 0pt \parindent 0pt \let\!=!
  \catcode`\ =13 \catcode`\^^M=13
  \tt \catcode`\!=0 \verbatimdefs \verbatimgobble}
{\catcode`\^^M=13{\catcode`\ =13\gdef\verbatimdefs{\def^^M{\ \par}\let =\ }} %
  \gdef\verbatimgobble#1^^M{}}

\null\vfill
\centerline{\titlefont The {\ttitlefont CWEB} System of
    Structured Documentation}
\vskip 18pt\centerline{(Version 3.0)}
\vskip 24pt
\centerline{\authorfont Donald E. Knuth and Silvio Levy}
\vfill

\noindent
\TeX\ is a trademark of the American Mathematical Society.

\bigskip\noindent
The printed form of this manual is copyright \copyright\ 1994
  by Addison-Wesley Publishing Company, Inc.  All rights reserved.
\smallskip\noindent
The electronic form is copyright \copyright\ 1987, 1990, 1993
  by Silvio Levy and Donald E. Knuth.
\smallskip\noindent
The russian translation is copyright \copyright\ 1999
  by Sergey V. Korop \.{<svk@lib.ru>}

\bigskip\noindent
Permission is granted to make and distribute verbatim copies of the
electronic form of this document provided that the electronic copyright
notice and this permission notice are preserved on all copies.

\smallskip\noindent
Permission is granted to copy and distribute modified versions of the
electronic form of this document under the conditions for verbatim copying,
provided that the entire resulting derived work is distributed under the terms
of a permission notice identical to this one.

\smallskip\noindent
Individuals may make copies of the documentation from the electronic files
for their own personal use.

\pageno=0 \titletrue\eject

\null\vfill
\centerline{\titlefont сИСТЕМА СТРУКТУРНОГО ДОКУМЕНТИРОВАНИЯ {\ttitlefont CWEB}}
\vskip 18pt\centerline{(вЕРСИЯ 3.0)}
\vskip 24pt
\centerline{\authorfont дОНАЛЬД э. кНУТ И сИЛЬВИО лЕВИ}
\vfill

\noindent
\TeX\ ЯВЛЯЕТСЯ ТОРГОВОЙ МАРКОЙ American Mathematical Society.

\bigskip\noindent
\copyright\ 1994. пРАВАМИ НА ИЗДАНИЕ ЭТОГО РУКОВОДСТВА ОБЛАДАЕТ
Addison-Wesley Publishing Company, Inc.  вСЕ ПРАВА СОХРАНЕНЫ.
\smallskip\noindent
\copyright\ 1987, 1990, 1993. пРАВА НА ЭЛЕКТРОННУЮ ФОРМУ ЭТОГО
РУКОВОДСТВА  ПРИНАДЛЕЖАТ сИЛЬВИО лЕВИ И дОНАЛЬДУ э. кНУТУ.
\smallskip\noindent
\copyright\ 1999. пЕРЕВОД НА РУССКИЙ ЯЗЫК: сЕРГЕЙ кОРОП \.{<svk@lib.ru>}

\bigskip\noindent
в СЛУЧАЕ КОНФЛИКТА РУССКОГО ПЕРЕВОДА УСЛОВИЙ РАСПРОСТРАНЕНИЯ С ИХ АНГЛИЙСКИМ
ВАРИАНТОМ, ПРИОРИТЕТОМ ПОЛЬЗУЕТСЯ ОРИГИНАЛ.

\bigskip\noindent
Permission is granted to make and distribute verbatim copies of the
electronic form of this document provided that the electronic copyright
notice and this permission notice are preserved on all copies.


\smallskip\noindent
Permission is granted to copy and distribute modified versions of the
electronic form of this document under the conditions for verbatim copying,
provided that the entire resulting derived work is distributed under the terms
of a permission notice identical to this one.

\smallskip\noindent
Individuals may make copies of the documentation from the electronic files
for their own personal use.

\smallskip\noindent
рАЗРЕШАЕТСЯ РАСПРОСТРАНЕНИЕ ТОЧНЫХ КОПИЙ ЭЛЕКТРОННОЙ ВЕРСИИ ЭТОГО ДОКУМЕНТА
ПРИ УСЛОВИИ, ЧТО СООБЩЕНИЕ ОБ АВТОРСКИХ ПРАВАХ НА ЭЛЕКТРОННУЮ ВЕРСИЮ
И ЭТО РАЗРЕШЕНИЕ ПРИСУТСТВУЕТ ВО ВСЕХ КОПИЯХ.


\smallskip\noindent
рАЗРЕШАЕТСЯ РАСПРОСТРАНЕНИЕ ИЗМЕНЕННЫХ КОПИЙ ЭЛЕКТРОННОЙ ВЕРСИИ ЭТОГО
ДОКУМЕНТА НА УСЛОВИЯХ ТОЧНОГО КОПИРОВАНИЯ, И ПРИ УСЛОВИИ, ЧТО ПРОИЗВОДНАЯ
РАБОТА  РАСПРОСТРАНЯЕТСЯ НА УСЛОВИЯХ, ИДЕНТИЧНЫХ ЭТИМ.

\smallskip\noindent
чАСТНЫЕ ЛИЦА МОГУТ ДЕЛАТЬ КОПИИ ДОКУМЕНТАЦИИ ИЗ ЭЛЕКТРОННЫХ ФАЙЛОВ
ДЛЯ ЛИЧНОГО ИСПОЛЬЗОВАНИЯ.

\pageno=0 \titletrue\eject


\titletrue
\centerline{\titlefont сИСТЕМА СТРУКТУРНОГО ДОКУМЕНТИРОВАНИЯ {\ttitlefont CWEB}}


\vskip 15pt plus 3pt minus 3pt
\centerline{\authorfont дОНАЛЬД э. кНУТ И сИЛЬВИО лЕВИ}

\vskip 24pt plus 3pt minus 3pt
\noindent
эТОТ ДОКУМЕНТ ЯВЛЯЕТСЯ ОПИСАНИЕМ ВЕРСИИ СИСТЕМЫ \.{WEB} д.~кНУТА,
АДАПТИРОВАННОЙ К ЯЗЫКУ \CEE/ сИЛЬВИО лЕВИ. с МОМЕНТА СВОЕГО СОЗДАНИЯ В
1987~Г., \.{CWEB} СОВМЕСТНЫМИ УСИЛИЯМИ кНУТА И лЕВИ ВО МНОГОМ БЫЛ
МОДИФИЦИРОВАН И УЛУЧШЕН.  в НАСТОЯЩИЙ МОМЕНТ МЫ ПОЛАГАЕМ ЕГО ЭВОЛЮЦИЮ
БЛИЗКОЙ К ЗАВЕРШЕНИЮ, НО ТЕМ НЕ МЕНЕЕ, СООБЩЕНИЯ ОБ ОШИБКАХ, ПРЕДЛОЖЕНИЯ
И КОММЕНТАРИИ ВЕСЬМА ЖЕЛАТЕЛЬНЫ И МОГУТ НАПРАВЛЯТЬСЯ лЕВИ
(\.{levy@math.berkeley.edu}).

чИТАТЕЛИ, ЗНАКОМЫЕ С МЕМОРАНДУМОМ ``The \.{WEB} System of Structured
Documentation'' кНУТА, МОГУТ ЛИШЬ БЕГЛО ОЗНАКОМИТЬСЯ С ЭТИМ ДОКУМЕНТОМ,
ПОСКОЛЬКУ \.{CWEB} И \.{WEB} ИМЕЮТ ОБЩУЮ ФИЛОСОФИЮ И (В ОСНОВНОМ)
СИНТАКСИС. в НЕКОТОРЫХ ВОПРОСАХ \.{CWEB} ЯВЛЯЕТСЯ УПРОЩЕНИЕМ \.{WEB}:
НАПРИМЕР, \.{CWEB} НЕ НУЖДАЕТСЯ В МЕХАНИЗМАХ ОПРЕДЕЛЕНИЯ МАКРОСОВ И
ОБРАБОТКИ СТРОК \.{WEB}, ПОСКОЛЬКУ ЯЗЫК \CEE/ И ЕГО ПРЕПРОЦЕССОР БЕРУТ
ЭТУ РАБОТУ НА СЕБЯ. аНАЛОГИЧНО, СОГЛАШЕНИЯ \.{WEB} ОТНОСИТЕЛЬНО ФОРМАТА
ВОСЬМИРИЧНЫХ И ШЕСТНАДЦАТИРИЧНЫХ ЧИСЕЛ \.{@'77} И \.{@"3f} ЗАМЕНЕНЫ
ПРИНЯТЫМИ В ЯЗЫКЕ \CEE/ \.{077} И \.{0x3f}. вСЕ ПРОЧИЕ ВОЗМОЖНОСТИ
\.{WEB} СОХРАНЕНЫ И РАСШИРЕНЫ.

мЫ ВЫРАЖАЕМ СВОЮ БЛАГОДАРНОСТЬ ВСЕМ, КТО СВОИМИ ПОЖЕЛАНИЯМИ И ЗАМЕЧАНИЯМИ
УЧАСТВОВАЛ В РАЗРАБОТКЕ \.{CWEB}. оСОБУЮ ПРИЗНАТЕЛЬНОСТЬ МЫ ПРИНОСИМ Steve
Avery, Nelson Beebe, Hans-Hermann Bode, Klaus Guntermann, Norman Ramsey И
Joachim Schnitter, КОТОРЫЕ ПРЕДОСТАВИЛИ ПРОГРАММНЫЙ КОД, А ТАКЖЕ Cameron
Smith, ЗА МНОЖЕСТВО ПРЕДЛОЖЕНИЙ ПО ДОКУМЕНТАЦИИ. Ramsey СДЕЛАЛ
"ГРАМОТНОЕ ПРОГРАММИРОВАНИЕ" ("literate programming",---ТАК д. кНУТ НАЗЫВАЕТ
МЕТОДИКУ ПРОГРАММИРОВАНИЯ С ИСПОЛЬЗОВАНИЕМ \.{CWEB}---{\sl ПРИМ. ПЕРЕВ.\/})
ДОСТУПНЫМ ДЛЯ ДРУГИХ ЯЗЫКОВ СВОЕЙ СИСТЕМОЙ
\.{SPIDER} [СМ. {\sl Communications of the ACM\/ \bf32} (1989),
1051--1055].  Bode АДАПТИРОВАЛ \.{CWEB} К ЯЗЫКУ \CPLUSPLUS/, ТАК ЧТО
ДАЛЕЕ ПО ТЕКСТУ ВСЕ ССЫЛКИ НА \CEE/ ПОДРАЗУМЕВАЮТ И \CPLUSPLUS/.

\section вВЕДЕНИЕ.
сУТЬ ФИЛОСОФИИ \.{CWEB} В ТОМ, ЧТО ПРОГРАММИСТЫ, ЖЕЛАЮЩИЕ СНАБДИТЬ СВОЮ
ПРОГРАММУ НАИЛУЧШЕЙ ДОКУМЕНТАЦИЕЙ, ДОЛЖНЫ ОДНОВРЕМЕННО ПОЛЬЗОВАТЬСЯ
ЯЗЫКОМ, ПОДОБНЫМ \TeX{}, ДЛЯ ПОДГОТОВКИ ДОКУМЕНТАЦИИ И ЯЗЫКОМ, ПОДОБНЫМ
\CEE/, ДЛЯ ПРОГРАММИРОВАНИЯ. нИ ТОТ, НИ ДРУГОЙ САМ ПО СЕБЕ НЕ
ПРЕДОСТАВЛЯЕТ ВСЕГО НЕОБХОДИМОГО, НО БУДУЧИ ДОЛЖНЫМ ОБРАЗОМ ОБ®ЕДИНЕНЫ,
ОКАЗЫВАЮТСЯ КУДА БОЛЕЕ ПОЛЕЗНЫМИ, ЧЕМ ПОРОЗНЬ.

сТРУКТУРА КОМПЬЮТЕРНОЙ ПРОГРАММЫ МОЖЕТ БЫТЬ ПРЕДСТАВЛЕНА, КАК ``СЕТЬ''
(``web'' --- ``ПАУТИНА''), СОСТОЯЩАЯ ИЗ МНОЖЕСТВА ВЗАИМНО ЗАВИСИМЫХ ЧАСТЕЙ.
чТОБЫ ДОКУМЕНТИРОВАТЬ
ТАКУЮ ПРОГРАММУ, НЕОБХОДИМО ОПИСАТЬ КАЖДУЮ ТАКУЮ ЧАСТЬ И ЕЕ
ВЗАИМООТНОШЕНИЯ С ДРУГИМИ. сРЕДСТВА ОБРАБОТКИ ТЕКСТОВ, ПРЕДОСТАВЛЯЕМЫЕ
\TeX{}, ПОЗВОЛЯЮТ НАМ ОПИСАТЬ ЛОКАЛЬНУЮ СТРУКТУРУ КАЖДОЙ ЧАСТИ ПРОГРАММЫ,
А СРЕДСТВА ПРОГРАММИРОВАНИЯ ЯЗЫКА \CEE/ --- ФОРМАЛЬНО И ОДНОЗНАЧНО
СПЕЦИФИЦИРОВАТЬ АЛГОРИТМЫ. оБ®ЕДИНИВ ИХ, МЫ ПОЛУЧАЕМ СТИЛЬ
ПРОГРАММИРОВАНИЯ, МАКСИМАЛЬНО СПОСОБСТВУЮЩИЙ ПОНИМАНИЮ СТРУКТУРЫ СЛОЖНЫХ
ПРОГРАММ, И ОДНОВРЕМЕННО --- ХОРОШО ДОКУМЕНТИРОВАННЫЕ ПРОГРАММЫ, ДЛЯ КОТОРЫХ
АВТОМАТИЧЕСКИ ОБЕСПЕЧИВАЕТСЯ ВЗАИМНОЕ СООТВЕТСТВИЕ ПРОГРАММЫ И ДОКУМЕНТАЦИИ.

сИСТЕМА \.{CWEB} СОСТОИТ ИЗ ДВУХ ПРОГРАММ, НАЗВАННЫХ \.{CWEAVE} И
\.{CTANGLE}. пРИ ПРОГРАММИРОВАНИИ В СИСТЕМЕ \.{CWEB} ПРОГРАММА НА ЯЗЫКЕ
\CEE/ И ДОКУМЕНТАЦИЯ К НЕЙ ОБ®ЕДИНЕНЫ В ОДНОМ ФАЙЛЕ, НАЗЫВАЕМОМ
\.{CWEB}-ФАЙЛ, С ИМЕНЕМ ВРОДЕ \.{something.w}. кОМАНДА
`\.{cweave} \.{something}' СОЗДАЕТ ФАЙЛ \.{something.tex}, КОТОРЫЙ С
ПОМОЩЬЮ \TeX{} ПРЕВРАЩАЕТСЯ В КРАСИВО ОФОРМЛЕННУЮ (``pretty printed'')
ВЕРСИЮ \.{something.w},
КОТОРАЯ СОБЛЮДАЕТ ВСЕ ТИПОГРАФСКИЕ СОГЛАШЕНИЯ, ТАКИЕ КАК ДИЗАЙН
СТРАНИЦЫ, ИСПОЛЬЗОВАНИЕ ОТСТУПОВ, КУРСИВНЫХ И ЖИРНЫХ ШРИФТОВ,
МАТЕМАТИЧЕСКИХ СИМВОЛОВ. дОПОЛНИТЕЛЬНО АВТОМАТИЧЕСКИ СТРОИТСЯ СИСТЕМА
ПЕРЕКРЕСТНЫХ ССЫЛОК. аНАЛОГИЧНО, КОМАНДА `\.{ctangle} \.{something}'
ПОРОЖДАЕТ ПРОГРАММУ НА ЯЗЫКЕ \CEE/ \.{something.c}, КОТОРАЯ МОЖЕТ БЫТЬ
ОТКОМПИЛИРОВАНА В ИСПОЛНИМЫЙ КОД.

пОМИМО ПРЕДОСТАВЛЕНИЯ УДОБНОГО СРЕДСТВА ДОКУМЕНТИРОВАНИЯ, \.{CWEB}
РАСШИРЯЕТ ЯЗЫК \CEE/ ВОЗМОЖНОСТЬЮ МЕНЯТЬ МЕСТАМИ ЧАСТИ ТЕКСТА ПРОГРАММЫ,
ТАК ЧТО БОЛЬШИЕ ПРОГРАММНЫЕ СИСТЕМЫ МОГУТ БЫТЬ ВОСПРИНЯТЫ ЦЕЛИКОМ В
ТЕРМИНАХ НЕБОЛЬШИХ СЕКЦИЙ И ИХ ЛОКАЛЬНЫХ ВЗАИМОСВЯЗЕЙ. пРОГРАММА \.{CTANGLE}
НАЗВАНА ТАК ПОТОМУ, ЧТО ОНА РАССТАВЛЯЕТ СЕКЦИИ web-СТРУКТУРЫ В ПОРЯДКЕ,
ТРЕБУЕМОМ \CEE/; ПРЕИМУЩЕСТВОМ ПРОГРАММИРОВАНИЯ В \.{CWEB} ЯВЛЯЕТСЯ ТО,
ЧТО АЛГОРИТМЫ МОГУТ БЫТЬ ВЫРАЖЕНЫ В "РАЗВЕРНУТОЙ" ФОРМЕ, В КОТОРОЙ
КАЖДАЯ СЕКЦИЯ ОБ®ЯСНЯЕТСЯ ОТДЕЛЬНО ОТ ДРУГИХ. пРОГРАММА \.{CWEAVE}, В
СООТВЕТСТВИИ СВОЕМУ НАЗВАНИЮ, "СПЛЕТАЕТ" СОДЕРЖАЩИЕСЯ В КАЖДОЙ СЕКЦИИ
\TeX И \CEE/-ЧАСТИ В СТРУКТУРИРОВАННЫЙ ДОКУМЕНТ. вОЗМОЖНО, НЕ СЛУЧАЙНО
НЕМЕЦКИМ ЭКВИВАЛЕНТОМ ``weave'' ЯВЛЯЕТСЯ ``{\it webe\/}'', А
СООТВЕТСТВУЮЩИЙ ИМ ЛАТИНСКИЙ ИМПЕРАТИВ --- ``{\it texe\/}''!

пОЛЬЗОВАТЕЛЬ \.{CWEB} ДОЛЖЕН БЫТЬ ХОРОШО ЗНАКОМ С ЯЗЫКОМ \CEE/.
мИНИМАЛЬНОЕ ЗНАКОМСТВО С \TeX{} ТАКЖЕ ЖЕЛАТЕЛЬНО, НО ФАКТИЧЕСКИ МОЖЕТ
БЫТЬ ПОЛУЧЕНО УЖЕ В ПРОЦЕССЕ РАБОТЫ С \.{CWEB}, ПОСКОЛЬКУ ПРОСТОЙ ТЕКСТ
ПОДГОТАВЛИВАЕТСЯ В \TeX{} ПРАКТИЧЕСКИ БЕЗ КАКОГО-ЛИБО ЗНАНИЯ ЕГО
ЯЗЫКА. тЕМ, КТО ХОРОШО ЗНАКОМ С ОБЕИМИ СИСТЕМАМИ ПОТРЕБУЮТСЯ СОВСЕМ
НЕБОЛЬШИЕ УСИЛИЯ, ЧТОБЫ ИЗУЧИТЬ КОМАНДЫ \.{CWEB}.

\section оБЗОР.
сОДЕРЖИМЫМ ФАЙЛОВ \.{CWEB} МОЖЕТ БЫТЬ \TeX{}-ТЕКСТ И \CEE/-ТЕКСТ.
\.{CWEB}-ПРОГРАММИСТ ДОЛЖЕН ЧЕТКО ПРЕДСТАВЛЯТЬ ВСЕ ПРОИСХОДЯЩЕЕ С НИМИ
КАК В ПРОЦЕССЕ ГЕНЕРАЦИИ ДОКУМЕНТАЦИИ, ТАК И ПРОГРАММЫ, Т.Е. ЗНАТЬ СУТЬ
ВСЕХ ТЕХ ДЕЙСТВИЙ, КОТОРЫЕ БУДУТ ПРОИЗВОДИТЬСЯ НАД \.{CWEB}-ФАЙЛОМ
ПРОГРАММАМИ \.{CWEAVE} И \.{CTANGLE}. тЕКСТ В ФОРМАТЕ \TeX{} ПОЛНОСТЬЮ
КОПИРУЕТСЯ ПРОГРАММОЙ \.{CWEAVE} И ИГНОРИРУЕТСЯ \.{CTANGLE}, ЭТО "ЧИСТАЯ
ДОКУМЕНТАЦИЯ". с ДРУГОЙ СТОРОНЫ, \CEE/-ПРОГРАММА ФОРМАТИРУЕТСЯ
\.{CWEAVE} И ПРЕОБРАЗУЕТСЯ \.{CTANGLE} ПО ПРАВИЛАМ, КОТОРЫЕ БУДУТ СТРОГО
ОПРЕДЕЛЕНЫ ПОЗДНЕЕ. в НАСТОЯЩИЙ МОМЕНТ ДОСТАТОЧНО ПОНЯТЬ, ЧТО СУЩЕСТВУЕТ
ДВЕ РАЗНОВИДНОСТИ ТЕКСТА. сОЗДАНИЕ \.{CWEB}-ПРОГРАММЫ В ЧЕМ-ТО СХОЖЕ С
ПОДГОТОВКОЙ ДОКУМЕНТА \TeX{} С ИСПОЛЬЗОВАНИЕМ ДОПОЛНИТЕЛЬНОЙ
``\CEE/-МОДЫ'', ПОДОБНОЙ ИМЕЮЩИМСЯ В \TeX{} ГОРИЗОНТАЛЬНОЙ, ВЕРТИКАЛЬНОЙ
И МАТЕМАТИЧЕСКОЙ МОДАМ.

\.{CWEB}-ФАЙЛ СОДЕРЖИТ {\sl СЕКЦИИ\/}, КОТОРЫЕ БОЛЕЕ ИЛИ МЕНЕЕ
САМОДОСТАТОЧНЫ. кАЖДАЯ СЕКЦИЯ СОСТОИТ ИЗ ТРЕХ ЧАСТЕЙ:

\yskip\item{$\bullet$} \TEX/-ЧАСТЬ, СОДЕРЖАЩАЯ МАТЕРИАЛ, РАЗ®ЯСНЯЮЩИЙ
СУТЬ СОДЕРЖИМОГО СЕКЦИИ.

\item{$\bullet$} пРОМЕЖУТОЧНАЯ (middle) ЧАСТЬ СОДЕРЖИТ
МАКРООПРЕДЕЛЕНИЯ, СЛУЖАЩИЕ СОКРАЩЕНИЯМИ ДЛЯ \CEE/-КОНСТРУКЦИЙ, КОТОРЫЕ
НЕУДОБНО ВЫПИСЫВАТЬ КАЖДЫЙ РАЗ ЗАНОВО. оНИ ПРЕОБРАЗУЮТСЯ \.{CTANGLE} В
МАКРОСЫ ПРЕПРОЦЕССОРА.

\item{$\bullet$} \CEE/-ЧАСТЬ, СОДЕРЖАЩАЯ ЧАСТЬ ПРОГРАММЫ, ГЕНЕРИРУЕМОЙ
\.{CTANGLE}. дЛИНА \CEE/-ЧАСТИ В ИДЕАЛЕ НЕ ДОЛЖНА ПРЕВЫШАТЬ ДЮЖИНЫ
СТРОЧЕК, ЧТОБЫ ОНА СОСТАВЛЯЛА ЗАКОНЧЕННЫЙ
ФРАГМЕНТ ПРОГРАММЫ И БЫЛА ЛЕГКО ПОНИМАЕМОЙ.

\yskip\noindent тРИ ЧАСТИ КАЖДОЙ СЕКЦИИ ДОЛЖНЫ РАСПОЛАГАТЬСЯ В ЭТОМ
ПОРЯДКЕ, Т.Е. \TeX-КОММЕНТАРИЙ ДОЛЖЕН СЛЕДОВАТЬ ПЕРВЫМ, ЗАТЕМ
ПРОМЕЖУТОЧНАЯ ЧАСТЬ И, НАКОНЕЦ, \CEE/-КОД. лЮБАЯ ИЗ ЭТИХ ЧАСТЕЙ МОЖЕТ
БЫТЬ ПУСТОЙ.

сЕКЦИЯ НАЧИНАЕТСЯ ЛИБО `\.{@\ }', ЛИБО `\.{@*}', ГДЕ `\.{\ }' ОЗНАЧАЕТ
СИМВОЛ "ПРОБЕЛ". сЕКЦИЯ ЗАКАНЧИВАЕТСЯ НАЧАЛОМ СЛЕДУЮЩЕЙ СЕКЦИИ, Т.Е.
СЛЕДУЮЩИМ `\.{@\ }' ИЛИ `\.{@*}', ЛИБО КОНЦОМ ФАЙЛА. \.{CWEB}-ФАЙЛ МОЖЕТ
СОДЕРЖАТЬ ПРОИЗВОЛЬНЫЙ ТЕКСТ, РАСПОЛАГАЮЩИЙСЯ ПЕРЕД НАЧАЛОМ ПЕРВОЙ
СЕКЦИИ И НЕ ВХОДЯЩИЙ НИ В ОДНУ ИЗ СЕКЦИЙ. пОДОБНЫЙ ТЕКСТ ДАЛЕЕ БУДЕМ
ИМЕНОВАТЬ "ПРЕАМБУЛОЙ" (``in limbo''), ОН ИГНОРИРУЕТСЯ \.{CTANGLE} И
ПОЛНОСТЬЮ КОПИРУЕТСЯ \.{CWEAVE}, ТАК ЧТО ЕГО НАЗНАЧЕНИЕ СОСТОИТ В ОПРЕДЕЛЕНИИ
ПРОИЗВОЛЬНЫХ ИНСТРУКЦИЙ \TeX'А. кАК ПРАВИЛО, ЭТИ ИНСТРУКЦИИ ЗАГРУЖАЮТ
ТРЕБУЕМЫЕ ШРИФТЫ, ОПРЕДЕЛЯЮТ МАКРОСЫ, ИЗМЕНЯЮТ РАЗМЕРЫ СТРАНИЦЫ И/ИЛИ
ГЕНЕРИРУЮТ ТИТУЛЬНЫЙ ЛИСТ.

сЕКЦИИ НУМЕРУЮТСЯ ПОСЛЕДОВАТЕЛЬНО, НАЧИНАЯ С~1. эТИ НОМЕРА ПОЯВЛЯЮТСЯ В
НАЧАЛЕ КАЖДОЙ СЕКЦИИ В \TeX-ДОКУМЕНТЕ, ПОЛУЧЕННОМ \.{CWEAVE}, А ТАКЖЕ В
КОММЕНТАРИЯХ, ОТМЕЧАЮЩИХ НАЧАЛО И КОНЕЦ КАЖДОЙ СЕКЦИИ В \CEE/-ПРОГРАММЕ,
СГЕНЕРИРОВАННОЙ \.{CTANGLE}.

\section иМЕНА СЕКЦИЙ.
к СЧАСТЬЮ, НЕТ НИКАКОЙ НАДОБНОСТИ НУМЕРОВАТЬ СЕКЦИИ ВРУЧНУЮ. пРОСТО
ПОМЕСТИТЕ `\.{@\ }' ЛИБО `\.{@*}' В НАЧАЛЕ КАЖДОЙ НОВОЙ СЕКЦИИ, И ИХ
НОМЕРА БУДУТ СГЕНЕРИРОВАНЫ \.{CWEAVE} И \.{CTANGLE} АВТОМАТИЧЕСКИ. пРИ
НЕОБХОДИМОСТИ СЕКЦИИ МОЖЕТ БЫТЬ ПРИСВОЕНО {\sl ИМЯ} ВМЕСТО НОМЕРА. иМЯ
НАЧИНАЕТСЯ `\.{@<}', ДАЛЕЕ СЛЕДУЕТ ПРОИЗВОЛЬНЫЙ ТЕКСТ \TEX/, А ЗАТЕМ ---
`\.{@>}'. кОГДА \.{CWEAVE} ВЫВОДИТ ИМЯ СЕКЦИИ, `\.{@<}' И `\.{@>}'
ЗАМЕНЯЮТСЯ УГЛОВЫМИ СКОБКАМИ, И ДОБАВЛЯЕТСЯ НОМЕР СЕКЦИИ БОЛЕЕ МЕЛКИМ
ШРИФТОМ. пОЭТОМУ, КОГДА ВЫ ЧИТАЕТЕ ВЫВОД \.{CWEAVE}, ЛЕГКО ПРОСЛЕДИТЬ
ВСЕ ВЗАИМОСВЯЗИ МЕЖДУ СЕКЦИЯМИ.

дЛЯ НАГЛЯДНОСТИ ИМЯ СЕКЦИИ ДОЛЖНО БЫТЬ ХОРОШИМ ОПИСАНИЕМ СОДЕРЖИМОГО
СЕКЦИИ, Т.Е. ПОЯСНЯТЬ АБСТРАКЦИЮ, ПРЕДСТАВЛЕННУЮ СЕКЦИЕЙ. вПОСЛЕДСТВИЕ
СЕКЦИЯ МОЖЕТ БЫТЬ "ВСТРОЕНА" В ДРУГИЕ СЕКЦИИ ТАК, ЧТО МАЛОЗНАЧИМЫЕ
ДЕТАЛИ ЕЕ РЕАЛИЗАЦИИ ОКАЖУТСЯ СКРЫТЫМИ. иМЯ СЕКЦИИ, СЛЕДОВАТЕЛЬНО, ДОЛЖНО
БЫТЬ ДОСТАТОЧНО ДЛИННЫМ, ЧТОБЫ ВЫРАЗИТЬ ПРИ ЭТОМ ЕЕ СУТЬ.

к СОЖАЛЕНИЮ, УТОМИТЕЛЬНО И ЧРЕВАТО ОШИБКАМИ ПИСАТЬ ДЛИННОЕ ИМЯ СЕКЦИИ
СНОВА И СНОВА. пОЭТОМУ \.{CTANGLE} И \.{CWEAVE} ПОЗВОЛЯЮТ
ИСПОЛЬЗОВАТЬ СОКРАЩЕНИЯ. вСЯКИЙ РАЗ, КОГДА В \.{CWEB}-ФАЙЛЕ ДОЛЖНО
ПОЯВИТЬСЯ ИМЯ СЕКЦИИ, ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ `\.{@<$\alpha$...@>}', ГДЕ
$\alpha$ --- ЛЮБАЯ СТРОКА, ЯВЛЯЮЩАЯСЯ ПРЕФИКСОМ ПОЛНОГО ИМЕНИ. нАПРИМЕР,
`\.{@<Clear the arrays@>}' МОЖЕТ БЫТЬ СОКРАЩЕНО ДО `\.{@<Clear...@>}',
ЕСЛИ НИКАКОЕ ДРУГОЕ ИМЯ СЕКЦИИ НЕ НАЧИНАЕТСЯ С `\.{Clear}'. аНАЛОГИЧНО
МОЖНО ИСПОЛЬЗОВАТЬ СОКРАЩЕНИЕ `\.{@<Clear t...@>}' И Т.Д.

иМЕНА СЕКЦИЙ В ПРОЧИХ СЛУЧАЯХ ДОЛЖНЫ СОВПАДАТЬ ПОСИМВОЛЬНО, ЗА
ИСКЛЮЧЕНИЕМ ПОСЛЕДОВАТЕЛЬНОСТЕЙ ПРОБЕЛЬНЫХ СИМВОЛОВ (СОБСТВЕННО ПРОБЕЛА,
СИМВОЛОВ ТАБУЛЯЦИИ, КОНЦА СТРОКИ И/ИЛИ СТРАНИЦЫ), КОТОРЫЕ ТРАКТУЮТСЯ КАК
ОДИН ПРОБЕЛ. в НАЧАЛЕ И КОНЦЕ ИМЕНИ ВСЕ ПРОБЕЛЬНЫЕ СИМВОЛЫ БУДУТ
ОТБРОШЕНЫ. тАК,  `\.{@< Clear { }the arrays @>}' БУДЕТ СООТВЕТСТВОВАТЬ
ИМЕНИ В ПРЕДЫДУЩЕМ ПРИМЕРЕ. пРОБЕЛЬНЫЕ СИМВОЛЫ ПОСЛЕ МНОГОТОЧИЯ ТАКЖЕ
БУДУТ ИГНОРИРОВАТЬСЯ, НО НЕ ПЕРЕД НИМ, ТАК ЧТО `\.{@<Clear t ...@>}' НЕ
СООТВЕТСТВУЕТ `\.{@<Clear the arrays@>}'.

\section чТО ДЕЛАЕТ \.{CTANGLE}.
кАК БЫЛО СКАЗАНО ВЫШЕ, СЕКЦИЯ НАЧИНАЕТСЯ `\.{@\ }' ЛИБО `\.{@*}', НО
НИЧЕГО --- О ТОМ, КАК ОНА ДЕЛИТСЯ НА \TeX-ЧАСТЬ, ПРОМЕЖУТОЧНУЮ И
\CEE/-ЧАСТИ. пРОМЕЖУТОЧНАЯ ЧАСТЬ НАЧИНАЕТСЯ С ПЕРВЫМ ПОЯВЛЕНИЕМ В ТЕЛЕ
СЕКЦИИ `\.{@d}' ЛИБО `\.{@f}', А \CEE/-ЧАСТЬ НАЧИНАЕТСЯ ПЕРВЫМ `\.{@c}'
ИЛИ `\.{@<section name@>=}'. в ПОСЛЕДНЕМ СЛУЧАЕ ИМЯ ПРИСВАИВАЕТСЯ ДАННОЙ
\CEE/-СЕКЦИИ, ЕСЛИ ЖЕ СЕКЦИЯ НАЧАТА `\.{@c}', ТО ОНА БУДЕТ {\sl
НЕИМЕНОВАННОЙ}.

кОНСТРУКЦИЯ `\.{@<section name@>}' МОЖЕТ ПОЯВИТЬСЯ В ТЕЛЕ \CEE/-СЕКЦИИ
ПРОИЗВОЛЬНОЕ КОЛИЧЕСТВО РАЗ: ПОСЛЕДУЮЩИЕ ССЫЛКИ НА ИМЯ ОЗНАЧАЮТ ЕГО
"ИСПОЛЬЗОВАНИЕ", А НЕ "ОБ®ЯВЛЕНИЕ", Т.Е. ЧТО ИМЕНОВАННАЯ СЕКЦИЯ,
ОПРЕДЕЛЕННАЯ ГДЕ-ЛИБО ЕЩЕ, ДОЛЖНА БЫТЬ ВСТАВЛЕНА В ЭТО МЕСТО
\CEE/-ПРОГРАММЫ. дЕЙСТВИТЕЛЬНО, ОСНОВНАЯ ИДЕЯ \.{CTANGLE} --- СОЗДАТЬ
ПРОГРАММУ, ОБ®ЕДИНИВ НЕКОТОРОЕ КОЛИЧЕСТВО ИМЕНОВАННЫХ И НЕИМЕНОВАННЫХ
СЕКЦИЙ. тОЧНЫЕ ПРАВИЛА ТАКОГО ОБ®ЕДИНЕНИЯ ТАКОВЫ: ВНАЧАЛЕ ВСЕ
МАКРООПРЕДЕЛЕНИЯ, ОТМЕЧЕННЫЕ `\.{@d}' ПРЕОБРАЗУЮТСЯ В ИНСТРУКЦИИ
ПРЕПРОЦЕССОРА И СОБИРАЮТСЯ В НАЧАЛЕ ФАЙЛА. дАЛЕЕ ТУДА КОПИРУЮТСЯ
НЕИМЕНОВАННЫЕ \CEE/-СЕКЦИИ. тАК ОБРАЗУЕТСЯ ПЕРВОЕ ПРИБЛИЖЕНИЕ ТЕКСТА
ПРОГРАММЫ (ДОЛЖНА СУЩЕСТВОВАТЬ ХОТЯ БЫ ОДНА НЕИМЕНОВАННАЯ СЕКЦИЯ). зАТЕМ
ВСЕ ИМЕНА СЕКЦИЙ, НАЙДЕННЫЕ В ПОЛУЧЕННОМ ТЕКСТЕ, ЗАМЕНЯЮТСЯ
\CEE/-ЧАСТЯМИ СООТВЕТСТВУЮЩИХ СЕКЦИЙ И ЭТОТ ПРОЦЕСС ПОДСТАНОВКИ
ПРОДОЛЖАЕТСЯ ДО РАЗРЕШЕНИЯ ВСЕХ ССЫЛОК. вСЕ КОММЕНТАРИИ УДАЛЯЮТСЯ,
ПОСКОЛЬКУ ПОЛУЧЕННАЯ ПРОГРАММА НА \CEE/ НЕ ПРЕДНАЗНАЧАЕТСЯ ДЛЯ ЧТЕНИЯ
ЧЕЛОВЕКОМ.

еСЛИ ОДНО И ТО ЖЕ ИМЯ БЫЛО ДАНО БОЛЕЕ ЧЕМ ОДНОЙ СЕКЦИИ, \CEE/-ФРАГМЕНТ
ПОЛУЧАЕТСЯ ОБ®ЕДИНЕНИЕМ \CEE/-ЧАСТЕЙ ВСЕХ ТАКИХ СЕКЦИЙ. эТО ОКАЗЫВАЕТСЯ
ПОЛЕЗНЫМ, НАПРИМЕР, ЕСЛИ ИМЕЕТСЯ СЕКЦИЯ С ИМЕНЕМ `Global variables', В
КОТОРОЙ БУДУТ СОБРАНЫ ВСЕ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ, ГДЕ БЫ ОНИ НИ БЫЛИ
ОБ®ЯВЛЕНЫ.
кОГДА НЕСКОЛЬКО СЕКЦИЙ ИМЕЮТ ОДИНАКОВОЕ ИМЯ, \.{CWEAVE} ПОЛАГАЕТ НОМЕР
ПЕРВОЙ ИЗ НИХ НОМЕРОМ, СООТВЕТСТВУЮЩИМ ЭТОМУ ИМЕНИ, И ОНА ВСТАВЛЯЕТ В
КОНЕЦ СЕКЦИИ ССЫЛКУ: `See also sections~\dots' ("сМ. ТАКЖЕ
СЕКЦИИ~\dots"),  В КОТОРОЙ
ПЕРЕЧИСЛЕНЫ НОМЕРА ВСЕХ ОСТАЛЬНЫХ СЕКЦИЙ, ИМЕЮЩИХ ЭТО ЖЕ ИМЯ.
сООТВЕТСТВУЮЩИЙ \CEE/-ТЕКСТ ФОРМАТИРУЕТСЯ \.{CWEAVE} ТАК, ЧТО ВМЕСТО
ЗНАКА РАВЕНСТВА В ВЫХОДНОМ ДОКУМЕНТЕ ПРИСУТСТВУЕТ ЗНАК ЭКВИВАЛЕНТНОСТИ,
Т.Е. `$\langle\,$section name$\,\rangle\equiv\null$\CEE/ text'.
пРИ ЭТОМ В ПОСЛЕДУЮЩИХ СЕКЦИЯХ С ЭТИМ ИМЕНЕМ ЗНАК  `$\equiv$' ЗАМЕНЯЕТСЯ
НА `$\mathrel+\equiv$', УКАЗЫВАЮЩИМ НА ТО, ЧТО \CEE/-ФРАГМЕНТ ЭТОЙ СЕКЦИИ
БУДЕТ ДОБАВЛЕН К ФРАГМЕНТУ ДРУГОЙ СЕКЦИИ.

кОГДА \.{CTANGLE} НАЧИНАЕТ И ОКАНЧИВАЕТ ОБРАБОТКУ СЕКЦИИ, ОНА ВСТАВЛЯЕТ
В ВЫХОДНОЙ ФАЙЛ ДИРЕКТИВЫ ПРЕПРОЦЕССОРА \.{\#line}, ТАК ЧТО НОМЕРА СТРОК
В СООБЩЕНИЯХ ОБ ОШИБКАХ И ПРИ ОТЛАДКЕ ПРОГРАММЫ БУДУТ ССЫЛАТЬСЯ НА
ИСХОДНЫЙ \.{CWEB}-ФАЙЛ. бЛАГОДАРЯ ЭТОМУ, В БОЛЬШИНСТВЕ СЛУЧАЕВ О
ПОЛУЧАЕМОМ \CEE/-ФАЙЛЕ МОЖНО ПРОСТО ЗАБЫТЬ.

\section чТО ДЕЛАЕТ \.{CWEAVE}. оБЩАЯ ИДЕЯ \.{CWEAVE} --- СОЗДАТЬ ИЗ
ФАЙЛА \.{CWEB} ФАЙЛ \.{.tex} ТАКИМ ОБРАЗОМ: ПЕРВАЯ СТРОКА ПОЛУЧАЕМОГО
ФАЙЛА \.{.tex} УКАЗЫВАЕТ \TeX'У ЗАГРУЗИТЬ ФАЙЛ МАКРООПРЕДЕЛЕНИЙ,
ОПИСЫВАЮЩИХ ФОРМАТ \.{CWEB}-ДОКУМЕНТОВ. дАЛЕЕ В \.{tex}-ФАЙЛ КОПИРУЕТСЯ
ТЕКСТ ПРЕАМБУЛЫ, РАСПОЛОЖЕННЫЙ ПЕРЕД ПЕРВОЙ СЕКЦИЕЙ. зАТЕМ СЛЕДУЕТ ПО
ОЧЕРЕДИ ВЫВОД КАЖДОЙ СЕКЦИИ, ВОЗМОЖНО ВПЕРЕМЕШКУ С КОМАНДАМИ ОКОНЧАНИЯ
СТРАНИЦЫ. нАКОНЕЦ, \.{CWEAVE} ГЕНЕРИРУЕТ СИСТЕМУ ПЕРЕКРЕСТНЫХ ССЫЛОК: ДЛЯ
КАЖДОГО \CEE/-ИДЕНТИФИКАТОРА УКАЗЫВАЮТСЯ НОМЕРА ВСЕХ СЕКЦИЙ, В КОТОРЫХ
ОН ИСПОЛЬЗУЕТСЯ, А ТАКЖЕ СТРОИТСЯ АЛФАВИТНЫЙ СПИСОК ВСЕХ ИМЕН СЕКЦИЙ, А
ТАКЖЕ ОГЛАВЛЕНИЕ, СОДЕРЖАЩЕЕ НОМЕРА СТРАНИЦ И СЕКЦИЙ ДЛЯ ВСЕХ
``ЗАГЛАВНЫХ'' СЕКЦИЙ.

вЫ СПРОСИТЕ,  ЧТО ТАКОЕ ``ЗАГЛАВНАЯ'' СЕКЦИЯ (``starred-section'')?
сЕКЦИИ, КОТОРЫЕ НАЧИНАЮТСЯ
`\.{@*}' ВМЕСТО `\.{@\ }' ОБОЗНАЧАЮТ НАЧАЛО НОВОЙ ГРУППЫ СЕКЦИЙ.  пОСЛЕ
`\.{@*}' УКАЗЫВАЕТСЯ ИМЯ ГРУППЫ, ОКАНЧИВАЮЩЕЕСЯ ТОЧКОЙ. тАКИЕ ГРУППЫ В
ДОКУМЕНТЕ \TEX/ ВСЕГДА НАЧИНАЮТ НОВУЮ СТРАНИЦУ, И ИХ ИМЯ ИСПОЛЬЗУЕТСЯ В
КОЛОНТИТУЛЕ ВСЕХ ПОСЛЕДУЮЩИХ СТРАНИЦ ДО ПОЯВЛЕНИЯ ОЧЕРЕДНОЙ
ЗАГЛАВНОЙ СЕКЦИИ. иМЯ ГРУППЫ ТАКЖЕ ЗАНОСИТСЯ В ОГЛАВЛЕНИЕ И ПЕЧАТАЕТСЯ В
НАЧАЛЕ СЕКЦИИ ЖИРНЫМ ШРИФТОМ. пРЕДОСТЕРЕЖЕНИЕ: НЕ ИСПОЛЬЗУЙТЕ В ТАКИХ
ИМЕНАХ УПРАВЛЯЮЩИХ ПРЕДЛОЖЕНИЙ \TeX'А, ЕСЛИ ВЫ НЕ УВЕРЕНЫ, ЧТО
МАКРООПРЕДЕЛЕНИЯ ИЗ \.{cwebmac} НЕ КОНФЛИКТУЮТ С НИМИ. пРИЧИНОЙ ЭТОМУ
СЛУЖИТ ТО, ЧТО ИМЯ ГРУППЫ БУДЕТ ПРЕОБРАЗОВАНО В ВЕРХНИЙ РЕГИСТР, КОГДА
ОНО ПОЯВЛЯЕТСЯ В КОЛОНТИТУЛЕ, А ТАКЖЕ БУДЕТ ВЫВЕДЕНО ЖИРНЫМ ШРИФТОМ В
НАЧАЛЕ СЕКЦИИ И ЗАПИСАНО ВО ВРЕМЕННЫЙ ФАЙЛ-ОГЛАВЛЕНИЕ, ТАК ЧТО
ИСПОЛЬЗУЕМЫЕ КОМАНДЫ ДОЛЖНЫ РАБОТАТЬ ПРАВИЛЬНО ВО ВСЕХ ЭТИХ РЕЖИМАХ.

\TeX-ФАЙЛ, ПОЛУЧЕННЫЙ С ПОМОЩЬЮ \.{CWEAVE}, ДЛЯ КАЖДОЙ СЕКЦИИ СОДЕРЖИТ
СЛЕДУЮЩЕЕ: ВО-ПЕРВЫХ, НОМЕР СЕКЦИИ (Т.Е. `\.{\\M123.}' В НАЧАЛЕ СЕКЦИИ
НОМЕР 123, ЗА ИСКЛЮЧЕНИЕМ ЗАГЛАВНЫХ СЕКЦИЙ, В НАЧАЛЕ КОТОРЫХ ВМЕСТО
`\.{\\M}' СЛЕДУЕТ `\.{\\N}'). дАЛЕЕ СЛЕДУЕТ \TeX-ЧАСТЬ СЕКЦИИ,
СКОПИРОВАННАЯ ПОЧТИ ДОСЛОВНО, КАК ОПИСАНО НИЖЕ. вСЛЕД ЗА ЭТИМ ИДУТ
ПРОМЕЖУТОЧНАЯ И \CEE/-ЧАСТИ СЕКЦИИ, РАЗДЕЛЕННЫЕ НЕБОЛЬШИМ ПРОМЕЖУТКОМ,
ЕСЛИ ОНИ ОБЕ НЕПУСТЫЕ. эТИ ДВЕ ЧАСТИ ПОЛУЧЕНЫ ВСТАВКОЙ МНОЖЕСТВА
ЗАТЕЙЛИВЫХ \TeX-МАКРОСОВ В \CEE/-ПРОГРАММУ. эТИ МАКРОСЫ УПРАВЛЯЮТ
ТИПОГРАФСКИМИ ПОДРОБНОСТЯМИ, ТАКИМИ, КАК ШРИФТЫ, ПРАВИЛЬНАЯ
РАССТАНОВКА ПРОБЕЛОВ В МАТЕМАТИЧЕСКИХ ФОРМУЛАХ, РАЗБИЕНИЕ НА СТРОКИ И
ОТСТУПЫ.

\section \CEE/-КОД В ТЕКСТЕ \TeX'А И НАОБОРОТ.
кОГДА ВЫ НАБИРАЕТЕ \TeX-ТЕКСТ, ВОЗМОЖНО, ЧТО ВАМ ПОНАДОБИТСЯ
СОСЛАТЬСЯ НА ПЕРЕМЕННЫЕ И ДРУГИЕ ОБ®ЕКТЫ \CEE/-ПРОГРАММЫ, ПРИЧЕМ
ЖЕЛАТЕЛЬНО, ЧТОБЫ ИХ ОФОРМЛЕНИЕ СООТВЕТСТВОВАЛО ТОМУ, ЧТО ИСПОЛЬЗУЕТСЯ В
ПРОГРАММЕ. дЛЯ ЭТОГО \.{CWEB} ПРЕДУСМАТРИВАЕТ ВОЗМОЖНОСТЬ РАЗМЕСТИТЬ В
ТЕЛЕ \TeX-ТЕКСТА КОНСТРУКЦИИ ЯЗЫКА \CEE/, ОГРАНИЧИВ ИХ СИМВОЛАМИ `\.|'.
нАПРИМЕР, ПУСТЬ МЫ ХОТИМ НАПИСАТЬ ЧТО-ТО ВРОДЕ
$$\hbox{ If \\{pa} is declared as `\&{int} ${}{*}\\{pa}$',
the assignment $\\{pa}\K{\AND}\|a[\T{0}]$ makes \\{pa}
point to the zeroth element of \|a.}$$
тЕКСТ НА ЯЗЫКЕ \TeX\ В  \.{CWEB}-ФАЙЛЕ БУДЕТ ТАКИМ:
$$\lpile{\.{If |pa| is declared as `|int *pa|', the}\cr
\.{assignment |pa=\&a[0]| makes |pa| point
to the zeroth element of |a|.}\cr}$$
и НАКОНЕЦ, \.{CWEAVE} ПРЕОБРАЗУЕТ ЕГО В НЕЧТО ТАКОЕ, ЧТО НИКОМУ НЕ
ЗАХОТЕЛОСЬ БЫ ВВОДИТЬ ВРУЧНУЮ:
$$\lpile{\.{If \\\\\{pa\} is declared as
  `\\\&\{int\} \$\{\}\{*\}\\\\\{pa\}\$',}\cr
\.{the assignment \$\\\\\{pa\}\\K\{\\AND\}\\|a[\\T\{0\}]\$}\cr
\.{makes \\\\\{pa\} point to the zeroth element of \\|a.}\cr}$$
оТМЕТИМ, ЧТО ТАБЛИЦА ПЕРЕКРЕСТНЫХ ССЫЛОК, СОЗДАННАЯ \.{CWEAVE}, ДЛЯ
ПОДОБНОГО КОММЕНТАРИЯ БУДЕТ ВКЛЮЧАТЬ
НОМЕР ТЕКУЩЕЙ СЕКЦИИ В СПИСКЕ ССЫЛОК НА \\{pa}
НЕСМОТРЯ НА ТО, ЧТО \\{pa} МОЖЕТ И НЕ ПОЯВИТЬСЯ В \CEE/-ЧАСТИ ЭТОЙ
СЕКЦИИ. дЕЙСТВИТЕЛЬНО, ИНДЕКС ВКЛЮЧАЕТ ССЫЛКИ НА ИДЕНТИФИКАТОРЫ В
ПОЯСНЯЮЩИХ КОММЕНТАРИЯХ ТАК ЖЕ, КАК И В САМОЙ ПРОГРАММЕ; ЧТОБЫ ОЦЕНИТЬ
ЭТУ ВОЗМОЖНОСТЬ НЕ ПОТРЕБУЕТСЯ МНОГО ВРЕМЕНИ.
в ТО ЖЕ ВРЕМЯ, ИДЕНТИФИКАТОРЫ
\&{int} И \|a\ В ИНДЕКС НЕ ПОПАДУТ,
ПОТОМУ ЧТО \.{CWEAVE} НЕ ПОМЕЩАЕТ В ИНДЕКС ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА И
ОДНОБУКВЕННЫЕ ИДЕНТИФИКАТОРЫ. тАКИЕ ИДЕНТИФИКАТОРЫ ПОЛАГАЮТСЯ СТОЛЬ
ВЕЗДЕСУЩИМИ, ЧТО НЕТ СМЫСЛА ПЕРЕЧИСЛЯТЬ ВСЕ МЕСТА, ГДЕ ОНИ ВСТРЕЧАЮТСЯ.

нЕСМОТРЯ НА ТО, ЧТО СЕКЦИЯ НАЧИНАЕТСЯ \TEX/-ЧАСТЬЮ И ЗАКАНЧИВАЕТСЯ
\CEE/-ЧАСТЬЮ, ГРАНИЦА МЕЖДУ НИМИ ТОЧНО НЕ ОПРЕДЕЛЕНА, ПОСКОЛЬКУ
\CEE/-КОД МОЖЕТ БЫТЬ ВКЛЮЧЕН В ТЕКСТ \TEX/, ЕСЛИ ОН ОГРАНИЧЕН `\pb'.
аНАЛОГИЧНО, ТЕКСТ \TEX/ ЗАЧАСТУЮ ПОЯВЛЯЕТСЯ ВНУТРИ \CEE/-КОДА, ПОСКОЛЬКУ
ВСЕ, ЧТО СЧИТАЕТСЯ КОММЕНТАРИЕМ (Т.Е. ВСЕ ВНУТРИ \.{/*} И \.{*/}, ЛИБО ПОСЛЕ
\.{//}) ИНТЕРПРЕТИРУЕТСЯ КАК ТЕКСТ \TEX/. тОЧНО ТАК ЖЕ ИМЯ СЕКЦИИ
СОДЕРЖИТ ТЕКСТ \TEX/, НО КОНСТРУКЦИЯ \.{@<ИМЯ СЕКЦИИ@>} ЦЕЛИКОМ МОЖЕТ
ИСПОЛЬЗОВАТЬСЯ В \CEE/-КОДЕ; СЛЕДОВАТЕЛЬНО, ПЕРЕХОД МЕЖДУ РЕЖИМАМИ \CEE/
И~\TEX/ ОСУЩЕСТВЛЯЕТСЯ ЕСТЕСТВЕННО, КАК В ЭТИХ ПРИМЕРАХ:
$$
\displaylines{
\hbox{\.{if} \.{(x==0)} \.{@<Empty} \.{the} \.{|buffer|} \.{array@>}} \cr
\hbox{\.{...} \.{using}  \.{the} \.{algorithm}
\.{in} \.{|@<Empty} \.{the} \.{|buffer|} \.{array@>|.}} }
$$
пЕРВЫЙ ИЗ НИХ МОЖЕТ БЫТЬ НАЙДЕН В \CEE/-ЧАСТИ СЕКЦИИ, В КОТОРУЮ БУДЕТ
ВСТАВЛЕН КОД ИЗ СЕКЦИИ, НАЗВАННОЙ ``Empty the \\{buffer} array''. вТОРОЙ
ПРИМЕР ИЗ \TEX/-ЧАСТИ СЕКЦИИ, КОТОРАЯ ЛИШЬ ССЫЛАЕТСЯ НА ДРУГУЮ СЕКЦИЮ,
НО НЕ ОПРЕДЕЛЯЕТ И НЕ ИСПОЛЬЗУЕТ ЕЕ. (оБРАТИТЕ ВНИМАНИЕ НА `\pb' ВОКРУГ
ИМЕНИ СЕКЦИИ В ЭТОМ СЛУЧАЕ.)

\section мАКРООПРЕДЕЛЕНИЯ.
уПРАВЛЯЮЩИЙ КОД \.{@d}, ЗА КОТОРЫМ СЛЕДУЕТ
$$\\{identifier}\.{ }\hbox{\CEE/-КОД}\qquad\hbox{ЛИБО}\qquad
\\{identifier}\.(\\{par}_1,\ldots,\\{par}_n\.{) }\hbox{\CEE/-КОД}$$
(\\{identifier} И СКОБКА ВО ВТОРОМ СЛУЧАЕ НЕ ДОЛЖНЫ РАЗДЕЛЯТЬСЯ
ПРОБЕЛАМИ) ПРЕОБРАЗУЕТСЯ \.{CTANGLE} В ДИРЕКТИВУ ПРЕПРОЦЕССОРА
\.{\#define}, КОТОРЫЕ РАСПОЛАГАЮТСЯ В НАЧАЛЕ ГЕНЕРИРУЕМОЙ
\CEE/-ПРОГРАММЫ, КАК ОПИСАНО РАНЕЕ.

мАКРООПРЕДЕЛЕНИЕ `\.{@d}' МОЖЕТ БЫТЬ РАЗБИТО НА НЕСКОЛЬКО СТРОК, ПРИЧЕМ
НЕ НУЖНО СТАВИТЬ В КОНЦЕ СТРОКИ `\.{\\}' --- ИХ АВТОМАТИЧЕСКИ
ВСТАВИТ \.{CTANGLE}. еСЛИ ПО КАКОЙ-ТО ПРИЧИНЕ ПОТРЕБУЕТСЯ ДИРЕКТИВА
\.{\#define} В КОНКРЕТНОЙ ТОЧКЕ \CEE/-ФАЙЛА, МОЖНО ЗАДАТЬ ЕЕ В
\CEE/-КОДЕ, А НЕ С ПОМОЩЬЮ \.{CWEB}, НО В ЭТОМ СЛУЧАЕ ПРИДЕТСЯ
МАСКИРОВАТЬ СИМВОЛЫ ПЕРЕВОДА СТРОКИ САМОСТОЯТЕЛЬНО.

\section сТРОКИ И КОНСТАНТЫ.
еСЛИ ВАМ НУЖНА В \CEE/-КОДЕ СТРОКОВАЯ КОНСТАНТА, ОГРАНИЧЕННАЯ \.' ИЛИ
\.", ЕЕ МОЖНО ЗАДАТЬ КАК ОБЫЧНО, ЗА ИСКЛЮЧЕНИЕМ ТОГО, ЧТО СИМВОЛ `\.@'
ДОЛЖЕН БЫТЬ ПРЕДСТАВЛЕН `\.{@@}' (ЭТО ЕДИНСТВЕННЫЙ УПРАВЛЯЮЩИЙ СИМВОЛ,
КОТОРЫЙ МОЖЕТ ПОЯВЛЯТЬСЯ ВНУТРИ СТРОКИ, СМ. ДАЛЕЕ). сТРОКОВЫЕ КОНСТАНТЫ НЕ
ДОЛЖНЫ СОДЕРЖАТЬ СИМВОЛОВ ПЕРЕВОДА СТРОКИ, ЕСЛИ ОНИ НЕ
ЗАМАСКИРОВАНЫ~`\.{\\}'.

\TEX/ И \CEE/ ПРЕДЛАГАЮТ РАЗЛИЧНЫЕ СПОСОБЫ ЗАДАНИЯ ВОСЬМЕРИЧНЫХ И
ШЕСТНАДЦАТИРИЧНЫХ КОНСТАНТ, ПОСКОЛЬКУ \TEX/ ОРИЕНТИРОВАН НА ПОДГОТОВКУ
ТЕКСТА ЧЕЛОВЕКОМ, А \CEE/ --- НА МАШИННУЮ ОБРАБОТКУ. в \TEX/ КОНСТАНТА
ОБ®ЯВЛЯЕТСЯ ВОСЬМЕРИЧНОЙ ИЛИ ШЕСТНАДЦАТИРИЧНОЙ С ПОМОЩЬЮ ПРЕФИКСА \.'
ЛИБО~\." СООТВЕТСТВЕННО; В \CEE/ ПРЕФИКСЫ ИМЕЮТ ВИД \.0 И \.{0x}.
в~\.{CWEB} РАЗРЕШЕНО ИСПОЛЬЗОВАТЬ ОБА СОГЛАШЕНИЯ ТАМ, ГДЕ ОНИ ПРИНЯТЫ: В
\CEE/-КОДЕ ЧТОБЫ ПОЛУЧИТЬ $40_8$ ЗАДАЕТСЯ `\.{040}' И \.{CTANGLE} БЕЗ
ИЗМЕНЕНИЙ КОПИРУЕТ ЭТО В \CEE/-ФАЙЛ К УДОВОЛЬСТВИЮ КОМПИЛЯТОРА, А \.{CWEAVE}
ПЕЧАТАЕТ КАК $\T{\~40}$. аНАЛОГИЧНО, \.{CWEAVE} ПЕЧАТАЕТ ШЕСТНАДЦАТИРИЧНУЮ
\CEE/-КОНСТАНТУ  `\.{0x20}' КАК \T{\^20}. иСПОЛЬЗОВАНИЕ КУРСИВА ДЛЯ
ВОСЬМЕРИЧНЫХ ЦИФР И ШРИФТА ПИШУЩЕЙ МАШИНКИ ДЛЯ ШЕСТНАДЦАТИРИЧНЫХ УЛУЧШАЕТ
ВОСПРИЯТИЕ ЭТИХ КОНСТАНТ В ДОКУМЕНТЕ.  дЛЯ СОХРАНЕНИЯ ОБЩНОСТИ МОЖНО
ИСПОЛЬЗОВАТЬ `\.{|040|}' И~`\.{|0x20|}' В \TEX/-ЧАСТИ СЕКЦИИ.

\section уПРАВЛЯЮЩИЕ СИМВОЛЫ.
{\sl уПРАВЛЯЮЩИЙ СИМВОЛ (control code)\/} \.{CWEB} --- ЭТО КОМБИНАЦИЯ
ДВУХ СИМВОЛОВ, ИЗ КОТОРЫХ ПЕРВЫЙ `\.@'. мЫ УЖЕ ОЗНАКОМИЛИСЬ С
НАЗНАЧЕНИЕМ НЕКОТОРЫХ ИЗ НИХ, А ТЕПЕРЬ ИЗЛОЖИМ ЭТО БОЛЕЕ ТОЧНО.

в НИЖЕСЛЕДУЮЩЕМ СПИСКЕ БУКВЫ В КВАДРАТНЫХ СКОБКАХ УКАЗЫВАЮТ КОНТЕКСТ, В
КОТОРОМ КАЖДЫЙ УПРАВЛЯЮЩИЙ СИМВОЛ ИМЕЕТ СМЫСЛ. $L$ ОЗНАЧАЕТ, ЧТО СИМВОЛ
ДОПУСТИМ В ПРЕАМБУЛЕ, $T$ (\TEX/), $M$ (middle) И $C$ --- В КАЖДОЙ ИЗ
ТРЕХ ЧАСТЕЙ СЕКЦИИ НА ВЕРХНЕМ УРОВНЕ (Т.Е. ВОВНЕ КОНСТРУКЦИИ `\pb' И
ИМЕН СЕКЦИЙ). сТРЕЛКА $\to$ ОБОЗНАЧАЕТ, ЧТО УПРАВЛЯЮЩИЙ СИМВОЛ ЗАВЕРШАЕТ
ТЕКУЩУЮ ЧАСТЬ \.{CWEB}-ФАЙЛА И НАЧИНАЕТ СЛЕДУЮЩУЮ ЧАСТЬ, УКАЗАННУЮ
БУКВОЙ ПОСЛЕ СТРЕЛКИ. нАПРИМЕР, $[LTMC\to T]$ ПОСЛЕ \.{@\ } ЗНАЧИТ, ЧТО
УПРАВЛЯЮЩИЙ КОД МОЖЕТ ПОЯВИТЬСЯ В ПРЕАМБУЛЕ ЛИБО В ЛЮБОЙ ИЗ ТРЕХ ЧАСТЕЙ
СЕКЦИИ, И ЧТО ОН НАЧИНАЕТ \TEX/-ЧАСТЬ (ВОЗМОЖНО ПУСТУЮ) ТЕКУЩЕЙ СЕКЦИИ.

еЩЕ ДВА СОКРАЩЕНИЯ МОГУТ БЫТЬ УКАЗАНЫ В ЭТИХ КВАДРАТНЫХ СКОБКАХ:
бУКВА~$r$ ОЗНАЧАЕТ {\it ОГРАНИЧЕННЫЙ КОНТЕКСТ (restricted context)}, ТО
ЕСТЬ, СОДЕРЖИМОЕ \CEE/-КОММЕНТАРИЕВ, ИМЕН СЕКЦИЙ, \CEE/-СТРОК И
УПРАВЛЯЮЩИХ ТЕКСТОВ (ОПРЕДЕЛЕНЫ ДАЛЕЕ). бУКВА $c$ --- ЭТО
{\it ВНУТРЕННИЙ \CEE/-КОНТЕКСТ (inner \CEE/ context)} ИЛИ \CEE/-КОД
ВНУТРИ`\pb' (ВКЛЮЧАЯ КОММЕНТАРИИ ВНУТРИ `\pb', НО НЕ В ДРУГИХ
ОГРАНИЧЕННЫХ КОНТЕКСТАХ). зВЕЗДОЧКА $*$ ПОСЛЕ СКОБОК УКАЗЫВАЕТ, ЧТО
ЭТИМ УПРАВЛЯЮЩИМ СИМВОЛОМ НАЧИНАЕТСЯ ОГРАНИЧЕННЫЙ КОНТЕКСТ, КОТОРЫЙ
ЗАВЕРШАЕТСЯ ПАРНОЙ \.{@>}

бУКВЫ В УПРАВЛЯЮЩИХ СИМВОЛАХ НЕ РАЗЛИЧАЮТСЯ ПО РЕГИСТРУ. тАК, \.{@d}
ОЗНАЧАЕТ ТО ЖЕ САМОЕ, ЧТО И \.{@D}. дАЛЕЕ РАССМОТРЕНЫ ТОЛЬКО СИМВОЛЫ С
БУКВАМИ НИЖНЕГО РЕГИСТРА.

\gdef\@#1[#2] {\penalty-50\yskip\hangindent 2em\noindent\.{@#1\unskip
  \spacefactor1000{ }}$[#2]$\quad}
\def\more{\hangindent 2em \hangafter0}
\def\subsec{\penalty-300\medskip\noindent}

\@@ [LTMCrc] пАРА СИМВОЛОВ \.@ ПРЕДСТАВЛЯЕТ САМ СИМВОЛ `\.@'. эТО
ЕДИНСТВЕННЫЙ УПРАВЛЯЮЩИЙ КОД, КОТОРЫЙ ДЕЙСТВУЕТ ПОВСЮДУ. зАМЕТИМ, ЧТО
ВАМ ПРИДЕТСЯ ИСПОЛЬЗОВАТЬ ЭТО СОГЛАШЕНИЕ, ЕСЛИ ВЫ УКАЗЫВАЕТЕ email-АДРЕС
В \.{CWEB}-ФАЙЛЕ (НАПРИМЕР, \.{levy@@geom.umn.edu}).

\subsec
сЛЕДУЮЩИЕ КОДЫ ПРЕДСТАВЛЯЮТ \TEX/-ЧАСТЬ СЕКЦИИ.

\@\ [LTMC\to T] оЗНАЧАЕТ НАЧАЛО НОВОЙ (НЕ ЗАГЛАВНОЙ) СЕКЦИИ. сИМВОЛ
ТАБУЛЯЦИИ, ПРОГОНА СТРАНИЦЫ ИЛИ КОНЦА СТРОКИ, СЛЕДУЮЩИЕ ЗА ЗНАКОМ \.@,
ЭКВИВАЛЕНТНЫ ПРОБЕЛУ (КАК И В БОЛЬШИНСТВЕ ДРУГИХ СЛУЧАЕВ).

\@* [LTMC\to T] оТМЕЧАЕТ НАЧАЛО НОВОЙ ЗАГЛАВНОЙ СЕКЦИИ, Т.Е. СЕКЦИИ,
НАЧИНАЮЩЕЙ НОВУЮ ГРУППУ. нАЗВАНИЕ ЭТОЙ ГРУППЫ ДОЛЖНО СЛЕДОВАТЬ ЗА \.{@*}
И ЗАВЕРШАТЬСЯ ТОЧКОЙ. кАК УКАЗАНО ВЫШЕ, В НЕМ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬСЯ
УПРАВЛЯЮЩИЕ ПОСЛЕДОВАТЕЛЬНОСТИ \TEX/'А, КРОМЕ ДОСТАТОЧНО ПРОСТЫХ.
кОГДА \.{CWEAVE} И \.{CTANGLE} СЧИТЫВАЮТ \.{@*}, ОНИ ВЫВОДЯТ НА ТЕРМИНАЛ
СИМВОЛ `*' И НОМЕР ТЕКУЩЕЙ СЕКЦИИ, ТАК ЧТО ПОЛЬЗОВАТЕЛЬ МОЖЕТ ВИЗУАЛЬНО
СЛЕДИТЬ ЗА ПРОДВИЖЕНИЕМ РАБОТЫ.
сАМАЯ ПЕРВАЯ СЕКЦИЯ ЖЕЛАТЕЛЬНО ДОЛЖНА БЫТЬ ЗАГЛАВНОЙ.

\more вЫ МОЖЕТЕ УКАЗАТЬ ``ГЛУБИНУ'' ЗАГЛАВНОЙ СЕКЦИИ, ВВОДЯ \.* ЛИБО
ДЕСЯТИРИЧНОЕ ЧИСЛО ПОСЛЕ \.{@*}, ОТМЕЧАЯ ЭТИМ ОТНОСИТЕЛЬНОЕ РАСПОЛОЖЕНИЕ
ТЕКУЩЕЙ ГРУППЫ СЕКЦИЙ В ИЕРАРХИИ ПРОГРАММЫ. чАСТИ ПРОГРАММЫ ВЕРХНЕГО
УРОВНЯ, ОБОЗНАЧЕННЫЕ \.{@**}, ВЫДЕЛЯЮТСЯ В ОГЛАВЛЕНИИ ЖИРНЫМ ШРИФТОМ:
БУДЕМ ГОВОРИТЬ, ЧТО ИХ ГЛУБИНА~$-1$. в ПРОТИВНОМ СЛУЧАЕ, ГЛУБИНА
ПРЕДСТАВЛЯЕТ СОБОЙ НЕОТРИЦАТЕЛЬНОЕ ЧИСЛО, КОТОРОЕ ОПРЕДЕЛЯЕТ ВЕЛИЧИНУ
ОТСТУПА В ОГЛАВЛЕНИИ. пОДОБНЫЕ ОТСТУПЫ ПОМОГАЮТ ПРОЯСНИТЬ СТРУКТУРУ
ДЛИННОЙ ПРОГРАММЫ. еСЛИ ГЛУБИНА НЕ УКАЗАНА ЯВНО, ОНА ПОЛАГАЕТСЯ РАВНОЙ 0.
еСЛИ ВАША ПРОГРАММА КОРОТКА, ТО, ПО-ВИДИМОМУ, ВОЗМОЖНО БУДЕТ ОСТАВИТЬ
ЗНАЧЕНИЕ ГЛУБИНЫ НУЛЕВЫМ. зАГЛАВНЫЕ СЕКЦИИ ВСЕГДА РАСПОЛАГАЮТСЯ НА НОВОЙ
СТРАНИЦЕ ВЫВОДА,  ЕСЛИ ТОЛЬКО ГЛУБИНА НЕ ПРЕВЫШАЕТ~1.

\subsec
пРОМЕЖУТОЧНАЯ ЧАСТЬ КАЖДОЙ СЕКЦИИ СОДЕРЖИТ ПРОИЗВОЛЬНОЕ КОЛИЧЕСТВО
МАКРООПРЕДЕЛЕНИЙ (НАЧИНАЮЩИХСЯ С \.{@d}) И ОПРЕДЕЛЕНИЙ ФОРМАТОВ (ПРЕДВАРЯЕМЫХ
\.{@f} ЛИБО \.{@s}), РАСПОЛОЖЕННЫХ В ПРОИЗВОЛЬНОМ ПОРЯДКЕ.

\@d [TM\to M] мАКРООПРЕДЕЛЕНИЕ: НАЧИНАЕТСЯ \.{@d}, ЗА КОТОРЫМ ИДУТ
ИДЕНТИФИКАТОР, НЕОБЯЗАТЕЛЬНЫЕ ПАРАМЕТРЫ И \CEE/-КОД, КАК ОПИСАНО РАНЕЕ.

\@f [TM\to M] оПРЕДЕЛЕНИЕ ФОРМАТА: НАЧИНАЕТСЯ \.{@f}; ОНИ УКАЗЫВАЮТ
\.{CWEAVE} ОБРАБАТЫВАТЬ ИДЕНТИФИКАТОРЫ ОСОБЫМ ОБРАЗОМ, КОГДА ОНИ
ВСТРЕЧАЮТСЯ В \CEE/-КОДЕ. оБЩИЙ ВИД ОПРЕДЕЛЕНИЯ ФОРМАТА ---
`\.{@f} \|l \|r', ДАЛЕЕ СЛЕДУЕТ НЕОБЯЗАТЕЛЬНЫЙ КОММЕНТАРИЙ, ОГРАНИЧЕННЫЙ
\.{/*} И \.{*/}, ГДЕ \|l И \|r --- ИДЕНТИФИКАТОРЫ:
\.{CWEAVE} В ДАЛЬНЕЙШЕМ БУДЕТ РАССМАТРИВАТЬ ИДЕНТИФИКАТОР \|l ТАК, КАК
ОН ЭТО ДЕЛАЕТ В НАСТОЯЩИЙ МОМЕНТ ДЛЯ \|r.
эТО ДАЕТ \.{CWEB}-ПРОГРАММИСТУ ВОЗМОЖНОСТЬ
ВВОДИТЬ НОВЫЕ ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА И/ИЛИ ОТМЕНЯТЬ РЕЗЕРВИРОВАНИЕ
НЕКОТОРЫХ ИДЕНТИФИКАТОРОВ ЯЗЫКОМ \CEE/. еСЛИ \|r --- СПЕЦИАЛЬНЫЙ
ИДЕНТИФИКАТОР `\\{TeX}', ИДЕНТИФИКАТОР \|l
БУДЕТ ОТФОРМАТИРОВАН КАК УПРАВЛЯЮЩАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ \TEX/. нАПРИМЕР,
`\.{@f foo TeX}' В \.{CWEB}-ФАЙЛЕ ПРИВЕДЕТ К ТОМУ, ЧТО ИДЕНТИФИКАТОР \\{foo}
БУДЕТ ВЫВОДИТЬСЯ  \.{CWEAVE} КАК \.{\\foo}. пРОГРАММИСТ ДОЛЖЕН ОПРЕДЕЛИТЬ
\.{\\foo} ПО СВОЕМУ УСМОТРЕНИЮ, ПОЛАГАЯ, ЧТО \TEX/ НАХОДИТСЯ В
МАТЕМАТИЧЕСКОЙ МОДЕ. (кАЖДЫЙ СИМВОЛ ПОДЧЕРКИВАНИЯ ПРЕОБРАЗУЕТСЯ В \.{x},
КОГДА СОЗДАЕТСЯ УПРАВЛЯЮЩАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ \TEX/; ТАК, \\{foo\_bar}
СТАНОВИТСЯ \.{\\fooxbar}. пРОЧИЕ СИМВОЛЫ, ВКЛЮЧАЯ ЦИФРЫ, НЕ
ТРАНСЛИРУЮТСЯ, ТАК ЧТО \TEX/ БУДЕТ ПОЛАГАТЬ ИХ ПАРАМЕТРАМИ МАКРОСА, А НЕ
ЧАСТЬЮ САМОЙ УПРАВЛЯЮЩЕЙ ПОСЛЕДОВАТЕЛЬНОСТИ.
нАПРИМЕР,
$$\.{\\def\\x\#1\{x\_\{\#1\}\} @f x1 TeX @f x2 TeX}$$
БУДЕТ ВЫВОДИТЬ \.{x1} И \.{x2} НЕ КАК \\{x1} И \\{x2}, А КАК $x_1$ И $x_2$.

\more \.{CWEAVE} АВТОМАТИЧЕСКИ ФОРМАТИРУЕТ ИДЕНТИФИКАТОРЫ, ВВЕДЕННЫЕ
ПОСРЕДСТВОМ \&{typedef}, КАК ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА, ПОЭТОМУ ВАМ НЕ
ПРИДЕТСЯ ОПРЕДЕЛЯТЬ ФОРМАТЫ СЛИШКОМ ЧАСТО.

\@s [TM\to M;\;L] аНАЛОГИЧНО \.{@f}, НО \.{CWEAVE} НЕ ОТОБРАЖАЕТ
ОПРЕДЕЛЕНИЯ ФОРМАТОВ В СВОЕМ ВЫВОДЕ, И НЕОБЯЗАТЕЛЬНЫЙ \CEE/-КОММЕНТАРИЙ
НЕДОПУСТИМ. иСПОЛЬЗУЕТСЯ ГЛАВНЫМ ОБРАЗОМ В \.{@i}-ФАЙЛАХ.

\subsec
сЛЕДУЮЩИЕ КОДЫ УПРАВЛЯЮТ \CEE/-ЧАСТЬЮ СЕКЦИИ.

\@{c @p} [TM\to C] \CEE/-ЧАСТЬ НЕИМЕНОВАННОЙ СЕКЦИИ НАЧИНАЕТСЯ \.{@c}
(ЛИБО \.{@p}, Т.Е. ``program''; ОБА УПРАВЛЯЮЩИХ СИМВОЛА ДЕЛАЮТ ОДНО И ТО ЖЕ).
эТО ЗАСТАВЛЯЕТ \.{CTANGLE} ДОПОЛНИТЬ СЛЕДУЮЩИМ \CEE/-КОДОМ ПЕРВОЕ
ПРИБЛИЖЕНИЕ ТЕКСТА ПРОГРАММЫ, КАК ОПИСАНО НА СТРАНИЦЕ~\tangref.
зАМЕТИМ, ЧТО \.{CWEAVE} НЕ ПОМЕЩАЕТ `\.{@c}' В \TEX/-ВЫВОД,
ТАК ЧТО ЕСЛИ ВЫ СОЗДАЕТЕ ФАЙЛ \.{CWEB}, ОСНОВЫВАЯСЬ НА РАСПЕЧАТАННОЙ
\TEX/'ОМ \.{CWEB}-ДОКУМЕНТАЦИИ, НЕ ЗАБУДЬТЕ УКАЗАТЬ \.{@c} В
СООТВЕТСТВУЮЩИХ МЕСТАХ НЕИМЕНОВАННЫХ СЕКЦИЙ.

\@< [TM\to C;\; C;\; c] $*$ эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ПРЕДСТАВЛЯЕТ ИМЯ
СЕКЦИИ (ЛИБО УНИКАЛЬНЫЙ ПРЕФИКС, КАК УКАЗАНО ВЫШЕ), СОДЕРЖАЩЕЕ ТЕКСТ
\TEX/ И ЗАВЕРШАЮЩЕЕСЯ \.{@>}.
кОНСТРУКЦИЯ \.{@<...@>} В ЦЕЛОМ КОНЦЕПТУАЛЬНО ЯВЛЯЕТСЯ ЭЛЕМЕНТОМ \CEE/-КОДА.
еЕ ПОВЕДЕНИЕ ЗАВИСИТ ОТ КОНТЕКСТА:

\more сИМВОЛ \.{@<} В КОНТЕКСТАХ $T$ И $M$ СВЯЗЫВАЕТ
СЛЕДУЮЩЕЕ ДАЛЕЕ ИМЯ СЕКЦИИ С ТЕКУЩЕЙ СЕКЦИЕЙ, И ОТКРЫВАЕТ
\CEE/-ЧАСТЬ СЕКЦИИ.  иМЯ ЗАВЕРШАЕТСЯ \.{@>}, ЗА КОТОРЫМ
СЛЕДУЕТ \.{=} ИЛИ \.{+=}.

\more
в КОНТЕКСТЕ $C$, \.{@<} УКАЗЫВАЕТ, ЧТО СЕКЦИЯ ЗДЕСЬ
ИСПОЛЬЗУЕТСЯ --- ЕЕ \CEE/-ОПРЕДЕЛЕНИЯ БУДУТ ПОМЕЩЕНЫ СЮДА
\.{CTANGLE}, КАК ОПИСАНО НА СТРАНИЦЕ~\tangref.
дЛЯ БОЛЕЕ ПОЛНОГО ВЫЯВЛЕНИЯ ОШИБОК
\.{CTANGLE} И \.{CWEAVE} ПРЕДУСМАТРИВАЮТ ВЫВОД СООБЩЕНИЯ В СЛУЧАЕ, ЕСЛИ ЗА
ТАКИМ ИМЕНЕМ СЕКЦИИ СЛЕДУЕТ \.=, ПОСКОЛЬКУ ЭТО СКОРЕЕ ВСЕГО ОЗНАЧАЕТ
ОПРЕДЕЛЕНИЕ НОВОЙ СЕКЦИИ, И ПОЭТОМУ ДОЛЖНО ПРЕДВАРЯТЬСЯ \.{@\ }.
еСЛИ ВАМ ДЕЙСТВИТЕЛЬНО
НУЖНО НАПИСАТЬ $\langle\,$foo$\,\rangle=\\{bar}$, ГДЕ $\langle\,$foo$\,\rangle$
ИСПОЛЬЗУЕТСЯ, А НЕ ОПРЕДЕЛЯЕТСЯ, ПОМЕСТИТЕ \.= НА НОВОЙ СТРОКЕ.

\more
нАКОНЕЦ, ВО ВНУТРЕННЕМ \CEE/-КОНТЕКСТЕ (Т.Е., ВНУТРИ `\pb' В \TEX/-ЧАСТИ
СЕКЦИИ ИЛИ В КОММЕНТАРИИ), \.{@<...@>}
ОЗНАЧАЕТ, ЧТО ЭТА СЕЦИЯ ЦИТИРУЕТСЯ.
тАКОЕ ИСПОЛЬЗОВАНИЕ ИГНОРИРУЕТСЯ \.{CTANGLE}. оТМЕТИМ, ЧТО ДАЖЕ В ЭТОМ СЛУЧАЕ
МЫ ТРАКТУЕМ ИМЯ СЕКЦИИ КАК ЭЛЕМЕНТ \CEE/, ТАК КАК ОНО ОГРАНИЧЕНО \pb.

\@( [TM\to C;\;C;\;c] $*$ иМЯ СЕКЦИИ МОЖЕТ НАЧИНАТЬСЯ \.{@(}.
вСЕ БУДЕТ РАБОТАТЬ, КАК И ДЛЯ \.{@<}, НО С ТЕМ ИСКЛЮЧЕНИЕМ, ЧТО \CEE/-КОД
СЕКЦИИ, НАЗВАННОЙ \.{@(foo@>} БУДЕТ ЗАПИСАН \.{CTANGLE} В ФАЙЛ \.{foo}.
тЕМ САМЫМ МЫ МОЖЕМ ПОЛУЧИТЬ ИЗ ОДНОГО ФАЙЛА \.{CWEB} НЕСКОЛЬКО ВЫХОДНЫХ
ФАЙЛОВ.
(оПРЕДЕЛЕНИЯ \.{@d} НЕ ПОПАДАЮТ В ТАКИЕ ФАЙЛЫ,
А ЛИШЬ В ОСНОВНОЙ \.{.c}-ФАЙЛ.) оДНО ИЗ ПРЕДНАЗНАЧЕНИЙ ЭТОЙ ВОЗМОЖНОСТИ
В ТОМ, ЧТОБЫ  СОЗДАТЬ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ ДЛЯ ПРОГРАММНЫХ МОДУЛЕЙ.
дРУГИМ ПРИМЕРОМ ЕЕ ИСПОЛЬЗОВАНИЯ СЛУЖИТ  ГЕНЕРАЦИЯ
ТЕСТОВ, РАСПРОСТРАНЯЕМЫХ С ВАШЕЙ ПРОГРАММОЙ. сОХРАНЯЯ ИСХОДНЫЕ ТЕКСТЫ
ПРОГРАММЫ, ЕЕ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ И ТЕСТОВЫЕ ПРОЦЕДУРЫ СОВМЕСТНО,
МЫ ИМЕЕМ БОЛЬШЕ ШАНСОВ ПОДДЕРЖАТЬ ИХ СОГЛАСОВАННОСТЬ.
оТМЕТИМ, ЧТО ИМЕНОВАННАЯ СЕКЦИЯ МОЖЕТ БЫТЬ ВЫВЕДЕНА В
НЕСКОЛЬКО РАЗЛИЧНЫХ ВЫХОДНЫХ ФАЙЛОВ, ПОСКОЛЬКУ
ВЫ МОЖЕТЕ УПОМЯНУТЬ \.{@<foo@>} КАК В \.{@(bar1@>}, ТАК И В \.{@(bar2@>}.

\@h [Cc] пРЕДПИСЫВАЕТ \.{CTANGLE}
ВСТАВИТЬ В ЭТУ ТОЧКУ ОПРЕДЕЛЕНИЯ \.{\#define}
ИЗ ПРОМЕЖУТОЧНЫХ ЧАСТЕЙ ВСЕХ СЕКЦИЙ И {\it НЕ\/} ЗАПИСЫВАТЬ ИХ В НАЧАЛО
\CEE/-ФАЙЛА. пОЛЕЗНО, К ПРИМЕРУ, ПРИ НЕОБХОДИМОСТИ РАЗМЕСТИТЬ МАКРООПРЕДЕЛЕНИЯ
ПОСЛЕ ВКЛЮЧАЕМЫХ ФАЙЛОВ.
(иГНОРИРУЕТСЯ \.{CTANGLE} ВНУТРИ `\pb'.)

\subsec
нЕСКОЛЬКО СЛЕДУЮЩИХ УПРАВЛЯЮЩИХ СИМВОЛОВ НАЧИНАЮТ ``УПРАВЛЯЮЩИЕ ТЕКСТЫ''
(``control texts''), ЗАВЕРШАЮЩИЕСЯ `\.{@>}'.
зАКРЫВАЮЩАЯ `\.{@>}' ДОЛЖНА БЫТЬ НА
ТОЙ ЖЕ СТРОКЕ \.{CWEB} ФАЙЛА, ЧТО И НАЧАЛО УПРАВЛЯЮЩЕГО ТЕКСТА.
кОНТЕКСТ, НАЧИНАЮЩИЙСЯ ЭТИМИ УПРАВЛЯЮЩИМИ СИМВОЛАМИ И ОКАНЧИВАЮЩИЙСЯ
\.{@>}, ЯВЛЯЕТСЯ ОГРАНИЧЕННЫМ.

\@\^ [TMCc] $*$ дАЛЬНЕЙШИЙ УПРАВЛЯЮЩИЙ ТЕКСТ, ВПЛОТЬ ДО `\.{@>}',
БУДЕТ ПОМЕЩЕН В ИНДЕКС НАРЯДУ С ИДЕНТИФИКАТОРАМИ
\CEE/-ПРОГРАММЫ; ЭТОТ ТЕКСТ БУДЕТ НАБРАН РОМАНСКИМ ШРИФТОМ. нАПРИМЕР, ЧТОБЫ
ПОМЕСТИТЬ ФРАЗУ ``system dependencies'' (СИСТЕМНЫЕ ЗАВИСИМОСТИ) В
ИНДЕКС, ГЕНЕРИРУЕМЫЙ \.{CWEAVE}, ПОМЕСТИТЕ `\.{@\^system dependencies@>}'
В КАЖДОЙ СЕКЦИИ, КОТРУЮ ВЫ ХОТИТЕ ОТМЕТИТЬ КАК СИСТЕМНО-ЗАВИСИМУЮ.

\@. [TMCc] $*$ пОСЛЕДУЮЩИЙ УПРАВЛЯЮЩИЙ ТЕКСТ БУДЕТ ПОМЕЩЕН В ИНДЕКС
В СТИЛЕ ПИШУЩЕЙ МАШИНКИ (\.{typewriter} \.{type}).

\@: [TMCc] $*$ сООТВЕТСТВУЮЩИЙ ТЕКСТ БУДЕТ ПОМЕЩЕН В ИНДЕКС
В ФОРМАТЕ, ОПИСАННОМ \TEX/-МАКРОСОМ `\.{\\9}', КОТОРЫЙ ВЫ ДОЛЖНЫ
ОПРЕДЕЛИТЬ ТАК, КАК ЭТО НЕОБХОДИМО.

\@t [MCc] $*$ дАЛЬНЕЙШИЙ УПРАВЛЯЮЩИЙ ТЕКСТ БУДЕТ ЗАКЛЮЧЕН В
\TEX/ \.{\\hbox} И ОТФОРМАТИРОВАН КАК ЧАСТЬ ОКРУЖАЮЩЕЙ ЕГО
\CEE/-ПРОГРАММЫ. эТОТ ТЕКСТ ИГНОРИРУЕТСЯ \.{CTANGLE}, НО МОЖЕТ ИСПОЛЬЗОВАТЬСЯ
В РАЗЛИЧНЫХ ЦЕЛЯХ \.{CWEAVE}. нАПРИМЕР, ВЫ МОЖЕТЕ ДЕЛАТЬ КОММЕНТАРИИ,
КОТОРЫЕ СОЧЕТАЮТ \CEE/ И КЛАССИЧЕСКУЮ МАТЕМАТИКУ, ВРОДЕ  `$\\{size}<2^{15}$',
ВВОДЯ `\.{|size < 2@t\$\^\{15\}\$@>|}'.

\@= [MCc] $*$ уПРАВЛЯЮЩИЙ ТЕКСТ БУДЕТ
ДОСЛОВНО ВЫВЕДЕН В \CEE/-ПРОГРАММУ.

\@q [LTMCc] $*$ уПРАВЛЯЮЩИЙ ТЕКСТ ПОЛНОСТЬЮ ИГНОРИРУЕТСЯ
--- ЭТО КОММЕНТАРИЙ ИСКЛЮЧИТЕЛЬНО ДЛЯ ЧИТАТЕЛЕЙ \.{CWEB}-ФАЙЛА.
фАЙЛ, ПРЕДНАЗНАЧЕННЫЙ ДЛЯ ВКЛЮЧЕНИЯ В ПРЕАМБУЛУ С ПОМОЩЬЮ \.{@i},
МОЖЕТ СОДЕРЖАТЬ ИНФОРМАЦИЮ О СЕБЕ САМОМ В \.{@q} КОММЕНТАРИИ. дРУГИМ
ИСПОЛЬЗОВАНИЕМ ЭТОЙ КОНСТРУКЦИИ МОЖЕТ БЫТЬ ВОССТАНОВЛЕНИЕ БАЛАНСА СКОБОК
ВНУТРИ C-СТРОК, ЧТОБЫ ТЕКСТОВЫЕ РЕДАКТОРЫ, ОТСЛЕЖИВАЮЩИЕ ИХ ПАРНОСТЬ, "НЕ
ПАДАЛИ В ШТОПОР"
(ДА, ИМЕННО ТАК: "go into a tailspin" --- {\sl пРИМ. ПЕРЕВ.\/}).

\@! [TMCc] $*$
нОМЕР СЕКЦИИ В ИНДЕКСЕ БУДЕТ ПОДЧЕРКНУТ, ЕСЛИ `\.{@!}' НЕПОСРЕДСТВЕННО
ПРЕДШЕСТВУЕТ ИДЕНТИФИКАТОРУ ЛИБО УПРАВЛЯЮЩЕМУ ТЕКСТУ, ПОМЕЩАЕМОМУ В
ИНДЕКС. эТО СОГЛАШЕНИЕ
ИСПОЛЬЗУЮТ, ЧТОБЫ РАЗЛИЧАТЬ СЕКЦИИ, В КОТОРЫХ ИДЕНТИФИКАТОР ОПРЕДЕЛЕН ЛИБО
ОБ®ЯСНЯЕТСЯ НЕКОТОРЫМ ОСОБЫМ ОБРАЗОМ, ОТ СЕКЦИЙ, ГДЕ ОН ИСПОЛЬЗОВАН.
сСЫЛКИ НА ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА ЛИБО ОДНОСИМВОЛЬНЫЕ ИДЕНТИФИКАТОРЫ В ИНДЕКС
НЕ ПОМЕЩАЮТСЯ, ЗА ИСКЛЮЧЕНИЕМ ПОДЧЕРКНУТЫХ. `\.{@!}' НЕЯВНО ВСТАВЛЯЕТСЯ
\.{CWEAVE} КОГДА ИДЕНТИФИКАТОР ОБ®ЯВЛЯЕТСЯ ЛИБО ОПРЕДЕЛЯЕТСЯ В \CEE/-КОДЕ;
НАПРИМЕР, ОПРЕДЕЛЕНИЕ
$$\hbox{\&{int} \\{array}[\\{max\_dim}], \\{count}${}=\\{old\_count};$}$$
ПОМЕЩАЕТ В ИНДЕКС ИМЕНА \\{array} И \\{count}, ВЫДЕЛЯЯ ИХ ПОДЧЕРКИВАНИЕМ.
мЕТКИ, ОПРЕДЕЛЕНИЯ ФУНКЦИЙ, ПОДОБНЫЕ
\\{main}(\&{int}~\\{argc},\,\&{char}~$*$\\{argv}[\,]),
И ОПРЕДЕЛЕНИЯ \&{typedef} ТАКЖЕ ПОДРАЗУМЕВАЮТ ПОДЧЕРКИВАНИЕ.
оПРЕДЕЛЕНИЯ ФУНКЦИЙ СТАРОГО СТИЛЯ (БЕЗ ПРОТОТИПА)
НЕ ОПРЕДЕЛЯЮТ ИХ АРГУМЕНТОВ, ТЕМ НЕ МЕНЕЕ, АРГУМЕНТЫ БУДУТ ПОЛАГАТЬСЯ
ОПРЕДЕЛЕННЫМИ (И БУДУТ ОТОБРАЖАТЬСЯ В ИНДЕКСЕ С ПОДЧЕРКИВАНИЕМ),
ЕСЛИ ИХ ТИПЫ ОБ®ЯВЛЕНЫ ПЕРЕД ТЕЛОМ ФУНКЦИИ ОБЫЧНЫМ ОБРАЗОМ,
(НАПРИМЕР, `\&{int}~\\{argc}; \&{char}~${*}\\{argv}[\,]$; $\{\,\ldots\,\}$').

\subsec
пЕРЕЙДЕМ, НАКОНЕЦ, К УПРАВЛЯЮЩИМ СИМВОЛАМ, КОТОРЫЕ ВЛИЯЮТ ТОЛЬКО НА РАБОТУ
\.{CTANGLE}.

\@' [MCc] иСПОЛЬЗОВАНИЕ ЭТОГО УПРАВЛЯЮЩЕГО СИМВОЛА ОПАСНО, ПОСКОЛЬКУ ЕГО
ЗНАЧЕНИЕ В \.{CWEB} СУЩЕСТВЕННО ОТЛИЧАЕТСЯ ОТ ЕГО ПРООБРАЗА В \.{WEB}.
в \.{CWEB} ОН РАСКРЫВАЕТСЯ В ДЕСЯТИРИЧНУЮ КОНСТАНТУ, СООТВЕТСТВУЮЩУЮ
ASCII-КОДУ СТРОКИ ЕДИНИЧНОЙ ДЛИНЫ (Т.Е. \.{@'a'} ПРЕОБРАЗУЕТСЯ
\.{CTANGLE} В \.{97}, А \.{@'\\t'} --- В \.9). вЫ МОЖЕТЕ ВОСПОЛЬЗОВАТЬСЯ
ЭТИМ, ЕСЛИ ХОТИТЕ РАБОТАТЬ С ASCII НА МАШИНЕ, НЕ ИСПОЛЬЗУЮЩЕЙ ЭТУ КОДИРОВКУ,
НО В БОЛЬШИНСТВЕ СЛУЧАЕВ СРЕДСТВА ЯЗЫКА  \CEE/, ОПРЕДЕЛЕННЫЕ В \.{<ctype.h>},
ВПОЛНЕ ДОСТАТОЧНЫ ДЛЯ УСТРАНЕНИЯ ЗАВИСИМОСТИ ОТ КОДИРОВКИ СИМВОЛОВ.

\@\& [MCc] оПЕРАЦИЯ \.{@\&} СЦЕПЛЯЕТ ТЕКСТ СЛЕВА ОТ СЕБЯ С ТЕКСТОМ
СПРАВА И ВЫВОДИТ В \CEE/-ФАЙЛ ТАК, ЧТО НИ ПРОБЕЛЫ, НИ
МАРКЕРЫ КОНЦА СТРОКИ НЕ БУДУТ ВСТАВЛЕНЫ МЕЖДУ НИМИ.

\@l [L] \.{CWEB}-ПРОГРАММИСТЫ ВОЛЬНЫ ИСПОЛЬЗОВАТЬ В \TEX/ТЕ ЛЮБОЙ 8-БИТНЫЙ
СИМВОЛЬНЫЙ КОД ИЗ НЕРЕДКО ЗАПРЕТНОГО ДИАПАЗОНА 128--255; ЭТИ СИМВОЛЫ ТАКЖЕ
ДОПУСТИМЫ В СТРОКАХ И ДАЖЕ В ИДЕНТИФИКАТОРАХ \CEE/-ПРОГРАММЫ.
в РАЗЛИЧНЫХ РАСШИРЕНИЯХ БАЗОВОГО СТАНДАРТА ASCII НИЖНЯЯ ЧАСТЬ ТАБЛИЦЫ
(КОДЫ, БОЛЬШИЕ 128) СООТВЕТСТВУЕТ БУКВАМ С ДИАКРИТИЧЕСКИМИ ЗНАКАМИ,
СИМВОЛАМ НЕ ЛАТИНСКИХ АЛФАВИТОВ И Т.Д.
кОГДА ТАКИЕ СИМВОЛЫ ПОЯВЛЯЮТСЯ В ИДЕНТИФИКАТОРАХ, \.{CTANGLE} ЗАМЕНЯЕТ
ИХ СТАНДАРТНЫМИ АЛФАВИТНО-ЦИФРОВЫМИ СИМВОЛАМИ ASCII ЛИБО \.{\_}, ЧТОБЫ
ИМЕНА СООТВЕТСТВОВАЛИ СОГЛАШЕНИЯМ ЯЗЫКА \CEE/.  пРИ ЭТОМ ПРИМЕНЯЕТСЯ
ТАБЛИЦА ПЕРЕКОДИРОВКИ, КОТОРАЯ ПО УМОЛЧАНИЮ СОПОСТАВЛЯЕТ С КАЖДЫМ
СИМВОЛОМ, ИМЕЮЩИМ ASCII-КОД \T{\^}$ab$ (ГДЕ $a$ И $b$ --- ШЕСТНАДЦАТЕРИЧНЫЕ
ЦИФРЫ И $a\ge8$) СТРОКУ \.{Xab}. пОМЕСТИВ В ПРЕАМБУЛЕ КОНСТРУКЦИЮ
\.{@l\ ab\ newstring}, ВЫ УКАЖЕТЕ \.{CTANGLE} ЗАМЕНЯТЬ ЭТОТ СИМВОЛ
СТРОКОЙ \.{newstring}. нАПРИМЕР, В КОДИРОВКЕ ISO Latin-1 БУКВА `\"u'
ИМЕЕТ КОД \T{\^FC} (ЛИБО \.{'\char`\\374'}), И \.{CTANGLE} ПО УМОЛЧАНИЮ
ЗАМЕНЯЕТ В ИДЕНТИФИКАТОРАХ ЭТОТ КОД ПОСЛЕДОВАТЕЛЬНОСТЬЮ СИМВОЛОВ
\.{XFC}. еСЛИ ВЫ ЗАДАДИТЕ \.{@l} \.{fc} \.{ue}, ТО ДАЛЕЕ ВМЕСТО ЭТОЙ
БУКВЫ БУДЕТ ПОДСТАВЛЯТЬСЯ \.{ue}.

\more
\.{CWEAVE} ПРОПУСКАЕТ 8-БИТНЫЕ СИМВОЛЫ ПРЯМО В \TEX/ БЕЗ ТРАНСЛИТЕРАЦИИ;
НО ПРИ ЭТОМ \TEX/ ДОЛЖЕН БЫТЬ, В СВОЮ ОЧЕРЕДЬ, ПОДГОТОВЛЕН К ИХ ОБРАБОТКЕ.
еСЛИ ВЫ ФОРМАТИРУЕТЕ ВСЕ НЕСТАНДАРТНЫЕ ИДЕНТИФИКАТОРЫ КАК ОСОБЫЕ (``custom'')
УПРАВЛЯЮЩИЕ ПОСЛЕДОВАТЕЛЬНОСТИ, СЛЕДУЕТ НАСТРОИТЬ \TEX/ ТАК, ЧТОБЫ ОН
ВОСПРИНИМАЛ ВСЕ ИХ СИМВОЛЫ КАК БУКВЫ. в ПРОТИВНОМ СЛУЧАЕ СЛЕДУЕТ
ЛИБО ОБ®ЯВИТЬ В \TEX/'Е 8-БИТНЫЕ СИМВОЛЫ ``АКТИВНЫМИ'', ЛИБО ЗАГРУЗИТЬ
ШРИФТЫ, СОДЕРЖАЩИЕ В СООТВЕТСТВУЮЩЕЙ ПОЗИЦИИ НУЖНЫЕ СПЕЦИАЛЬНЫЕ СИМВОЛЫ.
(дЛЯ ИДЕНТИФИКАТОРОВ ИСПОЛЬЗУЕТСЯ ШРИФТ, ВЫБИРАЕМЫЙ КОМАНДОЙ \TEX/'А
\.{\\it}.)
иЩИТЕ СПЕЦИАЛЬНЫЕ МАКРОПАКЕТЫ, НАПИСАННЫЕ ДЛЯ ИСПОЛЬЗОВАНИЯ В \.{CWEB}
ВАШЕГО ЯЗЫКА ЛИБО, ЕСЛИ НЕ БОИТЕСЬ ТРУДНОСТЕЙ, НАПИШИТЕ СВОЙ СОБСТВЕННЫЙ.

\subsec
сЛЕДУЮЩИЕ ВОСЕМЬ УПРАВЛЯЮЩИХ СИМВОЛОВ (А ИМЕННО, `\.{@,}', `\.{@/}', `\.{@|}',
`\.{@\#}',
`\.{@+}', `\.{@;}', `\.{@[}', И `\.{@]}') НЕ ВЛИЯЮТ НА ГЕНЕРАЦИЮ
\CEE/-ПРОГРАММЫ \.{CTANGLE}, НО В НЕКОТОРЫХ НЕОБЫЧНЫХ СЛУЧАЯХ МОГУТ ПОМОЧЬ
УЛУЧШИТЬ ЧИТАЕМОСТЬ ЕЕ \TEX/-ПРЕДСТАВЛЕНИЯ, ПОЛУЧЕННОГО \.{CWEAVE}.
вСТОЕННЫЙ АЛГОРИТМ ФОРМАТИРОВАНИЯ ВЕСЬМА ХОРОШ, КОГДА
ПРИМЕНЯЕТСЯ К СИНТАКСИЧЕСКИ ПРАВИЛЬНОЙ ПРОГРАММЕ, НО НЕ МОЖЕТ УЧЕСТЬ ВСЕХ
ВОЗМОЖНЫХ СИТУАЦИЙ, ПОТОМУ ЧТО РАБОТАЕТ С ФРАГМЕНТАМИ ТЕКСТА, ВКЛЮЧАЮЩИМИ
МАКРОСЫ И ИМЕНА СЕКЦИЙ; ТАКИЕ ФРАГМЕНТЫ НЕ ВСЕГДА СОБЛЮДАЮТ СИНТАКСИС.
нЕСМОТРЯ НА ТО, ЧТО \.{CWEB} ПОЗВОЛЯЕТ ПЕРЕКРЫВАТЬ
АВТОМАТИЧЕСКОЕ ФОРМАТИРОВАНИЕ, ЛУЧШЕЙ СТРАТЕГИЕЙ БУДЕТ НАЧАТЬ С
НЕГО, ПОСКОЛЬКУ МОЖЕТ ОКАЗАТЬСЯ, ЧТО ПОНАДОБЯТСЯ ЛИШЬ НЕСКОЛЬКО МЕЛКИХ
КОРРЕКТИВ.

\@, [MCc] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ВСТАВЛЯЕТ ТОНКИЙ ПРОБЕЛ (thin space) В
ВЫВОД \.{CWEAVE}.
иНОГДА ДОПОЛНИТЕЛЬНЫЙ ПРОБЕЛ МОЖЕТ ПОНАДОБИТЬСЯ ПРИ НЕОБЫЧНОМ ИСПОЛЬЗОВАНИИ
МАКРОСОВ, НАПРИМЕР, КОГДА ДВА ИДЕНТИФИКАТОРА РАСПОЛОЖЕНЫ РЯДОМ.

\@/ [MC] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ВЫЗЫВАЕТ РАЗРЫВ СТРОКИ В
\CEE/-ПРОГРАММЕ, ОТФОРМАТИРОВАННОЙ \.{CWEAVE}. рАЗРЫВЫ СТРОК АВТОМАТИЧЕСКИ
ВЫБИРАЮТСЯ
\TEX/'ОМ ПО СХЕМЕ, РАБОТАЮЩЕЙ КОРРЕКТНО В 99\%\ СЛУЧАЕВ, НО ИНОГДА
НЕОБХОДИМО ЯВНОЕ УКАЗАНИЕ, ЧТОБЫ РАЗБИЕНИЕ СООТВЕТСТВОВАЛО,
ПОМИМО ВНЕШНЕЙ ПРИВЛЕКАТЕЛЬНОСТИ, ЛОГИКЕ ПРОГРАММЫ.
нАПРИМЕР, ИСПОЛЬЗУЙТЕ `\.{@/@,}' ПЕРЕД КОММЕНТАРИЯМИ, ЧТОБЫ ОНИ
НАЧИНАЛИСЬ С НОВОЙ СТРОКИ.

\@| [MC] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ЗАДАЕТ НЕОБЯЗАТЕЛЬНЫЙ РАЗРЫВ СТРОКИ
ПОСРЕДИ ВЫРАЖЕНИЯ. нАПРИМЕР, ЕСЛИ ИМЕЕТСЯ ДЛИННОЕ ВЫРАЖЕНИЕ В ПРАВОЙ ЧАСТИ
ПРИСВАИВАНИЯ, С ПОМОЩЬЮ `\.{@|}' МОЖНО УКАЗАТЬ В НЕМ ВОЗМОЖНЫЕ ТОЧКИ
РАЗРЫВА, КОТОРЫЕ БУДУТ ЛУЧШЕ ПОДЧЕРКИВАТЬ ЛОГИКУ ПРОГРАММЫ, НЕЖЕЛИ
ВЫБРАННЫЕ \TEX/'ОМ АВТОМАТИЧЕСКИ.

\@\# [MC] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ВЫЗЫВАЕТ РАЗРЫВ СТРОКИ ПОДОБНО \.{@/},
А ТАКЖЕ ВСТАВЛЯЕТ НЕБОЛЬШОЙ ДОПОЛНИТЕЛЬНЫЙ ПРОБЕЛ В ТОЧКУ РАЗРЫВА.
оН МОЖЕТ ИСПОЛЬЗОВАТЬСЯ, НАПРИМЕР,
МЕЖДУ ЛОГИЧЕСКИ РАЗЛИЧНЫМИ ГРУППАМИ МАКРОСОВ, РАЗМЕЩЕННЫМИ В ОДНОЙ СЕКЦИИ.
\.{CWEB} АВТОМАТИЧЕСКИ ВСТАВЛЯЕТ ТАКОЙ ДОПОЛНИТЕЛЬНЫЙ
ПРОБЕЛ МЕЖДУ ФУНКЦИЯМИ, ВНЕШНИМИ ОБ®ЯВЛЕНИЯМИ И ФУНКЦИЯМИ, А ТАКЖЕ МЕЖДУ
ОБ®ЯВЛЕНИЯМИ И ОПЕРАТОРАМИ В ТЕЛЕ ФУНКЦИИ.

\@+ [MC] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ МАСКИРУЕТ РАЗРЫВ СТРОКИ, КОТОРЫЙ ДОЛЖЕН
БЫТЬ СДЕЛАН \.{CWEAVE}, НАПРИМЕР, ПЕРЕД `\&{else}', ЕСЛИ ВЫ ХОТИТЕ
РАЗМЕСТИТЬ КОРОТКУЮ if--else КОНСТРУКЦИЮ НА ОДНОЙ СТРОКЕ.
еСЛИ УКАЗАТЬ `\.{\{@+}' В НАЧАЛЕ СОСТАВНОГО ОПЕРАТОРА, ЯВЛЯЮЩЕГОСЯ ТЕЛОМ
ФУНКЦИИ, ТО ПЕРВОЕ ОБ®ЯВЛЕНИЕ ИЛИ ОПЕРАТОР ФУНКЦИИ БУДУТ РАСПОЛОЖЕНЫ НА
ТОЙ ЖЕ СТРОКЕ, ЧТО И ОТКРЫВАЮЩАЯ СКОБКА, И С ОТСТУПОМ, КОТОРЫЙ БУДЕТ
ПРЕДШЕСТВОВАТЬ ВТОРОМУ ОПЕРАТОРУ ИЛИ ОБ®ЯВЛЕНИЮ НА СЛЕДУЮЩЕЙ СТРОКЕ.

\@; [MC] эТОТ УПРАВЛЯЮЩИЙ СИМВОЛ ПРИ ФОРМАТИРОВАНИИ АНАЛОГИЧЕН ТОЧКЕ С
ЗАПЯТОЙ, НО НЕВИДИМ. вЫ МОЖЕТЕ ВОСПОЛЬЗОВАТЬСЯ НИМ, НАПРИМЕР, ПОСЛЕ
ИМЕНИ СЕКЦИИ ИЛИ МАКРОСА, КОГДА \CEE/-КОД, ПРЕДСТАВЛЕННЫЙ В ЭТОЙ СЕКЦИИ
ИЛИ МАКРОСЕ, ЕСТЬ СОСТАВНОЙ ОПЕРАТОР ЛИБО ОКАНЧИВАЕТСЯ ТОЧКОЙ С ЗАПЯТОЙ.
пРИМЕРОМ ТАКОЙ КОНСТРУКЦИИ ЯВЛЯЕТСЯ
$$\lpile{\.{if (condition) macro @;}\cr
\.{else break;}\cr}$$
ГДЕ ОПРЕДЕЛЕНИЕМ \\{macro} СЛУЖИТ СОСТАВНОЙ ОПЕРАТОР (ЗАКЛЮЧЕННЫЙ В ФИГУРНЫЕ
СКОБКИ).
эТО ХОРОШО ИЗВЕСТНЫЙ НЕДОСТАТОК СИНТАКСИСА \CEE/.

\@{[} [MC] сМ. \.{@]}.

\@] [MC] пОМЕСТИТЕ КВАДРАТНЫЕ СКОБКИ \.{@[...@]} ВОКРУГ ТЕКСТА ПРОГРАММЫ,
КОТОРЫЙ ДОЛЖЕН БЫТЬ ОТФОРМАТИРОВАН \.{CWEAVE}
 КАК ВЫРАЖЕНИЕ, ЕСЛИ ЭТОГО НЕ ПРОИЗОШЛО. (тАКОЕ
ИНОГДА СЛУЧАЕТСЯ С НЕОБЫЧНЫМИ АРГУМЕНТАМИ МАКРОСОВ.)
тАКЖЕ ВСТАВЛЯЙТЕ `\.{@[@]}' МЕЖДУ ИМЕНЕМ ТИПА И ЛЕВОЙ СКОБКОЙ, КОГДА
ОБ®ЯВЛЯЕТЕ УКАЗАТЕЛЬ НА ФУНКЦИЮ, ВРОДЕ,
$$\.{int @[@] (*f)();}$$
В ПРОТИВНОМ СЛУЧАЕ \.{CWEAVE} СПУТАЕТ ПЕРВУЮ ЧАСТЬ ЭТОГО ОПРЕДЕЛЕНИЯ
С ВЫРАЖЕНИЕМ \CPLUSPLUS/ `\&{int}($*f$)'.

\subsec
оСТАЛЬНЫЕ УПРАВЛЯЮЩИЕ СИМВОЛЫ \.{CWEB} РУКОВОДЯТ ВВОДОМ ДАННЫХ.

\@{x @y @z}[\\{change\_file}]
\.{CWEAVE} И \.{CTANGLE} ПРЕДНАЗНАЧЕНЫ ДЛЯ РАБОТЫ С ДВУМЯ ВХОДНЫМИ ФАЙЛАМИ,
НАЗЫВАЕМЫМИ \\{web\_file} И ФАЙЛ ИЗМЕНЕНИЙ \\{change\_file},
ГДЕ \\{change\_file} СОДЕРЖИТ ДАННЫЕ, ЗАМЕЩАЮЩИЕ ОТДЕЛЬНЫЕ ЧАСТИ \\{web\_file}.
рЕЗУЛЬТИРУЮЩИЙ ТЕКСТ И ЕСТЬ ТОТ САМЫЙ ФАЙЛ \.{CWEB}, КОТОРЫЙ УПОМИНАЕТСЯ
ПОВСЕМЕСТНО В ЭТОМ РУКОВОДСТВЕ.

\more кАК ЭТО РАБОТАЕТ: ФАЙЛ ИЗМЕНЕНИЙ СОДЕРЖИТ НУЛЬ И БОЛЕЕ ``КОРРЕКТИВ'',
ГДЕ  КОРРЕКТИВА ИМЕЕТ ВИД `\.{@x}$\langle$СТАРЫЕ СТРОКИ$\rangle$\.{@y}$\langle$%
НОВЫЕ СТРОКИ$\rangle$\.{@z}'. сПЕЦИАЛЬНЫЕ УПРАВЛЯЮЩИЕ СИМВОЛЫ \.{@x}, \.{@y}, \.{@z},
ДОПУСТИМЫЕ ТОЛЬКО В ФАЙЛАХ ИЗМЕНЕНИЙ, ДОЛЖНЫ ПОЯВЛЯТЬСЯ В НАЧАЛЕ СТРОКИ,
ОСТАТОК ТАКОЙ СТРОКИ ИГНОРИРУЕТСЯ.
сОДЕРЖИМОЕ $\langle$СТАРЫЕ СТРОКИ$\rangle$ ПРЕДСТАВЛЯЕТ МАТЕРИАЛ,
КОТОРЫЙ ТОЧНО СООТВЕТСТВУЕТ
ПОСЛЕДОВАТЕЛЬНЫМ СТРОКАМ \\{web\_file}; А $\langle$НОВЫЕ СТРОКИ$\rangle$
СОДЕРЖИТ НУЛЬ ИЛИ БОЛЕЕ СТРОК, КОТОРЫМИ ПРЕДПОЛАГАЕТСЯ ЗАМЕНИТЬ СТАРЫЕ.
кАК ТОЛЬКО ПЕРВАЯ ``СТАРАЯ СТРОКА'' КОРРЕКТИВЫ ОКАЗЫВАЕТСЯ СОВПАДАЮЩЕЙ
СО СТРОКОЙ В~\\{web\_file}, ВСЕ ОСТАЛЬНЫЕ СТРОКИ ЭТОЙ КОРРЕКТИВЫ ТАКЖЕ
ДОЛЖНЫ СОВПАСТЬ.

\more мЕЖДУ КОРРЕКТИВАМИ, ПЕРЕД ПЕРВОЙ КОРРЕКТИВОЙ И ПОСЛЕ ПОСЛЕДНЕЙ
КОРРЕКТИВЫ
ФАЙЛ ИЗМЕНЕНИЙ МОЖЕТ СОДЕРЖАТЬ ЛЮБОЕ КОЛИЧЕСТВО СТРОК, НЕ НАЧИНАЮЩИХСЯ
`\.{@x}', `\.{@y}', ЛИБО~`\.{@z}'. тАКИЕ СТРОКИ ПРОПУСКАЮТСЯ И НЕ
ИСПОЛЬЗУЮТСЯ В СОПОСТАВЛЕНИИ.

\more тАКАЯ ВОЗМОЖНОСТЬ ПОЛЕЗНА, КОГДА РАБОТАЕШЬ С ОРИГИНАЛЬНЫМ \.{CWEB}-ФАЙЛОМ,
ПОЛУЧЕННЫМ ОТКУДА-ЛИБО (НАПРИМЕР, \.{tangle.w} И
\.{weave.w} ЛИБО \.{tex.web}), КОТОРЫЙ НЕОБХОДИМО ИЗМЕНИТЬ ДЛЯ АДАПТАЦИИ
ПРОГРАММЫ К ОСОБЕННОСТЯМ ВАШЕЙ СИСТЕМЫ. вЫ МОЖЕТЕ ОТЛАЖИВАТЬ СВОИ
СИСТЕМНО-ЗАВИСИМЫЕ ИЗМЕНЕНИЯ, НЕ ИСПРАВЛЯЯ ОСНОВНОГО ФАЙЛА; И КАК
ТОЛЬКО ОНИ ЗАРАБОТАЮТ, ИХ МОЖНО БУДЕТ ЛЕГКО ВКЛЮЧАТЬ В НОВЫЕ ВЕРСИИ
ОСНОВНОГО ФАЙЛА, КОТОРЫЕ БУДУТ ПОЯВЛЯТЬСЯ ВРЕМЯ ОТ ВРЕМЕНИ.

\@i [\\{web\_file}]
в СВОЮ ОЧЕРЕДЬ, \\{web\_file} САМ ПО СЕБЕ МОЖЕТ БЫТЬ КОМБИНАЦИЕЙ
НЕСКОЛЬКИХ ФАЙЛОВ.
кОГДА \.{CWEAVE} ЛИБО \.{CTANGLE}, СЧИТЫВАЯ ФАЙЛ, ОБНАРУЖИВАЮТ
УПРАВЛЯЮЩИЙ СИМВОЛ \.{@i} В НАЧАЛЕ СТРОКИ, ОНИ ПРЕРЫВАЮТ ЧТЕНИЕ И
НАЧИНАЮТ ОБРАБОТКУ ФАЙЛА, ИМЯ КОТОРОГО СЛЕДУЕТ ЗА \.{@i},
ПОДОБНО ПРЕПРОЦЕССОРУ КОМПИЛЯТОРА \CEE/, ОБРАБАТЫВАЮЩЕМУ ДИРЕКТИВУ
\.{\#include}.
пОСЛЕ ЗАВЕРШЕНИЯ ЧТЕНИЯ ВКЛЮЧАЕМОГО ФАЙЛА ПРОГРАММА
ПЕРЕХОДИТ К СЛЕДУЮЩЕЙ СТРОКЕ ИСХОДНОГО ФАЙЛА.
иМЯ ФАЙЛА, СЛЕДУЮЩЕЕ ЗА \.{@i}, МОЖЕТ ОКРУЖАТЬСЯ СИМВОЛАМИ
\.", НО ЭТО НЕОБЯЗАТЕЛЬНО.
вКЛЮЧЕНИЕ МОЖЕТ БЫТЬ ВЛОЖЕННЫМ.

\more
фАЙЛЫ ИЗМЕНЕНИЙ МОГУТ ИМЕТЬ СТРОКИ, НАЧИНАЮЩИЕСЯ \.{@i}. тАКИМ СПОСОБОМ
ВЫ МОЖЕТЕ ПОДМЕНЯТЬ ОДИН ВКЛЮЧАЕМЫЙ ФАЙЛ ДРУГИМ. кОНЦЕПТУАЛЬНО, ОПИСАННЫЙ
ВЫШЕ МЕХАНИЗМ ПОДСТАНОВКИ ДЕЙСТВУЕТ ПЕРВЫМ, А ЗАТЕМ В ЕГО ВЫВОДЕ
ОБРАБАТЫВАЮТСЯ ДИРЕКТИВЫ \.{@i}. еСЛИ \.{@i} \.{foo}
ПОЯВИТСЯ МЕЖДУ \.{@y} И \.{@z} В ФАЙЛЕ ИЗМЕНЕНИЙ, ОТДЕЛЬНЫЕ СТРОКИ
ФАЙЛА \.{foo} И ФАЙЛЫ, КОТОРЫЕ ОН ВКЛЮЧАЕТ, НЕ ИЗМЕНЯЮТСЯ; МОДИФИКАЦИИ
МОГУТ БЫТЬ ВНЕСЕНЫ В СТРОКИ, КОТРЫЕ ВКЛЮЧАЛИСЬ НЕ ИЗМЕНЕННОЙ ДИРЕКТИВОЙ
input.

\more в СИСТЕМЕ UNIX (И ДРУГИХ, ПОДДЕРЖИВАЮЩИХ ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ),
ЕСЛИ УСТАНОВЛЕНА ПЕРЕМЕННАЯ \.{CWEBINPUTS}, ЛИБО ЕСЛИ ОДНОИМЕННОЕ
ОПРЕДЕЛЕНИЕ БЫЛО ЗАДАНО ПРИ КОМПИЛЯЦИИ,
\.{CWEB} БУДЕТ ИСПОЛЬЗОВАТЬ ЕЕ ЗНАЧЕНИЕ В КАЧЕСТВЕ ИМЕНИ КАТАЛОГА, В
КОТОРОМ БУДЕТ ПРОИСХОДИТЬ ПОИСК ВКЛЮЧАЕМЫХ ФАЙЛОВ, ЕСЛИ ОНИ НЕ БУДУТ
НАЙДЕНЫ В ТЕКУЩЕМ КАТАЛОГЕ.

\section дОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ И ПРЕДОСТЕРЕЖЕНИЯ.

1. в НЕКОТОРЫХ РЕАЛИЗАЦИЯХ \.{CWEB}, КОТОРЫЕ
{\def\\#1#2{`{\tentex\char'#1#2}'}%
ДОПУСКАЮТ ИСПОЛЬЗОВАНИЕ РАСШИРЕННОГО СИМВОЛЬНОГО НАБОРА, СИМВОЛЫ
\\13, \\01, \\31, \\32, \\34, \\35,
\\36, \\37, \\04, \\20 И~\\21}
МОГУТ ПРИМЕНЯТЬСЯ КАК СОКРАЩЕНИЯ ДЛЯ `\.{++}', `\.{--}', `\.{->}',
`\.{!=}', `\.{<=}', `\.{>=}', `\.{==}', `\.{\v\v}', `\.{\&\&}',
`\.{<<}' И~`\.{>>}' СООТВЕТСТВЕННО.

2. еСЛИ ВАША СИСТЕМА ИМЕЕТ РАСШИРЕННЫЙ НАБОР СИМВОЛОВ, ОН МОЖЕТ БЫТЬ
ИСПОЛЬЗОВАН С МИНИМАЛЬНЫМИ ОГРАНИЧЕНИЯМИ,
КАК ЭТО ОПИСАНО ВЫШЕ ПРИ ОБСУЖДЕНИИ \.{@l}.
нО ВАМ СЛЕДУЕТ ПРИДЕРЖИВАТЬСЯ СТАНДАРТНЫХ СИМВОЛОВ ASCII, ЕСЛИ ВЫ
ХОТИТЕ ПИСАТЬ ПРОГРАММЫ, КОТОРЫЕ ОКАЖУТСЯ ПОЛЕЗНЫМИ И ТЕМ, КОМУ ТАКОЕ
РАСШИРЕНИЕ НЕДОСТУПНО.

3. дОКУМЕНТ \TEX/, ПРОИЗВЕДЕННЫЙ \.{CWEAVE}, РАЗБИВАЕТСЯ НА СТРОКИ С
МАКСИМАЛЬНОЙ ДЛИНОЙ 80 СИМВОЛОВ.
кОГДА ТЕКСТ \TEX/ КОПИРУЕТСЯ, ВОСПРОИЗВОДЯТСЯ И СУЩЕСТВУЮЩИЕ РАЗРЫВЫ СТРОК.
еСЛИ ВЫ НЕ ДЕЛАЕТЕ НИЧЕГО СЛИШКОМ ХИТРОГО, \.{CWEAVE} РАСПОЗНАЕТ, КОГДА
КОММЕНТАРИЙ \TEX/'А РАЗБИВАЕТСЯ НА НЕСКОЛЬКО СТРОК, И ДОБАВИТ
`\.\%' В НАЧАЛО КАЖДОЙ ТАКОЙ СТРОКИ.

4. \CEE/-ТЕКСТ ТРАНСЛИРУЕТСЯ ``ВОСХОДЯЩЕЙ'' (``bottom up'') ПРОЦЕДУРОЙ,
КОТОРАЯ РАСПОЗНАЕТ КАЖДУЮ ЛЕКСЕМУ КАК ``ЧАСТЬ РЕЧИ'' (``part of speech'')
И КОМБИНИРУЕТ ЭТИ ЧАСТИ ВО ВСЕ Б\'ОЛЬШИЕ И Б\'ОЛЬШИЕ ФРАЗЫ, ПОКА ЭТО
ВОЗМОЖНО, СОГЛАСНО СПЕЦИАЛЬНОЙ ГРАММАТИКЕ, ОПИСАННОЙ В ДОКУМЕНТАЦИИ
К~\.{CWEAVE}. лЕГКО ПОНЯТЬ СХЕМУ, ПРИМЕНЯЕМУЮ К ПРОСТЫМ КОНСТРУКЦИЯМ,
ТАКИМ КАК ОТДЕЛЬНЫЕ ИДЕНТИФИКАТОРЫ И КОРОТКИЕ ВЫРАЖЕНИЯ, ПРОСТО ИЗУЧИВ
НЕСКОЛЬКО ПРИМЕРОМ ВЫВОДА \.{CWEAVE}, НО ОБЩИЙ МЕХАНИЗМ НЕСКОЛЬКО
СЛОЖНЕЕ, ПОСКОЛЬКУ ДОЛЖЕН ОБРАБАТЫВАТЬ НЕЧТО БОЛЬШЕЕ, ЧЕМ ПРОСТО \CEE/.
пОМИМО ЭТОГО, ВЫВОД СОДЕРЖИТ КОМАНДЫ, КОТОРЫЕ ЗАСТАВЛЯЮТ \TEX/ ДЕЛАТЬ
ОТСТУПЫ И РАЗРЫВЫ СТРОК ГДЕ НЕОБХОДИМО,
СООТВЕТСТВЕННО ИСПОЛЬЗОВАННЫМ ШРИФТАМ И РАЗМЕРУ СТРАНИЦЫ. дЛЯ ДОСТИЖЕНИЯ
НАИЛУЧШИХ РЕЗУЛЬТАТОВ БЛАГОРАЗУМНО
ИЗБЕГАТЬ ЗАКЛЮЧЕНИЯ ДЛИННЫХ \CEE/-ТЕКСТОВ В \pb, ПОСКОЛЬКУ
ОТСТУПЫ И МАРКЕРЫ КОНЦА СТРОКИ ИГНОРИРУЮТСЯ, КОГДА СОДЕРЖИМОЕ \pb\
ТРАНСЛИРУЕТСЯ С \CEE/ В \TEX/. сТРЕМИТЕСЬ К ПРОСТОТЕ ВЫРАЖЕНИЙ И
ОПЕРАТОРОВ.  еСЛИ ДИРЕКТИВА ПРЕПРОЦЕССОРА ЗАКЛЮЧЕНА В \pb,
ТО НАЧИНАЮЩИЙ ЕЕ \.\#  ДОЛЖЕН РАСПОЛАГАТЬСЯ В НАЧАЛЕ СТРОКИ,
ИНАЧЕ \.{CWEAVE} НЕ НАПЕЧАТАЕТ ЕЕ ПРАВИЛЬНО.

5. кОММЕНТАРИИ В \pb-ТЕКСТЕ НЕДОПУСТИМЫ. пОСЛЕ `\.|', УКАЗЫВАЮЩЕГО НА
ПЕРЕХОД ОТ ТЕКСТА \TEX/ К \CEE/, СЛЕДУЮЩИЙ `\.|', КОТОРЫЙ НЕ ЯВЛЯЕТСЯ
ЧАСТЬЮ СТРОКИ, УПРАВЛЯЮЩЕГО ТЕКСТА ЛИБО ИМЕНИ СЕКЦИИ, ЗАВЕРШАЕТ \CEE/-ТЕКСТ.

6. кОММЕНТАРИЙ ДОЛЖЕН ИМЕТЬ ПРАВИЛЬНОЕ ВЛОЖЕНИЕ ФИГУРНЫХ СКОБОК,
В ПРОТИВНОМ СЛУЧАЕ \.{CWEAVE} ВЫРАЗИТ СВОЕ НЕДОВОЛЬСТВО, НО ПРИ ЭТОМ
СДЕЛАЕТ ПОПЫТКУ ВОССТАНОВИТЬ БАЛАНС СКОБОК, ТАК ЧТО
\TEX/'У НЕ ПРИДЕТСЯ СЛИШКОМ ТРУДНО.

7. еСЛИ ВО ВРЕМЯ ОТЛАДКИ ПРОГРАММЫ ВОЗНИКАЕТ НЕОБХОДИМОСТЬ ОПУСТИТЬ
НЕКОТОРУЮ ЧАСТЬ \CEE/-КОДА, не СЛЕДУЕТ ПЫТАТЬСЯ ПРОСТО ЕГО ``ЗАКОММЕНТИРОВАТЬ''.
тАКИЕ КОММЕНТАРИИ НЕ В ДУХЕ \.{CWEB}; ЧИТАТЕЛЯМ ОНИ ПОКАЖУТСЯ ПОЯСНЕНИЯМИ
К ОСТАЛЬНЫМ ИНСТРУКЦИЯМ.
кРОМЕ ТОГО, КОММЕНТАРИИ ДОЛЖНЫ БЫТЬ КОРРЕКТНЫ С ТОЧКИ ЗРЕНИЯ \TEX/'А;
СЛЕДОВАТЕЛЬНО, \.{CWEAVE} БУДЕТ В ЗАТРУДНЕНИИ, ЕСЛИ ВЫ ЗАКЛЮЧИТЕ
ПРЕДЛОЖЕНИЯ \CEE/ В
\.{/*...*/} ВМЕСТО \.{/*|...|*/}.  еСЛИ ЧАСТЬ \CEE/-КОДА ДОЛЖНА БЫТЬ
``ЗАКОММЕНТИРОВАНА'', ВЫ МОЖЕТЕ ОГРАНИЧИТЬ ЕЕ ДИРЕКТИВАМИ ПРЕПРОЦЕССОРА,
ПОДОБНЫМИ \.{\#if 0==1} И \.{\#endif}.

8. пРИ ПОМОЩИ \.{@f} ВОЗМОЖНО ОПРЕДЕЛИТЬ ОДИН ИДЕНТИФИКАТОР ТАК, ЧТОБЫ ОН ВЕЛ
СЕБЯ ПОДОБНО ДРУГОМУ, И  ЭТИ ОПРЕДЕЛЕНИЯ ФОРМАТА ПРИМЕНЯЮТСЯ ПОСЛЕДОВАТЕЛЬНО.
вООБЩЕ ГОВОРЯ, ДАННЫЙ ИДЕНТИФИКАТОР ИМЕЕТ ЕДИНСТВЕННЫЙ ФОРМАТ ВЫВОДА НА
ПРОТЯЖЕНИИ ВСЕГО ДОКУМЕНТА, И ЭТОТ ФОРМАТ ИСПОЛЬЗУЕТСЯ ДАЖЕ ДО ТОГО, КАК
БУДЕТ ОПРЕДЕЛЕН ПОСРЕДСТВОМ \.{@f}. эТО ОБ®ЯСНЯЕТСЯ ТЕМ, ЧТО \.{CWEAVE}
РАБОТАЕТ В ДВА
ПРОХОДА; НА ПЕРВОМ ПРОХОДЕ ОБРАБАТЫВАЮТСЯ ДИРЕКТИВЫ \.{@f} И
ПЕРЕКРЕСТНЫЕ ССЫЛКИ, А НА ВТОРОМ ПРОИЗВОДИТСЯ ВЫВОД.
(тЕМ НЕ МЕНЕЕ, ИДЕНТИФИКАТОРЫ, ВВЕДЕННЫЕ \.{typedef}, КОТОРЫМ
НЕЯВНО ПРИСВАИВАЕТСЯ ФОРМАТ ВЫВОДА ЖИРНЫМ ШРИФТОМ,
НЕ СЛЕДУЮТ ЭТОМУ ПРАВИЛУ: ОНИ ВЫВОДЯТСЯ ПО-РАЗНОМУ ДО И ПОСЛЕ
СООТВЕТСТВУЮЩЕГО \.{typedef}.  эТО РАЗОЧАРОВЫВАЕТ, НО ЧТО-ЛИБО ИСПРАВИТЬ
ЗАТРУДНИТЕЛЬНО. вЫ МОЖЕТЕ ОБОЙТИ ЭТО ОГРАНИЧЕНИЕ, ИСПОЛЬЗУЯ \.{@s}, ДО ЛИБО
ПОСЛЕ \.{typedef}.)

9. иНОГДА ЖЕЛАТЕЛЬНО ВСТАВИТЬ В ОТФОРМАТИРОВАННЫЙ \CEE/-КОД ПРОБЕЛ,
ОТЛИЧНЫЙ ОТ ПРЕДОСТАВЛЯЕМОГО `\.{@,}'. дЛЯ ЭТОГО МОЖНО ВОСПОЛЬЗОВАТЬСЯ
\.{@t}; НАПРИМЕР, `\.{@t\\hskip 1in@>}' ДАЕТ ПРОБЕЛ ДЛИНОЙ 1~ДЮЙМ.
кРОМЕ ТОГО, `\.{@t\\4@>}' МОЖЕТ ИСПОЛЬЗОВАТЬСЯ ДЛЯ
ВОЗВРАТА НА ОДНУ ЕДИНИЦУ ОТСТУПА, ПОСКОЛЬКУ УПРАВЛЯЮЩАЯ
ПОСЛЕДОВАТЕЛЬНОСТЬ \.{\\4} ОПРЕДЕЛЕНА В \.{cwebmac} ТАК, ЧТОБЫ ДЕЛАТЬ
ТАКОЙ ВОЗВРАТ. (оНА ИСПОЛЬЗУЕТСЯ, К ПРИМЕРУ, В НАЧАЛЕ СТРОК, КОТОРЫЕ
СОДЕРЖАТ ПОМЕЧЕННЫЕ ОПЕРАТОРЫ, ТАК ЧТО МЕТКА БУДЕТ НЕМНОГО СМЕЩЕНА
ВЛЕВО.) вЫ ТАКЖЕ МОЖЕТЕ ИСПОЛЬЗОВАТЬ `\.{@t\}\\3\{-5@>}' ДЛЯ
ПРИНУДИТЕЛЬНОГО РАЗРЫВА СТРОКИ ПОСРЕДИ ВЫРАЖЕНИЯ.

10. кАЖДЫЙ ИДЕНТИФИКАТОР В \.{CWEB} ИМЕЕТ ОДИН СТИЛЬ ФОРМАТИРОВАНИЯ. пОЭТОМУ
ВЫ НЕ ДОЛЖНЫ ИСПОЛЬЗОВАТЬ ОДНО И ТО ЖЕ ИМЯ ДЛЯ ОДНОВРЕМЕННОГО ОБОЗНАЧЕНИЯ,
НАПРИМЕР, ИМЕНИ ТИПА И ПОЛЯ \.{struct}, НЕСМОТРЯ НА ТО, ЧТО \CEE/
ПОЗВОЛЯЕТ ЭТО.

\section зАПУСК ПРОГРАММ.
кОМАНДНАЯ СТРОКА \UNIX/ КАК ДЛЯ \.{CTANGLE}, ТАК И ДЛЯ \.{CWEAVE} ИМЕЕТ ВИД
$$\.{ctangle [options] web\_file[.w] [\{change\_file[.ch]|-\} [out\_file]]}$$
еСЛИ ФАЙЛ ИЗМЕНЕНИЙ ОПУЩЕН ЛИБО ЗАДАН `\.-', ОН ПОЛАГАЕТСЯ ПУСТЫМ.
рАСШИРЕНИЯ \.{.w} И \.{.ch} ДОБАВЛЯЮТСЯ ТОЛЬКО В ТОМ СЛУЧАЕ, ЕСЛИ
ЗАДАННЫЕ ИМЕНА ФАЙЛОВ НЕ СОДЕРЖАТ ТОЧЕК.
еСЛИ ФАЙЛ С ТАКИМ ИМЕНЕМ НЕ НАЙДЕН, БУДЕТ ИСПРОБОВАНО РАСШИРЕНИЕ
\.{.web}.
нАПРИМЕР, `\.{cweave} \.{cob}' ПОПЫТАЕТСЯ ПРОЧИТАТЬ
\.{cob.w}; ЕСЛИ ЭТО НЕ УДАЕТСЯ, БУДЕТ ИСПРОБОВАНО \.{cob.web} ПЕРЕД
АВАРИЙНЫМ ЗАВЕРШЕНИЕМ РАБОТЫ.
еСЛИ ИМЯ ВЫХОДНОГО ФАЙЛА НЕ ЗАДАНО, ИМЯ \CEE/-ФАЙЛА, ГЕНЕРИРУЕМОГО
\.{CTANGLE}, ПОЛУЧАЕТСЯ ДОБАВЛЕНИЕМ РАСШИРЕНИЯ \.{.c};
ИМЯ \TEX/-ФАЙЛА, ПРОИЗВЕДЕННОГО \.{CWEAVE}, ПОЛУЧИТ РАСШИРЕНИЕ \.{.tex}.
в ИНДЕКСНЫХ ФАЙЛАХ, ПОРОЖДАЕМЫХ \.{CWEAVE}, \.{.tex} ЗАМЕНЯЕТСЯ \.{.idx} И
\.{.scn}.

пРИВЕРЖЕНЦЫ ЛАКОНИЧНОСТИ МОГУТ ТАК НАСТРОИТЬ СВОЙ КОМАНДНЫЙ
ИНТЕРПРЕТАТОР, ЧТО `\.{wv}' БУДЕТ ОЗНАЧАТЬ `\.{cweave -bhp}'; ЭТО
ПОДАВЛЯЕТ ВЕСЬ ВЫВОД \.{CWEAVE} НА ТЕРМИНАЛ, ЗА ИСКЛЮЧЕНИЕМ СООБЩЕНИЙ ОБ
ОШИБКАХ.

пАРАМЕТРЫ-ОПЦИИ НАЧИНАЮТСЯ ЛИБО СИМВОЛОМ `\.-', ЗАПРЕЩАЮЩИМ ДЕЙСТВИЕ
ОПЦИИ, ЛИБО `\.+', КОТОРЫЙ ЕГО РАЗРЕШАЕТ. нАПРИМЕР, `\.{-fb}' ЗАПРЕЩАЕТ
ОПЦИИ \.f И \.b; `\.{+s}' РАЗРЕШАЕТ ОПЦИЮ \.s. оПЦИИ МОГУТ
ЗАДАВАТЬСЯ ПЕРЕД ИМЕНАМИ ФАЙЛОВ, ПОСЛЕ НИХ, ЛИБО И ТО, И ДРУГОЕ. в
НАСТОЯЩИЙ МОМЕНТ ПОДДЕРЖИВАЮТСЯ СЛЕДУЮЩИЕ ОПЦИИ:

\yskip
\def\option#1 {\textindent{\.#1}\hangindent2\parindent}

\option b вЫВОДИТЬ СООБЩЕНИЕ ПРИ СТАРТЕ. (рАЗРЕШЕНО ПО УМОЛЧАНИЮ.)

\option f пРИНУЖДАЕТ ЗАВЕРШАТЬ КАЖДЫЙ ОПЕРАТОР \CEE/, ОТФОРМАТИРОВАННЫЙ
\.{CWEAVE}, МАРКЕРОМ КОНЦА СТРОКИ.
(рАЗРЕШЕНО ПО УМОЛЧАНИЮ; \.{-f} ЭКОНОМИТ БУМАГУ, НО МНОГИЕ ПОЛАГАЮТ, ЧТО
ТАКОЙ СТИЛЬ ФОРМАТИРОВАНИЯ ПРОГРАММЫ ВЫГЛЯДИТ В \CEE/ "НЕЕСТЕСТВЕННО".)
(нЕ ВЛИЯЕТ НА \.{CTANGLE}.)

\option h вЫВОД СООБЩЕНИЯ О НОРМАЛЬНОМ ЗАВЕРШЕНИИ ПРОГРАММЫ. (рАЗРЕШЕН
ПО УМОЛЧАНИЮ.)

\option p оТОБРАЖАТЬ ВО ВРЕМЯ РАБОТЫ ПРОГРАММЫ СООБЩЕНИЯ О ЕЕ
ПРОГРЕССЕ. (рАЗРЕШЕНО ПО УМОЛЧАНИЮ.)

\option s вЫДАЕТ СТАТИСТИКУ ИСПОЛЬЗОВАНИЯ ПАМЯТИ ПО ОКОНЧАНИИ РАБОТЫ
ПРОГРАММЫ. (зАПРЕЩЕНО ПО УМОЛЧАНИЮ.)
еСЛИ ВАШИ \.{CWEB}-ФАЙЛЫ ЛИБО СЕКЦИИ ВЕЛИКИ, МОЖЕТ ОКАЗАТЬСЯ ПОЛЕЗНЫМ УВИДЕТЬ,
НАСКОЛЬКО ВЫ БЛИЗКИ К ИСЧЕРПАНИЮ РЕСУРСОВ \.{CTANGLE} И/ИЛИ \.{CWEAVE}.

\option x вКЛЮЧАТЬ ИНДЕКС И ОГЛАВЛЕНИЕ В \TEX/-ФАЙЛ, ВЫВОДИМЫЙ
\.{CWEAVE}. (рАЗРЕШЕНО ПО УМОЛЧАНИЮ.) (нЕ ВЛИЯЕТ НА \.{CTANGLE}.)

\section дОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ О ФОРМАТИРОВАНИИ.
вАМ МОЖЕТ НЕ ПОНРАВИТЬСЯ, КАК \.{CWEAVE} ОБРАБАТЫВАЕТ НЕКОТОРЫЕ
СИТУАЦИИ. еСЛИ У ВАС НЕТ ДРУГОГО ВЫХОДА, ВЫ МОЖЕТЕ НАСТРОИТЬ \.{CWEAVE}
ИЗМЕНЯЯ ЕГО ГРАММАТИКУ.  эТО ТРЕБУЕТ МОДИФИКАЦИИ ИСХОДНЫХ ТЕКСТОВ,
РАБОТЫ, КОТОРАЯ МОЖЕТ ПОКАЗАТЬСЯ ЗАНИМАТЕЛЬНОЙ. тАБЛИЦА ГРАММАТИЧЕСКИХ
ПРАВИЛ СОДЕРЖИТСЯ В ИСХОДНЫХ ТЕКСТАХ \.{CWEAVE}, И ВЫ МОЖЕТЕ СДЕЛАТЬ
ОТДЕЛЬНУЮ КОПИЮ ЭТОЙ ТАБЛИЦЫ, СКОПИРОВАВ ФАЙЛ~\.{prod.w}, НАЙДЕННЫЙ В
ИСХОДНЫХ ТЕКСТАХ \.{CWEB} И СКОМАНДОВАВ `\.{cweave}~\.{-x}~\.{prod}' И
`\.{tex}~\.{prod}'.

вЫ МОЖЕТЕ ТОЧНО УЗНАТЬ, КАК \.{CWEAVE} РАЗБИРАЕТ ВАШ \CEE/-КОД, ЕСЛИ
ПОМЕСТИТЕ ПЕРЕД НИМ СТРОКУ `\.{@ @c @2}'. (уПРАВЛЯЮЩИЙ КОД `\.{@2}'
АКТИВИЗИРУЕТ ``СЛЕДЯЩИЙ'' (``peeping'') РЕЖИМ РАБОТЫ, А `\.{@0}'
ОТМЕНЯЕТ ЕГО.) нАПРИМЕР, ЕСЛИ ПРОПУСТИТЬ ЧЕРЕЗ \.{CWEAVE} ФАЙЛ
\medskip
\begingroup
\verbatim
@ @c @2
main (argc,argv)
char **argv;
{ for (;argc>0;argc--) printf("%s\n",argv[argc-1]); }
!endgroup
\endgroup
\medskip\noindent
НА ЭКРАН БУДЕТ ВЫВЕДЕНА СЛЕДУЮЩАЯ ТАРАБАРЩИНА:
\medskip
\begingroup
\verbatim
[...]
4:*exp ( +exp+ )...
11:*exp +exp+ int...
5:*+exp+ int +unorbinop+...
[...]
60: +fn_decl+*+{+ -stmt- +}-
55:*+fn_decl+ -stmt-
52:*+function-
[...]
!endgroup
\endgroup
\medskip
пЕРВАЯ СТРОКА УКАЗЫВАЕТ, ЧТО БЫЛО ПРИМЕНЕНО ПРАВИЛО НОМЕР 4, И  \.{CWEAVE}
В НАСТОЯЩИЙ МОМЕНТ СОДЕРЖИТ В СВОЕЙ ПАМЯТИ ПОСЛЕДОВАТЕЛЬНОСТЬ ФРАГМЕНТОВ
(chunk) ТЕКСТА В ФОРМАТЕ \TEX/ (НАЗЫВАЕМЫХ ``ВЫРЕЗКАМИ'', ``scraps''),
ИМЕЮЩИХ СООТВЕТСТВЕННО ТИП \\{exp} (ДЛЯ ВЫРАЖЕНИЙ), ОТКРЫВАЮЩАЯ СКОБКА,
СНОВА \\{exp}, ЗАКРЫВАЮЩАЯ СКОБКА, И ПОСЛЕДУЮЩИЕ ВЫРЕЗКИ, КОТОРЫЕ НЕ БЫЛИ
ЕЩЕ СЧИТАНЫ СИНТАКСИЧЕСКИМ АНАЛИЗАТОРОМ.  (зНАКИ \.+ И \.-  УКАЗЫВАЮТ, ЧТО
\TEX/ ДОЛЖЕН ВОЙТИ В МАТЕМАТИЧЕСКУЮ МОДУ ЛИБО ВЫЙТИ ИЗ НЕЕ НА ГРАНИЦЕ ВЫРЕЗКИ.
сИМВОЛ \.* ОТМЕЧАЕТ ТЕКУЩУЮ ПОЗИЦИЮ АНАЛИЗАТОРА.)
дАЛЕЕ ПРИМЕНЯЕТСЯ ПРАВИЛО 11, И ПОСЛЕДОВАТЕЛЬНОСТЬ $(\,exp\,)$
СВЕРТЫВАЕТСЯ ДО \\{exp} И ТАК ДАЛЕЕ.  в КОНЦЕ КОНЦОВ
ВЕСЬ \CEE/-ТЕКСТ ОКАЗЫВАЕТСЯ ОДНОЙ БОЛЬШОЙ ВЫРЕЗКОЙ ТИПА \\{function}.

иНОГДА ВСЕ ИДЕТ НЕ ТАК ГЛАДКО, И ВЫ ПОЛУЧАЕТЕ ГРУППУ СТРОК, СВАЛЕННЫХ В
ОДНУ КУЧУ.  эТО ЗНАЧИТ, ЧТО \.{CWEAVE} НЕ СМОГ ПЕРЕВАРИТЬ
ЧТО-ТО В ВАШЕМ \CEE/-КОДЕ.  нАПРИМЕР, ПУСТЬ
`\.{@<Argument definitions@>}' ЗАЙМЕТ МЕСТО `\.{char **argv;}' В
ПРОГРАММЕ, УПОМЯНУТОЙ ВЫШЕ. в ЭТОМ СЛУЧАЕ \.{CWEAVE} БУДЕТ СЛЕГКА
ОЗАДАЧЕН, ПОСКОЛЬКУ СЧИТАЕТ, ЧТО ИМЕНА СЕКЦИЙ ВСЕГО ЛИШЬ
ТОЛЬКО  \\{exp}.  пОЭТОМУ \TEX/'У БУДЕТ ПРЕДПИСАНО ВЫВЕСТИ
`\X2:Argument declarations\X' В ТОЙ ЖЕ САМОЙ СТРОКЕ, ЧТО И
`$\\{main}(\\{argc},\39\\{argv}{}$)'.
в ЭТОМ СЛУЧАЕ МОЖНО ПОМОЧЬ \.{CWEAVE}, ПОМЕЩАЯ `\.{@/}' ПОСЛЕ
`\.{main(argc,argv)}'.

\.{CWEAVE} АВТОМАТИЧЕСКИ ВСТАВЛЯЕТ НЕБОЛЬШОЙ ПРОМЕЖУТОК МЕЖДУ
ОПИСАНИЯМИ И ПЕРВЫМ ОПЕРАТОРОМ БЛОКА. вОТ ОДИН СПОСОБ ЛОКАЛЬНО ЕГО
ОТМЕНИТЬ:
$$\vbox{\halign{#\hfil\cr
\.{int x;@+@t\}\\6\{@>}\cr
\.{@<Other locals@>@;@\#}\cr}}$$
`\.{@\#}' ПОМЕСТИТ ДОПОЛНИТЕЛЬНЫЙ ПРОБЕЛ ПОСЛЕ `$\langle\,$Other locals$\,\rangle$'.

\section пРИЛОЖЕНИЯ.

кАК ПРИМЕР РЕАЛЬНОЙ ПРОГРАММЫ, НАПИСАННОЙ В \.{CWEB}, пРИЛОЖЕНИЕ~A
СОДЕРЖИТ ФРАГМЕНТЫ ПРОГРАММ, ВХОДЯЩИХ В СОСТАВ САМОЙ СИСТЕМЫ \.{CWEB}.
тЕ ИЗ ЧИТАТЕЛЕЙ, КТО ТЩАТЕЛЬНО ИЗУЧАТ ЛИСТИНГИ В ЭТОМ ПРИЛОЖЕНИИ,
СМОГУТ ГЛУБОКО ПРОЧУВСТВОВАТЬ ОСНОВНЫЕ ИДЕИ \.{CWEB}.

пРИЛОЖЕНИЕ~B  --- ЭТО ФАЙЛ ОПРЕДЕЛЕНИЙ, КОТОРЫЕ НАСТРАИВАЮТ \TEX/ НА
РАБОТУ С ВЫВОДОМ \.{CWEAVE}, А В пРИЛОЖЕНИИ~C ОБСУЖДАЕТСЯ, КАК
ИСПОЛЬЗОВАТЬ НЕКОТОРЫЕ ИЗ ЭТИХ МАКРОСОВ ДЛЯ ИЗМЕНЕНИЯ ФОРМАТА ВЫВОДА.

``пОЛНАЯ'' ВЕРСИЯ ЭТОГО РУКОВОДСТВА, КОТОРАЯ МОЖЕТ БЫТЬ СГЕНЕРИРОВАНА ИЗ
ИСХОДНЫХ ТЕКСТОВ \.{CWEB} КОМАНДОЙ \UNIX/ \.{make} \.{fullmanual},
СОДЕРЖИТ ТАКЖЕ ПРИЛОЖЕНИЯ D, E, И~F, ПРЕДСТАВЛЯЮЩИЕ СОБОЙ ПОЛНЫЕ
ИСХОДНЫЕ ТЕКСТЫ \.{CTANGLE} И \.{CWEAVE}.

\vfil\eject\titletrue

\def\runninghead{пРИЛОЖЕНИЕ A --- ФОРМАТ ИСХОДНОГО ФАЙЛА {\tentt CWEB}}
\section пРИЛОЖЕНИЕ~A: фРАГМЕНТЫ ПРОГРАММ \.{CWEB}.

эТО ПРИЛОЖЕНИЕ СОДЕРЖИТ ЧЕТЫРЕ ЛИСТИНГА.
пЕРВЫЙ СОДЕРЖИТ ВХОДНЫЕ ДАННЫЕ ДЛЯ \.{CWEB}, ПО КОТОРЫМ ГЕНЕРИРУЮТСЯ
СЕКЦИИ~12--15 ФАЙЛА~\.{common.w}, КОТОРЫЙ СОДЕРЖИТ ПОДПРОГРАММЫ, ОБЩИЕ
ДЛЯ \.{CWEAVE} И~\.{CTANGLE}. оТМЕТИМ, ЧТО НЕКОТОРЫЕ СТРОКИ СОДЕРЖАТ
ОТСТУПЫ, ПОДЧЕРКИВАЮЩИЕ СТРУКТУРУ ПРОГРАММЫ; ОТСТУПЫ ЭТИ ИГНОРИРУЮТСЯ
КАК  \.{CWEAVE}, ТАК И \.{CTANGLE}, НО ПОЛЬЗОВАТЕЛИ НАХОДЯТ, ЧТО ФАЙЛЫ
\.{CWEB} ГОРАЗДО ЛЕГЧЕ ВОСПРИНИМАЮТСЯ, ЕСЛИ В НИХ ИМЕЮТСЯ ТАКИЕ ОТСТУПЫ.


вТОРОЙ И ТРЕТИЙ ЛИСТИНГИ СОДЕРЖАТ СООТВЕТСТВУЮЩИЕ ФРАГМЕНТЫ
\CEE/-КОДА, СГЕНЕРИРОВАННОГО \.{CTANGLE} И ТЕКСТА В ФОРМАТЕ \TEX/,
ПОЛУЧЕННОГО \.{CWEAVE} ПРИ ОБРАБОТКЕ \.{common.w}.
чЕТВЕРТЫЙ ЛИСТИНГ ДЕМОНСТРИРУЕТ, КАК БУДЕТ ВЫГЛЯДЕТЬ ЭТОТ ВЫХОДНОЙ ФАЙЛ
НА БУМАГЕ.

\vskip 6pt
\begingroup \def\tt{\eighttt} \baselineskip9pt
\verbatim
@ Procedure |prime_the_change_buffer|
sets |change_buffer| in preparation for the next matching operation.
Since blank lines in the change file are not used for matching, we have
|(change_limit==change_buffer && !!changing)| if and only if
the change file is exhausted. This procedure is called only when
|changing| is 1; hence error messages will be reported correctly.

@c
void
prime_the_change_buffer()
{
  change_limit=change_buffer; /* this value is used if the change file ends */
  @<Skip over comment lines in the change file; |return| if end of file@>;
  @<Skip to the next nonblank line; |return| if end of file@>;
  @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>;
}

@ While looking for a line that begins with \.{@@x} in the change file, we
allow lines that begin with \.{@@}, as long as they don't begin with \.{@@y},
\.{@@z} or \.{@@i} (which would probably mean that the change file is fouled up).

@<Skip over comment lines in the change file...@>=
while(1) {
  change_line++;
  if (!!input_ln(change_file)) return;
  if (limit<buffer+2) continue;
  if (buffer[0]!!='@@') continue;
  if (xisupper(buffer[1])) buffer[1]=tolower(buffer[1]);
  if (buffer[1]=='x') break;
  if (buffer[1]=='y' || buffer[1]=='z' || buffer[1]=='i') {
    loc=buffer+2;
    err_print("!! Missing @@x in change file");
@.Missing @@x...@>
  }
}

@ Here we are looking at lines following the \.{@@x}.

@<Skip to the next nonblank line...@>=
do {
  change_line++;
  if (!!input_ln(change_file)) {
    err_print("!! Change file ended after @@x");
@.Change file ended...@>
    return;
  }
} while (limit==buffer);

@ @<Move |buffer| and |limit| to |change_buffer| and |change_limit|@>=
{
  change_limit=change_buffer-buffer+limit;
  strncpy(change_buffer,buffer,limit-buffer+1);
}

!endgroup
\endgroup
\vfill\eject

\def\runninghead{пРИЛОЖЕНИЕ A  --- ВЫВОД {\tentt CTANGLE}}

зДЕСЬ ПРИВЕДЕНА ПОРЦИЯ \CEE/-КОДА, СГЕНЕРИРОВАННОГО \.{CTANGLE}, КОТОРЫЙ
СООТВЕТСТВУЕТ ИСХОДНОМУ ТЕКСТУ НА ПРЕДЫДУЩЕЙ СТРАНИЦЕ.  оБРАТИТЕ ВНИМАНИЕ,
ЧТО СЕКЦИИ~13, 14 И~15 БЫЛИ "ВПЛЕТЕНЫ" В СЕКЦИЮ~12.

\vskip6pt
\begingroup \def\tt{\eighttt} \baselineskip9pt
\verbatim
/*:9*//*12:*/
#line 247 "common.w"

void
prime_the_change_buffer()
{
change_limit= change_buffer;
/*13:*/
#line 261 "common.w"

while(1){
change_line++;
if(!!input_ln(change_file))return;
if(limit<buffer+2)continue;
if(buffer[0]!!='@')continue;
if(xisupper(buffer[1]))buffer[1]= tolower(buffer[1]);
if(buffer[1]=='x')break;
if(buffer[1]=='y'||buffer[1]=='z'||buffer[1]=='i'){
loc= buffer+2;
err_print("!! Missing @x in change file");

}
}

/*:13*/
#line 252 "common.w"
;
/*14:*/
#line 278 "common.w"

do{
change_line++;
if(!!input_ln(change_file)){
err_print("!! Change file ended after @x");

return;
}
}while(limit==buffer);

/*:14*/
#line 253 "common.w"
;
/*15:*/
#line 288 "common.w"

{
change_limit= change_buffer-buffer+limit;
strncpy(change_buffer,buffer,limit-buffer+1);
}

/*:15*/
#line 254 "common.w"
;
}

/*:12*//*16:*/
!endgroup
\endgroup
\vfill\eject

\def\runninghead{пРИЛОЖЕНИЕ A --- ВЫВОД {\tentt CWEAVE}}

сООТВЕТСТВУЮЩИЙ ОТРЫВОК \.{common.tex} ВЫГЛЯДИТ ТАК:

\vskip6pt
\begingroup \def\tt{\eighttt} \baselineskip9pt
\verbatim
\M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
Since blank lines in the change file are not used for matching, we have
\PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
the change file is exhausted. This procedure is called only when
\PB{\\{changing}} is 1; hence error messages will be reported correctly.
!vskip-.5!baselineskip
\Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
change file ends }\6
\X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
\X;\6
\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
\PB{\\{change\_limit}}\X;\6
\4${}\}{}$\2\par
\fi
!vskip-.5!baselineskip
\M{13}While looking for a line that begins with \.{@x} in the change file, we
allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
\.{@z} or \.{@i} (which would probably mean that the change file is fouled up).
!vskip-.5!baselineskip
\Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
of file\X${}\E{}$\6
\&{while} (\T{1})\5
${}\{{}$\1\6
${}\\{change\_line}\PP;{}$\6
\&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\1\5
\&{return};\2\6
\&{if} ${}(\\{limit}<\\{buffer}+\T{2}){}$\1\5
\&{continue};\2\6
\&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
\&{continue};\2\6
\&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
\&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
\&{break};\2\6
\&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
\T{1}]\E\.{'i'}){}$\5
${}\{{}$\1\6
${}\\{loc}\K\\{buffer}+\T{2};{}$\6
\\{err\_print}(\.{"!!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
\U12.\fi
!vskip-.5!baselineskip
\M{14}Here we are looking at lines following the \.{@x}.
!vskip-.5!baselineskip
\Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
\E{}$\6
\&{do}\5
${}\{{}$\1\6
${}\\{change\_line}\PP;{}$\6
\&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
${}\{{}$\1\6
\\{err\_print}(\.{"!!\ Change\ file\ ended}\)\.{\ after\ @x"});\6
\&{return};\6
\4${}\}{}$\2\6
\4${}\}{}$\2\5
\&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
\U12.\fi
!vskip-.5!baselineskip
\M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
and \PB{\\{change\_limit}}\X${}\E{}$\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
\T{1});{}$\6
\4${}\}{}$\2\par
\Us12\ET16.\fi
!endgroup
\endgroup
\vfil\eject

\def\runninghead{пРИЛОЖЕНИЕ A --- ОКОНЧАТЕЛЬНЫЙ ДОКУМЕНТ}

а ВОТ ТАК ЭТОТ ЖЕ САМЫЙ ФРАГМЕНТ ВЫГЛЯДИТ ПРИ ПЕЧАТИ.

\M{12}Procedure \PB{\\{prime\_the\_change\_buffer}}
sets \PB{\\{change\_buffer}} in preparation for the next matching operation.
Since blank lines in the change file are not used for matching, we have
\PB{$(\\{change\_limit}\E\\{change\_buffer}\W\R\\{changing})$} if and only if
the change file is exhausted. This procedure is called only when
\PB{\\{changing}} is 1; hence error messages will be reported correctly.

\Y\B\&{void} \\{prime\_the\_change\_buffer}(\,)\1\1\2\2\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}{}$;\C{ this value is used if the
change file ends }\6
\X13:Skip over comment lines in the change file; \PB{\&{return}} if end of file%
\X;\6
\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X;\6
\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}} and %
\PB{\\{change\_limit}}\X;\6
\4${}\}{}$\2\par
\fi

\M{13}While looking for a line that begins with \.{@x} in the change file, we
allow lines that begin with \.{@}, as long as they don't begin with \.{@y},
\.{@z} or \.{@i} (which would probably mean that the change file is fouled up).

\Y\B\4\X13:Skip over comment lines in the change file; \PB{\&{return}} if end
of file\X${}\E{}$\6
\&{while} (\T{1})\5
${}\{{}$\1\6
${}\\{change\_line}\PP;{}$\6
\&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\1\5
\&{return};\2\6
\&{if} ${}(\\{limit}<\\{buffer}+\T{2}){}$\1\5
\&{continue};\2\6
\&{if} ${}(\\{buffer}[\T{0}]\I\.{'@'}){}$\1\5
\&{continue};\2\6
\&{if} (\\{xisupper}(\\{buffer}[\T{1}]))\1\5
${}\\{buffer}[\T{1}]\K\\{tolower}(\\{buffer}[\T{1}]);{}$\2\6
\&{if} ${}(\\{buffer}[\T{1}]\E\.{'x'}){}$\1\5
\&{break};\2\6
\&{if} ${}(\\{buffer}[\T{1}]\E\.{'y'}\V\\{buffer}[\T{1}]\E\.{'z'}\V\\{buffer}[%
\T{1}]\E\.{'i'}){}$\5
${}\{{}$\1\6
${}\\{loc}\K\\{buffer}+\T{2};{}$\6
\\{err\_print}(\.{"!\ Missing\ @x\ in\ cha}\)\.{nge\ file"});\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
\U12.\fi

\M{14}Here we are looking at lines following the \.{@x}.

\Y\B\4\X14:Skip to the next nonblank line; \PB{\&{return}} if end of file\X${}%
\E{}$\6
\&{do}\5
${}\{{}$\1\6
${}\\{change\_line}\PP;{}$\6
\&{if} ${}(\R\\{input\_ln}(\\{change\_file})){}$\5
${}\{{}$\1\6
\\{err\_print}(\.{"!\ Change\ file\ ended}\)\.{\ after\ @x"});\6
\&{return};\6
\4${}\}{}$\2\6
\4${}\}{}$\2\5
\&{while} ${}(\\{limit}\E\\{buffer}){}$;\par
\U12.\fi

\M{15}\B\X15:Move \PB{\\{buffer}} and \PB{\\{limit}} to \PB{\\{change\_buffer}}
and \PB{\\{change\_limit}}\X${}\E{}$\6
${}\{{}$\1\6
${}\\{change\_limit}\K\\{change\_buffer}-\\{buffer}+\\{limit};{}$\6
${}\\{strncpy}(\\{change\_buffer},\39\\{buffer},\39\\{limit}-\\{buffer}+%
\T{1});{}$\6
\4${}\}{}$\2\par
\Us12\ET16.\fi

\vfil\eject\titletrue
\rightskip=0pt % get out of C mode (cf. \B)
\sfcode`;=1500 \pretolerance 200 \hyphenpenalty 50 \exhyphenpenalty 50

\def\runninghead{пРИЛОЖЕНИЕ B --- ФОРМАТИРУЮЩИЕ МАКРОСЫ}
\section пРИЛОЖЕНИЕ~B: ФАЙЛ \.{cwebmac.tex}.
эТОТ ФАЙЛ РАСШИРЯЕТ ФОРМАТ ``plain \TEX/'' ОПРЕДЕЛЕНИЯМИ, НЕОБХОДИМЫМИ
ДЛЯ ОБРАБОТКИ ВЫВОДА \.{CWEAVE}.

\vskip6pt
\begingroup \def\tt{\eighttt} \baselineskip9pt
\def\printmacs{\input cwebmac}
\verbatim
!printmacs
!endgroup
\endgroup
\vfill\eject

\def\runninghead{пРИЛОЖЕНИЕ C --- ЗАМЕЧАНИЯ ПО ФОРМАТИРОВАНИЮ}
\section пРИЛОЖЕНИЕ~C: кАК ПОЛЬЗОВАТЬСЯ МАКРОСАМИ \.{CWEB}.
мАКРООПРЕДЕЛЕНИЯ, СОДЕРЖАЩИЕСЯ В \.{cwebmac}, ОБЕСПЕЧИВАЮТ ПОЛУЧЕНИЕ
ВЫВОДА В РАЗЛИЧНОМ ФОРМАТЕ БЕЗ КОРРЕКТИРОВКИ РЕЗУЛЬТАТА РАБОТЫ
\.{CWEAVE}, И ЦЕЛЬ ЭТОГО ПРИЛОЖЕНИЯ --- РАЗ®ЯСНИТЬ НЕКОТОРЫЕ ИЗ
ВОЗМОЖНОСТЕЙ.

\def\point#1.{\yskip\indent#1.\quad\ignorespaces}

\point 1. в ДОПОЛНЕНИЕ К СТАНДАРТНЫМ ШРИФТАМ ФОРМАТА \.{PLAIN} ВВОДЯТСЯ
ЧЕТЫРЕ НОВЫХ: МОЖНО ВВЕСТИ `\.{\{\\mc UNIX\}}' И ПОЛУЧИТЬ {\mc UNIX},
ВЫВЕДЕННОЕ ПРОПИСНЫМИ БУКВАМИ СРЕДНЕГО РАЗМЕРА (medium-size caps);
ТАКЖЕ МОЖНО ЗАДАТЬ `\.{\{\\sc STUFF\}}' ДЛЯ
НАБОРА {\sc STUFF} ШРИФТОМ "МАЛЫЕ ПРОПИСНЫЕ" (small caps);
ПОМИМО ЭТОГО МОЖНО ВЫБРАТЬ ШРИФТЫ УВЕЛИЧЕННОГО РАЗМЕРА
\.{\\titlefont} И \.{\\ttitlefont} ДЛЯ ЗАГОЛОВКОВ ДОКУМЕНТА, ГДЕ
\.{\\ttitlefont} ОПРЕДЕЛЯЕТ ШРИФТ ТИПА "ПИШУЩАЯ МАШИНКА".
мАКРООПРЕДЕЛЕНИЯ \.{\\UNIX/} И \.{\\CEE/} ОБОЗНАЧАЮТ \UNIX/ И \CEE/,
НАБРАННЫЕ  СРЕДНИМИ ПРОПИСНЫМИ БУКВАМИ.

\point 2. кОГДА В ТЕКСТЕ \TEX/ УПОМИНАЕТСЯ ИДЕНТИФИКАТОР,  ОБЫЧНО ЭТО
ВЫГЛЯДИТ КАК `\.{|identifier|}'. нО ТАКЖЕ ВОЗМОЖНА КОНСТРУКЦИЯ
`\.{\\\\\{identifier\}}'. рЕЗУЛЬТАТ БУДЕТ ВЫГЛЯДЕТЬ ОДИНАКОВО,
НО ВТОРОЙ ВАРИАНТ НЕ ПОМЕЩАЕТ \\{identifier} В ИНДЕКС, ПОСКОЛЬКУ НЕ
БУДЕТ ОБРАБАТЫВАТЬСЯ \.{CWEAVE} КАК КОНСТРУКЦИЯ \CEE/. кРОМЕ ТОГО, ВО
ВТОРОМ СЛУЧАЕ ПРИДЕТСЯ ПОМЕСТИТЬ `\.{\\}' ПЕРЕД КАЖДЫМ СИМВОЛОМ
ПОДЧЕРКИВАНИЯ, ВХОДЯЩИМ В ИДЕНТИФИКАТОР.

\point 3. дЛЯ ПОЛУЧЕНИЯ СТИЛЯ "ПИШУЩАЯ МАШИНКА", ВРОДЕ `\.{CWEB}', МОЖНО
ВОСПОЛЬЗОВАТЬСЯ МАКРОСОМ `\.{\\.}' (НАПРИМЕР, `\.{\\.\{CWEB\}}').
зАДАВАЯ АРГУМЕНТ ЭТОГО МАКРОСА, СЛЕДУЕТ ВСТАВИТЬ `\.{\\}' ПЕРЕД
СИМВОЛАМИ, КОТОРЫЕ ПЕРЕЧИСЛЕНЫ В ПУНКТЕ `special string characters'
ИНДЕКСА \.{CWEAVE}, Т.Е., ПЕРЕД СИМВОЛОМ `\.{\\}', ЗНАКОМ ДОЛЛАРА
И ПР. пОЯВЛЕНИЕ В ТЕКСТЕ `\.{\\\ }' ПРИВЕДЕТ К ВСТАВКЕ СИМВОЛА
"ВИДИМОГО ПРОБЕЛА"; ЧТОБЫ ПОЛУЧИТЬ ОБЫКНОВЕННЫЙ ПРОБЕЛ ПОСЛЕ КОМАНДНОЙ
ПОСЛЕДОВАТЕЛЬНОСТИ, ИСПОЛЬЗУЙТЕ `\.{\{\ \}}'. еСЛИ СТРОКА СЛИШКОМ
ДЛИННАЯ, ОНА МОЖЕТ БЫТЬ РАЗБИТА НА ЧАСТИ С ПОМОЩЬЮ `\.{\\)}'\,; ЕСЛИ
\TEX/ БУДЕТ ВЫНУЖДЕН ПЕРЕНЕСТИ СТРОКУ, ОН ЕЕ РАЗДЕЛИТ НА ЭТОМ СИМВОЛЕ,
ИСПОЛЬЗУЯ `\.{\\}' КАК СИМВОЛ ПЕРЕНОСА.

\point 4. тРИ КОМАНДНЫХ СЛОВА: \.{\\pagewidth}, \.{\\pageheight},
И \.{\\fullpageheight} МОГУТ БЫТЬ ПЕРЕОПРЕДЕЛЕНЫ В СЕКЦИИ-ПРЕАМБУЛЕ,
НАЧИНАЮЩЕЙ \.{CWEB}-ФАЙЛ, ДЛЯ ЗАДАНИЯ НУЖНЫХ РАЗМЕРОВ СТРАНИЦЫ.
зНАЧЕНИЯ ПО УМОЛЧАНИЮ
$$\lpile{\.{\\pagewidth=6.5in}\cr
  \.{\\pageheight=8.7in}\cr
  \.{\\fullpageheight=9in}\cr}$$
ИСПОЛЬЗОВАНЫ ПРИ ПОДГОТОВКЕ ЭТОГО РУКОВОДСТВА; \.{\\fullpageheight}
ПОЛУЧАЕТСЯ СЛОЖЕНИЕМ \.{\\pageheight} С РАЗМЕРОМ ДОПОЛНИТЕЛЬНОГО ЗАГОЛОВКА
И НОМЕРА НАВЕРХУ КАЖДОЙ СТРАНИЦЫ. пОСЛЕ ИЗМЕНЕНИЯ ХОТЯ БЫ ОДНОГО ИЗ ЭТИХ
ПАРАМЕТРОВ СЛЕДУЕТ НЕМЕДЛЕННО ВЫЗВАТЬ \.{\\setpage}.

\point 5. мАКРОС \.{\\pageshift} ОПРЕДЕЛЯЕТ ВЕЛИЧИНУ, НА КОТОРУЮ
ПРАВОСТОРОННИЕ СТРАНИЦЫ (Т.Е., С НЕЧЕТНЫМИ НОМЕРАМИ) БУДУТ СДВИНУТЫ ПО
ОТНОШЕНИЮ К ЛЕВОСТОРОННИМ (ЧЕТНЫЕ НОМЕРА). иЗМЕНЯЯ ЭТУ ВЕЛИЧИНУ, МОЖНО
ПОЛУЧИТЬ ДВУСТОРОННИЙ ВЫВОД, В КОТОРОМ НОМЕРА СТРАНИЦ БУДУТ РАСПОЛАГАТЬСЯ НА
ПРОТИВОПОЛОЖНЫХ СТОРОНАХ ЛИСТА.

\point 6. сОДЕРЖИМОЕ \.{\\title} ПЕЧАТАЕТСЯ ВВЕРХУ КАЖДОЙ СТРАНИЦЫ
МАЛЫМИ ПРОПИСНЫМИ БУКВАМИ; ПО УМОЛЧАНИЮ ЭТО \.{\\jobname}.

\point 7. оБЫЧНО ПЕРВОЙ СТРАНИЦЕ ПРИСВАИВАЕТСЯ НОМЕР 1. чТОБЫ НАЧАТЬ СО
СТРАНИЦЫ 16, ПОМЕСТИВ ОГЛАВЛЕНИЕ НА СТРАНИЦЕ 15, ИСПОЛЬЗУЙТЕ
`\.{\\def\\contentspagenumber\{15\}}
\.{\\pageno=\\contentspagenumber} \.{\\advance\\pageno by 1}'.

\point 8. кОМАНДНОЕ СЛОВО \.{\\iftitle} БУДЕТ ПОДАВЛЯТЬ ВЫВОД
КОЛОНТИТУЛА, ЕСЛИ ЗАДАНО `\.{\\titletrue}'. оБЫЧНОЕ ЗНАЧЕНИЕ ---
\.{\\titlefalse}, ЗА ИСКЛЮЧЕНИЕМ ОГЛАВЛЕНИЯ, ТАК ЧТО СТРАНИЦЫ ОГЛАВЛЕНИЯ
КАК ПРАВИЛО НЕ НУМЕРУЮТСЯ.

дЛЯ ПРИДАНИЯ ГИБКОСТИ ПРОЦЕССУ ГЕНЕРАЦИИ ОГЛАВЛЕНИЯ СЛУЖАТ СЛЕДУЮЩИЕ
МАКРОСЫ: \.{\\topofcontents} ВЫЗЫВАЕТСЯ НЕПОСРЕДСТВЕННО ПЕРЕД
СЧИТЫВАНИЕМ ИНФОРМАЦИИ ОГЛАВЛЕНИЯ, И \.{\\botofcontents} --- ПОСЛЕ ЭТОГО.
тИПИЧНОЕ ОПРЕДЕЛЕНИЕ:
$$\lpile{\.{\\def\\topofcontents\{\\null\\vfill}\cr
  \.{ { }\\titlefalse \% include headline on the contents page}\cr
  \.{ { }\\def\\rheader\{\\mainfont The \{\\tt CWEAVE\}{ }processor\\hfil\}}\cr
  \.{ { }\\centerline\{\\titlefont The \{\\ttitlefont CWEAVE\}{ }processor\}}\cr
  \.{ { }\\vskip 15pt \\centerline\{(Version 3.0)\}{ }\\vfill\}}\cr}$$
пЕРЕОПРЕДЕЛИТЬ \.{\\rheader}, ЯВЛЯЮЩЕЕСЯ КОЛОНТИТУЛОМ ПРАВОСТОРОННИХ СТРАНИЦ,
БУДЕТ В ЭТОМ СЛУЧАЕ ДОСТАТОЧНО, ЧТОБЫ РАЗМЕСТИТЬ НУЖНУЮ ИНФОРМАЦИЮ В ВЕРХНЕЙ
ЧАСТИ СТРАНИЦЫ ОГЛАВЛЕНИЯ.

\point 9. дАННЫЕ ОГЛАВЛЕНИЯ ВЫВОДЯТСЯ В ФАЙЛ, КОТОРЫЙ СЧИТЫВАЕТСЯ ПОСЛЕ
ОБРАБОТКИ ИНДЕКСА; КАЖДОЙ ЗАГЛАВНОЙ СЕКЦИИ СООТВЕТСТВУЕТ ОДНА СТРОКА.
фАЙЛ \.{common.toc} МОЖЕТ ВЫГЛЯДЕТЬ ТАК:
$$\lpile{\.{\\ZZ \{Introduction\}\{0\}\{1\}\{23\}}\cr
  \.{\\ZZ \{The character set\}\{2\}\{5\}\{24\}}\cr}$$
И Т.Д. мАКРОС \.{\\topofcontents} МОЖЕТ ПЕРЕОПРЕДЕЛИТЬ
\.{\\ZZ}, ТАК ЧТО ИНФОРМАЦИЯ МОЖЕТ БЫТЬ ВЫВЕДЕНА В ЛЮБОМ НУЖНОМ ФОРМАТЕ.

\point 10. иНОГДА БЫВАЕТ ЖЕЛАТЕЛЬНО ЛИБО НЕОБХОДИМО РАЗДЕЛИТЬ ВЫВОД
\.{CWEAVE} НА ПОДФАЙЛЫ, КОТОРЫЕ МОГУТ ОБРАБАТЫВАТЬСЯ РАЗДЕЛЬНО.
нАПРИМЕР, ЛИСТИНГ \TEX/'А ПРЕВЫШАЕТ 500 СТРАНИЦ, ЧЕГО ВПОЛНЕ ДОСТАТОЧНО
ДЛЯ ИСЧЕРПАНИЯ ВОЗМОЖНОСТЕЙ МНОГИХ ПЕЧАТАЮЩИХ УСТРОЙСТВ И/ИЛИ ПРОГРАММ.
кОГДА ОЧЕНЬ БОЛЬШОЙ ДОКУМЕНТ НЕ РАЗДЕЛЕН НА БОЛЕЕ МЕЛКИЕ ЧАСТИ,
ПОПЫТКА ОБРАБОТАТЬ ЕГО ЦЕЛИКОМ МОЖЕТ БЫТЬ СВЕДЕНА НА НЕТ ЕДИНСТВЕННОЙ
ОШИБКОЙ, ПОСЛЕ КОТОРОЙ ПРИДЕТСЯ НАЧАТЬ ВСЕ СНАЧАЛА.

нИЖЕ ОПИСАН БЕЗОПАСНЫЙ СПОСОБ РАЗДЕЛИТЬ ВЫХОДНОЙ ФАЙЛ \.{CWEAVE} НА ТРИ ЧАСТИ:
пУСТЬ ЧАСТИ НАЗЫВАЮТСЯ $\alpha$, $\beta$, И $\gamma$, ГДЕ КАЖДАЯ ЧАСТЬ
НАЧИНАЕТСЯ ЗАГЛАВНОЙ СЕКЦИЕЙ.
вСЕ МАКРОСЫ ДОЛЖНЫ ОПРЕДЕЛЯТЬСЯ В ПРЕАМБУЛЕ $\alpha$, А КОПИИ ЭТИХ
ПРЕДПИСАНИЙ \TEX/'У ДОЛЖНЫ БЫТЬ ПОМЕЩЕНЫ В НАЧАЛО $\beta$ И $\gamma$.
чТОБЫ ОБРАБАТЫВАТЬ ЧАСТИ РАЗДЕЛЬНО, МЫ ДОЛЖНЫ ПОЗАБОТИТЬСЯ О ДВУХ ВЕЩАХ:
НОМЕРА НАЧАЛЬНЫХ СТРАНИЦ $\beta$ И $\gamma$ ДОЛЖНЫ БЫТЬ СКОРРЕКТИРОВАНЫ,
И ДАННЫЕ ОГЛАВЛЕНИЯ ВСЕХ ТРЕХ ЧАСТЕЙ ДОЛЖНЫ БЫТЬ ОБ®ЕДИНЕНЫ.

фАЙЛ \.{cwebmac} СОДЕРЖИТ ДВА КОМАНДНЫХ СЛОВА: \.{\\contentsfile} И
\.{\\readcontents}, КОТОРЫЕ ОБЛЕГЧАЮТ ВЫПОЛНЕНИЕ НЕОБХОДИМЫХ ДЕЙСТВИЙ.  нАМ
ТРЕБУЕТСЯ ВКЛЮЧИТЬ `\.{\\def\\contentsfile\{cont1\}}' В ПРЕАМБУЛУ $\alpha$,
А `\.{\\def\\contentsfile\{cont2\}}' --- В ПРЕАМБУЛУ $\beta$;
ЭТО ЗАСТАВИТ \TEX/ ВЫВЕСТИ ДАННЫЕ ОГЛАВЛЕНИЙ $\alpha$ И $\beta$ В
ФАЙЛЫ \.{cont1.tex} И \.{cont2.tex}. тЕПЕРЬ В $\gamma$ МЫ УКАЗЫВАЕМ
$$\.{\\def\\readcontents\{\\input cont1 \\input cont2
  \\input \\contentsfile\}}\,,$$
СОБИРАЯ ВСЕ ДАННЫЕ ВМЕСТЕ В НУЖНОМ ПОРЯДКЕ.

тЕМ НЕ МЕНЕЕ, ПО-ПРЕЖНЕМУ СВОЕГО РЕШЕНИЯ ТРЕБУЕТ ПРОБЛЕМА НУМЕРАЦИИ
СТРАНИЦ. оДНИМ ИЗ ЕЕ ПУТЕЙ ЕЕ РЕШЕНИЯ БУДЕТ ВКЛЮЧИТЬ В ПРЕАМБУЛУ $\beta$
СЛЕДУЮЩЕЕ:
$$\lpile{\.{\\message\{Please type the last page number of part 1: \}}\cr
  \.{\\read -1 to \\temp \\pageno=\\temp \\advance\\pageno by 1}\cr}$$
дАЛЕЕ НЕОБХОДИМАЯ ИНФОРМАЦИЯ ПРОСТО ВВОДИТСЯ ПО ЗАПРОСУ \TEX/'А;
АНАЛОГИЧНАЯ КОНСТРУКЦИЯ ПОМЕЩАЕТСЯ В НАЧАЛЕ $\gamma$.

эТОТ МЕТОД, БЕЗУСЛОВНО, МОЖЕТ ИСПОЛЬЗОВАТЬСЯ ДЛЯ РАЗБИЕНИЯ ВЫХОДНОГО
ФАЙЛА НА ПРОИЗВОЛЬНОЕ ЧИСЛО ФРАГМЕНТОВ.

\point 11. вРЕМЕНАМИ  НУЖНО ВКЛЮЧАТЬ В ИНДЕКС ЭЛЕМЕНТЫ, ОФОРМЛЕННЫЕ
ОСОБЫМ ОБРАЗОМ. нАПРИМЕР, НАМ МОЖЕТ ПОНАДОБИТЬСЯ ИМЕТЬ ЭЛЕМЕНТ
ИНДЕКСА ДЛЯ `\TeX'. \.{CWEAVE} ПРЕДОСТАВЛЯЕТ ДВА ПРОСТЫХ СПОСОБА ЗАДАТЬ
ЯВНО ЭЛЕМЕНТ ИНДЕКСА (ПОМИМО ИМЕН И КЛЮЧЕВЫХ СЛОВ):
`\.{@\^}' ДАЕТ РОМАНСКИЙ СТИЛЬ, А `\.{@.}' --- СТИЛЬ "ПИШУЩАЯ МАШИНКА".
нО ЕСЛИ МЫ ПОПЫТАЕМСЯ ВЫВЕСТИ `\TeX' В РОМАНСКОМ СТИЛЕ,
ЗАДАВ `\.{@\^\\TeX@>}', НАМ ПОМЕШАЕТ СИМВОЛ `\.{\\}',
И ЭТОТ ЭЛЕМЕНТ ИНДЕКСА НЕ ПОЯВИТСЯ ВМЕСТЕ С ДРУГИМИ, НАЧИНАЮЩИМИСЯ
НА T.

рЕШЕНИЕМ БУДЕТ ИСПОЛЬЗОВАТЬ КОНСТРУКЦИЮ `\.{@:}', ОПРЕДЕЛИВ МАКРОС,
КОТОРЫЙ ПРОСТО УДАЛЯЕТ КЛЮЧ:
$$\.{\\def\\9\#1\{\}}$$
вЫ МОЖЕТЕ ЗАДАТЬ, К ПРИМЕРУ, `\.{@:TeX\}\{\\TeX@>}' В СВОЕМ \.{CWEB}-ФАЙЛЕ;
\.{CWEAVE} ПОМЕСТИТ ЭТО В ИНДЕКС В АЛФАВИТНОМ ПОРЯДКЕ, СООТВЕТСТВЕННО
КЛЮЧУ, И СГЕНЕРИРУЕТ МАКРОВЫЗОВ `\.{\\9\{TeX\}\{\\TeX\}}', КОТОРЫЙ
ГАРАНТИРУЕТ, ЧТО КЛЮЧ НЕ БУДЕТ НАПЕЧАТАН.

аНАЛОГИЧНО В ИМЕНА СЕКЦИЙ МОЖЕТ ПОМЕЩАТЬСЯ СКРЫТЫЙ МАТЕРИАЛ, ТАК ЧТО ОНИ
МОГУТ БЫТЬ СОРТИРОВАНЫ В ЛЮБОМ НЕОБХОДИМОМ ПОРЯДКЕ.
нЕКОТОРЫЕ ЛЮДИ НАЗЫВАЮТ ПОДОБНЫЕ ТРЮКИ ``special refinements''; ДРУГИЕ
ЗОВУТ ИХ ``kludges''.

\point 12. кОМАНДНОМУ СЛОВУ \.{\\secno} ПРИСВАИВАЕТСЯ НОМЕР
ТЕКУЩЕЙ ОБРАБАТЫВАЕМОЙ СЕКЦИИ.

\point 13. еСЛИ ВЫ ХОТИТЕ ВЫВЕСТИ НА ПЕЧАТЬ ТОЛЬКО СЕКЦИИ, КОТОРЫЕ БЫЛИ
ИЗМЕНЕНЫ (С ПОМОЩЬЮ ФАЙЛА КОРРЕКТИВ) И ОГЛАВЛЕНИЕ,
ПОМЕСТИТЕ КОМАНДУ `\.{\\let\\maybe=\\iffalse}'
В ПРЕАМБУЛУ, ПЕРЕД ПЕРВОЙ СЕКЦИЕЙ ФАЙЛА \.{CWEB}. оБЩЕПРИНЯТОЙ ПРАКТИКОЙ
ЯВЛЯЕТСЯ СДЕЛАТЬ ЕЕ ПЕРВОЙ КОРРЕКТИВОЙ.

\point 14. дЛЯ ПЕЧАТИ НА ДРУГИХ ЯЗЫКАХ (НЕ ПО-АНГЛИЙСКИ), ПЕРЕОПРЕДЕЛИТЕ
МАКРОСЫ \.{\\A}, \.{\\ET}, \.{\\Q}, \.{\\U},
\.{\\ch}, \.{\\fin}, \.{\\con}, \.{\\today}, \.{\\datethis}, И
\.{\\datecontentspage}. сОБСТВЕННО \.{CWEAVE} ИЗМЕНЯТЬ НЕ ТРЕБУЕТСЯ.

\point 15. вЫВОД ОТДЕЛЬНЫХ ЧАСТЕЙ ДОКУМЕНТА МОЖЕТ БЫТЬ ИЗБИРАТЕЛЬНО
ЗАПРЕЩЕН С ПОМОЩЬЮ \.{\\noatl}, \.{\\noinx}, \.{\\nosecs}, \.{\\nocon}.

\point 16. вСЕ ДИАКРИТИЧЕСКИЕ ЗНАКИ И ДРУГИЕ СПЕЦИАЛЬНЫЕ ТЕКСТОВЫЕ
СИМВОЛЫ  ФОРМАТА plain \TEX/ БУДУТ РАБОТАТЬ В ДОКУМЕНТАХ \.{CWEB} В
ТОЧНОСТИ ТАК, КАК ЭТО ОПИСАНО В ГЛАВЕ~9 {\sl The \TEX/book}, С ОДНИМ
ИСКЛЮЧЕНИЕМ. аКЦЕНТ "ТОЧКА" (ОБЫЧНО \.{\\.}) ДОЛЖЕН ВВОДИТЬСЯ КАК \.{\\:}.

\point 17. "зАКОММЕНТИРОВАННЫЕ" СТРОКИ \.{cwebmac.tex} ПРЕДЛАГАЮТ
НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ, КОТОРЫЕ МОГУТ ПРИГОДИТЬСЯ
ПОЛЬЗОВАТЕЛЯМ. нАПРИМЕР, ОДНА ИЗ НИХ ВСТАВЛЯЕТ ПУСТУЮ
СТРАНИЦУ, ЕСЛИ У ВАС ДУПЛЕКСНЫЙ ПРИНТЕР. пРИЛОЖЕНИЯ D, E, И F В ПОЛНОЙ
ВЕРСИИ ЭТОГО РУКОВОДСТВА НАПЕЧАТАНЫ С ИСПОЛЬЗОВАНИЕМ ЗАКОММЕНТИРОВАННОЙ
ОПЦИИ, КОТОРАЯ ЗАМЕНЯЕТ `$\gets$' НА `$=$' В ЛИСТИНГАХ ПРОГРАММ. вЫ
МОЖЕТЕ ПРОСМОТРЕТЬ ЭТИ ПРИЛОЖЕНИЯ, ЧТОБЫ РЕШИТЬ, КАКОЙ ФОРМАТ ВАМ БОЛЬШЕ
НРАВИТСЯ.

\vfill\end
