如何制作跨越两页的图表?

如何制作跨越两页的图表?

可能重复:
如何在两页上添加图片,左侧部分在左侧,右侧部分在右侧(用于书籍)?

我在环境中有一个巨大的 TikZ 图形figure。我希望它覆盖跨页,以便图形被切成两半,左半部分放在偶数页(左侧),右半部分放在下一页(奇数页/右侧)。我希望应用常规页边距,以及文档布局的其余部分。我需要使用 IEEE 双栏纸张格式。

我知道我可以手动将 TikZ 图形重新制作成两部分,并将每部分放在新figure环境中,然后采取一些技巧将图形强制放到我想要的页面上。但如果我可以独立于页面上的位置来制作图形,那么更新图形会更干净、更容易。此外,如果我决定用 EPS 或 PDF 替换 TikZ 图形(或者当我有这样的图像时再次遇到同样的问题),我希望解决方案与我碰巧在figure.

那么,我怎样才能制作一个figure跨越两页的内容呢?

答案1

您可以使用我发布的解决方案如何在两页上添加图片,左侧部分在左侧,右侧部分在右侧(用于书籍)?然后将其替换为来自软件包的任何\includegraphics[<options>]{<image file>}内容。它基于提供的选项键构建并与其完全兼容,但将它们应用于文本或图片环境,而不是 graphicx。\adjustbox{<some options>}{<your tikzpicture or similar>}adjustboxgraphicx

你基本上要做的是:

tikzpicture使用\clipbox\adjustbox{clip=...}从包中拆分adjustbox。您需要将其插入两次,然后先剪切左侧部分,然后剪切右侧部分。为此,您应该先将图像存储到盒子寄存器中,然后使用该寄存器两次。更好的是,使用我的storebox包和\storebox\mystore{<your image>}and\usestorebox宏,它只将整个图片存储在 PDF 中一次,而\savebox/\usebox将其存储两次。实际上,我已经为这种事情编写了一个\splitbox宏作为其中的一部分adjustbox,但它尚未发布。

环境figure会让事情变得有点棘手。你需要确保两者都在顶部或底部,并且不会落在一个只有图形的页面上,如果周围没有足够的文本,就会发生这种情况。


以下是代码如何在两页上添加图片,左侧部分在左侧,右侧部分在右侧(用于书籍)?针对图片环境进行了修改。如果您使用多个彼此靠近的寄存器,则需要使用不同的寄存器来保存它们。

\documentclass[twoside]{book}

\usepackage{graphicx}
\usepackage{adjustbox}
\usepackage{afterpage}
\usepackage{placeins}
\usepackage{xcolor}
\usepackage{tikz}
\usepackage[disable]{storebox}
\newstorebox\twopagestorebox

% For the `memoir` class remove the following two packages.
% This class already provide the functionality of both
\usepackage{caption}
\usepackage[strict]{changepage}
%%%

\setcounter{totalnumber}{1}
\setcounter{topnumber}{1}
\setcounter{bottomnumber}{1}
\renewcommand{\topfraction}{.99}
\renewcommand{\bottomfraction}{.99}
\renewcommand{\textfraction}{.01}


\makeatletter
\newenvironment{twopagepicture}[3]{%
    \def\@dotwopagepicture{\@twopagepicture{#1}{#2}{#3}}%
    \begin{storebox}{\twopagestorebox}%
}{%
    \end{storebox}%
    \ifstorebox
        \global\let\twopagestorebox=\twopagestorebox
    \else
        \global\setbox\twopagestorebox=\box\twopagestorebox
    \fi
    \@dotwopagepicture{\usestorebox\twopagestorebox}%
}

\newcommand*{\@twopagepicture}[4]{%
    \checkoddpage
    \ifoddpage
        \expandafter\@firstofone
    \else
        \expandafter\afterpage
    \fi
    {\afterpage{%
    \if #1t%
        \if #2p%
            \thispagestyle{empty}%
            \afterpage{\thispagestyle{empty}}%
        \fi
    \fi
    \begin{figure}[#1]
        \if #2p%
            \if #1t%
                \vspace*{-\dimexpr1in+\voffset+\topmargin+\headheight+\headsep\relax}%
            \fi
        \fi
        \if #1b%
            \caption{#3}%
        \fi
        \makebox[\textwidth][l]{%
        \if #2p\relax
            \let\mywidth\paperwidth
            \hskip-\dimexpr1in+\hoffset+\evensidemargin\relax
        \else
            \let\mywidth\linewidth
        \fi
        \adjustbox{width=2\mywidth,Clip=0 0 {\mywidth} 0}{#4}}%
        \if #1b\else
            \caption{#3}%
        \fi
        \if #2p%
            \if #1b%
                \vspace*{-\dimexpr\paperheight-\textheight-1in-\voffset-\topmargin-\headheight-\headsep\relax}%
            \fi
        \fi
    \end{figure}%
    \begin{figure}[#1]
        \if #2p%
            \if #1t%
                \vspace*{-\dimexpr1in+\voffset+\topmargin+\headheight+\headsep\relax}%
            \fi
        \fi
        \makebox[\textwidth][l]{%
        \if #2p%
            \let\mywidth\paperwidth
            \hskip-\dimexpr1in+\hoffset+\oddsidemargin\relax
        \else
            \let\mywidth\linewidth
        \fi
        \adjustbox{width=2\mywidth,Clip={\mywidth} 0 0 0}{#4}}%
        \if #2p%
            \if #1b%
                \vspace*{-\dimexpr\paperheight-\textheight-1in-\voffset-\topmargin-\headheight-\headsep\relax}%
            \fi
        \fi
    \end{figure}%
    }}%
}
\makeatother

\usepackage{lipsum}
\begin{document}
\lipsum[1]
\begin{twopagepicture}{b}{l}{Test}
\begin{tikzpicture}
    \draw (0,0) -- (2\linewidth,10);
    \draw (0,10) -- (2\linewidth,0);
    \draw (\linewidth,5) circle (2);
\end{tikzpicture}
\end{twopagepicture}
\lipsum
\lipsum

\end{document}

结果如下:

结果

请注意,当前版本 (v1.0) 中有一个storebox由 更新引起的错误collectbox。我已经修复了它并将 v1.1 上传到 CTAN。disabled获得新版本后,请从中删除该选项。到目前为止,它以回退模式运行,实际上使用的是保存箱。

相关内容