我正在尝试创建一个海报大小的文档(24"x36"、27"x40"),其中的代码列在 10-15 列中。我尝试过multicols
和multicols*
环境,但一旦扩展在一个方向或另一个方向上变得太大,两者最终都会失败 -multicols
当列的高度需要超过约 18" 时会失败,multicols*
当填充的列数超过约 14" 的宽度时会失败。
失败模式是填满第一页并溢出到第二页(或多页),并且除最后一页之外的所有页都会以相同的方式失败 - 通常最后一页不会失败,因为内容足够小,可以适应上述限制。
这是一个multicols*
失败的例子:
这是一个失败的例子multicols
:
如果我能遵守这些神秘的限制,比如减小字体大小,布局就令人满意。我只是希望能够填满更多的页面。
这些尺寸对于来说是否太大了multicols
?
更新:感谢您在评论中提供的早期帮助。以下是包含此问题的最小文档:
\documentclass{article}
\usepackage{tikz}
\usepackage{fp}
\usetikzlibrary{calc}
\usepackage[showframe]{geometry}
\geometry{paperwidth=24in,paperheight=36in,margin=2cm}
\usepackage{multicol}
% make a label command
\newcommand{\lbl}[1]{\tikz[remember picture,inner sep=0pt] \node(#1) {};}%
\newcommand{\addr}[1]{\lbl{ADDR_#1}}%
\newcommand{\data}[1]{\texttt{#1}}%
\newcommand{\op}[1]{\texttt{#1}}%
\begin{document}
\noindent
\begin{multicols}{13}
{\ttfamily\fontsize{4.5}{5}\selectfont\setlength{\parindent}{0cm}
% new block
{\hspace*{-2em}DATA\_00000107:}\\
{\hspace*{-2em}CATCH\_00000200:}\\
\addr{0x200}nop\\
bra.b \#-\$4\lbl{JMP_0x202}\\
% new block
{\hspace*{-2em}TRAP\_0000020c:}\\
\addr{0x20c}rte\\
{\hspace*{-2em}MAIN:}\\
\addr{0x20e}tst.l (\#\$a10008).l\\
bne.b \#\$6\lbl{JMP_0x214}\\
tst.w (\#\$a1000c).l\\
{\hspace*{-2em}LABEL\_0000021c:}\\
\addr{0x21c}bne.b \#\$7c\lbl{JMP_0x21c}\\
lea (\#\$7c, PC), A5\\
% a real listing has >10k additional lines
}
\end{multicols}
\end{document}
正如@ulrike-fischer 指出的那样,我确实遇到了Dimension too large.
错误:
! Dimension too large.
\set@mult@vsize ...dima \vsize \col@number \vsize
\advance \vsize -\@tempdim...
l.20
? r
OK, entering \nonstopmode...
Underfull \hbox (badness 10000) in paragraph at lines 23--26
Underfull \hbox (badness 10000) in paragraph at lines 27--36
! Dimension too large.
\endmulticols ...@botmark }\else \ifdim \pagegoal
=\maxdimen \ifvoid \colbre...
l.40 \end{multicols}
[1{/opt/local/var/db/texmf/fonts/map/pdftex/updmap/pdftex.map}]
(./sample-listing.aux))
正如@david-carlisle所建议的,我确实缩小了文档的大小并适当缩放了所有内容,现在我可以生成没有错误的PDF。我认为这暂时可以让我应付过去。使用如此小的尺寸工作很奇怪,但最终输出似乎缩放正确。
如果我按照工作原理multicol
操作,文本首先会呈现为全部在单列中,36 英寸高位于\maxdimen
7ᵀᴴ 列的某个位置。我没有想过“如何操作”。是否multicol*
也需要进行此计算?我想它需要完整的维度来找到列中断最终出现的位置,以避免“完整”列的底部参差不齐?
的值是否存在技术限制,\maxdimen
或者如何配置为更高的值?
再次感谢。这绝对让我更接近我想要的最终输出效果。
答案1
您可以将文档设为四分之一大小,然后\mag
按最终尺寸缩放
pdfinfo 确认页面宽度为 24 英寸(1728bp),尽管指定geometry
为6in
$ pdfinfo file.pdf
...
Page size: 1728 x 2592 pts
\mag4000
\documentclass{article}
\usepackage{lmodern}
\usepackage[papersize={6in,9in},margin=5pt]{geometry}
\usepackage{multicol}
\begin{document}
\fontsize{1.2pt}{1.3pt}\selectfont
\begin{multicols}{15}
\loop
\ifnum\value{enumi}<1500
\stepcounter{enumi}
\roman{enumi}\par\Roman{enumi}\par\arabic{enumi}\par
\roman{enumi}\par\Roman{enumi}\par\arabic{enumi}\par
\repeat
\end{multicols}
\end{document}
答案2
TeX 基元\setbo0=\vbox{...}
能够构建\vbox
任意高度的。然后,您可以使用 TeX 基元\vsplit0
读取累积材料的一部分并将其设置到列中。\maxdimen
使用这些基元时没有限制。
我尝试用你的文档进行此操作。我仅将你的\begin{multicols}{13}
文档 替换为\setbox0=\vbox\bgroup \hsize=3cm
,将\end{multicols}
替换为\egroup
。然后我向你的列中添加了一个材料:
\count0=1
\loop
\the\count0 \par
\advance\count0 by1
\ifnum\count0<10000 \repeat
% a real listing has >10k additional lines
最后,我在 后面添加了以下例程\endgroup
。它将累积的材料打印到列中:
\hbox{\count0=1
\loop
\vsplit0 to\vsize
\advance\count0 by1
\ifnum\count0<20 \repeat
}
没有\maxdimen
达到限制,打印了 20 个非常长的列。