
Atualmente estou limpando o código de um livro de 1.000 páginas que contémcentenasdemuito longonotas de rodapé, então decidi movê-las para arquivos separados usando o pacote sepfootnotes. É fácil de usar:
\sepfootnotecontent{label}{The content}
...
\sepfootnote{label}
Como eu disse, as notas de rodapé são muito longas e o arquivo de notas de rodapé é difícil de ler. Usar um ambiente tornaria mais fácil analisar:
\begin{nbp}{label}
The content
\end{nbp}
(“nbp” significa “note de bas de page”, é um documento francês.)
Descobri que o pacote environ facilita “transformar” um comando em um ambiente:
\NewEnviron{nbp}[1]{\sepfootnotecontent{#1}{\BODY}}
Não há erro durante a compilação, mas nada aparece na nota de rodapé:
\begin{nbp}{1}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{1}
Resultado esperado:
Aqui está um exemplo mínimo de trabalho:
\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}
Responder1
Não há necessidade de mudar o interior de sepfootnotes
: um \aftergroup
truque é suficiente.
\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}
Obs: compilei o arquivo com um reduzido \textheight
só para ter uma imagem menor.
Responder2
Existem dois problemas: o marco \sepfootnotecontent
salva seu conteúdo localmente, o que significa que ele é esquecido após o término do ambiente. O segundo problema: a macro \BODY
é salva como conteúdo de nota de rodapé, mas o que você realmente deseja é a primeira expansão \BODY
e não a macro em si.
Com a ajuda do etoolbox
pacote e dele \patchcmd
podemos facilmente criar uma versão global da macro interna \sep@namedef
:
\let\sep@namegdef\sep@namedef
\patchcmd\sep@namegdef{\@namedef}{\global\@namedef}{}{}
Agora precisamos de um equivalente global de \sepfootnotecontent
:
% \gsepfootnoteenvcontent{<content>}{<id>}
\newcommand\gsepfootnoteenvcontent[2]{\sep@namegdef{sepfoot}{#2}{#1}}
Observe a troca dos dois últimos argumentos: isso facilita a expansão da \BODY
macro na próxima etapa antes de passá-la para \sep@namegdef
.
Por último, o ambiente onde \BODY
é expandido antes de ser passado para \gsepfootnoteenvcontent
:
\NewEnviron{nbp}[1]{\expandafter\gsepfootnoteenvcontent\expandafter{\BODY}{#1}}
Um exemplo completo:
\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}