\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

問題は 2 つあります。マクロは\sepfootnotecontent内容をローカルに保存するため、環境の終了後に忘れられてしまいます。2 つ目の問題は、マクロは脚注の内容として保存されますが、実際に必要なのはマクロ自体ではなく、マクロ\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最後の 2 つの引数が入れ替わっていることに注意してください。これにより、 に渡す前に次のステップでマクロを展開しやすくなります\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}

関連情報