将带有“environ”的自定义脚注环境转换为尾注

将带有“environ”的自定义脚注环境转换为尾注

要将脚注转换为尾注,我知道我可以使用endnotes下面显示的命令包。因为我经常有长脚注,所以我使用该environ包为它们创建了一个自定义环境。

我不知道如何将此环境转换为尾注。TeX 给出\BODY未定义的错误。

\documentclass{article}                                                                        

% Dummy text                                                                                   
\usepackage[nopar]{lipsum}                                                                     

% Define a real environment for footnotes                                                      
% But how to convert to endnotes?                                                              
\usepackage{environ}                                                                           
\NewEnviron{Footnote}{\footnote{\BODY}}                                                        

% Convert footnotes to endnotes                                                                
\usepackage{endnotes}                                                                          
\let\footnote=\endnote                                                                         
\AtEndDocument{\theendnotes}                                                                   

\begin{document}                                                                               

\lipsum[1]\footnote{\lipsum[2]}                                                                

\lipsum[3]%                                                                                    
  \begin{Footnote} % Works normally, but not with endnotes conversion                                                                             
  \lipsum[4]                                                                                   

  \lipsum[5]                                                                                   
  \end{Footnote}                                                                               

\end{document}                                                                                 

答案1

让我们看看使用标准\endnote命令会发生什么:

\documentclass{article}
\usepackage{endnotes}

\newcommand{\foo}{foo} % just for the test

\begin{document}

Some text.\endnote{With a \foo{} explanation.}

\end{document}

处理完此文档后,您将找到一个扩展.ent名为

\@doanenote {1}
macro:->With
a
\foo
{}
explanation.
\@endanenote 

你会看到没有发生宏扩展。那么,对于你的代码,测试文件中写入的内容

\documentclass{article}
\usepackage{endnotes}
\usepackage{environ}

\NewEnviron{Footnote}{\footnote{\BODY}}[] % no \ignorespacesafterend
\let\footnote\endnote

\newcommand{\foo}{foo} % just for the test

\begin{document}

Some text.
\begin{Footnote}
With a \foo{} explanation.
\end{Footnote}

\end{document}

.ent文件中

\@doanenote {1}
macro:->\BODY

\@endanenote 

任何Footnote环境都会写入\BODY,但是它未在外部定义Footnote(它加载了当前环境的内容然后被遗忘)并且无论如何定义它都是没用的。

您需要\BODY先扩展它才能被看到\endnote

\NewEnviron{Footnote}{\expandafter\footnote\expandafter{\BODY}}

因此\endnote将采取行动扩张\BODY即环境的内容)。

技术说明。\endnote{Text}基本上,

\def\temp{Text}\immediate\write\endnotefile{\meaning\temp}

使用一些不必要的技巧,例如\@doanenote{<note number>}在开头和\@endanenote结尾添加以及将脚注文本拆分为多行。

相关内容