본문 바로가기
업무자동화/파이썬-아래아한글 자동화 응용

파이썬-한/글API로 수식 자동삽입(feat. 밍밍님)

by Martinii의 회사원코딩 2021. 8. 10.

질문주신 내용은..

수식삽입 관련 문의


제가 참고하라고 남겼던 114번 글은, 삽입방법이 들어있긴 하지만, 문맥상 기존에 있던 수식을 전부 해체 및 저장해서, 새로운 페이지나 새로운 문서에 집어넣기 위해 사전으로 저장하고, 사전에서 추출해오는 코드였습니다.

포스팅에 있던 코드 중 밍밍님께서 질문 주신 내용에 대한 부분만 추출해보면 아래와 같습니다.

from time import sleep

import win32com.client as win32


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

hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.XHwpWindows.Item(0).Visible = True

hwp.HAction.GetDefault("EquationCreate", hwp.HParameterSet.HEqEdit.HSet)
hwp.HParameterSet.HEqEdit.EqFontName = "HancomEQN"
hwp.HParameterSet.HEqEdit.string = hwpeqn_text
hwp.HParameterSet.HEqEdit.BaseUnit = hwp.PointToHwpUnit(25.0)
hwp.HAction.Execute("EquationCreate", hwp.HParameterSet.HEqEdit.HSet)
sleep(1)

hwp.FindCtrl()
hwp.HAction.GetDefault("EquationPropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
hwp.HParameterSet.HShapeObject.HSet.SetItem("ShapeType", 3)
hwp.HParameterSet.HShapeObject.Version = "Equation Version 60"
hwp.HParameterSet.HShapeObject.EqFontName = "HancomEQN"
hwp.HParameterSet.HShapeObject.HSet.SetItem("ApplyTo", 0)
hwp.HParameterSet.HShapeObject.HSet.SetItem("TreatAsChar", 1)
hwp.HAction.Execute("EquationPropertyDialog", hwp.HParameterSet.HShapeObject.HSet)
hwp.Run("Cancel")

 

밍밍님께서 적어주신 수식문자열은 (Latex이 아니고) 한/글 수식문자열인데,

한/글 수식문자열은 다행히(?) 위처럼 API 명령어만 가지고 삽입할 수 있습니다.

만약 mathml 문자열이라면 수식편집기(Ctrl-N-M)에서 "불러오기(Alt-M)" 를 사용하는 방법 말고는 모르겠습니다;


위 코드를 라인별로 실행한 화면을 아래 남겨놓습니다.

한/글API로 수식 삽입

API명령어는 대부분 이해하실 거라 믿습니다.

한 가지만 부연설명드리면, 코드 중간과 마지막쯤에 Execute가 두 번 나오는데, 처음 삽입된 수식은 경우에 따라 폰트가 너무 안예쁘게 나옵니다. 그래서 폰트를 변경하는 두 번째 Execute를 실행한 다음에야 한/글의 미려한 폰트가 적용되는 것을 보실 수 있는데, 한/글의 버그인지 (제 버그인지) 다 우겨넣고 Execute 한번에 실행하면 예쁜 폰트가 적용이 안 되는 것 같더라고요.

도움이 되었길 바랍니다.

행복한 하루 되세요^^


donaricano-btn

 

댓글7

  • 밍밍 2021.08.12 09:35

    와..너무 감사합니다..!!!!
    pyhwp나 win32.hwp만 찾아보고있었는데 좋은정보 감사드립니다.
    답글

  • 양동훈 2021.08.13 14:02

    안녕하세요~ 항상 도움 많이 받고 있습니다.
    질문을 어디에 해야 할지 몰라서 여기 댓글에 적는점 양해 부탁드립니다.

    혹시 아래한글에서 한줄의 글자 갯수와 단어가 줄바꿈이 되었을때 상황 및 글자 갯수를 알 수 있을까요?

    제가 하고자 하는것은 아래한글 문서 전체에서 한글자~세글자가 줄 바꿈 되었을때 그 바로 윗줄부터 그 바로 아래줄 첫 단어까지 자간조정을 해서 한줄로 만들려고 하는데요..

    아래한글의 '문단모양'에서 '줄 나눔 기준'을 '어절'로 바꾸기로 했을때 조금 안맞는 경우가 있어서.. 파이썬으로 임의로 조정해 볼려고 합니다.

    예를 들어 '자간조정을' 이라는 단어가

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~자간조
    정을~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    이렇게 줄이 바뀌었을때 '자간조'가 시작된 줄 처음부터 다음줄의 '정을'까지 자간을 임의로 -값을 더 줘서 한줄로 만들려고 합니다.
    가능할까요?

    답글

    • 동훈님 안녕하세요? 저도 공공기관 근무하는지라 무슨말씀 하시는지 바로 이해가 됩니다ㅎㅎㅎ 방법 자체는 간단하고 접근방법도 여러 가지가 있을 것 같습니다. 우선은 InitScan과 GetText를 이용한 방법을 오늘밤에 포스팅으로 남겨놓을테니 나중에 참고하여 주시기 바랍니다.

    • Martinii 2021.08.14 14:30

      포스팅으로 답변 남깁니다^^
      https://employeecoding.tistory.com/197

  • 양동훈 2021.08.14 03:19

    추가로 궁금한게 있는데요 -_-;;;;
    hwp.GetText() 해서 글자를 검색할 때.. 문서의 처음부터 끝까지 찾는데요..

    페이지 범위를 지정하거나, 현재 커서 위치 이후로만 검색하는 법이 있을까요?
    HwpAutomation.hwp 파일을 봐봤는데요(23~24p) 파라메터에서 지정하는 법이 있는거 같은데
    파이썬에서 어떻게 해야 할지 모르겠네요 T.T
    답글

  • 밍밍 2021.08.18 11:04

    안녕하세요 추가 질문이 있어 질문드립니다!
    혹시 python에서 latex 수식을 hwp 수식으로 변환하는 방법이 있을까요?
    hwp-> latex는 되는데 반대의 경우는 못찾겠어서..ㅠㅠ
    답글

    • latex를 mathml(mml) 포맷으로 변환해 주는 툴이나 웹사이트가 여럿 있습니다. 또한 한/글에서는 mml을 수식입력기에서 불러올 수 있어 이런 일련의 과정을 자동화하면 latex의 한/글 삽입이 어려운 일은 아니나, 경험상 복잡한 수식이 깨지는 경우가 있는 것 같습니다. 어떤 방법이 최선인지는 모르겠지만, 레이텍이나 한컴수식 관련해서는 카페 등의 커뮤니티에서 도움을 받으시는 걸 추천드립니다ㅜ