独立文件内定义的命令在主文档中不可用

独立文件内定义的命令在主文档中不可用

在生成我的图形的文件中tikz,我定义了一个新命令,该命令tikzpicture使用特定参数创建一个(在下面的 MWE 中省略,因为没有这些参数问题也会重现)。我使用类standalone来表示图形,这样我就可以更快地开发图形,而无需重新编译我的整个文章,也不会用包含\input不同图形的小文件弄乱我的目录。但是,当我\input在主文档中使用独立文件时,我无法执行在独立文件中定义的新命令。

我的独立图形 MWE 文件(称为stafig.tex):

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\newcommand{\examplefig}[0]{%
\begin{tikzpicture}
 \draw (0,0) rectangle (2, 1) node [midway] {Example};
\end{tikzpicture}%
}

\onlyifstandalone{
 \examplefig
 \examplefig
}

\end{document}

我将其包含在我的 MWE 主文章中,如下所示:

\documentclass{article}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}

\begin{figure}
 \input{stafig}
 \examplefig
 \caption{Yes, a test}
\end{figure}

\end{document}

独立文件编译良好,并具有预期结果。但是,编译主文件失败,并显示:

! Undefined control sequence. l.8  \examplefig

在我的实际情况中,我想使用这个宏在具有不同参数的不同子浮点环境中创建四个图。

我的问题:

  • 为什么主文件编译失败?这是预料之中的事吗?
  • 我该如何处理这个问题呢?
  • 如果我还使用,该怎么办pgfkeys

答案1

更新 2011/12/21

我现在发布standalonev1.0,它有新的包裹选项group(= true| false) 可用于切换通常使用 而添加的组group=false。因此,下面的补丁不再需要,不应与 v1.0 一起使用。(这可以使用 进行测试\makeatletter\@ifpackagelater{2011/12/21}{<v1.0>}{<older>}\makeatother。)


原始答案:

如果standalone使用包包含文件standalone,并且\input其内容放在组中,则宏定义仅在本地完成,之后不再存在。这是设计使然,但我可能会在下一个版本中添加一个包选项来抑制它。

您可以通过全局定义宏来解决此问题。为此使用\gdef\examplefig而不是\newcommand{\examplefig}(或\newcommand{\examplefig}[0])。


您还可以使用以下针对standalone软件包 (v0.4a) 的补丁,该补丁会删除文件周围的组。但是,这可能会破坏软件包的更新,并且未使用嵌套独立文件(即独立文件包含\input其他独立文件)进行测试。

\documentclass{article}
\usepackage{standalone}
\usepackage{tikz}

\makeatletter
\let\orig@document\document
\let\orig@enddocument\enddocument
\def\sa@document{%
  \endgroup
  \global\let\enddocument\sa@enddocument
  \sa@atbegindocument
}
\def\sa@enddocument{%
  \sa@atenddocument
  \global\let\document\orig@document
  \global\let\enddocument\orig@enddocument
  \begingroup
  \@ignoretrue
  \def\@currenvir{document}%
  \aftergroup\endinput
}
\makeatother

\begin{document}

\begin{figure}
 \input{stafig}
 \centering
 \examplefig
 \caption{Yes, a test}
\end{figure}

\end{document}

相关内容