独立包,保留前言

独立包,保留前言

是否有可能以某种方式保留独立文档前言的部分内容?例如,当我在其中有一个保存框或宏并且不想在主文档的前言中重复它时。这里有一个小例子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.stymygraphiclib.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.stystandalone(或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.texmyfile.tex输出 myfile.pdf

在此处输入图片描述

相关内容