DEV Community

Ingun 전인건
Ingun 전인건

Posted on

마크다운에서 Tex용 delimiter로 $(달러)를 쓰면 안돼요

Tex(이하 텍스)는 그동안 블로그 플랫폼에서 무시당해왔어요. 하지만 이젠 아니에요. 점점 많은 블로그 들이 텍스를 지원하기 시작했어요. Dev.to 도 2달전부터 Tex를 지원하기 시작했죠 (제가 워드프레스랑 미디엄에서 여기로 옮긴 이유에요). 저처럼 수학+프로그래밍 관련 글을 자주 쓰는 사람에겐 반가운 소식이에요. 하지만 여전히 텍스의 중요성에 비해선 아직 지원하는 정도가 약하긴 해요. 아직 해결해야할 문제점들이 많아요. 그중 가장 큰 문제는 바로 재수없게도 $가 Markdown(이하 마크다운) 에서의 텍스의 delimiter(이하 구분자)로 쓰는게 관례가 됐다는 점이에요.

다행이도 Dev.to는 그 관례를 따르지 않고 독자적인 구분자를 썼죠 (어쩌면 Liquid베이스기때문에 다른걸 써야 했을 수도 있겠죠?). $ 는 마크다운에서 텍스를 쓴다고 했을때 최악의 구분자에요. 여러분이 마크다운 renderer 개발자이든, 아니면 저처럼 관련 글을 쓰고 많은 글들을 관리하는 유저이든간에 마크다운 안에서 텍스를 정확히 매치할 수 있어야해요. $는 그 캡쳐를 거의 불가능하게 만들죠. 제가 많은 종류의 렌더러를 써보고, 이슈도 날리고, 이슈도 수정하고, 결국엔 직접 하나 만들기까지 해서 잘 알아요. $ 가 최악인 이유는 다음과 같아요:

텍스가 $를 자체적으로 내부 텍스 구분자로 쓰기때문

다음을 텍스를 이용해서 쓴다고 해볼게요:

In quaternion i2j2k2ijk, and 1 are all equal. \text{In quaternion $i^2$, $j^2$, $k^2$, $ijk$, and $-1$ are all equal.}

$를 구분자로 쓴다고 할때 다음과같이 써야해요:

$\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) 아무 문제 없음


첫번째 $ 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

Discussion (0)