commit 9d2526d6985abc1b5c87255a9bbe03eb1094b5ef Author: Linux User Date: Thu May 26 10:14:42 2011 +0800 Initial commit. diff --git a/Architecture.tex b/Architecture.tex new file mode 100644 index 0000000..cec15c3 --- /dev/null +++ b/Architecture.tex @@ -0,0 +1,28 @@ +\chapter{Структура и архитектура информационной системы} + +Модуль вызова системы включает в себя пользовательский интерфейс. Он отвечает за ввод и представление данных. + +Главный класс Source (модуль source.rb) отвечает за основную логику. + +Класс Translator (translator.rb) содержит функцию перевода слов. Логика программы не зависит от языка исходного текста, так как ударения указываются вручную, но словари готовы только для английского языка. + +Класс Morphology сожержит функцию, которая вызывает библиотеку phpmorphy, чтобы получить все словоформы заданного слова. Библиотека phpmorphy распространяется по лицензии LGPL и использует словари Ispell, а также пытается угадать склонение слов. + +Система рассчитана на работу с латинским алфавитом и использует кодировку UTF-8. + +Система получает на входе текстовый документ и выдаёт переведённый текстовый документ. + +\subsection{Формат словарей} + +Словари имеют расширение .txt + +Переводы слов идут сразу после слов. Перед переводами ставится ровно два пробела. + +Количество переводов не ограничено, но выбирается только один. Это поведение может измениться в будущем. + +\begin{verbatim} +cлово + перевод1 + перевод2 + ... +\end{verbatim} \ No newline at end of file diff --git a/Implementation.tex b/Implementation.tex new file mode 100644 index 0000000..1a49d92 --- /dev/null +++ b/Implementation.tex @@ -0,0 +1,7 @@ +\chapter{Реализация} + +​Оболочкой для программы является фреймворк Kohana 3.1. + +Отличительной особенностью Kohana 3.1 является его исключительная модульность. Он реализует модель HMVC. + +На части страниц также используется фреймворк jQuery. Это мощная Javascript библиотека, позволяющая проводить запросы AJAX, реализовывать визуальные эффекты и работать с DOM без оглядки на совместимость браузеров и разницу в вызовах событий. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7256f34 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +all: + xelatex -interaction=nonstopmode Master.tex + bibtex Master.aux + xelatex -interaction=nonstopmode Master.tex + xelatex -interaction=nonstopmode Master.tex + rm -f *.aux *.log *.toc *.bbl *.blg *.out *.idx *.ind *.ilg *~ diff --git a/Master.tex b/Master.tex new file mode 100644 index 0000000..84e5172 --- /dev/null +++ b/Master.tex @@ -0,0 +1,24 @@ +\documentclass[a4paper,14pt]{extreport} +\input{Titlepage} + +\input{Theme} +\input{Objectives} +\input{Terminology} +\input{Review} +\input{Topicality} +\input{Model} +\input{Architecture} +\input{Implementation} + +\chapter{Заключение и перспективы развития} + +Ввиду ограничения по времени полномасштабного тестирования ИС не проводилось. Следовательно, априори предполагается существование серьёзных ошибок, которые будет необходимо исправить. + +Сейчас интерфейс реализован на HTML 5. Это значит, что такие браузеры, как Internet Explorer 8, Firefox 3, Opera 10 не смогут его отобразить нужным образом. Необходимо улучшение интерфейса, повышение совместимости с Internet Explorer 6. + +Также будет полезно совмещение отчётов и управления семинарами в одной Rich Internet Application. + +\bibliographystyle{utf8gost780u} +%\nocite{*} %раскомментировать чтобы получить ВСЮ библиографию +\bibliography{bibliography} +\end{document} diff --git a/Model.tex b/Model.tex new file mode 100644 index 0000000..dbf301a --- /dev/null +++ b/Model.tex @@ -0,0 +1,13 @@ +\chapter{Модель продукта} + +% \begin{figure}[ht] +% \centering +% \includegraphics[angle=90,height=0.7\textheight]{diagram0.jpeg} +% \caption{} +% \end{figure} +% +% \begin{figure}[ht] +% \centering +% \includegraphics[angle=90,width=\textwidth]{diagram1.jpeg} +% \caption{} +% \end{figure} diff --git a/Objectives.tex b/Objectives.tex new file mode 100644 index 0000000..4df6b43 --- /dev/null +++ b/Objectives.tex @@ -0,0 +1,12 @@ +\chapter{Постановка задачи} +Разработать ИС, предоставляющую инструментарий для управления семинарами, проводимыми в КРИПКиПРО. + +Для достижения цели необходимо: + +\begin{enumerate} +\item Собрать пользовательские требования к ИС +\item Провести обзор и анализ существующих ИС, решающих смежные задачи +\item Построить функциональные и ER модели +\item Разработать ИС +\item Протестировать ИС +\end{enumerate} \ No newline at end of file diff --git a/Review.tex b/Review.tex new file mode 100644 index 0000000..b6bd46b --- /dev/null +++ b/Review.tex @@ -0,0 +1,35 @@ +\chapter{Обзор сходных информационных систем} + +​Изучение предметной области дало следующие требования к внедряемой информационной системе: + +Информационная система должна быть написана на языке PHP и использовать базу данных MySQL в качестве хранилища данных. + +ИС должна быть бесплатной. + +ИС должна поддерживать управление событиями. + +В ИС должна быть предусмотрена эскалация привилегий, распространяемая на события. + +ИС должна поддерживать Unicode, чтобы не возникло проблем с кириллицей и совместимостью кодировок. + +ИС должна использовать WYSIWYG редактор. + +По данным критериям было отобрано три программных продукта: + + +Tiki Wiki CMS Groupware +Midgard CMS +Sitellite CMS +(таблица) + +Наличие русскоязычного интерфейса (Tiki - неполный перевод, Midgard - выдаётся по запросу, Sitellite - нет) + + +Возможность представления календаря мероприятий в электронном виде + +Возможность представления календаря мероприятий в печатном виде + +Относительная скорость генерации страниц — базовая конфигурация по сравнению со статической страницей + +\subsection{Выводы} +Ни одна из рассмотренных ИС не удовлетворила предъявленные требования. Было принято решение о разработке собственной системы. diff --git a/Terminology.tex b/Terminology.tex new file mode 100644 index 0000000..5ef3e81 --- /dev/null +++ b/Terminology.tex @@ -0,0 +1,30 @@ +\chapter{Терминология} +\section{AJAX} + +Asynchronous JavaScript and XML, \textit{англ.} Асинхронный JavaScript и XML -- группа не связанных между собой техник, используемых на стороне клиента для создания интерактивных интернет-программ, \cite{ajax}. Термин был введён в 2005м году в статье Джессе Джеймса Гарретта, \cite{ajax-origin}. + +Идея AJAX в том, чтобы расширить роль браузера от ультратонкого клиента, который содержит минимум логики и почти не выполняет вычислений, исключительно представляя информацию пользователю, до толстого клиента, который может самостоятельно работать с данными, полученными от сервера. + +В традиционной модели «тонкий клиент-сервер» клиент должен выполнить запрос (GET или POST) каждый раз для изменения данных. В течение выполнения запроса работа с веб-страницей невозможна, так как после выполнения запроса загружается новая страница. + +Модель AJAX предлагает асинхронное выполнение запросов, не прерывающее работу с данными во время их изменения. Каждый запрос HTTP заменяется запросом к Javascript; всё, что не требует соединения с сервером — проверка данных, редактирование данных, возможно навигация — проводится на стороне клиента. + +Слово «AJAX» было введено как короткий аналог фразы «Асинхронный JavaScript, CSS, DOM и XMLHttpRequest». + +Важнейшей технологией из группы AJAX является вызов Javascript XML\-HttpRequest. Он был реализован в различных браузерах в 2000-2005м годах; в версиях Internet Explorer 5, 5.5 и 6 его роль выполнял модуль ActiveX библиотеки MSXML. В настоящее время ведётся работа над черновиком XMLHttpRequest уровня 2. + +По соображениям безопасности запросы к другим доменам с данного запрещены; это ограничение обходится разными путями, самым простым из которых является HTTP заголовок \verb/Access-Control-Allow-Origin/. + +\section{DOM} +Document Object Model, \textit{англ.} объектная модель документа. + +В языке Javascript это -- объект, содержащий всю информацию о странице (документе). Через манипуляции с DOM сценарии могут управлять страницей и блоками на ней. + +\section{HMVC} +Hierarchical Model-View-Controller, \textit{англ.} иерархические Модель-Вид-Контроллер. + +Каждая тройка модель-вид-контроллер называется триадой. Каждая триада независима и отвечает за один объект, описываемый Моделью. + +Модель и только Модель имеет знания о природе объекта, например, где хранятся данные и как их необходимо проверять. Контроллер отвечает за логику работы с объектом. Он вычисляет значения переменных, инициирует изменение данных, передаёт данные в Вид. Вид отвечает за представление и только за представление данных; в Виде не производится никаких вычислений. + +Каждая триада совершенно независима и может выполняться при отсутствии любой другой. Все запросы к триадам идут через их контроллеры. Любая часть системы может выполнить запрос к любой триаде. Так, вид триады главной страницы может вызвать запросы к триаде рекламного блока, к триаде текстового блока и триаде навигационного блока. При этом модификация, например, навигационного блока сможет проходить независимо от других — а изменения отразятся во всех видах, вызывающих эту триаду. \ No newline at end of file diff --git a/Theme.tex b/Theme.tex new file mode 100644 index 0000000..6636585 --- /dev/null +++ b/Theme.tex @@ -0,0 +1,3 @@ +\chapter{Тема дипломной работы} + +Разработка информационной системы (ИС), предоставляющей инструментарий для управления семинарами, проводимыми в КРИПКиПРО. \ No newline at end of file diff --git a/Titlepage.tex b/Titlepage.tex new file mode 100644 index 0000000..967af2e --- /dev/null +++ b/Titlepage.tex @@ -0,0 +1,146 @@ +\usepackage[T2A]{fontenc} +\usepackage{fontspec} +\usepackage{xunicode} +\usepackage{mathtext} +\usepackage{amsmath} %текст в формулах +\usepackage{xltxtra} +\usepackage{polyglossia}%вместо babel +\setdefaultlanguage{russian} +\defaultfontfeatures{Mapping=tex-text, Scale=MatchLowercase} +\setmainfont{FreeSerif} +\newfontfamily{\cyrillicfont}{FreeSerif} +\setromanfont{FreeSerif} +\setsansfont{FreeSans} +\setmonofont{FreeMono} +\frenchspacing +\usepackage[labelsep=period]{caption} +\usepackage{indentfirst} +\usepackage{rotating} +\usepackage{graphicx} +%\usepackage{listings} +%\lstloadlanguages{Ruby} +%\lstset{extendedchars=false,%надо ставить false всегда при работе с UTF-8 +% commentstyle=\it, +% stringstyle=\bf, +% belowcaptionskip=5pt, +% numbers=left, %нумерация строк +% numberstyle=\tiny, +% stepnumber=3, +% numbersep=5pt, +% breaklines=true, %автоперенос длинных линий +% breakatwhitespace=true}%перенос ТОЛЬКО по пробелам и табуляциям +%\renewcommand{\lstlistingname}{Листинг} + +\usepackage{multirow} + +\usepackage{fncychap} +\ChNameVar{\large} +\ChTitleVar{\Large \rm \bfseries} +%\ChTitleUpperCase %- почему-то не работает +\ChNameUpperCase + +\makeatletter +\let\ps@plain\ps@myheadings%необходимо для содержания; иначе оно всё равно будет использовать стиль plain +\renewcommand{\DOTI}[1]{\CTV\FmTi{#1}\par\nobreak\medskip} +\makeatother + +\setcounter{secnumdepth}{-1} % не хочу нумеровать главы +\setcounter{tocdepth}{2} % глубина оглавления + +\usepackage{geometry} % Меняем поля страницы +\geometry{left=3cm}% левое поле +\geometry{right=2cm}% правое поле +\geometry{top=2cm}% верхнее поле +\geometry{bottom=2cm}% нижнее поле + +\marginparwidth=0cm +%\geometry{right=4cm} + +% Меняем везде перечисления на цифра.цифра +\renewcommand{\theenumi}{\arabic{enumi}.} +\renewcommand{\labelenumi}{\arabic{enumi}.} +\renewcommand{\theenumii}{\arabic{enumii}.} +\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}.} +\renewcommand{\theenumiii}{\arabic{enumiii}.} +\renewcommand{\labelenumiii}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.} + +\renewcommand{\baselinestretch}{1.5}%если поставить меньше, то дроби на строках будут сливаться друг с другом +\righthyphenmin=2 % Минимальное число символов при переносе - 2. + +\pagestyle{myheadings} + +\begin{document} +\renewcommand{\contentsname}{Содержание}%Строго говоря, Оглавление - это когда текст разбит на главы. Когда текст разбит на секции - это Содержание. + +%\begin{titlepage} +{ +\thispagestyle{empty} +\newpage +\centering + +\textbf{ +МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ\\ +ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ\\ +КЕМЕРОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ\\* +Математический факультет\\ +Кафедра ЮНЕСКО по Новым информационным технологиям} + +\vfill + +{\large ДИПЛОМНАЯ РАБОТА} + +\vfill + +<<Автоматизированная система регистрации на семинары в КРИПКиПРО>> + +студента пятого курса, М-065 группы + +Яковлева Александра Яковлевича + +Специальность 010503 - <<Математическое обеспечение и администрирование информационных систем>> + +\vfill + +\begin{flushleft} +Научный руководитель: \\ +К.п.н., доцент \\ +Л. Е. Шмакова\\ +\makebox[5cm]{\hrulefill} +\end{flushleft} + +\vfill + +\begin{table}[ht] +\begin{minipage}[t]{0.5\linewidth}\centering + Работа допущена к защите:\\ + << \makebox[1cm]{\hrulefill} >> \makebox[3cm]{\hrulefill} \number\year г.\\ +Зав. кафедрой ЮНЕСКО по НИТ,\\ +д.-р физ.-мат.наук, профессор\\ +К. Е. Афанасьев\\ +\makebox[5cm]{\hrulefill} +\vspace{\fill} +\end{minipage} +\hspace{0.5cm} +\begin{minipage}[t]{0.5\linewidth}\centering + Работа защищена:\\ +<< \makebox[1cm]{\hrulefill} >> \makebox[3cm]{\hrulefill} \number\year г.\\ +c оценкой \makebox[3.6cm]{\hrulefill} \\ +Председатель ГАК\\ +\makebox[5cm]{\hrulefill}\\ +Члены ГАК:\\ +\makebox[5cm]{\hrulefill}\\ +\makebox[5cm]{\hrulefill}\\ +\makebox[5cm]{\hrulefill} +\end{minipage} +\end{table} + +\vspace{\fill} + +Кемерово \number\year +\clearpage +} +%\end{titlepage} + +\setlength{\parskip}{0ex plus 0.5ex minus 0.2ex} +\tableofcontents +\clearpage diff --git a/Topicality.tex b/Topicality.tex new file mode 100644 index 0000000..6725902 --- /dev/null +++ b/Topicality.tex @@ -0,0 +1 @@ +\chapter{Актуальность работы} diff --git a/bibliography.bib b/bibliography.bib new file mode 100644 index 0000000..e644a3b --- /dev/null +++ b/bibliography.bib @@ -0,0 +1,168 @@ +@BOOK{ajax, +author = "Маклафлин, Б.", +address = "СПб.", +title = "Изучаем Ajax", +publisher = "Питер", +year = 2007, +numpages = 448, +isbn = "978-5-91180-322-3", +language = "russian" +} +@BOOK{rosental, +author = "Розенталь, Д. Э. and Джанджакова, Е. В. and Кабанова, Н. П.", +title = "Справочник по правописанию, произношению, литературному редактированию", +address = "М.", +publisher = "ЧеРо", +year = 1999, +language = "russian" +} +@MISC{ajax-origin, +title = "[Электронный ресурс]", +url = "\underline{http://www.adaptivepath.com/ideas/e000385}" +} +@BOOK{holshevnikov, +author = "Холшевников, В. Е.", +title = "Мысль, вооруженная рифмами", +address = "Л.", +publisher = "ЛГУ", +year = 1987, +language = "russian" +} +@BOOK{gasparov, +author = "Гаспаров, М. Л.", +title = "Современный русский стих: Метрика и ритмика", +address = "М.", +publisher = "ЛГУ", +year = 1974, +language = "russian" +} +@MISC{google-translate-help, +title = "[Электронный ресурс] Переводчик Google -- Часто задаваемые вопросы", +url = "\underline{http://www.google.ru/intl/ru/help/faq\_translation.html}" +} +@MISC{longfellow-wikipedia, +title = "[Электронный ресурс]", +url = "\underline{http://en.wikipedia.org/wiki/Henry\_Wadsworth\_Longfellow}" +} +@MISC{babelfish-wikipedia, +title = "[Электронный ресурс]", +url = "\underline{http://en.wikipedia.org/wiki/Yahoo!\_Babel\_Fish}" +} +@MISC{knight, +author = "Knight K.", +title = "A Statistical MT Tutorial Workbook", +url = "\underline{http://www.clsp.jhu.edu/ws99/projects/mt/mt-workbook.htm}", +year = 1999 +} +@BOOK{onufriev, +author = "Онуфриев, В. В.", +title = "Словарь разновидностей рифмы", +address = "М.", +year = 2002, +language = "russian" +} +@Article{computerra, +author = "Ножов, И.", +title = "Синтаксический анализ", +journal = "Компьютерра", +year = 2002, +number = 21, +language = "russian" +} +@INBOOK{langlais, + author = "Langlais P. and Simard M. and Véronis J.", + title = "Methods and Practical Issues in Evaluating Alignment Techniques", + booktitle = "Proceedings of COLING-ACL 98", + address = "Montreal, Canada", + year = 1998, + language = "english" +} +@INBOOK{gale, + author = "Gale W. and Church K.", + title = "A Program for Aligning Sentences in Bilingual Corpora", + booktitle = "Proceedings of the 29th Annual Meeting of the ACL", + address = "Berkeley, California", + year = 1991, + language = "english" +} +@INBOOK{melamed, + author = "Melamed I. D.", + title = "Automatic Construction of Clean Broad-Coverage Translation Lexicons", + booktitle = "Proceedings of 2nd Conference of the Association for Machine Translation in the America", + address = "Montreal, Canada", + year = 1996, + language = "english" +} +@INBOOK{han, + author = "Han B.", + title = "Building a Bilingual Dictionary with Scarce Resources: A Genetic Algorithm Approach", + booktitle = "Student Research Workshop, the Second Meeting of the North American Chapter of the Association for Computational Linguistics", + address = "Pittsburgh, USA", + year = 2001, + language = "english" +} +@INBOOK{slabin, +author = "Чистяков, А. and Скрябнёв, А.", +title = "Компьютерный перевод как инструмент межкультурной коммуникации", +booktitle = "Сб. научных статей", +editor = "к.п.н. У. К. Слабин", +address = "Витебск", +year = 2005, +pages = "202-206", +language = "russian" +} + +@INBOOK{basylev1, +author = "Базылев, В. Н.", +title = "Поиск смысла в практике переводчика", +booktitle = "Смысл и выражение: контроверзы современного гуманитарного знания", +address = "Самара", +publisher = "21 век", +year = 2001, +pages = "233-235", +language = "russian" +} +@INBOOK{basylev2, +author = "Базылев, В. Н.", +title = "Аналитический перевод (из опыта новейших русских переводов австрийской лирической поэзии)", +booktitle = "Композиционная семантика", +address = "Тамбов", +publisher = "Тамбовский ГУ", +year = 2002, +pages = "163-165", +language = "russian" +} +@PHDTHESIS{chudinova, +author = "Чудинова, Е. А.", +title = " Широко развитая многозначность в лексике современного русского языка: лингвостатистическое исследование по данным лексикографии", +type = "Автореф. дис\ldots\ канд. филол. наук", +address = "Пермь", +year = 1998, +language = "russian" +} +@PHDTHESIS{rahimberdiev, +author = "Рахимбердиев, Б. Н.", +title = "Эволюция семантики экономической терминологии русского языка в XX веке", +type = "Дисс. на соиск. уч. степ. канд. филол. наук.", +address = "М.", +year = 2003, +numpages = 188, +language = "russian" +} +@BOOK{beckman, +author = "Beckman, M. E.", +title = "Stress and Non-Stress Accent", +address = "Dordrecht", +publisher = "Foris", +year = 1986, +isbn = "90-6765-243-1", +language = "english" +} +@BOOK{literature-rosman, +editor = "проф. Горкина А.П.", +title = "Литература и язык. Современная иллюстрированная энциклопедия", +address = "М.", +publisher = "Росмэн", +year = 2006, +language = "russian" +} diff --git a/utf8gost780u.bst b/utf8gost780u.bst new file mode 100644 index 0000000..35ba3f5 --- /dev/null +++ b/utf8gost780u.bst @@ -0,0 +1,1428 @@ +%% +%% This is file `utf8gost780u.bst', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% utf8gost.dtx (with options: `utf8gost780u') +%% +%% Copyright 1996-2005 Maksym Polyakov. +%% Version 2005.08.12 +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% Please, send bug reports via e-mail: +%% polyama at auburn dot edu +%% +%% 2005.08.12 Bug fix (long annote) +%% +%% 2003.06.06 contributions by Konstantin Vorontsov: +%% New ENTRY "annote" added for output annotations. +%% New commands BibUrl, BibAnnote added for customize urls and annotations. +%% +%% 2003.08.10 +%% New command BibEmph added for customize emphasizing. +%% +%% 2003.10.07 +%% Some bug fixes in names and date formatting. +%% +%% 2003.10.07 +%% Bug fix in INPROCEEDINGS. +%% +%% +%% This bibliography style attempts +%% to format bibliography according to +%% GOST 7.1-84 and GOST 7.80-00 +%% +%% For the Ukrainian|Russian bibliographic entries +%% you need to create field +%% language = {ukrainian|russian}. +%% Default language is English. +%% Field numpages for books must contain number of pages. +%% Optional field url will format url (using hyperref, if loaded). +%% +%% See examples in gost71.pdf and gost780.pdf +%% +%% Requires 8-bit bibtex with switch -B and csf file supporting cyrillic. +%% bibtex8 -B -c .csf +%% + +ENTRY + { address + annote + author + booktitle + bookauthor + chapter + edition + editor + compiler + howpublished + institution + journal + key + month + note + number + organization + pages + numpages + publisher + school + series + title + type + volume + year + language + booklanguage + url + } + {} + { label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block +after.dblslash after.slash after.column after.semicolumn} + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := + #4 'after.dblslash := + #5 'after.slash := + #6 'after.column := + #7 'after.semicolumn := +} + +STRINGS { s t } + +STRINGS { curlanguage } + +FUNCTION {change.language} +{ booklanguage empty$ + {""} + {booklanguage 'curlanguage := + "\selectlanguageifdefined{" + curlanguage * + "}" * + } + if$ +} + +FUNCTION {output.nonnull} +%%%{ 's := +{ swap$ + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + " " "--- " * write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { output.state after.dblslash = + { "~//" * change.language * " " * write$ } + { output.state after.slash = + { "~/ " * write$ } + { output.state after.column = + { ": " * write$ } + { output.state after.semicolumn = + { "; " * write$ } + { add.period$ " " * write$ } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ +%%% s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.dblslash} +{ output.state before.all = + 'skip$ + { after.dblslash 'output.state := } + if$ +} + +FUNCTION {new.slash} +{ output.state before.all = + 'skip$ + { after.slash 'output.state := } + if$ +} + +FUNCTION {new.column} +{ output.state before.all = + 'skip$ + { after.column 'output.state := } + if$ +} + +FUNCTION {new.semicolumn} +{ output.state before.all = + 'skip$ + { after.semicolumn 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {add.blank} +{ " " * before.all 'output.state := +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {non.stop} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\BibEmph{" swap$ * "}" * } + if$ +} + +FUNCTION {space.word} +{ " " swap$ * " " * } + +FUNCTION {bbl.edby} % { "\bbledby{}" } +{ curlanguage "english" = + {"Ed. by "} + { curlanguage "ukrainian" = + {"{Під ред. }"} + { curlanguage "russian" = + {"{Под ред. }"} + {"language is not defined: " language "edited by" * * warning$ "edited by"} + if$} + if$} + if$ +} + +FUNCTION {bbl.cmplr} +{ curlanguage "english" = + {"Compiler "} + { curlanguage "ukrainian" = + {"{Укл. }"} + { curlanguage "russian" = + {"{Сост. }"} + {"language is not defined: " language "compiler" * * warning$ "compiler"} + if$} + if$} + if$ +} + +FUNCTION {bbl.edition} % { "\bbledition{}" } +{ curlanguage "english" = + {"edition"} + { curlanguage "ukrainian" = + {"{вид.}"} + { curlanguage "russian" = + {"{изд.}"} + {"language is not defined: " language "edition" * * warning$ "edition"} + if$} + if$} + if$ +} + +FUNCTION {bbl.vvolume} % { "\bblVolume{}" } +{ curlanguage "english" = + {"Volume"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Том"} + {"language is not defined: " language "Volume" * * warning$ "Volume"} + if$} + if$ +} + +FUNCTION {bbl.vvol} % { "\bblVol{}" } +{ curlanguage "english" = + {"Vol."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Т."} + {"language is not defined: " language "Vol." * * warning$ "Vol."} + if$} + if$ +} + +FUNCTION {bbl.iissue} % { "\bblIssue{}" } +{ curlanguage "english" = + {"Issue"} + { curlanguage "ukrainian" = + {"Випуск"} + { curlanguage "russian" = + {"Выпуск"} + {"language is not defined: " language * warning$ "Issue"} + if$} + if$} + if$ +} + +FUNCTION {bbl.iiss} % { "\bblIss{}" } +{ curlanguage "english" = + {"Iss."} + { curlanguage "ukrainian" = + {"Вип."} + { curlanguage "russian" = + {"Вып."} + {"language is not defined: " language * warning$ "Issue"} + if$} + if$} + if$ +} + +FUNCTION {bbl.of} % { "\bblof{}" } +{ curlanguage "english" = + {"of"} + { curlanguage "ukrainian" = + {"{із}"} + { curlanguage "russian" = + {"{из}"} + {"language is not defined: " language "of" * * warning$ "of"} + if$} + if$} + if$ +} + +FUNCTION {bbl.etal} % { "\bblof{}" } +{ curlanguage "english" = + {"et~al."} + { curlanguage "ukrainian" = + {"{та~ін.}"} + { curlanguage "russian" = + {"{и~др.}"} + {"language is not defined: " language "at al" * * warning$ "at al."} + if$} + if$} + if$ +} + +FUNCTION {bbl.nnumber} % { "\bblNumber{}" } +{ curlanguage "english" = + {"Number"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"Номер"} + {"language is not defined: " language "Number" * * warning$ "Number"} + if$} + if$ +} + +FUNCTION {bbl.number} % { "\bblnumber{}" } +{ curlanguage "english" = + {"number"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{номер}"} + {"language is not defined: " language "number" * * warning$ "number"} + if$} + if$ +} + +FUNCTION {bbl.nr} % { "\bblno{}" } +{ curlanguage "english" = + {"no."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{№}"} + {"language is not defined: " language "no." * * warning$ "no."} + if$} + if$ +} + +FUNCTION {bbl.nnr} % { "\bblno{}" } +{ curlanguage "english" = + {"No."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{№}"} + {"language is not defined: " language "No." * * warning$ "No."} + if$} + if$ +} + +FUNCTION {bbl.in} % { "\bblin{}" } +{ curlanguage "english" = + {"in"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{в}"} + {"language is not defined: " language "in" * * warning$ "in"} + if$} + if$ +} + +FUNCTION {bbl.iin} % { "\bblIn{}" } +{ curlanguage "english" = + {"In"} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"В"} + {"language is not defined: " language "In" * * warning$ "In"} + if$} + if$ +} + +FUNCTION {bbl.pages} % { "\bblpp." } +{ curlanguage "english" = + {"pp."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{с.}"} + {"language is not defined: " language "pp." * * warning$ "pp."} + if$} + if$ +} + +FUNCTION {bbl.page} % { "\bblp." +{ curlanguage "english" = + {"p."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{с.}"} + {"language is not defined: " language "p." * * warning$ "p."} + if$} + if$ +} + +FUNCTION {bbl.ppages}% { "\bblPp." } +{ curlanguage "english" = + {"Pp."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{С.}"} + {"language is not defined: " language "Pp." * * warning$ "Pp."} + if$} + if$ +} + +FUNCTION {bbl.ppage} % { "\bblP." } +{ curlanguage "english" = + {"P."} + { curlanguage "ukrainian" = curlanguage "russian" = or + {"{С.}"} + {"language is not defined: " language "P." * * warning$ "P."} + if$} + if$ +} + + +FUNCTION {bbl.techrep} { "Tech. Rep." } +FUNCTION {bbl.mthesis} { "Master's thesis" } +FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } + +INTEGERS { nameptr namesleft numnames } + + +FUNCTION {format.names} +{ + #1 "{vv~}{ll}{~jj}{,~ff}" format.name$ +} + + +FUNCTION {format.names.rev} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{ff}{~vv}{~ll}{, jj}" + format.name$ 't := + nameptr #1 > + { + nameptr #4 = + numnames #4 > and + { "others" 't := + #1 'namesleft := } + 'skip$ + if$ + namesleft #1 > + { ", " * t * } + { + t "others" = + t "~others" = + or + { " " * bbl.etal * } + { ", " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names emphasize} + if$ +} + +FUNCTION {format.bookauthors} +{ bookauthor empty$ + { "" } + { bookauthor format.names} + if$ +} + +FUNCTION {format.authors.after} +{ author empty$ + { "" } + { author format.names.rev} + if$ +} + +FUNCTION {format.bookauthors.after} +{ bookauthor empty$ + { "" } + { bookauthor format.names.rev} + if$ +} + +FUNCTION {format.editors.after} +{ editor empty$ + { "" } + { bbl.edby editor format.names.rev * + } + if$ +} + +FUNCTION {format.compiler.after} +{ compiler empty$ + { "" } + { bbl.cmplr compiler format.names.rev * + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title + } + if$ +} + +FUNCTION {format.date} +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { year ". " "--- " month * * * } + if$ + } + if$ +} + +FUNCTION {output.address.publisher.date} +{ + address empty$ + 'skip$ + { address output + publisher empty$ + 'skip$ + { new.column + } + if$ + } + if$ + publisher output + format.date output +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + language empty$ + {"english" 'curlanguage :=} + {language 'curlanguage :=} + if$ + "\selectlanguageifdefined{" write$ + curlanguage write$ + "}" write$ newline$ + "" + before.all 'output.state := +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {word.in} +{ bbl.iin + " " * } + +FUNCTION {format.btitle} +{ title +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {tie.connect} + {"~" + swap$ * * + } + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { bbl.vvol volume tie.connect + series empty$ + 'skip$ + { bbl.of space.word * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { series empty$ + { "there's a number but no series in " cite$ * warning$ + bbl.nnr } + { + %new.dblslash + new.sentence + series + bbl.nr + tie.or.space.connect} + if$ + number tie.or.space.connect + } + if$ + } + { "" } + if$ +} + +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + + +FUNCTION {convert.edition} +{ edition +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { convert.edition " " * bbl.edition * } + { convert.edition " " * bbl.edition * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { bbl.ppages pages n.dashify tie.connect } + { bbl.ppage pages tie.connect } + if$ + } + if$ +} + +FUNCTION {format.pages.page} +{ pages empty$ + { numpages empty$ + { "" } + { numpages bbl.pages tie.connect } + if$} + { format.pages} + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + number empty$ + 'skip$ + { + ", no." number tie.or.space.connect * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ": " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.volume} +{ volume empty$ + { "" } + { bbl.vvol volume tie.or.space.connect } + if$ +} + +FUNCTION {format.number} +{ number empty$ + { "" } + { bbl.nr number tie.or.space.connect } + if$ +} + + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + key empty$ not and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { bbl.techrep } + 'type + if$ + number empty$ + { "" } + { number tie.or.space.connect } + if$ +} + +FUNCTION {author.before} +{ + author empty$ + 'skip$ + {author num.names$ #4 < + {format.authors output + new.sentence} + 'skip$ + if$} + if$ +} + +FUNCTION {bookauthor.before} +{ + bookauthor empty$ + 'skip$ + {bookauthor num.names$ #4 < + {format.bookauthors output + new.sentence} + 'skip$ + if$} + if$ +} + + +FUNCTION {author.after} +{ + author empty$ + 'skip$ + {format.authors.after output + new.semicolumn } + if$ +} +FUNCTION {bookauthor.after} +{ + bookauthor empty$ + 'skip$ + {format.bookauthors.after output + new.semicolumn } + if$ +} + +FUNCTION {editor.organization.after} +{ + compiler empty$ + {} + { format.compiler.after output + new.semicolumn + } + if$ + editor empty$ + {} + { format.editors.after output + new.semicolumn + } + if$ + organization empty$ + {} + {organization output + new.semicolumn + } + if$ +} + +FUNCTION {format.url} +{ url empty$ + { "" } + { after.sentence 'output.state := + "\BibUrl{ " url * "}" * + } + if$ +} + +FUNCTION {format.annote} +{ annote empty$ + { "" } +{ after.sentence 'output.state := + "\BibAnnote{" annote add.period$ * "}" * +} + if$ +} + +FUNCTION {article} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + new.dblslash + journal emphasize "journal" output.check + new.block + format.date output + new.block + format.volume output + format.number output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + editor.organization.after + new.sentence + format.number.series output + new.block + format.edition output + new.block + output.address.publisher.date + new.block + format.bvolume output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + author.before + format.title "title" output.check + new.slash + author.after + editor.organization.after + new.block + howpublished output + address output + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + new.dblslash + bookauthor.before + booktitle "booktitle" output.check + new.slash + bookauthor.after + editor.organization.after + new.block + format.edition output + new.block + format.number.series output + new.sentence + output.address.publisher.date + new.block + format.bvolume output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + author.before + new.sentence + format.btitle "title" output.check + new.slash + author.after + new.dblslash + booktitle "booktitle" output.check + new.slash + editor.organization.after + new.block + output.address.publisher.date + new.block + format.bvolume output + format.number.series output + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + author.before + new.sentence + format.title "title" output.check + new.slash + author.after + new.dblslash + booktitle "booktitle" output.check + new.slash + editor.organization.after + new.block + format.bvolume output + format.number.series output + new.block + address empty$ + { publisher output + format.date "year" output.check + } + { address output.nonnull + new.column + publisher output + format.date "year" output.check + } + if$ + new.block + format.pages.page output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { + address new.block.checka + address output + } + 'skip$ + if$ + } + { + organization address new.block.checkb + organization output + address output + } + if$ + format.edition output + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle "title" output.check + new.block + bbl.mthesis format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + new.block + note output + new.block + format.url output + format.annote output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.sentence.checkb + format.btitle output + howpublished new.block.checka + howpublished output + new.block + format.date output + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.sentence + format.btitle "title" output.check + new.column + bbl.phdthesis format.thesis.type output.nonnull + new.slash + school "school" output.check + new.block + output.address.publisher.date + new.block + format.pages.page output + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + format.btitle "title" output.check + new.slash + editor.organization.after + new.block + format.bvolume output + format.number.series output + address empty$ + { publisher output + format.date "year" output.check + } + { address output.nonnull + format.date "year" output.check + new.sentence + publisher output + } + if$ + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + author.before + new.sentence + format.title "title" output.check + new.column + format.tr.number output.nonnull + new.slash + author.after + editor.organization.after + new.block + address output + new.column + institution "institution" output.check + format.date "year" output.check + new.block + note output + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + author.before + format.btitle "title" output.check + new.slash + author.after + editor.organization.after + new.block + note "note" output.check + new.sentence + format.url output + format.annote output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"\bbljan{}"} + +MACRO {feb} {"\bblfeb{}"} + +MACRO {mar} {"\bblmar{}"} + +MACRO {apr} {"\bblapr{}"} + +MACRO {may} {"\bblmay{}"} + +MACRO {jun} {"\bbljun{}"} + +MACRO {jul} {"\bbljul{}"} + +MACRO {aug} {"\bblaug{}"} + +MACRO {sep} {"\bblsep{}"} + +MACRO {oct} {"\bbloct{}"} + +MACRO {nov} {"\bblnov{}"} + +MACRO {dec} {"\bbldec{}"} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} + {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ "\begin{thebibliography}{" longest.label * "}" * write$ newline$ + "\def\selectlanguageifdefined#1{" write$ newline$ + "\expandafter\ifx\csname date#1\endcsname\relax" write$ newline$ + "\else\language\csname l@#1\endcsname\fi}" write$ newline$ + "\ifx\undefined\url\def\url#1{{\small #1}}\else\fi" write$ newline$ + "\ifx\undefined\BibUrl\def\BibUrl#1{\url{#1}}\else\fi" write$ newline$ + "\ifx\undefined\BibAnnote\long\def\BibAnnote#1{}\else\fi" write$ newline$ + "\ifx\undefined\BibEmph\def\BibEmph#1{\emph{#1}}\else\fi" write$ newline$ + preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} + +%% +%% End of file `utf8gost780u.bst'.