% Note that ot-tableau requires arydshln, which must be loaded after longtable \ProvidesPackage{ot-tableau}[2014/09/02] % Package option: notipa \newif\ifottableau@tipa \DeclareOption{tipa}{\ottableau@tipatrue} \DeclareOption{notipa}{\ottableau@tipafalse} % Package option: circledviolations \newif\ifottableau@circledviolations \DeclareOption{circledviolations}{\ottableau@circledviolationstrue} % Package option: shadedcells \newif\ifottableau@shadedcells \DeclareOption{shadedcells}{\ottableau@shadedcellstrue} % Package option: fingerafter \newif\ifottableau@fingerfirst \ottableau@fingerfirsttrue \DeclareOption{fingerafter}{\ottableau@fingerfirstfalse} \ExecuteOptions{tipa} % default is tipa \ProcessOptions\relax \RequirePackage{xstring} \RequirePackage{amssymb} % provides the asterisks \RequirePackage{bbding} % provides \HandRight, etc. \RequirePackage{suffix} \RequirePackage{colortbl} \RequirePackage{arydshln} \RequirePackage{rotating} % IPA typesetting macros \def\ipa#1{#1} \def\ip#1{[#1]} \def\ips#1{/#1/} \ifottableau@tipa \RequirePackage{tipa} % use TIPA for IPA commands: \def\ipa#1{\textipa{#1}} \def\ip#1{[\textipa{#1}]} \def\ips#1{/\textipa{#1}/} \fi % Control package options inline \def\TipaOn{\ottableau@tipatrue} \def\TipaOff{\ottableau@tipafalse} \def\CircledViolationsOn{\ottableau@circledviolationstrue} \def\CircledViolationsOff{\ottableau@circledviolationsfalse} \def\ShadingOn{\ottableau@shadedcellstrue} \def\ShadingOff{\ottableau@shadedcellsfalse} \def\FingerBeforeLetter{\ottableau@fingerfirsttrue} \def\LetterBeforeFinger{\ottableau@fingerfirstfalse} % Custom Markers \newcommand\OptimalMarker{\HandRight} \newcommand\ViolationMarker{$\ast$} \newcommand\CircledViolationMarker{$\circledast$} % OT tableaux \newcounter{tableaurow} % Keep track of whether the optimal candidate is optimal \newif\ifottableau@optimal \def\OptimalOn{\globaldefs=1\ottableau@optimaltrue\globaldefs=0} \def\OptimalOff{\globaldefs=1\ottableau@optimalfalse\globaldefs=0} \newcommand{\Optimal}{\OptimalMarker\OptimalOn} %%%%%%%%%%%%%%%%%%%%%%%%% %% Cell shading commands % Wholly shaded constraint columns must be specified with the s column type \newcolumntype{s}{>{\ShadeTheCell}c} \def\CellShading{0.9} \def\SetCellShading#1{\def\CellShading{#1}} \def\ShadeTheCell{\cellcolor[gray]{\CellShading}} \def\UnshadeTheCell{\cellcolor[gray]{1}} \newif\ifottableau@excl \def\ExclOff{\globaldefs=1\ottableau@exclfalse\globaldefs=0} \def\ExclOn{\globaldefs=1\ottableau@excltrue\globaldefs=0} \newcommand*{\rowletter}{\stepcounter{tableaurow}\alph{tableaurow}. } \newenvironment{tableau}[1]{\setcounter{tableaurow}{0}% \dashlinegap=2pt% \ifottableau@fingerfirst \begin{tabular}{|r@{\hspace{4pt}}l@{\hspace{3pt}}l||#1|} \else \begin{tabular}{|l@{\hspace{2pt}}r@{\hspace{4pt}}l||#1|} \fi% }{\\\hline\end{tabular}} \def\properlines{\ifthenelse{\thetableaurow=0}{\\\hline\hline}{\\\hline}} \newcommand\cand[2][]{\OptimalOff\properlines% \ifottableau@fingerfirst \ipa{#1} \else \rowletter \fi% & \ifottableau@fingerfirst \rowletter \else \ipa{#1} \fi% & \ipa{#2}\ExclOff} \WithSuffix\newcommand\cand*[2][]{\OptimalOff\properlines% \ifottableau@fingerfirst #1 \else \rowletter \fi% & \ifottableau@fingerfirst \rowletter \else #1 \fi% \ExclOff} \def\vio#1{&% \ifottableau@circledviolations \ifottableau@optimal \StrSubstitute{#1}{*}{\CircledViolationMarker} \else \StrSubstitute{#1}{*}{\ViolationMarker} \fi \else \StrSubstitute{#1}{*}{\ViolationMarker} \fi \ifottableau@excl \ifottableau@shadedcells \ShadeTheCell \fi \fi% \ifottableau@excl \empty \else \IfSubStr{#1}{!}{\ExclOn}{\ExclOff} \fi% } \newcommand\inp[1]{\hline\multicolumn{3}{|l||}{#1}} \newcommand\const[1]{&\textsc{#1}\UnshadeTheCell} \WithSuffix\newcommand\const*[1]{\UnshadeTheCell}