line : 글 상자의 끝까지 와서, 다음 줄로 내려갔거나, Shift + Enter를 친 상태
paragraph : 문단으로 그냥 Enter 친 상태
파워포인트는 워드프로그램처럼 공간이 정형화되어있지 않아서, 이에 대한 다양한 방법이 있을 수 있다. 글상자를 마치 문단처럼 배치를 할 수도 있고, 글상자 안에서 줄간격을 설정해줄 수 있다.
개인적으로는 Enter를 두번 친 다음 빈공간의 폰트크기를 조절해서 사용하는 방법을 선호한다. 그 이유는 폰트크기를 늘렸다 줄였다 하면서, 직관적으로 줄간격이 적당한지 바로 확인이 가능하기 때문이다.
위에 적었 듯 파워포인트에는 문단 또는 줄간격을 맞추는 기능이 있는데, 이를 사용하는 것이 바람직한 방법이긴 할 것이다. 하지만, 창으로 뜨는 관계로 확인을 눌러 적용하기 전까지는 수치 변경에 대해서 즉각적인 확인이 불가능해서, 개인적으로는 별로 좋아하지는 않는 방법이지만, 일단은 알아두는 것이 좋을 것이다.
창의 생김새는 아래와 같으나, 맨 하단에 있는 줄간격 조정 기능인 Spacing 만 사용해보자. 두개의 영역으로 구분되어 있으며, Before/After 기능으로 엔터를 쳤을때 구분이 지어지는 문단(Paragraph)의 간격을 조정하고, (Shift + Enter 를 치거나 줄이 길어져 하단으로 내려갈 때는 적용되지 않는다.) Line Spacing 기능으로 모든 간격을 조정하는 줄간격 기능으로 나누어진다.
아래 그림은 아무것도 설정하지 않은 상태이다. 줄간격이 빽빽해 보이므로 조정이 필요한 상황이다. 폰트마다 기본으로 주어지는 줄간격이 다르므로, 본인이 자주쓰는 폰트에 대한 이해가 필요하다.
일단 전체 줄간격을 일괄로 맞추기 위해, paragraph든 line이든 모든 행에 적용되는 Line spacing 기능을 통해 전체 간격을 정해준다. Exactly 옵션을 주고 18pt 값을 넣은 결과는 아래와 같다. Exactly 옵션은 절대값으로 간격을 준다는 뜻이므로, 폰트 사이즈가 변하면 매번 설정값을 바꿔줘야 한다.
이제 Enter로 구분된 paragraph만 별도의 줄간격 주기 위해 After값을 12pt로 주었다. 알겠지만, before값을 같이 주면 위아래 텍스트가 있는 경우, 합산이 된 만큼 떨어진다. After 값을 적용한 결과는 아래와 같다. 한결 보기 편해졌다.
파워포인트에서는 글을 저렇게 적을 일이 많지는 않겠지만... 실시간으로 보면서 수정할 수 있는 기능이 있었으면 좋을 것 같다는 생각이 들었다.
눈으로 확인하면서 줄간격 맞추기
대충 떠오르는데로 만들어본 사용자 폼은 다음과 같다.
- 줄간격이 설정되어있지 않은 상태에서, 글상자를 선택하고 코드를 호출하면 위의 예시에서 사용했던 값이 자동 설정된다. (Spacing - 12pt, Line Spacing - Exactly 18pt) - spin 버튼으로 Spacing 값고, Line Spacing 값을 1단위로 가감할 수 있다. - userform 창을 닫으면 그대로 적용 - 맨 아래 Reset & Close 버튼을 누르면, 줄간격이 설정되지 않은 상태로 복원
사용된 코드는 아래와 같다.
Public sp_shp AsShape
Public sp_after_textbox AsTextBox
Public sp_line_textbox AsTextBox
Public sp_para AsParagraphFormat2
Public sp_val_after AsInteger
Public sp_val_line AsInteger
SubUserForm_Initialize()
Call sp_initTextBox
Set sp_after_textbox= TextBox1
Set sp_line_textbox= TextBox2
Set sp_para= sp_shp.TextFrame2.TextRange.ParagraphFormat
With sp_para
.SpaceAfter=12
.LineRuleWithin= False
.SpaceWithin=18
EndWith
sp_val_after= sp_para.SpaceAfter
sp_val_line= sp_para.SpaceWithin
sp_after_textbox= sp_val_after
sp_line_textbox= sp_val_line
End Sub
Subsp_initTextBox()
If ActiveWindow.Selection.Type= ppSelectionShapesThen
Set sp_shp= ActiveWindow.Selection.ShapeRange(1)
IfNot (sp_shp.HasTextFrame) Then
MsgBox"There is no TextFrame"
End If
End If
End Sub
'Spacing spin button
Subafter_spin_SpinUp()
sp_val_after= sp_val_after+1
sp_para.SpaceAfter= sp_val_after
sp_after_textbox.Text= sp_val_after
End Sub
Subafter_spin_SpinDown()
Ifsp_val_after>1Then
sp_val_after= sp_val_after-1
sp_para.SpaceAfter= sp_val_after
Else
MsgBox"Value must be above 1"
End If
sp_after_textbox.Text= sp_val_after
End Sub
'Line Spacing spin button
Subline_spin_SpinUp()
sp_val_line= sp_val_line+1
sp_para.SpaceWithin= sp_val_line
sp_line_textbox.Text= sp_val_line
End Sub
Subline_spin_SpinDown()
Ifsp_val_line>1Then
sp_val_line= sp_val_line-1
sp_para.SpaceWithin= sp_val_line
Else
MsgBox"Value must be above 1"
End If
sp_line_textbox.Text= sp_val_line
End Sub
SubCommandButton1_Click()
With sp_para
.SpaceAfter=0
.LineRuleWithin= True
.SpaceWithin=1
EndWith
Unload Me
End Sub
여러가지 기능을 넣어두려다가 일단 필요한 부분만 먼저 작성을 했다.
위의 코드를 이해할 필요는 없지만, 좀 재밌는 부분이 있다. 아래는 좀 디테일한 내용을 작성해보았다. 필요한 사람만 보길 바란다.
좀 더 이해를 하고 나서 개선
각 항목별로 속성값이 두 개씩 있는데, Rule 적용 여부 Boolean 값과 이에대한 값을 가지는 속성이 있다.
희한한건 Before와 After는 LineRule의 용도를 모르겠다. 그래서 그냥 배제를 한다. 속성값을 False로 두자. Within 값을 False로 두는 경우, SpaceWithin값은 pt값이 들어가고, True로 둘 경우 배수가 된다.
Case
After
Within
LineRuleAfter
SpaceAfter
LineRuleWithin
SpaceWithin
After 5, Within 12
False
5
False(0)
12
After 5, Within single
False
5
True(-1)
1
After 5, Within double
False
5
True(-1)
2
After 5, Within multiple
False
5
True(-1)
3
이를 활용하여 좀더 진보한 userform을 만들 수 있다. 텍스트 박스를 선택하여 refresh하고 유형을 변경할 수 있도록 해보았다.
급하게 생각한 코드는 아래와 같다. 필요한 부분이 있다면 잘라서 쓰면 될 것이다.
Public sp_shp AsShape
Public sp_para AsParagraphFormat2
SubUserForm_Initialize()
On Error GoTo dd:
Call sp_selbox
Call sp_boxtext
TextBox1.Text= sp_para.SpaceAfter
TextBox2.Text= sp_para.SpaceWithin
dd:
End Sub
Subsp_selbox()
If ActiveWindow.Selection.Type= ppSelectionShapesThen
Set sp_shp= ActiveWindow.Selection.ShapeRange(1)
Set sp_para= sp_shp.TextFrame2.TextRange.ParagraphFormat
End If
End Sub
Private Sub CommandButton3_Click()
sp_para.LineRuleWithin= Not sp_para.LineRuleWithin