Alinhando colchetes matemáticos em AVMs

Alinhando colchetes matemáticos em AVMs

Quero compor AVMs. Um colega escreveu o código a seguir e funciona muito bem. No entanto, há um pequeno problema com os colchetes. Alguns deles não estão alinhados corretamente. Por exemplo, o segundo colchete de fechamento é muito baixo:

insira a descrição da imagem aqui

Este é o código. \ms verifica se um tipo (definido em itálico) é fornecido como argumento opcional ou não.

\documentclass{article}


\usepackage{array}

\setlength{\extrarowheight}{1pt}

\def\ms{\futurelet\msLook\msdecide}
\def\msdecide{\ifx\msLook[\let\next=\xxtms%
\else\let\next=\xxms\fi\next}
%
\def\xxtms[#1]#2{%
\mbox{%
\tabcolsep0pt\arraycolsep0pt%
$%
\left[%
\begin{tabular}{>{\upshape\scshape}l@{\hspace{5pt}}>{\normalfont\itshape}l}%
#2%
\multicolumn{2}{>{\normalfont\itshape}l}{#1}%
\end{tabular}%
\right]%
$%
}%
\vspace{1mm}%
}

\def\xxms#1{%
\mbox{%
\tabcolsep0pt\arraycolsep0pt%
$%
\left[%
\begin{tabular}{>{\upshape\scshape}l@{\hspace{5pt}}>{\normalfont\itshape}l}%
#1%
\end{tabular}%
\rule{0mm}{5mm}%
\right]%
$%
}%
\vspace{1mm}%
}

\begin{document}

\ms[word]{
syntax-semantics & \ldots \ms[local]{ category  & \ms[category]{ head & \ms[noun]{ case & 1\\
                                                                                               }\\[6mm]
                                                                               subcat & Det[\textsc{case}~1] \\
                                                                             } \\[6mm]
                                          content & \ldots \ms[grammatik]{ inst & X \\
                                                                                    }\\
            }\\
}



\end{document}

Editar:

Parece haver um problema com casos como este:

\ms{
synsem$|$loc$|$cat \ms{ head & \ms[verb]{vform & fin
                                       }\\
                        subcat & \ldots\\
                      }
}

A saída é semelhante a esta:

insira a descrição da imagem aqui

O problema é que há muito espaço entre os dois colchetes mais à direita.

Responder1

Você provavelmente deseja definir \delimiterfactor=1000e \delimitershortfall=0pt, para garantir que os delimitadores sempre cubram a matriz.

Alterei o código para \msevitar duplicação de código; também não é necessário (e errado, agora) encerrar o argumento \mscom \\.

\documentclass{article}

\usepackage{array}

\setlength{\extrarowheight}{1pt}

\makeatletter
\newcommand{\ms}[2][]{%
  \mbox{%
    \delimiterfactor=1000 \delimitershortfall=0pt
    \tabcolsep=0pt
    $\left[%
    \begin{tabular}{>{\upshape\scshape}l@{\hspace{5pt}}>{\normalfont\itshape}l}
    #2%
    \if\relax\detokenize{#1}\relax\else
     \\ \multicolumn{2}{>{\normalfont\itshape}l}{#1}%
    \fi
    \end{tabular}%
    \right]$%
  }%
  \vspace{1mm}%
}

\begin{document}

\ms[word]{
  syntax-semantics & \ldots 
  \ms[local]{
    category &
    \ms[category]{
      head & \ms[noun]{ case & 1 }
      \\[6mm]
      subcat & Det \ms{ case & 1 }
    }
    \\[6mm]
    content & \ldots \ms[grammatik]{ inst & X }
  }
}

\end{document}

Há um problema com \msobjetos de uma linha (deixei um apenas para mostrá-lo). A solução não seria usar \msneste caso, mas \textup[deveria \textup]ser usada para os colchetes.

insira a descrição da imagem aqui

informação relacionada