LaTeX3

내위키

전자 문서 조판 시스템인 LaTeX의 세 번째 버전. 착수한 지는 무척 오래 됐는데 2015년 상반기 기준으로 아직도 완전히 완성된 상태는 아니다.

현재까지 드러난 LaTeX3의 특징은, 여러 가지 매크로를 만들 때 좀 더 폭넓은 확장성을 지원하고 현대 프로그래밍의 기법을 어느 정도 활용할 수 있도록 지원하는 것이다. 매개변수를 유연하게 지원한다든가, 모듈 개념 지원, 몇 가지 자료형의 지원, 라이브러리 개념 지원과 같은 기능은 TeX이 가진 프로그래밍 언어의 성격을 강조한 것. TeX으로 프로그래밍 하고 싶르면 그냥 LuaTeX 쓰면 되잖아.

TeX 또는 LaTeX 명령은 근본적으로는 매크로이며 함수변수의 구분이 뚜렷하지 않은데, LaTeX3은 적어도 개념으로라도 함수변수를 구분한다. 다만 LaTeX 기반으로 매크로라는 본질 자체가 변하지는 않는다.

지금까지의 LaTeX 문법에 익숙한 사람들에게는 뭔가 더 복잡해진 LaTeX3의 문법은 괴랄하고 헷갈리기 그지 없으나, LaTeX 경험이 별로 없는 사람들은 현대 프로그래밍 기법이나 관례가 녹아 있는 LaTeX3 쪽이 더 편할 수도 있다.

특징

LaTeX2ε까지는 @ 문자를 특수한 의미를 가진 기호로 사용했다. 일반 사용자들이 접근할 수 없는 (굳이 접근하자면 \makeatletter 명령으로 접근은 할 수 있는데 접근하지 쉽지 않게 해 놓은) 매크로의 이름을 정의할 때 @ 기호를 썼다. LaTeX3에서는 더 이상 @ 기호를 쓰지 않는다. 대신 밑줄(_)과 쌍점(:)을 쓴다. 함수는 다음과 같은 형식으로 이름이 정의된다.

    \[모듈]_[이름]:[매개변수 리스트]

LaTeX3의 함수는 예를 들어 이런 모습이 된다.

  \seq_map_inline:Nn

seq는 모듈, map_inline은 함수 이름, Nn은 매개변수 리스트가 된다.

LaTeX2ε에서 @ 기호는\makeatletter\makeatother 사이에서만 써야 하는 것처럼, LaTeX에서 밑줄과 쌍점을 쓰려면 \ExplSyntaxOn\ExplSyntaxOff 사이에서 써야 한다. 따라서 위와 같은 형식으로 정의되는 명령어는 문서의 본문에서 쓸 수 없다. 본문에서 쓸 명령어는 \NewDoucmentCommand\NewDocumentEnvironment 같은 명령으로 정의해야 한다.

어떻게 쓸 수 있지?

아직까지 LaTeX3는 LaTeX2e 기반 위에서 돌아간다. 굳이 호환성을 버릴 생각도 안 하고 있다. LaTeX3를 쓰고 싶다면 다음의 두 가지 패키지를 사용한다.

  • expl3.sty : 완전한 LaTeX3 스타일로 매크로를 만들 수 있다. 단. LaTeX3 스타일로 만든 매크로는 문서에서 직접 쓸 수 없다.
  • xparse.sty : LaTeX3 스타일 매크로와 LaTeX 문서 사이의 가교 구실을 한다. LaTeX3 매크로를 이 패키지에서 제공하는 명령들로 덮어씌워서 문서에서 사용할 수 있는 명령으로 만든다. LaTeX3 매크로를 안 쓰고 기존 LaTeX 스타일 매크로를 만들 때에도 여러가지 편리하고 유연한 기능이 많이 제공되므로 이 패키지만 쓰는 사람들도 많다.

아주 간단한 예는 다음과 같다.

\documentclass{oblivoir}
\userpackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn %여기서부터는 LaTeX3 모드다.
% LaTeX3 스타일 매크로
\cs_new:Npn \hello_world:n #1
    { Hello~world,~I~am~#1}

% 문서 안에서 쓰기 위한 매크로
\NewDocumentCommand{\HelloWorld}{m}{\hello_world{#1}}
\ExplSyntaxOff % LaTeX3 모드 끝.

\begin{document}

\HelloWorld{내위키}

\end{document}

참고로, LaTeX3 모드 안에서는 빈칸은 모조리 무시된다. 빈칸을 넣고 싶으면 ~(틸데) 기호를 써야 한다. 기존 LaTeX이라면 틸데는 줄바꿈을 하지 않는 빈칸으로 해석되는데 LaTeX3 모드에서는 그냥 빈칸이다. LaTeX3 모드에서 줄바꿈 안 하는 빈칸을 넣고 싶으면 \nobreakspace 같은 명령을 써야 한다.