質問箱 No.98: DMで特定列をWindowsプリンターに倍角で出力したい
        ◆ 質問箱 No.98 質問者: 野崎 武治  1999年07月 210号 P.17
            ◆ 質問箱 目次へ
No.98-1   DMで特定列をWindowsプリンターに倍角で出力したい  回答者
   入川  精二
1999年08月
211号 P.16
   ◆ No.98(1999年8月号)の回答-1
  •     すでに表データになっている中の特定列の文字列を拡大・縮小するには、指令’CJ’が有効ですが、全角〜半角、ひらがな〜カタカナ、アルファベットの大文字〜小文字まで、2倍角・4倍角にはなりません。何年か前に私も必要があって、2倍角に変換する簡単なツールを作っていました。それを思い出して、質問のケースはデータ数が多いようですから、バインダーにも対応するようリメイクしました。
  •     実際に作業する(拡大する)部分は、プログラムの65行目以降です。1行ずつセルのデータをチェックして、データがない場合と横罫線の場合はスキップします。困るのは文字を拡大したときに列の桁数が足りない場合です。そこで列桁数が文字数の4倍よりも小さい場合は、「列桁数を拡大する」ことにしました。
  •     対象データは全角とは限りませんので、半角文字は全角にしてから2倍角にしています。「半角文字の横倍」は全角サイズになりますが、PIPSでは全角文字と同じフォントになります。(印刷制御コードで1C266172を使って半角文字を拡大印刷すると全角文字とは違った字体になります。)
  •     半角文字〜全角文字〜2倍角としているため、氏名などの様に間に半角2桁のスペースがあるとそこは半角4桁のスペースに変換されてしまいます。これが不都合なこともあるので、一通り処理が終わってから90行目にあるようにCU;;C%X1=’      ’;’    ’;;Y;で4桁スペースを2桁スペースに変換しています。
  •     プログラムには大体コメントをつけていますので、何をしているかはお分かり頂けると思います。

このプログラムはプログラム集にテキストファイルがあります。

【プログラム】
 1 <2BAI>
 2 2倍角;STOP;
 3 
 4 <2倍角>                【 Ver 02.03 19990719 】 
 5 /*****************************  変数一覧表  **************************/
 6 /*       V1          処理対象の区分(バインダーか画面の表か)          */
 7 /*       V2          対象バインダー                                  */
 8 /*       X1          2倍角に変換する対象列                           */
 9 /*       X2          指定列の桁数                                    */
10 /*       X3          FOR〜NEXTの受皿(行番号)                        */
11 /*       X4          列の必要桁数(文字数の4倍)                      */
12 /*       X10         現在の頁横桁数                                  */
13 /*       X11         頁面積                                          */
14 /*       X12         使用行数                                        */
15 /*       X13         最大横桁数(X11/X12)                             */
16 /*       X14         表の使用桁数                                    */
17 /*       X15         表の必要桁数                                    */
18 /*       X20         FOR〜NEXTの受皿(指定バインダーのページ)         */
19 /*       X23         FOR〜NEXTの受皿(文字番号)                      */
20 /*       X24         半角の濁点・半濁点の数                          */
21 /*********************************************************************/
22
23 $対象1:  ACCEPT   "処理対象は? 画面[M],バインダー[B]",V1;
24       IF ERR(0)=55 THEN STOP;                    /* [ESC]が押された */
25       IF V1="" | KLEN(V1)>1 THEN GOTO $対象1;    /* 1文字でない */
26       LET V1=FORM$(FORM$(V1,4),1);              /* 半角大文字に変換 */
27       IF INSTR(1,"MB",V1)=0 THEN GOTO $対象1;   /* MとB以外はダメ */
28       IF V1="B" THEN GOTO $対象2 ELSE GOTO $CHK; /* 分岐*/
29 $対象2:  ACCEPT /P  "対象バインダーは?  ",V2;   /* バインダーの指定 */
30       IF ERR(0)=55 THEN STOP;                    /* [ESC]が押された  */
31       IF NAME(3,V2)=0 THEN GOTO $ERR1;       /* 指定バインダーがない */
32       IF PAGE(V2,1)<1 THEN GOTO $ERR2;           /* ページがない */
33       G;%V2/1;                                   /* 1頁目を呼び出す */
34 $CHK: IF STATUS(1,1)<>1 THEN GOTO $ERR3;      /* 表形式でない */
35 $列:  ACCEPT /C "2倍角に変換する対象列は?",X1;    /* 対象列の指定 */
36       IF ERR(0)=55 THEN STOP;                    /* [ESC]が押された */
37       IF X1<1 | >C THEN GOTO $列;           /* 存在しない番号 */
38       IF CL(X1)<1 THEN GOTO $ERR4;             /* 0桁の列  */
39       IF [H,X1]="|" THEN GOTO $ERR5;             /* 罫線の列 */
40       LET X10=STATUS(1,2);                       /* 現在の頁横桁数 */
41       LET X11=X10*STATUS(1,3);                   /* 頁面積 */
42       LET X12=STATUS(1,7);                       /* 使用行数 */
43       LET X13=X11/X12;                           /* 最大横桁数 */
44       GOTO $%V1;
45 $#M:  GOSUB 2BAIEXE;
46	   GOTO $END;
47 $#B:  FOR X20=1 TO BINDER(V2);
48         G;%V2/%X20;
49         GOSUB 2BAIEXE;
50         P;%V2/%X20;
51       NEXT;
52 $END: STOP;
53
54 $ERR1:  BELL;MESSAGE "指定されたバインダーは存在しません";
55	     GOTO $対象2;
56 $ERR2:  BELL;MESSAGE "指定されたバインダーにはページがありません";
57	     GOTO $対象2;
58 $ERR3:  BELL;MESSAGE "対象のページは表形式ではありません";
59	     STOP;
60 $ERR4:  BELL;MESSAGE "0桁の列を指定しました";
61	     GOTO $列;
62 $ERR5:  BELL;MESSAGE "罫線列を指定しました";
63	     GOTO $列;
64
65 <2BAIEXE>            【 Ver 02.03 19990719 】
66	FOR X3=H TO T;
67	    IF [X3,X1]=""|"=*-*" THEN CONTINUE; /* 罫線行はスキップ */
68	    CLEAR X4/24;
69	    LET X2=CL(X1);               /* 指定列の現在の桁数 */
70	    LET X14=STATUS(1,6)          /* 表の使用桁数 */
71	FOR X23=1 TO KLEN([X3,X1]);      /* 半角の濁点・半濁点の処理 */
72	    IF KMID$([X3,X1],X23,1)="゛"|"゜" THEN LET X24=X24+1;
73	NEXT;
74      LET X4=4*(KLEN([X3,X1])-X24);    /* 文字数の4倍(必要桁数) */
75      IF X4<=X2 THEN GOTO $EXE;        /* 列桁数は足りている */
76      IF X14+X4-X2<X10 THEN GOTO $CF;    /* 列桁数を拡大可能 */
77      IF X14+X4-X2<=X13 THEN GOTO $INFO; /* 頁横桁数が足りている */
78      LET X15=X14+X4-X2+1;                  /* 頁横桁数が不足のとき */
79      GOTO $ERR6;
80 $INFO: INFO;S;%(X14+X4-X2+1);               /* 頁横桁数を拡大 */
81 $CF:   CF;%X1;%X4;                          /* 列桁数を拡大 */
82 $EXE:  LET [X3,X1]=FORM$(FORM$([X3,X1],5),8); /* 拡大文字列を書込む */
83        CONTINUE;
84
85 $ERR6: BELL;	
86     LET V40="最大横桁数は"+NUM$(X13)+"  必要桁数は"+NUM$(X15)+"    ";
87     LET V40=V40+"頁横桁数が不足しているので処理できません          ";
88     MESSAGE V40+NUM$(X3)+"行目";
89$次行: NEXT;
90     CU;;C%X1;"    ";"  ";;Y;
91 $RET: RETURN;


このページのTOPへ戻る