在下面的例子中,我提供了一个mytestpackage.sty
使用语法的小测试包expl3
。
如果我使用包内的命令,\usetikzlibrary
我会收到错误:失控参数?
v\pgfversion ]$Header:/cvsroot/pgf/pgf/generic/pgf/frontendlayer/tikz\ETC.
! File ended while scanning use of \next.
<inserted text>
\par
妇女权利委员会:
\documentclass{report}
\usepackage{filecontents}
\begin{filecontents}{mytestpackage.sty}
\RequirePackage{expl3}
\ProvidesExplPackage{mytestpackage}{2012/05/26} {0.1}{mytestpackage}
\RequirePackage{tikz}
\usetikzlibrary{calc,backgrounds,arrows,matrix}
\end{filecontents}
\usepackage{mytestpackage}
\begin{document}
foo bar
\end{document}
第一个快速解决方法是:
\ExplSyntaxOff
\usetikzlibrary{calc,backgrounds,arrows,matrix}
\ExplSyntaxOn
我如何修补 TikZ(\usetikzlibrary
)以便在我的包中使用它?
基于此解决方案我们可以发送错误报告。
答案1
问题不是由:
或的 catcode 引起的_
,而是由空格引起的:pgf
用于从 RCS 样式数据中查找版本的代码依赖于空格的存在。也许最干净的解决方法是改变 的内部行为,\usetikzlibary
以便使用 LaTeX2e 推送/弹出文件名系统。这已经由 更新以expl3
正确处理\ExplSyntax...
:
\documentclass{report}
\usepackage{filecontents}
\begin{filecontents}{mytestpackage.sty}
\RequirePackage{expl3}
\ProvidesExplPackage{mytestpackage}{2012/05/26} {0.1}{mytestpackage}
\RequirePackage{tikz}
\RequirePackage{etoolbox}
\ExplSyntaxOff
\patchcmd
{\pgfutil@InputIfFileExists}
{\input #1}
{%
\@pushfilename
\xdef\@currname{#1}%
\input #1 %
\@popfilename
}
{}{}
\ExplSyntaxOn
\usetikzlibrary{calc,backgrounds,arrows,matrix}
\end{filecontents}
\usepackage{mytestpackage}
\begin{document}
foo bar
\end{document}
当然,\pgfutil@InputIfFileExists
如果您想避免使用etoolbox
,您可以通过复制的整个定义“直接”执行相同的操作,但这并不能使解决方案更清晰,所以我跳过了它。(注意:此补丁已针对 v3 进行了更新pgf
:旧版本做了同样的事情,但针对的是不再由内部使用的宏pgf
。)
对于,以类似的方式修补它tcolorbox
:tcbuselibrary
\tcb@input@library@in
\patchcmd
{\tcb@input@library@in}
{%
\input\tcbpkgprefix#1\relax%
}
{%
\@pushfilename
\input\tcbpkgprefix#1\relax%
\@popfilename
}
{}{}