我目前正在清理一本 1000 页的书的代码,其中包含数百的很长脚注,所以我决定使用 sepfootnotes 包将它们移动到单独的文件中。使用起来很容易:
\sepfootnotecontent{label}{The content}
...
\sepfootnote{label}
正如我所说,脚注很长,脚注文件很难阅读。使用环境可以使其更容易解析:
\begin{nbp}{label}
The content
\end{nbp}
(“nbp” 代表“note de bas de page”,它是一份法语文件。)
我发现 environ 包可以轻松地将命令“转换”为环境:
\NewEnviron{nbp}[1]{\sepfootnotecontent{#1}{\BODY}}
编译时没有错误,但是脚注中没有任何内容:
\begin{nbp}{1}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{1}
预期输出:
这是一个最小的工作示例:
\documentclass{article}
\usepackage{environ}
\usepackage{sepfootnotes}
\NewEnviron{nbp}[1]{\sepfootnotecontent{#1}{\BODY}}
\begin{document}
\sepfootnotecontent{works}{dolor sit amet.}
\begin{nbp}{doesntwork}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{works}\sepfootnote{doesntwork}
\end{document}
答案1
不需要改变内部结构sepfootnotes
:一个\aftergroup
技巧就足够了。
\documentclass{article}
\usepackage{environ}
\usepackage{sepfootnotes}
\NewEnviron{nbp}[1]{%
\xdef\nbptemp{{#1}{\unexpanded\expandafter{\BODY}}}%
\aftergroup\donpb
}
\newcommand{\donpb}{\expandafter\sepfootnotecontent\nbptemp}
\begin{document}
\sepfootnotecontent{works}{Dolor sit amet.}
\begin{nbp}{doesntwork}
Again dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{works}\sepfootnote{doesntwork}
\end{document}
注意:我以缩小的形式编译了文件,\textheight
只是为了得到更小的图像。
答案2
有两个问题:宏\sepfootnotecontent
在本地保存其内容,这意味着在环境结束后它会被遗忘。第二个问题:宏\BODY
被保存为脚注内容,但您真正想要的是它的第一次扩展\BODY
,而不是宏本身。
借助该etoolbox
包及其帮助,\patchcmd
我们可以轻松创建内部宏的全局版本\sep@namedef
:
\let\sep@namegdef\sep@namedef
\patchcmd\sep@namegdef{\@namedef}{\global\@namedef}{}{}
现在我们需要一个全局等价的\sepfootnotecontent
:
% \gsepfootnoteenvcontent{<content>}{<id>}
\newcommand\gsepfootnoteenvcontent[2]{\sep@namegdef{sepfoot}{#2}{#1}}
注意最后两个参数的交换:这使得\BODY
在将宏传递给之前在下一步中更容易扩展宏\sep@namegdef
。
最后,环境 where 在\BODY
传递给之前被扩展\gsepfootnoteenvcontent
:
\NewEnviron{nbp}[1]{\expandafter\gsepfootnoteenvcontent\expandafter{\BODY}{#1}}
完整示例:
\documentclass{article}
\usepackage{environ,etoolbox}
\usepackage{sepfootnotes}
\makeatletter
% \gsepfootnoteenvcontent{<content>}{<id>}
\newcommand\gsepfootnoteenvcontent[2]{\sep@namegdef{sepfoot}{#2}{#1}}
\let\sep@namegdef\sep@namedef
\patchcmd\sep@namegdef{\@namedef}{\global\@namedef}{}{}
\makeatother
\NewEnviron{nbp}[1]{\expandafter\gsepfootnoteenvcontent\expandafter{\BODY}{#1}}
\begin{document}
\sepfootnotecontent{works}{dolor sit amet.}
\begin{nbp}{doesntwork}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{works}\sepfootnote{doesntwork}
\end{document}