함수

함수

이제 좀 더 복잡한 내용으로 넘어가 보겠습니다.

Typst 마법의 주요 부분은 스크립팅입니다.
스크립팅 모드로 들어가려면 `#`을 입력하고 그 뒤에 *함수 이름*입력하세요. _지루한 것_부터 시작해 보겠습니다:

#lorem(50)

_이 *함수* 는 방금 50개의 "Lorem Ipsum" 단어를 생성했습니다!_
Rendered image

더 많은 함수

#underline[함수는 무엇이든 할 수 있습니다!]

#text(orange)[]#text(size: 0.8em)[모든] #sub[]을요!

#figure(
  caption: [
    이것은 Typst로 작성된 초기 논문 중 하나의 스크린샷입니다. \
    _이 모든 것들도 #text(blue)[사용자 정의 함수]로 작성되었습니다._
  ],
  image("../boxes.png", width: 80%)
)

사실, 여러분은 마크업을 #strong[잊어버리고]
모든 곳에 함수만 #emph[사용해서 작성]할 수도 있습니다!

#list[
  그 모든 마크업은 사실 함수 위에 씌워진 #emph[구문 설탕(syntax sugar)]일 뿐입니다!
]
Rendered image

함수를 호출하는 방법

먼저 `#`으로 시작합니다. 그런 다음 이름을 씁니다.
마지막으로 괄호를 쓰고 그 안에 무언가를 넣을 수 있습니다.

#link("https://typst.app/docs/reference/")[공식 참조 문서]에서
수많은 내장 함수를 찾아볼 수 있습니다.

#quote(block: true, attribution: "Typst 예시 북")[
  맞습니다, 링크, 인용 및 기타 수많은
  문서 요소들이 함수로 생성됩니다.
]
Rendered image

함수 인수 (Arguments)

함수 인수에는 _두 가지 유형_이 있습니다:

+ *위치 인수(Positional).* `lorem(50)`의 `50`과 같습니다.
  그냥 괄호 안에 쓰면 됩니다. 여러 개인 경우 쉼표를 사용하세요.
+ *명명된 인수(Named).* `#quote(attribution: "누군가")`에서와 같습니다.
  이름과 콜론 뒤에 값을 씁니다.

명명된 인수인 경우 일종의 _기본값_ 을 가집니다.
그것이 무엇인지 확인하려면
#link("https://typst.app/docs/reference/")[공식 Typst 참조 문서]를 확인하세요.
Rendered image

콘텐츠 (Content)

이제 우리만의 함수를 직접 작성해 보아야 할 것 같습니다.

Typst 언어에서 가장 "보편적인" 타입은 *콘텐츠(content)*입니다.
문서에 작성하는 모든 것이 콘텐츠가 됩니다.

#[
  하지만 *대괄호* 를 사용해 _스크립팅 모드_ 에서
  명시적으로 콘텐츠를 생성할 수도 있습니다.

  대괄호 안에서는 어떤 마크업 함수나
  원하는 모든 것을 사용할 수 있습니다.
]
Rendered image

마크업 및 코드 모드

`#`을 사용하면 코드 모드로 "전환"됩니다.
`[]`를 사용하면 다시 _마크업_(또는 콘텐츠) 모드로 돌아갑니다:

// +-- 마크업(기본 모드)에서 해당 함수를 위한 스크립팅으로 전환
// |                 +-- 스크립팅 모드: `text` 호출, 마지막 인수는 마크업
// |     첫 번째 인수  |
// v     vvvvvvvvv   vvvv
   #rect(width: 5cm, text(red)[안녕 *세상아*])
//  ^^^^                       ^^^^^^^^^^^^^ `text`를 위한 마크업 인수일 뿐입니다.
//  |
//  +-- 스크립팅 모드에서 너비(width)와 다른 콘텐츠라는 두 인수로 `rect`를 호출합니다.
Rendered image

함수에 콘텐츠 전달하기

그렇다면 함수 뒤의 이 대괄호들은 무엇일까요?

만약 *함수 바로 뒤에 콘텐츠를 작성하면,
그 콘텐츠는 해당 함수의 위치 인수로 전달됩니다*.

#quote(block: true)[
  이를 통해 저는 #underline[함수]에 전달하는 것들에
  #text(red)[_말 그대로 무엇이든_] 작성할 수 있게 됩니다!
]
Rendered image

콘텐츠 전달하기, 파트 II

명확하게 하기 위해 다음과 같이 작성하면:

```typ
- #text(red)[빨간색 텍스트]
- #text([빨간색 텍스트], red)
- #text("빨간색 텍스트", red)
//      ^            ^
// 여기서 따옴표는 콘텐츠가 아니라 일반 문자열을 의미합니다!
// 이것은 그냥 텍스트입니다.
```

이 모든 것은 #text([빨간색 텍스트], red)와 같은 결과를 보여줍니다.
Rendered image