\usetikzlibrary{positioning} 在 expl3 包中,但 PGF 数学错误:未知函数“of”

\usetikzlibrary{positioning} 在 expl3 包中,但 PGF 数学错误:未知函数“of”

编辑:我遇到的问题是由于正则表达式替换,我没有将其包含在原始问题中。问题是我用控制空格替换了标记列表中的空格\。(我不应该这样做,并且已经通过提供的答案解决了该问题这里)。第一个问题是tikz选项/属性中的控制空间似乎允许该控制空间\。这就是为什么一切都为我工作,直到我用翻转了一切right=of nodename。显然,tikz不喜欢后面的控制空间=。第二个问题是错误消息没有表明该空间有问题。相反,错误消息似乎表明无法of识别,这表明控制空间被识别为正常空间。

不幸的是,我最初没有包含这些详细信息,因为错误消息没有表明空格(由正则表达式修改)是问题所在。修复正则表达式,问题就解决了,因为经过正则表达式替换的标记列表中的正常空格保持了正确的空格。


expl3包内部,我正在使用tikz和加载\usetikzlibrary{positioning}。这样做的原因是从弃用的库过渡到需要该库的right of=nodename当前库。right=of nodenamepositioning

我使用了这里的解决方案(在 expl3 包中使用 \usetikzlibrary 失败tikz) 来修复包中各种库的使用expl3。一切都很顺利,直到我加载了positioning库,然后尝试使用right=of nodename符号。它给了我错误:! Package PGF Math Error: Unknown function 'of' (in 'of nodename')

我知道该库已正确安装在我的系统上,因为我可以在标准article文档中使用该符号,并且不会出错。该问题似乎与包中的expl3tikz和有关positioning,但我真的不确定如何进一步诊断问题或修复它。

强制性 MWE:

\documentclass{article}
\usepackage{filecontents}

\begin{filecontents}{some-package.sty}

\RequirePackage{expl3}
\ProvidesExplPackage
    % Package name
    {some-package}
    % Release date
    {2017/03/15}
    % Release version          
    {1.0}
    % Description
    {some package}

\RequirePackage{l3regex}%
\RequirePackage{xstring}%
\RequirePackage{xparse}%

\RequirePackage{tikz}%
%%%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%%%%%%FIX - PATCH FOR LOADING LIBRARIES
\RequirePackage{etoolbox}
\ExplSyntaxOff
\patchcmd
  {\pgfutil@InputIfFileExists}
  {\input #1}
  {%
    \@pushfilename
    \input #1 %
    \@popfilename
  }
  {}{}
\ExplSyntaxOn
\usetikzlibrary{backgrounds}%
\usetikzlibrary{calc}%
\usetikzlibrary{arrows.meta}%
\usetikzlibrary{positioning}%

\DeclareDocumentCommand{\makeapicture}{ }
{%
    \begin{tikzpicture}

        \node (test) [fill,inner~sep=2pt,label={[left~of~=~test]test}] at ( 4 , 3 ) {};% This works fine

        \node (test2) [fill,inner~sep=2pt,label={[left=of~test2]test2}] at ( 4 , 3 ) {};% This will give the error

    \end{tikzpicture}
}

\end{filecontents}
\usepackage{some-package}

\begin{document}

    \makeapicture

\end{document}

重要的是,加载positioning库不会导致任何错误。只有当我使用非弃用符号定义节点时才会触发错误。似乎库positioning根本没有加载或类似情况。

编辑:我认为也许是库的顺序导致了问题,并尝试了\usetikzlibrary{positioning}第一个、最后一个以及彼此之间的库,但这没有任何作用。

EDIT2: expl3代码未包含在此示例中,因为它没有问题。但是,几个文档命令和内部命令序列设置了tikzpictures 并创建了\nodes。一切都运行良好,直到我决定从弃用版本转换right of=nodenamepositioning版本right=of nodename,正如我在顶部提到的那样。实际上,我从一个完全正常工作的包到一个有此错误的包所做的唯一更改是 a) 包含库positioning和 b) 更改位置语法。

另外,更改此部分:

\ExplSyntaxOff
\patchcmd
  {\pgfutil@InputIfFileExists}
  {\input #1}
  {%
    \@pushfilename
    \input #1 %
    \@popfilename
  }
  {}{}
\ExplSyntaxOn
\usetikzlibrary{backgrounds}%
\usetikzlibrary{calc}%
\usetikzlibrary{arrows.meta}%
\usetikzlibrary{positioning}%

\ExplSyntaxOff
\patchcmd
  {\pgfutil@InputIfFileExists}
  {\input #1}
  {%
    \@pushfilename
    \input #1 %
    \@popfilename
  }
  {}{}

\usetikzlibrary{backgrounds}%
\usetikzlibrary{calc}%
\usetikzlibrary{arrows.meta}%
\usetikzlibrary{positioning}%

\ExplSyntaxOn

也不起作用。

答案1

\documentclass{article}
\usepackage{expl3,etoolbox,tikz}
\makeatletter
\ExplSyntaxOff
\patchcmd
  {\pgfutil@InputIfFileExists}
  {\input #1}
  {%
    \@pushfilename
    \input #1%
    \@popfilename
  }
  {}{}
\ExplSyntaxOn
\makeatother
\usetikzlibrary{positioning}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
  \node (a) {a};
  \node [left=of a] {b};
\end{tikzpicture}
\end{document}

此修复程序修复了库的输入。它不是针对 Ti 使用的一般修复程序Z 代码expl3。这将极其困难,甚至不可能,因为这两种语法从根本上来说彼此过敏。TiZ 本质上使用它自己的解析器并依赖于事物是否符合其预期。

如果需要,解决方案是在定义宏之前关闭语法。

\ExplSyntaxOff
\NewDocumentCommand\makeapicture{}
{%
  \tizk{...}%
}
\ExplSyntaxOn

相关内容