
我目前正在清理一本 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
有兩個問題:巨集\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}