Emacs для начинающих

         

"А напоследок я скажу..."


Ну что ж, пора и этому месяцу закончиться -- я не ожидал, что он будет таким длинным!! Мой академический год более-менее приближается к концу и в последних числах мая меня ждут экзамены. После них я буду свободен целое лето, достаточно, чтобы привести в порядок все мои идеи относительно Linux'а, поселившиеся у меня в мозгу ( -- после того, как Ben Okopnik промыл его) :-)

До следующего месяца. Удачи и берегите себя.

Любые комментарии и предложения можно отослать мне, не поленившись и щелкнув по ссылке:

thomas_adam16@yahoo.com



АБЮчзь ъЮчтчшжущьО


¦Ашь рК тчяпршОуБу АшьХзчэ эщчсч вщпзчр р чтщЦ АБЮчзЦ, щу ъЮуЮКрпО уу щпжпБьуэ RET, Бч МБп АБЮчзп яЦтуБ ЮпАБь ь впыэуБ тру (ьшь ячшуу) АБЮчзь щп МзЮпщу; р зЮпыщуы ъЮпрчы ъчвьФьь зпжтчы ьв впщОБКЕ АБЮчз, зЮчэу ъчАшутщуы, яЦтуБ ЮпАъчшчжущ вщпз `\'. Tщпз `\' счрчЮьБ, ГБч АшутЦНИпО АБЮчзп МзЮпщп щу ОршОуБАО чБтушЛщчы АБЮчзчы р БузАБу, ГБч МБч БчшЛзч ъЮчтчшжущьу АБЮчзь, АшьХзчэ тшьщщчы тшО тпщщчсч МзЮпщп. ©Ючтчшжущьу Бпзжу щпвКрпуБАО ъуЮущчАчэ АБЮчз.

Tщчстп Цтчящч, ГБчяК Emacs прБчэпБьГуАзь рАБпршОш вщпзь ъуЮурчтп АБЮчзь, зчстп АБЮчзп АБпщчрьБАО АшьХзчэ тшьщщчы; ьАъчшЛвЦыБу тшО МБчсч Юужьэ Auto Fill (АэчБЮьБу Юпвтуш ).

¦эуАБч ъЮчтчшжущьО Emacs эчжуБ чБчяЮпжпБЛ тшьщщКу АБЮчзь ЦАуГущщКэь. мБч вщпГьБ, ГБч рАу вщпзь, зчБчЮКу щу рчХшь р ХьЮьщЦ МзЮпщп ьшь чзщп, щу чБчяЮпжпНБАО АчрАуэ. +щь чАБпНБАО р яЦДуЮу, щч рЮуэущщч щурьтьэК. ¦ ъчАшутщуэ АБчшяФу АБпрьБАО вщпз `$', п щу `\', ГБчяК ьщДчЮэьЮчрпБЛ ч туыАБрьь ЦАуГущьО.

цАуГущьу рэуАБч ъЮчтчшжущьО ъЮчьАЕчтьБ, зчстп ьАъчшЛвЦуБАО счЮьвчщБпшЛщпО ъЮчзЮЦБзп, ь, рчвэчжщч, рч рАуЕ чзщпЕ, щу впщьэпНИьЕ ъчшщЦН ХьЮьщЦ ДЮуыэп (АэчБЮьБу Юпвтуш ). ¦К эчжуБу рзшНГьБЛ ЦАуГущьу тшО зчщзЮуБщчсч яЦДуЮп, ЦАБпщчрьр р щуэ ъуЮуэущщЦН truncate-lines щу Юпрщчы nil. (аэчБЮьБу Юпвтуш .) Tвэущущьу вщпГущьО truncate-lines тушпуБ усч шчзпшЛщКэ тшО БузЦИусч яЦДуЮп; тч МБчсч эчэущБп туыАБрЦуБ вщпГущьу ъч ЦэчшГпщьН. +пГпшЛщчу вщпГущьу ъч ЦэчшГпщьН -- nil. аэчБЮьБу Юпвтуш .

аэчБЮьБу Юпвтуш , ч тЮЦсьЕ ъуЮуэущщКЕ, ршьОНИьЕ щп АъчАчя чБчяЮпжущьО БузАБп.



АБьЮпщьу БузАБп


DEL

цтпшьБЛ вщпз ъуЮут БчГзчы (delete-backward-char). C-d

цтпшьБЛ вщпз ъчАшу БчГзь (delete-char). C-k

цщьГБчжьБЛ рАу тч зчщФп АБЮчзь (kill-line). M-d

цщьГБчжьБЛ рАу вщпзь ръуЮут тч зчщФп АшутЦНИусч Ашчрп (kill-word). M-DEL

цщьГБчжьБЛ рАу вщпзь р чяЮпБщчэ щпъЮпршущьь ръшчБЛ тч щпГпшп ъЮутКтЦИусч Ашчрп (backward-kill-word).

¦К Цжу вщпуБу ч зшпрьХу DEL, зчБчЮпО ЦтпшОуБ вщпз ъуЮут БчГзчы (Бч уАБЛ ъуЮут зЦЮАчЮчэ). ¦ЮЦсчы зшНГ, Control-d (C-d тшО зЮпБзчАБь), ЦтпшОуБ вщпз ъчАшу БчГзь (БчБ вщпз, щп зчБчЮчэ зЦЮАчЮ). мБч АтрьспуБ чАБпшЛщчы БузАБ щп АБЮчзу ршурч. ¦Ашь рК щпжэуБу C-d р зчщФу АБЮчзь, Бч МБп АБЮчзп ь АшутЦНИпО вп щуы АчутьщОНБАО.

гБчяК АБуЮуБЛ ячшЛХьы зЦАчз БузАБп, ьАъчшЛвЦыБу зшНГ C-k, зчБчЮКы ЦтпшОуБ ФушЦН АБЮчзЦ. ¦Ашь рК щпжэуБу C-k р щпГпшу ьшь р АуЮутьщу АБЮчзь, Бч чщ ЦщьГБчжпуБ руАЛ БузАБ ръшчБЛ тч зчщФп МБчы АБЮчзь. ¦Ашь рК щпяуЮуБу C-k р зчщФу АБЮчзь, Бч чщ чяЙутьщОуБ МБЦ АБЮчзЦ Ач АшутЦНИуы.

аэчБЮьБу Юпвтуш , тшО ъчшЦГущьО ьщДчЮэпФьь ч ячшуу сьязьЕ АъчАчяпЕ ЦщьГБчжущьО БузАБп.



Адресация в командах SED


С помощью адресации происходит отбор строк для редактирования.

Адрес:

Десятичный номер строки; $ - последняя строка input ; Регулярное выражение.

Если адреса не указаны, то команда применяется ко всем pattern space;

Если присутствует один адрес, то команда применяется ко всем тем pattern space, куда попадает этот адрес;

Если указаны два адреса, то они ограничивают область применения команды.



АъЮпрзп


¦Ашь рК впяКшь, ГБч тушпуБ зпзпО-Бч зшпрьХп, рК эчжуБу рКОАщьБЛ МБч А ъчэчИЛН вщпзп АъЮпрзь C-h (ьшь F1, пщпшчсп C-h). +пяуЮьБу C-h k, п впБуэ ьэО зшНГп, ч зчБчЮчэ рК ЕчБьБу ЦвщпБЛ; щпъЮьэуЮ, C-h k C-n ЮпААзпвКрпуБ рАу ч Бчэ, ГБч тушпуБ C-n. C-h -- МБч ъЮуДьзАщпО зшпрьХп; C-h k -- ъЮчАБч чтщп ьв уу ъчтзчэпщт (п ьэущщч, зчэпщтп describe-key). ¦ЮЦсьу ъчтзчэпщтК C-h ъЮутчАБпршОНБ тЮЦсьу рьтК АъЮпрзь. +пяуЮьБу C-h трпжтК, ГБчяК ъчшЦГьБЛ чъьАпщьу рАуЕ рчвэчжщчАБуы АъЮпрзь. аэчБЮьБу Юпвтуш .



Альтернативные подходы


Несмотря на прогрессивность кодировки UTF-8, некоторые сознательные и не очень товарищи в силу своего то ли консерватизма, то ли простого сисадминского приципа "работает - не трожь!" предложили альтернативный вариант по установке в Red Hat Linux 8.0 локали "ru_RU.KOI8-R", что, с моей точки зрения, является возвращением в каменный 20 век кодировочной неразберихи. Понять их можно - в koi8-r без проблем работает куча старых програм, но мы должны понимать, что с этим балластом нужно порвать как можно скорее, тем более, что в UTF-8 живется очень неплохо.



Англо-русский словарь Мюллера и программы для его использования в UNIX


Я давно ощущал неудобство при работе в Linux из-за отсутствия серьёзного англо-русского словаря. И хотя число доступных в Интернете словарей постоянно растет ( на известные мне словари) мне хотелось иметь словарь с поиском словосочетаний (и не только с начала словарной статьи), с транскрипцией слова и примерами его употребления.

При этом с самого начала существовала уверенность, что для Линукса не нужны шифрованные словари (любое шифрование или упаковка замедляла поиск в моих экспериментах) и все шифрованные базы данных (и патентованные интерфейсы) --- просто следствие непродуманности современного законодательства об авторских правах, так-как ухудшает качество конечного продукта и мешает конкуренции в написании обслуживающих программ. Кроме того, мне совершенно непонятно почему нельзя купить электронную версию словаря за цену близкую к цене бумажного словаря (если учесть, что себестоимость бумажного издания намного выше) или в придачу к бумажному. Из-за этого создание оболочек к шифрованным словарям я считаю тупиковым путем.

В CD-сборник "Библиотека в Кармане", начиная с четвертой версии, входит словарь Мюллера в кодах ASCII 24-го издания. К сожалению, без транскрипции. Я взял на себя смелость переделать его в более удобную для Unix .

При более детальном изучении русского интернета оказалось, что существует электронная версия словаря Мюллера (7-ое издание) с транскрипцией, сделанная Сергеем Старостиным, и сейчас свободно распространяемая. С разрешения Сергея Старостина, я сделал из его словаря новую электронную

Для работы со словарями предлагаю написанные мною скрипты для bash

и Tcl/TK под названием

Замечания и предложения по улучшению посылайте Евгению Цымбалюку на e-mail: . Сообщайте, пожалуйста, так же об опечатках и ошибках найденных в самих словарях (особенно в 7-ой редакции). Буду очень признателен за сообщения о ссылках на другие словари под Unix для русского-украинского-белорусского языков. Я с удовольствием выложу на страницу альтернативные пакеты работы с словарями в формате MOVA.


Выражаю свою признательность людям, общение с которыми позволило улучшить словарь и скрипты: Дмитрию Мищенко, Владимиру Ставринову, Виталию Московкину, Стасу Англеру, Сергею Гаврилову, Игорю Готсу, Дмитрию Галкину, Вячеславу Федорову, Валерию Горелову, Денису Серебро, Сергею Винницкому, Евгению Бырганову, Павлу Курносову, Андрею Комечу. Михаилу Тентюкову. Особая благодарность Виктору Вагнеру за ответы на вопросы по использованию Tcl/TK.

29.7.99 Виталий Московкин прислал на shell,

который форматирует результаты поиска так, чтобы их понимал groff

(он умеет подсвечивать русские слова при работе в shell и форматирует вывод в зависимости от номера варианта перевода).

04.12.99 Игорь Готс прислал для разделения словаря на маленькие файлы (по первой букве) и поска в таком словаре. Этот метод может ускорить поиск по первому слову словарной статьи при ограниченных размерах оперативной памяти (32 MB).

16.6.2000 Вячеслав Федоров (V.Fyodorov@VAZ.ru) предлагает

для работы с Мюллеровскими словарями. Скрипты могут отображать транскрипцию и проводят поиск по словарю с разными опциями, смотри.

19.7.2000 Андрей Комеч прислалдля перекодирования словарей в DICT формат. Последнюю версию этого скрипта можно найти на его странице. Там же лежит готовый словарь Мюллера 24 издания в формате dict.

9.11.2000 Михаил Тентюков прислал доработанный c возможностью поиска по выведенной в окно словарной статье и решением некоторых проблем руссификации Tcl/TK 8.3.1.

26.01.2001 Дмитрий Юсупов прислал консольную написанную на С. Она делает специальный хэш для словаря и позволяет работать со словарем Даля и Апресяна. Поиск идет по первому слову словарной статьи. Последнию версию этой програмы вы можете найти на.


Арифметические выражения


Выражение:

Переменная;

Число;

Строка;

Встроенная функция;

Выражение &lt Операция&gt Выражение.

&lt Операция&gt : "+", "-", "*", "/", "%"



+АщчрщКу зчэпщтК ЮутпзБьЮчрпщьО


TтуАЛ эК ЮпААзпвКрпуэ чАщчрК ч Бчэ, зпз рруАБь БузАБ, АтушпБЛ ьвэущущьО ь впъьАпБЛ БузАБ р Дпыш. ¦Ашь МБь АрутущьО щчрК тшО рпА, рК эчжуБу ьвЦГьБЛ МБч ячшуу шусзьэ АъчАчячэ, впъЦАБьр АпэчЦГьБушЛ ъч Emacs. гБчяК АтушпБЛ Бпз, впъЦАБьБу Emacs ь щпяуЮьБу Control-h t

(help-with-tutorial).

гБчяК чГьАБьБЛ МзЮпщ ь ъуЮуЮьАчрпБЛ ьвчяЮпжущьу, щпъуГпБпыБу C-l

(recenter).



Aspell


Необязательно -

Это приложение для проверки орфографии может работать между SGML тэгами, и проверять только содержимое заключенное между ними. Обычные программы проверки орфографии, такие как ispell будут пытаться проверить тэги, вызывая ошибку на каждом новом встреченном тэге.



AUIS ez


В рамках распространяемого бесплатно в исходных текстах для Х11 многофункционального проекта AUIS (The Andrew User Interface System), разработанного Консорциумом Эндрю (Andrew Consortium), имеется текстовый редактор ez с модулями поддержки языков программирования С, С++, Modula-2, и PL/MI. Этот редактор будет интересен разработчикам программного обеспечения благодаря наличию средств цветового и шрифтового выделения синтаксиса, перехвата ошибок компиляции, встроенного набора стандартных языковых конструкций. Средства обработки текстов минимальные, но достаточные для подготовки простых документов. Исходные тексты имеются для большого числа платформ.

Редакторы, перенесенные в ОС UNIX из других операционных систем, в общем случае предназначены для разработчиков, использующих в своей деятельности более одной платформы и желающих всюду иметь один и тот же редактор. Как правило, портированные в ОС UNIX редакторы проигрывают тем редакторам, которые изначально разрабатывались для этой операционной системы с учетом ее специфики. Поэтому рекомендовать текстовые редакторы данного класса для использования в ОС UNIX разумно только пользователям, знакомым с аналогами этих редакторов в других операционных системах.



Auto Indent, Wrap и Tabs


предназначена и для простых смертных, так как определяет правила набора текста. Так, Auto Indent - это просто включение или выключение (Off/On) возможности создания автоматических абзацных оступов. Поясню на примере: если вам нужно набрать серию абзацев с общим отступом 7 пунктов от левого края, вы задаете (например, клавишей табулятора) отступ только первого абзаца - во всех остальных при включении (On) опции Auto Indent будет появляться автоматически, до его уничтожения вручную.

В этом же пункте, кроме переключения, есть еще одна опция - Smart, но она не активизирована. Подозреваю, что ее можно включить только при режимах каких-либо языков, предусматривающих некие фиксированные отступы в строках исходного текста.

А вот величина отступа, задаваемого клавишей табуляции, и определяется в пункте Tabs. Здесь нужно просто задать (в знаках) величину отступа при табуляции. Правда с оговоркой - for hardware space, поскольку тут же присутствует и опция - emulate tabs, то есть предполагается, видимо, некая софтверная табуляция; что это такое, к своему стыду, не знаю.

Опция Wrap важна, так как она отражается на ряде других параметров набора текста. Для нее возможны варианты:

None, то есть каждый абзац набирается в одну строку вплоть до нажатия клавиши Enter; это пволне премлемо для исходных текстов программ, но вряд ли учень удобно для набора текстов просто, так как строка "убегает за горизонт";

Auto Newline - выбор этой позиции приводит к тому, что каждая строка обрывается на границе окна, в результате чего сплошной текст (вроде этого, например) приобретает читабельность; однако при экспорте его в какой-либо текстовый процессор обнаруживается, что каждая строка заканчивается символом возврата каретки (то есть образует самостоятельный абзац), искоренение которых, например, в MS Word - занятие не из самых веселых; Continuous - оптимальный выбор для набора длинных связных текстов; в этом случае при достижении границы окна происходит разрыв экранной (не истинной!) строки без появления лишнего символа возврата каретки и, соответственно, без образования нового абзаца; каковой появляется только по нажатии клавиши Enter; это аналогично условиям переноса строк по умолчанию в emacs; в последнем, в отличие от NEdit, разрыв экранной строки маркируется обратным слэшем (\), что, конечно, наглядно показывает отличие строк экранных и истинных, но, с другой стороны, загромождает текст; Wrap Margin, последняя из опций переноса слов, позволяет явным образом задать длину строки в знаках, после чего происходит ее разрыв символом возврата каретки.


Я столь подробно остановился на параметрах переноса слов, потому что они представляются мне одними из наиболее существенных при наборе текста. Особенно если в дальнейшем предполагается экпорт его в текстовый процессор или какую-либо программу верстки. К тому же именно установками пункта Warp определяется реакция на команду меню Edit - Fill Paragraph (Ctrl+J): при установке в позиции Continuous текст в NEdit, независимо от того, в каком режиме переноса слов был набран, будет сконденсирован в единые абзацы, разделами между которыми будут только явные нажатия клавиши Enter.

Не уверен, что выразился вполне внятно, поэтому поясню на примере: некий текст был набран в режиме Auto Newline, после чего выяснилось, что его следует экспортировать в MS Word (или StarOffice для Linux, он в этом отношении ничуть не лучше); чтобы избавить себя в дальнейшем от ручного искоренения символов возврата каретки или головной боли по измышлению автоматизации этого процесса, достаточно просто пройтись по всем абзацам текста, нажимая Ctrl+J - и при включенной опции Continuous мы получим его аккуратно поделенным именно тем образом, что и требуется.

Однако о словах, пожалуй, хватит, пора взяться за их составляющие - буквы, настройка которых осуществляется через


Азбука кириллизации


Рассмотрим схематически процесс вывода на экран некоторого символа "x":

Прикладная программа, желая вывести "x" на экран, записывает в стандартный поток вывода соответствующую ему последовательность байт, которая в конечном счете достигает драйвера консоли (часть ядра Linux). Если драйвер консоли в этот момент находится в режиме UTF, он предполагает, что входные данные были записаны именно в этой кодировке, и использует стандартный алгоритм для преобразования UTF в Unicode (внутренняя кодировка ядра). В противном случае (т.н. "однобайтовый" или "ASCII" режим) драйвер использует таблицу перекодировки символов (Application Character Map, ACM) для перевода входного потока в Unicode. В ядре Linux отведено место для четырех таблиц ACM: cp437, vt100, iso01 и user-defined. Последнюю из них как раз и можно использовать для вывода однобайтовых кириллических кодировок (например, KOI8-R). Выбор пользовательской кодировки осуществляется ESC-последовательностью "(как правило, она генерируется автоматически соответствующими утилитами, хотя есть нюансы - см. bug #76470 в RedHat Bugzilla). Теперь, когда драйверу консоли известен Unicode-код "x", он должен определить, какой глиф в текущем шрифте ему соответствует. Для этого используется таблица экранного шрифта (Screen Font Map, SFM). Для большинства современных шрифтов таблица SFM хранится в том же файле, что и глифы (признаком этого является расширение .psfu у файла шрифта). После определения номера глифа, ядро дает команду видеоподсистеме. Знакогенератор, используя загруженный в него шрифт, воссоздает на экране изображение "x"

Для кириллизации консоли в Linux используются два конкурирующих пакета: и consoletools. Последний применялся в Red Hat версий 6.x-7.x, в более ранних и более поздних используется kbd. Оба пакета имеют сходную функциональность. Все необходимые для работы этих пакетов файлы хранятся в директории /lib/kbd: /lib/kbd/consolefonts (файлы шрифтов), /lib/kbd/consoletrans (ACM), /lib/kbd/unimaps (SFM) и /lib/kbd/keymaps (клавиатурные раскладки).

В дальнейшем по понятным причинам будем предполагать, что используется пакет kbd. Утилита setfont из этого пакета позволяет как загружать шрифты, так и устанавливать таблицы перекодировки ACM (параметр командной строки -m) и SFM (-u). Параметры можно комбинировать. Так, например, команда setfont Cyr_a8x16 -m koi2alt устанавливает шрифт Cyr_a8x16 и ACM-таблицу koi2alt.

Рассмотрим теперь, как организован процесс русификации в Red Hat 8.0. В первую очередь обратимся к файлу /etc/sysconfig/i18n. В нем определяются значения следующих переменных:

SYSFONT - имя шрифта. Расширение указывать необязательно. SYSFONTACM - имя ACM-таблицы. UNIMAP - имя SFM-таблицы. LANG - определяет локаль (locale). Если название локали заканчивается на "UTF-8" (например, "ru_RU.UTF-8"), драйвер консоли переводится в режим UTF. Список установленных в системе локалей возвращается командой locale -a. В процессе инициализации системы сценарий rc.sysinit выполняет /etc/sysconfig/i18n, после чего происходит запуск скрипта /sbin/setsysfont, загружающего шрифт и указанные таблицы перекодировки. Одновременно устанавливается клавиатурная раскладка, имя которой хранится в файле /etc/sysconfig/keyboard(переменная KEYTABLE).

Теперь, когда мы представляем себе общую схему русификации консоли, рассмотрим два конкретных способа научить Red Hat говорить по-русски.



/B> УСТАНОВКА ОКНА В УДОБНОЕ ПОЛОЖЕНИЕ


^L Перерисовать экран (redraw-display) M-x goto-line Выставить строку No в середину экрана



Bash


Чтобы заставить bash работать с русскими буквами, нужно создать файл ~/.inputrc, содержащий следующие строки:

set convert-meta off set input-meta on set output-meta on



БчГзп


¦ЦЮАчЮ БуЮэьщпшп рщЦБЮь Emacs ъчзпвКрпуБ ъчвьФьН, р зчБчЮчы яЦтуБ рКъчшщОБЛАО зчэпщтп ЮутпзБьЮчрпщьО. мБч ъчвьФьО ьэущЦуБАО БчГзчы. +щчсьу зчэпщтК Emacs ъуЮуэуИпНБ БчГзЦ ъч БузАБЦ, Бпз ГБч рК ьэууБу рчвэчжщчАБЛ ЮутпзБьЮчрпБЛ р шНячэ эуАБу. ¦К Бпзжу эчжуБу ЦАБпщчрьБЛ БчГзЦ, ИушзщЦр ъуЮрчы зщчъзчы эКХь.

¦чстп зЦЮАчЮ ЦзпвКрпуБ щп вщпз, Бч АшутЦуБ тЦэпБЛ, ГБч БчГзп щпЕчтьБАО эужтЦ трЦэО вщпзпэь; чщп ЮпАъчшчжущп ъуЮут

вщпзчэ, щпт зчБчЮКэ ъчОршОуБАО зЦЮАчЮ. +пъЮьэуЮ, уАшь рпХ БузАБ рКсшОтьБ зпз `frob', п зЦЮАчЮ щпЕчтьБАО щпт `b', Бч БчГзп ЮпАъчшчжущп эужтЦ `o' ь `b'. ¦Ашь рК рАБпрьБу р МБчы ъчвьФьь вщпз `!', Бч ъчшЦГьБу `fro!b', А БчГзчы эужтЦ `!' ь `b'. бпзьэ чяЮпвчэ, зЦЮАчЮ чАБпщуБАО щпт `b', зпз ь ЮпщЛХу.

Tщчстп счрчЮОБ "зЦЮАчЮ", ьэуО р рьтЦ БчГзЦ, ьшь счрчЮОБ ч зчэпщтпЕ трьжущьО БчГзь зпз ч зчэпщтпЕ "трьжущьО зЦЮАчЮп".

буЮэьщпшК ьэуНБ БчшЛзч чтьщ зЦЮАчЮ, ь зчстп ъЮчьАЕчтьБ ъЮчФуАА рКрчтп, зЦЮАчЮ тчшжущ щпЕчтьБЛАО Бпэ, сту ьтуБ щпячЮ. мБч щу чвщпГпуБ, ГБч БчГзп ъуЮуэуИпуБАО. мБч вщпГьБ шьХЛ Бч, ГБч Emacs эчжуБ ъчзпвпБЛ рпэ ъчвьФьН БчГзь, БчшЛзч зчстп БуЮэьщпш щу ЮпячБпуБ.

¦Ашь рК ЮутпзБьЮЦуБу р Emacs щуАзчшЛзч Дпышчр, зпжтКы р Арчуэ яЦДуЮу, Бч рАОзьы яЦДуЮ ьэууБ АрчН АчяАБрущщЦН ъчвьФьН БчГзь. ¦ЦДуЮ, зчБчЮКы щу ъчзпвКрпуБАО р тпщщчу рЮуэО, впъчэьщпуБ, сту щпЕчтьБАО БчГзп, щп АшЦГпы, уАшь рК Ащчрп рКрутуБу усч щп МзЮпщ.

¦чстп ДЮуыэ ЮпвяьБ щп щуАзчшЛзч чзчщ, зпжтчу ьв щьЕ ьэууБ АрчН АчяАБрущщЦН ъчвьФьН БчГзь. ¦ЦЮАчЮ жу ъчзпвКрпуБ ъчвьФьН БчГзь р рКяЮпщщчэ чзщу. мБьэ АъчАчячэ рК Бпзжу эчжуБу ЦвщпБЛ, зчБчЮчу ьв чзчщ рКяЮпщч. ¦Ашь чтьщ ь БчБ жу яЦДуЮ ъчОршОуБАО ячшуу Гуэ р чтщчэ чзщу, Бч зпжтчу ьв щьЕ ьэууБ АрчН ъчвьФьН БчГзь.

¦Ашь уАБЛ щуАзчшЛзч ДЮуыэчр, зпжтКы ьв щьЕ эчжуБ чБчяЮпвьБЛ чтьщ зЦЮАчЮ. ¦ЦЮАчЮ р рКяЮпщщчэ ДЮуыэу впъчшщущ ФруБчэ; зЦЮАчЮ р тЮЦсьЕ ДЮуыэпЕ -- МБч ъЦАБпО зшуБзп, зчБчЮпО ъчОршОуБАО р Бчэ чзщу, зчБчЮчу яКшч яК рКяЮпщщКэ, уАшь яК рК ъуЮутпшь ДчзЦА ррчтп МБчэЦ ДЮуыэЦ.

буЮэьщ `БчГзп' ъЮчьАЕчтьБ чБ щпврпщьО вщпзп `.', зчБчЮКы яКш зчэпщтчы TECO (ОвКз, щп зчБчЮчэ яКш щпъьАпщ ъуЮрчщпГпшЛщКы Emacs) тшО ъчшЦГущьО вщпГущьО рушьГьщК, щпвКрпуэчы БуъуЮЛ `БчГзчы'.



BEGIN и END


Образец BEGIN указывает на начало input или на те действия, которые должны быть выполнены до какого бы то ни было анализа строк. Образец END указывает на конец input или на те действия, которые должны быть выполнены после обработки всех строк.

Например:

BEGIN {FS = ":"} - Устанавливает разделитель полей в ":" до начала обработки строк. Эквивалентно опции "-F:" при AWK вызове.

END { print NR } - Печатает номер последней строки input, т.е. количество обработанных входных строк.



Благодарности.


Спасибо...

Алексею Семёнову -- за комментарии, советы и терпение. Александру Шишко -- за комментарии и оценку моего чувства юмора. ;-) Сергею Галину -- за идеи и комментарии.

Copyright (c) June 2003, Alexander Kuprin

Команда переводчиков:
Александр Куприн, Андрей Киселев, Александр Михайлов, Александр Саввин, Владимир Меренков, Иван Песин, Игорь Яровинский, Павел Соколов, Роман Шумихин, Сергей Скороходов, Юрий Прушинский

Со всеми предложениями, идеями и комментариями обращайтесь к Александру Куприну (ru_classic at mail.ru). Убедительная просьба: указывайте сразу, не возражаете ли Вы против публикации Ваших отзывов в рассылке.

Сайт рассылки: http://gazette.linux.ru.net
Эту статью можно взять здесь: http://gazette.linux.ru.net/rus/articles/dict_ptkdic_other.html
Архивы выпусков находятся здесь: http://gazette.linux.ru.net/archive/



БОЛЬШИЕ / МАЛЕНЬКИЕ. РУССКИЕ/ЛАТИНСКИЕ


M-- M-l Сделать предыдущее слово маленьким M-- M-u Сделать предыдущее слово большим M-- M-c Сделать предыдущее слово маленьким с заглавной



Буферы vi


Редактор имеет три типа буферов: буфер стирания (0-9), неименованный буфер и именованные буферы (a-z).

В буферы стирания автоматически заносятся стираемые элементы. В буфере 0 хранится последний стертый элемент, в буфере 1 - предпоследний и т. д.

Занести в буфер:

yy - занести текущую строку в неименованный буфер

yдвижение курсора - занести указанный движением курсора блок текста в неименованный буфер.

"ayy - занести текущую строку в именованный буфер a

"Ayy - добавить текущую строку к содержимому именованного буфера a

"by10j - занести последующие 10 строк в именованный буфер b

Вставить из буфера:

p - вставить в текущую позицию содержимое неименованного буфера

"ap - вставить в текущую позицию содержимое именованного буфера a

"1p - вставить в текущую позицию содержимое буфера стирания 1



By


Texinfo -- основная система докумнтации в проектах GNU.

Главная цель формата Texinfo -- создание из единого набора исходных файлов (.texi) документы и безупречно выглядящие при печати, и удобные для просмотра и навигации на экране компьютера. Основа высококачественной типографики достигается в Texinfo с помощью "военной хитрости": за основу взят plain TeX (основной язык TeX, как он описан Д. Кнутом. По сути -- это язык описания страниц и графического вывода вообще, как и более поздний язык PostScript. Надеюсь, я тут ни в чем особенно не наврал:) -- прим. перев.), который приспосабливается к специфике Texinfo после чтения файла texinfo.tex (В вашей системе может быть несколько копий этого файла. Проверьте, что используется свежая версия (на момент написания статьи -- 2002-01-04.07)). texinfo.tex выполняет всю работу по настройке TeX-форматирования. Он расширяет TeX, давая возможность распознавания гиперссылок и остальных "прибамбасов", нужных для экранной он-лайновой документации. Будучи скомпилированным для просмотра на экране, из исходника Texinfo получается файл Info (.info).



©ЦАБКу АБЮчзь


TтуАЛ ЮпААэпБЮьрпНБАО АъуФьпшЛщКу зчэпщтК ь ъЮьуэК АчвтпщьО ь ЦтпшущьО ъЦАБКЕ АБЮчз.

C-o

¦АБпрьБЛ ъчАшу зЦЮАчЮп чтщЦ ьшь щуАзчшЛзч ъЦАБКЕ АБЮчз (open-line). C-x C-o

цщьГБчжьБЛ рАу ъчАшутчрпБушЛщКу ъЦАБКу АБЮчзь, зЮчэу чтщчы (delete-blank-lines).

¦чстп рК ЕчБьБу рАБпрьБЛ щчрЦН АБЮчзЦ БузАБп ъуЮут Цжу АЦИуАБрЦНИуы, рК эчжуБу АтушпБЛ МБч, щпяЮпр щчрЦН АБЮчзЦ БузАБп ь вп щуы RET. +тщпзч, эчжуБ чзпвпБЛАО Цтчящуу рьтуБЛ Бч, ГБч рК щпяьЮпуБу, уАшь ъуЮут МБьэ АъуЮрп АчвтпБЛ ъЦАБЦН АБЮчзЦ, п впБуэ рАБпрьБЛ р щуу щЦжщКы БузАБ. мБч шусзч АтушпБЛ, ьАъчшЛвЦО зшпрьХЦ C-o (open-line), зчБчЮпО рАБпршОуБ щчрЦН АБЮчзЦ ъчАшу БчГзь, щч чАБпршОуБ БчГзЦ ъуЮут МБчы щчрчы АБЮчзчы. ©чАшу а-ч щпяьЮпыБу БузАБ р щчрЦН АБЮчзЦ. а-ч F O O тпуБ БчБ жу ЮувЦшЛБпБ, ГБч ь F O O RET, вп ьАзшНГущьуэ зчщуГщчы ъчвьФьь БчГзь.

¦К эчжуБу АчвтпБЛ щуАзчшЛзч ъЦАБКЕ АБЮчз, щпяЮпр а-ч щуАзчшЛзч Юпв, ьшь вптпр уы ГьАшчрчы пЮсЦэущБ, ГБчяК АзпвпБЛ уы, зпзчу зчшьГуАБрч АБЮчз щучяЕчтьэч АчвтпБЛ. аэчБЮьБу Юпвтуш , ГБчяК ЦвпБЛ, зпз МБч АтушпБЛ. ¦Ашь чъЮутушущ ъЮуДьзА впъчшщущьО, Бч зчэпщтп C-o, зчстп рК ьАъчшЛвЦуБу уу р щпГпшу АБЮчзь, рАБпршОуБ щп щчрчы АБЮчзу МБчБ ъЮуДьзА впъчшщущьО. аэчБЮьБу Юпвтуш .

©ЮчАБчы АъчАчя ьвяпрьБЛАО чБ шьХщьЕ ъЦАБКЕ АБЮчз -- рчАъчшЛвчрпБЛАО зчэпщтчы C-x C-o (delete-blank-lines). TАъчшЛвчрпщьу C-x C-o АЮуть щуАзчшЛзьЕ ъЦАБКЕ АБЮчз ЦтпшОуБ ьЕ рАу, зЮчэу чтщчы. C-x C-o щп чтьщчГщчы ъЦАБчы АБЮчзу ЦтпшОуБ МБЦ АБЮчзЦ. ¦чстп БчГзп щпЕчтьБАО щп щуъЦАБчы АБЮчзу, C-x C-o ЦтпшОуБ рАу ъЦАБКу АБЮчзь ъчАшу МБчы щуъЦАБчы АБЮчзь.



Цели и задачи


Итак, что мне хотелось получить от Red Hat Linux 8.0:

Английские менюшки и сообщения во всех программах Возможность печатать и читать во всех этих программах по русски. Работающий Ximian Evolution

Вот вообщем-то и все. Не так уж много, не правда ли?



Character


Каждый "абстрактный" символ имеет изображение -- glyph. Считается, что каждый символ имеет "каноническое" изображение , то есть такое, которое позволяет однозначно

идентифицировать данный символ, то есть распознать и отличить его от других. Таким образом, в модели POSIX и UNICODE не уделяется никакого внимания вариантам начертания символа, то есть шрифтам (fonts) во всем их многообразии, . Поэтому все, что изображено на примере ниже, будет одним и тем же "абстрактным" символом  :

ЛАТИНСКАЯ ЗАГЛАВНАЯ БУКВА А    (LATIN CAPITAL LETTER A):

    В стандарте UNICODE кроме определенного изображения каждому символу присвоено определенное имя :

UNICODE

Character Name

A U+0041 LATIN CAPITAL LETTER A
a U+0061 LATIN SMALL LETTER A
Ю U+042E CYRILLIC CAPITAL LETTER YU
1 U+0031 DIGIT ONE
+ U+002B PLUS SIGN
U+03A9 GREEK CAPITAL LETTER OMEGA
U+2569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL
    и так далее.

    В настоящее время в стандарт , входят практчески все употребимые символы (~40.000), и им соответственно присвоены стандартные имена. Последнее значительное изменение -- введение символа валюты EURO в сентябре 1998 г.

    Посмотреть набор символов UNICODE

можно здесь : .

    Таким образом, для нас символ

(character) - это единица тектовой информации, имеющая определенное изображение и определенное имя.



CHARSET и его имя, или Do you forget about Charset ?


    Как оказывается, множество пользователей и программистов никогда не задавались таким простым вопросом : каково имя собственного Charset-а. Почему ? А дело в том, что для большинства языков употребляется только один Charset. Например, для Америки en_US

- Сharset будет однозначно ASCII, а для Франции fr_FR - Charset будет однозначно ISO-8859-1. И т.д.

    Давайте не будем уподобляться и рассмотрим такой вопрос : Зачем нам нужно знать Charset

и каким образом выбирается имя

для определенного Charset-а ?

    Во-первых, зачем нам требуются имена Charset-ов ?

В стандарте MIME у Content-Type: определен параметр Charset

:

Content-Type: text/plain; charset="koi8-r"

В стандарте HTTP также определен параметр Charset :

Content-Type: text/plain; charset="koi8-r"

Content-Type: text/html; charset="koi8-r"

В стандарте имя Charset-а применяется при кодировании заголоков :

Subject: Re: =?KOI8-R?Q?=C1?=

В POSIX locale имя Charset-а входит в название категорий локализации :

$ export LANG=ru_RU.KOI8-R

    Таким образом, каждый Charset

должен иметь определенное имя. (Технически, имя - это строка символов.)

    К сожалению, в деле стандартизации имен Charset-ов царит некоторый беспорядок. А проблема состоит в том, что в настоящее время не существует строгого стандарта на имена Charset-ов.

    Например,  даже в стандарте ISO

для Charset-ов семейства ISO-8859 определено все : состав символов, e.t.c., но совершенно не определены правила написания имени. Поэтому, даже для имен из стандарта ISO

возможны варианты записи:

ISO8859-1
ISO-8859-1
ISO_8859-1
и т.д.

Обратите внимание на символ между буквами ISO и цифрами.

    Однако существует другая организация : , которая кроме всего прочего занимается и регистрацией Charset-ов . Там, на IANA лежит документ : .

    В данном документе определено следующее : The character set names may be up to 40 characters taken from the printable characters of US-ASCII. However, no distinction is made between use of upper and lower case letters. (Имя набора символов может достигать 40 символов ASCII. Не существует разницы между строчными и прописными буквами) Это практически все, что можно сказать о правилах образования имен Charset-ов.


     Однако самое полезное в этом документе то, что в нем определено понятие Alias у Сharset.

Name: ISO_8859-1:1987 MIBenum: 4 Source: ECMA registry Alias: iso-ir-100 Alias: ISO_8859-1 Alias: ISO-8859-1 (preferred MIME name) Alias: latin1 Alias: l1 Alias: IBM819 Alias: CP819 Alias: csISOLatin1

    Определена также процедура регистрации новых Charset-ов : : "IANA Charset Registration Procedures." Существует список рассылки (архив списка ).

    Также неплохо ознакомиться с :

. "The Report of the IAB Character Set Workshop held 29 February - 1 March, 1996".

"IETF Policy on Character Sets and Languages"

.

    Довольно обширная подборка документов находится здесь : . См. также коллекцию Charmap-ов от и .

    Но к сожалению, данный документ не является

международным стандартом, а всего лишь "подборка рекомендаций"... И названия

Charset
, в отличии от названий Country () и Territory

() для имен , HTTP и MIME  не стандартизованы в ISO...

    Может быть поэтому многие авторы программного обеспечения не поддерживает Charset-ы или механизм Alias:-ов... Например (автор Ulrich Drepper) и XFree86 . Вместо этого например в glibc существует специальный механизм, так называемый name mangling. То есть все символы в имени Charset-а переводятся в lowercase и удаляются все символы "_", "-", "."  e.t.c. Например "ISO_8859-1" превращается в "iso88591". А "KOI8-R" --> "koi8r".

    Ситуация осложняется тем, что когда-то давно IBM и Microsoft ввели понятие , которое теперь фактически имеет значение Charset. А с названиями этих самых Codepages стоит полная путанница :

CP866
CP-866
IBM866
IBM_866
и т.д.
    Или даже как в случае кодовой страницы CP1251, когда в Microsoft Internet Explorer или IIS эта кодировка фигурирует как "Windows-1251".



Windows-1251
Win-1251
CP1251
CP-1251
и т.д.
    Дак вот, схема name mangling по Drepper-у еще как-то работает для ISOxxxx, но совершенно не работает для имен Codepages CP-xxx/IBM-xxx/Windows-xxx. То есть, нужна поддержка Alias:-ов по IANA.

    Вобщем, засада с этим Charset-ом полная.

    Более того, в "чистом" POSIX

вообще невозможно

узнать имя Charset текущей локализации. См. .

    Ситуация даже еще хуже, поскольку для полной поддержки Charset-ов необходимо держать несколько копий man-ов, info и message catlog-ов (см. ) в разных кодировках. То есть, установив LANG=ru_RU.ISO_8859-5 пользователь вправе рассчитывать, что обработка символов, сообщения об ошибках и вывод справочной информации man будет происходить на русском языке в наборе символов ISO_8859-5. А установив LANG=ru_RU.KOI8-R пользователь точно так же вправе рассчитывать, что всю информацию он будет получать также на русском языке, но в кодировке KOI8-R.

    Точно так же для японского языка. Поскольку для японского имеется по крайней мере 4 кодировки : ISO-2022-JP, JIS, Shift-JIS

(CP-932) и EUC, то установив LANG=ja_JP.EUC

пользователь по-видимому желает работать в кодировке EUC, а установив LANG=ja_JP.Shift-JIS

-- в кодировке Shift-JIS.

P.S Одна из редких программ, которая поддерживает Charset-ы "по настоящему" и даже имеет настройки charset.alias -- это mutt : .

P.P.S. Решением проблемы был бы UNICODE как "самый универсальный сharset". Тогда любой другой Charset можно получить из UNICODE

как "логическое сечение". Кстати в последних Solaris-ах есть такая возможность и можно определять en_US.UNICODE, ja_JP.UNICODE, ru_RU.UNICODE e.t.c.

P.P.P.S. К сожалению, X-ы "внутри" не UNICODE-овые и не имеют такого понятия как UNICODE font (в отличие от тех же ). А как было бы все тогда просто...

Содержание ""

Last change : 18-01-2000



©ЧрБчЮущьу зчэпщтК


¦чэпщтп C-x z (repeat) ъЮутчАБпршОуБ уИу чтьщ АъчАчя ъчрБчЮьБЛ зчэпщтЦ Emacs щуАзчшЛзч Юпв. мБп зчэпщтп ъчрБчЮОуБ ъЮутКтЦИЦН зчэпщтЦ Emacs, зпзпО яК чщп щь яКшп. ©Юь ъчрБчЮущьь зчэпщтп ьАъчшЛвЦуБ Бу жу пЮсЦэущБК, зпзьу Ц щуу яКшь ЮпщЛХу; чщп щу АГьБКрпуБ щчрКу пЮсЦэущБК зпжтКы Юпв.

гБчяК ъчрБчЮьБЛ зчэпщтЦ щуАзчшЛзч Юпв, щпъуГпБпыБу уИу вщпзь z: зпжтКы вщпз z ъчрБчЮьБ МБЦ зчэпщтЦ уИу чтьщ Юпв. ©чрБчЮущьу впзпщГьрпуБАО, зчстп рК ррчтьБу вщпз, чБшьГщКы чБ z, ьшь щпжьэпуБу зщчъзЦ эКХь.

©Юутъчшчжьэ щпъЮьэуЮ, ГБч рК щпъуГпБпшь C-u 2 0 C-d, ГБчяК ЦтпшьБЛ 20 вщпзчр. ¦К эчжуБу ъчрБчЮьБЛ МБЦ зчэпщтЦ (рэуАБу А уу пЮсЦэущБчэ) уИу БЮь Юпвп, ГБчяК ЦтпшьБЛ р чяИуы АшчжщчАБь 80 вщпзчр, щпъуГпБпр C-x z z z. ©уЮрКы C-x z ъчрБчЮОуБ МБЦ зчэпщтЦ чтьщ Юпв, п зпжтКы ъчАшутЦНИьы z ъчрБчЮОуБ уИу Юпв.

[]   []   [ъЮутКтЦИьы]   [рруЮЕ]   [АшутЦНИьы]   []  



©ЧшчАзп эущН


¦пжтКы ДЮуыэ Emacs чяКГщч ьэууБ АруЮЕЦ ъчшчАзЦ эущН, зчБчЮЦН рК эчжуБу ьАъчшЛвчрпБЛ тшО ъЮчьврутущьО чъЮутушущщКЕ туыАБрьы. +уБ щучяЕчтьэчАБь ъуЮуГьАшОБЛ ьЕ втуАЛ, ъчБчэЦ ГБч рпэ ъЮчИу ъчАэчБЮуБЛ Апэьэ.

¦чстп рК ьАъчшЛвЦуБу чзчщщЦН АьАБуэЦ, рК эчжуБу рКяьЮпБЛ зчэпщтК ьв ъчшчАзь эущН ъЮь ъчэчИь эКХь. +пъЮпршущщпО ръЮпрч АБЮушзп ъчАшу ъЦщзБп эущН ЦзпвКрпуБ, ГБч МБчБ ъЦщзБ рутуБ зч рБчЮьГщчэЦ эущН; `...' р зчщФу чвщпГпуБ, ГБч тч щпГпшп ЮпячБК МБп зчэпщтп АГьБпуБ пЮсЦэущБК А зшпрьпБЦЮК.

гБчяК ъЮчАэчБЮуБЛ ъчшщчу ьэО зчэпщтК ь тчзЦэущБпФьН з ъЦщзБЦ эущН, щпъуГпБпыБу C-h k ь впБуэ рКяуЮьБу щЦжщКы ъЦщзБ А ъчэчИЛН эКХь чяКГщКэ АъчАчячэ. (АэчБЮьБу Юпвтуш ).

+п БузАБчрКЕ БуЮэьщпшпЕ, сту щуБ эКХь, рК эчжуБу ьАъчшЛвчрпБЛ эущН, щпъуГпБпр M-` ьшь F10 (чщь впъЦАзпНБ зчэпщтЦ tmm-menubar). мБп зчэпщтп рЕчтьБ р Юужьэ, сту рК эчжуБу рКяЮпБЛ ъЦщзБ эущН А ъчэчИЛН зшпрьпБЦЮК. ©ЮутрпЮьБушЛщКы рКячЮ ъчзпвКрпуБАО р МЕч-чяшпАБь. ¦К эчжуБу ьАъчшЛвчрпБЛ ъЮпрЦН ь шурЦН зЦЮАчЮщКу АБЮушзь тшО трьжущьО ъч эущН з ЮпвщКэ ъЦщзБпэ. ¦чстп рК щпХшь щЦжщКы рпэ ъЦщзБ, щпъуГпБпыБу RET, ГБчяК рКяЮпБЛ усч.

¦ зпжтчэЦ ъЦщзБЦ эущН Бпзжу ъЮьъьАКрпуБАО яЦзрп ьшь ФьДЮп; чяКГщч МБч ъуЮрпО ъуЮрпО яЦзрп зпзчсч-Бч Ашчрп ьв ьэущь ъЦщзБп. мБп яЦзрп ьшь ФьДЮп чБтушОуБАО чБ ьэущь вщпГзчэ `=>'. ¦шО рКячЮп ъЦщзБп рК эчжуБу щпъуГпБпБЛ усч яЦзрЦ ьшь ФьДЮЦ.

+узчБчЮКу зчэпщтК р эущН ьэуНБ Бпзжу чяКГщКу ъЮьрОвзь з зшНГЦ; р Бпзчэ АшЦГпу ъчАшу Апэчсч ъЦщзБп ъуЮуГьАшОуБАО чтьщ МзрьрпшущБщКы зшНГ р зЮЦсшКЕ АзчязпЕ.

[]   []   [ъЮутКтЦИьы]   [рруЮЕ]   [АшутЦНИьы]   []  



Что нужно писателю, чтобы писать


В свое время юный Карел Чапек спросил своего дядю, известного в те годы писателя: "Как пишутся романы?" - "Сидя, молодой человек!" - ответил тот.

И по сию пору романы, а также рассказы, статьи, эссе, монографии, докладные (и закладные) записки и все прочие тексты пишутся по прежнему сидя. Правда, обычно за компьютером, а не листом бумаги. И потому, помимо компьютера, требуют некоторого инструментария - средств для работы с текстами.

Их можно разделить на две группы - средства для составления текстов, текстовые редакторы, и средства для оформления таковых - текстовые процессоры. В чем разница между ними?

Обычно считается, что в редакторах имеются лишь простейшие операции по вводу текста, тогда как процессоры насыщены функциями его обработки. Не могу с этим согласиться - все зависит от конкретной реализации. Существует достаточно много редакторов, имеющих очень сложные возможности для обработки текстовых файлов и их групп, тогда как есть и процессоры, не позволяющие ничего, кроме смены гарнитуры или начертания шрифта и выравнивания текста.

На мой взгляд, различие между редакторами и процессорами - чисто формальное: все, что дает на выходе простой текстовый файл (т.н. plain text) - это редактор, тогда как процессор создает текст в собственном (хотя, возможно, и общепринятом) формате, содержащем кроме ASCII-символов всякого рода управляющие и форматирующие коды. Ну а богатство возможностей - это исключительно на совести разработчика.

Из такого определения следует, что текстовые редакторы ориентированы на создание оригинальных содержательных материалов, тогда как процессоры - на их представление. Предвижу возражение: подавляющее большинство тружеников пера (пардон, клавиатуры) использует текстовый процессор (берусь угадать, какой) для обоих целей. По моему мнению, это неправильно: создание оригинальных текстов (если, конечно, они заслуживают этого названия) - процесс, требующий концентрации внимания именно на содержательной стороне. Изобилие же всякого рода форматирующих и укращательских опций приводит к попыткам одновременно заниматься и оформительством. Казалось бы, экономия времени, однако обычно это приводит к тому, что как то, так и другое получается скверно. Впрочем, это - моя точка зрения, которую я не собираюсь ни доказывать, ни упаси Боже, навязывать.

Работа с текстами подразумевает еще один аспект - языковый. И, соответственно, для нее нужны средства языковой поддержки, то есть ввода символов и их отображения на экране - раз, шрифтового отображения на печати - два. Ну и проверка орфографии вряд ли покажется лишней. Конечно, все мы учились понемногу, но правильнописание хромает не у одного Винни-Пуха...

Начнем рассмотрение с тех инструментов, которые представляются более важными. Это -



Что почитать


Страницы man для perlpod(1), pod2man(1), pod2html(1), pod2latex(1), pod2text(1) и podchecker(1).

В следующем месяце: LaTeX в связи с latex2html.



Что такое DocBook?


DocBook [1] - приложение SGML, предназначенное для разметки документов, такое же, как HTML для разметки веб - документов. В отличие от HTML, DocBook не предоставляет информацию о формате документа. Поэтому документы DocBook должны быть преобразованы в другой формат для просмотра. Преобразование в другой формат осуществляют с помощью утилит, применяющих некоторый шаблон к документам DocBook.


Рисунок 1: Преобразование DocBook документа в формат PDF с использованием шаблона.

Немного ниже, в данной заметке, рассмотрим, какие шаблоны и утилиты использовать для преобразования DocBook документов. Но сначала рассмотрим как составляются документы.



Что такое Emacs?


Emacs — один из наиболее мощных и широко распространенных редакторов, используемых в мире Unix. По популярности он соперничает с редактором vi и его клонами.

В зависимости от ситуации, Emacs может быть:

текстовым редактором;

программой для чтения почты и новостей Usenet;

интегрированной средой разработки (IDE);

операционной системой;

всем, чем угодно.

Все это разнообразие достигается благодаря архитектуре Emacs, которая позволяет расширять возможности редактора при помощи языка Emacs Lisp. На языке C написаны лишь самые базовые и низкоуровневые части Emacs, включая полнофункциональный интерпретатор языка Lisp. Таким образом, Emacs имеет встроенный язык программирования, который может использоваться для настройки, расширения и изменения поведения редактора. В действительности, большая часть того редактора, с которым пользователи Emacs работают в наши дни, написана на языке Lisp.

Первая версия редактора Emacs была написана в 70-х годах 20-го столетия Richard Stallman (Ричардом Столманом)

как набор макросов для редактора TECO. В дальнейшем, уже будучи основателем Фонда Свободного программного обеспечения и , Stallman разработал GNU Emacs в развитие оригинального Emacs и до сих пор сопровождает эту программу. Вы можете подробнее ознакомиться с историей редактора, прочитав эту .

Emacs является одним из старейших редакторов. Он использовался тысячами программистов на протяжении последних 20 с лишним лет, означает, что для него создано много дополнительных пакетов расширений. Эти дополнения позволяют делать с помощью Emacs такие вещи, которые Stallman, вероятно, даже не считал возможными в начале своей работы над редактором. Более подробно я расскажу о них в следующих разделах.



Что такое LaTeX ?


Если вы не знаете, что такое LaTeX, то его можно описать как язык форматирования документов, это что-то на подобие хорошо известного HTML. Документы LaTeX содержат текст для печати и некоторые команды описывающие его формат. Чтобы увидеть документ HTML вам нужно дать его HTML браузеру, но чтобы увидеть текст LaTeX вам нужно скомпилить его, чтобы увидеть графическое представление называемое DVI (DeVice Indepedent). Это промежуточный формат который нужно перевести в Postscript(или другой принтерный язык), чтобы напечатать. Существует также DVI viewer который позволяет просматривать результат на экране. 

История LaTeX начинается с Donald E. Knuth. В 1977, не найдя недорогой печатающей установки или wordprocessor'а для написания его знаменитой серии "The art of computer programming", он решил сделать TeX, который был бы мощным языком программирования для форматированя текстов. C TeX вы можете делать все и с невероятным качеством. Например, разрешение выходного файла 57819ppi (pixels per inch). Но, как вы можете себе представить, такая мощность означает что вам необходимо знать множество детелей о процессе форматирования. TeX ориентирован на издателей, которым нужен детальный контроль над  выходными данными.  

Позже, в начале 80х, Leslie Lamport написал набор команд и стилей основанных на TeX,  дающих ему высокоуровневый интерфейс. Это было названо LaTeX (Lamport TeX). Благодаря LaTeX возможно приготовить документы высокого качества очень просто(по сравнению с простым TeX). С тех пор, LaTeX был принят математиками, благодаря превосходному качеству математических выражений LaTeX.

Первой широко используемой версией была LaTeX 2.09. Настоящая версия называется LaTeX2e, и это версия требуется LyX для форматирования документов. Версия 3 находиться в разработке.



Что такое LyX ?


LyX - это WYSIWYM (What You See Is What You MEAN) редактор который работает как front end to LaTeX.  Большинство современных текстовых редакторов развиваются согласно концепции WYSIWYG. В противоположность этой тенденции, LyX не старается дать точное изображение финального результата, а лишь его аппроксимацию. Он может быть определен как нечто среднее между методом "наброска" и страничным методом  MsWord. 

После этого вступления вы могли подумать что LyX - это простая и не очень конкурентноспособная программа. Но это совершенно не так.

Важно понять, что LyX - это text typesetter, а не text composer. С помощью word processor, вы можете помещать или изображение куда вам угодно, или, например, вы можете выбрать точную ширину колонки таблицы. Но этого нельзя сделать в LyX. Фактически, если вы попробуете вставить последовательно два пробела, последний будет проигнорирован; тоже самое происходит если вы попытаетесь произвести два последовательных перехода на новую строку. Итак, какже тогда возможно форматиромание текста? LaTeX делает это автоматически. Чтобы сделать это, необходимо всего лишь ввести некоторую информацию о структуре текста, сообщая такие вещи как нумерация и заголовки секций, где должны быть изображения, и т.д. 

Ограничение LyX на "игру" с текстом следует рассматривать не как проблему, а как качество. Просто вспомните как много раз перед началом написания документа вы экспериментировали с фонтами и видом заголовков. Возможно вы приняли это важное решенье когда, написав три или четыре страницы, вы вдруг забыли стиль заголовков второго уровня или даже хуже, вы передумали и вам пришлось возврашаться назад и переформатировать весь текст заново. Если наш текстовый редактор может приримать такие тривиальные решенья самостоятельно, мы можем полностью сконцентрироваться на том, что мы собираемя писать, а не на том как это будет выглядеть. 

Можно сказать, что LyX - это помошник редатора, издание и конечную композицию осуществляет LaTeX. 

Из собственного опыта я знаю, что множество людей кто пробовал использовать или даже слышал о LaTeX, помнят это как неудачный опыт. Не беспокойтесь, LyX для того чтобы помочь нам. Он справиться с LaTeX и со всей возней связанной с компиляцией текста. Нам не придется написать ни одной команды LaTeX (если мы не захотим).

Это главное окно LyX.

 

По правде говоря, вид  LyX GUI и не привлекательный и не отточенный, поскольку используеся библиотека Xforms для его построения. Одна из целей следующей версии использовать библиотеку GTK+, разработанную для построения GIMP (но сейчас распространяемую как библиотека для построения GUI - прим. перев.) или/и библиотеку Qt, лучшую библиотеку доступную сегодня и используемую для разработки KDE (надо заметить что эта библиотека _не_ распространяется под лицензией GPL, как GTK+ - прим. перев.).



Что такое Ted?


Это в первую очередь Wysiwyg текстовый редактор созданный Mark de Does M.de.Does@inter.nl.net. Интерфейс построен на Motif, несколько пиктограмм и шрифтов, но на что сразу обращаешь внимание - редактор похож на инструмент для повседневного использования.

Изображение 0: Простой TED Gui составленный
из компонентов TED с помощью The Gimp.

Загрузить TED можно здесь - <ftp://ftp.nluuq.nl/pub/editors/ted> или <http://www.de-does.demon.nl> или <http://www.nllgg.nl/Ted/>. Как обычно распространяется в виде binary дистрибутива или в исходных текстах. Самая новая версия составляет в объеме 1,9 MB (ted-2.8.src.tar.gz) и для компиляции требует Motif. Из своего опыта могу сказать, что Lesstif.0.88-9 также подходит. Результатом компиляции и striping (команда strip) является двоичный исполняемый файл размером 1 MB. Ted содержит также орфографический словарь ( американский английский ), если вам необходим другой - можно скачать отдельно. В дополнение к распространяемым binary/source-tar архивам существует также RPM package.

Ted открывает файлы только одного формата ( но сохраняет в 3-х ) : RTF ( Rich Text Format ) - независимый от платформы и понятный любому текстовому редактору, его свойства - размер и тип шрифта, расположение определяется самим форматом. Чтобы избежать проблем переноса документов в Linux - сохраняйте их в формате RTF вместо DOC формата Word.



Что такое UNICODE ?


[ISO10646] ISO/IEC 10646-1:1993 International Organization for Standardization. "Information Technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane", Geneva, 1993.

[UNICODE] The Unicode Standard, Version 2.0, The Unicode Consortium, Addison-Wesley, July 1996.

    UNICODE - частичная реализация стандарта ISO 10646, совместим снизу вверх, т.е. первые 256 символов UNICODE = Latin-1 (ISO 8859-1). FYI: В настоящее время распределено около 29.000 позиций из 65.535 возможных.

Last change: 08/10/99.



Что здесь есть (содержание) :


.

Как...

.



Что значит "программа правильно написана" ?


Давайте рассмотрим теперь, как писать "правильные" с точки зрения локализации программы. Основное внимание уделим стандартам.

    (Но и у стандартов есть свои проблемы. Поэтому - немного ).

    "Правильно" написанная программа с использованием POSIX locale не должна зависить от способа кодирования ("") символов. Такая программа не должна быть привязана к 7-ми битности ASCII символов, и должна пользоваться стандартными библиотечными (API) функциями locale :  , , isxxx() и / не полагаясь, что Upper=Lower+0x20

и т.д.  Конструкции, подобные этой также недопустимы :

if (c >= 'A' && c <= 'Z') { ...

Пользуйтесь :

if (isalpha(c) && isupper(c)) { ... или

if (isascii(c) && isupper(c))

    Как правило, национальные алфавиты расположены начиная с кода (codepoint) 0x80, поэтому для совместимости со старыми реализациями locale можно объявить все символы как unsigned char, например ключом компилятора (для gcc -funsigned-char) или явно.

    Хорошо написанная программа должна быть польностью 8-бит прозрачна. Например отметка удаленного файла в MS-DOS кодом 0x0E5

- не очень хорошее решение. Еще примеры плохих решений :  знаменитая русская буква "Н" в редакторе GoldEd или русская буква "р" в Norton Commander...

    Во-вторых, программа должна явно начинаться с вызова (такая форма вызова означает, что всем категориям локализации одновременно будет присвоено значение переменной окружения ). До вызова этой функции (или совсем без него) программа не обращает внимания на LANG= и фунции isalpha()...

работают в локализации POSIX (С) и с набором символов ASCII. То есть, не бывает "никакой" локализации.

ПРИМЕЧАHИЕ: Во FreeBSD можно вылечить некоторые программы, в которых забыт вызов setlocale()

путем задания строки окружения :

$ export ENABLE_STARTUP_LOCALE=""

тогда setlocale(LC_ALL,"") будет вызываться автоматически при старте программ (без их перекомпиляции).

   В Linux libc такого нет (пока?) и по умолчанию всегда включено LANG="C" или "POSIX". Однако можно пересобрать Linux libc, указав другое значение по умолчанию. Но следует отметить, что такое решение будет противоречить стандарту, по которому программа стартует в POSIX (до первого вызова setlocale()).

    Для получения locale-зависимой информации следует пользоватся данными структуры lconv, которые можно получить вызовом функции . Для получения детальной информации по категориям локализации (описанным в файле ) можно пользовться функцией . (Эта функция не входит в POSIX, но входит в XPG, и большинство систем ее имеют).

    Для сравнения строк символов следует пользоваться функциями и вместо .

    Для полной поддержки сообщений на родном языке () весь вывод сообщений пользователю должен происходить c использованием функций NLS и должен быть создан каталог сообщений (message catalog) для данной программы (и данного языка).

    А в заключение, неплохо бы иметь man

на разных языках. :-)



Codeeqv


Cyrillic Codepages Crosstable 1

Сводная таблица символов

в популярных кириллических кодировках

Символ

DOS

KOI

WIN

MAC

ISO

Unicode

Unicode 2.0 Name

Русские буквы

А

80

E1

C0

80

B0

U+0410

Capital Letter A

Б

81

E2

C1

81

B1

U+0411

Capital Letter Be

В

82

F7

C2

82

B2

U+0412

Capital Letter Ve

Г

83

E7

C3

83

B3

U+0413

Capital Letter Ghe

Д

84

E4

C4

84

B4

U+0414

Capital Letter De

Е

85

E5

C5

85

B5

U+0415

Capital Letter Ie

Ж

86

F6

C6

86

B6

U+0416

Capital Letter Zhe

З

87

FA

C7

87

B7

U+0417

Capital Letter Ze

И

88

E9

C8

88

B8

U+0418

Capital Letter I

Й

89

EA

C9

89

B9

U+0419

Capital Letter Short I

К

8A

EB

CA

8A

BA

U+041A

Capital Letter Ka

Л

8B

EC

CB

8B

BB

U+041B

Capital Letter El

М

8C

ED

CC

8C

BC

U+041C

Capital Letter Em

Н

8D

EE

CD

8D

BD

U+041D

Capital Letter En

О

8E

EF

CE

8E

BE

U+041E

Capital Letter O

П

8F

F0

CF

8F

BF

U+041F

Capital Letter Pe

Р

90

F2

D0

90

C0

U+0420

Capital Letter Er

С

91

F3

D1

91

C1

U+0421

Capital Letter Es

Т

92

F4

D2

92

C2

U+0422

Capital Letter Te

У

93

F5

D3

93

C3

U+0423

Capital Letter U

Ф

94

E6

D4

94

C4

U+0424

Capital Letter Ef

Х

95

E8

D5

95

C5

U+0425

Capital Letter Ha

Ц

96

E3

D6

96

C6

U+0426

Capital Letter Tse

Ч

97

FE

D7

97

C7

U+0427

Capital Letter Che

Ш

98

FB

D8

98

C8

U+0428

Capital Letter Sha

Щ

99

FD

D9

99

C9

U+0429

Capital Letter Shcha

Ъ

9A

FF

DA

9A

CA

U+042A

Capital Letter Hard Sign

Ы

9B

F9

DB

9B

CB

U+042B

Capital Letter Yeru

Ь

9C

F8

DC

9C

CC

U+042C

Capital Letter Soft Sign

Э

9D

FC

DD

9D

CD

U+042D

Capital Letter E

Ю

9E

E0

DE

9E

CE

U+042E

Capital Letter Yu

Я

9F

F1

DF

9F

CF

U+042F

Capital Letter Ya

а

A0

C1

E0

E0

D0

U+0430

Small Letter A

б

A1

E2

E1

E1

D1

U+0431

Small Letter Be

в

A2

F7

E2

E2

D2

U+0432

Small Letter Ve

г

A3

E7

E3

E3

D3

U+0433

Small Letter Ghe

д

A4

E4

E4

E4

D4

U+0434

Small Letter De

е

A5

E5

E5

E5

D5

U+0435

Small Letter Ie

ж

A6

F6

E6

E6

D6

U+0436

Small Letter Zhe

з

A7

FA

E7

E7

D7

U+0437

Small Letter Ze

и

A8

E9

E8

E8

D8

U+0438

Small Letter I

й

A9

EA

E9

E9

D9

U+0439

Small Letter Short I

к

AA

EB

EA

EA

DA

U+043A

Small Letter Ka

л

AB

EC

EB

EB

DB

U+043B

Small Letter El

м

AC

ED

EC

EC

DC

U+043C

Small Letter Em

н

AD

EE

ED

ED

DD

U+043D

Small Letter En

о

AE

EF

EE

EE

DE

U+043E

Small Letter O

п

AF

F0

EF

EF

DF

U+043F

Small Letter Pe

р

E0

F2

F0

F0

E0

U+0440

Small Letter Er

с

E1

F3

F1

F1

E1

U+0441

Small Letter Es

т

E2

F4

F2

F2

E2

U+0442

Small Letter Te

у

E3

F5

F3

F3

E3

U+0443

Small Letter U

ф

E4

E6

F4

F4

E4

U+0444

Small Letter Ef

х

E5

E8

F5

F5

E5

U+0445

Small Letter Ha

ц

E6

E3

F6

F6

E6

U+0446

Small Letter Tse

ч

E7

FE

F7

F7

E7

U+0447

Small Letter Che

ш

E8

FB

F8

F8

E8

U+0448

Small Letter Sha

щ

E9

FD

F9

F9

E9

U+0449

Small Letter Shcha

ъ

EA

FF

FA

FA

EA

U+044A

Small Letter Hard Sign

ы

EB

F9

FB

FB

EB

U+044B

Small Letter Yeru

ь

EC

F8

FC

FC

EC

U+044C

Small Letter Soft Sign

э

ED

FC

FD

FD

ED

U+044D

Small Letter E

ю

EE

E0

FE

FE

EE

U+044E

Small Letter Yu

я

EF

F1

FF

DF

EF

U+044F

Small Letter Ya

Ё

F0

B3

A8

DD

F1

U+0401

Capital Io

ё

F1

A3

B8

DE

F1

U+0451

Small Io

Кириллица из нерусских славянских языков

Ђ

80

AB

A2

U+0402

Capital Dje

Ѓ

*83 Г

*E7 Г

81

AE

A3

U+0403

Capital Gje

Є

F2

AA

B8

A4

U+0404

Capital Ukrainian Ie

Ѕ

*53 S

*53 S

BD

C1

A5

U+0405

Capital Dze

І

*49 I

*49 I

B2

A7

A6

U+0406

Capital Byelorussian-Ukrainian I

Ї

F4

AF

BA

A7

U+0407

Capital Yi

Ј

*4A J

*4A J

A3

B7

A8

U+0408

Serbian Capital Je

Љ

8A

BC

A9

U+0409

Serbian Capital Lje

Њ

8C

BE

AA

U+040A

Serbian Capital Nje

Ћ

8E

CB

AB

U+040B

Serbian Capital Tshe

Ќ

*8A К

*EB К

8D

CD

AC

U+040C

Capital Kje

Ў

F6

A1

D8

AE

U+040E

Capital Short U

Џ

8F

DA

AF

U+040F

Serbian Capital Dzhe

ђ

90

AC

F2

U+0452

Serbian Small Dje

ѓ

*A3 г

*C7 г

83

AF

F3

U+0453

Small Gje

є

F3

BA

B9

F4

U+0454

Small Ukrainian Ie

ѕ

*73 s

*73 s

BE

CF

F5

U+0455

Small Dze

і

*69 i

*69 i

B3

B4

F6

U+0456

Small Byelorussian-Ukrainian I

ї

F5

BF

BB

F7

U+0457

Small Yi

ј

*6A j

*6A j

BC

C0

F8

U+0458

Serbian Small Je

љ

9A

BD

F9

U+0459

Serbian Small Lje

?

9C

BF

FA

U+045A

Serbian Small Nje

ћ

9E

CC

FB

U+045B

Serbian Small Tshe

ќ

*AA К

*CB К

9D

CE

FC

U+045C

Small Kje

ў

F7

A2

D9

FE

U+045E

Small Short U

џ

9F

DB

FF

U+045F

Serbian Small Dzhe

Ґ

*83 Г

*E7 Г

A5

A2

*B3 Г

U+0490

Capital Ghe With Upturn

ґ

*A3 г

*C7 г

B4

B6

*D3 г

U+0491

Small Ghe With Upturn

Знаки (преимущественно Windows/Mac)

(No-Break Space)

*FF

9A

A0

CA

A0

U+00A0

No-Break Space

­

*20 Sp

*20 Sp

AD

*20 Sp

AE

U+00AD

Soft Hyphen

¤

FD

A4

FF ?

U+00A4

Currency Sign

¦

*B3 ³

*83 ³

A6

U+00A6

Broken Bar

§

*15 §

*15 §

A7

A4

FD

U+00A7

Section Sign

©

FC

BF

A9

A9

*43 C

U+00A9

Copyright Sign

«

*3C <

*3C <

AB

C7

*3C <

U+00AB

Left-Pointing Double Angle Quotation Mark

¬

*2D -

*2D -

AC

C2

*2D -

U+00AC

Not Sign

®

*52 R

*52 R

AE

A8

*52 R

U+00AE

Registered Sign

°

F8

9C

B0

A1

U+00B0

Degree Sign

±

*2B +

*2B +

B1

B1

*2B +

U+00B1

Plus-Minus Sign

ý

FD

9D

U+00B2

Superscript Two

µ

*E7 ч

*DE ч

B5

B5

*E7 ч

U+00B5

Micro Sign

B6

A6

U+00B6

Pilcrow Sign

·

FA

9E

B7

*2E .

*2E .

U+00B7 or 2219

Middle Dot or Bullet Operator

»

*3E >

*3E >

BB

C8

*3E >

U+00BB

Right-Pointing Double Angle Quotation Mark

ö

F6

9F

D6

U+00F7

Division Sign

*2D -

*2D -

96

D0

*2D -

U+2013

En Dash

*2D -

*2D -

97

D1

*2D -

U+2014

Em Dash

*27 '

*27 '

91

D4

*27 '

U+2018

Left Single Quotation Mark

*27 '

*27 '

92

D5

*27 '

U+2019

Right Single Quotation Mark

*27 '

*27 '

82

*27 '

*27 '

U+201A

Single Low-9 Quotation Mark

*22 "

*22 "

93

D2

*22 "

U+201C

Left Double Quotation Mark

*22 "

*22 "

94

D3

*22 "

U+201D

Right Double Quotation Mark

*22 "

*22 "

84

D7

*22 "

U+201E

Double Low-9 Quotation Mark

*C5 Å

*8A Å

86

A0

U+2020

Dagger

*D8 Ø

*BC Ø

87

U+2021

Double Dagger

F9

95

95

A5

U+2022 or 2219

Bullet or Bullet Operator

*3A :

*3A :

85

C9

U+2026

Horizontal Ellipsis

*25 %

*25 %

89

*25 %

*25 %

U+2030

Per Mille Sign

*3C <

*3C <

8B

*3C <

*3C <

U+2039

Single Left-Pointing Angle Quotation Mark

?

*3E >

*3E >

9B

*3E >

*3E >

U+203A

Single Right-Pointing Angle Quotation Mark

FC

B9

DC

F0

U+2116

Numero Sign

*54 T

*54 T

99

AA

*54 T

U+2122

Trade Mark Sign

Знаки, специфичные для DOS/KOI8-R

û

FB

96

*76 v

C3

*76 v

U+221A

Square Root

÷

F7

97

C5

U+2248

Almost Equal To

ó

F3

98

B2

U+2264

Less-Than Or Equal To

ò

F2

99

B3

U+2265

Greater-Than Or Equal To

ô

F4

93

U+2320

Top Half Integral

õ

F5

9B

U+2321

Bottom Half Integral

þ

FE

94

CA ?

U+25A0

Black Square

Знаки, специфичные для Mac

£

*4C L

*4C L

*4C L

A3

*4C L

U+00A3

Pound Sign

¦

*66 f

*66 f

*66 f

C4

*66 f

U+0192

Latin Small Letter F With Hook

D

C6

U+2206

Increment

¥

B0

U+221E

Infinity

¹

*23 #

*23 #

*23 #

AD

*23 #

U+2260

Not Equal To

Псевдографика (DOS/KOI8-R/ГОСТ)

°

B0

90

*20 Sp or *2D -

*20 Sp or *2D -

9B

U+2591

Light Shade

±

B1

91

*20 Sp or *2D -

*20 Sp or *2D -

9C

U+2592

Medium Shade

²

B2

92

*20 Sp or *2D -

*20 Sp or *2D -

9D

U+2593

Dark Shade

³

B3

81

*A6 ¦

*7C |

A5

U+2502

Box Drawings Light Vertical

´

B4

87

*A6 ¦

*7C |

A7

U+2524

Box Drawings Light Vertical And Left

µ

B5

B2

*A6 ¦

*7C |

83

U+2561

Box Drawings Vertical Single And Left Double

B6

B4

*A6 ¦

*7C |

84

U+2562

Box Drawings Vertical Double And Left Single

·

B7

A7

*2B +

or

*AC ¬

*2B +

or

*C2 ¬

85

U+2556

Box Drawings Down Double And Left Single

¸

B8

A6

*2B +

or

AC ¬

*2B +

or

*C2 ¬

86

U+2555

Box Drawings Down Single And Left Double

¹

B9

B5

*A6 ¦

*7C |

97

U+2563

Box Drawings Double Vertical And Left

º

BA

A1

*A6 ¦

*7C |

95

U+2551

Box Drawings Double Vertical

»

BB

A8

*2B +

or

*AC ¬

*2B +

or

*C2 ¬

91

U+2557

Box Drawings Double Down And Left

¼

BC

AE

*2B +

*2B +

92

U+255D

Box Drawings Double Up And Left

½

BD

AD

*2B +

*2B +

8B

U+255C

Box Drawings Up Double And Left Single

¾

BE

AC

*2B +

*2B +

8C

U+255B

Box Drawings Up Single And Left Double

¿

BF

83

*2B +

or

*AC ¬

*2B +

or

*C2 ¬

A1

U+2510

Box Drawings Light Down And Left

À

C0

84

*2B +

or

*4C L

*2B +

or

*4C L

A3

U+2514

Box Drawings Light Up And Right

Á

C1

89

*2D -

*2D -

A8

U+2534

Box Drawings Light Up And Horizontal

Â

C2

88

*2D -

or

*54 T

*2D -

or

*54 T

A6

U+252C

Box Drawings Light Down And Horizontal

Ã

C3

86

*2B +

*2B +

A9

U+251C

Box Drawings Light Vertical And Right

Ä

C4

80

*2D -

*2D -

A4

U+2500

Box Drawings Light Horizontal

Å

C5

8A

*2B +

*2B +

AA

U+253C

Box Drawings Light Vertical And Horizontal

Æ

C6

AF

*A6 ¦

*7C |

8D

U+255E

Box Drawings Vertical Single And Right Double

Ç

C7

B0

*A6 ¦

*7C |

8E

U+255F

Box Drawings Vertical Double And Right Single

È

C8

AB

*2B +

or

*4C L

*2B +

or

*4C L

93

U+255A

Box Drawings Double Up And Right

É

C9

A5

*2B +

or

*E3 г

*2B +

or

*E3 г

90

U+2554

Box Drawings Double Down And Right

Ê

CA

BB

*2D -

*2D -

98

U+2569

Box Drawings Double Up And Horizontal

Ë

CB

B8

*2D - or

*54 T

*2D - or

*54 T

96

U+2566

Box Drawings Double Down And Horizontal

Ì

CC

B1

*A6 ¦

*7C |

99

U+2560

Box Drawings Double Vertical And Right

Í

CD

A0

*2D -

or

*3D =

*2D -

or

*3D =

94

U+2550

Box Drawings Double Horizontal

Î

CE

BE

*2B +

*2B +

9A

U+256C

Box Drawings Double Vertical And Horizontal

Ï

CF

B9

*2D -

*2D -

80

U+2567

Box Drawings Up Single And Horizontal Double

Ð

D0

BA

*2D -

*2D -

81

U+2568

Box Drawings Up Double And Horizontal Single

Ñ

D1

B6

*2D -

or

*54 T

*2D -

or

*54 T

82

U+2564

Box Drawings Down Single And Horizontal Double

Ò

D2

B7

*2D -

or

*54 T

*2D -

or

*54 T

87

U+2565

Box Drawings Down Double And Horizontal Single

Ó

D3

AA

*2B +

or

*4C L

*2B +

or

*4C L

88

U+2559

Box Drawings Up Double And Right Single

Ô

D4

A9

*2B +

or

*4C L

*2B +

or

*4C L

89

U+2558

Box Drawings Up Single And Right Double

Õ

D5

A2

*2B +

*2B +

8A

U+2552

Box Drawings Down Single And Right Double

Ö

D6

A4

*2B +or

*E3 г

*2B +

or

*E3 г

8F

U+2553

Box Drawings Down Double And Right Single

×

D7

BD

*2B +

*2B +

9E

U+256B

Box Drawings Vertical Double And Horizontal Single

Ø

D8

BC

*2B +

*2B +

9F

U+256A

Box Drawings Vertical Single And Horizontal Double

Ù

D9

85

*2B +

*2B +

A2

U+2518

Box Drawings Light Up And Left

Ú

DA

82

*2B +

*2B +

A0

U+250C

Box Drawings Light Down And Right

Û

DB

8D

*5F _

*5F _

AB

U+2588

Full Block

Ü

DC

8C

*5F _

*5F _

AC

U+2584

Lower Half Block

Ý

DD

8E

*5F _

*5F _

AD

U+258C

Left Half Block

Þ

DE

8F

*5F _

*5F _

AE

U+2590

Right Half Block

ß

DF

8B

*5F _

*5F _

AF

U+2580

Upper Half Block

<
Примечания.

1) Все числовые значения кодов шестнадцатеричные.

2) Если в данной кодировке точное соответствие символа отсутствует, а приводится похожий символ, то его код отмечается звездочкой (*) и приводится сам заменяющий символ. Для DOS/Windows кодировок по возможности указываются стандартные для Windows соответствия, определяемые файлом xlat866.bin, однако в 32-битных программах Windows’95 этот файл не используется и соответствия отчасти другие (указываемые через союз or).

Впрочем, от некоторых отступлений, учитывая реальное отсутствие нормативности, я все равно не удержался.

3) Вопросительным знаком отмечены соответствия, сомнительные в отношении их стандартности.

4) Имена символов в Unicode в стандарте написаны полностью большими буквами. В большинстве из них содержится убранное мной определение CYRILLIC, в то же время для специфически сербских букв мной добавлено определение Serbian.

5) Псевдографические символы последней части таблицы содержатся в кодировке ГОСТ (“основной”), но не содержатся в ISO-8859-5, в свою очередь буквы нерусских славянских языков содержатся кодировке ISO-8859-5, но не содержатся в кодировке ГОСТ.

(Исправлены опечатки версии 03-Ноя-97.)

6) Указанные 2 значения UNICODE для двух “буллетов” связаны с фактической эквивалентностью middot и bullet operator (U+00B7

и U+2219), представляющих собой маленькую точку в центре позиции буквы, и с неоднозначностью трактовки и перекодировки “толстой точки” с кодом F9 в CP866. По смыслу это должен быть “буллет” (U+2022), но в определении KOI8-R в RFC-1489 стоит U+2219

(“маленькая точка").

7) Unicode Names не совпадают с Postscript Names, содержащимися в шрифтах TrueType. Postscript Names русских букв имеют вид “afii10xx”.

21-Mar-98 Костя Каз. (kazarn@glas.apc.org)


Customize Menus


Этот подпункт дает возможность настроить три элемента - пункты Shell и Macro главного меню, а также контекстное, или, в терминологии NEdit, фоновое, меню (Window Background Menu), вызываемое правой кнопкой мыши.

При настройке пункта Shell вызывается панель со списком имеющихся команд, которые с помощью соответствующих экранных клавиш могут быть удалены (клавиша Delete), скопированы (клавиша Copy) или перемещены вверх или вниз по списку (клавиши Move^ и Move , соответственно).

В расположенном ниже поле командной строки (Shell Command to Execute) содержится собственно код скрипта командной оболочки. Здесь можно непосредственно руками отредактировать соответствующую команду.

Например, в комплекте NEdit предусмотрен скрипт для проверки орфографии (пункт spell). Каковой, вызывая стандартную программу ispell в окне терминала, имеет вид cat>spellTmp; xterm -e ispell -x spellTmp; cat spellTmp; rm spellTmp

и, естественно, понимает только английский язык. Однако обучить его русскому языку (или любому другому, при наличии соответствующего словаря) - трудов не составит. Для этого достаточно указать в командной строке параметр -d russian (предпысывающий обращаться при спеллинге именно к русскому, а не какому другому словарю) - и все в порядке.

Заодно, при желании, можно указать и параметры окна терминала (цвет текста и фона, геометрию и так далее). Или - просто заменить вызов xterm на ту терминальную программу, которая вам больше нравится. В реультате чего скрипт проверки орфографии примет селдующий вид (как у меня) cat>spellTmp; konsole -e ispell -d\ russian -x spellTmp; cat spellTmp; rm spellTmp

Кроме того, в строке Menu Entry можно изменить название скрипта (именно содержимое этой строки и выступает в качестве пункта меню) или организовать иерархическое меню (с помощью знака >), а также привязать скрипт к какому-либо языку (для чего имя его маркируется знаком @ с указанием на последний, например @C++); в последнем случае скрипт будет фигурировать в меню только в том случае, если выбрать соответствующий языковый режим.

Кроме того, в поле Accelerator за скриптом можно закрепить некую комбинацию горячих клавиш. А поле Mnemonic предназначено для ввода литеры, которая будет в меню выделена и послужит для быстрого доступа к команде (с помощью комбинации Alt+литера, что, впрочем, срабатывает далеко не всегда). Можно изменить и ряд условий исполнения команды, о чем будет разговор в соответствующем разделе.

И так можно поступить (при необходимости) с любым из имеющихся в наборе скриптов. Не следует только забывать, завершив редактирование одного, нажимать клавишу Apply перед переходом к следующему - иначе изменения будут утеряны.

Рзумеется, в меню Shell можно включить и скрипты собственного изготовления, для чего в списке имеется пункт New. Однако это будет нашим занятием в одном из следующих разделов.

Сходным образом настраивается и меню Macro. На предназначенной для этого панели также имеется список макрокоманд с кнопками для их удаления, копирования и перемещения вверх и вниз, поле имени (Menu Entry) с возможностью создания многоуровневых иерархических меню (посредством того же знака >), привязкой к языковому режиму и закрепленной клавишной комбинации, а также обширное поле, предназначенное для кода макроса. Доступное для непосредственного редактирования.

Выбрав из списка макросов пункт New, можно нарастить меню собственными командами на языке NEdit Macro. Во-первых, наприсав в поле Macro Command Execute соответствующий код вручную, во-вторых, посредством клавиши Paste Learn/Replay Macro поместив туда запротоколированную (с помощью пунктов меню Macro - Learn Keystrokes или клавишной комбинации Alt+K) последовательность действий. Впрочем, создание макросов будет подробно рассмотрено в следующем разделе.

Абсолютно аналогичным образом можно настроить и конеткстное (или фоновое) меню, вызываемое щелчком правой кнопки мыши на выделенном фрагменте. Как уже говорилось, по умолчанию оно включает привычные для Windows-мигранта пункты Undo, Redo, Cut, Copy и Paste, которые с помощью экранных клавиш Delete, Copy, Move^ и Move можно удалить, скопировать и переместить.

А избрав в списке пункт New, можно пополнить контекстное меню собственными командами, написанными на языке NEdit Macro вручную или посредством протоколирования действий.

Покончив с настройками меню, можно заняться определениями параметров поиска, для чего предназначен пункт



Cygnus DocBook Tools


Необязательно (возможно Red Hat специфичны) - http://www.redhat.com/

Red Hat распространяет три пакета, возможно начиная с версии 6.2,которые обеспечивают поддержку DocBook и некоторые утилиты. Они обеспечивают визуализацию только в форматы HTML и PDF,но их просто установить, если вы используете Red Hat,что поможет вам быстро начать писать, не тратя время на борьбу с утилитами. TeTex 0.9,Jade и Jadetex должны быть установлены перед этими пакетами.

Назад Содержание Вперед
HOWTO-HOWTO   Основы работы с DocBook



ЦзпвпБушЛ ъуЮуэущщКЕ


@anchor{Variable Index} ¦КАБЮКы ъуЮуЕчт:

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-



ЦзпвпБушЛ зчэпщт ь ДЦщзФьы


@anchor{Command Index} ¦КАБЮКы ъуЮуЕчт:

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-

-



Daniel Guerrero


Я заканчиваю обучение на степень бакалавра BUAP в городе Пуэбло (Puebla), Мексика. Учавствую в работе проекта TLPD-ES (испанский вариант The Linux Documentation Project прим. перев.) все мои познания об этих технологиях я приобрел здесь. В настоящий момент я изучаю Web-семантику.



Dave Bodenstab


imdave@synet.net

  

7 августа 1996, среда

Этот документ содержит описание различных файлов шрифтов, которые могут использоваться с FreeBSD и драйвером системной консоли, системой X11, программами Ghostscript и Groff. Даются реально работающие примеры по переключению экрана системной консоли в режим 80x60 и использованию файлов шрифтов формата Type 1 с перечисленными выше прикладными программами.



Дилемма 0.Применять ли XML вообще?


XML предназначен для тех приложений, в которых текст (документ) должен быть легко доступен как программно, так и в читабельном формате. Это своего рода компромисс между бинарным кодом, отражающим встроенные типы языков программирования, и текстовым форматом, предназначенным для восприятия человеком. Примером представления первого типа служит встроенная база данных Berkeley db. Примером данных второго сорта может быть документ в формате RTF или Microsoft Word.

XML полезен также в случаях, когда данные представляются скорее в виде древовидных структур, а не плоских двумерных таблиц отношений, характерных для RDBS («скорее» — потому что, приложив достаточно усилий, древовидную структуру можно представить в виде набора плоских представлений). Другое ограничение, снимаемое XML,— это фиксированная схема данных. Конечно, RDBS тоже могут манипулировать структурами отношений в процессе работы приложения, но, вообще говоря, это не то, для чего они созданы.

Третье преимущество XML — это гарантированная доставка методами Сети, в частности HTTP. Особенно это касается методов использования, когда вы взаимодействуете со стандартизированными протоколами по SOAP. Все это распространяется также и на веб-сервисы, WSDL и так далее. В таких случаях — поскольку вы должны в конце концов представить данные в виде XML — вы, возможно, сочтете удобным хранить и обрабатывать данные тоже в этом формате. На самом деле подробности реализации не входят в компетенцию веб-сервисов, так что последнее решение зависит от вас.

Частным случаем является доступ к базам данных в сети посредством метода доступа XML, поскольку многие производители RDBS предусматривают такую возможность. Естественно, представление отношений в виде XML унаследует все ограничения отношений, то есть все они будут иметь фиксированную схему.

Дилемма 1.
Атрибуты или элементы?

Это один из тех простых вопросов, на которые нет простого ответа. Предположим, у нас есть запись о служащем, состоящая всего из двух элементов:

<worker> <id>48709</id> <name>John Smith</name> </worker>
<
То же самое можно записать и другим способом:
<worker id=48709> <name>John Smith</name> </worker>
Или даже так:
<worker id=»48709» name=»John Smith»/>
Какая запись является предпочтительной? Это зависит от нескольких соображений. Атрибуты доступны непосредственно при выборе элемента, так что можно сэкономить пару строк кода для выбора значения. Задание атрибута фиксирует также его арность — то есть атрибут может быть указан или не указан — но не более одного раза.

С другой стороны, атрибут — это всегда простое значение, которое не может стать сложным ни при каких условиях. Это ограничение можно рассматривать и как положительное — то есть таким образом можно принудительно ограничить фантазию пользователей.

Кроме того, следует иметь в виду два отличия атрибутов и элементов.

Первое из них касается старых типов данных XML 1.0 — таких как ID, IDREF, NMTOKEN и других. В целях совместимости их использование ограничено только атрибутами.

Вторая особенность — это то, как обрабатываются значения по умолчанию. Значение атрибута по умолчанию будет подставлено в том случае, если этот атрибут не указан совсем. Можно задействовать значение элемента по умолчанию — для этого сам элемент должен быть указан, но не должен содержать значения — отсутствие элемента не породит элемент со значением по умолчанию.

Третья особенность — элементы могут адресоваться из других мест того же или другого документа (ссылки). Адресовать подобным образом атрибуты невозможно.


Дилемма 2.Как обеспечить устойчивость?


Устойчивость— это свойство структур данных сохранять свое состояние в промежутках между сеансами, например между запусками программы или между подключениями пользователя к удаленному серверу. Чаще всего XML хранится в виде текстового файла, но для хранения зачастую используются также и табличные базы данных.

Третий вариант — так называемые объектные базы данных — представляют собой некоторые прикладные пакеты ограниченного хождения. Фактически «объектная БД» — это промежуточный программный уровень, который скрывает от пользователя метод хранения XML, то есть именно то, что вы и должны реализовать.

Вопрос хранения в таблицах DB (с методом доступа SQL или не-SQL — не суть важно) носит характер компромисса. На одном полюсе — метод представления всего документа одним полем базы данных, например в таблице с двумя полями: DOCNAME, DOCXML. Преимущества такого подхода очевидны — не нужно разрабатывать никакой логики на уровне DB, все операции ограничиваются тремя действиями: добавить, удалить, выбрать. При этом можно использовать простые и эффективные хранилища: устойчивые хеш-таблицы, Беркли db или ldap. Скорость выборки документа будет максимальной — но поиск и разбор такого документа потребует времени.

Другим полюсом является хранение с высокой степенью детализации. При этом все элементы, текст, атрибуты, ребра и так далее нумеруются уникальными идентификаторами. В таблицу заносится полный перечень узлов и связей. По такой таблице проще искать узел с конкретным значением, связями, типом используя индексированный поиск и запросы, например SQL, но восстановление DOM-представления по такой таблице — задача не для слабонервных.

Конечно, многие попытаются совместить оба варианта. Можно предложить несколько комбинированных подходов, основанных на избыточности и предварительном анализе задачи. Так, если нас интересуют, в основном, только ребра (связи) определеного типа (например, поиск e-mail по нику), то можно составить таблицу отношений для этого типа связей. При этом в другом месте можно хранить полный XML текст для менее частых запросов.

Недостаток комбинирования методов — ваша программа сможет работать только с документами определенного типа, а это не совсем то, для чего создан XML. Кроме того, в условиях избыточности вам придется гарантировать согласованность параллельных вхождений. То есть, если изменяется документ, то должны измениться и все производные отношения. Или, напротив, при изменении отношения должен измениться и документ XML (возможно, такое поведение вообще следует запретить). Иными словами — вам придется скрывать используемый метод доступа (например, SQL) и реализовать свою версию «объектной базы данных», отслеживая целостность данных вручную.



Дилемма 3.Нужна ли схема?


На самом деле существует, по крайней мере, три способа определения схемы документа XML, в том числе DTD, Documet Type Definition и XMLShcema. Последняя является новейшей разработкой, находящейся на стадии стандартизации, и всем разработчикам рекомендовано придерживаться именно этого синтаксиса. Учебник для начинающих можно найти по адресу: www.w3.org/TR/xmlschema-0/.

Самое главное — это то, как вы собираетесь в будущем использовать свои документы и схемы. Возможны три варианта:

1. Структура документа жестко зафиксирована в программе. Например, если вы разбираете XML, полученный как результат запроса к известной базе данных, то ваша программа может выбирать совершенно определенные элементы.

2. Вторая версия происходящего — ссылка на схему приводится в самом документе — например так, как HTML-документ ссылается на CSS. Выглядит это следующим образом:

<article xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="article.xsd">

В таком случае вы можете верифицировать документ относительно такой схемы стандартными средствами SAX и DOM. Другое дело: что делать, если документ не проходит валидацию? Но, тем не менее, это уже что-то.

3. Вариант третий — вы получаете документы из внешнего источника, ничего не зная об их схеме. Простой пример — HTML-документ произвольной структуры. В таком случае вы можете только проверить, удовлетворяет ли документ условиям валидности.

Фактически по отношению к схеме возможна только одна операция — верификация документа с простым вопросом: «удовлетворяет ли документ схеме?». Кроме того, приложение на основании схемы может распределять память — то есть создавать иерархию объектов для документа определенного типа. Учитывая тот факт, что схема является моделью данных, можно рекомендовать всегда строить схему для случаев, когда XML-данные первичны, и опираться на UML-представление структуры БД, когда XML-данные экспортируются из БД.

Дилемма 4.
DOM или SAX?

И тот, и другой метод позволяют разбирать и работать с одними и теми же XML-документами — но на разном уровне.

DOM — это общий способ представления иерархических документов, рекомендация W3C к представлению и методу доступа (фактически сокращение Document Object Model совершенно не ссылается на XML). Архитектурно DOM основан на узловом представлении, то есть объектами представляются элементы, а не связи между ними. В основе иерархии стоит класс Узла — в его функции входит двусторонняя связь по вертикали (с родительским узлом) и по горизонтали (с сестринскими узлами). У каждого узла не более одного сестринского элемента, предшествующего и следующего за ним.

От узла происходят Элементы — это такие узлы, которые дополнительно содержат два списка: список дочерних элементов и список атрибутов. Атрибуты — это пары ключ-значение. Имена ключей должны быть уникальными, но их порядок не имеет значения.

Рисунок: Иллюстрация иерархии объектов DOM. Линии представляют двусторонние связи

Особый случай элемента — Документ, который всегда является корневым элементом. Документ имеет уникальное имя и не имеет родительского элемента. Все остальные узлы имеют родительский документ, причем только один.

От узла происходят также два листовых (не имеющих дочерних) типа узла — Текст и Комментарий. В списке дочерних элементов элемента могут чередоваться узлы других элементов, текста и комментарии в любом порядке.

Помимо классов, над ними определены методы — типично «добавить узел», «удалить узел», «добавить атрибут», «удалить атрибут» и так далее.

Недостаток DOM — достаточно большие накладные расходы на обработку каждого элемента; они могут составлять даже 1000% и более от нетто данных. При обработке больших документов это может стать критическим параметром. Кроме того, некоторые операции с DOM-представлением (такие как поиск) будут связаны со сложным обходом дерева, и в общем случае они медленнее линейного поиска.

Метод доступа через DOM удобен, когда структура документа должна (или может) быть доступна в целом и легко модифицироваться — например так, как это происходит в документе Word или при формировании страницы DHTML.

SAX, Simple API for XML — это де-факто стандартный метод разбора, завязанный конкретно на XML. В основе лежит обработка событий — то есть при открытии и закрытии каждого элемента, получении текста и так далее ваша программа получает управление, сопровождаемое параметрами события. Для своей работы этот метод не требует использования больших хранилищ данных или иерархий объектов в памяти, так что можно обрабатывать очень большие объемы данных на ограниченных ресурсах (как пример практически бесконечного XML-потока представьте датчик сигналов, генерирующий бесконечную последовательность XML-элементов).

Кроме того, SAX-разбор происходит асинхронно, то есть программа не должна ждать завершающего тега для отработки уже полученных. Последнее может пригодиться, например, для отображения записей SQL-запроса еще до того, как все они будут получены. Другое применение — обрыв сеанса, допустим при нахождении одной нужной записи из миллиона.

Недостаток SAX — необходимость хранения состояния в процессе разбора XML-потока, то есть в случае со сложной и/или недетерминированной структурой придется частично реконструировать узловую модель для отслеживания уровней вложения.

SAX и DOM подходы иногда сочетают между собой. Так, веб-браузер отображает элементы в процессе получения по методу SAX, но после получения документа строит его DOM-модель для DHTML-доступа в терминах иерархии объектов.



Дилемма 5.Узлы или ребра?


DOM представляет собой модель, которая в качестве сущностей использует узлы. Этот метод хорош для хранения документа в виде объектов в памяти, но может стать значительной проблемой при хранении иерархических данных в таблицах SQL. Для хранения, напротив, более подходящим будет метод представления, в котором сущностью являются связи между узлами. Дополнительным условием является наличие у всех узлов однозначных идентификаторов, так чтобы было возможно идентифицировать два одинаковых сестринских узла. Поскольку все связи возможно представить в виде простой таблицы, то реберное представление позволяет просто (с учетом наличия идентификаторов) хранить XML в SQL базе данных с максимальной степенью детализации.

Рассмотрим простой пример, иллюстрирующий сказанное. Допустим, у нас есть простая XML-схема (модель статьи):

Рисунок: Модель статьи

На основе этой модели можно создать такой валидный документ:

<?xml version="1.0" encoding="UTF-8"?> <article codename="XML"> <head> <filename>Text</filename> <author>Vasia Pupkin</author> <email>ya_vasia@bigmir.net</email> <editor>ChebotarjovA.</editor> <chars>456</chars> </head> <body> <title>XML parsing</title> <annotation>It's just an example.</annotation> <data> <par> Body text of article. </par> </data> </body> </article>

Добавим к каждому элементу идентификатор для введения определенности в случаях, когда есть последовательность однотипных элементов (вообразите, что у вас есть отношение «первый параграф раздела», но сам-то раздел должен быть идентифицирован). Поскольку у текста и комментариев не может быть дочерних узлов, то для них можно не вводить идентификаторов. Можно ввести культуру (правило) присвоения имен узлам, можно их просто вынимать из «черного ящика» — главное, что они должны быть уникальными. Для автоматизации такой операции нам, очевидно, пригодится SAX. Условно такой документ может выглядеть так (на самом деле его нет необходимости явно генерировать):

<?xml version="1.0" encoding="UTF-8"?> <article ID="1" codename="XML"> <head ID="2"> <filename ID="3">file.rtf</filename> <author ID="4">Vasia Pupkin</author> <email ID="5">ya_vasia@bigmir.net</email> <editor ID="6">Chebotarjov A.</editor> <chars ID="7">456</chars> </head> <body ID="8"> <title ID="9">XML parsing</title> <annotation ID="10">It's just an example.</annotation> <data ID="11"> <par ID="12"> Body text of article. </par> </data> </body> </article>
<
В результате мы можем составить такую таблицу ребер (убедитесь, что по этой таблице можно восстановить исходный документ).

ORDER Источник Тип ребра Приемник Значение
0   подэлемент article.1 статья про XML
1 article.1 атрибут codename XML
2 article.1 подэлемент head.2  
3 head.2 подэлемент filename.3  
4 filename.3 текст   file.rtf
5 head.2 подэлемент author.4  
6 author.4 текст   Vasia Pupkin
Может быть несколько способов реберного представления — в зависимости от терминологии и предполагаемого использования. Значение текста, например, можно считать и значением, и «приемником» (поскольку это все-таки узел). У нас не показаны также «сестринские» связи — а это может оказаться полезным, если важно искать соседние подэлементы. Иногда будет выгодно указывать только первый дочерний элемент и потом — связи типа «следующий».

Можно также нумеровать атрибуты и исключить еще один столбец, но поскольку событие «прибыл атрибут» не предусмотрено в SAX, то сам процесс такой нумерации потребует дополнительного кодирования в духе foreach.

Кроме того, не показана алгебра документов — то есть способ учета документов как атомарных величин. Возможно, для этого будет создана отдельная таблица традиционного формата с полями DOC_ID, DOC_NAME, DOC_DESСRIPTION, DOC_LASTMOD и в том же духе.

Как видно, это представление легко укладывается в одну SQL-таблицу и может быть сравнительно прямолинейно восстановлено с использованием SAX. Фактически многие «объектные» базы данных работают именно таким образом, сохраняя документы в виде реберного представления и восстанавливая их в момент загрузки.

Реберное представление позволяет также оптимизировать поиск — особенно если таблица индексирована по искомому полю. Например, очень легко найти элемент (ы) с заданным индексом, именем, значением атрибута, связью и так далее.


Добавить стороки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal


SED: /olga/w folga

/mike/w fmike

/mal/w fmal (16.1 c.)

AWK: /olga/ {print > "folga"}

/mike/ {print > "fmike"}

/mal/ {print > "fmal"} (46.4 c.)



Добавить строки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal


SED: /olga/w folga

/mike/w fmike

/mal/w fmal (16.1 c.)

AWK: /olga/ {print &gt "folga"}

/mike/ {print &gt "fmike"}

/mal/ {print &gt "fmal"} (46.4 c.)



Добавить в начало каждой строки


sed 's/^/<\/p><p&gt/' ./test/gl11.htm &gt ./test/gl11.ht