
Ich bin gerade dabei, den Code eines 1000-seitigen Buches zu bereinigen, das enthältHundertevonsehr langFußnoten, also habe ich beschlossen, sie mit dem Paket sepfootnotes in separate Dateien zu verschieben. Es ist einfach zu verwenden:
\sepfootnotecontent{label}{The content}
...
\sepfootnote{label}
Wie gesagt, die Fußnoten sind sehr lang und die Fußnotendatei ist schwer zu lesen. Die Verwendung einer Umgebung würde das Parsen erleichtern:
\begin{nbp}{label}
The content
\end{nbp}
(„nbp“ steht für „note de bas de page“, es ist ein französisches Dokument.)
Ich habe herausgefunden, dass das Environ-Paket es einfach macht, einen Befehl in eine Umgebung „umzuwandeln“:
\NewEnviron{nbp}[1]{\sepfootnotecontent{#1}{\BODY}}
Beim Kompilieren ist kein Fehler aufgetreten, in der Fußnote erscheint jedoch nichts:
\begin{nbp}{1}
dolor sit amet.
\end{nbp}
Lorem ipsum\sepfootnote{1}
Erwartete Ausgabe:
Hier ist ein minimales funktionierendes Beispiel:
\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}
Antwort1
Es besteht keine Notwendigkeit, die internen Komponenten zu ändern sepfootnotes
: ein \aftergroup
Trick reicht aus.
\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}
Hinweis: Ich habe die Datei mit einer verkleinerten Version kompiliert, \textheight
um ein kleineres Bild zu erhalten.
Antwort2
Es gibt zwei Probleme: Das Makro \sepfootnotecontent
speichert seinen Inhalt lokal, was bedeutet, dass er nach dem Beenden der Umgebung vergessen wird. Das zweite Problem: Das Makro \BODY
wird als Fußnoteninhalt gespeichert, aber eigentlich möchten Sie die erste Erweiterung \BODY
und nicht das Makro selbst.
Mithilfe des etoolbox
Pakets und seiner Funktionen \patchcmd
können wir ganz einfach eine globale Version des internen Makros erstellen \sep@namedef
:
\let\sep@namegdef\sep@namedef
\patchcmd\sep@namegdef{\@namedef}{\global\@namedef}{}{}
Jetzt brauchen wir ein globales Äquivalent für \sepfootnotecontent
:
% \gsepfootnoteenvcontent{<content>}{<id>}
\newcommand\gsepfootnoteenvcontent[2]{\sep@namegdef{sepfoot}{#2}{#1}}
Beachten Sie das Vertauschen der letzten beiden Argumente: Dadurch kann das \BODY
Makro im nächsten Schritt leichter erweitert werden, bevor es an übergeben wird \sep@namegdef
.
Zuletzt die Umgebung, in der \BODY
es erweitert wird, bevor es übergeben wird \gsepfootnoteenvcontent
:
\NewEnviron{nbp}[1]{\expandafter\gsepfootnoteenvcontent\expandafter{\BODY}{#1}}
Ein vollständiges Beispiel:
\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}