Transformieren Sie \sepfootnotecontent in eine Umgebung

Transformieren Sie \sepfootnotecontent in eine Umgebung

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}

Verschwindender Fußnoteninhalt

Erwartete Ausgabe:

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 \aftergroupTrick 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, \textheightum ein kleineres Bild zu erhalten.

Bildbeschreibung hier eingeben

Antwort2

Es gibt zwei Probleme: Das Makro \sepfootnotecontentspeichert seinen Inhalt lokal, was bedeutet, dass er nach dem Beenden der Umgebung vergessen wird. Das zweite Problem: Das Makro \BODYwird als Fußnoteninhalt gespeichert, aber eigentlich möchten Sie die erste Erweiterung \BODYund nicht das Makro selbst.

Mithilfe des etoolboxPakets und seiner Funktionen \patchcmdkö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 \BODYMakro im nächsten Schritt leichter erweitert werden, bevor es an übergeben wird \sep@namegdef.

Zuletzt die Umgebung, in der \BODYes 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}

verwandte Informationen