응용프로그램2018. 9. 13. 01:08

아래 방법은 1) 불편하고 2) 부정확하다. 2018년 공주대학교 레이텍 워크숍에서 편리하고 정확한 프로그램이 공개되었으므로 그 방법을 이용하자.


프레젠테이션 및 프로그램은 해당 페이지에서 받을 수 있다. 진짜 너무나 편리함...

From HWP to LaTeX ( http://wiki.ktug.org/wiki/wiki.php/LaTeXWorkshop/2018 )






hml-equation-parser에 대한 소개는 다음 기사 참고.
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20161229092520

윈도우가 아니라면 다음 글을 참고.
https://jomno.github.io/hwp-%EC%88%98%EC%8B%9D%EC%9D%84-LaTex%EB%A1%9C(hml-equation-parser)/

다음은 윈도우 파이썬 3.6 기준.

0. 추출할 hwp 파일을 한글에서 hml로 저장한다(다른 이름으로 저장). 편의상 파일명은 test.hml로 바꾼다.

1. hml-equation-parser를 설치한다. pip로 하면 됨. 당연한 얘기지만 virtualenv를 사용하면 더 좋다. 그건 알아서.

    pip install hml-equation-parser

2. python 실행
    python

3. 파서 샘플 코드는 다음과 같다.
    import hml_equation_parser as hp
    doc = hp.parseHmlSample("test.hml")

    doc = hp.convertEquationSample(doc)
    string = hp.extract2HtmlStrSample(doc)

    import codecs
    f = codecs.open("test.html", "w", "utf8")
    f.write(string)
    f.close()


4. 근데 한국어(cp949) 윈도우에서 이걸 실행하면 2행에서 악명 높은 UnicodeDecodeError가 날 거다. 따라서 다음 코드를 먼저 실행하고 샘플 코드를 실행. 출처는 https://stackoverflow.com/a/34345136/6153990
    import _locale
    _locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])


5. 이제 test.html 파일이 생겼다. 보니까 100% 완벽한 건 아니지만(\가 생략되는 등) 뭐 어쩔 수 없지.

6. 파서에서 html에 기본적으로 MathJax를 심어놓았으므로 해당 span들만 추출하면 된다. 해당 html 파일을 브라우저로 열고 개발자 도구(F12)에서 다음 코드 실행.
    (() => {
      const els = [...document.body.querySelectorAll('script[id^="MathJax-Element-"')];
      const eqs = els.map(el => '$$' + el.textContent + '$$');
 
      let doc = window.open('', '어흥', 'width=512, height=1024').document;
      let pre = doc.createElement('pre');
      pre.textContent = eqs.join('\n');
      doc.body.appendChild(pre);
    })();


7. 팝업 차단을 해제하면 새 창이 하나 뜰 거다. 이제 그걸 전체 선택하고 텍스트 파일에 복붙하면 끝.

8. https://www.mathjax.org/#demo 혹은 http://www.codecogs.com/eqnedit.php 요런 곳에 가서 실험해보면 된다.

9. 매스타입 등에 쓰려면 MathML으로 추출하는 게 편할 텐데 그러면 6번 코드 2~3행을 다음과 같이 변경. 근데 변환 결과가 완벽하지 않아서 더 불편할 것 같음...
      const els = [...document.body.querySelectorAll('span[id^="MathJax-Element-"')];
      const eqs = els.map(el => el.getAttribute('data-mathml'));



Posted by 필유