
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}
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 sepfootnotes
un 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 \textheight
solo para tener una imagen más pequeña.
Respuesta2
Hay dos problemas: el marco \sepfootnotecontent
guarda su contenido localmente, lo que significa que se olvida una vez finalizado el entorno. El segundo problema: la macro \BODY
se guarda como contenido de nota al pie, pero lo que realmente desea es la primera expansión \BODY
y no la macro en sí.
Con la ayuda del etoolbox
paquete \patchcmd
podemos 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 \BODY
macro en el siguiente paso antes de pasarla a \sep@namegdef
.
Por último, el entorno donde \BODY
se 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}