Transformar \sepfootnotecontent en un entorno

Transformar \sepfootnotecontent en un entorno

Actualmente estoy limpiando el código de un libro de 1000 páginas que contienecientosdemuy largonotas al pie, así que decidí moverlas a archivos separados usando el paquete sepfootnotes. Es fácil de usar:

\sepfootnotecontent{label}{The content}
...
\sepfootnote{label}

Como dije, las notas al pie son muy largas y el archivo de notas al pie es difícil de leer. Usar un entorno facilitaría el análisis:

\begin{nbp}{label}
The content
\end{nbp}

(“nbp” significa “note de bas de page”, es un documento francés).

Descubrí que el paquete ambiental facilita "convertir" un comando en un entorno:

\NewEnviron{nbp}[1]{\sepfootnotecontent{#1}{\BODY}}

No hay ningún error durante la compilación pero no aparece nada en la nota al pie:

\begin{nbp}{1}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{1}

Contenido de notas a pie de página que desaparece

Rendimiento esperado:

Rendimiento esperado

Aquí hay un ejemplo de trabajo mínimo:

\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}

Respuesta1

No es necesario cambiar el interior : basta con sepfootnotesun truco.\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}

Nota: Compilé el archivo reducido \textheightsolo para tener una imagen más pequeña.

ingrese la descripción de la imagen aquí

Respuesta2

Hay dos problemas: el marco \sepfootnotecontentguarda su contenido localmente, lo que significa que se olvida una vez finalizado el entorno. El segundo problema: la macro \BODYse guarda como contenido de nota al pie, pero lo que realmente desea es la primera expansión \BODYy no la macro en sí.

Con la ayuda del etoolboxpaquete \patchcmdpodemos crear fácilmente una versión global de la macro interna \sep@namedef:

\let\sep@namegdef\sep@namedef
\patchcmd\sep@namegdef{\@namedef}{\global\@namedef}{}{}

Ahora necesitamos un equivalente global de \sepfootnotecontent:

% \gsepfootnoteenvcontent{<content>}{<id>}
\newcommand\gsepfootnoteenvcontent[2]{\sep@namegdef{sepfoot}{#2}{#1}}

Tenga en cuenta el intercambio de los dos últimos argumentos: esto hace que sea más fácil expandir la \BODYmacro en el siguiente paso antes de pasarla a \sep@namegdef.

Por último, el entorno donde \BODYse expande antes de pasar a \gsepfootnoteenvcontent:

\NewEnviron{nbp}[1]{\expandafter\gsepfootnoteenvcontent\expandafter{\BODY}{#1}}

Un ejemplo 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}

información relacionada