将 marginpar 与列表内的线框对齐

将 marginpar 与列表内的线框对齐

我想编写一个 LaTeX 环境,自动将 放在\marginpar第一行文本旁边。但是,第一行文本可能不是普通段落的一部分;它可能是一个列表项。

为了\marginpar普通的段落,我必须使用 来\leavevmode确保\marginpar放置在与它后面的文本相同的行框中;否则它的位置太高了。但如果后面是列表,这只会创建一个空白的\marginpar进行对齐,列表位于其下方。

此示例说明了该问题:

\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}

第二个类别的标签位于空白行旁边,如果取消注释,注释掉的文本将出现在该空白行旁边。我希望它出现在显示“项目 1”的行旁边。

我认为发生这种情况的原因是itemize列表以某个东西(可能是\par)开头,它终止了当前的行框并开始了一个新行框。如果我可以告诉 TeX 将 注入\marginpar到它创建的下一个行框的开头,而不是使用 明确创建一个行框\leavevmode,我认为这可以解决问题。但我不知道该怎么做。

有没有什么办法可以让它工作?

更新: 经过进一步考虑,这不一定需要是一个\begin{category}环境。我实际上是在一个完全由一系列类别组成的自定义文档类中使用它,因此定义一个像其他类中的命令\category一样使用的命令可能\chapter更有意义。不过,所需的输出是相同的。

更新 2: 我可以创建类似于\llap垂直模式的东西吗?我尝试\vbox to 0pt{\vss X}\nointerlineskip希望 X 会与后面的文本行重叠,但事实并非如此。如果我可以创建一个与其下方材料重叠的线框,我可以使用它来定位,使其\marginpar与稍后创建的“真实”线框对齐。

答案1

除了标准命令之外,\marginpar您还可以使用\marginnote边注包,并更改环境的嵌套顺序和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}

相关内容