在生成我的图形的文件中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
我现在发布standalone
v1.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}