EasyFlow系 列 二

Easy Flow的 巨 集 程 式 -------EFTCL


本 期 要 介 绍 Easy Flow中 的 巨 集 程 式 EasyFlowTCL (EFTCL), EFTCL提 供 EasyFlow最 大 的 弹 性 , 有 了 它 EasyFlow几 乎 可 以 做 任 何 事 。 要 如 何 在 应 用 程 式 加 上 TCL的 巨 集 , 让 像 Easy Flow这 样 的 小 程 式 也 能 够 有 专 业 的 外 貌 。 因 此 , 本 文 除 了 是 对 EFTCL的 介 绍 外 , 也 可 算 是 对 TCL巨 集 语 言 的 入 门 指 引 。


王 佑 中


   一 个 巨 集 语 言 能 为 应 用 程 式 带 来 革 命 性 的 改 变 , 不 相 信 吗 ? 那 就 看 看 TeX吧 ! 一 个 Plain TeX的 档 案 和 一 个 LaTeX档 案 的 差 距 足 以 证 明 一 个 巨 集 语 言 能 为 应 用 程 式 带 来 多 大 的 改 变 。 dBASE如 果 当 初 没 有 设 计 那 个 笨 笨 的 巨 集 语 言 , 只 不 过 是 个 记 录 资 料 的 程 式 罢 了 。 Lotus如 果 没 有 巨 集 , 还 能 那 麽 受 欢 迎 吗 ? PE2大 受 欢 迎 有 一 部 份 是 在 於 那 个 简 单 得 不 能 再 简 单 的 巨 集 定 义 ( 它 甚 至 很 难 叫 它 是 个 语 言 ) 。 如 果 把 应 用 程 式 比 做 CPU, 那 巨 集 语 言 可 说 是 让 它 活 起 来 的 作 业 系 统 。

   但 在 应 用 程 式 内 做 一 个 巨 集 语 言 是 一 个 很 难 的 事 情 吧 ! 或 许 , 如 果 你 自 己 从 头 做 起 的 话 , 它 可 能 和 你 的 应 用 程 式 一 样 , 甚 至 更 复 杂 。 但 何 必 重 新 发 明 轮 子 呢 ? 我 们 有 半 打 各 式 各 样 的 巨 集 型 语 言 可 供 我 们 很 容 易 的 把 它 们 内 建 在 系 统 之 中 , TCL就 是 其 中 的 佼 佼 者 。 它 的 效 率 可 能 不 太 好 ( 事 实 上 可 能 是 最 差 的 ) , 语 法 可 能 也 和 一 般 语 言 有 所 不 同 , 但 它 自 始 就 以 程 式 库 的 形 式 出 现 , 要 把 它 放 在 一 个 应 用 程 式 中 是 再 简 单 不 过 的 事 了 , 这 也 是 我 选 择 它 的 原 因 。 记 得 我 说 过 EasyFlow的 程 式 永 远 选 择 最 简 单 的 做 法 吗 ?

   下 一 期 我 还 会 介 绍 Easy Flow基 本 系 统 的 最 後 一 个 部 份 , 然 後 就 会 开 始 介 绍 一 些 EFTCL的 应 用 , 最 後 把 它 们 集 合 成 一 个 实 用 的 EasyFlow基 本 程 式 库 。 我 很 欢 迎 各 位 和 我 讨 论 程 式 库 中 该 有 些 什 麽 。 在 程 式 库 完 成 之 後 , EasyFlow可 能 的 方 向 是 加 上 方 程 式 和 表 格 的 功 能 , 不 过 这 可 能 是 好 几 个 月 以 後 的 事 了 。 EasyFlow目 前 架 构 还 在 探 索 的 阶 段 , 希 望 能 得 到 更 多 人 的 帮 助 , 这 也 是 我 写 的 这 一 系 列 文 章 的 主 要 目 的 。

如 何 将 TCL植 入 应 用 程 式 内

   这 一 节 中 的 内 容 适 用 於 TCL 7.X版 , 相 信 将 来 也 不 会 有 太 大 的 改 变 。 在 这 里 我 只 介 绍 EasyFlow用 到 的 部 份 , 其 馀 的 东 西 只 要 参 考 John K. Ousterhout自 己 写 的 书 。 这 本 书 叫 Tcl and the TK Toolkit, 在 台 湾 就 可 以 买 得 到 。

   前 面 提 过 TCL是 以 一 个 程 式 库 的 形 式 存 在 , 它 的 程 式 库 本 身 是 可 重 复 使 用 的 , 所 有 有 关 於 它 的 资 料 都 会 被 记 在 一 个 型 态 为 Tcl_Interp的 结 构 中 。 我 们 应 在 程 式 一 开 始 时 用

Tcl_Interp *Interp;
Interp = Tcl_CreateInterp( ) ;

   建 立 这 个 结 构 。 如 果 你 真 的 需 要 很 多 个 不 同 的 TCL解 释 器 , 你 可 重 复 呼 叫 这 个 函 数 以 建 立 多 个 型 态 为 Tcl_Interp结 构 。 然 後 你 可 以 任 意 送 入 完 整 或 片 段 的 TCL巨 集 码 的 解 释 器 , 有 二 个 方 法 可 以 做 到 这 件 事 。 第 一 种 是
if( Tcl_EvalFile( Interp,” ~/.initapp” ) ! = TCL_OK)
{
fprintf( stderr,” Tcl error: %s\n” ,
Interp->result) ;
}

   这 个 呼 叫 会 载 入 存 放 在 ~/.initapp中 的 巨 集 码 并 用 Interp所 代 表 的 解 释 器 来 执 行 这 一 段 程 式 。 另 一 种 是

if( Tcl_Eval( Interp,” set a 1” ) ! =TCL _OK)
{
fprintf( stderr,” Tcl error : %s\n”
,Interp->result) ;
}

   这 种 方 法 直 接 传 送 一 个 字 串 给 解 释 器 。 无 论 那 一 种 方 法 我 们 都 可 以 看 到 函 数 呼 叫 会 传 回 一 个 表 示 执 行 状 态 的 值 , 如 果 这 个 值 不 等 於 TCL_OK表 示 有 错 误 发 生 , 而 错 误 讯 息 被 放 在 Interp->result中 。

   典 型 的 内 建 即 包 括 了 上 述 二 个 步 骤 , 首 先 建 立 Interp结 构 , 然 後 在 适 当 的 时 候 呼 叫 上 列 二 函 数 之 一 执 行 巨 集 。 有 了 这 二 部 基 本 上 系 统 内 已 多 出 一 组 TCL内 建 的 指 令 可 用 , 但 我 们 必 须 提 供 一 组 新 的 命 令 供 巨 集 程 式 控 制 我 们 的 系 统 。 例 如 在 EasyFlow中 我 们 必 须 提 供 设 定 栏 框 及 排 版 参 数 的 命 令 使 TCL 巨 集 可 以 控 制 排 版 的 过 程 , 我 们 也 应 提 供 在 文 件 内 插 入 额 外 的 文 字 , 如 页 次 或 抬 头 等 的 命 令 。 应 用 程 式 的 程 式 师 最 重 要 工 作 就 是 仔 细 的 设 计 出 一 套 好 用 且 合 理 的 命 令 , 在 TCL中 加 入 一 个 命 令 是 很 简 单 的 一 件 事 , 你 可 以 在 下 一 节 中 看 到 TCL基 本 上 是 一 种 命 令 式 的 语 言 , 它 的 语 法 和 一 般 的 shell很 像 。 在 TCL中 一 个 程 式 是 由 多 个 命 令 组 成 , 而 每 一 个 命 令 是 由 一 个 命 令 名 称 和 多 个 引 数 所 组 成 。 TCL在 取 得 一 个 完 整 的 命 令 後 , 会 把 它 用 下 面 形 式 传 送 给 命 令 函 式 ,

UserCommandProc( ClientData dat,
Tcl_Interp *Interp,
int argc,char *argv[])

   dat是 一 块 可 用 来 储 存 在 此 命 令 有 关 资 料 的 记 忆 体 , 在 EasyFlow中 恒 为 NULL。 Interp是 前 面 产 生 的 解 释 器 , argc表 示 argv 中 阵 列 长 度 , 而 argv则 是 一 个 字 串 阵 列 , argv[0]是 命 令 名 称 , argv[1]...argv[argc-1]是 引 数 名 称 。 你 可 以 发 现 它 和 C的 协 定 很 像 , 这 也 就 是 我 称 其 为 命 令 式 语 言 的 原 因 。

   而 藉 着 dat这 个 参 数 的 使 用 , 我 们 可 以 用 一 种 类 似 物 件 导 向 的 方 式 来 设 计 命 令 。 例 如 我 们 可 以 先 定 义 一 个 叫 做 CreateColumn 的 命 令 , 这 个 命 令 接 受 一 个 参 数 。 这 个 参 数 就 是 代 表 将 被 产 生 的 物 件 的 名 称 , 假 设 它 叫 column1。 我 们 可 以 用 下 面 的 命 令 产 生 这 个 物 件 。

CreateColumn column1

   这 个 命 令 的 结 果 就 是 多 了 一 个 叫 column1的 命 令 , 在 实 际 上 column1这 个 命 令 在 TCL中 的 地 位 在 CreateColumn是 一 样 的 。 它 也 可 以 接 受 一 些 参 数 , 例 如 :
column1 -startx 10 -starty 20

   把 栏 框 的 左 上 角 的 座 标 设 成 ( 10,10) 。 不 过 , EasyFlow的 巨 集 至 目 前 为 止 都 没 有 采 用 物 件 导 向 式 的 方 法 。 将 来 也 许 会 如 此 做 , 因 为 排 版 本 身 就 是 一 件 很 有 物 件 导 向 式 倾 向 的 工 作 。

   所 以 我 们 的 第 叁 件 工 作 就 是 根 据 需 要 定 义 适 当 的 命 令 。 一 个 命 令 有 被 使 用 前 应 先 用 RegisterTCLCommand注 册 , 我 们 不 一 定 要 在 一 开 始 时 就 呼 叫 这 个 函 数 , 只 要 在 实 际 被 使 用 前 呼 叫 即 可 。 EasyFlow中 在 tcl_Init( ) 中 注 册 所 有 的 命 令 , 你 可 以 看 到 Easy Flow中 实 际 注 册 了 八 个 命 令 :

easy_paper \ easy_paper \ easy_column easy_status \ easy_del \ easy_register easy_read \ easy_lastbox

   限 於 篇 幅 无 法 一 一 介 绍 它 们 , 请 参 考 EasyFlow中 文 件 。 TCL并 未 规 定 其 引 数 格 式 , 命 令 处 理 函 式 需 自 己 决 定 如 何 使 用 这 些 引 数 。 你 可 以 参 考 PaperCallBack或 其 他 的 命 令 函 数 了 解 一 般 做 法 , 在 这 里 就 不 多 说 。

TCL的 语 法

   这 一 节 不 是 介 绍 如 何 写 一 个 TCL程 式 , 我 只 简 单 地 就 TCL语 法 做 一 总 结 。 因 为 初 学 TCL的 人 常 被 它 奇 怪 语 法 规 定 所 迷 惑 , 这 一 节 是 一 个 很 好 清 机 会 , 但 也 许 你 应 先 了 解 一 下 TCL的 语 法 , 再 来 看 这 一 节 比 较 合 适 。

一 .TCL的 特 性 :

   TCL和 一 般 语 言 不 同 , 它 是 一 个 命 令 式 的 语 言 , 一 个 TCL程 式 是 由 许 多 个 命 令 组 成 。 每 一 个 命 令 是 一 个 命 令 名 称 , 後 面 跟 着 许 多 个 参 数 所 构 成 。 TCL事 实 上 比 较 接 近 Shell解 释 器 , 所 以 它 基 本 上 一 个 命 令 是 以 行 为 单 位 , 但 有 一 些 特 殊 的 字 元 会 使 命 令 可 以 延 伸 到 一 行 以 上 。 这 一 节 主 要 就 是 要 介 绍 TCL如 何 把 输 入 的 文 字 分 割 成 一 个 一 个 的 命 令 , 然 後 呼 叫 适 当 的 副 程 式 来 做 命 令 所 代 表 的 工 作 。

   这 样 说 起 来 有 些 抽 象 , 我 们 看 一 个 实 际 的 范 例 。 我 虽 然 还 没 有 介 绍 TCL的 语 法 , 但 还 是 请 大 家 猜 一 下 下 面 的 程 式 要 如 何 分 成 不 同 的 命 令 :

while do {
set a 1
}
while do
{
set a 1
}

   前 叁 行 会 被 看 成 一 个 命 令 , 命 令 名 称 为 while参 数 为 do和 set a 1。 但 後 叁 行 会 被 看 成 四 个 命 令 :
( 1) while do
( 2) {
( 3) set a 1
( 4) }

   初 次 写 TCL巨 集 的 人 一 定 经 常 犯 这 个 错 误 , 这 是 命 令 式 语 言 一 个 非 常 重 要 特 性 。 换 行 在 这 种 语 言 中 是 非 常 重 要 , 它 并 不 是 像 一 般 如 C、 PASCAL等 自 由 格 式 ( Free Form) 语 言 般 把 换 行 看 成 和 空 白 相 等 地 位 。

   另 一 个 初 学 者 常 犯 的 错 误 为 运 算 式 的 写 法 , 因 为 TCL是 一 个 命 令 式 的 语 言 , 所 以 运 算 式 的 写 法 和 一 般 的 语 言 并 不 同 , 运 算 式 的 计 算 必 须 以 命 令 的 格 式 出 现 。 运 算 式 其 实 只 是 一 个 字 串 , 而 这 个 字 串 则 是 一 个 特 殊 命 令 expr的 参 数 。

set a $a+1
=====> 错 误
set a [expr $a+1]
=====> 正 确

   前 面 是 初 学 TCL的 人 常 会 犯 的 错 误 , TCL的 运 算 式 一 定 要 跟 在 expr的 後 面 , 做 为 expr的 一 个 参 数 。

   TCL另 一 个 重 要 的 特 性 是 它 和 其 他 的 命 令 式 语 言 一 样 , 取 用 它 的 变 数 必 须 在 变 数 名 称 前 加 入 一 个 $。 为 什 麽 要 这 样 呢 ? 原 因 是 TCL把 所 有 参 数 都 视 为 一 个 字 串 , 如 果 不 在 变 数 名 称 前 加 上 一 个 $, 变 数 名 称 会 被 视 为 一 个 字 串 而 传 入 命 令 之 中 。 如 上 例 常 会 误 写 成 :

set a [expr a+1]

   最 後 一 个 重 要 的 特 性 是 TCL所 有 的 变 数 都 是 字 串 型 态 , 这 也 是 TCL唯 一 的 资 料 型 态 , 甚 至 连 整 数 和 实 数 也 都 是 一 个 字 串 。 所 以 我 们 可 以 期 待 TCL中 数 字 的 运 算 速 度 一 定 会 十 分 的 慢 , 你 可 以 用 下 列 程 式 得 到 十 分 清 楚 的 印 象 。

for {set i 0} {$i( 100000} {set i [expr $i+1]} {}

   这 麽 简 单 的 程 式 竟 然 要 花 上 半 分 钟 才 做 得 完 , 其 效 率 不 佳 由 此 可 见 , 但 前 面 说 过 这 不 是 TCL设 计 时 主 要 的 考 量 。 上 例 若 写 成 :

for{set i 0}{$i( 100000}{set i [expr $i+1]}{}

   则 会 得 到 一 个 错 误 , 这 是 因 为 for{set 被 看 成 是 一 个 命 令 。 所 以 必 须 注 意 在 TCL 中 所 有 的 空 白 都 不 能 随 意 的 省 去 , 空 白 和 换 行 一 样 都 被 用 来 分 隔 字 串 。

   所 以 下 面 我 再 把 TCL特 性 重 复 一 次 :

   以 行 为 导 向 的 语 法 。
   特 殊 型 式 的 运 算 式 。
   使 用 变 数 必 须 在 变 数 名 称 前 加 上 $。
   全 部 的 变 数 都 是 字 串 。
   空 白 字 元 被 用 来 分 隔 字 串 。

二 .TCL分 隔 语 法 单 元 的 方 法 :

   TCL把 字 串 用 下 面 的 法 则 分 隔 成 多 个 字 串 :

● TCL程 式 是 由 多 个 命 令 组 成 , 每 个 命 令 是 由 换 行 或 是 分 号 ( ;) 隔 开 。

● 每 个 命 令 由 多 个 字 串 组 成 , 第 一 个 字 串 被 视 为 命 令 名 称 。

● TCL依 下 列 规 则 取 出 一 个 字 串 :

   ■ 如 果 第 一 个 非 空 白 字 元 为 左 大 括 号 {, 则 将 对 称 的 右 大 括 号 和 这 个 左 大 括 号 间 所 有 的 字 元 视 为 一 个 字 串 。 这 是 写 一 个 内 含 空 白 的 方 法 之 一 。

   ■ 如 果 第 一 个 非 空 白 字 元 是 ” , 则 将 下 一 个 ” 之 前 的 字 元 视 为 一 个 字 串 。 但 其 中 的 字 元 会 做 字 元 取 代 和 变 数 取 代 的 工 作 , 这 是 和 上 一 个 规 则 不 同 之 处 。

   ■ 如 果 第 一 个 非 空 白 字 元 是 [, 则 将 对 称 的 ]之 间 文 字 视 为 一 段 TCL程 式 , 字 串 实 际 值 是 把 这 个 程 式 执 行 後 传 回 值 。 要 注 意 这 边 并 没 有 变 数 取 代 及 字 元 取 代 的 动 作 。

   ■ 若 为 其 他 的 字 元 则 将 此 字 元 起 到 下 一 个 空 白 为 止 的 字 元 搜 集 成 一 个 字 串 。 这 个 字 串 会 做 变 数 取 代 及 字 元 取 代 的 工 作 。

   ■ 变 数 取 代 是 指 以 $为 起 始 的 字 串 以 一 个 变 数 值 取 代 , 这 个 变 数 名 称 就 是 字 串 除 去 第 一 个 $的 部 份 。 字 元 取 代 则 是 指 ’ \’会 吃 掉 後 面 字 元 , 而 形 成 一 个 单 独 的 字 元 。 规 则 和 C语 言 使 用 的 相 同 。 比 较 特 别 的 是 行 末 的 ’ \’ 会 吃 掉 随 後 的 换 行 ,而 空 白 前 面 的 ’ \’ 会 使 空 白 失 去 分 隔 字 串 的 功 用 。

   ■ TCL对 每 个 字 元 只 处 理 一 次 , 字 串 的 边 界 不 会 因 变 数 取 代 发 生 改 变 。

   ■ 在 一 个 完 整 命 令 读 入 後 立 刻 执 行 该 命 令 。

叁 .变 数 的 使 用

   TCL中 变 数 的 设 定 是 使 用 set命 令 , 格 式 为 :

set varname [string]

   如 果 没 有 最 後 的 string, 则 不 设 定 而 直 接 传 回 varname的 值 , 此 时 相 当 於 变 数 取 代 的 功 能 。 另 外 二 个 设 定 变 数 的 命 令 是 append和 incr, 它 们 分 用 来 在 字 串 後 面 加 上 一 个 字 串 及 把 变 数 内 的 值 加 一 。

append varname string
incr varname

   如 果 一 个 变 数 不 会 再 被 使 用 , 可 用 unset释 放 其 所 占 的 空 间 。

unset varname

   TCL提 供 了 阵 列 的 变 数 , 但 它 是 一 个 关 连 阵 列 ( Associated Array) 。 它 的 形 式 为 :

arrayname( key)

   key不 一 定 是 一 个 数 字 , 它 也 可 以 是 一 个 关 鉴 字 。 数 字 的 速 度 不 会 比 其 他 字 串 快 。 例 如 要 设 定 一 个 阵 列 可 用 :

set monthname( 1) January

而 用 :

$monthname( 1) 来 引 用 它 的 值 。

四 .运 算 式

   TCL中 有 一 些 命 令 可 以 接 受 一 个 运 算 式 做 为 引 数 , 但 大 部 份 的 命 令 都 只 允 许 单 一 引 数 。 只 有 expr会 把 所 有 的 引 数 当 成 一 个 运 算 式 计 值 而 传 回 最 後 的 结 果 , 如 下 面 的 if命 令 是 错 误 的 ,你 可 以 写 成 :

if $x ( 2 then { puts “ I\n” }

或 是 :

if $x( 2 then {puts “ I\n” }
if {$x ( 2} then { puts “ I\n” }

一 个 EasyFlow中 简 单 的 范 例

   在 这 一 节 中 我 将 使 用 TCL巨 集 为 EasyFlow 加 上 於 纸 的 底 端 显 示 页 次 的 能 力 , 以 展 示 TCL的 威 力 。 你 会 发 现 为 EasyFlow加 上 一 个 功 能 是 多 麽 简 单 , 尤 其 是 TeX相 比 。

   我 们 透 过 挂 上 一 个 「 换 页 回 叫 函 数 」 来 达 成 这 个 目 的 , 在 这 个 函 数 中 我 们 使 用 easy变 数 easy_pageno取 得 目 前 的 页 次 。 然 後 用 easy_paper取 得 纸 张 底 部 的 座 标 , 并 用 easy_add在 那 里 加 上 一 个 非 排 版 字 串 。 一 个 非 排 版 字 串 不 会 随 着 其 他 文 字 排 入 栏 框 中 而 会 显 示 在 纸 张 上 的 固 定 位 置 。

在 文 件 内 我 们 加 入 左 边 的 程 式 :

~{
proc turnon_pageno {} {
   global easy_has_pageno
   easy_register -type newpage -command
   print_pageno
   set easy_has_pageno 1
}
proc print_pageno {} {
   global easy_has_pageno
   if {$easy_has_pageno==1} {
   set x1 [easy_paper -left ? ]
   set x2 [easy_paper -right ? ]
   set y1 [easy_paper -top ? ]
   set y2 [easy_paper -bottom ? ]
   set bmargin [easy_status -bottom ? ]
   set curpage [easy_status -pageno ? ]
   set pageno_x [expr ( $x1+$x2-( [stringlength$curpage]+6) *100) /2]
   set pageno_y [expr int( $y2) -150]
   set curpage “ 第 $curpage 页 ”
   easy_add -type grstring -x $pageno_x
   -w 100 -h 100 -y $pageno_y
   -text $curpage -fontid 0
   } else {
   set easy_has_pageno 1
   }
}
proc nopage {} {
   global easy_has_pageno
   set easy_has_pageno 0
}
}
~[turnon_pageno]
......
......

   这 个 程 式 提 供 了 二 个 新 的 命 令 , 第 一 个 是 turnon_pageno。 它 用 来 打 开 页 次 显 示 的 功 能 , 这 个 命 令 使 用

easy_register -type newpage -command print_pageno

   在 系 统 内 注 册 了 一 个 换 页 回 叫 函 式 , 所 谓 回 叫 函 式 是 EasyFlow用 来 让 TCL巨 集 控 制 排 版 的 方 法 。 EasyFlow会 在 适 当 的 时 候 , 如 换 行 换 栏 换 页 等 等 , 检 查 使 用 者 是 否 注 册 了 回 叫 函 数 , 如 果 有 则 呼 叫 它 们 。 经 由 这 种 机 制 , 我 们 可 以 在 适 当 的 时 候 执 行 某 些 TCL巨 集 来 达 到 我 们 所 想 的 效 果 。

   这 里 我 们 便 是 藉 由 这 种 方 法 注 册 了 换 页 回 叫 函 式 , 在 每 一 页 结 束 时 於 页 的 底 端 插 入 一 串 非 排 版 文 字 。 这 些 文 字 插 入 後 便 成 了 固 定 方 块 , 会 显 示 在 我 们 指 定 的 位 置 上 , 如 此 很 简 单 的 就 达 成 了 显 示 页 次 的 效 果 。 但 每 次 都 将 这 一 大 段 的 程 式 码 放 在 每 一 个 程 式 中 似 乎 不 太 漂 亮 。 你 有 二 个 选 择 , 一 是 使 用 TCL的 source命 令 , 将 上 面 的 程 式 放 在 另 一 个 档 中 。 然 而 对 於 一 些 常 用 的 功 能 , 如 页 次 的 排 定 , 章 节 的 排 定 等 , 似 乎 应 该 放 在 系 统 中 让 每 一 个 文 件 共 用 。 EasyFlow在 启 始 时 会 自 动 载 入 并 执 行 一 个 叫 easy-init.tcl的 档 案 , 你 可 以 将 程 式 放 在 这 个 档 案 , 就 可 以 达 到 这 个 目 的 了 。 当 然 随 着 EasyFlow的 发 展 , 我 们 一 定 可 以 在 将 来 搜 集 到 一 定 数 量 的 巨 集 程 式 。 EasyFlow要 到 那 时 才 可 能 成 为 一 个 不 是 玩 具 的 程 式 。

   你 了 解 EFTCL的 能 力 了 吗 ? 如 果 还 有 怀 疑 , 以 後 我 会 介 绍 一 组 可 以 做 页 次 显 示 , 交 互 参 考 索 引 、 目 录 的 巨 集 , 你 可 以 更 进 一 步 了 解 EFTCL的 内 涵 及 其 中 函 式 的 功 能 了 。 在 以 後 的 文 章 中 也 会 慢 慢 的 介 绍 一 些 在 TeX中 存 在 的 巨 集 在 EasyFlow中 如 何 做 出 相 等 的 效 果 , 你 会 发 现 同 样 的 事 在 Easy Flow中 简 单 许 多 。 且 由 於 EasyFlow是 一 个 认 识 BIG5码 的 系 统 , 所 以 它 的 处 理 整 个 功 能 可 能 是 相 等 於 在 TeX中 的 数 十 倍 呢 ?

   这 一 次 由 於 篇 幅 限 制 , 只 能 说 到 这 里 了 , 下 次 我 将 会 介 绍 EasyFlow中 另 一 个 很 有 用 的 功 能 段 落 排 版 规 则 。 它 和 在 莎 士 比 亚 中 的 「 人 工 智 慧 排 版 法 」 很 类 似 , 使 用 它 可 以 轻 易 地 排 出 条 列 式 的 文 件 。

( 相 关 程 式 见 光 碟 片 \AUTHOR\EASYFI0W子 目 录 )


上一篇文章下一篇文章回到本期目录

回光碟月刊的或回Hope Net的