描述页面宽度的堆栈语言如何起作用
IBM® LaserPrinter 4029 Series 技术参考包含一个图和一个表,这些图和表一起描述了页面上可打印和不可打印的区域,以及纸张和信封尺寸 (以像素为单位) 的标准纸张和信封大小。
例如,在一个 8.5 x 11(宽度乘长度)英寸的页面上可打印区域 是 2400 x 3200 像素(宽度乘长度)。 请注意如果页面旋转了 90 或 270 度以进行横向打印,那么长宽交换为 3200 x 2400 像素(宽度乘长度)。
对 %IwW 的求值从检查是否在命令行使用了 w 标志 开始;如果是,那么不执行任何计算。 将使用请求的值。 (这并不能保证它将工作,只是将使用该值。) 如果在命令行未使用 w 标志,那么 piobe 必须指出在当前作业环境下页面的宽度,该值还由其他 命令行标志和冒号文件缺省值来确定。
对 _w(页面宽度)求值时检查的第一项是页面方向(_z)。 如上所述,将页面 旋转奇数次 90 度将使得页面的长宽交换。 查看 wK 定义开头的 if-then-else 语句,可以看 到 _z 值是一个开关,它控制将 wJ 和 wK 中的哪个用于页面宽度。 如果页面是纵向的,那么 wJ 是宽度。 如果页面是横向的,那么 wK 是宽度。 对 页面宽度(以像素为单位)进行解析后,将像素个数转换为字符个数时 wK 定义中转义序列的剩余部分只考 虑字符间距和字符宽度(是不是双倍宽度)。
因为页面方向是横向,所以选择 wK 属性。 迄今为止我们知道的是已交换过维;但是并不知道实际的维是什么。 对 wK 的求值从获取 Q 标志的命令行使用值(如果有)开始,这是一个请求特定纸张大小的、与打印机相关的值。 如果在命令行上使用了 问 标志,那么该值将用于选择纸张宽度 (以像素为单位) ,否则将通过评估 吴来确定 问 的值,该值是基于属性 (_O) (输入纸张处理的类型) 和 (_U) (输入纸张来源) 的纸张来源的值。 注 意,_Q 定义为 %IwQ,它的定义以 %IWu 开始。
由于在命令行上未使用 Q,对 Wu 的求值确定也没有使用 O 标志,因此在 Wu 定义中的外部 if-then-else 语句中执行 else 子句,将 _u 的缺省冒号文件值 1 返回到对 wQ 的求值中。
因为这与对 _w 求值的转义序列的嵌套深度相同,所以更仔细地 研究 Wu 的逻辑定义是有价值的。 请记住 O、u 和 Q 的定义和合法值是:
- O - 输入纸张处理的类型 - 1(手动),2(连续 打印纸),3(进纸)- 缺省值是进纸。
- u - 输入纸张来源 - 1(主要),2(备用),3(信封)- 缺省值是主要。
- Q - 输入纸张来源的纸张大小 - 这些值取决于打 印机 - 由 O 和 u 结合在一起定义。
定义 Wu 的转义序列说明:
- 第 1 种情况:如果在命令行上未使用 O 标志,那么返回 _u 的冒号文件缺省值。 例 如,如果用户未指定输入纸张处理的类型,那么就将输入纸张来源(来自命令行或来自冒号文件的缺省值)返回 对 %IwQ 的求值。
- 第 2 种情况:如果在命令行上使用了 O 标志但是它的值不是 1,那么返回 _u 的冒号文件缺省值。 例如,如果用户指定了手动方式以外的输入纸张处理类型,那么将输入纸张来源(从命令行或缺省情况下从冒号文件)返回到对 %IwQ 的求值。
- 第 3 个情况: 如果在命令行上使用了 O 标志,并且其值为 1,并且在命令行上未使用 乌 标志,那么返回 0。 例如,如果用户指定手动处理纸张,但未指定输入纸源,则%IwQ 返回0。
- 第 4 种情况:如果在命令行使用了 O 标志并且它的值 为 1,在命令行使用了 u 标志并且它的值不大于 2,那么 返回 0。 例如,如果用户指定了手动纸张处理,还指定了主输入纸源或备用输入纸源,则%IwQ 的评估结果将返回0。
- 情况 5: 如果在命令行上使用了 O 标志,并且其值为 1,并且在命令行上使用了 乌 标志,并且其值大于 2,那么返回 4。 例如,如果用户指定手动处理纸张,并指定信封为输入纸源,则%IwQ 的评估结果将返回4。
对 wQ 的定义是一个 if-then-else-then-else-then-else-then-else 语句,它重复地 将 Wu 的值与整数 0、1、2 和 3 相比较,查找是否有匹配。 匹配的值从属性 s0、s1, s2、s3 或 s4 中选择一个值(如果没有其他匹配则选择 s4)。 这些属性定义的各项如下:
- s0 - 手动送纸的纸张大小
- s1 - 纸托 1(上层)的纸张大小
- s2 - 纸托 2(底层)的纸张大小
- s3 - 用于信封送纸的信封大小
- s4 - 用于手工信封大小的信封大小
在 "IBM" 4029 "LaserPrinter,"上的 ASCII 队列虚拟打印机定义中,这五个属性只有两个唯一值: s0、"s1"和 "s2"都是 "1,而 "s3"和 "s4"都是 "3"。
回忆前面的嵌套转义序列,可以看到 wK 的定义由外部 if-then-else 语句组成。 此语句的 if 和 else 部分都包含 if-then-else-then-else 的链 ... 语句。 Wu 的值(基于 O 和 u 的纸张来源值)确定执行外部语句的 if 还是 else 段;如果 Wu 是 1 或 2(小 于 3),那么执行 if 段,否则执行 else 段。 最终确定的 wK 决定了页面宽度(以像素为单位)。
第 1 种情况:u 的命令行值或来自冒号文件的缺省值(1 即主要纸托)被返回到对 wQ 的求值中。 wQ 定义中 剩余的转义序列测试 Wu 的值并选择 s0、s1、s2、s3 或者 s4 中的一个值。 接着将该值返回到对 wK 的求值中。 如果 u 是 1 或 者 2,那么 Q 将为 1(非信封纸张大小)。 如果 u 是 3,那么 Q 将为 3(信封纸张大小)。 对 wK 的求值再次开始 后,u 的值为 1 或 2 将指示该过程进入外部 if-then-else 语句的 if 段,Q 值为 1 将选择 3200 像素的页面宽度。 u 值为 3 将指示该过程进入外部 if-then-else 语句的 else 段,Q 值为 3 将选择 2750 像素的信封页面宽度。
第 2 种情况:与第 1 情况相同。
第 3 种情况:在命令行上有用户指定的手动纸张处理但是没有指定纸张来源,因此将 Wu 指 定为值 0,并且该值被返回到对 wQ 求值中。 0 将 导致为 wQ 指定值 s0(用于手动送纸的纸张大小是 1)。 对 wK 的求值再次开始后,u 的值为 0 将指示该过程进入外部 if-then-else 语句 的 if 段,Q 的值为 1(s0)将选择 3200 像素的页面宽度。
第 4 种情况:在命令行上有用户指定的手动纸张处理,并且还使用 u 标志来指定 主要或备用纸张来源(但肯定不是信封)。 与第 3 种情况一样,将选择 3200 像素的页面宽度。
第 5 种情况:在命令行上有用户指定的手动纸张处理并且还使用了 u 标志来指定信封纸张来源,这样就将 Wu 指定为值 4,并且该值将被返回到对 wQ 的求值。 第 4 种 情况将导致对 wQ 指定值 s4(用于手动信封大小的信封大小是 3)。 对 wK 的求值再次 开始后,u 的值为 4 将指示该过程进入外部 if-then-else 语句的 else 段,Q 的值为 3 将选择 2498 像素的信封宽度。
- 我们的示例是第 1 种情况:在命令行上既没有使用 O 也没有使用 u 标志,所以将 Wu 的值指定为 1,该冒号文件的缺省 _u 值。 对 wQ 的求值重新开始时,在 s1 上出现匹配,并将 1 返回到对 wK 的求值中。 u 的值 为 1 指示该过程进入外部 if-then-else 语句的 if 段,Q 的值 为 1 将选择 3200 像素的页面宽度。 该值将返回到对 _w 的求值中。
定义 _w 的剩余打印机冒号文件的转义序列推断,如果可使用 3200 像素(水平),并且如果想使每英寸上有 12 个字符,并且如果打印机分辨率为每英寸 300 像素,那么每页可以打印 128 个字符。 将字符间距和 打印机分辨率都乘 10 来说明指定 17 为字符间距的可能性。 字符间距为 17 实际上是 17.1,所以同时将分子和分母都乘 10 将 使得 .1 记入最后的页面宽度计算。 值 128 将被返回到对 ia 的求值中。 这 就说明了 PIPELINE OF FILTERS 中的 -128 是如何得到的。