[Tex/LaTex] Aligning a marginpar with a line box inside a list

marginparvertical alignment

I'd like to write a LaTeX environment that automatically places a \marginpar next to the first line of text within. However, that first line of text might not be part of an ordinary paragraph; it can be something like a list item.

In order for the \marginpar to align with the first line of an ordinary paragraph, I have to use \leavevmode to ensure that the \marginpar is placed in the same line box as the text that follows it; otherwise it's positioned too high. But if what follows is a list, this just creates a blank line for the \marginpar to align with, and the list goes below it.

This example illustrates the problem:

\documentclass{article}
\usepackage{geometry}
\geometry{reversemarginpar}

\newenvironment{category}{
  \leavevmode\marginpar{\raggedleft Label}
}{}

\begin{document}
  \begin{category}
    Lorem ipsum dolor sit amet.
  \end{category}

  \begin{category}
    % Label is aligned with this line.
    \begin{itemize}
      \item Item 1
      \item Item 2
      \item Item 3
    \end{itemize}
  \end{category}
\end{document}

The second category's label is positioned next to the blank line where the commented-out text would appear if it were uncommented. I'd like it to appear next to the line that says "Item 1" instead.

I believe this happens because the itemize list begins with something (probably a \par) that terminates the current line box and begins a new one. If I could tell TeX to inject the \marginpar into the beginning of the next line box it creates, rather than creating one explicitly with \leavevmode, I think that would resolve the problem. But I don't know how to do that.

Is there a way to make this work?

Update: After further consideration, this doesn't necessarily need to be a \begin{category} environment. I'm actually using this in a custom document class that consists entirely of a sequence of categories, so it may make more sense to just define a \category command that's used like the \chapter command in other classes. The desired output is the same, though.

Update 2: Can I create something analogous to \llap in vertical mode? I tried \vbox to 0pt{\vss X}\nointerlineskip hoping that the X would overlap with the line of text that follows, but it doesn't. If I can create a line box that overlaps the material below it, I can use that to position the \marginpar so it aligns with the "real" line box that's created later.

Best Answer

Instead of the standard \marginpar command, you could use \marginnote from the marginnote package, and change the nesting order of your environment and the itemize:

\documentclass{article}
\usepackage{geometry}
\usepackage{marginnote}
\geometry{reversemarginpar}

\newenvironment{category}{
  \marginnote{\raggedleft Label}
}{}

\begin{document}

\begin{category}
    Lorem ipsum dolor sit amet.
\end{category}

\begin{itemize}
  \item \begin{category} Item 1
  \item Item 2
  \item Item 3
  \end{category}
\end{itemize}

\end{document}

Related Question