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

현재 조판부호가 보이는 상태인지 확인하는 함수 만들기

by 일코 2022. 12. 27.
반응형

한/글 자동화 단축명령어 중에는,

조판부호 보이기 상태를 토글하는 명령어가 있습니다.

다만, 현재 어떤 상태인지 리턴해주는 명령어는 없기 때문에

문서를 조작할 때 애먹을 때가 있습니다.

예를 들면 글자처럼 취급되지 않는 이미지나 표를 복사할 때

조판부호를 선택할 수 있어야 복사가 가능한 경우가 있는데

현재 조판부호가 보임 상태인지 확인할 길이 없(다고 생각했)거든요.

 

그래서 나름의 방법을 고안해서 함수를 만들었습니다.

다른 여러 가지 방법도 있겠지만 

제가 사용한 방법은, "고정폭 빈칸 썼다 지우기"입니다.

고정폭 빈칸도 일종의 컨트롤이라서, 제법 글자수를 많이 잡아먹거든요.

그런데 재미있는 건,

조판부호 보임 상태에서는 고정폭 빈칸이 14자를 잡아먹고,

조판부호가 숨겨진 상태에서는 고정폭 빈칸이 한 글자 밖에 잡아먹지 않는다는 사실입니다.

이게 무슨 뜻인지 보여드리겠습니다.

아래와 같은 빈 문서 상태에서는 초기값이 "1단 1줄 1칸 0글자"입니다.

 

이 상태에서 고정폭 빈칸을 추가해보면(Alt-Space)

짜잔~ 고정폭 빈칸은 14칸을 차지한다는 사실을 발견했습니다.

그런데 조판보기가 꺼져 있으면?

차이를 확인하셨나요?

조판부호 보기가 꺼져 있는 상태면 고정폭 빈칸을 생성해도 한 칸도 차지하지 않는 걸 알 수 있습니다.

정확히 표현하면 "반 칸"을 차지하기 때문에 고정폭 빈 칸 두 개를 넣어야 비로소 한 칸을 차지하게 됩니다.

이 점을 잘 활용하면?

그래서 현재 칸수를 저장해 두고, 고정폭 빈칸을 하나 추가한 후의 칸수를 저장한 다음

14칸 차이가 나면, "조판부호 보기가 켜져 있다."

칸 차이가 나지 않으면 "조판부호 보기가 꺼져 있다."

라는 뜻이 되겠습니다. 물론 고정폭빈칸은 다시 지워줘야겠죠.

 

위 과정을 아래처럼 함수로 만들어보았습니다.

현재 칸 수를 파악하는 방법은 hwp.KeyIndicator()가 리턴하는 튜플 중 6번 인덱스의 값입니다.
def is_ctrlmark_visible():
    """
    현재 조판부호 보기 상태이면 True를, 그렇지 않으면 False를 리턴
    """
    before = hwp.KeyIndicator()[6]
    hwp.HAction.Run("InsertFixedWidthSpace")
    after = hwp.KeyIndicator()[6]
    # hwp.HAction.Run("ViewOptionCtrlMark")
    hwp.HAction.Run("DeleteBack")
    if after - before == 14:
        return True
    return False


def ctrlmark_on():
    """
    조판부호 보이기 상태로 변경
    """
    before = hwp.KeyIndicator()[6]
    hwp.HAction.Run("InsertFixedWidthSpace")
    after = hwp.KeyIndicator()[6]
    # hwp.HAction.Run("ViewOptionCtrlMark")
    hwp.HAction.Run("DeleteBack")
    if not after - before == 14:
        hwp.HAction.Run("ViewOptionCtrlMark")
    else:
        pass


def ctrlmark_off():
    """
    조판부호 숨기기 상태로 변경
    """
    before = hwp.KeyIndicator()[6]
    hwp.HAction.Run("InsertFixedWidthSpace")
    after = hwp.KeyIndicator()[6]
    # hwp.HAction.Run("ViewOptionCtrlMark")
    hwp.HAction.Run("DeleteBack")
    if after - before == 14:
        hwp.HAction.Run("ViewOptionCtrlMark")
    else:
        pass

 

한 번 실행해보겠습니다.

의도한 대로 잘 실행되네요.

이번 포스팅은 여기서 마치겠습니다.

 

반응형

댓글0