인프런 커뮤니티 질문&답변

YongJun(Passion)님의 프로필 이미지

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

한/글 문서를 불러오고, 저장하고, 닫기

수식의 String을 변수에 저장

해결된 질문

24.06.10 11:38 작성

·

105

2

안녕하세요 일코님

이번에 질문드릴 내용은
선택된 영역의 수식의 String을 변수에 저장하고 싶어서 질문드립니다.

 

일전에 질문드린 내용에서

hwp.get_selected_pos()를 사용하여 선택된 영역의 위치값을 알 수 있었는데요

이 위치값 안에 위치한 수식의 String을 가져오고 싶어서 문의드립니다.

123과 1/3은 수식으로 입력된 내용입니다.

만약 선택된 내용을 hwp.get_selected_pos()로 받고

math_string = '앞은 문자' + 123

(123은 수식에서 가져온 'String')

이런식으로 변수에 선언해주고 싶다면 어떻게 해야할까요..
(문자와 수식이 혼합된 경우 동일한 순서로 값을 받는 방법이 있을지 궁금합니다.)

 

selected_pos 안에 ctrl을 조회하는게

이전에 설명주신 내용에서는

전체 문서의 ctrl_list의 UserDesc를 조회를 하게되는 방식이였는데

선택된 내부의 ctrl만 조회하게 하는 방법은 없는지도 질문드립니다.

답변 1

2

일코님의 프로필 이미지
일코
지식공유자

2024. 06. 10. 19:13

용준님, 안녕하세요?

선택된 범위 내의 ctrl만 조회하는 명령어는 따로 만들어져 있지는 않습니다.

(별도의 함수로 만들 수 있을 것도 같은데, 그건 맨 아래에 써보겠습니다.)

 

대신 이런 방법을 써보시면 어떨까요?

 

① 모든 수식 개체를 "`수식String`" 이라는 문자열로 치환해버리기?

이런 식으로 미리 일괄 치환을 해버리시면,

편하게 문자열 + 수식String 작업을 처리하실 수 있지 않을까 싶습니다.

수식String을 치환할 때 특정 문자열(백틱이라든지, -*-라든지..)을

앞뒤로 삽입하시면, 수식을 찾기도 쉬울 거고요.

수식을 String 문자열로 치환해버리는 코드는 아래와 같이 짤 수 있습니다.

for ctrl in hwp.ctrl_list:
    if ctrl.UserDesc == "수식":
        hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
        hwp.insert_text("`" + ctrl.Properties.Item("String") + "`")
        hwp.delete_ctrl(ctrl)  # 수식 없애는 라인

image

② 수식의 위치(List,Para,Pos)만 모아놓은 리스트를 따로 만들기

수식위치 리스트를 별도로 미리 만들어놓고,

hwp.get_selected_pos() 에 해당되는지 매번 조회해도 될 듯 합니다^^;

예를 들어 아래 math_pos는 수식과 수식의 pos를 담고 있습니다.

math_pos = []
for ctrl in hwp.ctrl_list:
    if ctrl.UserDesc == "수식":
        hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
        math_pos.append([hwp.get_pos(), ctrl])
print(math_pos)

[[(0, 0, 22), <win32com.gen_py.HwpObject 1.0 Type Library.IDHwpCtrlCode instance at 0x2154797250368>],
 [(0, 1, 3), <win32com.gen_py.HwpObject 1.0 Type Library.IDHwpCtrlCode instance at 0x2154820951296>]]

만약 hwp.get_selected_pos() 안에 수식 컨트롤이 있을 때, 그 컨트롤을 리턴하고 싶다면?

아래와 같이 함수를 짜볼 수 있을 것 같아요. (단, 한 문단만 선택하는 경우에 한해서 사용가능합니다.)

def math_in_selection():
    sel_pos = hwp.get_selected_pos()
    math_pos = []
    for ctrl in hwp.ctrl_list:
        if ctrl.UserDesc == "수식":
            hwp.set_pos_by_set(ctrl.GetAnchorPos(1))
            math_pos.append([hwp.get_pos(), ctrl])
    
    start = sel_pos[1:4]
    end = [i + 1 for i in sel_pos[4:]]
    lst, par, pos = [list(range(*i)) for i in list(zip(start, end))]
        
    return_list = []
    for i in math_pos:
        if (i[0][0] in lst and
            i[0][1] in par and
            i[0][2] in pos):
            return_list.append(i[1])
    return return_list


ms = math_in_selection()
for m in ms:
    print(m.Properties.Item("String"))

image

두 번째 함수가 용준님께서 말씀하신

"선택된 내부의 ctrl만 조회하게 하는 방법은 없는지"에 대한 답변이 된 것 같기도 합니다.

 

잘 이해가 안 되거나 추가로 궁금한 부분이 있으면 댓글 달아주세요^^

 

행복한 하루 되세요!!