使 \@namedef 可选地成为全局的

使 \@namedef 可选地成为全局的

我想global按照 Mats 的建议,在我维护的包上实现一个选项(这里)。该软件包为sepfootnotes,建议的修改将允许脚注的内容定义可选地采用全局范围。这将sepfootnotessubfiles软件包兼容。

因此,基本思想是在之前放置一个宏\@namedef,比如说\sep@scope,然后让用户将该宏定义为\global或其他内容以使其保持本地化。

我的问题是:这个其他东西应该是什么?最安全此宏的默认扩展:\relax

sepfootnotes.sty(测试版,最小)

\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesPackage{sepfootnotes}[2016/07/17 v0.3c Footnotes in separate file]

\DeclareOption{global}{\sep@opt@globaltrue}
\newif\ifsep@opt@global
\ProcessOptions

\newcommand\sep@scope{\relax}
\ifsep@opt@global
 \renewcommand\sep@scope{\global}
\fi

\newcommand\sep@namedef[2]{\sep@scope\@namedef{prefix#1}{#2}}
\newcommand\sep@nameuse[1]{\@nameuse{prefix#1}}

\newcommand\sepfootnotecontent{\sep@namedef}
\newcommand\sepfootnote{\sep@nameuse}

\endinput

文档

\documentclass{article}
\usepackage[global]{sepfootnotes}[2016/07/17 v0.3c]

\begin{document}

\begingroup
 \sepfootnotecontent{key}{content}
\endgroup

my \sepfootnote{key}

\end{document}

答案1

建议的代码是可以的,尽管更好的默认代码可能是

\newcommand\sep@scope{}

但它引入了四个实际上不需要的 csname(\ifsep@opt@global\sep@opt@globaltrue\sep@opt@globalfalse\sep@scope

替代方案是

\NeedsTeXFormat{LaTeX2e}[1996/06/01]
\ProvidesPackage{sepfootnotes}[2016/07/17 v0.3c Footnotes in separate file]

\newcommand\sep@namedef[2]{\@namedef{prefix#1}{#2}}
\DeclareOption{global}{\renewcommand\sep@namedef[2]{\global\@namedef{prefix#1}{#2}}}
\ProcessOptions


\newcommand\sep@nameuse[1]{\@nameuse{prefix#1}}

\newcommand\sepfootnotecontent{\sep@namedef}
\newcommand\sepfootnote{\sep@nameuse}

\endinput

相关内容