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.

