在 \pagenote 中立即展开宏

在 \pagenote 中立即展开宏

我正在尝试使用宏的内容\pagenote,使用memoir类:

\documentclass{memoir}
\makepagenote

\def\myvar{Good morning.}

\begin{document}

In the morning\pagenote{\myvar}

\def\myvar{Good night.}

At night\pagenote{\myvar}

\printpagenotes
\end{document}

但是,\myvar会逐字写入.ent文件且不会展开。因此,页面注释在最终 PDF 中显示为

  1. 晚安。
  2. 晚安。

而不是预期的

  1. 早上好。
  2. 晚安。

有什么方法可以扩展宏吗\pagenote

答案1

有几个问题需要解决。该\pagenote命令的建立正是为了避免扩展其论证。因此,一个“幼稚”的定义,如

\newcommand{\xpagenote}[1]{%
  \begingroup\protected@edef\x{\endgroup\noexpand\pagenote{#1}}\x}

应该将参数中所有可扩展的内容展开为\xpagenote,传递由此获得的标记列表,这是处理这种情况的标准方法,但不起作用,因为在尾注文件中,每个空格都会更改为换行符,并且有在输入如下内容的情况下

\xpagenote{\textbf{\myvar}}

稍微复杂一点的方法似乎有效:

\documentclass{memoir}

\makepagenote

\makeatletter
\newcommand{\xpagenote}[1]{%
  \unskip\begingroup\protected@edef\x{\endgroup\noexpand\pagenote{#1}}%
  \scantokens\expandafter{\x\relax}}
\makeatother

\def\myvar{Good morning.}

\begin{document}

In the morning\xpagenote{Something with ``\myvar''}

\def\myvar{Good night.}

At night\xpagenote{``\textbf{\myvar}''}

\printpagenotes

\end{document}

传递\scantokens再次将多个空格减少为单个空格标记;最后一个\relax用于抑制由 添加的最后一个空格\scantokens

在此处输入图片描述

如果您的\pagenote命令包含仅有的变量,一种更简单的方法有效:

\newcommand{\sxpagenote}[1]{\expandafter\pagenote\expandafter{#1}}

\sxpagenote{\myvar}会做正确的事。

相关内容