在 expl3 包中使用 \usetikzlibrary 失败

在 expl3 包中使用 \usetikzlibrary 失败

在下面的例子中,我提供了一个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。)


对于,以类似的方式修补它tcolorboxtcbuselibrary\tcb@input@library@in

\patchcmd
  {\tcb@input@library@in}
  {%
    \input\tcbpkgprefix#1\relax%
  }
  {%
    \@pushfilename
    \input\tcbpkgprefix#1\relax%
    \@popfilename
  }
  {}{}

相关内容