TikZ로 그림 만들기

9135 단어 TikzLaTeX


FlatBuffers 설명 에서 사용한 그림을 만드는 방법입니다.
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw[very thick, fill=green!10] (0, 8) rectangle (5, 10);
  \draw[very thick, fill=red!10] (0, 5) rectangle (5, 8);
  \draw[very thick, fill=blue!10] (0, 2) rectangle (5, 5);
  \draw[very thick, fill=yellow!10] (0, 0) rectangle (5, 2);

  \node[below left, green!50!black] at (0, 10) {Header};
  \node[below left, red!50!black] at (0, 8) {Body};
  \node[below left, blue!50!black] at (0, 5) {VTable};
  \node[below left, yellow!50!black] at (0, 2) {String};

  \foreach \height in {1,...,9} \draw[dashed] (0, \height) -- +(5, 0);

  \node at (2.5, 9.5) {Offset to Body};
  \node at (2.5, 8.5) {File Identifier (UTF-8)};

  \draw[->, very thick, dotted] (4.5, 9.5) -- +(1, 0) -- +(1, -1.9) -- +(0, -1.9);
  \draw[->, very thick, dotted] (4.5, 7.4) -- +(1, 0) -- +(1, -2.9) -- +(0, -2.9);

  \node at (2.5, 7.5) {Offset to VTable};
  \node at (2.5, 6.5) {Value (i32)};
  \node at (2.5, 5.5) {Offset to String};

  \node at (2.5, 4.5) {Length of Body, VTable};
  \node at (2.5, 3.5) {Offset of 1th member};
  \node at (2.5, 2.5) {Offset of 2nd member};

  \draw[->, very thick, dashed, blue] (4.5, 2.5) -- +(1.2, 0) -- +(1.2, +2.9) -- +(0, +2.9);
  \draw[->, very thick, dashed, blue] (4.5, 3.5) -- +(1.4, 0) -- +(1.4, +3) -- +(0, +3);

  \draw[->, very thick, dotted, red] (4.5, 5.6) -- +(1.6, 0) -- +(1.6, -4) -- +(0, -4);

  \node at (2.5, 1.5) {``Actual String''};

  \draw[->, very thick] (6.5, 10) -- +(0, -10) node[right] {Memory};
\end{tikzpicture}
\end{document}

TikZ 사용법



TikZ로 단독 그림을 생성할 때는 standalone.cls를 추천합니다. 이것은 TeXLive 중에서도 texlive-latex-extra 등의 패키지에 들어 있습니다. 이것으로 생성한 PDF에는 여백이 포함되지 않고, 그대로 apt-file 등으로 SVG로 변환할 수 있어 편리합니다.
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
...
\end{tikzpicture}
\end{document}

그림은 pdf2svg 환경 내에서 만듭니다.
  \draw[very thick, fill=green!10] (0, 8) rectangle (5, 10);

직사각형을 그립니다. tikzpicture 안은 [] 명령에 대한 옵션으로, \draw 는 선을 매우 굵고, very thick 는 색의 지정입니다. TikZ에서는 fill=green!10 와 같이 2개의 색을 비율을 지정해 섞을 수가 있습니다. green!10!white 와 같이 생략하면 다른 하나는 green!10 취급이 됩니다.white 는 직사각형의 왼쪽 하단 rectangle 와 오른쪽 상단 (0, 8) 의 좌표를 받아 그립니다.
  \node[below left, green!50!black] at (0, 10) {Header};
(5, 10) 의 위치에 노드(정점)를 두어 문자를 표시합니다. (0, 10) 는 정점에 대해 어느 위치에 문자를 둘지를 지정하고 있어 이제 좌하에 나옵니다. 색의 지정은 below left 의 때와 같습니다. \draw 의 안에는 문자가 들어가 있습니다만, 이것은 LaTeX의 처리계이므로, 완전한 LaTeX를 사용할 수 있습니다. 이것이 TikZ의 가장 큰 장점입니다.
  \foreach \height in {1,...,9} \draw[dashed] (0, \height) -- +(5, 0);

이 줄은 그림에서 옆의 점선을 그립니다 (사각형에 겹치는 부분은 보이지 않습니다). TikZ에는 {} 명령어가 있으며, 이것으로 반복 처리를 할 수 있습니다. foreach 로 연속번호를 생성해 {1,...,9} 에 매회 값이 설정시키므로, 그것을 뒤의 \height 로 사용하고 있습니다. \draw 옵션으로 파선으로 할 수 있습니다. 또 dashed 와 같이 최초의 좌표에 대해서 상대 위치로 패스를 지정할 수가 있습니다.
  \draw[->, very thick, dashed, blue] (4.5, 2.5) -- +(1.2, 0) -- +(1.2, +2.9) -- +(0, +2.9);
+(5, 0) 의 옵션을 건네주면 화살표가 당겨집니다. -> 그러면 역방향이 됩니다. 상대 위치는 시작점에 대한 것이므로 주의가 필요합니다. 값이 어중간한 것은 그림을 보면 알 수 있지만, 화살표가 겹치는 것을 피하기 위해서입니다. 이 가장자리는 수동으로 감상합니다.

빌드 방법



.latexmkrc
#!/usr/bin/env perl
#
$latex = 'uplatex %O -synctex=1 --file-line-error -interaction=nonstopmode %S';
$pdflatex = 'lualatex %O -synctex=1 --file-line-error -interaction=nonstopmode %S';
$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B';
$bibtex = 'upbibtex %O %B';
$makeindex = 'upmendex %O -o %D %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$dvips = 'dvips %O -z -f %S | convbkmk -u > %D';
$ps2pdf = 'ps2pdf %O %S %D';
$pdf_mode = 3;
if ($^O eq 'darwin') {
  $pvc_view_file_via_temporary = 0;
  $pdf_previewer = 'open -ga /Applications/Skim.app';
} else {
  $pdf_previewer = 'xdg-open';
}

나는 LuaTeX파이므로 위의 TikZ 소스도 <-로 컴파일합니다. 위와 같이 lualatex 를 지정해 두면
$ latexmk -pdf -f

그 디렉토리에 있는 $HOME/.latexmkrc 파일을 전부 처리해 줍니다. CI로 빌드하는 경우는 비교적 경량으로 일본어도 처리할 수 있다.

마지막으로



TikZ는 쉽게 깨끗한 그림을 쓸 수 있어 *.tex 와 같이 프로그래머블이며, 텍스트이므로 관리가 편리합니다! 꼭 사용합시다 (/· ω ·)/

좋은 웹페이지 즐겨찾기