
He escrito algunos entornos para formatear casos de uso. Por alguna razón, tengo problemas extraños de alineación en mi archivo longtable
. Creo que hay un marcador de posición invisible ahí que lo estropea todo, pero después de varias horas y después de eliminar todos los espacios innecesarios, no puedo encontrarlo.
Aquí están mis entornos:
\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}%
}
Los primeros cuatro simplemente establecen listas para el flujo de eventos, las condiciones de entrada y salida y los requisitos de calidad. Pero pcusecase
configura el longtable
.
Observe las \newcolumntype
definiciones:
\newcolumntype{L}{>{\vspace{-1.0\baselineskip}\flushleft\arraybackslash}p{4cm}}%
\newcolumntype{R}{>{\vspace{-1.0\baselineskip}\raggedright\arraybackslash}b{10cm}}%
Lo que realmente quiero es que ambos estén alineados en la parte superior, pero especifiqué b
para la columna de la derecha (R) porque exagera lo que sucede. Aquí está mi 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}
lo que da esta salida:
Observe que para las primeras tres filas, las celdas de la derecha están alineadas hacia abajo como deberían estar, pero para las filas restantes, las celdas de la izquierda están alineadas hacia abajo y las celdas de la derecha están alineadas hacia arriba.
Si especifico que la izquierda debe estar alineada hacia abajo y la derecha hacia arriba con
\newcolumntype{L}{>{\vspace{-1.0\baselineskip}\flushleft\arraybackslash}b{4cm}}%
\newcolumntype{R}{>{\vspace{-1.0\baselineskip}\raggedright\arraybackslash}p{10cm}}%
Entiendo esto:
La izquierda está de alguna manera alineada arriba y la derecha alineada abajo, más o menos. El más extraño, y probablemente el que le dará una pista a alguien, es cuando especifico que ambos deben estar alineados hacia abajo y obtengo esto:
En las tres versiones, la alineación en las tres celdas superiores izquierdas no cambió. He estado mirando durante horas. Necesito algunos ojos nuevos sobre esto. Tu ayuda es muy apreciada...
Respuesta1
A continuación se muestra una demostración de cómo funcionan las opciones de alineación vertical estándar:
\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}
Las líneas rojas marcan las líneas de base de la primera y última línea de cada uno minipage
. Debido a que el primero está alineado con t
y el segundo con b
, la línea base de la primera línea del primero y la línea base de la línea final del segundo están alineadas. ( c
está ahí solo para comparar).
Lo mismo ocurre si la alineación es con la línea base de una línea 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
La otra complicación es que enumerate
los entornos, de forma predeterminada, incluyen espacios verticales antes del primer elemento y después del último:
\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}