將 \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

有兩個問題:巨集\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}

相關內容