Transforme \sepfootnotecontent em um ambiente

Transforme \sepfootnotecontent em um ambiente

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}

Conteúdo de nota de rodapé desaparecendo

Resultado esperado:

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 \aftergrouptruque é 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 \textheightsó para ter uma imagem menor.

insira a descrição da imagem aqui

Responder2

Existem dois problemas: o marco \sepfootnotecontentsalva 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 \BODYe não a macro em si.

Com a ajuda do etoolboxpacote e dele \patchcmdpodemos 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 \BODYmacro 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}

informação relacionada