我正在玩expl3
一个项目并遇到一个奇怪的问题。
我有一个加载的包tikz
和一些tikzlibraries
。如果我使用\ProvidesExplPackage
,似乎空格在某处被删除tikzlibraries
,导致错误,例如
Package pgfkeys Error: I do not know the key '/pgf/arrowkeys/linecap/.ischoice' and I am going to ignore it. Perhaps you misspelled it. }
而密钥应该是is choice
。
这是一个 M(non)WE:
\begin{filecontents}{essai_expl3.sty}
\RequirePackage{expl3}
\ProvidesExplPackage{essai_expl3}{2022-04-01}{1.0}{essai expl3}
% \ProvidesPackage{essai_expl3}[2022-04-01 v. 1.0 essai expl3]
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\endinput
\end{filecontents}
\documentclass[12pt]{report}
\usepackage{essai_expl3}
\begin{document}
azerty
\end{document}
编辑
@Ulrike Fischer 提供的解决方案在 MWE 上完成了这项工作。
我对 pgf 也有类似的问题……
\begin{filecontents}{essai_expl3.sty}
\RequirePackage{expl3}
\RequirePackage{l3keys2e}
\ProvidesExplPackage{essai_expl3}{2022-04-01}{1.0}{essai expl3}
\keys_define:nn { essai_expl3 }
{
% pour charger et pouvoir utiliser TikZ
,tikz .bool_gset:N = \g_essai_tikz_bool
,tikz .default:n = true % valeur par défaut
,tikz .initial:n = false % valeur initiale
,tikz .value_required:n = false % si pas de valeur donnée, true est utilisée
% pour les options non définies
,unknown .code:n = \ClassInfo{ Estia }{Option~ inconnue~ `\l_keys_key_str'}
}
\ProcessKeysOptions { essai_expl3 }
\bool_if:NTF \g_essai_tikz_bool
{
\usepackage{tikz, pgfplots}
\ExplSyntaxOff
\pgfplotsset{compat=newest,compat/show suggested version=true}
\usetikzlibrary{arrows.meta}
\pgfkeys{/pgf/number format/.cd,fixed,use comma}
\ExplSyntaxOn
}
\endinput
\end{filecontents}
\documentclass[12pt]{report}
\usepackage[tikz]{essai_expl3}
\begin{document}
azerty
\end{document}
答案1
LaTeX 提供了推送和弹出 catcode 的命令。此处有描述 https://www.texdev.net/2015/07/30/making-custom-loaders-expl3-aware/
例如它被使用\usepackage
,因此通常您不必担心是否在 expl3 包中加载包。
但并非所有库加载器都使用这些命令。一个正确示例来自\tcbuselibrary
tcolorbox,它基本上
\def\tcb@load@library#1#2{%
....
\@pushfilename%
\xdef\@currname{#2}%
...
\input\tcbpkgprefix#2\relax%
...
\@popfilename%
}%
}
tikz/pgf 的库加载器不使用它,所以你应该手动执行
\@pushfilename
\xdef\@currname{arrows.meta}%
\usetikzlibrary{arrows.meta}
\@popfilename