将全局页面大小设置为最大文本块所需的大小

将全局页面大小设置为最大文本块所需的大小

我有几个逐字文本块,每个块都应放在单独的页面上(不能放其他内容)。页面大小应确定为紧贴最大的块,而所有其他块应像往常一样从左上角开始,一直到最远。块的垂直和水平尺寸以及数量可能有所不同,我不知道哪一个是最大的。

有没有办法从 Latex 内部自动设置所需的页面大小?

由于我假设这是不可能的 - 有没有关于如何从外部做到这一点的建议?我正在用 Java 生成块,所以我也可以为正确的页面尺寸创建 Latex 标头。但是,什么是做到这一点的好方法(哪个文档类/包最适合(可能是几何图形……))?尺寸本身应该很容易计算,因为 Latex 中的字体具有固定的字符大小。

(我知道这个要求有点奇怪,但这正是我所需要的。如果有的话,我显然更喜欢仅使用 Latex 的解决方案......)

答案1

使用maxpage环境进行剪切和粘贴文本。使用\maxpageinput来处理大段文字在其他文件中。wrapper对每个页面使用以确保standalone满意。

\documentclass[multi=wrapper]{standalone}
\usepackage{listings}
\lstset{aboveskip=0pt,belowskip=0pt}
\newlength{\maxheight}
\newlength{\maxwidth}

\newcommand{\setpagesize}[2]{\global\maxwidth=#1\relax \global\maxheight=#2\relax}% executed with aux file read

\makeatletter
\AtEndDocument{\immediate\write\@auxout{\string\setpagesize{\the\maxwidth}{\the\maxheight}}}
\makeatother

\newenvironment{wrapper}{}{}

\newcommand{\maxpageinput}[1]% #1 = fliename
{\setbox0=\hbox{\lstinputlisting{#1}}%
  \dimen0=\ht0
  \advance\dimen0 by \dp0
  \ifdim\dimen0>\maxheight \global\maxheight=\dimen0\fi
  \ifdim\wd0>\maxwidth \global\maxwidth=\wd0\fi
  \parbox[c][\maxheight][t]{\maxwidth}{\usebox0}%
}

\lstnewenvironment{maxpage}{\setbox0=\hbox\bgroup}%
 {\egroup
  \dimen0=\ht0
  \advance\dimen0 by \dp0
  \ifdim\dimen0>\maxheight \global\maxheight=\dimen0\fi
  \ifdim\wd0>\maxwidth \global\maxwidth=\wd0\fi
  \parbox[c][\maxheight][t]{\maxwidth}{\usebox0}%
}

\begin{document}
\begin{wrapper}
\begin{maxpage}
This is a test. 
\textbullet $\sin x^2$
And it has more than one line.
In fact, it goes on and on and on and on and on and on and on until it extends quite far.
\end{maxpage}
\end{wrapper}

\begin{wrapper}
\maxpageinput{test5.tex}
\end{wrapper}
\end{document}

答案2

这是仅限 TeX 的解决方案。用于pdftex document创建 PDF(无 LaTeX)。

\pdfhorigin=0pt \pdfvorigin=0pt
\newdimen\tmpdim
\newdimen\cwidth \newdimen\cheight

\newread\testin  \newwrite\outfile
\def\softinput #1 {\let\next=\relax \openin\testin=#1
   \ifeof\testin \message{Warning: the file #1 does not exist, TeX me again}
   \else \closein\testin \def\next{\input #1 }\fi
   \next}  
\def\bye{\immediate\openout\outfile=\jobname.dat
   \immediate\write\outfile{%
      \string\pdfpagewidth=\the\cwidth \space
      \string\pdfpageheight=\the\cheight}
   \end
}
\pdfpagewidth=0pt \pdfpageheight=0pt
\softinput \jobname.dat

\def\chunk{\afterassignment\chunkA\setbox0=\hbox}
\def\chunkA{\aftergroup\chunkB}
\def\chunkB{
   \tmpdim=\ht0 \advance\tmpdim by\dp0
   \ifdim\pdfpagewidth<\wd0 \pdfpagewidth=\wd0 \fi
   \ifdim\pdfpageheight<\tmpdim \pdfpageheight=\tmpdim \fi
   \ifdim\cwidth<\wd0 \cwidth=\wd0 \fi
   \ifdim\cheight<\tmpdim \cheight=\tmpdim \fi
   \shipout\box0
   \advance\pageno by1
}

\chunk{first}
\chunk{Second joj}
\chunk{third}

\bye

使用外部文件\jobname.dat。当第一次运行 TeX 时,此文件不存在,因此 PDF 页面尺寸会逐页增大。.dat\bye宏展开时,这些尺寸的最大值会保存到文件中。如果第二次(或更多次)运行 TeX,则会.dat读取文件并使用第一页的最大尺寸。

相关内容