11/21/2007

Русские буквы в EPS из gnuplot и LaTeX

При использовании gnuplot и LaTeX под Linux могут возникнуть проблемы с переносом документов в альтернативные операционные системы. Но это всё решаемо.

Постановка проблемы
Первое: при построении графиков в gnuplot на экране и в dvi-файле они выглядят нормально, а при конвертации в PDF русские буквы на gnuplot-графике исчезают. Возникает вопрос: "как правильно в гнуплоте использовать кириллические шрифты?"

Второе: в документе LaTeX русские буквы отображаются нормально, однако при выделении и копировании текста из PDF-документа вставляется какой-то мусор. А нужно, чтобы из PDF, созданного LaTeX, можно было бы скопировать и вставить текст на русском.


Решение проблемы с русскими шрифтами в gnuplot
Возникает проблема, в частности, потому, что в PostScript файле часто пишется нечто вроде:

   /Helvetica findfont

что говорит принтеру (или просмотрщику) искать такой шрифт (Helvetica) в системе. Его может не оказаться, и поэтому вместо русских букв можно увидеть пустые места.

Решение сводится к тому, что gnuplot нужно заставить использовать Type1 шрифт, который гарантированно и корректно отображается и конвертируется в PostScript-файл. Это, например, может быть NimbusSanL, который ставится с OpenOffice.org. Этот шрифт имеет все варианты начертаний, так что хорошо будет смотреться в любых графиках.

Можно поэкспериментировать, поискав в системе все файлы с расширениями *.pfa и *.pfb и попробовать их в работе.

Теперь как подключить правильный кириллический шрифт к gnuplot. Для этого нужно все упоминания о шрифтах заменить на имя шрифта Type1. Например, пусть это будет шрифт NimbusSanL-Regu, который мы будем использовать везде в графике.

Для этого в заголовке следует добавить:
set terminal postscript 'NimbusSanL-Regu' eps enhanced solid
Если вы в подписях к осям используете шрифт другого размера, не забудьте добавить упоминание о новом шрифте и туда:
set xlabel "Величина экспозиции, отн.ед." font "NimbusSanL-Regu,18"
Всё, после этого ваши графики, созданные в гнуплоте, будут правильно переводиться в PDF и читаться на любых, даже самых альтернативных, системах.

Ссылки
На правильную идею натолкнула эта ссылка, хотя и на английском, а так же Анонимный комментарий здесь и вот этот текст.



Решение проблемы с копированием русского текста из LaTeX-документа
Это результат наших совместных поисков с уважаемым товарищем . Его вариант, прекрасно описанный тут, я на всякий случай продублирую сюда:
Подготовленные по шаблонам TeX документы выглядят очень красиво и профессионально с минимумом усилий на вёрстку за счёт разделения стиля и содержимого. Используется масса шрифтов и PDF-файл получается большим. Вопрос на $100. Единственный способ делать правильные PDF в TeX, который мне удалось освоить, заключается в использовании пакета cmap. А это автоматически означает что для создания PDF можно использовать только PDFLaTeX, но не dvitopdf. Это, в свою очередь, означает невозможность использования векторных рисунков в формате eps напрямую. Я нашел следующее решение...

В Debian cmap находится в пакете tetex-extra. Чтобы подключить cmap надо использовать в документе TeX заголовок следующего вида:

\RequirePackage{cmap}
\RequirePackage[cp1251]{inputenc}
\RequirePackage[TS1,T2A]{fontenc}
\RequirePackage[english,russian]{babel}

Причем именно в таком порядке: cmap первый. Иначе работать не будет!

Все. Теперь, если делать PDF с помощью PDFLaTeX, русский будет в порядке.

Это всё хорошо, но мне нужен драйвер dvipdf, который делает dvi-файл сначала - на этом работает критичный для меня способ перегона документов из LaTeX в ЗлоWord. А описанный выше способ с драйвером dvips не работает.

Мой вариант ответа на вопрос на $100 заключается в том, чтобы использовать шрифты из пакета scalable-cyrfonts-tex - Scalable Cyrillic fonts for TeX в Debian. Для этого они, естественно, были сразу же установлены. После этого в тело документа, сразу же после его начала, было вставлено вот это:
\begin{document}
\usefont{T2A}{ftm}{m}{sl}

После этого документ будет оформлен шрифтом Times New Roman, и это убивает сразу двух зайцев: русский текст можно копировать из документа в самых альтернативных системах, и документ оформлен именно Times, что имеет решающее значение в разного рода консервативных издательствах. В установленном пакете шрифтов много, о чём можно осведомиться в заботливо приложенном мейнтейнером пакета Readme-файле /usr/share/doc/scalable-cyrfonts-tex/README.Debian
This package makes the following font families available to TeX:

ftm -- Free Times
fhv -- Free Helvetian
fcr -- Free Courier
fag -- Free Avant Garde
fbk -- Free Bookman
fnc -- Free Schoollbook
fpl -- Free Paladin
fta -- Teams
fsj -- OldSlavic

For example you can change to the medium series slanted shape Teams font by the following command:

\usefont{T2A}{fta}{m}{sl}
Всё-таки порой читать мануалы к файлу весьма полезно для здоровья :-)
Кроме того, я использую dvipdfmx для перевода полученного dvi-файла в PDF. Полученный PDF отображается везде красиво и корректно, и из него можно выдрать текст. Оставшиеся aux и bbl-файлы требуется для перевода текста в ЗлоСистемы и ЗлоОфис при помощи команды:
latex2rtf -F -M12 -i russian -a file.aux -b file.bbl file.tex

Это ранее описывалось тут.

23 комментария:

  1. \RequirePackage[cp1251]{inputenc}
    А не пора бы перейти на utf8 уже?

    ОтветитьУдалить
  2. 2 Анонимный пишет...
    А не пора бы перейти на utf8 уже?
    Расскажите это пользователям виндовс, с которыми приходится работать через вот такое ...

    ОтветитьУдалить
  3. А как вы смотрите на MathML и вообще возможность отображение сложных текстов в инернете?

    ОтветитьУдалить
  4. 2virens:
    За пост спасибо, авось пригодится. Забыл правда, когда графики с русским текстом на них строил :)

    Кстати, подозреваю, у некоторых «конкурентов» gnuplot с этим лучше. Это так, идея к следующей версии моего сравнения, ещё один параметр для сравнения.

    2анонимный:
    > \RequirePackage[cp1251]{inputenc}
    > А не пора бы перейти на utf8 уже?

    Увы, но в LaTeX с utf8 не всё гладко. Точнее не всё гладко в BibTeX8.

    ОтветитьУдалить
  5. > Единственный способ делать правильные PDF в TeX, который мне удалось освоить, заключается в использовании пакета cmap. А это автоматически означает что для создания PDF можно использовать только PDFLaTeX, но не dvitopdf. Это, в свою очередь, означает невозможность использования векторных рисунков в формате eps напрямую

    Я это решаю так:
    1. кладу все изображения и в eps, и в pdf (epstopdf)
    2. в \includegraphics не указываю расширение, тогда нужный файл (eps или pdf) подбирается автоматически

    ОтветитьУдалить
  6. Использую более сложную схему подключения русских шрифтов к гнуплоту. Принцип такой: имеется список предпочтительных шрифтов в порядке убывания приоритета с соответсвующими encoding векторами. Например, я использую такой список:
    /SFRM1200 /SFRM1400 /WNCYR10 /Cyrillic /Helvetica.
    То есть, если интерпретатору известен шрифт SFRM1200 (eps файл вставлен в tex, использующий cm-super шрифты), он и используется. Если неизвестен, то проверяется следующий по списку, и т. д. В худшем случае используется либо /Cyrillic, который идёт вместе с ghostscript, либо, если всё совсем плохо, используется транслит гельветикой. Плюс в том, что рисунки в результате используют шрифты документа не сильно увеличиваясь при этом в размерах.

    ОтветитьУдалить
  7. возник вопрос где можна найти инструкции как всталять рисунки просто какйто пипец ... вообщем не разобрался как четко позиционировать

    ОтветитьУдалить
  8. вообщем не разобрался как четко позиционировать
    \usepackage{graphicx}
    \usepackage{float}

    \begin{figure}[H]
    \includegraphics{image}
    \end{figure}

    Как-то так;)

    ОтветитьУдалить
  9. Отличная статья! Сам искал черте сколько времени, но так и не нашел приличного решения.
    Вот уж теперь графиков то понастроим :)

    ОтветитьУдалить
  10. 2 Анонимный пишет...
    А как вы смотрите на MathML и вообще возможность отображение сложных текстов в инернете?
    Пристально :-) На самом деле пока нет нужды выкладывать сложные математические вещи в интернете. Но latex2html я уже освоил, так что проблем быть не должно :-)

    2 jetxee пишет...
    Забыл правда, когда графики с русским текстом на них строил :)
    Вынуждают публиковаться и в русских журналах, хотя я резко против (уровень научных журналов России - катастрофа). Так что вопрос со шрифтами решать было очень нужно.

    Кстати, подозреваю, у некоторых «конкурентов» gnuplot с этим лучше.
    Мне, если честно, альтернативы гнуплоту слева - меня он всем устраивает. И NASA, кстати, тоже :-)


    1. кладу все изображения и в eps, и в pdf (epstopdf)
    Там они УЖЕ с покорёженными шрифтами, я пробовал.

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

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

    2 Bardus пишет...
    возник вопрос где можна найти инструкции как всталять рисунки просто какйто пипец ...
    Вот это вопрос хороший, кстати. Надо будет изваять пост на эту тему, а то сам часто забываю и лезу в другие документы за латеховским кодом.

    2 Inger пишет...
    вообщем не разобрался как четко позиционировать
    Если с точностью до сантиметра - не знаю, если на уровне "по центру - слева - справа", это можно.

    2 nagos пишет...
    Сам искал черте сколько времени, но так и не нашел приличного решения.
    Дык а то! Меня вон в гугле после этого забанили :-) Ларчик открывался сравнительно просто...

    Вот уж теперь графиков то понастроим :)
    Это точно! :-) Я уже переделал почти все свои скрипты под новые шрифты.

    2 Mike пишет...
    Спасибо за статью
    На здоровье! :-)

    ОтветитьУдалить
  11. [b]А зачем эти сложности: поставить шрифты и выбирать, который из них использовать.[/b]
    Ну, прикручу я к gs cm-super шрифты. А мне файлы в журнал надо будет послать, что, переделывать всё? Так у меня гарантия есть, что файл откроется где угодно. Вариант внедрения тоже не очень хорош. cm-super - слишком большие шрифты.

    [b]На работе - виндузятники. У них вообще со шрифтами глобальные проблемы, даже у их любимого взасос ворда :-) То квадратиками таймс откроет, то ариал кажет арабской вязью...
    [/b]
    Та же фигня. Однако, ghostscript он и в винде ghostscript. В отличие от ворда, с ним проблемы редки.

    Я ничего сверхестественного не делаю. Стандартные PostScript операторы, никаких внутренних gs-команд.

    ОтветитьУдалить
  12. 2 Michael пишет...
    Ну, прикручу я к gs cm-super шрифты. А мне файлы в журнал надо будет послать, что, переделывать всё?
    Нет, не придётся. Внедряем Type1 шрифты в графики и в постскрипт\пдф и всё. Всё работает.

    Однако, ghostscript он и в винде ghostscript. В отличие от ворда, с ним проблемы редки.
    У меня проблемы были как раз с пользователями виндовс - у меня Гельветика есть, а у них нету. Установка Type1 шрифтов меняет дело.

    ОтветитьУдалить
  13. С utf8 есть проблемы, да. Например, у меня (gnuplot 4.2, linux, локаль utf8) не видно русских букв даже в dvi. Гугление показало, что терминал postscript в частности и язык postscript(видимо, вследствие древности) вообще не поддерживают utf8. Однако в разрабатываемой версии gnuplot 4.3 (нужно качать через cvs) наметился некоторый прогресс.
    Во первых, появлась set encoding utf8 (в 4.2, правда, например вывод на экран работал и без нее)
    Во вторых опция set terminal postscript
    adobeglyphnames, которая позволяет использовать для всех неLatin-1 символов адобовские имена вместо кодов. При этом используемый шрифт должен их поддерживать. NimbusSanL-Regu не поддерживает, поддерживает, например, Arial

    ОтветитьУдалить
  14. >использовать шрифты из пакета scalable-cyrfonts-tex
    >документ будет оформлен шрифтом Times New Roman

    Так это же просто отлично! Спасибо за пост, Михаил!

    ОтветитьУдалить
  15. 2 Denis комментирует...

    С utf8 есть проблемы, да.
    Поэтому старые дебианщики, завернувшись в плед и постукивая по деревянной механической клавиатуре, сидят на кои8-r и горя не знают :-))

    Во первых, появлась set encoding utf8 (в 4.2, правда, например вывод на экран работал и без нее)
    В 4.0 за такое по рукам дают. Там её нет, только кои.

    При этом используемый шрифт должен их поддерживать. NimbusSanL-Regu не поддерживает, поддерживает, например, Arial
    Нимбус, сколь мне память не изменяет, Type1, потому вроде как и не должен их поддерживать.

    2 sin комментирует...

    >использовать шрифты из пакета scalable-cyrfonts-tex
    >документ будет оформлен шрифтом Times New Roman

    Так это же просто отлично! Спасибо за пост, Михаил!

    Пожалуйста. Стало быть, наш с тобой спор на 100 баксов закрыт, победила дружба :-))

    ОтветитьУдалить
  16. У меня есть вопрос по LaTeX. Несмотря на то, что всю свою документацию я пишу в DocBook XML, я использую LaTeX в качестве промежуточного слоя при создании PDF. У меня есть такая проблема с таблицей:
    http://portal.istra.ru/gallery/displayimage.php?album=852&pos=25
    Подскажите, что можно сделать на уровне LaTeX, чтобы оно автоматически соображало о необходимости уменьшения размера текста для конкретной ячейки?

    ОтветитьУдалить
  17. Второй вопрос, как уменьшить шрифт для verbatim:
    Получение информации о всех секциях схемы. Наиболее важный параметр секции указан в последней колонке. Это
    дата прекращения действия секции. {\footnotesize\begin{Verbatim}[]
    [oracle@filter: shell]$ ./show-status -p

    SMAP "Dozor-Jet" version 4.0 - Show Information about Scheme


    PartNum MAIN tablespace MESS tablespace Status Created Modified Limit
    ------- ------------------------- ------------------------- -------- ---------- ---------- ----------
    1 SMAP_MAIN00001 SMAP_MESSAGES00001 ONLINE 04-DEC-07 04-DEC-07 04-DEC-07
    2 SMAP_MAIN00002 SMAP_MESSAGES00002 ONLINE 04-DEC-07 04-DEC-07 05-DEC-07
    3 SMAP_MAIN00003 SMAP_MESSAGES00003 ONLINE 04-DEC-07 04-DEC-07 06-DEC-07

    \end{Verbatim}
    }

    ОтветитьУдалить
  18. Спасибо за статью, Михаил! Мне она очень помогла))
    Однако возникла следующая ситуация: после добавления в преамбулу строки \usefont{T2A}{ftm}{m}{sl} вытащить текст из pdf по-прежнему невозможно. Проблема решилась после прочтения документации на пакет scalable-cyrfonts-tex и добавления в преамбулу \usepackage{cyrtimes} (или другого стиля из этого пакета) после чего и \usefont{T2A}{ftm}{m}{sl} вроде бы не нужен

    ОтветитьУдалить
  19. Немного офтоп, но всеже - как вы проверяете орфографию и пунктуацию в latex. Для орфографии нашел только aspell. Что делать с пунктуацией ума не приложу. Черканите статью, думаю тема актуальная.
    с уважением u995.livejournal.ком

    ОтветитьУдалить
  20. Огромное Вам спасибо, Вы просто меня спасли.

    ОтветитьУдалить
  21. При подключении \usefont{T2A}{ftm}{m}{sl} - шрифт с наклоном, и не знает как правильно переносить слова (в документе на 2 стр - 8 проблемных слов-строк). Самое интересное что, если отключить
    \usepackage{cyrtimes}
    \usefont{T2A}{ftm}{m}{sl}
    проблем с переносами нет. В чём может быть проблема? Спасибо.

    ОтветитьУдалить
  22. Здравствуйте, Михаил.
    После компиляции в pdf, созданный с помощью гнуплота, рисунок содержит много пустого места на листе. Как правильно собрать рисунок, чтобы не было лишнего белого пространства, а только сам график.

    ОтветитьУдалить