I'm trying to align the baseline of the first line of a list environment with the baseline of a box. After working on this in various forms, I thought I was ready to tackle this issue. I also thought I was making good progress. But testing my approach in various situations has revealed that I'm still missing something.
I'm feeling a bit sheepish about asking yet another question about lengths and vertical alignment. But after working on this over the past 24 hours, I feel I'm out of ideas of what to do next.
My MWE consists of three parts:
- A file,
newlist.tex
, which defines a new environment to facilitate aligning a listing environment with a box's baseline, - A file,
showandtell.tex
, which contains several macros designed to help show the heights and values involved, - And the file to wrap around the MWE.
The file newlist.tex
\makeatletter
%% A box to line up against
\newsavebox{\aeQuickBox}
\def\aeQuick{\savebox{\aeQuickBox}{Tq \rule[-2ex]{0.1pt}{3ex}jay}%%'
\usebox{\aeQuickBox}%%'
\setlength{\dp\aeQuickBox}{\dp\aeQuickBox}}
%% THE STRUT
\newlength{\ae@strut@ht}
\setlength{\ae@strut@ht}{0.7\baselineskip}
\newcommand{\aestrut}{\makebox[0pt][r]{\rule{2pt}{\ae@strut@ht}}}
%% MY LIST
%% new lengths created for access outside of environment
\newlength{\ae@enum@topsep}
\newlength{\ae@enum@partopsep}
\newlength{\ae@enum@parsep}
\newlength{\ae@enum@parskip}
\newenvironment{alignedenum}
{\begingroup
\begin{list}
{\bfseries\textbullet}
{%% horizontal dimensions
\setlength{\labelwidth}{1.5em}%%'
\setlength{\labelsep}{0.5em}%%'
\setlength{\itemindent}{0em}%%'
\setlength{\leftmargin}{\dimexpr
\wd\aeQuickBox + 0.5em
+\labelwidth +\labelsep -\itemindent
\relax}%%'
%% vertical dimensions
%% test whether `\partopsep` has been added
\ifvmode
\global\setlength{\ae@enum@partopsep}{\partopsep}%%'
\else
\global\setlength{\ae@enum@partopsep}{0pt}%%'
\fi
%% next is true only if this environment is within another list
\ifnum\@listdepth>1\relax
\global\setlength{\ae@enum@topsep}{\topsep}%%'
\else
\global\setlength{\ae@enum@topsep}{0pt}
\fi
\global\setlength{\ae@enum@parsep}{\parsep}%%'
}%%'
%% set \ae@enum@parskip here because wrong value of `\parskip` is
%% called within arguments to `list` environment.
\global\setlength{\ae@enum@parskip}{\parskip}%%"
%% avoid `\lineskip` if being aligned with a very deep box
\nointerlineskip
\myremovevspace
}
{\end{list}\endgroup}
%% VERTICAL SPACE REMOVAL
\newcommand{\myremovevspace}
{%%\par\nointerlineskip
\vspace{%%'
-\dimexpr
\ae@strut@ht
+\ae@enum@topsep
+\ae@enum@partopsep
+\ae@enum@parsep
+\ae@enum@parskip
+\dp\aeQuickBox
\relax}}
\makeatother
The file showandtell.tex
\usepackage{xcolor}
\makeatletter
%% cumulative lengths for stacking and making lengths visible
\newlength{\ae@tmp@dim@a}
\newlength{\ae@tmp@dim@b}
\newlength{\ae@tmp@dim@c}
\newlength{\ae@tmp@dim@d}
%% COLORS
%% orange = strut height
%% blue = topsep
%% gray = parskip + parsep
%% red = aeQucikBox depth
\newcommand{\aeStackLengths}
{\bgroup
%%'----------------------------------------------------------------------
\setlength{\ae@tmp@dim@a}{0pt}%%%'
\setlength{\ae@tmp@dim@b}{\dimexpr\ae@tmp@dim@a+\ae@strut@ht\relax}%%'
\setlength{\ae@tmp@dim@c}{\dimexpr\ae@tmp@dim@b+\ae@enum@topsep}%%'
\setlength{\ae@tmp@dim@d}{\dimexpr\ae@tmp@dim@c+\dimexpr\ae@enum@parskip+\ae@enum@parsep+\ae@enum@partopsep}%%'
%%'----------------------------------------------------------------------
\color{orange!80}%%'
\raisebox{\ae@tmp@dim@a}[0pt][0pt]{\makebox[0pt][l]{\rule{3pt}{\ae@strut@ht}}}%%'
\color{blue!70}%%'
\raisebox{\ae@tmp@dim@b}[0pt][0pt]{\makebox[0pt][l]{\rule{3pt}{\ae@enum@topsep}}}%%'
\color{gray!50}%%'
\raisebox{\ae@tmp@dim@c}[0pt][0pt]{\makebox[0pt][l]{\rule{3pt}{\dimexpr\ae@enum@parskip+\ae@enum@parsep+\ae@enum@partopsep}}}%%'
\color{red}%%'
\raisebox{\ae@tmp@dim@d}[0pt][0pt]{\makebox[0pt][l]{\rule{3pt}{\dp\aeQuickBox}}}%%'
\egroup
}
%%--------------------------------------------------------------------------
%% VISUALLY REP FOR DIMS
%%--------------------------------------------------------------------------
%% show baseline
\newcommand{\aeshowbaseline}{\makebox[0pt][l]{\color{blue}\rule{0.1pt}{1ex}\rule{2in}{0.1pt}}}
%% show depth
\newcommand{\aeshowdepth}{\makebox[0pt][r]{%%'
\color{red}%%'
\rule[-\dp\aeQuickBox]{2.25in}{0.1pt}%%'
\rule[-\dp\aeQuickBox]{0.1pt}{\dp\aeQuickBox}%%'
\makebox[0pt][l]{\rule[-\dp\aeQuickBox]{1.5in}{0.1pt}}%%'
}}
%%--------------------------------------------------------------------------
%% SHOW VALUES FOR DIMS
%%--------------------------------------------------------------------------
\usepackage{pgffor}
\newcommand\aeshowbox[1]
{\begin{minipage}[t]{2in}\tiny\ttfamily
\foreach \x in {#1}{ \makebox[1cm][r]{\x} = \the\csname \x\endcsname\\ }
\end{minipage}}
\def\aeshowLengths{\aeshowbox{topsep,partopsep,parsep,parskip,%%'
ae@enum@topsep,ae@enum@partopsep,ae@enum@parsep,ae@enum@parskip}}
\makeatother
The wrapper file:
\documentclass{article}
\input{newlist}
\input{showandtell}
\usepackage{lipsum}
\begin{document}
\noindent
\aeshowbaseline\aeQuick \par
\begin{alignedenum}
\item \aestrut\aeStackLengths\aeshowbaseline\, My first line: \aeshowLengths
\item second line
\end{alignedenum}
\begin{enumerate}
\item \aeshowbaseline\aeQuick
\begin{alignedenum}
\item \aestrut\aeStackLengths\aeshowbaseline\, My first line: \aeshowLengths
\item second line
\end{alignedenum}
\end{enumerate}
\begin{enumerate}
\item \verb=\par= inserted
\begin{enumerate}
\item \aeshowbaseline\aeQuick \par
\begin{alignedenum}
\item \aestrut\aeStackLengths\aeshowbaseline\, My first line: \aeshowLengths
\item second line
\end{alignedenum}
\end{enumerate}
\end{enumerate}
\begin{enumerate}
\item No \verb=\par= inserted
\begin{enumerate}
\item \aeshowbaseline\aeQuick
\begin{alignedenum}
\item \aestrut\aeStackLengths\aeshowbaseline\, My first line: \aeshowLengths
\item second line
\end{alignedenum}
\end{enumerate}
\end{enumerate}
\end{document}
These produce:
As seen from the image, everything seems to be working fine until I've buried my new environment within two other lists.
I don't understand how I've not taken into account all the space. I'm also finding it difficult to locate the documentation for how the various parameters are set at each list level. I can't find much of anything useful in source2.pdf
.