我正在尝试制作一个边距,它将显示一些宏定义的值后marginpar 的放置点(可以将其视为\footnotemark
vs之类的东西\footnotetext
)。
但是,该\marginpar
命令似乎完全扩展了它的参数,并且我无法通过任何\noexpand
和类似的组合获得所需的行为。
以下是一个小例子:
\documentclass{article}
\begin{document}
\def\mymacro{Content}
Some text. \marginpar{\mymacro}
\def\mymacro{Other content}
Some other text.
\end{document}
这里我想让 marginpar 显示文本“其他内容”。如果我在参数中放入\noexpand
before ,则根本不会出现 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}