将图片拆分到多个页面

将图片拆分到多个页面

我是一个相对的 TeX 新手,正在尝试编写一个新包来生成可以跨越多个页面的时间线(现有的时间线解决方案不适合我,我想编写一些更好的东西与社区分享作为“回馈”的方式)。

无论如何,目前我已经能够仅使用功能\begin{picture}...\end{picture}(无tikz)成功地模拟出一个非常漂亮的时间线。

问题是跨越页面——是否可以让 TeX 在某些点自动断开图形以支持多页的水平或垂直跨越?

答案1

不幸的是,这不起作用。图片环境(picturetikzpicture、...)本身就是(水平)框,LaTeX 不会破坏这些框。您需要自己完成此操作。

如果你能检测到你的图片太长(长于最大值\textheight计算当前页面的剩余部分)您可以插入一些代码,例如<global save settings>\end{picture}\begin{picture}<restore settings>关闭当前图片并打开一张新图片。我对 TikZ 做了类似的事情,\pathtikz-timing必须开始一条新路径来更改颜色和样式,但要保留某些设置和位置。不过,我想这有点棘手,尤其是对于整张图片来说。

另一种可能性是尽可能长地绘制整个图片,但将其放在保存框中,即先将其存储但不直接排版。然后,您可以测量其高度(\ht\yourboxmacro),如果太高,可以使用我的adjustbox包对其进行剪辑。这个想法是将其插入两次:一次剪辑到第一页的大小,然后在下一页再次剪辑第一部分。当然,使用循环可以支持两页以上的页面。

这里有一些示例代码。我tikzpicture在这里使用是因为我知道它的语法,但对的语法不是很picture了解。当然,它也可以与那个一起使用。(请注意,的当前版本中有一个错误adjustbox。我为下面的示例图像修复了它,但顶部仍然被错误地剪切。我必须仔细看看它。但是,基本思想是合理且可行的。)

\documentclass{article}

\usepackage{tikz}
\usepackage{adjustbox}

\newsavebox{\mysavebox}
\newlength{\myrest}
\begin{document}

\begin{lrbox}{\mysavebox}%
\begin{tikzpicture}[red,thick]
 \draw (0,0) rectangle (-.9\textwidth,-2.8\textheight);
 \draw (0,0) -- (-.9\textwidth,-2.8\textheight);
 \draw (-.9\textwidth,0) -- (0,-2.8\textheight);
 \path (-1mm,-1mm);
 \path (current bounding box.north east) +(1mm,1mm);
\end{tikzpicture}%
\end{lrbox}%
%
\ifdim\ht\mysavebox>\textheight
    \setlength{\myrest}{\ht\mysavebox}%
    \loop\ifdim\myrest>\textheight
        \newpage\par\noindent
        \clipbox{0 {\myrest-\textheight} 0 {\ht\mysavebox-\myrest}}{\usebox{\mysavebox}}%
        \addtolength{\myrest}{-\textheight}%
    \repeat
    \newpage\par\noindent
    \clipbox{0 0 0 {\ht\mysavebox-\myrest}}{\usebox{\mysavebox}}%
\else
    \usebox{\mysavebox}%
\fi

\end{document}

结果

答案2

我知道这是 TeX 的天地,但我遇到了这个问题,并写了一些 Python 来解决它。它需要 Python 和 PIL(Python 图像库

假设您有一张像这样的很长的图片,并且您想将它切成更小的块,因为它太长了。

图片

这是一个可以执行此操作的 Python 脚本。

from __future__ import division
from PIL import Image
import math
import os

def long_slice(image_path, out_name, outdir, slice_size):
    """slice an image into parts slice_size tall"""
    img = Image.open(image_path)
    width, height = img.size
    upper = 0
    left = 0
    slices = int(math.ceil(height/slice_size))

    count = 1
    for slice in range(slices):
        #if we are at the end, set the lower bound to be the bottom of the image
        if count == slices:
            lower = height
        else:
            lower = int(count * slice_size)  
              
        bbox = (left, upper, width, lower)
        working_slice = img.crop(bbox)
        upper += slice_size
        #save the slice
        working_slice.save(os.path.join(outdir, "slice_" + out_name + "_" + str(count)+".png"))
        count +=1
    
if __name__ == '__main__':
    
    long_slice("longcat.jpg", #image filename 
               "longcat", #slice names
                os.getcwd(), #output dir
                300 #height in px
               )

这是输出

图片


图片


图片

答案3

我非常喜欢 Martin Scharrer 的回答(2011 年 7 月 12 日),他的例子也很好用。但是,当我尝试修改 Martin 的回答以用于我的目的时,我发现代码\mysavebox以一种奇怪的方式被裁剪(也许是因为我需要使用minipage)。我花了 2 个月的时间进行实验和在线搜索才找到原因。的总垂直长度\mysavebox不仅包括高度,还包括深度(即\ht\mysavebox+ \dp\mysavebox)。现在,每个页面的裁剪效果都很好。如果您遇到类似的困难,也许以下解决方案会对您有所帮助。我使用我创建的新变量,\mytotallen就像 Martin 使用的那样\ht\mysavebox

\documentclass{article}

\usepackage{tikz}
\usepackage{adjustbox}

\newsavebox{\mysavebox}
\newlength{\myrest}
\begin{document}

\begin{lrbox}{\mysavebox}
  \begin{minipage}{\textwidth}
    \begin{footnotesize} %change font size
      \begin{spacing}{0.5}
        Lots and lots and lots of text... (3 pages worth)
      \end{spacing}
    \end{footnotesize}
  \end{minipage}
\end{lrbox}

\newlength{\mytotallen} %create a new length variable \mytotallen
\setlength{\mytotallen}{\ht\mysavebox + \dp\mysavebox} %add together the height (\ht) and depth (\dp) of \mysavebox
\ifdim\mytotallen>\textheight
    \setlength{\myrest}{\mytotallen} %initialize \myrest
    \loop\ifdim\myrest>\textheight
        \newpage\par\noindent
        \clipbox{0 {\myrest-\textheight} 0 {\mytotallen-\myrest}}{\usebox{\mysavebox}}
        \addtolength{\myrest}{-\textheight}%subtract one page's length each loop from \myrest
    \repeat
    \newpage\par\noindent
    \clipbox{0 0 0 {\mytotallen-\myrest}}{\usebox{\mysavebox}}
\else
    \usebox{\mysavebox}
\fi
\end{document}

相关内容