2013年6月28日金曜日

LaTeXで概念構造を書くためのマクロ

LaTeXで概念構造を書くためのマクロ。

プリアンブルで以下のように書く。
\makeatletter
\def\jcat#1{\vbox{\hbox{$_\textrm{\rm\scriptsize\mathstrut#1}$}\hrule height 0pt}}
\def\jlist#1{\vbox{\@for\i:=#1\do{\hbox{$\mathstrut$\textsc{\i}}}\hrule height 0pt}}
\def\jarg#1#2{$\left[\vcenter{\hbox{\jcat{#1} \jlist{#2}}}\right]$}
\def\jfunc#1#2{#1$\left(\vcenter{\hbox{#2}}\right)$}
\makeatother
使い方
\jarg{Object}{car,red}

\jfunc{have}{John, car}

\jarg{Event}{\jfunc{have}{\jarg{Object}{John},\jarg{Object}{car,\jarg{Property}{red}}}}
結果
ポイント

  • かっこは数式モードの\left[や\right]などで書く。
  • かっこのすぐ内側には\vcenterを置く。
    • ( )の内側は\vboxでもいいかも。
  • \vcenterや\vboxの内側には\hboxと\hruleのみ置く。
    • vbox系は内部のhboxの幅に応じて自動的に横幅が決まる。
    • hboxを置かずに直接文字などを置くと横幅が行幅いっぱいに広がる。
  • \vbox内の最後には高さ0の\hruleを置く。
    • ベースラインをそろえるため。
    • 高さ0にするのは不可視にするため。
  • 文字列を置く可能性のある場所には$\mathstrut$を置く。
    • 行高を確保してレイアウト崩れを防ぐ。