Tex(이하 텍스)는 그동안 블로그 플랫폼에서 무시당해왔어요. 하지만 이젠 아니에요. 점점 많은 블로그 들이 텍스를 지원하기 시작했어요. Dev.to 도 2달전부터 Tex를 지원하기 시작했죠 (제가 워드프레스랑 미디엄에서 여기로 옮긴 이유에요). 저처럼 수학+프로그래밍 관련 글을 자주 쓰는 사람에겐 반가운 소식이에요. 하지만 여전히 텍스의 중요성에 비해선 아직 지원하는 정도가 약하긴 해요. 아직 해결해야할 문제점들이 많아요. 그중 가장 큰 문제는 바로 재수없게도 $
가 Markdown(이하 마크다운) 에서의 텍스의 delimiter(이하 구분자)로 쓰는게 관례가 됐다는 점이에요.
다행이도 Dev.to는 그 관례를 따르지 않고 독자적인 구분자를 썼죠 (어쩌면 Liquid베이스기때문에 다른걸 써야 했을 수도 있겠죠?). $
는 마크다운에서 텍스를 쓴다고 했을때 최악의 구분자에요. 여러분이 마크다운 renderer 개발자이든, 아니면 저처럼 관련 글을 쓰고 많은 글들을 관리하는 유저이든간에 마크다운 안에서 텍스를 정확히 매치할 수 있어야해요. $
는 그 캡쳐를 거의 불가능하게 만들죠. 제가 많은 종류의 렌더러를 써보고, 이슈도 날리고, 이슈도 수정하고, 결국엔 직접 하나 만들기까지 해서 잘 알아요. $
가 최악인 이유는 다음과 같아요:
텍스가 $
를 자체적으로 내부 텍스 구분자로 쓰기때문
다음을 텍스를 이용해서 쓴다고 해볼게요:
$
를 구분자로 쓴다고 할때 다음과같이 써야해요:
$\text{In quaternion $i^2$, $j^2$, $k^2$, $ijk$, and $-1$ are all equal.}$
보면 \text
매크로는 다섯개의 내부 텍스를 쓰고있죠. 모두 $
로 구분되고 있어요. 이걸 어떻게 매치할 수 있을까요? 정규표현식을 쓸수 있을까요? 한번 보죠. 일단 당연히 두 $
사이에 낀 아무거나 매치하면 안되겠죠. 고로 $(.+?)$
는 제외에요. greedy matching도불가능해요 왜냐면 한 문장에 다수의 텍스가 있을 수 있기 때문이죠. 결국엔 위 \text
처럼 내부 텍스를 쓸 수 있는 모든 매크로들을 따로따로 명시 해줘야 할거에요. 반면에 만약 $
가 아닌 다른 구분자를, 예를들어 현재 텍스에서 쓰지 않는 %
를 썼다면 단순히 %(.+?)%
를 쓸 수 있었겠죠.
$
는 프로그래밍 언어에서 많이 쓰이기 때문
마크다운에 다음과 같이 써져있다고 해보죠:
이 하스켈 코드는, `let r = g $ f (x) $ y `, 아무문제 없음
이 인라인 텍스 코드도, $ f (x) $ 아무 문제 없음
예상되는 결과물은 다음과 같죠:
이 하스켈 코드는, let r = g $ f (x) $ y
, 아무문제 없음
이 인라인 텍스 코드도,
아무 문제 없음
첫번째 $ f (x) $
는 하스켈 문법이기때문에 매치 돼선 안되겠죠? 어떻게 해야 두번째 $ f (x) $
만 매치할 수 있을까요? 단순히 마크다운 블록에 있는건 다 무시해버릴까요? 그건 그냥 게을러서 퀄리티와 타협하는 꼴이죠. 블록에서 텍스를 사용하고 싶어하는 사람이 있을 수도 있잖아요. 이시점에서 패턴 매칭은 거의 불가능 하다고 보고 마크다운 파싱 라이브러리를 써서 어떤 블록이 코드블록인지 알 수 있는 프로그램을 짜는걸 고려해야겠죠. 다시말하지만 만약 $
이아닌 좀더 유니크한, 예를들면 Dev.to에서 쓰는 {% katex %}{% endkatex %}
와 같은걸 썼다면 $(.+?)$
와 같은 방법으로 로 간단히 해결했을거에요.
$
를 쓰는 프로그래밍 언어는 하스켈 뿐만이 아니에요. 모든 jQuery 명령어가 $
로 시작하죠, php에서는 변수를 부를때 쓰죠, Shell에서는 파라메터 부를때 쓰죠, Ruby, Groovy, C# 등등 굉장히 많은 곳에서 쓰이고 있어요. 제가 마크다운 렌더러를 직접 만들어야만 했던 이유중 하나가 바로 사용 렌더러가 자꾸 제 코드의 일부를 텍스로 바꿨기 때문이에요. 엄청 싫었어요. 다음과같은게
let third x = head $ tail $ tail x
이렇게바뀐다고 생각해보세요
let third x = head tail tail x
그것도 수십 수백줄의 코드 한가운데에!
$
는 그냥 일상생활에서 항상 쓰이기 때문
물론 그럴일은 없을테지만, 그냥 요점을 짚기 위해서 예를 하나 들게요. 만약 다음과같은 게 마크다운에 있다고 해보죠:
Ke$ha and Ty Dolla $ign
(둘다 유명한 가수입니다)
이시점에서 이제 위와같은 상황을 일체 차단하는 텍스 코드를 추출하는 프로그램을 만드는건 불가능에 가깝다고 봐야해요. 좀더 가능성 있는 예를 들자면 지금 여러분이 읽고 있는 이 글처럼 $
의 메타적으로 언급하는 글이라면? 미 환율을 적어야 한다면? $
이 쓰일 수 있는 경우는 많이 있어요.
다시 말하지만 다른걸 썼다면 $(.+?)$
와 같은 방법으로 간단히 해결 가능했을거에요.
왜 이런 그지같은 관례가 생겼나?
텍스를 지원하는 많은 마크다운 렌더러들이 $
를 많이 쓰고있어요. 왜 이러는걸까요?
이유는 수학 수식을 렌더링 하는데 가장 많이 쓰이는 두 라이브러리 MathJax 와 Katex 가 html페이지에서 코드를 발견하고 새로운 element로 교체하는데 $
를 기본 구분자로 사용하기 때문이에요. 물론 이런 단순한 찾기/바꾸기 방식을 무식하게 전체 html 에 적용하는데 잘 작동할 리가 없죠. 하지만 편해서 사람들이 많이 써요.
그럼 뭘 써야하나?
개인적으로 GitLab 이 마크다운 안에서의 텍스를 지원하는 방법이 굉장히 좋은것같아요:
https://docs.gitlab.com/ee/user/markdown.html#math
Top comments (0)