[ID CS4-CS6] Конфликт двух GREP-стилей

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Сделал два GREP-стиля для обработки ФИО - чтобы они не разрывались при переносе:
Код:
(\u\l+(-\u\l+)?)\s(\u\l?\.)(\s?\u\l?\.)?(?# Обработка Фамилия И.О. Фамилия м.б. двойной)
(\u\l?\.\s?){1,2}(\u\l+(-\u\l+)?)\>(?# Обработка И.О.Фамилия. Фамилия м.б. двойной)

По отдельности они работают нормально.
Но когда я добавляю их оба, получается вот такой результат:
capture_04-08-2021_15-36-39.jpg


Создается впечатление, что И.О. после первой фамилии пытается прилепиться ко второй фамилии.
Но почему так происходит - непонятно: ведь между ними слово из маленьких букв, которое не подходит под эти правила, и почему-то это срабатывает только при наличии обоих стилей.
В чём тут причина?
 

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Как я ни экспериментировал, так ничего и не добился :(
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Я тут не вижу никаких проблем с GREP, стили нормально отработали. Дальше с версткой надо разбираться. Для начала пробел между инициалами унифицировать. В строчке, о которой вы говорите видимо слишком много неразрывных пробелов, "кроме" прибито к "того", а "также" к следующей фамилии. Посмотрите с отображением невидимых символов.
Ну и надо работать трэкингом точечно и настройками justification в стиле.
 
Последнее редактирование:

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
насчет "также" не уверен )
 

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Неразрывных пробелов нет ни единого, и вёрстка тут вообще не причём. Это чисто тестовый текст для отладки этой пары стилей. Вот его текст:
Код:
Проверка фамилий Иванновский И. О. также Иванновский И.О. кроме того инициалы спереди И. О. Иванновский, также И.О. Иванновский также И. Иванновский вот как. Также Иванновский И. О. вот. Также еще И. О. Иванновский вот. Двойная фамилия Иванновский-Петров И.О. вот. Двойная фамилия И.О. Иванновский-Петров вот.
Как только один их этой пары стилей (любой) удаляем - всё становится отлично. Или достаточно убрать двойное "нн" из фамилии - всё, что сейчас во 2-й строке, целиком перепрыгивает в 1-ю строку (ради иллюстрации это двойное "нн" и поставлено).
Это голый текст, без применения всякого дополнительного форматирования и без других GREP-стилей.
 
Последнее редактирование:

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Работает только 1-й стиль:
capture_11-08-2021_11-56-14.jpg


Работает только 2-й стиль:
capture_11-08-2021_11-56-51.jpg
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
ну я так думаю что они у вас no break присваивают не только между инициалами и фамилией, а еще и к слову перед/после. поэтому когда оба - это становится заметно.
 

Любимцев

15 лет на форуме
Сообщения
4 198
Реакции
2 055
Одного не пойму: почему это надо делать стилем... вопрос же решается GREP-заменой
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
так, погодите. так вы всей фамилии no break присваиваете. она после этого не может переноситься. вам надо просто расставить nobreak пробелам. можно конечно пробовать написать такие выражения с lookahead/lookbehind, но это не факт что получится. быстрее сделать это заменой
 
Последнее редактирование:
  • Спасибо
Реакции: NAA_

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
в общем, вам надо переписать чтоб фамилию уже не трогало. no break нужен только [И. О. пробел] перед фамилией и [пробел И. О.] после фамилии
 
  • Спасибо
Реакции: NAA_

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
вы всей фамилии no break присваиваете. она после этого не может переноситься.
А Вы правы! Удалил стили и вручную разметил все ФИО - результат идентичный!

вам надо переписать чтоб фамилию уже не трогало. no break нужен только [И. О. пробел] перед фамилией и [пробел И. О.] после фамилии
Интересная задача! Мне же надо идентифицировать, что перед И.О. или после него стоит слово, начинающееся с заглавной буквы и последующих маленьких. Что-то я не совсем понимаю, как можно сделать, чтобы это слово просматривалось, но при этом не включалось в обработку.

можно конечно пробовать написать такие выражения с lookahead/lookbehind
Вот ту я не понял о чём речь идет. Особенно учитывая то, что у меня ID русскоязычный.


Одного не пойму: почему это надо делать стилем... вопрос же решается GREP-заменой
И я в свою очередь не пойму, зачем это делать статическими GREP-заменами, которые придётся делать всякий раз заново при изменении текста, при наличии такого мощного инструмента для динамической обработки текста.
 

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
no break нужен только [И. О. пробел] перед фамилией и [пробел И. О.] после фамилии
Хм. Почему-то фамилию после этого не переносит. Если внутри фамилии вставляю мягкие переносы, то переносит, а без них не хочет.
Хотя, впрочем, он и без этого фамилию почему-то не хочет переносить. Тогда это уже другой вопрос, не относящейся к теме.
Одним словом, нужно научиться анализировать наличие Фамилии спереди/сзади, но исключить её из обработки.
 

Любимцев

15 лет на форуме
Сообщения
4 198
Реакции
2 055
зачем это делать статическими GREP-заменами … при наличии такого мощного инструмента
Тут уже не раз описывалась проблема, когда GREP-стилей много — ИД тормозит.
Да и расставленные неразрывные, никуда не денутся же.
я не понял о чём речь идет
просмотр вперед/назад. Может быть положительный (что хотим найти) и отрицательный (чего найти не хотим)
 

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Тут уже не раз описывалась проблема, когда GREP-стилей много — ИД тормозит.
А! Это, кстати, я уже замечал. Причём когда я устанавливаю цвет символов в стиле NoBreak, то тормозит заметно, когда не устанавливаю - не очень заметно.

просмотр вперед/назад.
Теперь понятно.
 

NAA_

Топикстартер
15 лет на форуме
Сообщения
267
Реакции
6
Что-то не получается :(
В общем, эксперименты привели к следующему выводу.

Условия поиска «?<=» и «?=» реагируют только на одиночный символ, стоящий после них, но не на последовательность символов, даже заключённую в скобки.

– Конструкция «(\u\l?\.\s?){1,2}(?=\u)» работает (при этом последняя конструкция «(?=\u)» обязательно должны быть в скобках). Таким образом, мы можем отследить последовательность «И.О.Ф» без возможности проверки того, что дальше идёт «амилия», записанная маленькими буквами.

– Фамилию, поставленную перед инициалами, таким образом не отследить, поскольку конструкция «(?<=\u\l+)» не работает, работает только «(?<=\l)». Но при этом инициалы прилепливаются к любому слову, стоящему перед ними.

И всё же непонятно, почему фамилия, стоящая после инициалов, всё равно не хочет переноситься по слогам, если ей предшествует пробел с атрибутом NoBreak, но самой фамилии он не присвоен...
 
Последнее редактирование:

RIKITIKI

20 лет на форуме
Сообщения
1 465
Реакции
515
Всё равно не пойму, зачем столько мучений если старый добрый DoTextOk решает проблему инициалов в несколько секунд....
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
почему фамилия, стоящая после инициалов, всё равно не хочет переноситься по слогам, если ей предшествует пробел с атрибутом NoBreak, но самой фамилии он не присвоен...

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

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

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
да и в отношении любого слова с большой буквы после инициалов или перед ними это справедливо )
 

NAA_

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