
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 pcusecase
configura o longtable
.
Observe as \newcolumntype
definiçõ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 b
para 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:
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:
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:
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}
As linhas vermelhas marcam as linhas de base da primeira e da última linha de cada um minipage
. Como a primeira está alinhada t
e 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. ( c
está 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
A outra complicação é que enumerate
os 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}