Преобразовать \sepfootnotecontent в среду

Преобразовать \sepfootnotecontent в среду

В настоящее время я чищу код книги объемом 1000 страниц, содержащейсотниизочень длинныйсноски, поэтому я решил переместить их в отдельные файлы с помощью пакета sepfootnotes. Он прост в использовании:

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

Как я уже сказал, сноски очень длинные, а файл сносок трудно читать. Использование окружения облегчило бы разбор:

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

(«nbp» означает «note de bas de page», это французский документ.)

Я обнаружил, что пакет environ позволяет легко «превратить» команду в среду:

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

При компиляции ошибок нет, но в сноске ничего не отображается:

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

Исчезающее содержимое сноски

Ожидаемый результат:

Ожидаемый результат

Вот минимальный рабочий пример:

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

решение1

Нет необходимости менять внутренности sepfootnotes: \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}

Примечание: Я скомпилировал файл с уменьшенным размером, \textheightчтобы изображение было меньше.

введите описание изображения здесь

решение2

Есть две проблемы: marco \sepfootnotecontentсохраняет свое содержимое локально, что означает, что оно забывается после завершения среды. Вторая проблема: макрос \BODYсохраняется как содержимое сноски, но на самом деле вам нужно первое расширение \BODY, а не сам макрос.

С помощью пакета etoolboxи его компонентов \patchcmdмы можем легко создать глобальную версию внутреннего макроса \sep@namedef:

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

Теперь нам нужен глобальный эквивалент \sepfootnotecontent:

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

Обратите внимание на замену последних двух аргументов: это упрощает расширение макроса \BODYна следующем шаге перед его передачей в \sep@namegdef.

Последняя среда, в которую \BODYона переходит, расширяется перед передачей \gsepfootnoteenvcontent:

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

Полный пример:

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

Связанный контент