这个问题接着一个问题在 expl3 包中使用 \usetikzlibrary 失败。虽然链接的问题在一段时间前还有效,但它的答案似乎不再有效了。
问题:如何\usetikzlibrary
在 expl3 包或类中使用而不会出现类似错误
v\pgfversion ]$Header:/cvsroot/pgf/pgf/generic/pgf/frontendlayer/tikz\ETC.
! File ended while scanning use of \next.
<inserted text>
\par
MWE(从另一篇文章的答案中复制):
\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
\input #1 %
\@popfilename
}
{}{}
\ExplSyntaxOn
\usetikzlibrary{calc}
\end{filecontents}
\usepackage{mytestpackage}
\begin{document}
foo bar
\end{document}
我收到的错误(使用完全更新的TL2017):
! I can't find file `t{i}kzlibrarycalc.code.tex'.
<argument> ...filename \input tikzlibrary\pgf@temp .code.tex
\@popfilename \relax
l.20 \usetikzlibrary{calc}
答案1
正如所提到的https://www.texdev.net/2015/07/30/making-custom-loaders-expl3-aware/应该\@currname
在 之后设置\@pushfilename
。
\@pushfilename
使用旧版 expl3 时您不会收到错误,但现在命令末尾\@pushfilenameaux
确实需要“两个命令和一个参数”。
因此,通过此更改,您的文件将再次编译:
\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}
\end{filecontents}
\usepackage{mytestpackage}
\begin{document}
foo bar
\end{document}
答案2
下列作品。
\documentclass{report}
\usepackage{filecontents}
\begin{filecontents}{mytestpackage.sty}
\RequirePackage{expl3}
\ProvidesExplPackage{mytestpackage}{2012/05/26} {0.1}{mytestpackage}
\ExplSyntaxOff
\RequirePackage{tikz}
\usetikzlibrary{calc}
\ExplSyntaxOn
\end{filecontents}
\usepackage{mytestpackage}
\begin{document}
foo bar
\end{document}