Problemas estranhos de alinhamento em longtable

Problemas estranhos de alinhamento em longtable

Escrevi alguns ambientes para formatação de casos de uso. Por alguma razão, estou tendo problemas estranhos de alinhamento no meu arquivo longtable. Acho que há algum espaço reservado invisível bagunçando tudo, mas depois de várias horas e removendo todos os espaços desnecessários, não consigo encontrá-lo.

Aqui estão meus ambientes:

\newenvironment{ucflowofevents}{%
\newcommand{\event}[1]{\item{##1}}%
\begin{enumerate}
}{%
\end{enumerate}
}

\newenvironment{ucentryconditions}{%
\newcommand{\cond}[1]{\item{##1}}%
\begin{itemize}
}{%
\end{itemize}
}

\newenvironment{ucexitconditions}{%
\newcommand{\cond}[1]{\item{##1}}%
\begin{itemize}
}{%
\end{itemize}
}

\newenvironment{ucrequirements}{%
\newcommand{\req}[1]{\item{##1}}%
\begin{itemize}
}{%
\end{itemize}
}

\newenvironment{pcusecase}[1]{%
    \newcommand{\row}[3][\hline]{##2 & ##3 \\ ##1}
    \newcolumntype{L}{>{\vspace{-1.0\baselineskip}\flushleft\arraybackslash}p{4cm}}%
    \newcolumntype{R}{>{\vspace{-1.0\baselineskip}\raggedright\arraybackslash}b{10cm}}%
    \newcommand{\giveninitactors}{REQUIRED!!!}%
    \newcommand{\givenevents}{REQUIRED!!!}%
    \newcommand{\givencommswith}{}%
    \newcommand{\givenentries}{}%
    \newcommand{\givenexits}{}%
    \newcommand{\givenreqs}{}%
    \newcommand{\initactors}[1]{\gdef\giveninitactors{##1}}%
    \newcommand{\commswith}[1]{\gdef\givencommswith{##1}}%
    \newcommand{\events}[1]{\gdef\givenevents{\begin{ucflowofevents}##1\end{ucflowofevents}}}%
    \newcommand{\entries}[1]{\gdef\givenentries{\begin{ucentryconditions}##1\end{ucentryconditions}}}%
    \newcommand{\exits}[1]{\gdef\givenexits{\begin{ucexitconditions}##1\end{ucexitconditions}}}%
    \newcommand{\reqs}[1]{\gdef\givenreqs{\begin{ucrequirements}##1\end{ucrequirements}}}%
    \let\givencommswith\empty%
    \let\givenentries\empty%
    \let\givenexits\empty%
    \let\givenreqs\empty%
    \centering%
    \begin{longtable}{|LR|}\hline %
        \row{Use Case:}{#1}
}{%
        \row{Initiating Actors:}{\giveninitactors}%
        \ifx\givencommswith\empty\else \row[]{Communicates With:}{\givencommswith} \fi %\hline %
        \hline\row{Flow of Events:}{\givenevents} %
        \ifx\empty\givenentries\else \row{Entry Conditions:}{\givenentries} \fi %
        \ifx\empty\givenexits\else \row{Exit Conditions:}{\givenexits} \fi %
        \ifx\empty\givenreqs\else \row{Quality Requirements:}{\givenreqs} \fi%
    \end{longtable}%
}

Os quatro primeiros apenas estabelecem listas de fluxo de eventos, condições de entrada e saída e requisitos de qualidade. Mas pcusecaseconfigura o longtable.

Observe as \newcolumntypedefinições:

    \newcolumntype{L}{>{\vspace{-1.0\baselineskip}\flushleft\arraybackslash}p{4cm}}%
    \newcolumntype{R}{>{\vspace{-1.0\baselineskip}\raggedright\arraybackslash}b{10cm}}%

O que eu realmente quero é que ambos estejam alinhados no topo, mas especifiquei bpara a coluna da direita (R) porque exagera o que acontece. Aqui está meu caso de uso:

\begin{pcusecase}{TestUseCase}%
    \initactors{Rider, Admin}%
    \commswith{GPSService}%
    \events{\item{Event 1}%
                    \item{Event 2}}%
    \entries{\cond{Entry Condition 1}%
                     \cond{Entry Condition 2}}%
    \exits{\cond{Exit Condition 1}%
                 \cond{Exit Condition 1}}%
    \reqs{\req{Requirement 1}%
                \req{Requirement 2}
                \req{Requirement 3}}%
\end{pcusecase}

que dá esta saída:

alinhado no topo à esquerda? inferior direito alinhado?

Observe que nas três primeiras linhas, as células da direita estão alinhadas na parte inferior como deveriam, mas nas linhas restantes, as células da esquerda estão alinhadas na parte inferior e as células da direita estão alinhadas na parte superior.

Se eu especificar que a esquerda deve ser alinhada na parte inferior e a direita alinhada na parte superior com

    \newcolumntype{L}{>{\vspace{-1.0\baselineskip}\flushleft\arraybackslash}b{4cm}}%
    \newcolumntype{R}{>{\vspace{-1.0\baselineskip}\raggedright\arraybackslash}p{10cm}}%

Eu entendi isso:

alinhado no topo à esquerda? alinhado na parte inferior direita?

A esquerda está de alguma forma alinhada na parte superior e a direita na parte inferior, mais ou menos. O mais estranho, e provavelmente o que vai dar uma pista para alguém, é quando eu especifico que ambos devem estar alinhados na parte inferior e recebo o seguinte:

O que é isso?

Nas três versões, o alinhamento nas três células superiores esquerdas não mudou. Estou olhando há horas. Preciso de novos olhos sobre isso. Sua ajuda é muito apreciada...

Responder1

Aqui está uma demonstração de como funcionam as opções de alinhamento vertical padrão:

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \newcommand\demobox[1]{%
  \fbox{%
    \begin{minipage}[#1]{.25\textwidth}
      \tikz[baseline=(n.base)]{%
        \node (n) [inner sep=0pt, outer sep=0pt, text width=\linewidth] {Top};
        \draw [red] (n.west |- n.base) -- (n.east |- n.base);}
      \par
      This is a box with some content which should be longer than can be accommodated on one line.
      \par
      \tikz[baseline=(n.base)]{%
        \node (n) [inner sep=0pt, outer sep=0pt, anchor=base, text width=\linewidth] {Bottom};
        \draw [red] (n.west |- n.base) -- (n.east |- n.base);}
    \end{minipage}}}
\demobox{t}
\demobox{b}
\demobox{c}
\end{document}

alinhamentos

As linhas vermelhas marcam as linhas de base da primeira e da última linha de cada um minipage. Como a primeira está alinhada te a segunda com b, a linha de base da primeira linha da primeira e a linha de base da linha final da segunda estão alinhadas. ( cestá apenas para comparação.)

A mesma coisa acontece se o alinhamento for com a linha de base de uma linha de texto normal:

This is a line of regular text across the page. Here we go\dots\par
and some text \demobox{t}
and some more \demobox{b}\par

alinhamentos com texto

A outra complicação é que enumerateos ambientes, por padrão, incluem espaçamento vertical antes do primeiro e depois do último item:

\documentclass{article}
\begin{document}
  \fbox{%
    \parbox[t]{.25\textwidth}{%
      \begin{enumerate}
        \item Item
        \item Item
        \item Item
      \end{enumerate}}} and here is the line of text.
  \fbox{%
    \parbox[t]{.25\textwidth}{%
      Top line of text.\par Next line.\par Bottom line.}}

  \fbox{%
    \parbox[b]{.25\textwidth}{%
      \begin{enumerate}
        \item Item
        \item Item
        \item Item
      \end{enumerate}}} and here is the line of text.
  \fbox{%
    \parbox[b]{.25\textwidth}{%
      Top line of text.\par Next line.\par Bottom line.}}
\end{document}

alinhamentos de enumeração

informação relacionada