HTML에서 LaTex로: Python과 lxml을 사용하여 사용자 정의 매크로를 사용하여 HTML 문서를 LaTeX로 변환하려면 어떻게 해야 합니까?

HTML에서 LaTex로: Python과 lxml을 사용하여 사용자 정의 매크로를 사용하여 HTML 문서를 LaTeX로 변환하려면 어떻게 해야 합니까?

저는 Python을 사용하여 알려진 태그 세트가 있는 html5 문서를 가져와 맞춤형 LaTeX 매크로를 사용하여 고품질 인쇄를 위해 LaTeX로 변환하고 싶습니다.

답변1

나는 많은 도구를 살펴보고 html 태그를 LaTeX 마크업에 매핑하는 재귀 함수가 있는 lxml을 선택했습니다. Python을 사용하여 매핑을 쉽게 정의할 수 있는 단일 위치를 제공합니다. 나는 책에 있는 예제를 바탕으로 작업했다고 생각합니다.Python 네트워크 프로그래밍의 기초

다음은 Python 2.7의 최소 작업 예입니다.

# convert html document to LaTeX
import lxml.html # http://lxml.de/lxmlhtml.html
from lxml import etree
from io import StringIO, BytesIO

def html2latex(el): # fill in this function to catch and convert html tags
    result = []
    if el.text:
        result.append(el.text)
    for sel in el:
        if False: # get info
            print('tag',sel.tag)
            print('text',sel.text)
            print('tail',sel.tail)
            print('attrib',sel.attrib)
        if sel.tag in ["h1"]:
            result.append('\hmchapter{%s}' % html2latex(sel))
        elif sel.tag in ["td", "table"]:
            result.append("<%s>" % sel.tag)
            result.append(html2latex(sel))
            result.append("</%s>" % sel.tag)
        elif sel.tag in ["span"]:  #
            for att in sel.attrib.keys():
                if att =='style':
                    if sel.attrib[att] == 'font-style:italic':
                        result.append(r'\textit{%s}' % (html2latex(sel)))
        else:
            result.append(html2latex(sel))
        if sel.tail:
            result.append(sel.tail)
    return "".join(result)

def main():
    # must be unicode or lxml parse crashes
    html = u'''
<!DOCTYPE html>
    <html>
  <head>
    <title></title>
  </head>
<body >
  <h1 class="hmchapter" data-hmvarbodychaptertitle = "My title">My title</h1>
  text <span style="font-style:italic">in a specific context</span> and more.
</body>
</html>
'''
    parser = etree.HTMLParser()
    tree   = etree.parse(StringIO(html), parser) # expects a file, use StringIO for string
    root = tree.getroot()
    latex = html2latex(root)
    print latex

if __name__ == '__main__':
    main()

이는 다음을 인쇄합니다.

\hmchapter{My title}
text \textit{in a specific context} and more.

관련 정보