简洁版本
我想使用常规模式填充页面上的一个或多个矩形区域。该区域应跨越页面宽度并垂直拉伸以填充剩余空间。该模式应仅使用 PDF 模式功能包含在生成的 PDF 中一次,而不是重复为基本单元格的每个副本发出相同的绘图指令。使用仅适用于的特殊功能pdflatex
是可以接受的。
长版本
我的目标是制作交替出现问题陈述和答案区域的纸张。答案区域(并且只有这些)应使用 5 毫米方格的网格图案化。(在德国,这通常称为“Karopapier”,从维基百科,美国术语可能是“方格纸”或更具体地说是“四边形纸”。)
方块的黑线太小,而灰线在胶印机的最终结果中无法正确再现。因此,方块必须由小点组成,每条边 10 个小点。
我目前有代码可以做到这一点,改编自其他一些我不完全理解的代码。它通过将picture
环境的结果保存到一个框中来创建一个正方形。然后重复使用该框\cleaders
来填充一行,并再次重复以填充一个块。它是有效的,但结果有很多缺点。显然,PDF 将包含每个点的单独绘图说明。这会使文件非常大,导致我的 PDF 查看器在滚动浏览这些文档时变得非常慢,并且打印也会花费相当多的时间。
我知道可以在 PDF 中定义模式,并使用这些模式填充形状。我想在 LaTeX 文档中利用这一点。我希望编写一些宏,这样我就可以简单地调用一个类似\graphpaper{\textwidth}{fill}
或类似的宏来创建这样的框。其他一切都应该隐藏在幕后。
可能的解决方案的草图
我有一个粗略的想法,我将使用特征由pdfTeX引擎,即pdflatex
命令。
- 用于
\pdfsavepos
标记起始位置 - 使用
\pdflastxpos
和\pdflastypos
将该位置写入某些辅助文件 - 使用提供的尺寸为盒子创造空间
- 标记并写下结束位置,如1.和2。
- 使用以下方式保留对象编号
\pdfobj reserveobjnum
- 将对象编号也写入输出文件
- 插入一些
\special
作为框的占位符,引用上述对象 - 用预先
\output
调用原始内容的东西替换\output
- 在进行实际输出之前,打开辅助文件进行输出
- 输出后,重新读入文件以获取位置和对象编号
- 对于每个要图案化的区域,通过减去标记位置并四舍五入为正方形尺寸的倍数来计算所需的尺寸。
- 使用创建相应的对象
\pdfobj useobjnum
- 对于需要它的第一个页面,创建一个对象来表示模式本身
我不完全确定这是否能按预期工作。特别是,我仍然怀疑我是否能够在每个页面上包含多个区域,而且我也不确定上述单次传递方法是否真的有效。
问题
我的核心问题是:
您知道有什么更简单的方法可以实现我想做的事情吗?
我很高兴能找到一个已经提供我所需功能的软件包。如果没有,我也会重视对做类似事情的代码的引用,我可能会在此基础上构建我的东西。如果有人对我上面概述的方法有特别的评论,以及它是否有效,那也会很有用。
答案1
这是解决方案的开始。需要做更多的工作,但我现在没有时间。也许有人会接手并改进它。例如,它可以正确地挂接到 pdftex 颜色堆栈机制中……
\documentclass{article}
\usepackage{xcolor}
%First define the pattern:
\immediate\pdfobj stream attr{%
/Type /Pattern
/PatternType 1
/PaintType 1
/TilingType 1
/BBox [0 0 20 20]
/XStep 14.1732283 % 5mm step
/YStep 14.1732283 % 5mm step
/Resources << >>}{%
2.83465 0 0 2.83465 0 0 cm % use mm as units
1 J % rounded caps (to make dots)
0.25 w % line 0.25 units wide
[0 0.5] 0 d % dots every 0.5 units
1 1 m 1 6 l 6 6 l S % draw two edges of the unit square
}
%Now add pattern to the page resource dictionary:
\edef\myn{\the\pdflastobj}
\begingroup
\edef\x{\endgroup
\pdfpageresources{%
\the\pdfpageresources /Pattern <</Mydots \myn\space0 R>>
}%
}%
\x
%Define a command to use the pattern:
\makeatletter
\newcommand{\mypattern}[1]{\pdfliteral{/Pattern cs /Mydots scn}#1\reset@color}
\makeatother
\begin{document}
Normal:\hrule height 10pt
%draw whatever you want. here i am using some text and a solid rule for demonstration
\mypattern{\Huge\textbf{\textsf{Patterned:}}\hrule height 40pt}
Normal:\hrule height 10pt
\end{document}