LaTeX tablolarının yeteneğini arttıralım

LaTeX tabloları bir noktaya kadar oldukça işlevsel ve gereksinimlerimizi karşılıyor. Fakat eksik oldukları birkaç nokta var:

  • Kalın çizgiler (çift çizgi çok güzel durmuyor diyenlere)
  • Birden fazla satırı işgal eden hücreler
  • Sütun ve satır bazında biçem değişiklikleri
  • İçiçe tablolar?

Bu eksiklerin bazılarını kapamak için uzun süre önce array adlı stil dosyasını keşfetmiştim. Bu stil kullanılarak sütun belirteçleri tanımlamak mümkün. Bu birçok konuda rahatlık kazandırıyor. Buna bir de varlığından yeni haberdar olduğum multirow Aşağıdaki tabloyu bu stil dosyası ve birkaç ek ipucu kullanılarak yaptım.

table.1.png

Bu tabloda farkedebileceğiniz birkaç yenilik bazı sınırların daha kalın olması ve birden fazla satırı işgal eden hücreler.

array Yetenekleri

array stili bize temek olarak kendi sütun tipimizi tanımlama şansı veriyor. Yani tabular içinde standart l,r,c,p belirteçlerinin yanısıra bir simge ekleyerek bunu tanımlamamıza izin veriyor. Bunu yaparken varolan belirteçleri kullanıyor, tablonun her hücresinin başına ve sonuna eklenecek komut ya da ifadeleri verebiliyoruz.Örneğin:


\documentclass{article}
\usepackage{array}
\newcolumntype{B}{>{\bf}l<{)}} \begin{document} \begin{tabular}{Bl} a & 1 \\ c & 2 \end{tabular}

En üstte yaptığımız newcolumntype sayesinde artık B adında bir sütun belirtecimiz var. Bu belirteç l ile aynı. Fakat her hücrenin başına bir \bf sonuna da ) ekliyor. Böylelikle tablomuzun veri kısmı kalabalıklaşmadan sütun formatlayabiliyoruz.Bu fikri biraz daha ileri götürerek kalın sütun sınırlarını nasıl çizebiliriz. Yine bir belirteç tanımlayabiliriz:


\newcolumntype{+}{!{\vrule width 1pt}}

Bu belirteçte kullanılan ! LaTeX'deki standart @ ile aynı işlevi görüyor. Tek farkı ikincisi sınır ile hücreler arasına konan standart boşluğu silerken (hücreleri daha yapışık çizerken) diğeri bu boşluğu koyuyor. 1pt yerine dilediğiniz kalınlığı koyabilirsiniz. Bu boşluk bazen başımıza bela olduğu için yazının ileriki kısımlarından bundan kurtulmaya çalışacağız.

Kalın sütun sınırlarını çizdik. Peki kalın satır sınırları? Bunun için LaTeX'in hline ve cline tanımlarını değiştirerek kalın çizgi çizmesini sağlayan iki komut tanımlayalım:

\\makeatletter
\\def\\bhline{\\noalign{\\ifnum0=`}\\fi\\hrule \\@height 1pt
        \\futurelet \\@tempa\\@xhline}
\\def\\bcline#1{\\@bcline#1\\@nil}
\\def\\@bcline#1-#2\\@nil{%
  \\omit
  \\@multicnt#1%
  \\advance\\@multispan\\m@ne
  \\ifnum\\@multicnt=\\@ne\\@firstofone{&\\omit}\\fi
  \\@multicnt#2%
  \\advance\\@multicnt-#1%
  \\advance\\@multispan\\@ne
  \\leaders\\hrule\\@height 1pt \\hfill
  \\cr
  \\noalign{\\vskip-1pt}}
\\makeatother

Bu tanımlardan sonra hline yerine bhline, cline yerine bcline koyarak kalın (1pt) sınırlar çizebilirsiniz. Daha kalın yapmak için tanımları değiştirebilir, ya da parametrik yapabilirsiniz (1pt geçen yerleri değiştirmek yeterli). Bu tanımları \begin{document} öncesinde yapmalısınız.

Aşağıda oldukça yararlı 3 sütun belirteci var.

\newcolumntype{L}[1]{>{\ }p{#1}<{\hfill}} \newcolumntype{R}[1]{>{\hfill\ }p{#1}<{\ \ }} \newcommand{\TCntrngTrck}{\let\\=\tabularnewline} \newcolumntype{C}[1]{>{\centering\TCntrngTrck}p{#1}}

Bu belirteçler LaTeX'deki p{...} sütun belirtecinin yaptığı gibi sabit genişlik verilebilen fakat aynı zamanda sola, sağa ve ortaya hizalı sütünlar yapmaya yarıyor. Özellikle sık gereksinim duyulan ortaya hizalı sabit genişlikli sütunlar C{...} şeklinde yapılabiliyor.

multirow paketi

Tablolarda en sık gerek duyulabilen özellik de birden çok sütunu ya da satırı örten hücreler. LaTeX'in çok sütun örten hücreler için eskiden beri bir çözümü var: multicolumn{}{}{}. Fakat birden çok satırı örtmek için multirow{n}{g}{i} komutunu ve paketini kullanmak gerekiyor.

\usepackage{multirow}

Yaptıktan sonra ilk parametre satır sayısı, ikincisi toplam yükseklik, üçüncüsü içerik olmak üzere üç parametre vererek hücreleri doldurabiliyoruz. Takip eden ve örtülen satırlarda hücre pozisyonunun boş bırakılması gerekiyor (HTML'den alışkanlığı olanlar dikkat, hücre pozisyonunu varmış gibi ayırıyor ama içini doldurmuyorsunuz) b. İçerik kısmı ortaya hizalı bir "box" şeklinde LaTeX tarafından yorumlanıyor. "box" olması paragraf modunda \\ dahil dilediğiniz yapabilmenizi sağlıyor.

Basit bir örnek vermek gerekirse:

\begin{tabular}{cll} \hline
a & b & c \\ \hline
\multirow{2}{1.5em}{A} & d & e \\ \cline{2-3}
& f & g \\ \hline
h & i & j \\ \hline
\end{tabular}

Dikkat ederseniz ufak bir sorun var, o da çok satır örten hücrenin ortasından çizgi geçmemesi için hline yerine cline kullanmalıyız. Yani multirow sadece hizalamayı ve örtme işini yapıyor, çizgileri değiştirmiyor.

Yukarıdaki örnekte A, B, ve "Veri Yok" hücreleri bu şekilde yapıldı.

Tablo içinde tablo

Bazen tablonun sadece bir bölümünde düzensizlik varsa bütün diğer hücreleri multicolumn ya da multirow yapmak yerine sadece düzensiz hücreyi içiçe tablo, yani tablo içinde tablo yapmak daha pratik olacaktır. Örneğin:
nestedtable.png

\begin{tabular}{|l|c<{\ }+c+} \hline A & B & C \\ \hline D & E & \begin{tabular}{o>{\ }c|c|c<{\ }o} a & b & c \\ \hline d & e & f \\ \hline g & h & i \end{tabular} \\ \hline F & G & H\\ \hline \end{tabular}

Tablo içinde tablo konusundaki en büyük sorun LaTeX'in sütun aralarına yerleştirdikleri boşluklar. Bu boşluklardan @{} belirteciyle kurtulabiliriz. Fakat kodumuzu daha sade yapmak için array stilini kullanacağız. Böylelikle kurtulduğumuz boşlukları hücrenin içine taşıyarak çizgilerle hücre içeriği arasındaki boşluğu da korumuş olacağız. Şimdi aşağıdaki sütun belirteçlerini ekleyelim:


\newcolumntype{+}{@{\vrule}}
\newcolumntype{*}{@{\vrule width 1pt}}
\newcolumntype{o}{@{}}

Burada o, +, * belirteçleri boşluklar olmaksızın boş sütun arası, ince çizgi sınır ve kalın çizgi sınırları tanımlıyor. İçeriği olmayan hücreler arasında, ilk sütun öncesi ve son sütun sonrasında bu belirteçleri kullanarak boşluklardan kurtulacağız.


begin{tabular}{o>{\ }L{1cm}*C{2cm}+R{2cm}<{\ }o} \hline a & 1 & 2 \\ \hline b & 10 & 22 \\ \hline \end{tabular}

Kodu uçtan uca tam 5cm genişlikte bir tablo üretecek (aslında bir ince ve bir kalın çizgi buna ekleniyor, ince ayar yaparken dikkat). Bunun tam altındaki hücreye de benzer başlıkta bir tablo eklerseniz sütunlar ve çizgiler aynı hizada olacak ve bu tabloların çizgileri içinde bulundukları hücre sınırına bitişik olacak. Boşlukların silinmesinden kaynaklanan sınıra çok yakın hücreleri engellemek için >{\ } ve <{\ } kullanabilirsiniz. Bunlar hücrenin içeriğine boşluk koyacağından sınırların hücreye olan uzaklığını etkilemiyecek, içerik sınıra yapışmaktan kurtulacak.

En üstteki tablonun tam LaTeX kodu:

\\documentclass{article}
\\usepackage{array}
\\usepackage{multirow}
\\makeatletter
\\def\\bhline{\\noalign{\\ifnum0=`}\\fi\\hrule \\@height 1pt
        \\futurelet \\@tempa\\@xhline}
\\def\\bcline#1{\\@bcline#1\\@nil}
\\def\\@bcline#1-#2\\@nil{%
  \\omit
  \\@multicnt#1%
  \\advance\\@multispan\\m@ne
  \\ifnum\\@multicnt=\\@ne\\@firstofone{&\\omit}\\fi
  \\@multicnt#2%
  \\advance\\@multicnt-#1%
  \\advance\\@multispan\\@ne
  \\leaders\\hrule\\@height 1pt \\hfill
  \\cr
  \\noalign{\\vskip-1pt}}

\\makeatother

\\newcolumntype{+}{@{\\vrule}}
\\newcolumntype{^}{!{\\vrule width 1pt}}
\\newcolumntype{o}{@{}}

\\newcolumntype{L}[1]{p{#1}<{\\hfill}}
\\newcolumntype{R}[1]{>{\\hfill\\ }p{#1}}
\\newcommand{\\TCntrngTrck}{\\let\\\\=\\tabularnewline}
\\newcolumntype{C}[1]{>{\\centering\\TCntrngTrck}p{#1}}

\\begin{document}
\\begin{tabular}{|C{1cm}^R{1cm}|C{1cm}|R{1cm}|C{1cm}|} \\cline{2-5}
\\multicolumn{1}{l^}{}  & \\multicolumn{2}{c|}{\\bf A}&
\\multicolumn{2}{c|}{\\bf B} \\\\ \\bhline
\\multirow{3}{5mm}{\\bf A}
        & 11    &       a       &       23      &       ab- \\\\ \\cline{2-5}
        & 9     & \\multirow{3}{7mm}{Veri\\\\Yok}
                                &       8       &       a \\\\ \\cline{2-2}
                                                             \\cline{4-5}
        & 112   &               &       0       &       ab+ \\\\ \\bcline{1-2}
        \\bcline{4-5}
\\multirow{3}{5mm}{\\bf B}
        & 3     &               &       12      &       b \\\\ \\cline{2-5}
        & 10    &       ab      &       14      &       a \\\\ \\cline{2-5}
        & 1     &       b       &       3       &       aa \\\\ \\hline
\\end{tabular}
\\end{document}