%% ot-tableau.sty %% Copyright 2021 Adam Baker % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Adam Baker. % % This work consists of the files ot-tableau.sty and ot-tableau.tex. \ProvidesPackage{ot-tableau}[2023-08-01] % 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: usehhline \newif\ifottableau@usehhline \ottableau@usehhlinefalse % default to false \DeclareOption{usehhline}{\ottableau@usehhlinetrue} % 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} % provides stared commands \RequirePackage{colortbl} % for shading \RequirePackage{rotating} % fancy table and lines % 2021-05-19: Removing hhline, which makes the nice lines, because hhline conflicts with arydshln \ifottableau@usehhline \RequirePackage{hhline} \else \fi \RequirePackage{arydshln} % 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} % Automatic row lettering \newcommand*{\rowletter}{\stepcounter{tableaurow}\alph{tableaurow}. } \newenvironment{tableau}[1]{\setcounter{tableaurow}{0}% \gdef\ConstraintString{#1} \StrSubstitute{#1}{s}{c}[\NoS] \StrCount{\NoS}{c}[\ConstraintCount]% \ifottableau@usehhline \gdef\TopOrBottomLine{\hhline{---||*{\ConstraintCount}{-|}}} \gdef\DoubleLine{\hhline{---||*{\ConstraintCount}{-|}}} \else \gdef\TopOrBottomLine{\hline} \gdef\DoubleLine{\hline\hline} \fi \ifottableau@fingerfirst % finger first: this is the default \expandafter\@firstoftwo \else % finger second \expandafter\@secondoftwo \fi {\begin{tabular}{|r@{\hspace{4pt}}l@{\hspace{3pt}}l||#1|}} % finger first {\begin{tabular}{|l@{\hspace{2pt}}r@{\hspace{4pt}}l||#1|}} % finger second \TopOrBottomLine }{\\\TopOrBottomLine\end{tabular}} % draw two lines after the constraints, one line elsewhere \def\properlines{\ifthenelse{\thetableaurow=0}% {\\\DoubleLine}% {\\\TopOrBottomLine}} \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} % add multi-input candidates (added by Alan Munn 2023/08/01) \newcommand\mcand[2][]{\OptimalOff\properlines% \ifottableau@fingerfirst \ipa{#1} \fi% & \ifottableau@fingerfirst \else \ipa{#1} \fi% & \ipa{#2}\ExclOff} \WithSuffix\newcommand\mcand*[2][]{\OptimalOff\properlines% \ifottableau@fingerfirst #1 \fi% & \ifottableau@fingerfirst \else #1 \fi% \ExclOff} % add starred version of \vio to remove vertical lines for initial multi-input candidates % (added by Alan Munn 2023/08/01) \NewDocumentCommand{\vio}{sm}{ \IfBooleanTF{#1} {&\multicolumn{1}{c}{#2}} {&% \ifottableau@circledviolations \ifottableau@optimal \StrSubstitute{#2}{*}{\CircledViolationMarker} \else \StrSubstitute{#2}{*}{\ViolationMarker} \fi \else \StrSubstitute{#2}{*}{\ViolationMarker} \fi \ifottableau@excl \ifottableau@shadedcells \ShadeTheCell \fi \fi% \ifottableau@excl \empty \else \IfSubStr{#2}{!}{\ExclOn}{\ExclOff} \fi% } } \newcommand\inp[1]{\multicolumn{3}{|l||}{#1}} \newcommand\const[1]{&\textsc{#1}\UnshadeTheCell} \WithSuffix\newcommand\const*[1]{\UnshadeTheCell}