我想编写一个在开头添加边注的环境。问题是我无法控制环境的内容,因此边注的位置变化很大。我怎样才能将命令延迟到第一个文本行,以便文本移动到所需位置?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}