- 倍角化は、FORM$関数でパラメータを8にすることで実現します。
- 全角を倍角にする場合、実質の桁数が2倍増えるので、横のサイズが問題となります。これを回避するために、データから、10なり、20なり、DMラベル1枚のピース分だけデータを順に持ってきて、行数が減った文を桁の増加に振り替える、というのがこのシステムの基本です。
- 一定行を順に処理するのは、拙作の<コンパクトな印刷>のアルゴリズムをそのまま利用しています。
- 流れは、(1) ラベルのフォーマットを作成(4〜9行)、(2) データを一定数量順に流し込み(11〜38)、(3) 特定列を倍角化して(41〜42)、(4) 印刷処理します(43)。
- 便宜的にこのプログラムでは、ワークページを2ページ使用しています。
- ラベルフォームの加工について、7行目を枚数分だけ繰り返せば任意の場合に対応できます。
- この例は、小さなルーチンの組み合わせですが、相乗効果をねらうのが、PIPSでシステムを構築しているユーザーの醍醐味ではないでしょうか。
このプログラムはプログラム集にテキストファイルがあります。
1. | <ラベル印刷> | 1999.8.12 BY J.MAT |
2. | ACCEPT /P"バインダーは?",V9; LET X22=BINDER(V9); | |
3. | ||
4. | /* ラベル様式のセット -------------------------------------------------*/ | |
5. | SET;S;M;1;180;;Y; O; LABEL-FMT-作業様式; ESC; LET L1="$S"; LET L2="$E"; S; | |
6. | G;★LABEL-FMT/1 | |
7. | /* 2連に設定 */; CPC;1;1; S; CPR;SA;2; P;★LABEL-FMT-WORK/1; | |
8. | /* ラベルは、2連5枚でX26=10ピース */; LET X26=10; | |
9. | /* 倍角にする対象列は、3列目 */; LET X39=4; | |
10. | /*------------------------------------------------------------------*/ | |
11. | ||
12. | /* 10行単位で処理をするルーチン部 */ | |
13. | G;%V9/1; | |
14. | /* 行の初期位相☆X4 */; LET X4=H; | |
15. | /* 初期値 | DATA COUNTER X5,複写開始行 X23 */; LET X5=1;LET X23=X4; |
16. | /* ----- 受皿フォーマットの作成 -----*/ | |
17. | DR;A;; | /* 新たに設定する横幅設定→ */; INFO;S; 500; IR;S;H;%X26; |
18. | S; | /* DATA COUNTER */; LET X17=0; |
19. | FOR X1=1 | TO X22; G;%V9/%X1;IF STATUS(1,1)=1 THEN LET X17=X17+T-H+1; |
20. | /* 次頁を呼出す */;IF X1<X22 H OR (STATUS(1,1)="0" AND>T) THEN CONTINUE; | |
21. | /* 最終P処理 */;IF X1=X22 AND (STATUS(1,1)=0 OR H>T) THEN GOTO $処理; | |
22. | /* 正常頁X24 | 開始行 */;LET X23=H;IF STATUS(1,1)=1 AND H<=T THEN GOTO $反復; |
23. | /* 最終PにDATAがないときは印刷して終了する */ | |
24. | IF (X5-1)MOD(X26)>0 THEN GOTO $反復 ELSE CONTINUE; | |
25. | $反復: | /* 頁の最終行 X6 */; LET X6=T; |
26. | /* 複写先行 X27 */; LET X27=(X5-1)MOD(X26)+X4; | |
27. | /* 余り行数の比較 M=X13 */; LET X13=T-X23+1; | |
28. | /* S=X14 */; LET X14={T}-X27+1; | |
29. | /* コピー行数 X30元の表の余行 > 受皿の残行なら受皿残行分のみ複写*/; | |
30. | IF X13>=X14 THEN LET X30=X14 ELSE LET X30=T-X23+1; | |
31. | /* 複写終了行 X25 */; LET X25=X23+X30-1; | |
32. | /*-- メインルーチン CPB M-->S --*/; CPB; %X23,1; %X25,T; S%X27,1; | |
33. | /* 次の通算番号 X5 */; LET X5=X5+X30; | |
34. | /* 次の開始行 X23 */; | |
35. | IF X13=X14 OR X25=X6 THEN LET X23=X4 ELSE LET X23=X23+X30; | |
36. | $処理: | /*- 受皿が満杯かDATAがなければサブ画面を印刷する -*/; |
37. | IF | (X1=X22 AND X25=X6) OR (X5-1)MOD(X26)=0 THEN GOTO $LABEL印刷; |
38. | /*- 受皿が満杯になるまで複写作業を反復継続する -*/; GOTO $反復CK; | |
39. | ||
40. | /*- ラベル印刷処理 ----------------------------------------------------*/ | |
41. | $LABEL: | FOR X1=H TO T; LET V3=[X1,X39]; IF V3="=*-*" THEN CONTINUE; |
42. | LET [X1,X39]=FORM$(V3,8); | |
43. | NEXT; P;★WORK/1; G; ★LABEL-FMT-WORK/1; DM; G;★WORK/1; | |
44. | /*--------------------------------------------------------------------*/ | |
45. | ||
46. | LET X31=X31+1; | |
47. | S; | |
48. | IF X1=X22 AND X25=X6 THEN CONTINUE; | |
49. | /* 受皿のクリアと再セット */; FILL;;A;A;; S; | |
50. | $反復CK: | IF X25<T THEN GOTO $反復; /* 主画面にデータがある限り繰り返す */ |
51. | NEXT; | S"top"; |
□