본문 바로가기

인디자인 InDesign/스크립트 작성 scripting

문자 스타일 [없음]에 단축키 지정하기

인디자인 ‘스타일’ 패널을 잘 활용하는 방법 중 하나는 단축키 지정이다. 단축키를 기억만 잘 해둔다면 지정할 서식이 많을 때 작업 능률이 비약적으로 올라간다. 그런데 항상 의문인 게 있다. 단락 스타일은 ‘[기본 단락]’ 단축키 지정이 가능한데. 문자 스타일은 ‘[없음]’ 적용에 대해 단축키를 지정할 수 없다는 점이다. 기본적인 단축키 설정([편집] → [단축키])으로도 지정하지 못한다. 이는 개체 스타일의 ‘[없음]’에 대해서도 마찬가지다. 

물론 한가지 우회로가 있긴 하다. 아무런 서식도 지정하지 않은 ‘깡통’ 스타일을 만들고, ‘없음’이라고 이름을 단 후 거기에 단축키를 지정하는 것이다. 편의성 면에서는 이 선택도 나쁘지 않다. 그럼에도 찝찝함은 남아있다. 원천적으로 [없음]을 적용할 수 있는 방법 같은 건 없을까 생각이 들었다.

어도비 커뮤니티를 찾아보니, 이미 십수년 전부터 꽤나 많은 얘기들이 나오고 있었다. 그중에서 몇몇 코드들은 조금만 고치면 바로 적용이 가능해보였다. 괜찮은 코드 중 하나는 카시안 세르베츠키(Kasyan Servetsky)라는 우크라이나 스크립터가 작성한 것이었다(이분도 따로 홈페이지가 있다). 이 코드를 그대로 가져다 쓰면 오류가 발생했지만, 그 밑에 라우벤더(Laubender)라는 닉네임의 유저가 함수 부분을 조금 고친 걸 적용하니, [없음] 문자 스타일을 적용할 수 있었다. 하지만 실행취소가 한 번에 되지 않는 게 개인적으로 별로여서 doScript를 이용하는 식으로 코드를 조금 바꿔봤다. 

 

 

문자 스타일 [없음] 설정 스크립트 예시 영상

 

문자스타일_없음.jsx
0.00MB

 

코드 해설

더보기

예시 영상처럼 깔끔하게 실행취소가 되는 ‘문자스타일_없음’ 스크립트가 완성됐다. 이제 코드를 한번 살펴보겠다.

if (app.documents.length == 0) ErrorExit("문서를 열고 다시 시도하십시오.");


우선 문서가 열려 있지 않을 때의 경고 알림으로 시작한다. 이 스크립트로 ErrorExist를 처음으로 알게 됐다. 페이지 번호 스크립트 글에서, 이걸 어떻게 풀어야 할지 몰라서 그냥 스크립트 자체 오류를 받는 걸로 넘어갔는데, ErrorExist를 활용하면 그럴 필요가 없는 것이다! 다음에 야무지게 활용해야겠다.... 

var gScriptName = "문자스타일 없음";
var gScriptVersion = "1.0";
var doc = app.activeDocument;
var sel = doc.selection[0];
if (doc.selection.length != 1) ErrorExit("텍스트 프레임이나 텍스트가 선택되거나, 커서가 텍스트에 놓여 있어야 합니다.");

if (sel.constructor.name == "TextFrame") { // 텍스트 프레임이 선택되었을 때
    var ApplyNone = sel.texts[0];
}
else if (sel.constructor.name == "Character" || // 텍스트가 선택되었을 때
     sel.constructor.name == "Word" ||
     sel.constructor.name == "TextStyleRange" ||
     sel.constructor.name == "Line" ||
     sel.constructor.name == "Paragraph" ||
     sel.constructor.name == "TextColumn" ||
     sel.constructor.name == "Text")
     {
        var ApplyNone = sel;
     }
else {
     ErrorExit("텍스트 프레임 또는 텍스트가 선택되어야 합니다."); 
}


스크립트 이름(var gScriptName = "문자스타일 없음";)과 버전(var gScriptVersion = "1.0";)은 큰 의미가 없지만, 원작자가 남긴 것을 그대로 이어받았다. 그리고 이어지는 변수 선언으로 현재 문서(var doc = app.activeDocument;)와 현재 선택된 것(var sel = doc.selection[0];)에 대한 정의가 이어진다. 그리고 현재 문서에서 선택된 것이 전혀 없는 경우, 마찬가지로 ErrorExit 경고 알림이 뜬다(if (doc.selection.length != 1) ErrorExit("텍스트 프레임이나 텍스트가 선택되거나, 커서가 텍스트에 놓여 있어야 합니다.");).

그리고 현재 선택된 것의 생성자 이름이 '텍스트 프레임'인 경우(if (sel.constructor.name == "TextFrame") {), ApplyNone이라는 이름의 변수를 현재 선택된 것의 텍스트로 상정한다(var ApplyNone = sel.texts[0];). 그게 아니고 선택된 것의 생성자가 '문자', '단어' '텍스트 스타일 범위', '줄', '단락', '단', '텍스트'인 경우(else if (sel.constructor.name == "Character" || sel.constructor.name == "Word" || sel.constructor.name == "TextStyleRange" || sel.constructor.name == "Line" || sel.constructor.name == "Paragraph" || sel.constructor.name == "TextColumn" || sel.constructor.name == "Text")), ApplyNone 변수는 현재 선택된 것 자체로 선언된다(var ApplyNone = sel;). 그런 경우도 아니라면 세 번째 경고 알림이 뜨는 수순이다(ErrorExit("텍스트 프레임 또는 텍스트가 선택되어야 합니다.");).

app.doScript(function (){
    var myNewNoneStyleName = "없음";    
    var noneStyle = doc.characterStyles[0];
    var basedOnNone = app.activeDocument.characterStyles.add({name:myNewNoneStyleName, basedOn:noneStyle});    
    ApplyNone.applyCharacterStyle(basedOnNone);
    basedOnNone.remove(noneStyle);    
}, ScriptLanguage.JAVASCRIPT , [], UndoModes.ENTIRE_SCRIPT);


앞선 코드가 선택된 것을 분별하는 작업이었다면, 이제 본격적인 기능이 나온다. 원래는 ApplyNone을 따로 변수로 선언하지 않고 함수 안에 넣고 그 안에 입력되는 것을 따로 상정하는 식으로 구현하는 코드(function ApplyNone(inputText) {}와 같은 방식)였지만, doScript를 적용하기 위해 함수를 익명으로 선언하는 방향으로 전환했다. 그렇게 중심 기능을 담은 함수는 일단 [없음]과 같은 유형의 문자 스타일을 새로 만드는 변수 선언부터 시작한다. 일단 그 이름을 '없음'으로 하고(var myNewNoneStyleName = "없음";), 문서의 첫 번째 문자 스타일은 항상 [없음]이므로 그것을 변수로 선언한다(var noneStyle = doc.characterStyles[0];). 그리고 [없음]을 기반으로 하는 이름의 '없음' 문자 스타일을 실질적으로 추가해주는 변수를 선언한(var basedOnNone = app.activeDocument.characterStyles.add({name:myNewNoneStyleName, basedOn:noneStyle});). 이제 [없음]을 적용할 대상(ApplyNone)에 '없음' 문자 스타일을 적용해준다(ApplyNone.applyCharacterStyle(basedOnNone);). 그 후에 '없음' 문자 스타일을 지우는데, 그때 바꿔줄 스타일을 noneStyle, 즉 [없음]으로 해준다(basedOnNone.remove(noneStyle);).

그러니까 이 스크립트는 앞서 우회로라고 말했던 깡통 문자 스타일을 만들고 지워서 [없음]을 적용해주는 과정을 한번에 해주는 것이다.

function ErrorExit(error, icon) {
     alert(error, gScriptName + " - " + gScriptVersion, icon);
     exit();
}

 

이 부분은 ErrorExit로와 경고 알림에 대한 규정만 있는데, 아직 확실하게는 왜 있는 건지 파악을 못했다. 서두에 규정한 스크립트 이름과 버전이 여기서 경고 알림으로 명시되어 있는데, 일단은 스크립트 최종적인 실행 오류에 대한 것이 아닐까 생각하고 있다.