标题可能并不完美,但我想要实现的是:
在我自己的包中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-patch
和xkvltxp
重新定义 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
,没有任何解释。但管理逗号分隔的列表很容易。