我有几个可编译的 LaTeX 输入文件及其对应的 PDF 文件。每个 PDF 文件包含任意数量的页面。我想将每个 LaTeX 输入文件及其\lstinputlisting
PDF 页面作为图像导入。我必须考虑
- 每个 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 的教程,展示代码及其输出。由于LTXexample
fromshowexpl
对于可编译的 LaTeX 输入文件效果不佳,因此我不得不使用\lstinputlisting
和\includegraphics
。问题在于按照导入的代码排列图像。
我想制作一个如下的教程。例如,页面n
包含源代码和2m
图片,页面n+1
可能包含其余图片和一些句子作为相应的评论,其中m
和n
是整数。
答案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 的回答)。如果您想要将代码和结果包含到另一个文档中,请使用\tcbinputlisting
with 选项listing file=Lipsum
和listing and comment
。listing
包括 tex 源和comment
pdf 结果。
如果您想要获得类似的结果,但希望将 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}
结果如下