是否有可能以某种方式保留独立文档前言的部分内容?例如,当我在其中有一个保存框或宏并且不想在主文档的前言中重复它时。这里有一个小例子mypicture.tex
:
\documentclass[tikz,border=5pt]{standalone}
\newsavebox\mybox
\savebox\mybox{
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document
因此,当我将此文件包含到我的主文档中时,我不想重新分配我的保存框,而是重复使用独立文件中的保存框。
\documentclass{report}
\usepackage{standalone}
% No redeclaration of the savebox here
\begin{document}
\input{mypicture.tex}
\end{document}
我在手册中没有找到任何机制standalone
,但也许有一个简单的解决方案来解决这个问题。
答案1
这standalone
软件包有一个subpreambles
保留前言的选项。您的 MWE 似乎有几个小问题(它缺少一个}
in,\end{document}
并且您从未加载过该tikz
软件包。修复这两个问题并添加软件包选项
\documentclass{report}
\usepackage[subpreambles=true]{standalone}
% No redeclaration of the savebox here
\begin{document}
\input{mypicture.tex}
\end{document}
和
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\newsavebox\mybox
\savebox\mybox{
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
\begin{document}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
答案2
我最推荐的解决方案仅适合最佳实践者。
步骤 1:创建包
将您在多个输入文件中使用的所有内容放在一个包中,例如mygraphiclib.sty
。
% mygraphiclib.sty
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mygraphiclib}[2014/02/03 v0.01 LaTeX package for my graphic library]
\RequirePackage{tikz}
% mybox
\newsavebox\mybox
\savebox\mybox{%
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
% myBox
\newcommand\myBox{%
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}}
\endinput
% mygraphiclib.sty
使用\newcommand
这样可以避免意外定义相同的宏名。
第 2 步:创建子输入文件
您可以使用类将每个图表分离到其自己的输入文件中。如果您想使用中的宏,standalone
此输入文件当然需要。mygraphiclib.sty
mygraphiclib.sty
% child.tex
\documentclass[tikz,border=12pt]{standalone}
\usepackage{mygraphiclib}
\begin{document}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
在开发阶段,您可能需要多次重新编译此输入文件,因此关注点分离确实可以帮助您减少编译时间。想象一下,如果您将所有图形代码放在主输入文件中,每次修改单个图表时,您都会浪费大量时间来编译一堆图表。
步骤 3:创建主输入文件
主输入文件只需加载mygraphiclib.sty
和standalone
(或docmute
)即可使用子输入文件。
% main.tex
\documentclass{article}
\usepackage{mygraphiclib}
\usepackage{standalone}% or \usepackage{docmute}
\begin{document}
\input{child}
\end{document}
一体化模拟
以下输入文件将上面给出的所有步骤模拟为单个输入文件。
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{mygraphiclib.sty}
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{mygraphiclib}[2014/02/03 v0.01 LaTeX package for my graphic library]
\RequirePackage{tikz}
% mybox
\newsavebox\mybox
\savebox\mybox{%
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
% myBox
\def\myBox{%
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}}
\endinput
% mygraphiclib.sty
\end{filecontents*}
\begin{filecontents*}{child.tex}
\documentclass[tikz,border=12pt]{standalone}
\usepackage{mygraphiclib}
\begin{document}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
\end{filecontents*}
\usepackage{mygraphiclib}
\usepackage{standalone}
\begin{document}
\input{child}
\end{document}
答案3
我的建议我的评论与您的 MWE 配合使用。
当你把其放置在\newsavebox
后面时\begin{document}
,它会起作用:
还有一些小的附加错误:
mypicture.tex 错过了}
关闭\end{document}
:
\documentclass[tikz,border=5pt]{standalone}
\begin{document}
\newsavebox\mybox
\savebox\mybox{
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
你的主文件错过了\usepackage{tikz}
:
\documentclass{report}
\usepackage{tikz}
\usepackage{standalone}
\begin{document}
\input{mypicture.tex}
\end{document}
更新:我在运行 时发现了一个问题mypicture.tex
。此版本解决了该问题,但我认为应该有更好的解决方案(无需重复代码):
\documentclass[tikz,border=5pt]{standalone}
\ifstandalone
\newsavebox\mybox
\savebox\mybox{
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
\fi
\begin{document}
\ifstandalone
\else
\newsavebox\mybox
\savebox\mybox{
\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}
}
\fi
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\usebox\mybox};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
答案4
第一个文件:
%% mypicture.tex
\documentclass[tikz,border=5pt]{standalone}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents*}{temp.tex}
\tikz\draw[->] (0,0) -- (1,1);
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
\node[draw] (a) at (0,0) {A};
\node[draw] (b) at (0,2) {\input{temp}};
\draw[->] (a) -- (b);
\end{tikzpicture}
\end{document}
第二个文件:
%%% myfile.tex
\documentclass{report}
\usepackage{tikz}
\usepackage{standalone}
\begin{document}
\input{mypicture.tex}
\end{document}
运行mypicture.tex
并myfile.tex
输出 myfile.pdf
: