응용프로그램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 필유
응용프로그램2017. 2. 1. 22:38

문장부호 중점(·)을 수식에서 내적(곱하기) 기호로 사용해도 되는가? 결론만 말하면 그렇다.


위키백과를 보면 중점(같이 생긴 부호)은 여러 가지가 있다. 일반적으로 국문 문장부호로 사용하는 게 이 중점(·)이다. 유니코드로는 00b7. 윈도우 한글 입력기에서는 ㄱ을 입력하고 한자 키를 누르면 두 번째 페이지 8번째에 있다.


이거랑 비슷한 녀석으로 불릿(•)이 있다. 더 크다. 유니코드로 2022. 주로 목록을 표시할 때 목록 앞머리에 쓴다.


위의 위키백과에 따르면 이 둘은 레이텍에서는 각각 \textperiodcentered\textbullet이다.


얘네 둘까지는 혼돈이 없는데, 수식으로 가면 복잡해진다. 위 두 가지의 수식 버전에 해당하는 점 연산자(⋅)와 불릿 연산자(∙)가 있다. 유니코드에서 각각 22c52219다. 레이텍으로 치면 각각 \cdot\bullet이다.


이런 걸 고민하는 게 나뿐만은 아니다. 텍 스택오버플로에 관련 질답이 있었다. 해당 답변을 건단히 정리한 게 이상의 내용이다.


여기부터는 내 문제. 내가 애용하는 모 레이텍 렌더링 사이트에서 \cdot을 입력하면 pdf 결과가 중점(00b7)으로 출력된다는 거다. \bullet을 입력하면 그냥 불릿(2022)으로 출력된다.


게다가 점 연산자와 불릿 연산자를 입력하면 아예 제대로 렌더링이 안 된다.



이 사이트는 레이텍의 표준 서체와도 같은 Computer/Latin Modern 서체(위키백과) 등을 사용하는데, 글리프를 직접 확인해보니 이 옛날(?) 서체들에는 22c5와 2219 글리프가 없었다(한편, 오라일리 같은 외국 출판사에서는 종종 수식에 STIX 서체(위키백과)를 사용한다. STIX 서체에는 22c5와 2219 글리프를 포함해 엄청나게 많은 글리프가 들어 있다).


결론적으로 그렇다고 한 건... 사실 점(불릿) 연산자와 중점(불릿)을 시각적으로 구분하는 것은 불가능하기 때문이다. 따라서 문단 수식을 조판하는 데에는 여전히 저 사이트를 이용해도 문제는 없어 보인다. 물론 더 정확히 하려면 뭔가 다른, 제대로 된 레이텍 렌더링 방법을 찾아야 한다. 근데 이러면 나 한 몸 편하자고 온라인으로 레이텍 렌더링하는 게 무슨 의미가 있느냐고...


*추가:

위 사이트 말고 다른 레이텍 렌더링 사이트에서는 중점과 점 연산자가 잘 구분되어 렌더링되고 pdf로 출력하면 제대로 된 글리프가 나온다. 예제 파일. 이걸 pdf로 출력하고 그 pdf에서 텍스트를 복사해서 워드 같은 데 붙여넣기해보면 글리프가 다른 걸 확인할 수 있다.


게다가 이 사이트는 컴파일러를 고를 수도 있다. 이게 왜 유용하냐면... 유니코드에는 그리스문자 델타(Δ)와 증분 기호(∆)가 별도로 들어 있는데(각각 03942206) 후자를 레이텍으로 쓰려면 unicode-math 같은 패키지가 필요하고 이 패키지는 pdflatex가 아니라 xelatex나 lualatex에서만 사용할 수 있다. 위 사이트에서는 이들 여러 컴파일러를 모두 사용할 수 있다.





Posted by 필유