使用 kvoptions 时与现有宏冲突:未定义的控制序列

使用 kvoptions 时与现有宏冲突:未定义的控制序列

我正在尝试使用kvoptionspacakage 来允许将关键选项传递给我的样式文件。以下是样式文件的 MWE:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{test}
\newcommand{\rtitle}{TITLE}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{
    family=EL,
    prefix=EL@
}
\DeclareStringOption[TITLE]{rtitle}
\ProcessKeyvalOptions*

\ifx\EL@rtitle\@empty
    \PackageWarningNoLine{\@currname}{Running title is not passed to `rtitle'}
\else
    \renewcommand{\rtitle}{\EL@rtitle}
\fi

\makeatletter
\def\@xfootnote[#1]{%
\protected@xdef\@thefnmark{#1}%
\@footnotemark\@footnotetext}
\makeatother

\RequirePackage{fancyhdr}
\fancyhf{}
\fancyhead[L]{\rtitle}
\pagestyle{fancy}

\endinput

这是 tex 文件:

\documentclass[11pt,letterpaper]{article}
\usepackage[rtitle = {A\ TEST\ TITLE}]{test}

\begin{document}
Some random text.\footnote[*]{Some footnote with a special marker.}
\end{document}

问题就在这里。我尝试通过直接使用 \DeclareStringOption 生成的宏而不是使用 \newcommand{\rtitle}{TITLE} 来简化样式文件:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{test}

\RequirePackage{kvoptions}
\SetupKeyvalOptions{
    family=EL,
    prefix=EL@
}
\DeclareStringOption[TITLE]{rtitle}
\ProcessKeyvalOptions*

\ifx\EL@rtitle\@empty
    \PackageWarningNoLine{\@currname}{Running title is not passed to `rtitle'}
\fi

\makeatletter
\def\@xfootnote[#1]{%
\protected@xdef\@thefnmark{#1}%
\@footnotemark\@footnotetext}
\makeatother

\RequirePackage{fancyhdr}
\fancyhf{}
\fancyhead[L]{\EL@rtitle}
\pagestyle{fancy}

\endinput

这样修改样式文件之后,再编译tex文件会出现错误,提示控制序列未定义。

EL@rtitle直接使用fancyheader 中的宏有什么问题?

谢谢!


编辑:我意识到与宏存在冲突

\makeatletter
\def\@xfootnote[#1]{%
\protected@xdef\@thefnmark{#1}%
\@footnotemark\@footnotetext}
\makeatother

如果我删除这部分,那么一切都会正常。但是,我应该如何修复这个宏(除了更改顺序)?我仍然需要使用带有特殊标记的脚注。

答案1

软件包文件第二个版本中的错误是因为您\makeatother在脚注部分之后发出了 ,因此@不是有效的宏名,并且该命令\fancyhead[L]{\EL@rtitle}基本上读作\fancyhead[L]{\EL @rtitle}。由未定义的命令! Undefined control sequence引发。\EL

默认情况下,在包文件中, 的 catcode@是“字母”,因此您不需要使用\makeatletter\makeatother,所以我认为最好的解决方案就是删除它们:

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{test}

\RequirePackage{kvoptions}
\SetupKeyvalOptions{
    family=EL,
    prefix=EL@
}
\DeclareStringOption[TITLE]{rtitle}
\ProcessKeyvalOptions*

\ifx\EL@rtitle\@empty
    \PackageWarningNoLine{\@currname}{Running title is not passed to `rtitle'}
\fi

% \makeatletter
\def\@xfootnote[#1]{%
\protected@xdef\@thefnmark{#1}%
\@footnotemark\@footnotetext}
% \makeatother

\RequirePackage{fancyhdr}
\fancyhf{}
\fancyhead[L]{\EL@rtitle}
\pagestyle{fancy}

\endinput

相关内容