Найти - Пользователи
Полная версия: latex и python
Начало » Python для новичков » latex и python
1
nesergen
Делаю эксперименты в работе с Latex и выводом текста в pdf. С Латексом разобрался с помощью модуля PyLatex, но возникла проблема с печатью Юникода штатными средствами моудля PyLatex. Единственный найденный мною выход заключается в использовании модуля TEX. Но опять возникла некая проблема, которую я решить не могу. При выполнении моей программы в Терминале Линукса получаю вывод ошибки:

 sergen-pc:~$ python /home/sergen/PythonExp/latex.py
Traceback (most recent call last):
  File "/home/sergen/PythonExp/latex.py", line 27, in <module>
    tex.convert('/home/sergen/PythonExp/full.tex', 'tex', 'pdf', max_runs=3)
  File "/usr/local/lib/python2.7/dist-packages/tex.py", line 149, in convert
    raise ValueError(log)
ValueError: This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdftex 2016.5.1)  20 OCT 2016 20:03
entering extended mode
 %&-line parsing enabled.
**/tmp/tex-temp-UzNg43/texput.tex
(/tmp/tex-temp-UzNg43/texput.tex)
! Emergency stop.
<*> /tmp/tex-temp-UzNg43/texput.tex
                                   
!  ==> Fatal error occurred, no output PDF file produced!

Не могу понять в чем причина, то ли в папке tmp с которой tex отказывается работать, то ли во внутренностях модуля tex ? Если знаете другой Питоновский модуль для конвертации файлов ТЕХ в PDF тоже буду рад попробовать.
doza_and
nesergen
Если знаете другой Питоновский модуль для конвертации файлов ТЕХ в PDF
Хм. может оффтоп, но мне казалось что питон для этого не нужен. В латехе есть команда pdflatex Вроде ее всегда достаточно.
nesergen
мне нужно автоматизировать изготовление ПДФ, поэтому пользуюсь Питоном и его родными библиотеками, в частности PyLatex'ом.
doza_and
nesergen
мне нужно автоматизировать изготовление ПДФ
Хорошо что вы привели код ошибки. Однако вы не привели код которым этого добились. Еще лучше посмотреть что получилось в файле который вы пытаетесь скормить латеху.

nesergen
Питоном и его родными библиотеками, в частности PyLatex'ом.
С какого перепугу это родная библиотека? Просто одна из многих библиотек созданных сообществом.

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

nesergen
По просьбам трудящихся код программы.
 #! ./usr/bin/python3
# -*- coding: utf-8 -*-
from pylatex import Document, Section, Subsection, Tabular, Math, Package,  MultiRow
from pylatex.utils import italic
import tex
doc = Document()
table4 = Tabular(u'|c|c|c|')
table4.add_hline()
col1_cell = MultiRow(2, data=u'span-2')
col2_cell = MultiRow(2, data=u'span-3')
table4.add_row((col1_cell, u'123', col2_cell ))
table4.add_hline(start=2,  end=2)
table4.add_row((u'', tex.escape_latex(u'rty'), u'' ))
table4.add_hline()
doc.append(table4)
doc.generate_tex(u'/home/sergen/PythonExp/tex-exp/full')
tex.convert(u'/home/sergen/PythonExp/tex-exp/full.tex', u'tex', u'pdf', max_runs=3)

Тот файл .tex который указан в ошибке я посмотреть не могу, т.к. создаваемая временная папка самоуничтожается сразу после возникновения ошибки. Но выложу файл .tex который получается непосредственно генерацией pylatex`ом

 \documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{multirow}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\multirow{2}{*}{span{-}2}&123&\multirow{2}{*}{span{-}3}\\
\cline{2-2}
&rty&\\
\hline
\end{tabular}
\end{document}

Про шаблонизаторы - не понял мысль.

Вот то что должно получиться после генерации ПДФ. Вот только в этом примере не использовался юникод.
https://yadi.sk/i/9dWO3h-ExLSUR

Кстати, ошибка не связана с папкой /tmp, я изменил место создания временных файлов в модуле tex , но ошибка осталась прежней, а папка с временными файлами по прежнему самоликвидируется.
doza_and
nesergen
По просьбам трудящихся код программы.
Спасибо. Я правда не стал ставить абсолютно не нужный мне модуль, но если зайдем с тупик поставлю и попробую воспроизвести ошибку.
Но остается непонятно что вы имеете ввиду под печатью юникода?

В вашем коде настораживают u“some”. в питоне 3 они ничего не значат. Полные пути тоже не good, хотя для отладки новичком может и ничего. Нежелательно зазывать модуль latex. Легко наехать на другой модуль с тем-же именем.

nesergen
Тот файл .tex который указан в ошибке я посмотреть не могу
Вы можете посмотреть этот файл. Вам указаны модуль и строчка. Ставите там точку останова отладчика и украдаете файл до его уничтожения.

Ваш tex файл нормальный. У меня pdflatex его съедает. А у вас? У вас может быть с настройками texlife проблемы.

nesergen
Про шаблонизаторы - не понял мысль.

 import subprocess as sp
from mako.template import Template
res = Template(r"""\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{multirow}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\multirow{2}{*}{span{-}2}&${a}&\multirow{2}{*}{span{-}3}\\ 
\cline{2-2}
&${b}&\\ 
\hline
\end{tabular}
\end{document}""").render(a=123, b="rty")
with open("out.tex", "w", encoding="utf-8") as f:
    f.write(res)
sp.check_call("pdflatex out.tex", shell=1)
Обычно сам текст шаблона держат в отдельных файлах тогда код займет пару абзацев
Получается короче и более контролируемо. Вы контролируете удаление временных файлов, кодировку в которой пишется результат и т.п.

Мне кажется основная идея модуля который вы используете в том чтобы заменить язык latex полностью на язык python. Но они пока далеко не продвинулись, осталось много конструкций от латеха в виде сырых строк. И самое главное не надо тогда латех для генерации pdf привлекать.

Проблема в том, что в латехе есть огромное количество модулей для решения различных задачек. И всю эту орду прийдется переписывать. Я пока не могу придумать для чего модуль pylatex полезно использовать, хотя соглашусь что язык latex не фонтан.

Кстати есть любителе и обратного подхода не латех в питон а питон в латех пихают

https://habrahabr.ru/post/59782/
nesergen
Основная проблема решена. Инструментами отладки питона удалось найти источник ошибки. Конвертору нужо скармливать не путь к файлу, а непосредственно его содержимое, чистый текст. Спасибо за полезные мысли !

Но остается непонятно что вы имеете ввиду под печатью юникода?

Я имею в виду русский текст в Латексе. По этому вопросу попрошу Вас сделать ПДФ из следующего документа и сообщить результат:
 \documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{multirow}
\begin{document}
\begin{tabular}{|c|c|c|}
\hline
\multirow{2}{*}{span{-}2}&Кирилица, едрить её за ногу&\multirow{2}{*}{span{-}3}\\
\cline{2-2}
&Unicode, бутерброд ему в рот...&\\
\hline
\end{tabular}
\end{document}

Проблема в том, что в латехе есть огромное количество модулей для решения различных задачек. И всю эту орду прийдется переписывать. Я пока не могу придумать для чего модуль pylatex полезно использовать, хотя соглашусь что язык latex не фонтан.
Питон мне нравится своей простотой кода, кроме того, привыкнув к структуре его кода , не хочется ломать голову над структурой других языков типа Латекс. Поэтому для собственного удобства использую питоновские варианты модулей нужных мне пакетов. Возможностей PyLatex мне вполне достаточно для моих нужд.
doza_and
nesergen
и сообщить результат:
Не работает.

Работает если писать
 \usepackage[T2C]{fontenc}
nesergen
О-о-о !!! Сэр !!!! Премного благодарен ! Теперь всё работает, включая модуль pylatex и печать pdf с кирилицей. Привожу итоговый код моего маленького эксперимента для будущих поколений:

 #! ./usr/bin/python3
# -*- coding: utf-8 -*-
from pylatex import Document,   Tabular,    MultiRow
doc = Document(fontenc='T1,T2C')
table4 = Tabular('|c|c|c|')
table4.add_hline()
col1_cell = MultiRow(2, data='span-2')
col2_cell = MultiRow(2, data='span-3')
table4.add_row((col1_cell, u'Кирилица, едрить её за ногу', col2_cell ))
table4.add_hline(start=2,  end=2)
table4.add_row(('', u'Юникод, сапог ему врот', '' ))
table4.add_hline()
doc.append(table4)
doc.generate_pdf(u'/home/sergen/PythonExp/tex-exp/full' )

Как итог можно сказать следующее:
- весь кирилический текст должен быть Юникодом , который модуль будет конвертировать в нужный ему формат
- должна быть добавлена поддержка русского языка:
  • -строкой fontenc='T1,T2C' в классе Document
    -в операционной системе sudo apt-get install texlive-latex-base texlive-doc-ru texlive-lang-cyrillic
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB