●Tex 专 栏

EasyFlow 基 本 系 统 介 绍


从 这 一 期 起 开 始 要 介 绍 easyflow 的 基 本 程 式 , easyflow 的 基 本 程 式 非 常 的 短 , 很 适 合 用 来 了 解 一 个 排 版 系 统 的 运 作 。 以 後 将 逐 渐 的 在 这 个 基 础 上 加 入 各 种 不 同 的 功 能 , 希 望 能 以 easyflow 完 成 一 个 简 捷 的 核 心 , 而 使 以 後 的 功 能 都 能 以 TCL巨 集 的 形 式 出 现 。


王 佑 中


   使 用 电 脑 来 做 编 排 版 面 的 工 作 使 得 一 本 书 的 出 版 大 为 简 化 , 它 的 页 献 不 比 发 明 活 字 排 版 来 得 低 。 因 为 有 了 电 脑 我 们 才 得 以 用 更 低 廉 的 价 格 买 到 书 , 否 则 以 今 日 飞 涨 的 人 工 费 用 , 一 本 书 少 说 也 要 千 把 银 子 才 买 得 到 吧 ! 但 是 使 用 电 脑 後 简 单 的 连 个 人 都 可 以 直 接 在 电 脑 前 排 出 一 本 有 模 有 样 的 书 了 。

   使 用 电 脑 来 排 版 基 本 上 的 概 念 和 人 工 排 版 类 似 , 但 似 有 更 多 的 变 化 。 因 为 我 们 不 再 受 限 於 字 级 , 也 不 再 受 限 於 一 些 机 械 的 格 局 , 我 们 也 更 可 以 很 容 易 的 做 出 更 多 的 特 殊 效 果 , 如 重 叠 或 背 景 等 。 我 们 现 在 开 始 看 一 下 easyflow 所 使 用 的 排 版 观 念 , 有 适 当 的 地 方 我 会 点 出 easyflow 还 少 了 些 什 麽 东 西 。

EasyFlow的排版观念


   easyflow 把 文 件 中 每 一 个 元 素 , 包 括 每 一 个 字 、 每 一 张 图 、 每 一 个 栏 框 , 都 看 成 是 一 个 方 块 。 所 有 的 这 些 方 块 一 个 接 着 一 个 的 被 放 在 纸 张 上 , 当 一 行 满 了 便 放 到 下 一 行 中 , 一 个 栏 框 满 了 便 移 到 下 一 个 栏 框 中 继 续 填 入 , 当 一 页 中 所 有 各 式 的 栏 框 都 满 了 则 移 到 下 一 页 。

   但 有 些 方 块 并 不 加 入 上 述 的 过 程 中 , 它 们 被 显 示 在 纸 面 上 固 定 的 地 方 。 例 如 我 们 经 常 希 望 插 图 被 放 在 纸 面 的 上 方 , 或 是 在 某 些 特 殊 的 页 上 希 望 在 纸 张 的 正 中 央 放 入 一 个 图 形 。 页 次 是 另 一 个 特 殊 的 例 子 , 我 们 可 能 希 望 它 被 放 在 页 底 的 正 中 央 。 这 些 方 块 的 位 置 通 常 是 被 使 用 者 , 或 是 某 些 使 用 者 提 供 的 程 式 来 决 定 它 的 实 际 上 在 页 面 上 的 位 置 , 而 不 是 像 一 般 文 字 般 由 easyflow 的 排 版 引 擎 来 决 定 。

■排版、固定方块

   所 以 方 块 可 大 略 分 成 二 种 , 一 种 是 由 排 版 引 擎 决 定 其 位 置 的 方 块 , 我 称 其 为 排 版 方 块 。 另 一 种 是 自 行 决 定 或 是 由 TCL 巨 集 决 定 位 置 的 方 块 , 我 称 其 为 固 定 方 块 。

   固 定 方 块 会 出 现 在 其 产 生 时 被 赋 与 的 位 置 , 而 且 就 在 产 生 它 时 的 页 上 。 而 排 版 方 块 则 会 依 周 围 情 况 的 不 同 而 改 变 其 位 置 , 但 彼 此 先 後 的 次 序 会 被 维 持 。 也 就 是 说 在 原 始 档 中 先 出 现 的 方 块 在 排 版 时 也 会 优 先 决 定 其 位 置 , 而 其 後 的 方 块 则 一 定 在 其 後 面 。 如 果 我 们 在 原 始 档 中 先 写 一 段 文 字 , 然 後 在 这 个 文 字 後 面 插 入 一 个 表 格 , 则 不 论 前 面 的 文 字 如 何 改 , 表 格 永 远 处 於 文 字 的 後 面 , 绝 对 不 会 因 为 在 它 前 面 文 字 做 了 修 改 而 跑 到 文 字 的 前 面 去 。

   但 在 排 版 方 块 和 固 定 方 块 混 合 时 会 产 生 一 个 问 题 , 它 们 可 能 会 重 叠 在 一 起 。 因 为 固 定 方 块 永 远 固 定 在 同 一 个 位 置 , 而 排 版 方 块 会 一 个 接 着 一 个 的 填 满 整 个 版 面 。 总 有 一 天 它 们 会 重 叠 的 , 如 何 防 止 这 种 情 况 发 生 呢 ? 这 当 然 可 以 给 每 一 个 方 块 一 个 防 止 叠 覆 的 属 性 , 但 随 着 方 块 的 增 加 , 效 率 一 定 会 大 减 , 因 为 我 们 每 加 入 一 个 方 块 就 必 须 检 查 它 和 所 有 有 防 止 叠 覆 属 性 的 方 块 有 无 重 叠 。

■栏框(图例)

   easyflow 让 使 用 者 自 己 负 责 防 止 重 叠 , 它 使 用 栏 框 的 概 念 来 防 止 重 叠 。 使 用 者 应 负 责 将 可 能 重 叠 的 固 定 方 块 放 在 一 个 被 标 示 为 禁 止 进 入 的 栏 框 内 。 这 种 栏 框 和 其 它 栏 框 有 重 叠 时 , 其 它 栏 框 在 填 入 方 块 时 会 避 过 它 。 中 间 那 个 就 是 标 示 为 禁 止 进 入 的 栏 框 , 在 它 所 占 的 位 置 上 是 不 能 放 入 任 何 排 版 方 块 的 , 因 为 easyflow 的 排 版 引 擎 会 避 过 这 个 区 域 。 但 固 定 方 块 的 位 置 是 由 使 用 者 自 己 决 定 , 所 以 不 受 这 个 栏 框 存 在 的 影 响 。

   栏 框 除 了 上 述 的 功 能 外 , 它 最 主 要 的 用 处 是 把 纸 面 上 的 文 字 分 成 很 多 块 。 我 们 可 以 在 纸 面 上 定 义 很 多 的 栏 框 , 每 一 个 栏 框 都 可 以 独 立 的 排 入 各 种 方 块 。 这 些 栏 框 可 以 把 纸 面 分 成 很 多 不 同 的 方 块 区 域 , 利 用 上 述 的 禁 止 进 入 区 域 甚 至 可 以 定 义 一 些 不 规 则 的 区 域 。 我 们 可 以 利 用 栏 框 定 义 一 个 二 栏 式 的 文 件 , 也 可 以 在 主 文 中 插 入 一 些 方 块 文 章 , 或 是 一 些 後 序 发 展 等 小 文 。

   栏 框 可 说 是 一 般 分 别 排 版 系 统 和 文 字 列 印 系 统 的 标 准 , 像 倚 天 等 中 文 系 统 虽 然 也 可 以 让 使 用 者 在 印 列 时 做 很 多 花 样 , 但 它 们 没 有 栏 框 , 所 以 不 能 叫 排 版 系 统 。 easyflow 的 栏 框 非 常 强 大 , 你 可 以 定 义 不 限 数 量 的 栏 框 , 甚 至 在 每 一 页 都 使 用 不 同 的 栏 框 。 你 可 定 义 一 个 临 时 的 栏 框 , 当 它 被 填 满 後 就 自 动 消 失 。 你 也 可 以 如 上 的 禁 止 进 入 栏 框 , 栏 框 还 可 以 用 来 计 算 某 一 串 文 字 在 填 入 纸 面 後 所 需 的 高 度 , 透 过 这 种 功 能 你 可 以 做 出 让 一 群 文 字 确 定 在 同 一 页 的 效 果 。 这 种 栏 框 就 有 点 像 在 TeX 中 的 box。 ( 在 程 式 中 可 以 看 到 , 这 种 栏 框 有 CT_BOX 的 属 性 )

■参数

   easyflow 提 供 了 很 多 的 参 数 让 你 控 制 版 面 的 编 排 , 以 後 相 信 还 会 越 来 越 多 。 和 TeX 一 样 , easyflow 提 供 了 使 用 者 由 巨 集 中 更 改 这 些 参 数 的 机 会 。 不 同 的 是 easyflow 使 用 TCL 做 为 内 建 的 巨 集 , TCL 虽 然 不 像 TeX 的 巨 集 那 麽 有 弹 性 , 但 它 却 有 更 好 的 可 读 性 。 TCL 的 语 法 简 单 , 不 像 TeX 的 巨 集 令 即 使 是 有 经 验 的 程 式 师 也 望 而 生 畏 。 easyflow 更 利 用 一 些 可 设 定 为 TCL 程 序 的 回 叫 函 数 让 使 用 者 能 更 进 一 步 的 控 制 整 个 排 版 的 过 程 , 你 可 以 定 义 一 个 换 页 函 数 , 一 但 定 义 後 easyflow 每 当 换 页 时 就 呼 叫 这 个 函 数 , 你 可 以 在 这 个 函 数 中 更 新 页 次 , 在 页 面 底 部 放 入 表 示 页 次 的 文 字 , 或 是 更 新 索 引 和 交 互 参 考 的 索 引 等 。 easyflow 另 外 提 供 了 很 多 的 回 叫 函 数 让 使 用 者 在 特 殊 情 况 发 生 时 做 适 当 的 处 理 。 easyflow 甚 至 提 供 了 区 块 插 入 函 数 , 你 可 以 每 一 个 方 块 插 入 时 取 得 控 制 权 , 如 此 几 乎 没 什 麽 事 不 可 以 做 了 。

   所 以 构 成 easyflow的 要 素 就 是 :
● 方 块
● 栏 框
● TCL巨 集
● 回 叫 函 数
● 排 版 核 心
● 系 统 参 数

   下 面 我 将 更 详 细 的 讲 解 easyflow 的 每 一 个 动 作 。

系 统 的 启 动


   你 可 以 想 见 easyflow 在 开 始 时 应 该 做 的 工 作 应 该 是 设 定 所 有 的 系 统 变 数 。 在 easyflow 中 使 用 了 非 常 多 的 整 体 变 数 来 记 录 系 统 的 工 作 状 态 , 这 有 点 违 反 模 组 化 的 原 则 , 但 可 能 是 最 简 单 的 做 法 , 这 在 後 面 可 以 看 到 , easyflow 总 是 选 择 最 简 单 的 做 法 。

   系 统 变 数 启 始 的 动 作 都 在 可 分 二 部 份 , 一 部 份 简 单 的 变 数 在 宣 告 时 变 给 予 初 始 值 。 而 一 些 较 复 杂 或 可 由 组 态 档 中 读 入 的 参 数 则 在 Init() 中 设 定 其 初 始 值 , 当 然 也 有 二 者 均 出 现 的 情 况 , 这 些 初 始 值 保 证 即 使 没 有 任 何 体 裁 档 存 在 系 统 也 可 以 正 常 的 运 作 。

   在 系 统 变 数 设 定 完 後 呼 叫 InitPage() 函 数 输 出 Postscript 的 档 头 , 它 被 用 来 定 义 一 些 Postscript 巨 集 以 供 以 後 使 用 。 这 些 程 序 主 要 的 目 的 是 缩 短 输 出 档 的 长 度 , 例 如 在 输 出 一 个 字 元 A 时 , 我 们 可 能 会 用 :

1200 1000 moveto (A) show

   在 (1200,1000)的 地 方 显 示 A这 个 字 元 。 但 我 定 义 了 一 个 程 序 s来 做 这 件 事:

(A) 1200 1000 s

在 档 头 中 s的 定 义 为 :

/s { moveto show} bind def

   如 此 有 二 个 好 处 , 一 是 输 出 的 长 度 几 乎 少 了 一 半 , 另 一 个 是 速 度 也 增 加 了 。 因 为 Postscript 只 要 读 入 一 个 字 元 s 就 可 以 知 道 要 做 些 什 麽 事 , 我 们 用 bind 在 一 开 始 就 让 Postscript 把 s 和 moveto bind 二 个 函 式 系 结 在 一 起 , 所 以 在 後 面 使 用 时 便 没 有 经 过 解 释 器 编 译 的 过 程 , 你 可 以 把 它 当 作 己 被 解 释 器 编 译 成 中 间 码 , 就 像 大 多 数 解 释 器 做 的 一 样 。 接 下 来 我 们 就 将 要 进 入 系 统 的 主 回 圈 。

系 统 主 回 圈


这 个 回 圈 很 简 单 只 有 叁 行 的 码 :

while(ch = GetChar(currentPage,in))
{
Page_addOneChar(currentPage,ch); }

   它 的 动 作 很 简 单 , 就 是 由 先 前 开 启 的 输 入 档 in 中 读 入 一 个 字 元 , 然 後 交 给 排 版 引 擎 排 入 目 前 页 中 。 不 过 这 里 的 " 读 入 一 个 字 元 " 这 个 动 作 并 不 像 表 面 上 那 麽 简 单 , easyflow 和 TeX 一 样 在 读 入 的 阶 段 就 做 巨 集 展 开 及 控 制 字 元 解 释 的 工 作 。 easyflow 提 供 了 丰 富 的 控 制 字 元 , 它 可 以 控 制 使 用 的 字 体 及 其 大 小 , 控 制 字 元 间 矩 、 行 矩 及 其 它 各 种 的 系 统 变 数 。 有 关 这 部 份 的 控 制 都 在 GetChar() 中 被 处 理 , 它 会 再 呼 叫 DealWithControlCode 来 处 理 有 关 控 制 码 的 部 份 。

   在 GetChar() 中 只 有 一 个 地 方 值 得 一 提 , 那 就 是 自 动 走 文 模 式 的 设 定 。 所 谓 自 动 走 文 是 指 无 论 原 始 输 入 档 每 一 行 的 长 度 如 何 , easyflow 会 试 图 将 每 一 行 填 满 , 而 使 每 一 行 的 右 端 尽 量 对 齐 。 如 果 你 要 使 一 行 文 字 在 行 的 中 间 便 换 行 , 你 必 须 用 二 个 连 续 的 换 行 来 达 到 这 个 目 的 。

   说 起 来 有 些 复 杂 , 但 在 实 作 上 很 简 单 , 我 们 只 要 忽 略 换 行 即 可 。 但 我 们 必 须 检 查 是 否 有 二 个 连 续 的 换 行 存 在 , 因 为 那 代 表 真 正 的 换 行 , 排 版 引 擎 会 对 换 行 字 元 做 特 殊 的 处 理 。 以 後 我 将 会 介 绍 莎 士 比 亚 式 的 排 版 规 则 , 大 部 份 的 修 改 都 是 在 这 个 函 数 中 做 。 现 在 我 们 可 以 开 始 进 入 排 版 引 擎 之 中 了 。

排版引擎


   这 个 部 份 是 整 个 程 式 的 中 心 , 但 它 也 是 将 来 做 可 能 大 幅 度 修 改 的 地 方 。 easyflow 的 排 版 规 则 目 前 还 很 粗 糙 , 它 没 有 做 行 的 最 佳 化 , 它 没 有 行 的 对 齐 模 式 , 它 的 TCL 回 叫 巨 集 定 义 也 还 不 是 很 清 楚 , 但 我 相 信 它 在 未 来 一 年 中 将 会 得 到 很 大 的 改 进 。 不 过 即 使 是 现 在 的 状 态 , 它 也 已 比 很 多 在 DOS 上 自 称 是 排 版 系 统 的 程 式 强 多 了 。

   整 个 排 版 引 擎 都 在 column.c 这 个 档 中 , 档 案 出 乎 意 外 的 小 吧 ! 这 也 证 明 了 排 版 程 式 本 身 是 很 简 单 的 一 种 程 式 , 事 实 上 即 使 给 人 复 杂 的 TeX 其 排 版 引 擎 本 身 也 是 数 千 行 的 长 度 而 已 , easyflow 所 做 的 和 TeX 其 实 没 有 太 大 的 不 同 , 但 少 了 一 些 东 西 。 如 glue,kern,penalty 这 些 东 西 , 这 是 因 为 easyflow 没 有 行 长 最 佳 化 的 概 念 , 这 些 东 西 以 後 应 会 加 入 吧 !( 虽 然 在 中 文 中 它 们 的 重 要 性 大 减 )

   在 column.c 中 最 重 要 的 函 式 是 Page_addOneBlock(), 它 负 责 将 各 种 不 同 的 方 块 依 照 它 的 下 列 五 个 参 数 决 定 其 x,y 座 标 的 位 置 。

w 方 块 的 宽 度
h 方 块 的 高 度
ws 方 块 水 平 方 向 的 空 白
hs 方 块 垂 直 方 向 上 的 空 白
type 方 块 的 种 类

   一 个 方 块 在 进 入 这 个 函 数 之 前 必 须 将 这 五 个 参 数 设 定 好 。 不 过 我 们 必 须 注 意 , 只 有 排 版 方 块 需 要 由 这 个 函 数 来 决 定 其 (x,y) 位 置 , 固 定 方 块 是 不 必 经 过 这 个 函 数 而 是 直 接 使 用 Page_addBlock 将 方 块 加 入 纸 面 上 。

   在 这 个 档 案 中 别 有 一 个 包 装 函 数 Page_addOneChar, 这 是 前 面 主 回 圈 中 所 使 用 的 函 数 , 它 的 功 用 是 适 当 的 设 定 字 元 方 块 , 并 且 将 它 送 给 Page_addOneBlock 去 决 定 文 字 方 块 的 位 置 。 这 个 函 数 放 在 这 里 当 然 是 有 一 点 错 误 , 但 这 是 easyflow 发 展 过 程 中 留 下 的 结 果 。

   所 以 现 在 我 们 开 始 来 看 一 下 Page_addOneBlock 这 个 函 式 的 动 作 , 这 个 函 式 中 注 解 相 当 的 多 , 读 者 应 该 不 难 了 解 程 式 的 意 义 。 在 这 里 我 先 用 虚 拟 码 的 方 式 展 示 其 演 算 法 :

if 是 一 个 特 殊 方 块 then
  直 接 加 入 串 列 中 不 做 其 他 处 理
endif

if 不 是 一 个 换 行 换 栏 或 换 页 方 块 then
   找 寻 一 个 可 以 放 入 此 方 块 的 位 置 并 设 其 为 现 在 位 置 ,
   当 找 不 到 时 变 设 其 为 栏 框 的 右 缘 。
endif

if 现 在 位 置 无 法 放 入 方 块 或 是 遇 到 一 个 换 行 换 栏 换 页 方 块
  then 将 游 标 移 到 下 一 行
  if 己 经 超 过 栏 框 底 端 then
  if 此 栏 框 不 加 入 自 动 走 文 then
   return
  endif

if 不 是 换 栏 或 换 页 方 块 then
  此 时 最 後 一 行 的 方 块 应 放 在 下 一 栏 内 , 将 这 些 方 块 记 成 oldlist。
endif

将 栏 框 参 数 设 回 其 初 始 值
将 目 前 栏 框 设 为 下 一 个 栏 框
if 找 不 到 可 用 的 下 一 个 栏 框 或 方 块 为 换 页 方 块 then
   此 时 应 换 页 了 , 首 见 把 页 中 所 有 的 方 块 用 ShipPage函 数 输 出 至 结 果 档 中 。
   将 页 中 的 栏 框 参 数 设 为 最 後 一 栏 框 的 参 数
   将 所 有 暂 时 栏 框 删 除
   用 ReadColumnFromStyleFile读 入 体 裁 档 中 下 一 个 页 的 栏 框 , 如 果 己 无 资 料 则 直 接 使 用 目 前 页 的 栏 框 。
endif

为 新 栏 框 插 入 一 个 字 型 定 义 方 块
将 oldlist中 的 方 块 插 入 新 找 到 的 栏 框 中
if 不 是 换 行 换 栏 换 页 方 块 then
   将 目 前 方 块 插 入 栏 框 中
endif
return

else

   找 到 了 可 以 放 入 方 块 的 位 置 後 更 改 方 块 资 料 中 的 位 置 参 数 後 呼 叫 Page_addBlock 将 方 块 插 入 。

endif

   整 个 演 算 法 可 能 还 有 些 缺 陷 , 我 希 望 你 可 以 告 诉 我 你 的 想 法 。 easyflow 还 是 一 个 相 当 年 轻 的 系 统 , 我 们 还 有 很 多 的 弹 性 可 加 入 其 中 。 你 应 该 仔 细 核 对 一 下 上 面 的 演 算 法 和 实 际 程 式 之 间 的 关 系 , 我 现 在 只 提 出 几 乎 加 以 说 明 。

   (1) 换 行 换 栏 换 页 都 是 以 一 个 方 块 的 形 式 出 现 , 这 是 为 了 在 多 栏 排 版 时 能 得 到 正 确 的 结 果 。

   (2) 寻 找 下 一 个 可 能 位 置 的 程 式 是 在 SearchInALine 中 , 方 法 很 简 单 , 虽 然 效 率 不 是 十 分 的 好 , 不 过 这 就 是 easyflow 的 哲 学 。 永 远 选 最 简 单 的 演 算 法 , 而 不 是 最 有 效 率 的 。

   (3) 当 一 行 文 字 开 始 时 , 其 游 标 位 置 是 在 文 字 的 左 上 角 , 不 过 Postscript 期 望 我 们 把 文 字 放 在 其 基 准 线 上 。 所 以 我 们 把 每 一 个 方 块 分 成 二 部 份 , 一 行 的 文 字 可 看 成

当 方 块 被 插 入 时 其 y 座 标 都 被 放 在 A 处 , 而 当 一 行 结 束 後 会 由 下 列 这 一 段 程 式 :

nb = col->firstb;
while(nb)
{
/* 对 非 自 动 走 文 区 块 , 我 们 不 应 改 变 它 们 的 位 置 */
if (nb->type nb->y -= col->maxHeight;
nb = nb->next;
}
   将 所 有 方 块 的 y 座 标 移 到 B 处 。 而 下 一 行 的 启 始 位 置 则 在 C。

   (4)我 们 每 排 完 一 页 就 把 所 有 方 块 清 出 , 也 就 是 把 所 有 记 忆 体 释 出 , 所 以 能 处 理 的 文 件 大 小 几 乎 没 有 限 制 。

   (5)上 面 演 算 法 中 省 略 了 很 多 的 TCL 回 叫 函 数 的 呼 叫 。

   好 了 , 了 解 easyflow 的 排 版 策 略 了 吗 ? 很 简 单 是 吧 ! 我 们 现 在 就 进 入 一 些 比 较 细 节 的 部 份 。

Postscript图 形 的 处 理


   EasyFlow 最 令 人 振 奋 的 功 能 可 能 就 属 允 许 Postscript 图 形 的 插 入 了 。 因 为 这 意 谓 着 我 们 可 以 插 入 几 乎 任 何 的 图 形 档 , 因 为 我 们 有 很 多 免 费 的 图 形 转 换 程 式 , 如 ImageMagic, xv... etc。 它 们 都 可 以 将 几 乎 市 面 上 可 见 的 所 有 格 式 的 图 形 档 转 成Postscript。 不 过 这 个 功 能 的 实 作 出 奇 的 简 单 , 因 为 我 们 原 本 的 输 出 档 就 是 Postscript , 所 以 插 人 的 工 作 不 过 就 是 适 当 的 定 义 一 个 转 换 矩 阵 来 缩 放 这 些 图 形 档 而 己 。

   EasyFlow 可 以 插 入 二 种 不 同 类 形 的 Postscript 档 , 一 种 是 EPSF 档 , 一 种 是 PS 命 令 档 。 所 谓 EPSF 档 是 指 一 种 固 定 格 式 的 Posrsctipt 档 , 这 种 档 中 除 了 一 般 的 Postscript 命 令 外 , 多 了 一 个 所 谓 结 构 化 注 解 , 这 些 结 构 化 注 解 使 我 们 可 以 很 容 易 的 知 道 这 个 EPSF 档 的 大 小 位 置 等 属 性 , 我 们 可 以 由 这 些 属 性 决 定 如 何 定 义 我 们 的 转 换 矩 阵 。

   PS 命 令 档 则 是 指 一 般 的 Postscript 档 , easyflow 处 理 这 二 种 档 时 采 用 不 同 的 方 法 。 插 入 一 个 EPSF 档 时 easyflow 会 在 插 入 前 先 放 入 一 个 save 命 令 , 则 在 结 束 时 放 入 一 个 restore 命 令 。 如

save
100 100 translate 0.3 0.3 sacle
....
....
restore

   save 是 把 所 有 目 前 的 Postscript 状 态 备 份 起 来 , 而 restore 则 是 存 回 先 前 储 存 的 状 态 。 但 在 PS 命 令 档 的 状 况 下 就 没 有 这 二 个 命 令 了 , 也 不 会 有 第 二 行 的 转 换 矩 阵 定 义 。 此 时 这 个 插 入 的 档 会 影 响 实 际 的 Postscript 状 态 , 这 个 命 令 通 常 不 应 被 用 来 直 接 下 达 Postscript 命 令 , 而 是 被 用 来 定 义 一 些 命 令 供 後 面 的 TCL 巨 集 使 用 。 在 以 後 的 文 章 中 会 更 清 楚 的 看 到 这 一 点 。

   而 在 EPSF 的 部 份 easyflow 只 使 用 BoundingBox 来 决 定 其 大 小 , BoundingBox 有 四 个 参 数 。 分 别 是 整 个 图 形 的 左 上 角 和 右 下 角 的 位 置 , 由 这 四 个 参 数 我 们 可 以 求 得 其 宽 度 和 高 度 。 如 果 左 上 角 不 在 (0,0) 而 在 (x,y), 则 我 们 须 做 一 个 (-x,-y) 的 translate 使 它 回 到 我 们 想 要 的 点 , 而 easyflow 允 许 用 使 用 者 定 义 一 个 图 形 的 小 大 , 所 以 我 们 也 要 用 一 个 scale 命 令 使 图 形 缩 放 至 指 定 的 大 小 , 整 个 处 理 过 程 都 在 EPSF.c 这 个 程 式 中 。

   这 一 期 就 到 此 为 止 , 我 己 经 介 绍 过 大 多 数 的 easyflow 程 式 。 剩 下 的 就 是 TCL 巨 集 的 部 份 了 , 下 一 次 我 将 介 绍 :

(1)TCL的 语 法
(2)如 何 为 应 用 程 式 加 上 TCL巨 集
(3)easyflow中 的 TCL巨 集
(4)easyflow栏 框 的 详 细 介 绍
(5)easyflow-TCL的 简 单 应 用

是 否 等 不 及 了 呢 ? 先 看 看 光 碟 中 的 程 式 过 瘾 吧 !
( 相 关 程 式 见 光 碟 片 \AUTHOR\TEX\ 子 目 录 )