geekkoo - Post a comment [entries|archive|friends|userinfo]
geekkoo

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

LaTeX и несознательные редакции May. 5th, 2008|08:10 pm

geekkoo
Отдельные несознательные редакции не принимают статьи в Латехе и требуют doc или rtf. В первом приближении проблема решается просто - исходный теховский файл конвертируется в rtf с помощью программы latex2rtf, проверяется OO и засылается в редакцию. Траблы начинаются когда редакция присылает правку. Поскольку в несознательных редакциях редакторы, как правило, не могут связно изложить свои замечания в виде отдельного связного текста, то обычно присылают тот же rtf, перечерканный красными репликами редактора. Причём бывает, что правка требуется такого сорта, что необходимо не только добавить пару строк, но и вставить дополнительную поясняющую ссылку. Т.е. как раз та работа, которую лучше всего делать в LaTeX. Но если им просто послать исправленный rtf, конвертированный из исправленного latex-исходника, то редакция начинает возмущаться - Как же так, у нас редакторы уже забыли, какие они замечания вам выставляли, не могли бы вы отредактировать текст, чтобы ваши исправления выделялись красненьким?

Поскольку явсе равно держу исходники в svn-репозитории на https (так удобнее работать с нескольких компьютеров), то почему бы не воспользоваться svn diff?

Т.е. перед первой засылкой в редакцию законченный теховский файл копируется в release. Типа
svn copy ./ https://repo.ru/svn/Articles/tags/Article-1ed
После того как получен от редакции исправленный текст в rtf, он открывается с помощью soffice, и в latex-файл вносится необходимая правка. После этого делается второй release
svn copy ./ https://repo.ru/svn/Articles/tags/Article-2ed
Осталось только сделать svn diff. Однако не всё так просто.

Обычный diff заточен под программистов, для которых минимальный квант текста - это строка. Поэтому работает он построчно. Это не совсем то, что нужно для обычного текста, где сверка должна делаться по словам. К счастью такие инструменты есть -
более старый wdiff - http://ftp.gnu.org/gnu/wdiff/
и более новый dwdiff - http://os.ghalkes.nl/dwdiff.html
Берем последний, по функциональности они примерно одинаковы, но wdiff какой-то очень замшелый. Причем оба они делают не diff, а сплав из старого и нового текста. Но это даже к лучшему.

Потом выясняем, что svn diff позволяет сменить свой внутренний diff на внешнюю команду, но при этом продолжает слать этой внешней команде много неотключаемого мусора, так что ввод и вывод придется фильтровать с помощью такого баш-скрипта svn-tex-diff.sh:

#!/usr/bin/bash
case $1 in
'--second-pass')
echo "%%% $3"
echo "%%% $5"
dwdiff -1 -w "\\color{blue}" -x "\\color{black}" -y "\\color{red}" -z "\\color{black}" $6 $7
;;
*)
svn diff -x '--second-pass' --diff-cmd "./svn-tex-diff.sh" $@ | sed -r -e '1,2{s/.*/%/g}'
esac

Запускается он таким образом
./svn-tex-diff.sh https://repo.ru/svn/Articles/tags/Article-1ed/article.tex https://repo.ru/svn/Articles/tags/Article-2ed/article.tex
и на выходе имеем теховский файл, где весь добавленный текст окружен блоками \color{red} - \color{black}. Если в скрипте у вызова dwdiff убрать ключик -1, то он и удаленный текст будет отмечать - только синим цветом. Не забудьте только в преамбуле добавить \usepackage{color} - latex2rtf, несмотря на свою общую ограниченность, этот пакет правильно интерпретирует, так что на выходе имеем исправленный rtf с добавленным текстом, отмеченным красненьким. Редакция будет в восторге.

Единственный недостаток - если исправления попадают внутрь verbatim окружения (где команды не интерпретируются) или в преамбулу (что приводит к ошибкм latex). Но в остальном метод работает весьма неплохо.
Link Read Comments

Reply:
From:
(will be screened)
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Username:
Password:
Subject:
No HTML allowed in subject
Message: