将所有包选项放入一个命令中

将所有包选项放入一个命令中

标题可能并不完美,但我想要实现的是:

在我自己的包中mypackage.sty,我希望有一个命令,比如说\allpackageoptions,它应该存储整个包选项字符串。像这样:

示例代码

文档 (mydocument.tex):

\usepackage[Lorem Ipsum Dolor]{mypackage}

包裹 (mypackage.sty):

[...]
\allpackageoptions % shoud output 'Lorem Ipsum Dolor'
[...]

背景

我希望通过此方法编写一个小程序包,以简化 svn 关键字的使用。(我知道有一些程序包,但我想要一些非常小巧简单的程序包)。每当我提交文件时,SVN 都可以自动在我想要的任何位置插入包含版本信息的字符串。请看这个:

\documentclass{article}

\def\svn $Id: #1 #2 #3-#4-#5 #6${%
    This file is revision r#2.
}

\begin{document}

\svn $Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $
    %This string inside $$ is automatically updated by SVN

\end{document}

此示例代码的输出显然是This file is revision r259。我的包将提供此接口:

\usepackage[$Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $]{mysvn}

并应该提供一个\svnrevision输出的命令259

答案1

选项方法的主要问题是 LaTeX 删除了选项内的空格。

\usepackage[$Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $]{mysvn}

该包将会看到:

$Id:somefile.tex2592013-04-2013:22:00Zralfix$

这将使解析变得更加繁琐。而且花括号也无济于事:

\usepackage[{$Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $}]{mysvn}

当它读取可选参数时,括号已经被删除\usepackage。这可以通过额外的空选项来防止:

\usepackage[,{$Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $}]{mysvn}

或者使用键值接口:

\usepackage[id={$Id: somefile.tex 259 2013-04-20 13:22:00Z ralfix $}]{mysvn}

软件包kvoptions-patchxkvltxp重新定义 LateX 内部结构,以便更好地支持 LaTeX 选项中的空格和宏。但它们必须加载此类选项已被使用。

kvoptions可以使用包来捕获本地选项,例如:

% mysvn.sty
% Syntax: \usepackage[,{$Id: ...}]{mysvn}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mysvn}[2013/04/20 SVN version number]
\RequirePackage{kvoptions}[2009/07/17]

\DeclareDefaultOption{%
  % dummy actions
  % * print option value on screen
  \typeout{[\CurrentOption]}%
  % * remember option value in \mysvnid
  \let\mysvnid\CurrentOption
}
\ProcessLocalKeyvalOptions*
\endinput

带有键值选项的示例:

% mysvn.sty
% Syntax: \usepackage[id={$Id: ...}]{mysvn}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mysvn}[2013/04/20 SVN version number]
\RequirePackage{kvoptions}[2009/07/17]

\SetupKeyvalOptions{
  family=mysvn,
  prefix=mysvn@,
}
% Store value of option `id' in `\mysvn@id`:
\DeclareStringOption{id}
\DeclareLocalOptions{id}% global `id' options are ignored
\ProcessKeyvalOptions*
\endinput

更简单的是没有任何选项的宏界面:

\usepackage{mysvn}
\mysvn{$Id: ...}

我将 SVN 标识字符串的解析留给一个专门的包:

  • 解析完整的 Id 字符串。
  • 当 Subversion 尚未写入完整的 Id 字符串时,解析压缩的 Id 字符串。
  • 如果字符串不是 Id 字符串,则进行错误处理。

答案2

传递给包的选项foo.sty保存在宏中,因此您只需执行\[email protected]

\newcommand\alloptionslist[1]{\@nameuse{opt@#1.sty}}

输出只是可选参数的内容\usepackage,没有任何解释。但管理逗号分隔的列表很容易。

相关内容