Zastaw ciekawych makroinstrukcji
Author: Włodzimierz Macewicz
Keywords: tex, latex, makroinstrukcje, pakiety makroinstrukcji, Wirtualna Akademia

## blkarray

Pakiet zawiera makroinstrukcje ułatwiające skład tabel; zawiera w sobie polecenia analogiczne jak pakiety `hhline` (rozszerzone), `array` i `multirow`.

Pakiet definiuje środowisko `blockarray` zastępujące środowiska `tabular` i `array` (wewnątrz trybu matematycznego zachowuje się jak `array`, a w trybie tekstowym jak `tabular`). Postać wywołania jest podobna jak w przypadku ww. konstrukcji.
`\begin{blockarray}{preambuła}
zawartość tabeli
\end{blockarray}`
lub
`\begin{blockarray}[s]{preambuła}
zawartość tabeli
\end{blockarray}`
gdzie s określa sposób pozycjonowania tabeli względem sąsiedztwa; może przyjmować wartości: `c` -- center (wartość domyślna), `b` -- dół tabeli równo z linią sąsiednią, `t` -- góra tabeli równo z linią sąsiednią

preambuła definiuje sposób prezentacji (składu) poszczególnych kolumn tabeli oraz określa separatory kolumn; mogą się w niej znaleźć następujące oznaczenia:

`l` | dosunięcie tekstu do lewej
`r` | dosunięcie tekstu do prawej
`c` | centrowanie
`m{width}` | Definiuje kolumnę o szerokości width . Środek celi w tej kolumnie (połowa jej wysokości) pokrywa się ze środkiem celi kolumny sąsiedniej. Odpowiednik: `\parbox{width}`; tekst jest łamany na szerokości width .
`p{width}` | Równoważna: `\parbox[t]{width}`. Pozycjonowanie w/g szczytu celi.
`b{width}` | Równoważna `\parbox[b]{width}`. Pozycjonowanie w/g dołu celi.
`>{macro}` | Może być użyte przed jednym z następujących typów: `l`, `r`, `c`, `p`, `m` lub `b`. Polecenie macro będzie wykonywane zawsze przed rozpoczęciem analizy materiału celi w tak określonej kolumnie.
`<{macro}` | Może być użyte po jednym z następujących typów: `l`, `r`, `c`, `p`, `m` lub `b`. Polecenie macro będzie wykonywane zawsze na końcu materiału celi w tak określonej kolumnie.
`|` | Wstawienie linii pionowej jako separatora kolumn; odległość między kolumnami zostanie zwiększona o szerokość linii (w odróżnieniu od oryginalnej definicji tabeli). Można wstawić dwa znaki `|` -- separatorem będzie linia podwójna (odległość między liniami określa parametr `\BAdoublerulesep`).
`@{macro}` | Może być użyte w dowolnym miejscu preambuły zamiast separatora (np.: `|`). Polecenie macro zostanie wywołane między kolumnami (kasowana jest normalna odległość między kolumnami).
`!{macro}` | Może być użyte w dowolnym miejscu preambuły zamiast separatora (np.: `|`). Polecenie macro zostanie wywołane między kolumnami (w odróżnieniu od `@{...}` nie jest kasowana normalna odległość między kolumnami).
`&` | Znak umieszczony przed symbolem separatora kolumny (`|`) powoduje, że w przypadku użycia polecenia `\BAmulticolumn` nie trzeba w nim powtarzać definicji obramowania celi (w przypadku użycia makra `\BAmulticolumn` w pierwszej kolumnie obramowanie z lewej strony musi być redefiniowane). W przypadku podwójnego obramowania (`||`) znak `&` należy umieścić tylko przed pierwszym znakiem `|`.
`)` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`\}` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`]` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`(` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`\{` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`[` | dodatkowa kolumna obejmująca nawiasem całą wysokość tabeli (p. środowisko `block`)
`\Left{tekst}{delimiter}` | tekst i delimiter stanowi kolumnę o zerowej szerokości; konstrukcja służy do wstawienia dodatkowego opisu (składanego antykwą) umieszczonego przed delimiterem (może nim być jeden z nawiasów `([{}])`); delimiter obejmuje całą wysokość tabeli (p. `block`).
`\Right{delimiter}{tekst}` | tekst i delimiter stanowi kolumnę o zerowej szerokości; konstrukcja służy do wstawienia dodatkowego opisu (składanego antykwą) umieszczonego po delimiterze (może nim być jeden z nawiasów `([{}])`); delimiter obejmuje całą wysokość tabeli (p. `block`).
`\BAenum` | dodatkowa kolumna zawierająca numer kolejny wiersza (szerokość kolumny jest ustalona na `2em` bez względu czy się to komuś podoba czy nie)
`*{n}{parametry}` | n-krotne powtórzenie specyfikacji kolumny np: `*{3}{|c}` jest równoważne `|c|c|c`

Parametry którymi można regulować sposób budowania tabeli:

Polecenie | opis
--- | ---
`\tabcolsep` | połowa szerokości odstępu między kolumnami tablicy (domyślnie 6pt)
`\BAarrayrulewidth` | szerokość pionowej linii separującej kolumny (o ile jest używana -- domyślnie 0.4pt)
`\BAdoublerulesep` | odległość między dwoma liniami pionowymi stanowiącymi separator kolumn (domyślnie 2pt)
`\arraystretch` | ,,mnożnik'' odstępu między wierszami tablicy (np. `\renewcommand{\arraystretch}{1.5}` zwiększa odstęp o 50%)
`\BAextrarowheight` | dodatkowy odstęp między liniami (domyślnie 0pt)
`\BAextraheightafterhline` | dodatkowy odstęp po poziomej linii oddzielającej

Uwaga:
W związku z realizacją tabeli występuje efekt uboczny --- blokowane jest przenoszenie wyrazów (hyphenation) dla pierwszego wyrazu w celi. Efekt możemy wyeliminować wstawiając pustą przestrzeń o długości 0pt na początku celi (wykorzystując możliwości formowania preambuły tabeli) np.
`>{\hspace{0pt}}p{20mm}`

### Obramowania tabeli

W pakiecie jest zdefiniowane polecenie `\BAhhline` umożliwiające uzyskanie ładniejszych wykończeń tabeli:
Wywołanie:
`\BAhhline{parametry}`
na liście parametrów mogą występować następujące symbole:

`=` | podwójna linia o szerokości danej kolumny
`"` | podwójna linia przerywana o szerokości danej kolumny
`-` | pojedyncza linia o szerokości danej kolumny
`.` | pojedyncza linia przerywana o szerokości danej kolumny
`~` | brak linii w danej kolumnie (pozwala zastąpić dyrektywą `\BAhhline` dyrektywę `\cline`)
`|` | linia pionowa przecina (ma priorytet) konstrukcję poziomą
`:` | linia pionowa styka się z podwójną poziomą
`#` | skrzyżowanie podwójnych linii
`t` | górne wykończenie rogu (lewe lub prawe w zależności od sąsiedztwa)
`b` | dolne wykończenie rogu
`*` | powtórzenie sekwencji; np. `*{3}{==#}` jest równoważne `==#==#==#`

Przykład ilustruje różne zestawienia połączeń linii poziomych i pionowych (niekoniecznie poprawnych)

    \begin{blockarray}{||cc||c|c||}
     \BAhhline{|t:==:t:==:t|}
     a & b & c & d\\
     \BAhhline{|:==:|~|~||}
     1 & 2 & 3 & 4\\
     \BAhhline{#==#~|=#}
     i & j & k & l\\
     \BAhhline{||--||--||}
     w & x & y & z\\
     \BAhhline{|:==|:==:|}
     1 & 2 & 3 & 4 \\
     \BAhhline{|:==::=|=:|}
     5 & 6 & 7 & 8 \\
     \BAhhline{|:="::"|=:|}
     9 & 10 & 11 & 12 \\
     \BAhhline{||-|.||.|-||}
     13 & 14 & 15 & 16\\
     \BAhhline{|b:==:b:==:b|}
     \end{blockarray}

### Wstawienie materiału o innej specyfikacji kolumn i delimiterów (`(` , `{`, `[` i `]`, `}`, `)`)

Pakiet udostępnia środowisko `block` (i `block*`) o następującej postaci wywołania:
`\begin{block}{preambuła}
.
.
.
\end{block}`
lub
`\begin{block*}{preambuła}
.
.
.
\end{block*}`
może być ono użyte wyłącznie wewnątrz środowiska `blockarray` (może być wielokrotnie zagnieżdżany) preambuła powinna być zgodna co do liczby kolumn ze specyfikacją kolumn umieszczoną w środowisku `blockarray` (oprócz dostępnych w niej parametrów, dodatkowo mogą wystąpić polecenia `\BAmulticolumn`, obejmujące kilka kolumn tabeli oraz `\BAmultirow` obejmujące wszystkie wiersze zawarte w środowisku `block`). Środowisko umożliwia wstawienie kolumn, które będą inaczej prezentowane niż określa to specyfikacja środowiska `blockarray`. Wszystkie separatory kolumn i kolumny tabeli muszą być redefiniowane. W przypadku użycia konstrukcji nawiasowych w specyfikacji tabeli wersja ,,bezgwiazdkowa'' środowiska umożliwia zdefiniowanie innych konstrukcji nawiasowych (lub rezygnację z nich). W wersji ,,gwiazdkowej'' specyfikacja konstrukcji nawiasowych jest ignorowana (pozostają w mocy specyfikacje środowiska `blockarray`; różnice najlepiej zilustruje przykład:

`\begin{blockarray}{[c|c]c\}} 1111111 & 222222 & 333333 \\ 1 & 2 & 3 \\ \begin{block*}{(ll)l\}} 1111 & 2222 & 3333 \\ 11 & 22 & 33 \\ \end{block*} 1 & 2 & 3 \\ \end{blockarray}` |
`\begin{blockarray}{[c|c]c\}} 1111111 & 222222 & 333333 \\ 1 & 2 & 3 \\ \begin{block}{(ll)l\}} 1111 & 2222 & 3333 \\ 11 & 22 & 33 \\ \end{block} 1 & 2 & 3 \\ \end{blockarray}` |

Przykład użycia polecenia `\BAmulticolumn` wewnątrz preambuły środowiska `block`

`\begin{blockarray}{||l|c|c|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} \begin{block}{||l|l|\BAmulticolumn{2}{r}|l|l||} 1 & 2 & 3 4 & 5 & 6\\ \end{block} \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

Użycie konstrukcji `\BAmultirow` w preambule środowiska `block` wymaga dodatkowego komentarza. Materiał który ma być składany w bloku o wysokości wszystkich wierszy środowiska `block` może być wprowadzany w jednym lub kilku wierszach (w tak określonej kolumnie). Jeżeli jest on podany w kilku wierszach to jedynym efektem jest zachowanie podziału na wiersze (zapis ,,od nowej linii''), będzie on i tak stanowił całość, która będzie pozycjonowana względem środka wysokości wszystkich wierszy.

`\begin{blockarray}{||l|c|c|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} \begin{block}{||l|l|l|l|l|\BAmultirow{1in}||} 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & to jest multirow to jest multirow \\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & to jest multirow to jest multirow \\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & \relax\\ \end{block} \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

Uwaga! zawartość kolumn, które nie zawierają materiału wchodzącego w skład kolumny musi zawierać ,,coś'' np. materiał ,,pusty'' (`\relax`).

Jeśli wysokość składu materiału przekracza wysokość wszystkich wierszy nie wpływa to na wysokość delimiterów kolumn, pojawia się efekt widoczny w poniższym przykładzie

`\begin{blockarray}{||l|c|c|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} \begin{block}{||l|l|l|l|l|\BAmultirow{1in}||} 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & to jest multirow to jest multirow to jest multirow to jest multirow to jest multirow \\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & to jest multirow to jest multirow \\ 1 & 2 & 3 & 4 & 5 & \relax\\ 1 & 2 & 3 & 4 & 5 & \relax\\ \end{block} \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

### Tworzenie nowych typów kolumn

Za pomocą polecenia `\BAnewcolumntype` można tworzyć nowe typy kolumn. Składnia polecenia jest następująca:
`\BAnewcolumntype{nazwa}{definicja}`
lub
`\BAnewcolumntype[n]{nazwa}{definicja}`
gdzie:

nazwa jest jednoliterowym określeniem nowego typu kolumny
definicja określa sposób składu zawartości celi w danej kolumnie np:
`\BAnewcolumntype{c}{>{\hfil}<{\hfil}}`
definiuje kolumnę, w której zawartość celi jest centrowana
n jest liczbą parametrów nowej specyfikacji kolumny np:
`\BAnewcolumntype[1]{t}{>{\rightskip=0pt plus 1fil\vtop\BA@startpbox{#1}}<{\BA@endpbox}}`
definiuje kolumnę analogiczną do `p` ale łamaną w ,,chorągiewkę'' -- parametr określa szerokość składu. Wersja ulepszona, w której również pierwszy wyraz podlega podziałowi wygląda następująco:
`\BAnewcolumntype[1]{x}{>{\rightskip=0pt plus 1fil\vtop\BA@startpbox{#1}\hskip0pt}<{\BA@endpbox}}`

### Łączenie pól tabeli w kolumnie (w pionie)

Pakiet `blkarray` udostępnia polecenie `\BAmultirow`, umożliwiającą łączenie cel tabeli w pionie, podobnie jak pakiet `multirow`, składnia wywołania jest inna; wygląda ona następująco:
`\BAmulticolumn{szerokość}{tekst}`
Składany materiał obejmuje całą wysokość tabeli (jeżeli jest użyte środowisko `block` to materiał będzie powielony (sic!))

`\begin{blockarray}{||l|c|c|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} 1 & 2 & 3 & 4 & 5 & \\ 1 & 2 & 3 & 4 & 5 & \\ \BAmultirow{4cm}{to jest multirow to jest multirow} \\ 1 & 2 & 3 & 4 & 5 & \\ \begin{block}{||l|l|l|l|l|l||} 1 & 2 & 3 & 4 & 5 & 6\\ \end{block} 1 & 2 & 3 & 4 & 5 & \\ 1 & 2 & 3 & 4 & 5 & \\ 1 & 2 & 3 & 4 & 5 & \\ \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

Jeżeli chcemy, aby materiał obejmował jedynie określoną liczbę wierszy (a nie wszystkie wiersze) w danej kolumnie to należy użyć konstrukcji `block` łącząc ją z makroinstrukcją `\BAmultirow` (p. użycie konstrukcji `\BAmultirow` w preambule środowiska `block`).

### Łączenie pól tabeli w wierszu (w poziomie)

Podobnie jak w środowisku `tabular` można uzyskać efekt połączenia kilku cel tabeli w jedną, obejmującą kilka kolumn; służy do tego makroinstrukcja `\BAmulticolumn` -- postać wywołania jest następująca:
`\BAmulticolumn{n}{specyfikacja}{materiał}`
n -- liczba kolumn, którą ma obejmować konstrukcja,
specyfikacja -- określenie składu kolumny, analogicznie jak w specyfikacji kolumn tabeli. Jeśli `\BAmulticolumn` obejmuje pierwszą kolumnę tabeli specyfikacja musi zawierać definicję obramowania z lewej strony. Specyfikację obramowania z prawej strony celi można pominąć, jeśli definicja obramowania kolumny zawarta w specyfikacji tabeli, jest poprzedzona znakiem `&`
materiał określa zawartość celi i będzie składany zgodnie ze specyfikacja

Przykład:
separator podwójnej celi z prawej strony jest zdefiniowany za pomocą znaku `&`

`\begin{blockarray}{||l|c|c&|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} & \BAmulticolumn{2}{c}{a b} & c & d & e\\ \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

W poniższej tabeli brak definicji separatora z prawej strony podwójnej celi

`\begin{blockarray}{||l|c|c|t{1cm}|c|c||} \BAhhline{|t:======:t|} 2s & ss &ss &ss &ss&ss\\ \BAhhline{||------||} & \BAmulticolumn{2}{c}{a b} & c & d & e\\ \BAhhline{||------||} a & b & c & d & e & f\\ \BAhhline{|b:======:b|} \end{blockarray}` |

Makroinstrukcję `\BAmulticolumn` można używać wewnątrz preambuły środowiska `block` (oczywiście bez specyfikacji zawartości celi; p. przykład).

### Wstawienie materiału nie podlegającego podziałowi na kolumny

W pakiecie jest zdefiniowane polecenie `\BAnoalign` umożliwiające wstawienie tekstu, który nie podlega podziałowi na kolumny -- zajmie on szerokość całej tabeli (może być ono użyte wewnątrz środowiska `block`). Składnia wywołania jest następująca:
`\BAnoalign{tekst}`
lub
`\BAnoalign*{tekst}`
Polecenie tworzy ,,dziurę'' w normalnej strukturze tabeli. Wersja ,,gwiazdkowa'' nie powoduje przerwania ciągłości nawiasów separujących (definiowanych konstrukcjami: `(`, `{`, `[` i `]`, `}`, `)`, `\Right` i `Left`) -- niestety z powodu błędu wersja ta jest na ogół bezużyteczna. Ciągłość linii pionowych jest zawsze przerywana.

`\begin{blockarray}{l|c|c|t{1cm}|c|c\}} 2s & ss &ss &ss &ss&ss\\ 2s & ss &ss &ss &ss&ss\\ \BAnoalign{ala ma kota, a kot ma Ale ala ma kota, a kot ma Ale ala ma kota, a kot ma Ale} a & b & c & d & e & f\\ a & b & c & d & e & f\\ \end{blockarray}` |

### Przypisy w tabelach

W tabelach definiowanych za pomocą środowiska `blockarray` można definiować przypisy (za pomocą standardowego polecenie `\footnote`) Standardowo przypisy są umieszczane bezpośrednio pod tabelą i są one numerowane za pomocą polecenia `\fnsymbol`. Użycie polecenia `\BAtablenotesfalse` (zmiana wartości zmiennej logicznej) powoduje, że przypis będzie umieszczony na dole strony (tak jak wszystkie inne przypisy i z użyciem standardowego licznika przypisów). W typ wypadku, jeśli środowisko `blockarray` jest umieszczone wewnątrz środowiska `table` lub `figure` przypisy nie będą prezentowane!).

Wywołanie makroinstrukcji `\BAparfootnotes` powoduje, że przypisy będą składane jako jeden akapit (tylko w przypadku `\BAtablenotestrue`).

Włodzimierz Macewicz

Ostatnie zmiany: 05.05.2014.