Drawing EBNG or CFG figures using LaTeX with Rail

LaTeX를 활용해 EBNF 또는 CFG 그림 그리기

EBNF(wikipedia) 를 나타내는 그림을 그리는 방법 중 하나인 Rail과 LaTeX을 소개한다. LaTex은 유명한 편집기 이며, Rail이라는 플러그인을 사용하면 EBNF를 나타내는 그림을 손쉽게 그릴 수 있다.

Programs Requirements

  • LaTeX & Rail
    당연히 편집하기 위한 LaTeX과 플러그인인 Rail이 필요하다. Rail은 CTAN에서 받을 수 있다. 따로 패키지 관리자를 사용하지 않고 다운받은 뒤 직접 빌드하여 사용했다. 빌드하기 위해서 스캐너와 파서인 flex와 bison이 설치되어있어야 한다. (실행할 때도 필요한지 여부는 확인하지 못했다.) 빌드 결과물로 나오는 rail 이라는 바이너리 실행파일과 rail.sty이 필요하다.
  • pdfcrop.pl
    만약 LaTeX과 Rail을 통해 얻어낸 PDF파일의 크기가 그림의 크기보다 크다면 pdfcrop.pl을 사용하여 여백을 잘라줄 수 있다. 역시 CTAN에서 다운받을 수 있다. 또는, 근본적으로 크기가 알맞은 PDF파일을 만들도록 수정할 수 있을 것으로 보인다. (링크)
  • ImageMagick
    PDF 파일을 그림파일로 변환하기 위한 프로그램이다. 기본 설정으로는 PDF 파일의 변환이 불가능했기 때문에, 스택오버플로우의 지침대로 profile.xml을 수정해줘야 했다.

예제 과정

본 게시글에서 사용한 예제 TeX파일은 다음과 같다.  standalone 클래스(CTAN)를 사용하여 그림만 나오는 독립적은 PDF를 얻어낼 것이다. 예제 파일의 내용은 Rail 문서에 있는 Rail을 사용하기 위한 문법을 설명하는 소스이다. 만약 길이가 너무 길어서 PDF크기가 부족하다면 geometry등의 패캐지를 사용해서 길이를 크게 지정해주는 방법 등으로 해결 할 수 있다.

% example.tex
\documentclass[preview, varwidth=true]{standalone}
\usepackage{rail}
\railoptions{-ah} % rail option 
\begin{document}
\begin{rail}
    rules	: ( rule ? + ';' ) ;

    rule	: ( identifier ':' ) ? body[1--5] ;
    body	: [1] ( ( '[' string ']' ) ? body[2--6] + '|' )
                | [2] body[3--6] '*' body[5--6]
                | [2] body[3--6] '+' body[5--6]
                | [3] ( body[4--5] + )
                | [4] body[5] '?'
                | [5] identifier ( '[' string ']' ) ?
                | [5] quote string quote
                | [5] dquote string dquote
                | [5] '(' body[1--6] ')'
                | [5] cr
                | [6]
                ;

\end{rail}
\end{document}

LaTeX으로 처리를 하고 나면, PDF파일의 그림이 완전하지 않은 것을 알 수 있다. 이 때, 파일명과 같은 rai 파일(example.rai)이 같이 떨어지게 된다.  이 파일을 Rail을 통해 처리하고 나면 파일명과 같은 rao파일(example.rao)을 얻을 수 있고, 이 것을 바탕으로 다시 LaTeX에 입력으로 넣으면 PDF를 얻을 수 있다. 이 PDF를 사진으로 바꾸면 끝이다. 위 예제의 경우 다음과 같은 사진을 얻을 수 있다.

예제 파일의 출력 결과

말로 설명한 위 과정의 명령어들은 다음과 같다.

pdflatex example.tex

# rail 에 옵션을 직접 줄 수 있다. (\railoptions{-ah} 대신 rail -ah example)
# 확장자(rai)를 제외한 파일이름만 입력으로 넣는다.
$(PATH_TO_RAIL)/rail example

pdflatex example.tex

# 만약 결과 pdf가 너무 클 때,
# profcrop.pl (input_file) (output_file)
$(PATH_TO_PDFCROP)/pdfcrop.pl example.pdf example_cropped.pdf

# 결과 pdf를 사진으로 바꾸려면
convert -density 300 -quality 90 \
    example_cropped.pdf figure_output.png
# dpi = 300, quality = 90 의 png파일을 얻을 수 있다.

Rail을 사용한 EBNF 그림뿐만이 아니라 Tikz등을 이용한 그림 등도 당연히 쉽게 가능하다.