LINUX.ORG.RU

LaTeX: разрывать «слова» по запятым.


0

0

Проблема: LaTeX используется для верстки текста, генерируемого некой программой. К сожалению иногда попадаются фрагменты текста подобные этому: «г.Москва,пр.Буденного,офис-центр». Т. е. без пробелов. Когда LaTeX верстает, он считает это одним словом и разрывает только на «г.Москва,пр.Буденного,офис-» и «центр».

Как бы подсказать ему (лучше в файле *.tex), что по запятым и точкам можно тоже разрывать слова для переноса на новую строку?

PS: К сожалению совет «исправить входные данные» не подходит, поскольку не от нас это зависит.

★★★★

Программа выдает сразу tex? ну так sedом её то можно обработать? Вместо латеха положить бинарник который сначала sed а потом latex зовёт на результат.

psv1967 ★★★★★ ()
Ответ на: комментарий от psv1967

Исключено. Это уже готовый технологический процесс. Другие звенья туда нельзя встраивать.

kraw ★★★★ ()
\catcode`\,=\active
\def,{\char`\,{} }

Пойдет? :)

Eddy_Em ☆☆☆☆☆ ()

изменить таблицу переносов LaTeXa?

vaborg ★★★ ()
Ответ на: комментарий от Eddy_Em

Есть, кстати, и более приличное решение - см. Кнута (мне лень).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

>\catcode`\,=\active

\def,{\char`\,{} }


Пойдет? :)


К стыду своему - не понял. :(

kraw ★★★★ ()
Ответ на: комментарий от vaborg

>изменить таблицу переносов LaTeXa?

Не подходит

kraw ★★★★ ()
Ответ на: комментарий от kraw

К стыду своему - не понял. :(

Первая команда делает запятую активным символом (как, например, неразрывный пробел ~). Теперь мы можем назначить ей любой макрос, что и делаем второй командой. Ну а \char`\, вставляет символ запятой - в данном случае она как активный символ не воспринимается. В общем, смысл таков: сделать запятую запятой с пробелом. Если после нее будет пробел, по ТеХовским правилам лишние пробелы игнорируются. Точно так же можно сделать и для остальных знаков препинания.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

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

А вообще, объяснили бы вы: почему нельзя заменить команду latex на связку sed + latex (т.е. сначала повставлять в исходниках пробелы после знаков препинания)?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

В исходные файлы можно вставить.
Там есть условно-постоянная информация (так сказать бланк документа), есть переменная.

Могу я сделать что-то вроде:

\def\MyString{\catcode`\,=\active \def,{\char`\,{} тут идет информация, которую мы не можем менять}
.........
...\MyString...

И удастся ли ограничить действие изменения поведения запятой рамками только одного этого поля?

Как вариант -

\def\MyString{тут идет информация, которую мы не можем менять}
..........
...{\catcode`\,=\active \def,{\char`\,{} \MyString}

kraw ★★★★ ()
Ответ на: комментарий от Eddy_Em

>А вообще, объяснили бы вы: почему нельзя заменить команду latex на связку sed + latex (т.е. сначала повставлять в исходниках пробелы после знаков препинания)?

Нужно сделать все в рамках изменения «шаблона» LaTeX. Т. е. изменением «условно-постоянной» информации в tex-файле.

Я еле пробил использование LaTeX для верстки текста.

kraw ★★★★ ()
Ответ на: комментарий от kraw

Включение catcode в группу не поможет. Когда надо вернуть нормальное действие запятой, пишем: \catcode`\,=12 .

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

В общем - LaTeX выдает ошибку:

\catcode`\,=\active
\def,{\char`\,{ } }
\def\AAddress{РОССИЯ,Г БАРНАУЛ,656037,ПР.ЛЕНИНА,156-А

Получаю

Runaway argument?
0)\put (45,4){ \line (1,0){125} } \put (0,0){ \line (1,0){170} } \put \ETC.
! Paragraph ended before \@picture was complete.
<to be read again>
\par
l.168

Причем ругается на какой-то совсем более поздний фрагмент.

На какие грабли я наступил?

kraw ★★★★ ()
Ответ на: комментарий от kraw

Так у вас графика латеховская используется... Естественно, получается, что запятая в аргументе рассматривается как макрос и вызывает ошибку. Переопределяйте таблицу переносов. Если Кнута не осилите - могу подсказать.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Переопределение таблицы переносов не годится. Нужно, чтобы работал на «стандарном» LaTeXе

kraw ★★★★ ()
Ответ на: комментарий от kraw

Сделал:

\catcode`\,=\active
\def,{\char`\,{ } }
\def\AAddress{РОССИЯ,Г БАРНАУЛ,656037,ПР.ЛЕНИНА,156-А
\catcode`\,=12


Помогло. Спасибо за помощь!

kraw ★★★★ ()
Ответ на: комментарий от kraw

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

Кстати, можно при помощи \csname...\endcsname оформить новую команду, например, \define, которая будет в своем аргументе изменять знаки препинания. Что-то вроде

\def\define#1#2{%
\def\csname #1\endcsname{%
\catcode`\,=\active
\def,{\char`\,{ } }
#2
\catcode`\,=12}}
...
\define{AAddress}{РОССИЯ,Г БАРНАУЛ,656037,ПР.ЛЕНИНА,156-А...}

Eddy_Em ☆☆☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.