Вроде простая задачка, но "в одну строчку" не получается. Вариантов достаточно много. Лучше всего использовать Lua. Можно вызывать и из формул. Интересно было попробовать REGEXPREPLACE, но оказалось, что другие функции внутри этой, с передачей захваченных значений, не работают (может не знаю как использовать).
Вот простой для понимания вариант с посимвольным перебором и сравнением с предыдущим символом:
Код:@s:="иванов иван иванович ИВАНОВ ИВАН ИВАНОВИЧ"
@L:=LEN(@S);
@I:=1;
@os:="" // содержит итоговое значение
@prev:=""
WHILE(@I<=@L) DO
[
@curs:=SUBSTR(@s,@I,1);
if (CHECKSYMBOL(@prev," .?!,") | @I=1) then [@curs:=UPPER(@curs)] else [@curs:=LOWER(@curs)];
@os:=@os<<@curs
@prev:=@curs
@I:=@I+1
]