iBetter Books
수정

mo.md _ 마크다운·수식·동적 출력

marimo에서 텍스트와 수식을 출력하는 핵심 도구는 mo.md()입니다. 단순한 마크다운 렌더러가 아닙니다. Python f-string과 결합하면 위젯 값이나 계산 결과를 포함한 동적 문서를 만들 수 있습니다.

mo.md() 기본 사용

문자열을 mo.md()에 넘기면 마크다운으로 렌더링된 Html 객체가 반환됩니다. 셀 마지막 표현식으로 놓으면 에디터에 렌더링 결과가 표시됩니다.

import marimo as momo.md("""## 실험 결과 요약이 노트북은 분류 모델의 성능을 평가합니다.- 데이터셋: Iris- 알고리즘: 랜덤 포레스트""")

일반 마크다운 문법이 모두 지원됩니다. 굵게, 기울임, 목록, 표, 코드 블록 등을 그대로 쓸 수 있습니다.

f-string으로 동적 값 삽입

파이썬 f-string과 결합하면 계산 결과나 위젯 값을 마크다운 안에 바로 삽입할 수 있습니다.

import marimo as moaccuracy = 0.923n_samples = 150mo.md(f"""## 결과- 정확도: **{accuracy:.1%}**- 샘플 수: {n_samples}- 판정: {"합격" if accuracy >= 0.9 else "재검토"}""")

{accuracy:.1%}처럼 Python의 포맷 스펙을 그대로 쓸 수 있습니다. 변수 값이 바뀌면 이 셀도 재실행되어 출력이 갱신됩니다.

위젯 값을 마크다운 안에 반영하기

위젯 값을 f-string으로 마크다운에 삽입하면, 위젯을 조작할 때마다 텍스트가 실시간으로 바뀝니다.

import marimo as mothreshold = mo.ui.slider(0.0, 1.0, value=0.5, step=0.05, label="임계값")threshold
import marimo as momo.md(f"""### 현재 설정임계값이 **{threshold.value:.2f}**로 설정되어 있습니다.이 값보다 높은 예측 확률만 양성으로 분류합니다.{"임계값이 낮습니다. 재현율이 높아집니다." if threshold.value < 0.4 else ""}{"임계값이 높습니다. 정밀도가 높아집니다." if threshold.value > 0.7 else ""}""")

슬라이더를 움직이면 아래 셀의 텍스트가 즉시 바뀝니다. 동적 설명문, 요약 카드, 경고 메시지를 만들 때 이 패턴이 유용합니다.

수식 표현

mo.md()는 LaTeX 수식을 지원합니다. 인라인 수식은 $...$, 블록 수식은 $$...$$로 감쌉니다.

백슬래시를 포함한 LaTeX를 안전하게 쓰려면 raw string(r"""...""")을 사용합니다. f-string과 raw string을 동시에 쓰려면 rf"""..."""를 사용합니다.

import marimo as momo.md(r"""## 선형 회귀 모형$$\hat{y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \varepsilon$$여기서 $\varepsilon \sim \mathcal{N}(0, \sigma^2)$ 입니다.""")

변수를 함께 쓸 때는 rf"""..."""를 사용합니다.

import marimo as mobeta0 = 2.5beta1 = 0.8mo.md(rf"""## 추정된 모형$$\hat{{y}} = {beta0} + {beta1} x$$기울기가 양수이므로 $x$가 증가할수록 $\hat{{y}}$도 증가합니다.""")

f-string에서 중괄호 자체를 출력하려면 {{}}로 이스케이프합니다. LaTeX 명령의 중괄호를 {{...}}로 감싸야 합니다.

mo.md()가 반환하는 것

mo.md()Html 객체를 반환합니다. 이 객체를 변수에 저장해 여러 곳에서 재사용할 수 있습니다.

import marimo as moheader = mo.md("## 분석 결과")body = mo.md("정확도가 기준을 초과했습니다.")header
body

또는 mo.vstack이나 레이아웃 API와 조합할 수도 있습니다. 레이아웃 API는 PART 07에서 다룹니다.

조건에 따른 출력 바꾸기

위젯 값에 따라 완전히 다른 텍스트를 출력하고 싶을 때도 f-string으로 해결할 수 있습니다.

import marimo as momode = mo.ui.radio(["기초", "고급"], value="기초", label="학습 모드")mode
import marimo as moif mode.value == "기초":    explanation = mo.md("""### 기초 설명슬라이더를 움직이면 오른쪽 값이 바뀝니다.숫자가 커질수록 계산에 더 많은 시간이 걸립니다.""")else:    explanation = mo.md(r"""### 고급 설명슬라이더는 탐색 공간 $n$을 설정합니다.시간 복잡도는 $O(n \log n)$이며, $n$이 클수록 메모리 압력이 높아집니다.""")explanation

mode.value를 참조하므로, 라디오 버튼을 바꾸면 이 셀이 재실행되어 설명문이 통째로 바뀝니다.

mo.output을 이용한 점진적 출력

반복문이나 오래 걸리는 작업에서 진행 상황을 실시간으로 출력하고 싶을 때는 mo.output을 사용합니다.

import marimo as mofor i in range(5):    mo.output.append(mo.md(f"단계 **{i + 1}** 완료"))

mo.output.append()는 셀 출력 영역에 내용을 누적해서 추가합니다. mo.output.replace()는 이전 출력을 지우고 새 내용으로 교체합니다. mo.output.clear()는 출력을 모두 지웁니다.

정리

  • mo.md()는 마크다운 문자열을 렌더링하고 Html 객체를 반환합니다.
  • f-string과 결합하면 변수 값이나 위젯 값을 포함한 동적 텍스트를 만들 수 있습니다.
  • 위젯 값이 바뀌면 mo.md() f-string을 사용하는 셀도 자동으로 재실행됩니다.
  • LaTeX 수식은 r"""...""" 또는 rf"""...""" raw string 안에서 $...$ 또는 $$...$$로 작성합니다.
  • mo.output.append()로 반복문 내부에서 출력을 점진적으로 누적할 수 있습니다.