diff --git a/assets/mods/basegame/books/btex.xml b/assets/mods/basegame/books/btex.xml index 316fd94b5..997d0dc1c 100644 --- a/assets/mods/basegame/books/btex.xml +++ b/assets/mods/basegame/books/btex.xml @@ -1,13 +1,13 @@ - The Way to Mastery of<br />Lorem Ipsum + The Way to Mastery of<br/>Lorem Ipsum Or, How To Write and Publish a Book Terran Publishing Test Edition - + The Book @@ -18,14 +18,14 @@
What Qualifies as a Book
-

Under the book typesetting system, a Book is a collection of texts typesetted for an improved +

Under the book typesetting system, a Book is a collection of texts typesetted for an improved legibility, enumerable pages, with insertion of other helpful resources such as illustrations and hyperlinks.

Books are considered as bound and always presented in two pages for reading.

Writing a Book Using a Typewriter -

Typewriter allows quick scribbling of the words in convenient manners, just click on them and get +

Typewriter allows quick scribbling of the words in convenient manners, just click on them and get writing!

But it comes with big downsides: you cannot type in multiple writing systems, cannot have defined chapters and sections, cannot include any illustrations, no hyperlinks, and of course, ragged texts.

@@ -37,21 +37,21 @@

Professional-looking texts, with all the benefits of a real Book can be made, or even mass-produced easily with the help of publishers.

To have your precious texts to be printed, you must send your manuscripts to a publisher, and the - manuscript must be written in a special language: the .

-

allows concise description of the entire shape of your book, any style the book typesetting + manuscript must be written in a special language: the .

+

allows concise description of the entire shape of your book, any style the book typesetting system can support can be described and printing presses will produce the papers accordingly. You can even try to mimic the look and feel of papers created using a typewriter, if you want to.

- The + The Introduction -

is a markup language based on XML, with a resemblance of the . - abstracts away the meticulous styling and typesetting configurations, so you can focus on - actually writing your texts than debugging the macros. This does come with a downside of +

is a markup language based on XML, with a resemblance of the . + abstracts away the meticulous styling and typesetting configurations, so you can focus on + actually writing your texts than debugging the macros. This does come with a downside of not being able to change the given style.

-

document is divided up to five parts: the Style Declaration, the +

document is divided up to five parts: the Style Declaration, the Cover, the Table of Contents, the Manuscript, and the Index Page, of which the Style Declaration and the Manuscript are the mandatory parts.

@@ -59,14 +59,14 @@ The Style Declaration -

The Style Declaration is the very first line of a document. Its syntax is as follows:

+

The Style Declaration is the very first line of a document. Its syntax is as follows:

- - - <btexdoc cover="hardcover" inner="standard" papersize="standard"> + + +<btexdoc cover="hardcover" inner="standard" papersize="standard"> -

The btexdoc tag takes three attributes:
+

The btexdoc tag takes three attributes:
cover, inner and papersize.

  • cover — changes the style of the cover. Possible values: hardcover, none
  • @@ -76,19 +76,19 @@ The Cover -

    The Cover defines the text on the cover of the book. If your text has no cover, this part can be omitted. Its syntax is as follows:

    - - - - - - - <cover> -   <title>Title of your book</title> -   <subtitle>Subtitle if necessary</subtitle> -   <author>Who wrote this book</author> -   <edition>Edition information if necessary</edition> - </cover> +

    The Cover defines the text on the cover of the book. If your text has no cover, this part can be omitted. Its syntax is as follows:

    + + + + + + +<cover> +  <title>Title of your book</title> +  <subtitle>Subtitle if necessary</subtitle> +  <author>Who wrote this book</author> +  <edition>Edition information if necessary</edition> +</cover>

    Only the title tag is mandatory. Cover texts will be printed using a special font that has wider gaps between characters. The title text will be printed in a double-size.

    @@ -96,59 +96,59 @@ The Table of Contents -

    The contents of the Table of Contents is filled in automatically by reading through your manuscript; +

    The contents of the Table of Contents is filled in automatically by reading through your manuscript; parts, chapters and sections will be added. Its syntax is as follows:

    - - - <tocpage title="Custom page name if necessary"><tableofcontents /></tocpage> + + +<tocpage title="Custom page name if necessary"><tableofcontents/></tocpage>

    The optional title attribute allows a custom name can be given to this page. If unspecified, the default name is “Table of Contents”.

    -

    The tag <tableofcontents /> is an internal tag used by the typesetter.

    +

    The tag <tableofcontents/> is an internal tag used by the typesetter.

    The Manuscript -

    This is the part where you actually write your body texts in. The body text can have the following tags:

    +

    This is the part where you actually write your body texts in. The body text can have the following tags:

      -
    • part — inserts part separation page to your book
    • -
    • chapter, section — inserts a new chapter/section. If an alternative name is required on the Table of Contents, the alt attribute can be used. If the chapter/section needs to be hidden on the Table of Contents, add the hide="1" attribute. If the chapter must start on a new page, simply add newpage in front of the chapter tag
    • -
    • p — inserts a new paragraph. The body texts must be written inside this tag. All paragraphs will have a 16-pixel indentation, with the following exceptions: first p of the part/chapter/section; first p after br, newpage, pbox, ul, ol or anonbreak
    • -
    • span — allows changing the colour of the texts. The colour must be specified in the colour attribute. Six-digit hex code, three-digit hex code and CSS Colors Level 4 named colours are supported. Note that all the colours will be rounded to the nearest three-digit hex code
    • -
    • emph — is a special case of the span tag. The resulting text will be red
    • -
    • itemname — is a special case of the span tag used to highlight the name of the ingame item. The resulting text will be blue
    • -
    • targetname — is a special case of the span tag used to highlight the name of an arbitrary target or goals. The resulting text will be green
    • -
    • code — is a special case of the span tag used to highlight the code element in-line. The resulting text will be surrounded in a grey box
    • -
    • br — self-closing tag; inserts an anonymous line break
    • -
    • newpage — self-closing tag; inserts an anonymous page break
    • -
    • anonbreak — self-closing tag; inserts a paragraph break in the text. The break will be in a form of a long straight line on the centre of the text. Useful for typesetting novels
    • -
    • pbox — is a paragraph box that holds a text in a grey box, a style similar to the code tag
    • -
    • ul — starts an unordered list. List elements are defined using the li tag
    • -
    • ol — starts an ordered list. List elements are defined using the li tag
    • -
    • fullpagebox — is used to typeset its child tags into a box that fills an entire page, with its contents centred on the page. Must be used after the newpage
    • -
    • btex — self-closing tag; inserts an inline form of the logo in the text
    • +
    • part — inserts part separation page to your book
    • +
    • chapter, section — inserts a new chapter/section. If an alternative name is required on the Table of Contents, the alt attribute can be used. If the chapter/section needs to be hidden on the Table of Contents, add the hide="1" attribute. If the chapter must start on a new page, simply add newpage in front of the chapter tag
    • +
    • p — inserts a new paragraph. The body texts must be written inside this tag. All paragraphs will have a 16-pixel indentation, with the following exceptions: first p of the part/chapter/section; first p after br, newpage, pbox, ul, ol or anonbreak
    • +
    • span — allows changing the colour of the texts. The colour must be specified in the colour attribute. Six-digit hex code, three-digit hex code and CSS Colors Level 4 named colours are supported. Note that all the colours will be rounded to the nearest three-digit hex code
    • +
    • emph — is a special case of the span tag. The resulting text will be red
    • +
    • itemname — is a special case of the span tag used to highlight the name of the ingame item. The resulting text will be blue
    • +
    • targetname — is a special case of the span tag used to highlight the name of an arbitrary target or goals. The resulting text will be green
    • +
    • code — is a special case of the span tag used to highlight the code element in-line. The resulting text will be surrounded in a grey box
    • +
    • br — self-closing tag; inserts an anonymous line break
    • +
    • newpage — self-closing tag; inserts an anonymous page break
    • +
    • anonbreak — self-closing tag; inserts a paragraph break in the text. The break will be in a form of a long straight line on the centre of the text. Useful for typesetting novels
    • +
    • pbox — is a paragraph box that holds a text in a grey box, a style similar to the code tag
    • +
    • ul — starts an unordered list. List elements are defined using the li tag
    • +
    • ol — starts an ordered list. List elements are defined using the li tag
    • +
    • fullpagebox — is used to typeset its child tags into a box that fills an entire page, with its contents centred on the page. Must be used after the newpage
    • +
    • btex — self-closing tag; inserts an inline form of the logo in the text
    -

    Self-closing tags have no child tags. To use a self-closing tag, simply do <tagname />.

    +

    Self-closing tags have no child tags. To use a self-closing tag, simply do <tagname/>.

    Hyperlinking
    -

    Hyperlinks can be defined using index and a tags.

    +

    Hyperlinks can be defined using index and a tags.

      -
    • index — will define a target for a link. Indices require a unique identifier to work as a link, and the identifier must be defined in the id attribute
    • -
    • a — will make its child texts to be clickable. The link target (index identifier) must be defined in the href attribute
    • +
    • index — will define a target for a link. Indices require a unique identifier to work as a link, and the identifier must be defined in the id attribute
    • +
    • a — will make its child texts to be clickable. The link target (index identifier) must be defined in the href attribute
    The Index Page -

    The contents of the Index Page is filled in automatically by reading through your manuscript. +

    The contents of the Index Page is filled in automatically by reading through your manuscript. All the usage of index tags will be shown here. Its syntax is as follows:

    - - - <indexpage title="Custom page name if necessary"><tableofindices /></indexpage> + + +<indexpage title="Custom page name if necessary"><tableofindices/></indexpage>

    The optional title attribute allows a custom name can be given to this page. If unspecified, @@ -157,18 +157,18 @@ Ending the Document -

    The document must begin with the opening btexdoc tag, and therefore must +

    The document must begin with the opening btexdoc tag, and therefore must end with a matching closing tag. Simply write away </btexdoc> and the document is finished.

    Conclusion -

    The finished book description using can be sent to a publisher, and if there are no errors +

    The finished book description using can be sent to a publisher, and if there are no errors on your submission, the printed books of specified number of copies will be delivered to your location within a reasonable amount of business days. Happy writing!

    - +

    this page is intentionally left blank

    @@ -176,5 +176,5 @@ - + diff --git a/assets/mods/basegame/books/literature/ruRU/anton_chekhov_palata_no_6.xml b/assets/mods/basegame/books/literature/ruRU/anton_chekhov_palata_no_6.xml index 7923c1130..8165f5378 100644 --- a/assets/mods/basegame/books/literature/ruRU/anton_chekhov_palata_no_6.xml +++ b/assets/mods/basegame/books/literature/ruRU/anton_chekhov_palata_no_6.xml @@ -1,3 +1,4 @@ + Палата № 6 @@ -8,7 +9,7 @@ - I +

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

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

    На хламе всегда с трубкой в зубах лежит сторож Никита, старый отставной солдат с порыжелыми нашивками. У него суровое, испитое лицо, нависшие брови, придающие лицу выражение степной овчарки, и красный нос; он невысок ростом, на вид сухощав и жилист, но осанка у него внушительная и кулаки здоровенные. Принадлежит он к числу тех простодушных, положительных, исполнительных и тупых людей, которые больше всего на свете любят порядок и потому убеждены, что их надо бить. Он бьет по лицу, по груди, по спине, по чем попало, и уверен, что без этого не было бы здесь порядка. @@ -22,14 +23,14 @@

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

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

    - II +

    Лет 12—15 тому назад, в городе, на самой главной улице, в собственном доме проживал чиновник Громов, человек солидный и зажиточный. У него было два сына: Сергей и Иван. Будучи уже студентом четвертого курса, Сергей заболел скоротечною чахоткой и умер, и эта смерть как бы послужила началом целого ряда несчастий, которые вдруг посыпались на семью Громовых. Через неделю после похорон Сергея старик-отец был отдан под суд за подлоги и растраты и вскоре умер в тюремной больнице от тифа. Дом и вся движимость были проданы с молотка, и Иван Дмитрич с матерью остались без всяких средств.

    Прежде, при отце, Иван Дмитрич, проживая в Петербурге, где он учился в университете, получал 60 — 70 рублей в месяц и не имел никакого понятия о нужде, теперь же ему пришлось резко изменить свою жизнь. Он должен был от утра до ночи давать грошовые уроки, заниматься перепиской и все-таки голодать, так как весь заработок посылался матери на пропитание. Такой жизни не выдержал Иван Дмитрич; он пал духом, захирел и, бросив университет, уехал домой. Здесь, в городке, он по протекции получил место учителя в уездном училище, но не сошелся с товарищами, не понравился ученикам и скоро бросил место. Умерла мать. Он с полгода ходил без места, питаясь только хлебом и водой, затем поступил в судебные пристава. Эту должность занимал он до тех пор, пока не был уволен по болезни.

    Он никогда, даже в молодые студенческие годы, не производил впечатления здорового. Всегда он был бледен, худ, подвержен простуде, мало ел, дурно спал. От одной рюмки вина у него кружилась голова и делалась истерика. Его всегда тянуло к людям, но, благодаря своему раздражительному характеру и мнительности, он ни с кем близко не сходился и друзей не имел. О горожанах он всегда отзывался с презрением, говоря, что их грубое невежество и сонная животная жизнь кажутся ему мерзкими и отвратительными. Говорил он тенором, громко, горячо и не иначе как негодуя и возмущаясь или с восторгом и удивлением, и всегда искренно. О чем, бывало, ни заговоришь с ним, он всё сводит к одному: в городе душно и скучно жить, у общества нет высших интересов, оно ведет тусклую, бессмысленную жизнь, разнообразя ее насилием, грубым развратом и лицемерием; подлецы сыты и одеты, а честные питаются крохами; нужны школы, местная газета с честным направлением, театр, публичные чтения, сплоченность интеллигентных сил; нужно, чтоб общество сознало себя и ужаснулось. В своих суждениях о людях он клал густые краски, только белую и черную, не признавая никаких оттенков; человечество делилось у него на честных и подлецов; середины же не было. О женщинах и любви он всегда говорил страстно, с восторгом, но ни разу не был влюблен.

    В городе, несмотря на резкость его суждений и нервность, его любили и за глаза ласково называли Ваней. Его врожденная деликатность, услужливость, порядочность, нравственная чистота и его поношенный сюртучок, болезненный вид и семейные несчастия внушали хорошее, теплое и грустное чувство; к тому же, он был хорошо образован и начитан, знал, по мнению горожан, всё и был в городе чем-то вроде ходячего справочного словаря.

    Читал он очень много. Бывало, всё сидит в клубе, нервно теребит бородку и перелистывает журналы и книги; и по лицу его видно, что он не читает, а глотает, едва успев разжевать. Надо думать, что чтение было одною из его болезненных привычек, так как он с одинаковою жадностью набрасывался на всё, что попадало ему под руки, даже на прошлогодние газеты и календари. Дома у себя читал он всегда лежа.

    - III +

    Однажды осенним утром, подняв воротник своего пальто и шлепая по грязи, по переулкам и задворкам пробирался Иван Дмитрич к какому-то мещанину, чтобы получить по исполнительному листу. Настроение у него было мрачное, как всегда по утрам. В одном из переулков встретились ему два арестанта в кандалах и с ними четыре конвойных с ружьями. Раньше Иван Дмитрич очень часто встречал арестантов и всякий раз они возбуждали в нем чувства сострадания и неловкости, теперь же эта встреча произвела на него какое-то особенное, странное впечатление. Ему вдруг почему-то показалось, что его тоже могут заковать в кандалы и таким же образом вести по грязи в тюрьму. Побывав у мещанина и возвращаясь к себе домой, он встретил около почты знакомого полицейского надзирателя, который поздоровался и прошел с ним по улице несколько шагов, и почему-то это показалось ему подозрительным. Дома целый день у него не выходили из головы арестанты и солдаты с ружьями, и непонятная душевная тревога мешала ему читать и сосредоточиться. Вечером он не зажигал у себя огня, а ночью не спал и всё думал о том, что его могут арестовать, заковать и посадить в тюрьму. Он не знал за собой никакой вины и мог поручиться, что и в будущем никогда не убьет, не подожжет и не украдет; но разве трудно совершить преступление нечаянно, невольно, и разве не возможна клевета, наконец, судебная ошибка? Ведь недаром же вековой народный опыт учит от сумы да тюрьмы не зарекаться. А судебная ошибка при теперешнем судопроизводстве очень возможна и ничего в ней нет мудреного. Люди, имеющие служебное, деловое отношение к чужому страданию, например, судьи, полицейские, врачи, с течением времени, в силу привычки, закаляются до такой степени, что хотели бы, да не могут относиться к своим клиентам иначе как формально; с этой стороны они ничем не отличаются от мужика, который на задворках режет баранов и телят и не замечает крови. При формальном же, бездушном отношении к личности, для того, чтобы невинного человека лишить всех прав состояния и присудить к каторге, судье нужно только одно: время. Только время на соблюдение кое-каких формальностей, за которые судье платят жалованье, а затем — всё кончено. Ищи потом справедливости и защиты в этом маленьком, грязном городишке, за двести верст от железной дороги! Да и не смешно ли помышлять о справедливости, когда всякое насилие встречается обществом как разумная и целесообразная необходимость и всякий акт милосердия, например, оправдательный приговор, вызывает целый взрыв неудовлетворенного, мстительного чувства?

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

    Городовой, не спеша, прошел мимо окон: это недаром. Вот два человека остановились около дома и молчат. Почему они молчат? @@ -39,7 +40,7 @@

    Его задержали, привели домой и послали хозяйку за доктором. Доктор Андрей Ефимыч, о котором речь впереди, прописал холодные примочки на голову и лавровишневые капли, грустно покачал головой и ушел, сказав хозяйке, что уж больше он не придет, потому что не следует мешать людям сходить с ума. Так как дома не на что было жить и лечиться, то скоро Ивана Дмитрича отправили в больницу и положили его там в палате для венерических больных. Он не спал по ночам, капризничал и беспокоил больных и скоро, по распоряжению Андрея Ефимыча, был переведен в палату № 6.

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

    - IV +

    Сосед с левой стороны у Ивана Дмитрича, как я уже сказал, жид Мойсейка, сосед же с правой — оплывший жиром, почти круглый мужик с тупым, совершенно бессмысленным лицом. Это — неподвижное, обжорливое и нечистоплотное животное, давно уже потерявшее способность мыслить и чувствовать. От него постоянно идет острый, удушливый смрад.

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

    Пятый и последний обитатель палаты № 6 — мещанин, служивший когда-то сортировщиком на почте, маленький, худощавый блондин с добрым, но несколько лукавым лицом. Судя по умным, покойным глазам, смотрящим ясно и весело, он себе на уме и имеет какую-то очень важную и приятную тайну. У него есть под подушкой и под матрацем что-то такое, чего он никому не показывает, но не из страха, что могут отнять или украсть, а из стыдливости. Иногда он подходит к окну и, обернувшись к товарищам спиной, надевает себе что-то на грудь и смотрит, нагнув голову; если в это время подойти к нему, то он сконфузится и сорвет что-то с груди. Но тайну его угадать не трудно. @@ -52,7 +53,7 @@

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

    Распустили слух, что палату № 6 будто бы стал посещать доктор.

    - V +

    Странный слух!

    Доктор Андрей Ефимыч Рагин — замечательный человек в своем роде. Говорят, что в ранней молодости он был очень набожен и готовил себя к духовной карьере, и что, кончив в 1863 году курс в гимназии, он намеревался поступить в духовную академию, но будто бы его отец, доктор медицины и хирург, едко посмеялся над ним и заявил категорически, что не будет считать его своим сыном, если он пойдет в попы. Насколько это верно — не знаю, но сам Андрей Ефимыч не раз признавался, что он никогда не чувствовал призвания к медицине и вообще к специальным наукам.

    Как бы то ни было, кончив курс по медицинскому факультету, он в священники не постригся. Набожности он не проявлял и на духовную особу в начале своей врачебной карьеры походил так же мало, как теперь. @@ -66,7 +67,7 @@

    Да и к чему мешать людям умирать, если смерть есть нормальный и законный конец каждого? Что из того, если какой-нибудь торгаш или чиновник проживет лишних пять, десять лет? Если же видеть цель медицины в том, что лекарства облегчают страдания, то невольно напрашивается вопрос: зачем их облегчать? Во-первых, говорят, что страдания ведут человека к совершенству, и, во-вторых, если человечество в самом деле научится облегчать свои страдания пилюлями и каплями, то оно совершенно забросит религию и философию, в которых до сих пор находило не только защиту от всяких бед, но даже счастие. Пушкин перед смертью испытывал страшные мучения, бедняжка Гейне несколько лет лежал в параличе; почему же не поболеть какому-нибудь Андрею Ефимычу или Матрене Савишне, жизнь которых бессодержательна и была бы совершенно пуста и похожа на жизнь амёбы, если бы не страдания?

    Подавляемый такими рассуждениями, Андрей Ефимыч опустил руки и стал ходить в больницу не каждый день.

    - VI +

    Жизнь его проходит так. Обыкновенно он встает утром часов в восемь, одевается и пьет чай. Потом садится у себя в кабинете читать или идет в больницу. Здесь, в больнице, в узком темном коридорчике сидят амбулаторные больные, ожидающие приемки. Мимо них, стуча сапогами по кирпичному полу, бегают мужики и сиделки, проходят тощие больные в халатах, проносят мертвецов и посуду с нечистотами, плачут дети, дует сквозной ветер. Андрей Ефимыч знает, что для лихорадящих, чахоточных и вообще впечатлительных больных такая обстановка мучительна, но что поделаешь? В приемной встречает его фельдшер Сергей Сергеич, маленький, толстый человек с бритым, чисто вымытым, пухлым лицом, с мягкими плавными манерами и в новом просторном костюме, похожий больше на сенатора, чем на фельдшера. В городе он имеет громадную практику, носит белый галстук и считает себя более сведущим, чем доктор, который совсем не имеет практики. В углу, в приемной, стоит большой образ в киоте, с тяжелою лампадой, возле — ставник в белом чехле; на стенах висят портреты архиереев, вид Святогорского монастыря и венки из сухих васильков. Сергей Сергеич религиозен и любит благолепие. Образ поставлен его иждивением; по воскресеньям в приемной кто-нибудь из больных, по его приказанию, читает вслух акафист, а после чтения сам Сергей Сергеич обходит все палаты с кадильницей и кадит в них ладаном.

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

    — Болеем и нужду терпим оттого, — говорит он, — что господу милосердному плохо молимся. Да! @@ -104,7 +105,7 @@

    — Однако, в какую глушь занесла нас судьба!

    Досаднее всего, что здесь и умирать придется. Эх!..

    - VII +

    Проводив приятеля, Андрей Ефимыч садится за стол и опять начинает читать. Тишина вечера и потом ночи не нарушается ни одним звуком, и время, кажется, останавливается и замирает вместе с доктором над книгой, и кажется, что ничего не существует, кроме этой книги и лампы с зеленым колпаком. Грубое, мужицкое лицо доктора мало-помалу озаряется улыбкой умиления и восторга перед движениями человеческого ума. О, зачем человек не бессмертен? — думает он. — Зачем мозговые центры и извилины, зачем зрение, речь, самочувствие, гений, если всему этому суждено уйти в почву и, в конце концов, охладеть вместе с земною корой, а потом миллионы лет без смысла и без цели носиться с землей вокруг солнца? Для того, чтобы охладеть и потом носиться, совсем не нужно извлекать из небытия человека с его высоким, почти божеским умом, и потом, словно в насмешку, превращать его в глину.

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

    Когда бьют часы, Андрей Ефимыч откидывается на спинку кресла и закрывает глаза, чтобы немножко подумать. И невзначай, под влиянием хороших мыслей, вычитанных из книги, он бросает взгляд на свое прошедшее и на настоящее. Прошлое противно, лучше не вспоминать о нем. А в настоящем то же, что в прошлом. Он знает, что в то время, когда его мысли носятся вместе с охлажденною землей вокруг солнца, рядом с докторской квартирой, в большом корпусе томятся люди в болезнях и физической нечистоте; быть может, кто-нибудь не спит и воюет с насекомыми, кто-нибудь заражается рожей или стонет от туго положенной повязки; быть может, больные играют в карты с сиделками и пьют водку. В отчетном году было обмануто 12000 человек; всё больничное дело, как и 20 лет назад, построено на воровстве, дрязгах, сплетнях, кумовстве, на грубом шарлатанстве, и больница по-прежнему представляет из себя учреждение безнравственное и в высшей степени вредное для здоровья жителей. Он знает, что в палате № 6 за решетками Никита колотит больных и что Мойсейка каждый день ходит по городу и собирает милостыню. @@ -114,11 +115,11 @@

    «Я служу вредному делу и получаю жалованье от людей, которых обманываю; я не честен. Но ведь сам по себе я ничто, я только частица необходимого социального зла: все уездные чиновники вредны и даром получают жалованье… Значит, в своей нечестности виноват не я, а время… Родись я двумястами лет позже, я был бы другим».

    Когда бьет 3 часа, он тушит лампу и уходит в спальню. Спать ему не хочется.

    - VIII +

    Года два тому назад земство расщедрилось и постановило выдавать триста рублей ежегодно в качестве пособия на усиление медицинского персонала в городской больнице впредь до открытия земской больницы, и на помощь Андрею Ефимычу был приглашен городом уездный врач Евгений Федорыч Хоботов. Это еще очень молодой человек — ему нет и тридцати, — высокий брюнет с широкими скулами и маленькими глазками; вероятно, предки его были инородцами. Приехал он в город без гроша денег, с небольшим чемоданчиком и с молодою некрасивою женщиной, которую он называет своею кухаркой. У этой женщины грудной младенец. Ходит Евгений Федорыч в фуражке с козырьком и в высоких сапогах, а зимой в полушубке. Он близко сошелся с фельдшером Сергеем Сергеичем и с казначеем, а остальных чиновников называет почему-то аристократами и сторонится их. Во всей квартире у него есть только одна книга — «Новейшие рецепты венской клиники за 1881 г.» Идя к больному, он всегда берет с собой и эту книжку. В клубе по вечерам играет он в бильярд, карт же не любит. Большой охотник употреблять в разговоре такие слова, как канитель, мантифолия с уксусом, будет тебе тень наводить и т. п.

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

    - IX +

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

    — Дай копеечку! — обратился он к доктору, дрожа от холода и улыбаясь.

    Андрей Ефимыч, который никогда не умел отказывать, подал ему гривенник. @@ -179,7 +180,7 @@

    «Какой приятный молодой человек! — думал Андрей Ефимыч, идя к себе на квартиру. — За всё время, пока я тут живу, это, кажется, первый, с которым можно поговорить. Он умеет рассуждать и интересуется именно тем, чем нужно».

    Читая и потом ложась спать, он всё время думал об Иване Дмитриче, а проснувшись на другой день утром, вспомнил, что вчера познакомился с умным и интересным человеком, и решил сходить к нему еще раз при первой возможности.

    - X +

    Иван Дмитрич лежал в такой же позе, как вчера, обхватив голову руками и поджав ноги. Лица его не было видно.

    — Здравствуйте, мой друг, — сказал Андрей Ефимыч. — Вы не спите?

    — Во-первых, я вам не друг, — проговорил Иван Дмитрич в подушку, — а во-вторых, вы напрасно хлопочете: вы не добьетесь от меня ни одного слова. @@ -223,7 +224,7 @@

    — Да, как же! А вот если бы вас трахнул паралич или, положим, какой-нибудь дурак и наглец, пользуясь своим положением и чином, оскорбил вас публично и вы знали бы, что это пройдет ему безнаказанно, — ну, тогда бы вы поняли, как это отсылать других к уразумению и истинному благу.

    — Это оригинально, — сказал Андрей Ефимыч, смеясь от удовольствия и потирая руки. — Меня приятно поражает в вас склонность к обобщениям, а моя характеристика, которую вы только что изводили сделать, просто блестяща. Признаться, беседа с вами доставляет мне громадное удовольствие. Ну-с, я вас выслушал, теперь и вы благоволите выслушать меня…

    - XI +

    Этот разговор продолжался еще около часа и, по-видимому, произвел на Андрея Ефимыча глубокое впечатление. Он стал ходить во флигель каждый день. Ходил он туда по утрам и после обеда, и часто вечерняя темнота заставала его в беседе с Иваном Дмитричем. В первое время Иван Дмитрич дичился его, подозревал в злом умысле и откровенно выражал свою неприязнь, потом же привык к нему и свое резкое обращение сменил на снисходительно-ироническое.

    Скоро по больнице разнесся слух, что доктор Андрей Ефимыч стал посещать палату № 6. Никто — ни фельдшер, ни Никита, ни сиделки не могли понять, зачем он ходил туда, зачем просиживал там по целым часам, о чем разговаривал и почему не прописывал рецептов. Поступки его казались странными. Михаил Аверьяныч часто не заставал его дома, чего раньше никогда не случалось, и Дарьюшка была очень смущена, так как доктор пил пиво уже не в определенное время и иногда даже запаздывал к обеду.

    Однажды, это было уже в конце июня, доктор Хоботов пришел по какому-то делу к Андрею Ефимычу; не застав его дома, он отправился искать его по двору; тут ему сказали, что старый доктор пошел к душевнобольным. Войдя во флигель и остановившись в сенях, Хоботов услышал такой разговор: @@ -234,7 +235,7 @@

    — А наш дед, кажется, совсем сдрефил! — сказал Хоботов, выходя из флигеля.

    — Господи, помилуй нас, грешных! — вздохнул благолепный Сергей Сергеич, старательно обходя лужицы, чтобы не запачкать своих ярко вычищенных сапогов. — Признаться, уважаемый Евгений Федорыч, я давно уже ожидал этого!

    - XII +

    После этого Андрей Ефимыч стал замечать кругом какую-то таинственность. Мужики, сиделки и больные при встрече с ним вопросительно взглядывали на него и потом шептались. Девочка Маша, дочь смотрителя, которую он любил встречать в больничном саду, теперь, когда он с улыбкой подходил к ней, чтобы погладить ее по головке, почему-то убегала от него. Почтмейстер Михаил Аверьяныч, слушая его, уже не говорил: «Совершенно верно», а в непонятном смущении бормотал: «да, да, да…» и глядел на него задумчиво и печально; почему-то он стал советовать своему другу оставить водку и пиво, но при этом, как человек деликатный, говорил не прямо, а намеками, рассказывая то про одного батальонного командира, отличного человека, то про полкового священника, славного малого, которые пили и заболели, но, бросив пить, совершенно выздоровели. Два-три раза приходил к Андрею Ефимычу коллега Хоботов; он тоже советовал оставить спиртные напитки и без всякого видимого повода рекомендовал принимать бромистый калий.

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

    — Тут заявленьице по вашей части-с, — обратился член управы к Андрею Ефимычу после того, как все поздоровались и сели за стол. — Вот Евгений Федорыч говорят, что аптеке тесновато в главном корпусе и что ее надо бы перевести в один из флигелей. Оно, конечно, это ничего, перевести можно, но главная причина — флигель ремонту захочет. @@ -266,7 +267,7 @@

    — А вы собственно куда намерены ехать? — спросил он.

    — В Москву, в Петербург, в Варшаву… В Варшаве я провел пять счастливейших лет моей жизни. Что за город изумительный! Едемте, дорогой мой!

    - XIII +

    Через неделю Андрею Ефимычу предложили отдохнуть, то есть подать в отставку, к чему он отнесся равнодушно, а еще через неделю он и Михаил Аверьяныч уже сидели в почтовом тарантасе и ехали на ближайшую железнодорожную станцию. Дни были прохладные, ясные, с голубым небом и с прозрачною далью. Двести верст до станции проехали в двое суток и по пути два раза ночевали. Когда на почтовых станциях подавали к чаю дурно вымытые стаканы или долго запрягали лошадей, то Михаил Аверьяныч багровел, трясся всем телом и кричал: «Замолчать! не рассуждать!» А сидя в тарантасе, он, не переставая ни на минуту, рассказывал о своих поездках по Кавказу и Царству Польскому. Сколько было приключений, какие встречи! Он говорил громко и при этом делал такие удивленные глаза, что можно было подумать, что он лгал. Вдобавок, рассказывая, он дышал в лицо Андрею Ефимычу и хохотал ему в ухо. Это стесняло доктора и мешало ему думать и сосредоточиться.

    По железной дороге ехали из экономии в третьем классе, в вагоне для некурящих. Публика наполовину была чистая. Михаил Аверьяныч скоро со всеми перезнакомился и, переходя от скамьи к скамье, громко говорил, что не следует ездить по этим возмутительным дорогам. Кругом мошенничество! То ли дело верхом на коне: отмахаешь в один день сто верст и потом чувствуешь себя здоровым и свежим. А неурожаи у нас оттого, что осушили Пинские болота. Вообще беспорядки страшные. Он горячился, говорил громко и не давал говорить другим. Эта бесконечная болтовня вперемежку с громким хохотом и выразительными жестами утомила Андрея Ефимыча.

    «Кто из нас обоих сумасшедший? — думал он с досадой. — Я ли, который стараюсь ничем не обеспокоить пассажиров, или этот эгоист, который думает, что он здесь умнее и интереснее всех, и оттого никому не дает покоя?» @@ -277,7 +278,7 @@

    Обедали они у Тестова. Михаил Аверьяныч долго смотрел в меню, разглаживая бакены, и сказал тоном гурмана, привыкшего чувствовать себя в ресторанах как дома:

    — Посмотрим, чем вы нас сегодня покормите, ангел!

    - XIV +

    Доктор ходил, смотрел, ел, пил, но чувство у него было одно: досада на Михаила Аверьяныча. Ему хотелось отдохнуть от друга, уйти от него, спрятаться, а друг считал своим долгом не отпускать его ни на шаг от себя и доставлять ему возможно больше развлечений. Когда не на что было смотреть, он развлекал его разговорами. Два дня терпел Андрей Ефимыч, но на третий объявил своему другу, что он болен и хочет остаться на весь день дома. Друг сказал, что в таком случае и он остается. В самом деле, надо отдохнуть, а то этак ног не хватит. Андрей Ефимыч лег на диван, лицом к спинке и, стиснув зубы, слушал своего друга, который горячо уверял его, что Франция рано или поздно непременно разобьет Германию, что в Москве очень много мошенников и что по наружному виду лошади нельзя судить о ее достоинствах. У доктора начались шум в ушах и сердцебиение, но попросить друга уйти или помолчать он из деликатности не решался. К счастию, Михаилу Аверьянычу наскучило сидеть в номере, и он после обеда ушел прогуляться.

    Оставшись один, Андрей Ефимыч предался чувству отдыха. Как приятно лежать неподвижно на диване и сознавать, что ты один в комнате! Истинное счастие невозможно без одиночества. Падший ангел изменил богу, вероятно, потому, что захотел одиночества, которого не знают ангелы. Андрей Ефимыч хотел думать о том, что он видел и слышал в последние дни, но Михаил Аверьяныч не выходил у него из головы.

    «А ведь он взял отпуск и поехал со мной из дружбы, из великодушия, — думал доктор с досадой. — Хуже нет ничего, как эта дружеская опека. Ведь вот, кажется, и добр, и великодушен, и весельчак, а скучен. Нестерпимо скучен. Так же вот бывают люди, которые всегда говорят одни только умные и хорошие слова, но чувствуешь, что они тупые люди». @@ -303,7 +304,7 @@

    — Я же и говорю вам: восемьдесят шесть рублей… Больше у меня ничего нет.

    Михаил Аверьяныч считал доктора честным и благородным человеком, но все-таки подозревал, что у него есть капитал по крайней мере тысяч в двадцать. Теперь же, узнав, что Андрей Ефимыч нищий, что ему нечем жить, он почему-то вдруг заплакал и обнял своего друга.

    - XV +

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

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

    Он два раза ходил в больницу к Ивану Дмитричу, чтобы поговорить с ним. Но в оба раза Иван Дмитрич был необыкновенно возбужден и зол; он просил оставить его в покое, так как ему давно уже надоела пустая болтовня, и говорил, что у проклятых подлых людей он за все страдания просит только одной награды — одиночного заключения. Неужели даже в этом ему отказывают? Когда Андрей Ефимыч прощался с ним в оба раза и желал покойной ночи, то он огрызался и говорил: @@ -316,7 +317,7 @@

    Чтобы заглушить мелочные чувства, он спешил думать о том, что и он сам, и Хоботов, и Михаил Аверьяныч должны рано или поздно погибнуть, не оставив в природе даже отпечатка. Если вообразить, что через миллион лет мимо земного шара пролетит в пространстве какой-нибудь дух, то он увидит только глину и голые утесы. Всё — и культура, и нравственный закон — пропадет и даже лопухом не порастет. Что же значат стыд перед лавочником, ничтожный Хоботов, тяжелая дружба Михаила Аверьяныча? Всё это вздор и пустяки.

    Но такие рассуждения уже не помогали. Едва он воображал земной шар через миллион лет, как из-за голого утеса показывался Хоботов в высоких сапогах или напряженно хохочущий Михаил Аверьяныч и даже слышался стыдливый шепот: «А варшавский долг, голубчик, возвращу на этих днях… Непременно».

    - XVI +

    Однажды Михаил Аверьяныч пришел после обеда, когда Андрей Ефимыч лежал на диване. Случилось так, что в это же время явился и Хоботов с бромистым калием. Андрей Ефимыч тяжело поднялся, сел и уперся обеими руками о диван.

    — А сегодня, дорогой мой, — начал Михаил Аверьяныч, — у вас цвет лица гораздо лучше, чем вчера. Да вы молодцом! Ей-богу, молодцом!

    — Пора, пора поправляться, коллега, — сказал Хоботов, зевая. — Небось вам самим надоела эта канитель. @@ -356,7 +357,7 @@

    — Тут у одного произошло осложнение со стороны легких, — сказал вполголоса Хоботов, входя с Андреем Ефимычем в палату. — Вы погодите здесь, а я сейчас. Схожу только за стетоскопом.

    И вышел.

    - XVII +

    Уже смеркалось. Иван Дмитрич лежал на своей постели, уткнувшись лицом в подушку; паралитик сидел неподвижно, тихо плакал и шевелил губами. Толстый мужик и бывший сортировщик спали. Было тихо.

    Андрей Ефимыч сидел на кровати Ивана Дмитрича и ждал. Но прошло с полчаса, и вместо Хоботова вошел в палату Никита, держа в охапке халат, чье-то белье и туфли.

    — Пожалуйте одеваться, ваше высокоблагородие, — сказал он тихо. — Вот ваша постелька, пожалуйте сюда, — добавил он, указывая на пустую, очевидно, недавно принесенную кровать. — Ничего, бог даст, выздоровеете. @@ -376,7 +377,7 @@

    Вернулся Мойсейка и, увидев доктора, протянул руку.

    — Дай копеечку! — сказал он.

    - XVIII +

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

    «Вот она действительность!» — подумал Андрей Ефимыч, и ему стало страшно.

    Были страшны и луна, и тюрьма, и гвозди на заборе, и далекий пламень в костопальном заводе. Сзади послышался вздох. Андрей Ефимыч оглянулся и увидел человека с блестящими звездами и с орденами на груди, который улыбался и лукаво подмигивал глазом. И это показалось страшным. @@ -407,7 +408,7 @@

    Громко вскрикнул Иван Дмитрич. Должно быть, и его били.

    Затем всё стихло. Жидкий лунный свет шел сквозь решетки, и на полу лежала тень, похожая на сеть. Было страшно. Андрей Ефимыч лег и притаил дыхание; он с ужасом ждал, что его ударят еще раз. Точно кто взял серп, воткнул в него и несколько раз повернул в груди и в кишках. От боли он укусил подушку и стиснул зубы, и вдруг в голове его, среди хаоса, ясно мелькнула страшная, невыносимая мысль, что такую же точно боль должны были испытывать годами, изо дня в день эти люди, казавшиеся теперь при лунном свете черными тенями. Как могло случиться, что в продолжение больше чем двадцати лет он не знал и не хотел знать этого? Он не знал, не имел понятия о боли, значит, он не виноват, но совесть, такая же несговорчивая и грубая, как Никита, заставила его похолодеть от затылка до пят. Он вскочил, хотел крикнуть изо всех сил и бежать скорее, чтоб убить Никиту, потом Хоботова, смотрителя и фельдшера, потом себя, но из груди не вышло ни одного звука, и ноги не повиновались; задыхаясь, он рванул на груди халат и рубаху, порвал и без чувств повалился на кровать.

    - XIX +

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

    Он не ел, не пил, лежал неподвижно и молчал.

    «Мне всё равно, — думал он, когда ему задавали вопросы. — Отвечать не стану… Мне всё равно». diff --git a/assets/mods/basegame/books/test.xml b/assets/mods/basegame/books/test.xml index 87723c902..117ec2d60 100644 --- a/assets/mods/basegame/books/test.xml +++ b/assets/mods/basegame/books/test.xml @@ -1,178 +1,21 @@ + - - The Way to Mastery of<br />Lorem Ipsum - Or, How To Write and Publish a Book - Terran Publishing - Test Edition - - - - - The Book - - What Is a Book - -

    This example book is written to give readers the example of the Book Language.

    - -
    What Qualifies as a Book
    - -

    Under the book typesetting system, a Book is a collection of texts typesetted for an improved - legibility, enumerable pages, with insertion of other helpful resources such as illustrations - and hyperlinks.

    -

    Books are considered as bound and always presented in two pages for reading.

    - - Writing a Book Using a Typewriter - -

    Typewriter allows quick scribbling of the words in convenient manners, just click on them and get - writing!

    -

    But it comes with big downsides: you cannot type in multiple writing systems, cannot have defined - chapters and sections, cannot include any illustrations, no hyperlinks, and of course, ragged texts.

    -

    Typed papers are considered as non-bound and only one page at a time will be presented.

    -

    All in all, you cannot write a true Book using a typewriter.

    - - Writing a Book with Publishers and Printing Presses - -

    Professional-looking texts, with all the benefits of a real Book can be made, or even mass-produced - easily with the help of publishers.

    -

    To have your precious texts to be printed, you must send your manuscripts to a publisher, and the - manuscript must be written in a special language: the .

    -

    allows concise description of the entire shape of your book, any style the book typesetting - system can support can be described and printing presses will produce the papers accordingly. - You can even try to mimic the look and feel of papers created using a typewriter, if you want to.

    - - - The - - Introduction - -

    is a markup language based on XML, with a resemblance of the . - abstracts away the meticulous styling and typesetting configurations, so you can focus on - actually writing your texts than debugging the macros. This does come with a downside of - not being able to change the given style.

    -

    document is divided up to five parts: the Style Declaration, the - Cover, the Table of Contents, the - Manuscript, and the Index Page. Of which the - Style Declaration and the Manuscript is the mandatory parts.

    - - The Style Declaration - +

    Terrarum version . The transaction fee is

    The Style Declaration is the very first line of a document. Its syntax is as follows:

    - - - - <btexdoc cover="hardcover" inner="standard" papersize="standard"> - - +

    The btexdoc tag takes one attribute: cover.

    +

    The btexdoc tag takes two attributes: cover and inner.

    The btexdoc tag takes three attributes: cover, inner and papersize.

    -
      -
    • cover — changes the style of the cover. Possible values: hardcover, none
    • -
    • inner — changes the style of the body. Possible values: standard, typewriter
    • -
    • papersize — defines the size of the paper. Possible values: standard
    • -
    - - The Cover - -

    The Cover defines the text on the cover of the book. If your text has no cover, this part can be omitted. Its syntax is as follows:

    +

    Test with excessive white spaces !!

    - - - - - - <cover> -   <title>Title of your book</title> -   <subtitle>Subtitle if necessary</subtitle> -   <author>Who wrote this book</author> -   <edition>Edition information if necessary</edition> - </cover> + A Callout! -

    Only the title tag is mandatory. Cover texts will be printed using a special font that has wider - gaps between characters. The title text will be printed in a double-size.

    - - - The Table of Contents - -

    The contents of the Table of Contents is filled in automatically by reading through your manuscript; - parts, chapters and sections will be added. Its syntax is as follows:

    - - - - <tocpage title="Custom page name if necessary"><tableofcontents /></tocpage> +

    Another paragraph, another Lorem Ipsum. Eget duis at tellus at urna. Eget sit amet tellus cras adipiscing enim eu. Sit amet tellus cras adipiscing enim eu turpis egestas. Aliquam faucibus purus in massa tempor. Eget nullam non nisi est sit amet. Eu ultrices vitae auctor eu augue ut lectus. Tortor at auctor urna nunc.Quam lacus suspendisse faucibus interdum posuere lorem ipsum.

    + + Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph Long Pbox paragraph - -

    The optional title attribute allows a custom name can be given to this page. - If unspecified, the default name is “Table of Contents”.

    -

    The tag <tableofcontents /> is an internal tag used by the typesetter.

    - - - The Manuscript - -

    This is the part where you actually write your body texts in. The body text can have the following tags:

    -
      -
    • part — inserts part separation page to your book
    • -
    • chapter, section — inserts a new chapter/section. If an alternative name is required on the Table of Contents, the alt attribute can be used. If the chapter/section needs to be hidden on the Table of Contents, add the hide="1" attribute. If the chapter must start on a new page, simply add newpage in front of the chapter tag
    • -
    • p — inserts a new paragraph. The body texts must be written inside this tag. All paragraphs will have a 16-pixel indentation, with the following exceptions: first p of the part/chapter/section; first p after br, newpage, pbox, ul, ol or anonbreak
    • -
    • span — allows changing the colour of the texts. The colour must be specified in the colour attribute. Six-digit hex code, three-digit hex code and CSS Colors Level 4 named colours are supported. Note that all the colours will be rounded to the nearest three-digit hex code
    • -
    • emph — is a special case of the span tag. The resulting text will be red
    • -
    • itemname — is a special case of the span tag used to highlight the name of the ingame item. The resulting text will be blue
    • -
    • targetname — is a special case of the span tag used to highlight the name of an arbitrary target or goals. The resulting text will be green
    • -
    • code — is a special case of the span tag used to highlight the code element in-line. The resulting text will be surrounded in a grey box
    • -
    • br — self-closing tag; inserts an anonymous line break
    • -
    • newpage — self-closing tag; inserts an anonymous page break
    • -
    • anonbreak — self-closing tag; inserts a paragraph break in the text. The break will be in a form of a long straight line on the centre of the text. Useful for typesetting novels
    • -
    • pbox — is a paragraph box that holds a text in a grey box, a style similar to the code tag
    • -
    • ul — starts an unordered list. List elements are defined using the li tag
    • -
    • ol — starts an ordered list. List elements are defined using the li tag
    • -
    • fullpagebox — is used to typeset its child tags into a box that fills an entire page, with its contents centred on the page. Must be used after the newpage
    • -
    • btex — self-closing tag; inserts an inline form of the logo in the text
    • -
    -

    Self-closing tags have no child tags. To use a self-closing tag, simply do <tagname />.

    - - -
    Hyperlinking
    - -

    Hyperlinks can be defined using index and a tags.

    -
      -
    • index — will define a target for a link. Indices require a unique identifier to work as a link, and the identifier must be defined in the id attribute
    • -
    • a — will make its child texts to be clickable. The link target (index identifier) must be defined in the href attribute
    • -
    - - The Index Page - -

    The contents of the Index Page is filled in automatically by reading through your manuscript. - All the usage of index tags will be shown here. Its syntax is as follows:

    - - - - <indexpage title="Custom page name if necessary"><tableofindices /></indexpage> - - -

    The optional title attribute allows a custom name can be given to this page. If unspecified, - the default name is “Index”.

    - - - Ending the Document - -

    The document must begin with the opening btexdoc tag, and therefore must - end with a matching closing tag. Simply write away </btexdoc> and the - document is finished.

    - - - Conclusion - -

    The finished book description using can be sent to a publisher, and if there are no errors - on your submission, the printed books of specified number of copies will be delivered to your - location within a reasonable amount of business days. Happy writing!

    - - - - -

    this page is intentionally left blank

    -
    +

    Yet another paragraph, another Lorem Ipsum. Eget duis at tellus at urna. Eget sit amet tellus cras adipiscing enim eu. Sit amet tellus cras adipiscing enim eu turpis egestas. Aliquam faucibus purus in massa tempor. Eget nullam non nisi est sit amet. Eu ultrices vitae auctor eu augue ut lectus. Tortor at auctor urna nunc.Quam lacus suspendisse faucibus interdum posuere lorem ipsum.

    - -
    diff --git a/btexdoc.dtd b/btexdoc.dtd index 427c7095b..b439fb7ee 100644 --- a/btexdoc.dtd +++ b/btexdoc.dtd @@ -1,6 +1,12 @@ + + + + + + @@ -26,6 +32,10 @@ + + - - - - - + - + - + - + @@ -120,13 +129,10 @@ type %ULStyle; #IMPLIED compact (compact) #IMPLIED > - > = HashMap() private val paragraphBuffer = StringBuilder() + private var currentAlign = "justify" fun clearParBuffer() { paragraphBuffer.clear() + currentAlign = "justify" + codeMode = false + hrefMode = false + bucksMode = false + spanColour = null + currentTheme = "" } private val objDict = HashMap BTeXBatchDrawCall>() @@ -109,9 +118,9 @@ object BTeXParser { private var lastTagAtDepth = Array(24) { "" } private var pTagCntAtDepth = IntArray(24) - private data class CptSect(val type: String, var alt: String?) + private data class CptSect(val type: String, var alt: String?, var style: String, var start: Int? = null) private data class CptSectInfo(val type: String, var name: String, var pagenum: Int, - var partNum: Int?, var cptNum: Int?, var sectNum: Int?) + var partNum: String?, var cptNum: String?, var sectNum: String?) private val cptSectStack = ArrayList() @@ -129,6 +138,14 @@ object BTeXParser { private val bodyTextShadowAlpha = 0.36f + private fun Int.toListNumStr(style: String) = when (style) { + "I" -> this.toRomanNum() + "i" -> this.toRomanNum().lowercase() + "1" -> this.toString() + "A" -> this.toAlphabetic() + "a" -> this.toAlphabetic().lowercase() + else -> throw IllegalArgumentException("Unknown list number style: $style") + } private fun StringBuilder.appendObjectPlaceholder(id: String) { (objWidthDict[id] ?: throw NullPointerException("No OBJ with id '$id' exists")).let { @@ -314,27 +331,27 @@ object BTeXParser { private var oldBucksMode = false private val CODE_TAG_MARGIN = 2 + private fun spanColToColourCode(): String? { + val spanGdxCol = getSpanColourOrNull() + if (spanGdxCol == null) return null + return TerrarumSansBitmap.toColorCode( + spanGdxCol.r.times(15f).roundToInt(), + spanGdxCol.g.times(15f).roundToInt(), + spanGdxCol.b.times(15f).roundToInt() + ) + } + override fun characters(ch: CharArray, start: Int, length: Int) { - val str = + var str = String(ch.sliceArray(start until start + length)).replace('\n', ' ').replace(Regex(" +"), " ")//.trim() if (str.isNotEmpty()) { // printdbg("Characters [col:${spanColour}] \t\"$str\"") // process span request + val spanCC = spanColToColourCode() + if (spanColour != oldSpanColour || spanColour != null) { - - val spanGdxCol = getSpanColourOrNull() - - if (spanGdxCol == null) { - paragraphBuffer.append(ccDefault) - } - else { - paragraphBuffer.append(TerrarumSansBitmap.toColorCode( - spanGdxCol.r.times(15f).roundToInt(), - spanGdxCol.g.times(15f).roundToInt(), - spanGdxCol.b.times(15f).roundToInt() - )) - } + paragraphBuffer.append(spanCC ?: ccDefault) } // process code request @@ -350,7 +367,7 @@ object BTeXParser { // getOrPutCodeTagRef(w) // paragraphBuffer.appendObjectPlaceholder("TAG@CODE-${w}") paragraphBuffer.append(glueToString(CODE_TAG_MARGIN)) - paragraphBuffer.append(ccCode) + paragraphBuffer.append(spanCC ?: ccCode) paragraphBuffer.append(TerrarumSansBitmap.charsetOverrideCodestyle) } } @@ -369,12 +386,10 @@ object BTeXParser { if (bucksMode != oldBucksMode || bucksMode) { if (!bucksMode) { paragraphBuffer.append(ccDefault) - } else { paragraphBuffer.append(ccBucks) - val str2 = str.replace(' ', '\u00A0') - + str = str.replace(' ', '\u00A0') } } @@ -753,7 +768,7 @@ object BTeXParser { @OpenTag // reflective access is impossible with 'private' fun processElemBUCKS(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { handler.bucksMode = true - handler.paragraphBuffer.append("$CURRENCY\u00A0") + handler.paragraphBuffer.append("$ccBucks$CURRENCY\u00A0") } @CloseTag fun closeElemBUCKS(handler: BTeXHandler, doc: BTeXDocument, uri: String, siblingIndex: Int) { @@ -776,14 +791,14 @@ object BTeXParser { fun processElemTOCPAGE(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { doc.addNewPage() // toc: openright val header = attribs["title"] ?: "Table of Contents" - typesetChapterHeading(null, header, handler, 16) + typesetChapterHeading(null, header, handler, PAR_INDENTATION) } @OpenTag // reflective access is impossible with 'private' fun processElemINDEXPAGE(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { if (doc.currentPageObj.isNotEmpty()) doc.addNewPage() val header = attribs["title"] ?: "Index" - typesetChapterHeading(null, header, handler, 16) + typesetChapterHeading(null, header, handler, PAR_INDENTATION) } @OpenTag // reflective access is impossible with 'private' @@ -850,14 +865,14 @@ object BTeXParser { } cptSectMap.forEach { (type, name, pg, part, cpt, sect) -> - val indent = if (type == "subsection") 32 else if (type == "section") 16 else 0 + val indent = if (type == "subsection") 2*PAR_INDENTATION else if (type == "section") PAR_INDENTATION else 0 val heading = if (part == null && cpt == null && sect == null) "" else if (part != null && cpt == null && sect == null) - "Part ${part.toRomanNum()}${glueToString(9)}" + "Part $part${glueToString(HEADING_NUM_TITLE_GAP)}" else - listOfNotNull(cpt, sect).joinToString(".") + "${glueToString(9)}" + - (if (cpt != null && cpt < 10) "${glueToString(9)}" else "") + listOfNotNull(cpt, sect).joinToString(".") + "${glueToString(HEADING_NUM_TITLE_GAP)}" + + (if (cpt != null && cpt.length < 2 && cpt.isNum()) "${glueToString(HEADING_NUM_TITLE_GAP)}" else "") typesetTOCline("$heading", name, pg, handler, indent, tocPage) } @@ -926,9 +941,57 @@ object BTeXParser { handler.clearParBuffer() } + @OpenTag // reflective access is impossible with 'private' + fun processElemPBOX(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { + handler.clearParBuffer() + + currentAlign = attribs["align"] ?: "justify" + + if (attribs["class"] == "code") { + handler.codeMode = true + spanColour = "black" + } + } + + @CloseTag // reflective access is impossible with 'private' + fun closeElemPBOX(handler: BTeXHandler, doc: BTeXDocument, uri: String, siblingIndex: Int) { + // if this P is a very first P without chapters, leave two lines before typesetting + val penultTag = tagHistory.getOrNull(tagHistory.lastIndex - 1) + val thePar = handler.paragraphBuffer.toString().trim() + if (penultTag == "MANUSCRIPT") + doc.linesPrintedOnPage[doc.currentPage] += 2 + + + typesetParagraphs("$ccDefault$thePar", handler, width = doc.textWidth - 2*MARGIN_PARBOX_H, align = handler.currentAlign).forEachIndexed { index, it -> + it.posX += MARGIN_PARBOX_H + it.deltaX += MARGIN_PARBOX_H + + it.posY += doc.lineHeightInPx / 2 + it.deltaY += doc.lineHeightInPx / 2 + + // add boxes + it.extraDrawFun = { batch, x, y -> + val width = it.width.toFloat() + val height = it.lineCount * doc.lineHeightInPx.toFloat() + + val oldcol = batch.color.cpy() + batch.color = Color(0xccccccff.toInt()) + Toolkit.fillArea(batch, x - MARGIN_PARBOX_H, y - MARGIN_PARBOX_V, width + 2*MARGIN_PARBOX_H, height + 2*MARGIN_PARBOX_V) + batch.color = Color(0x999999ff.toInt()) + Toolkit.drawBoxBorder(batch, x - MARGIN_PARBOX_H, y - MARGIN_PARBOX_V, width + 2*MARGIN_PARBOX_H, height + 2*MARGIN_PARBOX_V) + batch.color = oldcol + } + } + + if (doc.linesPrintedOnPage[doc.currentPage] < doc.pageLines) + doc.linesPrintedOnPage[doc.currentPage] += 1 + + handler.clearParBuffer() + } + @CloseTag fun closeElemANONBREAK(handler: BTeXHandler, doc: BTeXDocument, uri: String, siblingIndex: Int) { - typesetParagraphs("${ccDefault}――――――――――――", handler).also {it.first().let { + typesetParagraphs("${ccDefault}――――――――――――", handler, align = "left").also {it.first().let { it.posX += (doc.textWidth - it.width) / 2 } } handler.clearParBuffer() @@ -982,27 +1045,27 @@ object BTeXParser { handler.clearParBuffer() if (attribs["hide"] == null) - cptSectStack.add(CptSect("part", attribs["alt"])) + cptSectStack.add(CptSect("part", attribs["alt"], attribs["type"] ?: "I", attribs["start"]?.toInt())) else - cptSectStack.add(CptSect("part-hidden", attribs["alt"])) + cptSectStack.add(CptSect("part-hidden", attribs["alt"], attribs["type"] ?: "I", attribs["start"]?.toInt())) } @OpenTag // reflective access is impossible with 'private' fun processElemCHAPTER(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { handler.clearParBuffer() if (attribs["hide"] == null) - cptSectStack.add(CptSect("chapter", attribs["alt"])) + cptSectStack.add(CptSect("chapter", attribs["alt"], attribs["type"] ?: "1", attribs["start"]?.toInt())) else - cptSectStack.add(CptSect("chapter-hidden", attribs["alt"])) + cptSectStack.add(CptSect("chapter-hidden", attribs["alt"], attribs["type"] ?: "1", attribs["start"]?.toInt())) } @OpenTag // reflective access is impossible with 'private' fun processElemSECTION(handler: BTeXHandler, doc: BTeXDocument, uri: String, attribs: HashMap) { handler.clearParBuffer() if (attribs["hide"] == null) - cptSectStack.add(CptSect("section", attribs["alt"])) + cptSectStack.add(CptSect("section", attribs["alt"], attribs["type"] ?: "1", attribs["start"]?.toInt())) else - cptSectStack.add(CptSect("section-hidden", attribs["alt"])) + cptSectStack.add(CptSect("section-hidden", attribs["alt"], attribs["type"] ?: "1", attribs["start"]?.toInt())) } @CloseTag // reflective access is impossible with 'private' fun closeElemPART(handler: BTeXHandler, doc: BTeXDocument, uri: String, siblingIndex: Int) { @@ -1011,11 +1074,13 @@ object BTeXParser { val partOrder = cptSectMap.count { it.type.startsWith("part") } + 1 val thePar = handler.paragraphBuffer.toString().trim() - typesetPartHeading(partOrder, thePar, handler) val cptSectInfo = cptSectStack.removeLast() + val partNumStr = partOrder.toListNumStr(cptSectInfo.style) + + typesetPartHeading(partNumStr, thePar, handler) if (!cptSectInfo.type.endsWith("-hidden")) - cptSectMap.add(CptSectInfo("part", cptSectInfo.alt ?: thePar, doc.currentPage, partOrder, null, null)) + cptSectMap.add(CptSectInfo("part", cptSectInfo.alt ?: thePar, doc.currentPage, partNumStr, null, null)) handler.clearParBuffer() } @@ -1028,11 +1093,14 @@ object BTeXParser { val cptOrder = cptSectMap.count { it.type.startsWith("chapter") } + 1 val thePar = handler.paragraphBuffer.toString().trim() - typesetChapterHeading(cptOrder, thePar, handler, 16) val cptSectInfo = cptSectStack.removeLast() + val partNumStr = partOrder.toListNumStr(cptSectStack.findLast { it.type.startsWith("part") }?.type ?: "1") + val cptNumStr = cptOrder.toListNumStr(cptSectInfo.style) + + typesetChapterHeading(cptNumStr, thePar, handler, 16) if (!cptSectInfo.type.endsWith("-hidden")) - cptSectMap.add(CptSectInfo("chapter", cptSectInfo.alt ?: thePar, doc.currentPage, partOrder, cptOrder, null)) + cptSectMap.add(CptSectInfo("chapter", cptSectInfo.alt ?: thePar, doc.currentPage, partNumStr, cptNumStr, null)) handler.clearParBuffer() } @@ -1056,11 +1124,15 @@ object BTeXParser { val thePar = handler.paragraphBuffer.toString().trim() - typesetSectionHeading(cptOrder, sectOrder, thePar, handler, 8) val cptSectInfo = cptSectStack.removeLast() + val partNumStr = partOrder.toListNumStr(cptSectStack.findLast { it.type.startsWith("part") }?.type ?: "1") + val cptNumStr = cptOrder.toListNumStr(cptSectStack.findLast { it.type.startsWith("chapter") }?.type ?: "1") + val sectNumStr = sectOrder.toListNumStr(cptSectInfo.style) + + typesetSectionHeading("$cptNumStr.$sectNumStr", thePar, handler, 8) if (!cptSectInfo.type.endsWith("-hidden")) - cptSectMap.add(CptSectInfo("section", cptSectInfo.alt ?: thePar, doc.currentPage, partOrder, cptOrder, sectOrder)) + cptSectMap.add(CptSectInfo("section", cptSectInfo.alt ?: thePar, doc.currentPage, partNumStr, cptNumStr, sectNumStr)) handler.clearParBuffer() } @@ -1083,7 +1155,7 @@ object BTeXParser { // else, print the text normally else thePar - typesetParagraphs(ccDefault + text, handler) + typesetParagraphs("$ccDefault$text", handler, align = handler.currentAlign) handler.clearParBuffer() } @@ -1106,22 +1178,22 @@ object BTeXParser { private fun typesetBookTitle(thePar: String, handler: BTeXHandler) { val label = "\n${TerrarumSansBitmap.toColorCode(15, 15, 15)}" + thePar - typesetParagraphs(getTitleFont(), label, handler, doc.textWidth - 16).also { + typesetParagraphs(getTitleFont(), label, handler, doc.textWidth - 2*MARGIN_TITLE_TEXTS, align = "left").also { val addedLines = it.sumOf { it.lineCount } doc.linesPrintedOnPage[doc.currentPage] += addedLines it.forEach { - it.posX += 8 + it.posX += MARGIN_TITLE_TEXTS } } } private fun typesetBookAuthor(thePar: String, handler: BTeXHandler) { - typesetParagraphs(getSubtitleFont(), "\n\n${TerrarumSansBitmap.toColorCode(15, 15, 15)}" + thePar, handler, doc.textWidth - 16).also { + typesetParagraphs(getSubtitleFont(), "\n\n${TerrarumSansBitmap.toColorCode(15, 15, 15)}" + thePar, handler, doc.textWidth - 2*MARGIN_TITLE_TEXTS, align = "left").also { it.last().extraDrawFun = { batch, x, y -> val px = x - val py = y + 23 - val pw = doc.textWidth - 16f + val py = y + doc.lineHeightInPx - 1 + val pw = doc.textWidth - 2f * MARGIN_TITLE_TEXTS batch.color = Color(1f,1f,1f,.5f) Toolkit.fillArea(batch, px, py, pw+1, 2f) batch.color = Color.WHITE @@ -1129,24 +1201,24 @@ object BTeXParser { } it.forEach { - it.posX += 8 + it.posX += MARGIN_TITLE_TEXTS } } } private fun typesetBookEdition(thePar: String, handler: BTeXHandler) { - typesetParagraphs(getSubtitleFont(), "${TerrarumSansBitmap.toColorCode(15, 15, 15)}" + thePar, handler, doc.textWidth - 16).also { + typesetParagraphs(getSubtitleFont(), "${TerrarumSansBitmap.toColorCode(15, 15, 15)}" + thePar, handler, doc.textWidth - 2*MARGIN_TITLE_TEXTS, align = "left").also { it.forEach { - it.posX += 8 + it.posX += MARGIN_TITLE_TEXTS } } } - private fun typesetPartHeading(num: Int, thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) { - typesetParagraphs("${ccDefault}⁃ Part ${num.toRomanNum()} ⁃", handler) - typesetParagraphs(" ", handler) + private fun typesetPartHeading(num: String, thePar: String, handler: BTeXHandler, indent: Int = PAR_INDENTATION, width: Int = doc.textWidth) { + typesetParagraphs("${ccDefault}⁃ Part $num ⁃", handler, align = "left") + typesetParagraphs(" ", handler, align = "left") // typesetParagraphs(getTitleFont(), "$ccDefault$thePar", handler) - typesetParagraphs(getSubtitleFont(), "$ccDefault$thePar", handler) + typesetParagraphs(getSubtitleFont(), "$ccDefault$thePar", handler, align = "left") // get global yDelta doc.currentPageObj.let { page -> @@ -1224,9 +1296,9 @@ object BTeXParser { doc.addNewPage() } - private fun typesetChapterHeading(chapNum: Int?, thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) { - val header = if (chapNum == null) thePar else "$chapNum${glueToString(9)}$thePar" - typesetParagraphs("\n$ccDefault$header", handler, width - indent).also { + private fun typesetChapterHeading(num: String?, thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) { + val header = if (num == null) thePar else "$num${glueToString(9)}$thePar" + typesetParagraphs("\n$ccDefault$header", handler, width - indent, align = "left").also { // add indents and adjust text y pos it.forEach { it.posX += indent @@ -1246,8 +1318,8 @@ object BTeXParser { } } - private fun typesetSectionHeading(chapNum: Int, sectNum: Int, thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) { - typesetParagraphs("\n$ccDefault$chapNum.$sectNum${glueToString(9)}$thePar", handler, width - indent).also { + private fun typesetSectionHeading(num: String, thePar: String, handler: BTeXHandler, indent: Int = 16, width: Int = doc.textWidth) { + typesetParagraphs("\n$ccDefault$num${glueToString(9)}$thePar", handler, width - indent, align = "left").also { // add indents and adjust text y pos it.forEach { it.posX += indent @@ -1256,12 +1328,17 @@ object BTeXParser { } } - private fun typesetParagraphs(thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage): List { - return typesetParagraphs(getFont(), thePar, handler, width, startingPage) + private fun typesetParagraphs(thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage, align: String): List { + return typesetParagraphs(getFont(), thePar, handler, width, startingPage, align) } - private fun typesetParagraphs(font: TerrarumSansBitmap, thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage): List { - val slugs = MovableType(font, thePar, width) + private fun typesetParagraphs(font: TerrarumSansBitmap, thePar: String, handler: BTeXHandler, width: Int = doc.textWidth, startingPage: Int = doc.currentPage, align: String): List { + val strat = when (align) { + "left" -> TypesettingStrategy.RAGGED_RIGHT + "justify" -> TypesettingStrategy.JUSTIFIED + else -> throw IllegalArgumentException("Unknown text alignment") + } + val slugs = MovableType(font, thePar, width, strat) var pageNum = startingPage val drawCalls = ArrayList() @@ -1389,7 +1466,7 @@ object BTeXParser { val dotGap = 10 val dotPosEnd = typeWidth - pageNumWidth - dotGap*1.5f - typesetParagraphs("$ccDefault$heading$name", handler, typeWidth, pageToWrite ?: doc.currentPage).let { + typesetParagraphs("$ccDefault$heading$name", handler, typeWidth, pageToWrite ?: doc.currentPage, align = "justify").let { it.forEach { it.posX += indentation @@ -1430,9 +1507,15 @@ object BTeXParser { companion object { + private const val MARGIN_PARBOX_V = 2 + private const val MARGIN_PARBOX_H = 8 + private const val MARGIN_TITLE_TEXTS = 8 + private const val PAR_INDENTATION = 16 + private const val HEADING_NUM_TITLE_GAP = 9 + val ccDefault = TerrarumSansBitmap.toColorCode(0,0,0) - val ccBucks = TerrarumSansBitmap.toColorCode(4,0,0) - val ccCode = TerrarumSansBitmap.toColorCode(0,5,7) + val ccBucks = TerrarumSansBitmap.toColorCode(5,0,0) + val ccCode = TerrarumSansBitmap.toColorCode(0,4,8) val ccHref = TerrarumSansBitmap.toColorCode(0,3,11) private const val ZWSP = 0x200B @@ -1506,6 +1589,13 @@ object BTeXParser { else -> throw IllegalArgumentException("Number out of range: $this") } + fun Int.toAlphabetic(): String = when (this) { + in 27..2147483647 -> (this / 26).toAlphabetic() + (this % 26).toAlphabetic() + in 1..26 -> "${Char(this + 0x40)}" + 0 -> "" + else -> throw IllegalArgumentException("Number is negative: $this") + } + private fun codepointToObjIdChar(c: Int): Char { return when (c) { in 0xFFF70..0xFFF79 -> (0x30 + (c - 0xFFF70)).toChar() diff --git a/src/net/torvald/terrarum/tests/BTeXTest.kt b/src/net/torvald/terrarum/tests/BTeXTest.kt index 8594dac0e..fb0467649 100644 --- a/src/net/torvald/terrarum/tests/BTeXTest.kt +++ b/src/net/torvald/terrarum/tests/BTeXTest.kt @@ -26,8 +26,8 @@ import kotlin.system.measureTimeMillis */ class BTeXTest : ApplicationAdapter() { - val filePath = "btex.xml" -// val filePath = "test.xml" +// val filePath = "btex.xml" + val filePath = "test.xml" // val filePath = "literature/en/daniel_defoe_robinson_crusoe.xml" // val filePath = "literature/ruRU/anton_chekhov_palata_no_6.xml" // val filePath = "literature/koKR/yisang_nalgae.btexbin"