중괄호, 대괄호 및 기본값 (Braces, brackets and default)
대괄호 (Square brackets)
대괄호는 그 안의 모든 것을 *콘텐츠(content)*로 변환한다는 것을 기억하실 것입니다.
#let v = [일부 텍스트, _마크업_ 및 다른 #strong[함수들]]
#v
함수 본문에도 동일한 방식을 사용할 수 있습니다:
#let f(name) = [안녕, #name]
#f[세상] // 콘텐츠를 전달하는 데 사용할 수 있다는 점도 잊지 마세요!
중요: 콘텐츠 는 무엇이든 포함할 수 있기 때문에 콘텐츠 를 일반 텍스트 로 변환하는 것은 매우 어렵습니다! 따라서 변수에 콘텐츠를 전달하고 저장할 때 주의하세요.
중괄호 (Braces)
하지만 함수 내부에서 코드를 사용하고 싶은 경우가 많습니다.
그럴 때 {}를 사용합니다:
#let f(name) = {
// 여기는 코드 모드입니다.
// 출력의 첫 번째 부분
"안녕, "
// 이름이 비어 있는지 확인하고, 비어 있다면
// 자리 표시자를 삽입합니다.
if name == "" {
"무명씨"
} else {
name
}
// 문장 마무리
"!"
}
#f("")
#f("철수")
#f("세상")
기본값 (Default values)
방금 우리가 한 일은 "기본값"을 만들어낸 것이었습니다.
기본값은 스타일링에서 매우 흔하기 때문에 이를 위한 특별한 구문이 있습니다:
#let f(name: "무명씨") = [안녕, #name!]
#f()
#f(name: "철수")
#f(name: "세상")
이제 인수가 _명명된 인수(named argument)_가 된 것을 눈치채셨을 것입니다. Typst에서 명명된 인수는 기본값을 가진 인수를 의미합니다.
대괄호와 중괄호를 사용하는 시기
지금까지 본 것처럼 두 가지 방식을 모두 사용할 수 있습니다.
#let f(name) = [
안녕, #name
]
#f("철수")
그리고
#let f(name) = {
[안녕,]
name
}
#f("철수")
그렇다면 언제 무엇을 사용해야 할까요?
답은 간단합니다: 코드가 더 깔끔해 보이는 방식을 선택하면 됩니다.
따라서 다음과 같이 하지 마세요:
// 이렇게 하지 마세요
// 제발요
#let f(inner) = [
#set align(center)
#set box(stroke: red)
#show heading: it => [
#set text(size: 2em)
#it
]
#box[#inner]
]
코드 모드를 사용할 때 얼마나 단순화될 수 있는지 보이시나요?
범위 (Scopes)
이것은 꼭 기억해야 할 매우 중요한 사항입니다.
변수는 정의된 범위 밖에서 사용할 수 없습니다(파일 루트에서 정의되어 가져오기(import)를 할 수 있는 경우는 제외). Set 및 show 규칙은 해당 범위 내의 항목에만 영향을 미칩니다.
#{
let a = 3;
}
// 여기서 "a"를 사용할 수 없습니다.
#[
#show "참": "거짓"
이것은 참입니다.
]
이것은 참입니다.
반환 (Return)
중요: 기본적으로 중괄호는 중괄호 안으로 "반환되는" 모든 것을 반환합니다. 예를 들어,
#let change_world() = {
// 세상의 모든 것을 바꾸는 어떤 코드
str(4e7)
// 세상을 바꾸는 또 다른 코드
}
#let g() = {
"하하하, 이제 세상을 바꾸겠다! "
change_world()
" 이것이 나의 길고 사악한 독백이다..."
}
#g()
모든 것이 반환되는 것을 피하려면 원하는 것만 명시적으로 반환하세요. 그렇지 않으면 모든 것이 하나의 객체로 결합됩니다:
#let f() = {
"어떤 긴 텍스트"
// 엄청난 숫자들
"2e7"
return none
}
// 아무것도 반환하지 않음
#f()