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) $ 아무 문제 없음
Enter fullscreen mode Exit fullscreen mode

예상되는 결과물은 다음과 같죠:


이 하스켈 코드는, 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 
Enter fullscreen mode Exit fullscreen mode

(둘다 유명한 가수입니다)

이시점에서 이제 위와같은 상황을 일체 차단하는 텍스 코드를 추출하는 프로그램을 만드는건 불가능에 가깝다고 봐야해요. 좀더 가능성 있는 예를 들자면 지금 여러분이 읽고 있는 이 글처럼 $의 메타적으로 언급하는 글이라면? 미 환율을 적어야 한다면? $이 쓰일 수 있는 경우는 많이 있어요.

다시 말하지만 다른걸 썼다면 $(.+?)$와 같은 방법으로 간단히 해결 가능했을거에요.

왜 이런 그지같은 관례가 생겼나?

텍스를 지원하는 많은 마크다운 렌더러들이 $를 많이 쓰고있어요. 왜 이러는걸까요?

이유는 수학 수식을 렌더링 하는데 가장 많이 쓰이는 두 라이브러리 MathJax 와 Katex 가 html페이지에서 코드를 발견하고 새로운 element로 교체하는데 $를 기본 구분자로 사용하기 때문이에요. 물론 이런 단순한 찾기/바꾸기 방식을 무식하게 전체 html 에 적용하는데 잘 작동할 리가 없죠. 하지만 편해서 사람들이 많이 써요.

그럼 뭘 써야하나?

개인적으로 GitLab 이 마크다운 안에서의 텍스를 지원하는 방법이 굉장히 좋은것같아요:
https://docs.gitlab.com/ee/user/markdown.html#math

Top comments (0)