我想编写一个 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}