스타일링을 위한 컨텍스트 (Context for styling)

이 섹션은 완전하지 않을 수 있으며 최신 Typst 버전에 맞춰 충분히 업데이트되지 않았을 수 있습니다. 모든 기여를 환영합니다!

참조 문서의 컨텍스트(Context)

(아직 상태(state) 섹션을 읽지 않았다면 먼저 읽어보세요. 컨텍스트에 대한 논의는 거기서부터 시작됩니다.)

상태 장에서 이미 보았듯이, context는 외부 상태에 크게 의존할 수 있는 콘텐츠의 "레이아웃 지침"을 저장하는 객체의 일종입니다. 이 지침은 나중에 렌더링됩니다.

여기서 중요한 점은 제가 언급한 "외부 상태"에 상태(및 개수를 세기 위한 특수 상태인 카운터)뿐만 아니라 스타일링 도 포함된다는 것입니다.

무슨 뜻일까요?

직접 확인해 보세요:

현재 스타일 가져오기

현재 글꼴: #context text.font
Rendered image

아주 쉽게 현재 글꼴을 가져왔습니다. 이는 기본적으로 **모든 설정 가능한 속성(settable property)**에 대해 작동합니다! 정말 멋지지 않나요?

컨텍스트의 특징을 더 잘 보여주는 다른 예제를 보겠습니다. 항상 텍스트 색상과 동일한 색상을 가지는 박스를 만들어 보겠습니다:

#let colorful-rect = context box(stroke: text.fill, inset: 0.3em)[#repr(text.fill)]

동일한 색상의 박스 안에 있는 현재 색상: #colorful-rect.

#set text(red)

동일한 색상의 박스 안에 있는 현재 색상: #colorful-rect.
Rendered image

컨텍스트 외부로 값을 가져오는 방법

놀라운 사실은, _가져올 수 없다_는 것입니다!

왜일까요? 이유는 간단합니다. Typst에게 context 블록은 문서 내부에 배치되어 렌더링되는 동안에만 열 수 있는 블랙박스이기 때문입니다.

따라서 무언가를 얻고 싶다면 반드시 _context 내부_에서 처리해야 합니다.

함수 작성하기

중요한 사실: 함수는 다른 콘텐츠와 마찬가지로 별도의 선언 없이도 _컨텍스트에 의존_할 수 있습니다. 그리고 일반적으로 함수 내부에 context를 넣는 것보다 사용자가 직접 함수를 컨텍스트로 감싸도록 하는 것이 더 좋습니다.

스타일(또는 상태)에 의존하는 목록을 만들고 싶다고 가정해 봅시다. 컨텍스트가 필요하므로 다음과 같이 컨텍스트로 감쌀 수 있습니다:

(나쁜 예)

#let page-dimensions = context (page.width, page.height)
#page-dimensions, 이 객체의 표현(representation)은 다음과 같습니다: #repr(page-dimensions)
Rendered image

이 객체는 거의 쓸모가 없습니다. 블랙박스이므로 문서에 넣는 것 외에는 할 수 있는 것이 없기 때문입니다.

하지만 대신 다음과 같이 할 수 있습니다:

(좋은 예!)

// 컨텍스트 의존적 함수가 되려면 단순한 고정 콘텐츠가 아니라 함수여야 합니다.
#let page-dimensions() = (page.width, page.height)

#context page-dimensions()

#context [
    #let (x, y) = page-dimensions()
    너비의 절반은 #(x/2) 이고, 높이는 #y 입니다.
]
Rendered image

이렇게 컨텍스트 의존적인 함수를 사용하면 사용자가 원하는 어디든 context를 배치할 수 있습니다.

컨텍스트 내부의 규칙

이미 논의했듯이, context는 문서의 외부 상태를 캡처하며 내부에서 일어나는 일은 보지 못합니다. 따라서 다음과 같이 하면

#context [
    텍스트 색상: #text.fill

    #set text(blue)

    텍스트 색상: #text.fill
]
Rendered image

...맞습니다. 내부의 규칙은 컨텍스트 내부의 스타일에 영향을 주지 않습니다.