将 \sepfootnotecontent 转换为环境

将 \sepfootnotecontent 转换为环境

我目前正在清理一本 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}

相关内容