如何自动排列未知数目的图像?

如何自动排列未知数目的图像?

我有几个可编译的 LaTeX 输入文件及其对应的 PDF 文件。每个 PDF 文件包含任意数量的页面。我想将每个 LaTeX 输入文件及其\lstinputlistingPDF 页面作为图像导入。我必须考虑

  • 每个 PDF 文件的页数,
  • 图像的可用空间

以避免输出被修剪/裁剪的内容。

以下是我的 MWE。动态确定每个文件的 PDF 页数的问题已经解决。剩下的任务是自动排列导入的 PDF 页面。

\documentclass[12pt]{book}
\usepackage[a4paper,margin=25mm,showframe=false]{geometry}
\usepackage{graphicx}
\usepackage{multido}
\usepackage{etoolbox,ifpdf,ifxetex}

\ifxetex
    \newcount\pdflastximagepages
    \def\pdfximage#1{\pdflastximagepages=\XeTeXpdfpagecount"#1"\relax}
\fi


\newcommand\Directory{}

\newcommand{\InsertOutput}[1]{%
            \IfFileExists{\Directory/#1.pdf}{%
                    \pdfximage{\Directory/#1.pdf}%
                    \multido{\i=1+1}{\the\pdflastximagepages}
                        {\includegraphics[page=\i]{\Directory/#1}}
            }{The corresponding PDF file does not exist.}%
}



\begin{document}

\renewcommand\Directory{Contents}
\InsertOutput{Article}

\end{document}

单个 PDF 文件中的页面具有相同的尺寸。我可能需要缩放因子来排列图像。每个 PDF 文件可能需要不同的缩放因子,但单个 PDF 文件中的页面将使用相同的因子。我希望一行中的图像不超过 2 张。

\lstinputlisting为了简单起见,我跳过了代码的使用。

使用pdfpages包不是我的选择,因为我需要图像浮动并填充可用空间。

真实情况

我想写一个关于 LaTeX 的教程,展示代码及其输出。由于LTXexamplefromshowexpl对于可编译的 LaTeX 输入文件效果不佳,因此我不得不使用\lstinputlisting\includegraphics。问题在于按照导入的代码排列图像。

我想制作一个如下的教程。例如,页面n包含源代码和2m图片,页面n+1可能包含其余图片和一些句子作为相应的评论,其中mn是整数。

在此处输入图片描述

答案1

好的,这就是我的答案。

这个想法是制作一个循环,用于\includegraphics输出 pdf 的每一页,行宽为 45%(假设您希望每行两页,这似乎是合理的)。棘手的部分是考虑奇数页的情况。在这种情况下,最后一行包含一页,因此如果该页居中会更好。

下面的代码可以实现这个功能。

\documentclass[12pt]{book}
\usepackage[a4paper,margin=25mm,showframe=false]{geometry}
\usepackage{graphicx}
\usepackage{listings}
\input{repeat}

\lstset{ %
    frame=single,
    language=tex,                    % the language of the code
    numbers=left,                    % where to put the line-numbers
    numberstyle=\scriptsize,         % the size of the fonts that are used for the line-numbers
    basicstyle=\ttfamily\scriptsize, % font and size of the code
    showspaces=false,                % show spaces adding particular underscores
    showstringspaces=false,          % underline spaces within strings
    showtabs=false,                  % show tabs within strings adding particular underscores
    tabsize=4,                       % sets default tabsize to 4 spaces
    breaklines=false,                % sets automatic line breaking
    breakatwhitespace=false,         % sets if automatic breaks should only happen at whitespace
}

\def\IncludeOutput#1{
  \parskip=2mm
  \def\examplename{#1}
  \pdfximage{\Directory/\examplename.pdf}%
  \edef\lastpdfpage{\the\pdflastximagepages}
  \repeat\for{pag}\by{0} % We advance manually the counter in the loop body
  \until{\ifnum\pag>\lastpdfpage}
  \do{
    \noindent\hfill\fbox{%
    \includegraphics[width=0.45\textwidth,page=\number\pag]{\Directory/\examplename.pdf}}%
    \hfill%
    \advance\pag by 1
    \ifnum\pag>\lastpdfpage\hfill\par% If odd number of pages
    \else% If even number of pages, output the last one
       \fbox{%
         \includegraphics[width=.45\textwidth,page=\number\pag]{\Directory/\examplename.pdf}}%
       \hfill\hbox{}\par % Next pair of images
    \fi%
    \advance\pag by 1
  }
}


\begin{document}
    \def\Directory{Examples}
    \lstinputlisting{\Directory/Lipsum.tex}
    \IncludeOutput{Lipsum}
    And more text follows\dots
\end{document}

结果如下: 在此处输入图片描述

如果文本无法阅读,则内容Lipsum.tex为:

\documentclass{article}
\usepackage{lipsum}
\begin{document}
\title{Lorem Ipsum}
\maketitle
% This inserts paragraphs 1 to 35 of ``Lorem Ipsum'' which produces 7 pages
  \lipsum[1-35]
\end{document}

你可以下载生成的 pdf这里

答案2

tcolorbox提供\tcbinputlisting为您完成所有工作的命令。

假设您Lipsum.tex已经编译了文件(取自 JLDiaz 的回答)。如果您想要将代码和结果包含到另一个文档中,请使用\tcbinputlistingwith 选项listing file=Lipsumlisting and commentlisting包括 tex 源和commentpdf 结果。

如果您想要获得类似的结果,但希望将 LaTeX 代码放入主文档中,那么也可以这样做。tcolorbox文档中的“处理选项键和完整文档示例”部分解释了一些示例。

下一个代码展示了一个带有外部文件的解决方案。

\documentclass{article}
\usepackage[a4paper,vmargin=2cm]{geometry}
\usepackage{listings}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}

\begin{document}

\lipsum[1]

\tcbinputlisting{
enhanced jigsaw, breakable, pad at break*=2mm, height fixed for=first and middle,
lower separated=false,
leftlower=0pt, rightlower=0pt, middle=0pt,
colframe=red!50!black, colback=yellow!10!white,
listing and comment,
listing file={Lipsum},
listing options={style=tcblatex,texcsstyle=*\color{red!70!black}},
pdf comment,
comment style={raster columns=3, colframe=blue, drop fuzzy shadow},
}

\lipsum[2]

\end{document}

结果如下

在此处输入图片描述

相关内容