인쇄 보기와 이메일에 렌더링된 Discourse-math 포함

문제
Discourse-math는 브라우저에서 아름답게 렌더링되지만, JavaScript가 실행될 수 없는 환경에서는 수식이 원본 LaTeX 소스로 표시됩니다. 주요 영향이 큰 두 가지 사례는 다음과 같습니다.

  • 인쇄 보기(/print 또는 브라우저의 PDF로 인쇄): 렌더링된 기호가 아닌 $...$ 형태로 수식이 표시됩니다.
  • 이메일(다이제스트, 알림, 구독): 수신자가 LaTeX 편집기에 복사하여 붙여넣지 않는 한, 수식이 원본 그대로 전달되어 읽을 수 없습니다.

이는 기술적 콘텐츠에 의존하는 커뮤니티에서 중요한 워크플로를 방해합니다.


중요성

  • STEM 교육자 및 연구자들은 종종 토픽을 인쇄하거나 이메일을 전달해야 합니다. 수식이 가독성이 없다면 해당 내보내기는 사용 불가능해집니다.
  • 인쇄/이메일 환경의 다른 문제들(스플로일러, 원박스, 이미지)은 이미 수정되었지만, 수식은 현저한 누락 상태입니다.
  • 비-JS 환경에서 렌더링된 수식을 지원하면 Discourse가 기술 커뮤니티를 위한 1급 플랫폼이 될 수 있습니다.

제안된 해결책

  • 경량 단계(인쇄):
    • /print 뷰에 렌더링된 수식 HTML이 포함되도록 보장합니다.
    • 인쇄 전에 MathJax 타이포세팅을 트리거합니다.
  • 중량 단계(이메일):
    • Sam이 제안한 대로 서버 측 MathJax 렌더링을 검토합니다.
    • 수신자가 이메일 클라이언트에서 바로 읽을 수 있는 방정식을 보기 위해 수식을 SVG 또는 미리 렌더링된 HTML로 변환합니다.
  • 선택적 사이트 설정:
    • “인쇄 보기/이메일에서 렌더링된 수식 사용” → 관리자가 원본 소스와 렌더링된 수식 중 선택할 수 있게 합니다.

관련 이슈 / 이전 작업

  • :white_check_mark: [details] 패널 내부의 수식 문제 수정 (PR #111, 2025년 6월).
  • :memo: 인쇄 뷰에는 이미 스포일러/원박스에 대한 수정 사항이 있음 → 렌더링된 요소 포함의 선례가 됨.
  • :e_mail: 이메일: Sam의 댓글(#214)에서 서버 측 렌더링을 장기적인 해결책으로 식별함.

요약 / TL;DR
현재 인쇄 보기와 이메일에서 수식은 원본 LaTeX으로 대체 표시됩니다. 렌더링된 수식 처리를 추가하면 PDF와 다이제스트가 브라우저에서 사용자가 보는 것과 일관되고, 전문적이며, 가독성 있게 될 것입니다.

iOS Safari에서 Discourse로 재현

Safari에서 데스크톱 사이트 요청을 활성화해도 /print를 열 때 Discourse는 여전히
?mobile_view=1을 추가하여 축소된 모바일 인쇄 뷰를 강제합니다.

우회 방법: 전체 데스크톱 인쇄 레이아웃을 위해 ?mobile_view=0으로 수동 변경합니다.

예시
/t/fw-the-email-subject/12345/print?mobile_view=0

3개의 좋아요

네, Sam의 요약을 정확히 짚었다고 생각합니다: 이메일/인쇄 보기에 렌더링된 수식을 표시하려면 서버 측 수식 렌더링(또는 최소한 서버 측 “프리-렌더링”)이 필요합니다. 이메일 클라이언트는 MathJax를 실행하지 않기 때문입니다.

현실적인 접근 방식은 다음과 같습니다:

  • 쿠킹(cooking) 중(또는 쿠킹 후 백그라운드 작업에서) 수식 스팬을 찾습니다(인라인 + 디스플레이).
  • Node 환경에서 MathJax를 사용하여 각 수식을 SVG(또는 MathML 폴백)로 렌더링합니다.
  • 이메일/인쇄에 사용되는 쿠킹된 HTML의 수식을 다음 중 하나로 교체합니다:
    • 인라인 <svg ...> (가장 높은 충실도, 외부 페치 없음), 또는
    • <img src="data:image/svg+xml;base64,..."> (일부 클라이언트와의 호환성이 더 좋지만 크기가 커질 수 있음).
  • 안정적인 키(예: sha256(latex + display_mode + macros + font_config))로 캐싱하여 고유한 수식당 한 번만 렌더링되도록 합니다.

까다로운 부분(하지만 범위를 조심스럽게 설정하면 관리 가능합니다):

  • DOM 시뮬레이션: MathJax의 “브라우저” 출력이 DOM을 원하므로, mathjax-full + jsdom(또는 순수 어댑터 경로 사용)이 필요할 것입니다.
  • 성능/타임아웃: 작업 큐에서 비동기로 수행하고, 렌더링이 실패하면 우아하게 저하 처리합니다(LaTeX를 그대로 두는 것).
  • 이메일 클라이언트 특이사항: 일부 클라이언트는 SVG를 제거하므로 폴백 계획이 중요합니다(예: 지원되는 경우 평문/LaTeX 또는 MathML).

누군가 빠른 스파이크(spike)를 원한다면, 제가 할 첫 번째 실험은 다음과 같습니다:

  1. mathjax-full을 사용하여 $begin:math:text$E\=mc\^2$end:math:text$를 SVG로 렌더링하는 작은 Node 스크립트,
  2. 그것이 어떤 가정을 하는지 확인(DOM vs 어댑터),
  3. 그런 다음 MiniRacer가 막다른 길인지, 그리고 이 문제를 "Node 사용 가능"으로 취급해야 하는지(또는 작은 서비스로) 결정합니다.

그 스파이크가 성공하면, 어디에 플러그인을 넣을지(이메일 파이프라인 vs 쿠킹 vs 인쇄 보기)와 무엇을 캐시/저장할지에 대해 논의할 수 있습니다.