아래 글에서 LaTeX에 대한 이야기가 잠깐 나왔는데,


이 떡밥은 내가 옛날부터 무척 좋아하던 떡밥이라서 안물수가 없음.


1. 우선 문제를 정확히.

LaTeX 내지 TeX에 대해 사람들이 가지는 불만은 크게 두개의 서로 다른 문제를 섞어 얘기하는데,

WYSIWYG 에 대해 이야기하는건 LaTeX이란 언어의 문제가 아니라 편집기의 문제야.

워드는 .doc파일을 편집하고, .doc파일을 편집하는건 워드라서 저 두개가 대부분 섞여있지만,

예를들면 웹페이지 만드는걸 html tag 써서 notepad로 만드는거랑, 웹에디터를 써서 만드는거를 생각해보면,

둘다 가능은 하지만 후자는 WYSIWYG방식이고 전자는 아니라고 해서.. 그게 html이 잘못됐다고 말할수는 없는거니까.

그런점에선 LyX은 사실상 웹에디터같은 WYSIWYG을 구현한 LaTeX 편집기일 뿐임. 

그래서 편집도구와, 언어는 구분해서 비판했으면 좋겠다.


그리고 merge, style, cross-reference 정도 기능은 대개 에디터가 가지고 있어서

 '올바르게' 문서를 작성하면 한꺼번에 문서를 통일감있게 변경하는 기능들은 내장돼 있으니,

저게 꼭 TeX을 써야만하는 이유가 되지는 않는다고 생각. 물론 TeX이 현재는 더 편하기도 하고

 줄바꿈등을 더 잘 처리해주고 있는 면은 있지만(ligature같은거) 어떤게 LaTeX만으로 달성할수 있는가? 에 대한 답은

많은 경우 No일 경우가 많다. 예를들어 TeX 개발할 시간에 같은 프로그래머들이 MS Word용 플러그인을 개발했다면

마개조된 MSWord가 지금 TeX에서 할 수 있는걸 못할거라고 생각하진 않음.


2. 일단 기본적으로 낡은 언어.

LaTeX은 TeX을 기반으로 해서 확장한 언어인데, TeX을 언제 만들었냐면 70년대 Don Knuth가 자기 책 쓰려고 만들었다.

Don Knuth가 훌륭한 프로그래머이긴 한데, 얘가 초능력자는 아니거든.

얘가 프로그래밍하던 당시 있던 언어는 ALGOL 뭐 이런 요즘 애들은 듣도보도 못했고 C보다 옛날 언어다 하고 들어는 봤던 정도가 대부분인

그 시절에.. 자기가 생각하기에 올바른 형태의 언어를 만들어서 (CWEB이라고 부르는)

그 자기만의 언어로 코딩해서 만든 언어가 TeX이다.


근데 프로그래밍언어는 그 이후 많은 발전을 이뤘어. OOP의 개념이라던지 namespace등을 통한 이름충돌 방지,

다양한 syntactic sugar들이 각 언어에서 개발되고, 다른언어에서 그게 괜찮다고 하면 자기 언어규격을 확장해서 그런게 가능하게 해왔지.

똑같은 기능을 c++ 코드로 작성하더라도 80년대 90년대 2010년 이후 코더들이 코딩하는 스타일이 굉장히 많이 달라졌어.

그만큼 큰 발전이 있었던거지.

물론 LaTeX은 기본적으로 markup language고 통상적인 범용 프로그래밍 언어랑 동일선에 비교하는건 어렵지만..

그래도 그 사이 LaTeX은 거의 발전이 없었던건 맞고 (물론 ConTeXt같은 OOP 개념을 아는 애들이 확장한것들은 있긴 하지만)

LaTeX3을 만드네 마네 하지만 저거 만든단 얘기 내가 기억하기로 10년 전부터 만든다고 했던거같아.

그니까 내가볼때 10년후에도 안나올 가능성이 높다.


그럼 이제 진짜 문제들을 얘기해보자.

3.1 이름충돌

LaTeX 패키지에 있는 모든 symbol들은 기본적으로 다 전역변수들임.

그리고 선택적으로 언어를 불러들이는 기능같은건 없음. python으로 치면 import * 밖에 없는 언어란거.

그래서 package A가 어떤 symbol을 정의해놨는데 package B가 같은 기호를 사용해서 이름충돌이 나면 바로 에러가 나고,

이걸 어떻게 처리할 다른 수단이 없음.

일례로 latex의 constants라는 패키지가 있는데. 얘가 하는 역할은, 우리가 상수를 많이 사용할때, 사용한 순서대로 C_1 C_2 C_3..

이렇게 번호를 붙여주는 패키지임.

얘는 \C 를 써서 새로운 명령어를 만드는데, 저게 pdflatex에서는 문제없이 돌아가지만,

XeTeX에선 \C가 글자에 변형을 넣는 기능으로 정의되어 있기때문에 이름충돌이 난다.

물론 preamble에서 \let\C\relax 하고 C를 해제한담에 다시 constants를 불러오면 문제는 없지만, 저런 상황을 모두 꿰고 있어야만 쓸수 있는

일종의 언어적 결함이다.

Knuth야 자기가 만든건 자기가 다 알았으니 상관없었겠지만 저렇게 수많은 사람들이 개발해서 기능을 추가한 언어가 이름관리를 저렇게 막 하면..

두개의 패키지를 특정하게 조합하면 뻑이날 수 있다는 위험성을 언제나 내포하고 있는 셈.


3.2 Parsing

언어가 튜링머신이 처리할 수 있는걸 다 할수있으면 Turing-complete이라고 하는데,

LaTeX을 파싱하는 문제는 잘 알려져있듯이 turing-complete이다.

뭐 간단히 설명하면, 파싱은 끝까지 다 해보기 전까지 모른다. 라고 보면 돼. 매크로 확장 기반이라서

대부분 프로그래밍 언어가 Turing-complete인건 그게 실행단계에서 turing machine에 입력가능한 입력을 받아들인다는 소리지,

코드를 파싱하는게 그렇게 된다는 이야기는 아니거든.

실제로 대개의 우리가 잘 아는 프로그래밍언어는 Context-free grammar가 있고. 저게 뭔말인지 모르면 그냥 이게 문법에 맞는말인지 아닌지는

코드를 봐서 쉽게 이해가 된다는 말이야.

그래서 코딩할때 대부분의 IDE들은 너 이거 세미콜론 빠트렸어 등등의 에러메세지를 쩨깍쩨깍 뱉어주지.

(아 물론 tex에도 누가 만든 chktex이라는 linting tool이 있는건 알아)

LaTeX은 무한의 확장성을 가졌다고 좋아하는데, 그렇게 무한의 확장성을 가져서 빠른 코드분석이 불가능하다.


문제를 삼는 부분은, 어떤 markup language도 자기네 언어가 파싱하기 어렵다는걸 자랑으로 생각하지 않는데,

TeX 쓰는 애들은 저걸 자랑스럽게 얘기한다는거.

그리고 보수적으로 봐도 99% 이상의 문서는, amstex 기능 이상의 tex기능을 사용하지 않는 문서라는건 덤..


3.3 Fault tolerance

html문서를 작성하는데 어디서 태그를 안닫았다던가, 어디서 태그가 엉켰다던가 해도,

사실 웹페이지는 99%의 contents가 올바르게 보인다.

console에 경고는 띄우겠지만 일단은 대개 잘 보여.

LaTeX은 그 무한의 확장성땜에 굉장히 이상한 코드도 사실 최종단계에선 잘 돌아갈 수 있기땜에,

뭐 하나 틀리면 문서자체가 빌드가 불가능하다.

설사 에러 다 죽이고 넘긴다고 해도 거의 대부분이 날아간 상태로 보일거야. 작게는 $ $ 쌍을 안맞춘거부터..

예를들어 $ $ 안에선 문단변경(빈줄) 금지 정도의 제약을 걸어놓는다면.. 저게 match되지 않더라도 다음 문단부턴

바르게 출력시킬수도 잇는건데, LaTeX에선 그렇게 할수가 없어.


3.4 속도

이건 우선순위에선 밀릴 수 있는 부분이지만, 그래도 얼마 되지도 않는 페이지를 출력하는데

시간이 너무 많이 걸려.

예를들어 Beamer를 만든다고 치고, page수가 60페이지 넘어가면, 한번 컴팡리하는데 10초 이상은 걸리지

Word에서? 1초 넘어가면 문제가 있다고 생각할걸?

서로 영향을 주지 않는건 병렬처리를 할수도 있는거고, 선형으로 처리한다고 쳐도 저건 좀 너무 느린속도야.

일례로 LyX파일을 로드하는데 드는 시간은 쟤가 화면에 다 rendering 하는데도 그렇게 오래안걸리거든.

그니까 본질적으로 느릴수밖에 없는 일은 아니란거. 물론 저것도 draftmode니 이런 저런 등등 속도를 올리는 방법이 있긴 하지만..

적당한 영역에서 문서를 쪼갤 수 있는게 안되면 불가능할거로 보여. 


4. 아마도 LaTeX이 제대로 되어먹으려면..


4.1 일단 언어를 기본기능과 확장기능으로 분리..

기본기능엔 AMSTeX의 수많은 기능들을 넣고, 정말 LaTeX으로 대단한 프로그래밍을 하는건 별도의 scripting engine으로 분리를 시켜야해


그니까 우리가 대부분 작성하는 문서는 \lim_{x \rightarrow 1 } 정도의 빤히 쓰는 기능만 쓰고, 실제 저널에 투고할때도 TeX파일 가이드엔

쓸데없는 매크로 빼라고 적어놓거든. LaTeX의 신묘한 어느 구석에 있는 패키지를 써서 구현한 기능은 읽는 사람은 읽는사람대로 고생이고, 속도도 느리고

오류가 발생할 확률도 훨씬 높아.


4.2 훨씬 minimal한 문서작성이 가능하도록..

모든 문서는 documentclass{article} 부터 시작하는데.. 모두가 이걸 치고있는건 조금 문제가 있어.

LaTeX을 첨 시작할땐 보통 남이 만든 TeX파일을 일단 하나 구해서 거기 있는 preamble을 그대로 가져다 쓰는데..

그렇게 하고있는거부터가 이미 좀 글러먹은거지. 대부분의 언어가 Hello World 작성하는데 그정도로 많은 요구사항을 넣는 경우는 없어.


4.3 WYSIWYG 기반 기본에디터 제공 및 통합

LyX이 앞서서 좋은 front end latex editor라고 말하긴 했지만, 엄밀하게 맞는 말은 아냐.

왜냐면 LyX이 latex로 출력은 잘하는데, latex로부터 입력을 받는걸 잘하진 않거든.

TeX으로 작업하는 사람과 collaboration을 하려면, lyx으로 작성한 문서를 export해서 보내고, 그 사람이 뭔가 바꿔서 보내오면,

바뀐부분을 tracking해서 다시 내 lyx 문서로 반영시키고.. 등의 일을 해야해.

lyx은 lyx 자체의 파일포멧이 있고, 얘는 물론 파싱이 잘 되게 되어있음.

워드처럼 이상한 압축을 한것도 아니고, 그냥 plain text editor로 열어보면 쉽게 읽을 수 있는 문서야.

LyX이 왜 가능했는지를 생각해보면 LaTeX을 어떻게 고쳐야할지를 알 수 있다고 봐. 왜냐면 LyX은 LaTeX의 무한한 확장성을 구현한게 아니라,

사람들이 자주 쓰는 '이정도만 있으면 사실 충분한' 기능들만 구현해놓았거든.


LyX에선 escape해서 직접 latex 명령어를 넣을수도 있는데, 내가 실제로 여지껏 몇년 쓰면서 그런 경우는

beamer에서 \pause기능 (이건 LyX에서도 구현이 되어있지만 입력하는게 너무 오래걸리고 문서를 깨트리기땜에..)

아니면 \tikz 기능들 (이건 별도의 스크립트 엔진으로 분리해야할 부분) 정도니까. 사실 LyX에서 지원하는거만 추려서 기본기능화 하고,

걔들을 빠르게 처리할 수 있게 해야지 않을까 함.


5. 이게 왜 안되느냐..

사실 경제성이 없어서 그래. 이걸 갈아엎기엔 분명히 꽤 양질의 프로그래머가 꽤 많은 시간을 들여 구현해야하는데, 

TeX을 쓰는 인구가 그렇게 많은것도 아니라서 꽤 비싼 프로그램이 될 확률이 높거든..

근데 이미 공짜인 LaTeX이란 대안이 있는 상황에서 .. 저게 팔릴 리가 없지.


그럼 결국 훌륭한 자원봉사자들이 LyX 개발하듯이 tex도 새로운 tex을 개발해야하는데,

언어 코어야 어떻게 한다고 쳐도 지금까지 만들어놓은 수많은 library들을 porting하려고 치면.. 아무리 소스코드가 공개되어 있다고 쳐도 쉽지 않을거야.

무엇보다 그렇게해서 얻는 효용이 상대적으로 작으니까. 지금 TeX이 일단 잘 돌아가는데 굳이 비슷한걸 다시 만들어야할 이유가 있는가 생각할 확률이 높음.

LaTeX3이 지지부진한 이유도 같은거로 생각함.


그리고 수학자들을  포함한 이공계생들이 저런쪽으로 좀 뛰어난 애들이다보니..

저런 글러먹은 LaTeX도 어떻게 꾸역꾸역 배워다가 다 하게 된단말이지.

그래서 내가 알기로 문과쪽에선 저널에서 워드도 잘 받아주는걸로 알고있어.


결론은 아마 이게 고쳐진다면 가능성은

1. 사이먼이 어느날 '구와악 LaTeX 못써먹겠다  이거 갈아엎을 CS랑 수학 포닥 100명 모집한다'하고 선언하거나

2. 구글이나 MS가 어느날 '우리가 이만큼 착하다 이것들아' 하면서 LaTeX의 대체품을 개발해서 뿌리거나

3. 테뉴어받은 수학교수 100명이서 '야 우리 LaTeX 넘 오래쓴거 같지 않냐 연구비 모아서 이거 한번 갈아엎자' 하거나

이런거밖에 없지 않나 싶다.


물론 어딘가의 천재가 갑자기 나타나서 자 이게 새로운 TeX의 코어니까 이거 써 하고 던질지도 모르지만..

ConTeXt나 LyX의 보급상태를 보건데.. 사람들이 뭘 만들어 줘봐야 자기가 쓰는 특정기능이 안된다거나 새로 배우기 귀찮다고

묻힐 확률이 높다.


뭐 떠오르는대로 막 적긴 했는데, 요점은 TeX이 현재로서 쓸수밖에 없는 건 맞는데, 

저게 요즘 발전한 컴퓨터 언어의 시각으론 많이 글러먹은 언어인것도 맞다는 얘길 하고싶었음.

그 해결책도 어느정도는 생각해볼 수 있지만, 경제적인 이유땜에 해결될 가능성은 별로 없다 정도.

쉽게 말해, 지금 당장 우리가 하던거 때려치고 TeX을 갈아엎자고 덤비지 않는거랑 같은 이유랄까.


그리고 엥간하면 LyX 쓰자. LyX을 쓰고 LyX에서 구현된 TeX기능만 쓰는게 자기 정신건강을 위해서도 좋고 다른사람을 위해서도 좋다.