diff --git a/README.md b/README.md index e1b7419..d16e585 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,23 @@ result = typo_hyp.process(text="Электрофоретическое иссл ### Предлоги, союзы и частицы +Правилом хорошего тона в любой типографике считается, когда короткие слова, такие как предлоги, союзы и частицы, +не остаются в конце строки в одиночестве («висеть»). Это ухудшает читаемость. + +Типограф `etpgrf` автоматически решает эту проблему, «приклеивая» такие слова к последующему слову с помощью +неразрывного пробела (` `). + +* `в доме` → `в доме` +* `и сказал` → `и сказал` + +Это правило работает для коротких слов в русском, старорусском и английском языках. + +Кроме того, обрабатываются и постпозитивные частицы (например, `ли`, `же`, `бы`), которые, наоборот, для улучшения +читабельности, «приклеиваются» к предыдущему слову: + +* `сказал бы` → `сказал бы` + + ### Кавычки В текстах кавычки бывают двух видов: «ёлочки» (для русского языка) и “лапки” (для английского языка). В типографе @@ -142,3 +159,78 @@ typo_no_quotes = etpgrf.Typographer(langs='ru', quotes=False) # Обработка текста без кавычек result = typo_no_quotes.process(text='Этот "текст" будет обработан без кавычек.') ``` + + +### Компоновка (тире, диапазоны, инициалы, единицы измерения, сокращения и т.п.) + +После того как псевдографика заменена на правильные символы, в дело вступает модуль компоновки (layout), который +отвечает за расстановку неразрывных и тонких пробелов. Он применяет несколько важных правил для улучшения читаемости. + +#### Тире + +По правилам русской типографики, длинное тире (—) должно отбиваться пробелами от соседних слов. Чтобы тире не "повисло" +в начале строки и визуально не смешивалось с диалогами, etpgrf заменяет пробел перед тире на неразрывный ( ). + +* `слово — слово` → `слово — слово` + +В английской типографике, наоборот, тире пишется слитно. Типограф учитывает это при указании языка `langs='en'`. + +* `word — word` → `word—word` + +Если минус или диапазон стоят между числами (арабскими или римскими), то это считается обозначением числового диапазона +(или отрицательным числом, или математическим выражением), и никаких изменений не производится. Неважно есть пробелы +вокруг тире/минуса или нет. Если между цифрами тире, то это тоже считается диапазоном и неразрывные пробелы не ставятся: +`1941 — 1945` → `1941 — 1945`, `-10 — -5` → `-10 — -5`, + +Если минус стоит перед числом (например, `-5`), то это считается отрицательным числом, и перед ним ставится неразрывный +пробел: `от -5 до +5` → `от -5 до +5`. + +#### Инициалы и акронимы + +Чтобы инициалы не отрывались друг от друга и от фамилии при переносе строки, типограф расставляет между ними +специальные пробелы: + +* Неразрывный пробел (` `) ставится между фамилией и инициалом/инициалами (`А. Пушкин` → `А. Пушкин`). + Неважно стоят ли инициалы перед фамилией или после нее. Важно наличие точки и буквы (инициала), написанного + с заглавной буквы. +* Тонкая шпация ( ) ставится между самими инициалами, если они написаны слитно, для улучшения внешнего вида + (`А.С.Пушкин` → `А. С.Пушкин`). Число инициалов не ограничено (`J.R.R. Tolkien` → `J. R. R. + Tolkien`), наличие или отсутствие пробелов между инициалами в исходном тексте неважно. +* Акронимы, написанные через точку (не слитно, например, **Н.Л.О.**), разделяются так же, как инициалы, через тонкую шпацию + (`Н.Л.О.` → `Н. Л. О.`). Наличие или отсутствие пробелов между буквами в исходном тексте неважно. + +Это правило может давать побочные эффекты (в частности, тонкая шпация не явлеятся неразрывным пробелом, и в длинных +акронимах может привести к разрыву строки). Поэтому его обработку можно отключить с помощью параметра +`process_initials_and_acronyms`: +```python +typo = etpgrf.Typographer(process_initials_and_acronyms=False) +result = typo.process("А. С. Пушкин") # Останется без изменений +``` + +#### Единицы измерения + +Типограф предотвращает отрыв единиц измерения от чисел, ставя между ним и предшествующей цифрой неразрывный пробел. +Это работает для: + +* **Простых единиц:** `100 км` → `100 км`, `-5 °C` → `-5 °C`' +* **Составных единиц:** `120 кв. м.` → `120 кв. м.`, `50 тыс. руб.` → `50 тыс. руб.` +* **Единиц с предлогом:** `№ 5` → `№ 5` +* **Чисел, записанных и арабскими, и римскими цифрами:** `V век` → `V век` +* Если единицами изменений есть математические символы (например, умножение или деление): `10 км / ч` → `10 км/ч` + (не важно есть пробелы вокруг `/` или нет). + +Библиотека "знает" множество стандартных единиц для русского и английского языков. Но не все. Вы можете расширить этот +список, передав свои кастомные единицы через параметр `process_units`: +```python +# Передаем список +typo = etpgrf.Typographer(process_units=['бочек', 'вёдер']) +# Можно передавать и с помощзью строки через пробелы +typo = etpgrf.Typographer(process_units='бочек вёдер аршин сажен') +result = typo.process("Нужно 10 бочек.") # -> "Нужно 10 бочек." +``` + +Если нужно отключить распознавание обработку единиц измерения: +```python +typo = etpgrf.Typographer(process_units=False) +result = typo.process("100 км/ч") # Останется без изменений +```