避免扩展 `\marginpar` 参数

避免扩展 `\marginpar` 参数

我正在尝试制作一个边距,它将显示一些宏定义的值marginpar 的放置点(可以将其视为\footnotemarkvs之类的东西\footnotetext)。

但是,该\marginpar命令似乎完全扩展了它的参数,并且我无法通过任何\noexpand和类似的组合获得所需的行为。

以下是一个小例子:

\documentclass{article}

\begin{document}

\def\mymacro{Content}
Some text. \marginpar{\mymacro}

\def\mymacro{Other content}

Some other text.

\end{document}

这里我想让 marginpar 显示文本“其他内容”。如果我在参数中放入\noexpandbefore ,则根本不会出现 marginpar,这很奇怪。\mymacro\marginpar

当然,定义必须有一个限制,因为我不能将扩展延迟到页面输出代码的执行时间之外(尽管我对该机制的工作原理并不十分了解)。但在这个例子中,我希望这是可能的。

是否有可能\marginpar不立即扩展其论点?

答案1

浮动元素和脚注等边距元素在输入时会完全排版,就像\savebox它们被放置在页面上一样\usebox,只是复制了排版格式的列表,此时不会发生扩展

如果你把\noexpand宏放在前面,那么你就有

\marginpar{\noexpand\mymacro}

这与

\marginpar{\relax}

所以你得到一个空的 marginpar。(但它实际上在那里,LaTeX 仍然费尽心思把它放在边距中,但它没有内容)

与往常一样,如果您希望文本依赖于最终排版的页面的前向引用,那么您可以使用或滥用\label/\ref

在此处输入图片描述

\documentclass{article}

\begin{document}



Some text. \marginpar{\ref{foo}}

{\makeatletter\def\@currentlabel{Other content}\label{foo}}

Some other text.

\end{document}

相关内容