
私は現在、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}