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

  • Автор темы Автор темы NAA_
  • Дата начала Дата начала

NAA_

Топикстартер
15 лет на форуме
Сообщения
275
Реакции
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


Создается впечатление, что И.О. после первой фамилии пытается прилепиться ко второй фамилии.
Но почему так происходит - непонятно: ведь между ними слово из маленьких букв, которое не подходит под эти правила, и почему-то это срабатывает только при наличии обоих стилей.
В чём тут причина?
 
Как я ни экспериментировал, так ничего и не добился :(
 
Я тут не вижу никаких проблем с GREP, стили нормально отработали. Дальше с версткой надо разбираться. Для начала пробел между инициалами унифицировать. В строчке, о которой вы говорите видимо слишком много неразрывных пробелов, "кроме" прибито к "того", а "также" к следующей фамилии. Посмотрите с отображением невидимых символов.
Ну и надо работать трэкингом точечно и настройками justification в стиле.
 
Последнее редактирование:
насчет "также" не уверен )
 
Неразрывных пробелов нет ни единого, и вёрстка тут вообще не причём. Это чисто тестовый текст для отладки этой пары стилей. Вот его текст:
Код:
Проверка фамилий Иванновский И. О. также Иванновский И.О. кроме того инициалы спереди И. О. Иванновский, также И.О. Иванновский также И. Иванновский вот как. Также Иванновский И. О. вот. Также еще И. О. Иванновский вот. Двойная фамилия Иванновский-Петров И.О. вот. Двойная фамилия И.О. Иванновский-Петров вот.
Как только один их этой пары стилей (любой) удаляем - всё становится отлично. Или достаточно убрать двойное "нн" из фамилии - всё, что сейчас во 2-й строке, целиком перепрыгивает в 1-ю строку (ради иллюстрации это двойное "нн" и поставлено).
Это голый текст, без применения всякого дополнительного форматирования и без других GREP-стилей.
 
Последнее редактирование:
Работает только 1-й стиль:
capture_11-08-2021_11-56-14.jpg


Работает только 2-й стиль:
capture_11-08-2021_11-56-51.jpg
 
ну я так думаю что они у вас no break присваивают не только между инициалами и фамилией, а еще и к слову перед/после. поэтому когда оба - это становится заметно.
 
Одного не пойму: почему это надо делать стилем... вопрос же решается GREP-заменой
 
так, погодите. так вы всей фамилии no break присваиваете. она после этого не может переноситься. вам надо просто расставить nobreak пробелам. можно конечно пробовать написать такие выражения с lookahead/lookbehind, но это не факт что получится. быстрее сделать это заменой
 
Последнее редактирование:
  • Спасибо
Реакции: NAA_
в общем, вам надо переписать чтоб фамилию уже не трогало. no break нужен только [И. О. пробел] перед фамилией и [пробел И. О.] после фамилии
 
  • Спасибо
Реакции: NAA_
вы всей фамилии no break присваиваете. она после этого не может переноситься.
А Вы правы! Удалил стили и вручную разметил все ФИО - результат идентичный!

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

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


Одного не пойму: почему это надо делать стилем... вопрос же решается GREP-заменой
И я в свою очередь не пойму, зачем это делать статическими GREP-заменами, которые придётся делать всякий раз заново при изменении текста, при наличии такого мощного инструмента для динамической обработки текста.
 
no break нужен только [И. О. пробел] перед фамилией и [пробел И. О.] после фамилии
Хм. Почему-то фамилию после этого не переносит. Если внутри фамилии вставляю мягкие переносы, то переносит, а без них не хочет.
Хотя, впрочем, он и без этого фамилию почему-то не хочет переносить. Тогда это уже другой вопрос, не относящейся к теме.
Одним словом, нужно научиться анализировать наличие Фамилии спереди/сзади, но исключить её из обработки.
 
зачем это делать статическими GREP-заменами … при наличии такого мощного инструмента
Тут уже не раз описывалась проблема, когда GREP-стилей много — ИД тормозит.
Да и расставленные неразрывные, никуда не денутся же.
я не понял о чём речь идет
просмотр вперед/назад. Может быть положительный (что хотим найти) и отрицательный (чего найти не хотим)
 
Тут уже не раз описывалась проблема, когда GREP-стилей много — ИД тормозит.
А! Это, кстати, я уже замечал. Причём когда я устанавливаю цвет символов в стиле NoBreak, то тормозит заметно, когда не устанавливаю - не очень заметно.

просмотр вперед/назад.
Теперь понятно.
 
Что-то не получается :(
В общем, эксперименты привели к следующему выводу.

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

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

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

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

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

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