我正在尝试使用宏的内容\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 中显示为
- 晚安。
- 晚安。
而不是预期的
- 早上好。
- 晚安。
有什么方法可以扩展宏吗\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}
会做正确的事。