본문 바로가기
아래아한글 자동화/python+hwp 중급

[QnA] 수기로 입력한 MathML 수식을 정확한 문법으로 교정하기

by 일코 2022. 11. 27.
안녕하세요. 수식 관련해서 문의 드리고 싶은게 있습니다.
사용자가 입력하는수식을 추출할 때, 정확한 수식문법으로 가져오지 못하는 문제가 생겨 혹시 이러한 문제를 해결할 수 있는 방법이 있는지 문의 드립니다.
예를 들어 루트 2를 표현하는데 사용자가 한글의 수식 편집기에서 루트기호를 클릭하여 루트 2를 사용하는게 아니라
직접 스크립트 문법을 작성하여 입력하는 경우 sqrt {2} 또는 sqrt 2 이런식으로 표현이 가능합니다.
중괄호 없이 표현을 해도 루트가 작성이 되더라고요.
루트 뿐만 아니라 모든 수식이 이렇게 중괄호 없이 표현이 가능합니다.
물론 스크립트 문법을 사용하지 않고 수식편집기에서 수식 아이콘을 클릭하여 수식 UI에 직접 숫자를 입력하면 괄호 안에 정확하게 나타납니다.

수식을 정확하게 읽어오기 위해 중괄호 안에 정확하게 숫자가 들어가야하는데
sqrt 2 이렇게 입력을 한 사용자의 수식은 수식 처리하는데 문제가 되고 있어 해결 방법이 있나해서 문의 드립니다.

hwp.FindCtrl()
액션 = hwp.CreateAction("EquationModify")
세트 = 액션.CreateSet()
아이템셋 = 세트.CreateItemSet("EqEdit", "EqEdit")
액션.GetDefault(아이템셋)
추출수식 = 아이템셋.Item("String")
print(추출수식)

이러한 명령어를 통해 읽어들이고 있는데 사용자가 직접 스크립트 문법을 입력한 경우 사용자가 입력한 문법으로 가져오고 있습니다.
혹시 사용자가 수식을 sqrt 2라고 입력해도 sqrt {2} 이런식으로 중괄호 안에 정확하게 가져오는 방법이 있을 까요??

 

아래아한글 문서 안에 아래와 같은 수식이 입력되어 있다고 해보겠습니다.

수식편집기를 이용해서 수식문자열을 읽어보면

sqrt2 + sqrt2 + sqrt2 + sqrt2 = 4sqrt2  # ①

이렇게 (대충) 입력해 놓은 수식입니다.

 

그런데 MathML 수식 문법은 원래 아래와 같이 작성되어야 합니다.

sqrt {2} + sqrt {2} + sqrt {2} + sqrt {2} =4 sqrt {2}  # ②

 

①과 같이 입력된 수식의 경우에도 ②와 같은 (교정되어 있는) 수식문자열을 추출할 수 있을까요?

예. 한/글에서는 아래와 같이, 수식 관련 문자열을 두 가지 제공하고 있습니다.

수식편집기로 아래와 같이 입력한 경우

해당 컨트롤을 선택한 후 "EquationPropertyDialog" 액션을 생성해보면

수식문자열 관련해서 "String" 파라미터와 "VisualString" 파라미터 두 가지를 제공하고 있습니다.

두 가지 문자열의 조회방법 및 교정방법은 아래와 같습니다.

>>> act = hwp.CreateAction("EquationPropertyDialog")
>>> pset = act.CreateSet()
>>> act.GetDefault(pset)
>>>
>>> # 사용자가 입력한 수식 출력
>>> print(pset.Item("String"))
sqrt 2 + sqrt2 + sqrt2 + sqrt2 = 4sqrt2

>>> # 문법에 맞는 해당 수식
>>> print(pset.Item("VisualString"))
sqrt {2} + sqrt {2} + sqrt {2} + sqrt {2} =4 sqrt {2}

>>> # 사용자입력 수식(String)을 문법에 맞는 수식(VisualString)으로 교정하려면
>>> pset.SetItem("String", pset.Item("VisualString"))
>>> act.Execute(pset)

위 코드를 전부 실행했으면 사용자 입력 문자열 String이 교정되어 있는지 다시 조회해보겠습니다.

>>> # 해당 수식을 선택(hwp.FindCtrl())
>>> act = hwp.CreateAction("EquationPropertyDialog")
>>> pset = act.CreateSet()
>>> act.GetDefault(pset)
>>> print(pset.Item("String"))
sqrt {2} + sqrt {2} + sqrt {2} + sqrt {2} =4 sqrt {2}

>>>

의도한 대로 잘 교정되어 있네요.

VisualString 파라미터를 잘 활용하셔서 원하시는 작업 완성하시기를 바랍니다.

행복한 하루 되세요!

앞으로도 도움이 되는 콘텐츠를 만들어 가겠습니다.

 

댓글