Help

Автор Рязанцев, 8 июля 2024, 10:26

0 Пользователи и 1 гость просматривают эту тему.

gabix

Круто. У меня, правда, на многих документах вылазит «BASIC runtime error. Object variable not set». Подозреваю, что из-за того, что в начале документа — таблица.

Рязанцев

Спасибо огромное! Если выполнять макрос три раза то вообще огонь. Единственный момент, можно ли ещё к предлогам добавить знак (номера), а то много ссылок на закон и знак номера остаётся.

mikekaganski

Цитата: gabix от  8 июля 2024, 14:16У меня, правда, на многих документах вылазит «BASIC runtime error. Object variable not set». Подозреваю, что из-за того, что в начале документа — таблица

Вероятно. Это был просто код, написанный в качестве примера, на примитивнейшем тексте. Я не занимался его доводкой.

Цитата: Рязанцев от  8 июля 2024, 14:19Если выполнять макрос три раза то вообще огонь

То есть Вы фактически все предлоги присоединяете к своим словам, всё-таки стоило прислушаться к первоначальному совету:
Цитата: mikekaganski от  8 июля 2024, 10:31Вы можете заменить пробелы после всех этих предлогов на неразрывные пробелы

Цитата: Рязанцев от  8 июля 2024, 14:19можно ли ещё к предлогам добавить знак (номера)

Ничего не понимаю.
С уважением,
Михаил Каганский

sokol92

Цитата: mikekaganski от  8 июля 2024, 14:33стоило прислушаться к первоначальному совету:
Вопрос к автору темы.
А в чем минус замены последовательности:

<пробел><предлог или знак номера><пробел>
на
<пробел><предлог или знак номера><неразрывный пробел>

Я в знаменитой книге А.Питоньяка поменял так артикли - никаких минусов не заметил (впрочем, как и принципиальных плюсов  :) ).
Владимир.

Рязанцев

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

Рязанцев

Есть ли возможность чтоб он знак номера тоже как и предлог переносил?

mikekaganski

Цитата: Рязанцев от  8 июля 2024, 15:04Не все
Ну что тут скажешь... facepalm.

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

Рязанцев

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

Рязанцев

Цитата: sokol92 от  8 июля 2024, 15:03
Цитата: mikekaganski от  8 июля 2024, 14:33стоило прислушаться к первоначальному совету:
Вопрос к автору темы.
А в чем минус замены последовательности:

<пробел><предлог или знак номера><пробел>
на
<пробел><предлог или знак номера><неразрывный пробел>

Я в знаменитой книге А.Питоньяка поменял так артикли - никаких минусов не заметил (впрочем, как и принципиальных плюсов  :) ).
По тексту все таки бросается в глаза разность длины пробела.

mikekaganski

Цитата: Рязанцев от  8 июля 2024, 15:17По тексту все таки бросается в глаза разность длины пробела

Используйте версию 24.2, и включите опцию совместимости показывать неразрывные пробелы такой же ширины, как и обычные.
С уважением,
Михаил Каганский

McAaron

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

gabix

#26
Цитата: Рязанцев от  8 июля 2024, 15:17По тексту все таки бросается в глаза разность длины пробела.

Чтобы исправить это в любой версии LO можно провести массовую замену получившихся пар
предлог + неразрывный пробел на
разрыв строки + предлог + пробелэто уже просто:

Sub UnhangPrep2
  Dim mCP1252(123) As String
  Dim mCP1251(123) As String
  Dim n As Long
  Dim oDocument As Object
  Dim oReplace As Object
  Dim rstr as String
  mCP1252() = Array(" в ", " и ", " по ", " за ", " к ", " из ", "без ", " с ", " до ", " на ", " во ", " о ", " об ", " для ", " под ", " В ", " И ", " ПО ", " ЗА ", " К ", " ИЗ ", "БЕЗ ", " С ", " ДО ", " НА ", " ВО ", " О ", " ОБ ", " ДЛЯ ", " ПОД ")
  mCP1251() = Array("в ", "и ", "по ", "за ", "к ", "из ", "без ", "с ", "до ", "на ", "во ", "о ", "об ", "для ", "под ", "В ", "И ", "ПО ", "ЗА ", "К ", "ИЗ ", "БЕЗ ", "С ", "ДО ", "НА ", "ВО ", "О ", "ОБ ", "ДЛЯ ", "ПОД ")
  rstr = "" + Chr(10)
  oDocument = ThisComponent
  oReplace = oDocument.createReplaceDescriptor
  For n = lbound(mCP1252()) To ubound(mCP1252())
    oReplace.SearchString = mCP1252(n)
    oReplace.ReplaceString = rstr + mCP1251(n)
    oReplace.SearchCaseSensitive = TRUE
    oDocument.replaceAll(oReplace)
   Next n
  MsgBox "Преобразовано"
End Sub

Разумеется, есть что дорабатывать. Например, макрос Михаила должен прихватывать не только предлоги, но и просто короткие слова типа «год», это тоже можно исправлять.

gabix

Кажется, неразрывные пробелы потеряются при копировании/вставке кода, поэтому прикрепляю файлик для импорта.

mikekaganski

#28
Поправил код в #14 для обработки символов типа "№".
Также добавил "паузу" после каждой замены, чтобы Writer успел перестроить последующий текст. Надеюсь, теперь не придётся запускать его трижды.

Но всё это неправильный подход. Если человек хочет, чтобы короткие предлоги были на одной строке со своим словом, он либо вставляет неразрывный пробел между ними "на автомате" (так же как между числом и единицей измерения), либо настраивает автозамену. И с учётом уже упомянутой возможности сделать ширину неразрывного пробела такой же, как у обычного, весь этот код для поиска концов строк - не более чем "в учебных целях".
С уважением,
Михаил Каганский

4_3

Цитата: Рязанцев от  8 июля 2024, 10:33Но тогда он по всему тексту их скинет
в "найти и заменить" нельзя уточнить, что искать в пределах выделенного или в пределах абзаца?