6월 20, 2019 · developemnt

Drawing EBNG or CFG figures using LaTeX with Rail

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

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

Programs Requirements

예제 과정

본 게시글에서 사용한 예제 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등을 이용한 그림 등도 당연히 쉽게 가능하다.