@sam 및 Discourse에서 수식을 입력하는 데 관심이 있는 모든 분들에게. discourse-math 플러그인을 업데이트하여 훨씬 느리고 매우 구식인 V2 대신 MathJax V3를 사용하도록 변경했습니다. 예상대로, KaTeX와 비교했을 때 풍부한 기능을 유지하면서도 훨씬 더 빠르고 매끄러운 사용자 경험을 제공합니다.
discourse-math 플러그인을 수정하여 훨씬 더 많은 수학적 입력을 파싱할 수 있도록 했습니다.
@sam 2017년에 이 플러그인에 처음 기여했을 때, 매우 엄격한 파싱을 원하셨던 기억이 납니다. 파싱을 완화하고 확장한 주요 동기가 AI와의 호환성을 높이기 위해서였다는 점을 미리 말씀드립니다. 특히 AI 봇과 수학에 대해 대화할 때, AI가 LaTeX를 사용하여 응답하는 경우가 많으며, LaTeX 입력을 구분하는 방식도 다양합니다. 따라서 엄격한 파싱에 대한 의도는 이해하지만, 제가行った 변경 사항은 해당 사용 사례에서 상당히 필수적입니다.
물론 그 사용 사례를 중요하게 생각하지 않으실 수도 있으므로, V3 풀 리퀘스트와 별도로 별도의 브랜치에 변경 사항을 넣었습니다. 마음에 드시면 다른 풀 리퀘스트를 발행하는 데 기꺼이 응하겠습니다.
풀 리퀘스트에 대한 구체적인 변경 사항은 다음과 같습니다:
\(a^2+b^2=c^2\)와 같이 슬래시-괄호로 구분된 인라인 수학을 허용합니다.
$$a^2+b^2=c^2.$$와 같이 단일 줄 이중 달러로 구분된 디스플레이 수학을 허용합니다.
\[a^2+b^2=c^2.\]와 같이 단일 줄 슬래시-괄호로 구분된 디스플레이 수학을 허용합니다.
\[
a^2+b^2=c^2.
\]와 같이 다중 줄 슬래시-괄호로 구분된 디스플레이 수학을 허용합니다.
물론, 원래의 입력도 여전히 허용합니다:
달러로 구분된 인라인 수학: $a^2+b^2=c^2$.
다중 줄, 이중 달러로 구분된 디스플레이 수학:
$$
a^2+b^2=c^2.
$$
그러나 빌드 후 /assets/mathjax/woff-v2에 해당 폰트가 저장되지 않는 것 같습니다. 디렉토리에 대해 여러 가지 변형을 시도해 보았지만 작동하지 않았습니다. 이것은 제가 전문가가 아닌 어떤 종류의 라우팅 마법이라고 추정합니다. 그 경로 문제가 해결되면 정리 작업을 위해 상당한 진전을 이룰 수 있다고 확신합니다.
다만, 주의할 점은 제가 여러분의 최신 커밋에서 직접 작업하지는 않았다는 것입니다. 저는 Discourse main에서 직접 시작하여 거기서 변경 사항을 만들었습니다. 따라서 여러분의 작업에서 많은 것을 배웠지만, 전체적인 구조는 다릅니다.
주요 차이를 요약하자면 다음과 같습니다. 여러분은 (당연히) 로딩과 타이포그래피와 같은 작업과 관련된 타이밍을 조정하기 위해 Ember에서 상속된 Discourse 기능을 사용하는 반면, 저는 MathJax 기능을 사용합니다. 따라서 저의 load-mathjax와 mathjax 번들(svg용 하나, chtml용 하나)은 여러분의 것보다 훨씬 단순합니다. 로딩은 모두 discourse-math-mathjax의 window.MathJax 객체를 통해 조정됩니다.
앞서 설명했던 문제와 동일한 문제가 여전히 있습니다. 즉, 이 주석 처리된 로더가 작동하지 않는다는 것입니다. 대신 이 CDN 버전을 사용해야 합니다. 왜 그런지 정말로 모르겠습니다.
여러분의 코드도 동일한 문제에서 자유롭지 않다고 생각합니다. 그것이 AsciiMath가 작동하지 않는 것처럼 보이는 이유입니다.
첫째, 퍼널을 추가하면 해당 파일들이 올바른 위치에 배치된다는 점에 대해 완전히 맞습니다. 제 브랜치에 퍼널을 추가했는데, 이제 CDN 의존성 없이도 완벽하게 작동합니다.
불행히도 현재는 당신의 코드를 실행할 수 없습니다. 수식이 포함된 페이지로 이동할 때마다 수식이 타입셋(typeset)되지 않고, 콘솔에 다음 오류 메시지가 표시됩니다:
Uncaught (in promise) Error: State EXPLORER already exists
이전에 당신의 코드가 정상적으로 작동했던 것을 분명히 기억하고 있으므로, 제가 무언가를 잘못한 것 같습니다. 하지만 분명히 하기 위해, macOS에서 개발용 Discourse 설치에 설명된 기법을 사용하여 완전히 새로운 디렉터리를 처음부터 시작했습니다.
git clone https://github.com/discourse/discourse.git ./discourse
cd ./discourse
bundle install
pnpm install
bundle exec rake db:create
bundle exec rake db:migrate
RAILS_ENV=test bundle exec rake db:create db:migrate
# 한 터미널에서
bundle exec rails server
# 다른 터미널에서
bin/ember-cli
이 시점에서 저는 제 코드 버전에 대해 꽤 만족하고 있지만, 당신의 코드에서 무슨 일이 일어나고 있는지 여전히 궁금합니다. 다만, 휴가를 위해 이 작업에서 잠시 벗어나야 합니다. 며칠 후 다시 확인해 보겠습니다.
마지막으로 한 가지 더: 제가 아는 한,
await import("tex-mml-chtml.js") // 이후
await import("input/asciimath.js")
은 작동하지 않아야 합니다. 이것이 당신의 코드가 실제로 수행하는 일이라고 생각합니다.
여기서 경로를 정확히 표현하지는 않았지만, 제 지점은 연속적인 동적 import 호출이 올바른 MathJax 구조를 생성하는지 확신할 수 없다는 것입니다. MathJax 컴포넌트 로딩은 꽤 복잡하고, MathJax 객체와 관련된 상세한 로딩 프로세스가 있는 이유도 바로 그 때문이라고 생각합니다.
참고로, 이 GitHub 이슈에 설명된 대로 CSS를 조금만 추가하면 해결할 수 있는 알려진 MathJax 버그가 있습니다. 이 코드에도 해당 수정 사항을 포함했습니다.
로딩 옵션
현재 상태로는 AsciiMath를 켤 수 없고, 접근성(Accessibility)을 끌 수도 없습니다. 이는 load-mathjax.js에서 서브모듈이 순차적으로 로드되는 방식 때문에 그런 것 같습니다.
지난 메시지에서 말씀드린 것처럼, 원하는 구성 요소를 지정하는 window.MathJax 객체를 미리 정의하는 것이 훨씬 더 일반적입니다. 메인 스크립트가 로드될 때 MathJax 객체가 다시 정의됩니다. 저의 V3 버전에서 이 방식으로 작동하게 만들 수 있었던 이유입니다. 원하신다면 다음 주 초에 이 접근 방식을 여러분의 코드베이스에 통합해 볼 수 있을 것 같습니다.
옵션을 정리한 후에는 V4에서 사용할 수 있는 새로운 옵션 중 포함해야 할 것이 있는지 고려해 볼 가치가 있을 수도 있습니다.
리치 에디터 (Rich Editor)
이것은 정말 훌륭합니다 - 이렇게 보니 정말 기쁩니다!
모달 내부에서 반짝이는 AI 컨텍스트 메뉴를 사용할 수 있게 만들 수 있을까요? 학생들이(그리고 교수님들 ) 때때로 LaTeX 입력에 어려움을 겪기 때문에 이렇게 묻습니다. 작은 AI 교정 도구가 그 과정을 훨씬 부드럽게 만들어 줄 수 있습니다. 저는 제 강의용 Discourse에 이를 통합했으며, 다가오는 학기에 사용할 것을 기대하고 있습니다.
discourse-math 플러그인이 수식 라이브러리를 직접 벤더링(vendoring)하는 대신 별도의 MathJax/KaTeX 에셋 제이를 사용하는 방식이라는 점을 이해하고 있습니다. 이를 통해 플러그인의 경량화를 유지하면서도 수식 라이브러리를 독립적으로 업데이트할 수 있게 됩니다.
첫 번째 프로덕션 릴리스 전에 이를 검증하는 데 도움을 주고 싶습니다. 초기 계획은 별도的一次적인 인스턴스를 구동하고, 그곳에서 플러그인을 활성화한 후 수식이 많이 포함된 콘텐츠, 표준 파이프라인을 통한 에셋 로딩, CSP 동작, 성능 등을 테스트하는 것이었습니다.
이를 수행하기 전에, 현재 단계에서 권장되는 환경이 무엇인지 확인하고 싶었습니다. 프로덕션과 유사한 설정에서 초기 테스트를 수행하는 것이 적절한지, 아니면 첫 프로덕션 릴리스까지 개발 환경에서 수행하는 것이 더 나은지 의견을 듣고 싶습니다.
가장 유용한 방식으로 테스트를 수행하고, 발견하는 문제나 엣지 케이스를 업스트림에 보고하는 데 기꺼이 참여하겠습니다. 대학 수업으로 인해 고정된 테스트 일정은 약속할 수 없지만, 시간이 나면 최선을 다해 테스트를 진행할 것입니다. 6월 6일 이후에는 가용 시간이 훨씬 더 늘어날 것으로 예상됩니다.