% % % % % Учебный пример web-файла % % Версия 0.9 % % Автор: к. т. н., Жуков Илья Борисович % 23.03.2013 % % % Домашняя страница: http://ibzh.eko3.ru/index.html % % % Страница файла: http://ibzh.eko3.ru/tex/literate.htm % % % Почта: ibzh@@yandex.ru % % Здесь показаны основные (но не все!) возможности системы литературного программирования. % До первого раздела располагается Limbo, такой текст, который непосредственно переносится в TeX-файл. % Здесь можно определять управляющие последовательности и подключать файлы % Если требуется использовать символ "коммерческое at" ("собаку"), @@, его здесь следует удваивать, % как впрочем, и в любом ином месте файла, иначе он будет воспринят, как первый символ команды web. % % Тем, кто будет изучать сам файл web_exam.web, потребуется некоторое знакомство % с системой TeX, знание хотя бы следующего: % % % -- знак комментария % ~ -- знак неразрывного пробела % \_ -- знак подчёркивания, просто _ -- знак нижнего индекса % \# -- знак # % << и >> -- левая и правая кавычки ёлочкой % \tt и \it -- задают шрифт печатной машинки и курсив, соответственно % { и } -- задают группу, ограничивающую действие команд TeX (в частности, \tt и \it) % \{ и \} -- левая и правая фигурные скобки (только в математическом режиме) % \vert -- знак прямой вертикальной черты, допустим только в математическом режиме % \backslash -- обратная косая черта, допустима только в математическом режиме % $ -- знак переключения в математический режим или обратно из него. % % \input web_titl.tex @s Команда @s предназначена для исключения строк из вывода как rutangle, так и ruweave. @s Вообще она была введена для того, чтобы можно было в любом месте web-файла @s нарисовать разделительную линию, которая не попала бы ни в pas-файл, ни в tex-файл. @s ───────────────────────────────────────────────────────────────────────────────────────────── @* Это первый раздел. Первое предложение раздела, начинающегося со <<@@*>>, % Помните, что собаку нужно удваивать? идёт в оглавление. Предложение должно заканчиваться точкой и быть не слишком длинным, иначе получите сообщения об ошибках. Разделы со звёздочкой всегда начинаются с новой страницы. @ Если раздел без заголовка, то он начинается со знака <<@@>>, за которым следует пробел или возврат каретки. Если Вам требуется в тексте символ <<@@>>, то в web-файле его нужно удваивать. Если нужно в тексте отформатировать кусочек программного кода, но при этом он не должен идти в программу, то его заключают между двумя вертикальными линиями. Например, этот кусочек <<{\tt $\vert$x:=y~div~2;$\vert$}>> после форматирования будет выглядеть так <<|x:=y div 2;|>>. Программа начинается с команды <<@@p>> (безымянного модуля). Безымянных модулей может быть несколько, они последовательно объединяются в один большой кусок. @p @<Директивы компилирования@>@; program web_exam; var i:integer; {Определим какой-нибудь индекс} @<Прочие переменные@>@; @<Процедуры@>@; @ Здесь в безымянном модуле между скобками <<{\tt @@<...@@>}>> пишутся названия именованных модулей. Всё содержимое безымянного модуля подставляется в программу при каждом его упоминании. Название может занимать несколько строк (но не очень много). Если записывать имена модулей в программе и не ставить между ними точку с запятой, то они будут записываться подряд, что на печати выглядит не очень хорошо. Поэтому, целесообразно их разделять командой <<{\tt @@;}>>, как показано выше. Один модуль может описываться в нескольких разделах программы, и каждое такое описание начинается с <<{\tt @@<...@@>=}>>. Например, так @<Прочие переменные@>= j:integer; {ещё один индекс} @ Имя модуля можно не прописывать до конца полностью, т. е. вместо <<{\tt @@<Процедуры@@>=}>> записать <<{\tt @@<Проц...@@>=}>>. Урезанное имя должно быть достаточной длины, чтобы подходить только к одному модулю. После обработки weave все сокращённые имена будут представлены полными. Отметим, что имя модуля не должно быть начальной частью имени другого модуля, иначе будет выдано сообщение об ошибке. @<Проц...@>= procedure Печатай_хвост(s:string; от_поз:integer); {Печатает хвост строки |от_поз| до конца} var @<Проч...@>@; {Так мы определим нашу переменную |j|} begin for j:=от_поз to length(s) do begin write(s[j]); end; end; @ @<Проч...@>= k:integer; @ Когда нужно определить несколько именованных модулей подряд без текстовых описаний, нам требуется просто записать {\tt @@ @@<...@@>=}, как это только что показано выше. @ Вообще, из программы комментарии удаляются, поскольку они не важны для компилятора. Однако в паскале есть особый вид комментариев, устанавливающий директивы компиляции. Для них в web используются особые скобки: <<{\tt @@$\{$...@@$\}$}>>. @<Директивы компилирования@>= @{$coperators+ @} @ В web есть скромные средства поддержки макросов. Макросы объявляются одним из следующих способов <<{\tt @@d}~{\it имя}={\it константа} >> <<{\tt @@d}~{\it имя}=={\it команды} >> <<{\tt @@d}~{\it имя(\#)}{\tt}=={\it команды с параметром} >> Имя макроса должно быть длиной не меньше двух символов. В именах различаются прописные и строчные буквы Константы отделяются одним знаком <<{\tt =}>>, макроопределения двумя знаками <<{\tt ==}>>. Макросы могут содержать один параметр, задаваемый в скобках знаком {\tt \#}. Можно задавать форматирование макроса командой <<{\tt @@f}>>: <<{\tt @@f}~{\it имя}{\tt}=={\it имя команды, по образцу которой форматировать} >> Сейчас эти макросы опишем и добавим ещё какую-нибудь функцию @d десять=10 {Пример константы, только один знак <<=>>} @d пиши_десять==write('десять суть ', десять); {должно быть два знака равенства} @d прибавь_десять(#)==#:=#+10; {прибавляет к переменной 10} @d доли_в_процентах== *100/ @f доли_в_процентах==div {форматирование такое же, как и у |div|} @<Проц...@>= procedure ещё_процедура(x:real); begin прибавь_десять(x); x:=3 доли_в_процентах 4; end; @ Иногда требуется дословно передать в программу часть текста без изменений, тогда он заключается между командами <<{\tt @@=...@@>}>>. Чтобы вставить разрыв в программу на паскале используется команда <<{\tt @@$\backslash$}>>, а в текст программы на \TeX\ --- <<{\tt @@/}>> @p begin @={ Текст без изменений }@>@; i:=2; @/ j:=3; @\ k:=i-j; Печатай_хвост('Одна строка ', 5); пиши_десять; readln; end. @ Конечно, полученная нами программа абсолютно бесполезна, но цель данного файла --- показать основные средства для написания программы на языке web, а не получить какой-то полезный продукт. Поэтому читателю стоит не ограничиваться просмотром готового web\_exam.dvi (web\_exam.pdf, web\_exam.ps, или во что он его превратил), но и разобрать сам исходник web\_exam.web. Приведённые выше команды охватывают необходимый минимум для разработки программ в системе web, но ими возможности этой системы не ограничиваются. Если читатель найдёт для себя полезной данную методику написания программ, то ему стоит обратиться к более полным руководствам по системе литературного программирования. Мы же на этом закончим. Нам осталось только вывести указатели, что и будет сделано в следующем разделе со звёздочкой. % Если Вы в TeX не опытны, то пропустите следующий текст до раздела <<Указатели>> \vskip 1cm plus 1filll \def\extlinkcolor{0.0 0.0 1.0}% Цвет ссылки на внешний источник % Начать ссылку на внешний источник \def\bextlink#1{\special{pdf:bann <> >>}\special{pdf:bc [\extlinkcolor]}} % Закончить ссылку на внешний источник \def\eextlink{\special{pdf:ec}\special{pdf: eann}} {\sl \hfill к. т. н., Жуков И. Б. \par \hfill Ленинград, 23 марта 2013 года\par \vskip2em \hfill \bextlink{http://ibzh.eko3.ru/index.html}http://ibzh.eko3.ru\eextlink,\par \hfill \bextlink{mailto://ibzh@@yandex.ru}ibzh@@yandex.ru\eextlink}\par \gdef\MkAutherA#1{{\MkTextBkMrk{#1}% \edef\TextBkMrk{pdf: docinfo << /Author (\TextBkMrk)>>}% \special{\TextBkMrk}}\endgroup} \gdef\MkAuther{\begingroup\catcode`\^^20=12 \MkAutherA} \MkAuther{Жуков\ И.\ Б.} \gdef\MkTitleA#1{{\MkTextBkMrk{#1}% \edef\TextBkMrk{pdf: docinfo << /Title (\TextBkMrk)>>}% \special{\TextBkMrk}}\endgroup} \gdef\MkTitle{\begingroup\catcode`\^^20=12 \MkTitleA} \MkTitle{Учебный\ пример\ web-файла} \gdef\MkKeywordsA#1{{\MkTextBkMrk{#1}% \edef\TextBkMrk{pdf: docinfo << /Keywords (\TextBkMrk)>>}% \special{\TextBkMrk}}\endgroup} \gdef\MkKeywords{\begingroup\catcode`\^^20=12 \MkKeywordsA} \MkKeywords{литературное\ программирование,\ грамотное\ программирование,\ tangle,\ weave,\ примеры} \gdef\MkSubjectA#1{{\MkTextBkMrk{#1}% \edef\TextBkMrk{pdf: docinfo << /Subject (\TextBkMrk)>>}% \special{\TextBkMrk}}\endgroup} \gdef\MkSubject{\begingroup\catcode`\^^20=12 \MkSubjectA} \MkSubject{Учебный\ пример\ использования\ литературного\ программирования} @s ───────────────────────────────────────────────────────────────────────────────────────────── @* Указатели. Если вы не объявите отдельный раздел под указатели, то они с новой страницы не начнутся, а пойдут продолжением предыдущего текста. Средства литературного программирования сами о заголовках для указателей не позаботятся.