\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

두 가지 문제가 있습니다. marco는 \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}

관련 정보