
В настоящее время я чищу код книги объемом 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}