如何延迟命令执行直到下一个 hmode?

如何延迟命令执行直到下一个 hmode?

我想编写一个在开头添加边注的环境。问题是我无法控制环境的内容,因此边注的位置变化很大。我怎样才能将命令延迟到第一个文本行,以便文本移动到所需位置?lualatex 解决方案可以(而且很有趣)。

\documentclass{article}
\usepackage{marginnote}
\newenvironment{myenv}{\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}Text}}{}
\begin{document}

\begin{myenv}
abc
\end{myenv}

\begin{myenv}
\vspace{2cm}
abc\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}wanted pos}
\end{myenv}


\begin{myenv}
\begin{enumerate}
 \item abc\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}wanted pos}
\end{enumerate}
\end{myenv}
\end{document}

答案1

这仅使用本地设置,因此如果下一段从本地组开始,可能会出错,因为无法正确恢复。这是可以修复的,但这显示了基本思想...

在此处输入图片描述

\documentclass{article}
\usepackage{marginnote}

\let\zzeverypar\everypar
\newtoks\everypar
\zzeverypar{\the\everypar}

\newenvironment{myenv}{%
\ifvmode
\zzeverypar\expandafter{\the\zzeverypar\zzeverypar{\the\everypar}\z}%
\else
\z
\fi
}
{}

\def\z{\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}Text}}
\begin{document}

\begin{myenv}
abc
\end{myenv}

\begin{myenv}
\vspace{2cm}
abc\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}wanted pos}
\end{myenv}


\begin{myenv}
\begin{enumerate}
 \item abc\marginnote{\makebox[0pt][r]{\rule{\textwidth}{0.4pt}}wanted pos}
\end{enumerate}
\end{myenv}
\end{document}

相关内容