본문 바로가기

파이썬-아래아한글 자동화 응용

[1/5, HwpEqn 서론] LaTeX 수식을 한/글 수식편집기에 넣을 수 있다?

아래아한글의 장점 중 하나는 깔끔한 수식.

Visual String 을 이용한 간편한 수식삽입도 가능하며, LaTeX나 MathML과는 다소 상이한,

이를테면 이런 식이다.

지수의제3법칙

위 식의 한컴수식 문자열은 아래와 같다.

a  ^{m} ÷a  ^{n} = {cases{a  ^{m-n} ~~&(m>n)#1&(m=n)#{1} over {a  ^{n-m}}&(m<n)}}

또한 한/글에서는, 외부호환성을 위해 위 식을 MathML로 변환하여 저장하거나
반대로 MathML에서 불러오는 기능을 제공한다.



참고로 MathML(일명 mml) 서식으로 변환된 식은 아래와 같다.

<math>
  <msup>
    <mi>a</mi>
    <mrow>
      <mi>m</mi>
    </mrow>
  </msup>
  <mo>&#x000F7;</mo>
  <msup>
    <mi>a</mi>
    <mrow>
      <mi>n</mi>
    </mrow>
  </msup>
  <mo>=</mo>
  <mrow>
    <mo>{</mo>
    <mtable>
      <mtr>
        <mtd>
          <msup>
            <mi>a</mi>
            <mrow>
              <mi>m</mi>
              <mo>-</mo>
              <mi>n</mi>
            </mrow>
          </msup>
          <mo>&#x00020;</mo>
          <mo>&#x00020;</mo>
        </mtd>
        <mtd>
          <mi>(</mi>
          <mi>m</mi>
          <mo>&#x03009;</mo>
          <mi>n</mi>
          <mi>)</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mn>1</mn>
        </mtd>
        <mtd>
          <mi>(</mi>
          <mi>m</mi>
          <mo>=</mo>
          <mi>n</mi>
          <mi>)</mi>
        </mtd>
      </mtr>
      <mtr>
        <mtd>
          <mfrac>
            <mrow>
              <mn>1</mn>
            </mrow>
            <mrow>
              <msup>
                <mi>a</mi>
                <mrow>
                  <mi>n</mi>
                  <mo>-</mo>
                  <mi>m</mi>
                </mrow>
              </msup>
            </mrow>
          </mfrac>
        </mtd>
        <mtd>
          <mi>(</mi>
          <mi>m</mi>
          <mo>&#x03008;</mo>
          <mi>n</mi>
          <mi>)</mi>
        </mtd>
      </mtr>
    </mtable>
  </mrow>
</math>

MathML은 가독성을 고려해서는 안되는 마크업이다. 굳이 왜 이런 기능을 넣었을까 싶을 만도 하겠지만,

파이썬의 유익한 모듈인 latex2mathml 을 사용하면 어떨까?

MathML은 마크업언어인만큼 기준이 되고, 타 마크업으로 변환시 오류가 거의 없는데,

이를 통해 한/글 수식을 LaTeX로 변환하는 것이 가능하며, LaTeX 또한 한/글에 삽입하는 것이 가능하다.

예제를 한 번 보자. 아래 예제는 LaTeX 문법으로 A_m,n 행렬을 나타낸다.

A_{m,n} = 
 \begin{bmatrix}
  a_{1,1} & a_{1,2} & \cdots & a_{1,n} \\
  a_{2,1} & a_{2,2} & \cdots & a_{2,n} \\
  \vdots  & \vdots  & \ddots & \vdots  \\
  a_{m,1} & a_{m,2} & \cdots & a_{m,n} 
 \end{bmatrix}
        

그리고 아래는 위의 수식에 대응하는 MathML 문법이다.(파이썬의 latex2mathml 모듈 사용)

<math>
    <mrow>
        <msub>
            <mi>A</mi>
            <mrow>
                <mi>m</mi>
                <mi>,</mi>
                <mi>n</mi>
            </mrow>
        </msub>
        <mo>=</mo>
        <mo>[</mo>
        <mtable>
            <mtr>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>1</mn>
                            <mi>,</mi>
                            <mn>1</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>1</mn>
                            <mi>,</mi>
                            <mn>2</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <mo>⋯</mo>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>1</mn>
                            <mi>,</mi>
                            <mi>n</mi>
                        </mrow>
                    </msub>
                </mtd>
            </mtr>
            <mtr>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>2</mn>
                            <mi>,</mi>
                            <mn>1</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>2</mn>
                            <mi>,</mi>
                            <mn>2</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <mo>⋯</mo>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mn>2</mn>
                            <mi>,</mi>
                            <mi>n</mi>
                        </mrow>
                    </msub>
                </mtd>
            </mtr>
            <mtr>
                <mtd>
                    <mo>⋮</mo>
                </mtd>
                <mtd>
                    <mo>⋮</mo>
                </mtd>
                <mtd>
                    <mo>⋱</mo>
                </mtd>
                <mtd>
                    <mo>⋮</mo>
                </mtd>
            </mtr>
            <mtr>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mi>m</mi>
                            <mi>,</mi>
                            <mn>1</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mi>m</mi>
                            <mi>,</mi>
                            <mn>2</mn>
                        </mrow>
                    </msub>
                </mtd>
                <mtd>
                    <mo>⋯</mo>
                </mtd>
                <mtd>
                    <msub>
                        <mi>a</mi>
                        <mrow>
                            <mi>m</mi>
                            <mi>,</mi>
                            <mi>n</mi>
                        </mrow>
                    </msub>
                </mtd>
            </mtr>
        </mtable>
        <mo>]</mo>
    </mrow>
</math>

위 텍스트를 한/글 수식편집기로 불러와서 수식을 만들면 아래와 같다.

LaTeX를 한/글 수식편집기에 넣을 수 있을까?

기본적인 마크업 간 변환을 알아보았다. 디테일하게 들어가면 경미한 변환오류가 있다고들 하는데, 필자는 수학이나 물리를 가르치는 일을 하지 않기 때문인지, 한 번도 오류를 경험한 적은 없다. 물론 세간의 루머처럼 수식 입력시 프로그램이 다운되고 꺼지고 복구가 불가능하게 된 적도 없다..

다음 포스팅에는 한/글에 삽입된 수식을 텍스트로 추출하거나, MathML 변환을 거쳐서 LaTeX로 변환하는 과정을 알아보고, 한/글 파일의 수식과 텍스트를 마크다운으로 변환하여 웹에 업로드하는 일련의 과정을 튜토리얼처럼 알아보기로 하자.

<참고로, 필자는 이 분야 전문가가 아니므로, 설명에 작은 오류라도 있으면 적극적으로 댓글 남겨주시기 부탁드리며,
수식 관련해서 추가로 알려드렸으면 하는 API명령어나 수식 다루는 법이 궁금하신 경우에도 댓글로 남겨주시기 바람>


다음 포스팅은...

 

[2/5, HwpEqn] HWP문서 수식을 텍스트로 추출하는 방법

(1) 안녕하세요 ~ 저는 유튜브 회사원코딩 구독자입니다. 올려주신 영상들 잘 시청하고 있습니다. 문의드릴 사항으로는 한글 파일을 이미지로 변환하여 저장하고, 한글파일내의 텍스트의 위치

www.martinii.fun

반응형
  • 구독자 2020.12.16 11:57

    덕분에 한글파일 다루는법을 많이 배우는것 같습니다~
    다음 포스팅이 기대 되네요 ^^

  • kang 2021.02.07 22:14

    제가 원하는 기능인데 .. 파이썬을 잘 모르다보니 잘 안되네요.. 조금만 과정을 상세히 알려 주실 수 없으실까요.. 이게 가능하면 PDF에 있는 수식을 한글로 불러올 수 있을거 같아서요.