図 lr ⅷ。 / rwh 。 d のイ且み host B rwhod host A rwhod NETWORK 連載 ・その計算機でのホーム・ディレクトリ UN Ⅸ Communication Notes 図 2 rusers と rup コマンドの実彳デ列 . ( a ) rusers の実行 % rusers mercury p1utO p1utO yamaguti shimoj 0 ariyoshi host C rwhod host D ( b ) 「 u 実行 % ロ creamy jupiter up 2 days, 13 : 40 , creamy up 6 days, 3 : 27 , jupiter load average: 0.71 , 0.73 , 0.49 load average: 0.14 , 0.09 , 0.00 /usr/spool/rwho/whod. * rwhO rwhod は、ネットワークに接続されたはカ叨計算機との あいだて精報交換をおこなう。 rwho, ruptime は保存 されているデータを表小する。 rwhod (ⅲ . rwhOd) ruptime ログインしているユーザーの一覧が表示され、利用者を指 finger コマンドでは、計算機を指定するとその計算機に ントが finger 、サーバーが fingerd です。 サーバー・モデルにもとづいて構成されており、クライア コマンドの使用が挙げられます。 finger はクライアントー 計算機の利用者の個人情報を得る方法として、 finger 利用者情報サービス こともありません。 rup ではホストを指定できるので大量の表示に悩まされる くなるので必要な部分を見落としがちですが、 rusers や るような状況では、 rwho や ruptime の表示がたいへん多 さらに、多くの計算機が同し Ethernet に接続されてい ば現状を表していると考えることができます。 たときにほかの計算機のサーバーに間い合わせるので、ほ という情報です。一方、 ruser や rup はコマンドを実行し なくとも 3 分前はそうだったが、現在はどうか分からない〃 rwho や ruptime を起動したときに表示されるのは、、すく えは・、 rwhod が 3 分に 1 回情報を流しているとすると、 のでかならすしも現状を示しているとはいえません。たと は、 rwhod が定期的に交換している情報をもとにしている rwho/ruptime と rusers/rup を比較してみると、前者 ストだけの情報を得る様子を示したものです。 るホストを指定することができます。図 2 は、指定したホ rusers や rup では rwho 、 ruptime と異なり、問い合わせ UNIX MAGAZINE 1990.10 定すると利用者の個人情報が表示されます。実行例を図 3 に示します。 最初は、引数に何も指定しない例です。この場合、現在 ログインしている計算機のログイン状況が表示されます。 次に、利用者 yamaguti の情報を取り出します。こちらの ほうは、本名、プロジェクト名、予定などが表示されます。 リモートの計算機の状況を知りたいときは、 @マークを使 用して計算機を指定します。 3 番目では計算機 creamy の ログイン状況を、 4 番目は同様にして creamy の利用者 saitoh の情報を得ています。また、 5 番目のように計算機 アドレスを指定することもできます。 finger は、個人情報を以下の情報源から得ています。 /etc/passwd GCOS フィールドに書かれている本名と電話番号など の情報を利用します。このフィールドを一般ューサーが 変更できるよう、 chfn コマンドが用意されています。 ~ /. project このファイルに書かれている内容をプロジェクト名とし て、ファイルの 1 行目だけを表示します。 ~ /. plan このファイルに書かれている内容を予定 ( plan ) として 表示します。ファイルの内容はすべて表示します。 一般に、これらの情報の整備は各ューザーに任せられて いるので、ユーザーがどのような情報を提供しているかに よって finger コマンドが出力する個人情報も変わってき ます。何も整備していないと、 ・本名 ・ログイン名 75
か ? 脳ミソも体重のうちやで。前からポーツとしてる田 っとったけど、ますますそれに麿きがかかったんは脳ミ ソが少なくなったせいや。 月凶ミソが減ったから、原稿書けません・・・ そんな言い 訳は聞いてもらえませんね。ということで、今月もがんば もしも・・・・・・だったら if ( 条件式 ) コマンド こでは、条件式が 1 を返した場合にかぎってコマンド が実行されます。 次の例では、引数が指定されなかったとき、 exit コマン ドを使ってプログラムの実行を終了します。 % cat samp # ! /bin/csh 0 ) exit if ( $ # 矼空 = UN Ⅸへの招待⑩ って書きましよう。 今月は、シェルの組込みコマンドのうちシェルプログラ ムで使うと抜群の威力を発揮するものを紹介します。これ らを使うと、処理の繰返しや条件を判断しながらのコマン ド実行がおこなえます。最初に、 C シェルの組込みコマン ドから見ていきます。 シェルプログラムを実行するときには、 ・引数が指定されたら、その引数を使った処理をする ・引数が指定されなかったら、デフォルトの処理をする など、プログラム中で一定の条件を判断して処理を進める ことがよくあります。このような場合に、条件を判断する ためのコマンドを使うわけです。 C シェルでは、こうしたときに利用できる if という糸旧ム みコマンドカ甘是供されています ( Bourne シェルにも if コ マンドがありますが、 C シェルとは使い方が異なります ) 。 if コマンド 8 月号でも、 C シェルの if コマンドについてすこし触れ ました。 if には、以降で説明するようにいくっかの使用形 式があります。 先月号で紹介したように変数の値の数は、 $ # 変数名 で調べることができます。変数設定の有無を調べるには、 0 0 0 0 0 0 0 0 illustration•木月麻子 152 UNIX MAGAZINE 1990.10
連載 / てくてく rIbX 19 \textwidth カ ; 68zw で、 minipage の幅が 7cm な んてことになると、 68zw—14cm はいったいいくつな のでしよう ? I*TEX には lcm や 1 ⅲのような固定長 (rigid length) のほかに、伸びたり縮んだりしてしまう伸縮 長 (rubber length) というのがあります。さきほど説 明した \hspace や \vspace コマンドの引数には、固 定長たけでなく、伸縮長だって指定できます。 伸縮長のなかでも、 \fill というのはちょっと特別 で便利な長さてす。 \fill は、“自然の長さ” (natural length) が 0 ポイントなのですが、無限大に伸びるこ とができます。つまり、 \hspace{\fill} と指定する と、幅が 0 のスペースが出力されることもあ才ま、組み 幅いつばいのスペースが出力されることもあるのてす。 \hspace{\fill} コマンドは、頻繁に使用するの で、 \ 瓩 i11 という省略形が用意されています。 次の例を見ると、タイフ。セットされた文字に応じて、 同じ \hfill コマンドで出力されるスペースが変化し ていることがわかります。 左端 \ hfill 右端 \ \ 左端 \ 瓩 i11 真中 \ れ fill 右端 \ \ 左 %\hfill\hfill 右寄り \ i11 右端 0 0 あります。このコマンドは、 \par\vspace{\fill} ” と指定したのと同じ意味になります。 \ 瓩 i11 を使って、 maildesc 環境を定義してみま しよう。 \newenvironment{maildesc}% {\par\noindent \begin{minipage}{7cm}\begin{screen} \def\middesc{\end{screen}\end{minipage} \hfi11\begin{minipage}{7cm}}}% {\end{minipage}\par} チャレンシ亀之助 H : 今回は、ずいふんと多くのコマンドが出てきたけ ど、難しくはなかったでしょ ? 亀 : うん。頭がパンクしないでこれだけのコマンドの説 明が分かったってことは、僕の成長の証だよれ H : なに言ってるの。分かってくれてるのかなあ。 亀 : H : 次回は、さらにステッフ。・アッフ。して、組み幅の 変化にも対応できるような maildesc 環境を作って みようと思うの。 H : 自分でパラメータを作ったりするのよ。 亀 : わくわく 右端 左端 右端 左端 右端 右寄り 左端 上の例で、複数の \hfill コマンドがあるところで は、各 \hfill コマンドで同しだけのスペースが空し、 ているところに注意してください。つまり、 2 行めで は両方のスペースが同じだけ空いていますし、 3 行めで は左側のスペースが右側のスペースの 2 倍になってい ます。 ところで、 \ れ fill コマンドは \hspace{\fill} の 省略形ですから、行の最初には \ hf 土 11 でスペースを 空けることができないことになります。行頭でもスペー スを空けるようにするには、 \hspace*{\fill} と指 定してください。このコマンドの省略形は用意されてい ません。 また、 \hfill と同様に、 \vfill というコマンドが 真中 ( ふじうら・はるみ アスキ 149 UNIX MAGAZINE 1990.10
連載 / てくてく ' 19 引数には、負の数も指定できます。負のスペースは、 左方向に空くスペースとなります。ですから、次に出力 する文字は、その前の文字に重ね書ぎすることになりま す。また、そのスペースのために文字が左の余白部分に はみだしたとしても、し kX ではエラーになりませんし、 警告も出力されません。 次の例を見てくたさい。感嘆符 ( ! ) の後にスペース が 1 つ出力され、その位置から左に 0.5 インチふんの スペースがとられて重ね書きをしている様子が分かり を .5 in 負の数も指定でぎます。イ〃 / 負の数も指定てきます。ーーほうら ! ! ます。 \hspace*{. 5in}\verb + \hspace* + コマンドを このような場所にスペースを空けたいときには、 ときには、スペースが空きません。 \hspace{4zw} 改行位置に \hspace{2cm} あたる \verbl\hspacel コマンドがちょうど ンドを使ってください。 の代わりに \hspace* というアスタリスク付きのコマ 行の先頭にスペースを空けたいときには、 \hspace つまり、行の先頭にはスペースが空かないのです。 になってしまうと指定したスペースが出力されません。 \hspace コマンドでは、コマンドの直前が改行位置 使います。 \hspace コマンドがちょうど 改行位置に あたるときには、スペースが空きません。 このような場所にスペースを空けたいとぎには、 \hspace* コマンドを使います。 縦方向のスペース 縦方向にスペースを空ける \vspace コマンドでも、 引数にスペースの長さを指定します。もちろん、負の長 さも指定できます。 UNIX MAGAZINE 1990.10 \vspace コマンドで指定したスペースは、 \vspace が現才 t た行と次の行とのあいだのスペースとなります。 行間を空けたい \ vspace { ・ 251 Ⅱ } ときや 行間を縮めたいときには、 \verb + \vspace + コマンドを使ってください 行間を空けたいとぎド行間を縮めたいとぎには、 .25 in \ vspace コマンドを使ってください \hspace コマンドの直前で改行されるときにスペー スが出力されないのと同様に、 \vspace コマンドを指 定したところがちょうど改ページ位置にあたるときに は、指定したスペースが空きません。ページの先頭に スペースを空けるには、 \vspace にアスタリスクを付 けた \vspace* コマンドを使用してくたさい。 パラグラフ間の \ vspace コマンド パラグラフとパラグラフのあいたには ふつう、 \parskip というパラメータに設定された長さだけの スペースがとられます。ただし、標準のスタイル・ファ イルではこの値は長さ 0 になっています。 \parskip 以上のスペースを空けたいときや、逆に \parskip で空いたスペースを取り消したいときは、 \vspace コマンドを使います。このコマンドで空くス ペースは、く \parskip 十 \vspace で指定した長さ〉に なります。 段落と段落のあいだにスペースを空けたいときには、 次のように前後を空行にしてください。 \vspace{7mm} どうしてこうしなけれはならないのてしようか。 段落と段落のあいだにスペースを空けたいときに は次のように前後を空行にしてくたさい。 7 mm どうしてこうしなければならないのでしようか。 145
特集 「 00t の基礎知識 定の続きであることが分かります。 、ゝの値を tty ドライバのモードフラグにセットすることによ 3 行目にはこのプリンタに出力するための設定か書かれ って tty のモードを変更しています。どのような値をセッ ています。最初のフィールドは br で、出力するときの転送 トすれはいいのかは、オンライン・マニュアルの tty(4) 、 termio ( 4 ) 、 /usr/include/sys/ioctl. h などを参考にしま 速度 (bps) を書きます。転度は数値ですから、区切り記 号には、、を使います。 br フィールドは、プリンタが す。この例の、、 06320 〃というのは、プリンタが接続されて いる RS232C ポートの設定、 RS232C ポートに接続されているときに指定するフィー ルドです。リモートプリンタやネットワーク・プリンタの ・ CR を CR 十 LF に変換してから出力する (CRMOD) 場合には必要ありません。 ・パリティなし ( ANYP ) 次のフィールドは fs です。このフィールドには、パリテ ・タブコードはスペースコードに刻奐して出力する ( XTABS ) ィを付けるか、 CR を LF に変換するかなどの RS232C ポ を意味します。次の 3 つのモードフラグ、 ートの状態を表す値を 8 進数で設定します。実際には、 / * map \r t0 \r\n 0 output * / CW{OD 0X00000010 / * get any parity/send none * / 0X000000 c0 / * expand tabs on output * / XTABS 0X00000C00 を足し合わせ ( 論理和 : 16 進数で 0xcd0) 、その値を 8 進 % man 4 printcap 数で表したものです。 とタイプすればマニュアルが表示されるはすですから、参 tr フィールドは、すべての出力が終った後で出力する文 考にしてください。 こでは、そのなかでもよく使われる 字列を指定します。前ページの例では、すべての出力が終 ものを表 1 に紹介します。 ったあとで改ページコード、第〃をプリンタに送り、ユーサ ここに紹介したフィールドを組み合わせれば、ほとんど ーがわざわざ紙送りをしなくても出力結果を取り出せる のプリンタに対する設定ができます。 ようにしています。 of フィールドには、出力フィルタを指定します。すべて 出力フィルタ のジョブはこのフィルタを通ってプリンタに出力されます。 出力フィルタにはいろいろな種類がありますが、前述し げフィールドには、エラーが発生したときのログを記録 たように するファイルを指定します。 この printcap 工ントリでは、デフォルト値を使ってい ・ if フィールドに指定するフィルタ るフィールドを省略しています。たとえは、スプール・デ ・ of フィールドに指定するフィルタ ィレクトリは sd というフィールドで指定しますが、 ・上記以外 ( cf 、 df 、 nf など ) では省略時に /usr/spool/lpd というディレクトリが使わ れることを利用しています。また、出力デバイスはと の 3 種類に分類できます。この分類と目的を理解すれは、 いうフィールドで指定しますが、このフィールドもデフォ フィルタの指定は簡単です。、、 if 〃、、 of 〃のいずれに指定する ルト値の /dev/lp を利用しています。 フィルタもテキストファイルを出力するときに使用するも デフォルト値を利用すると printcap の設定を簡潔にで のですが、両者の相違は if フィルタがアカウント機能を使 きますが、分かりにくくなることもたしかです。慣れない えるのに対して of フィルタはアカウント機能を使えない うちは、デフォルト値も積極的に指定しておいたほうがい という点です。 if フィルタは出力ファイルごとに lpd から いでしよう。 起動されますが、。 f フィルタは起動されてファイルを出力 printcap に設定できるフィールド名の一覧は、 print- しているあいだに別の出力要求があれば、フィルタは終了 cap ( 4 ) のマニュアルに載っています。 せすにそのファイルを続けて出力します。このため、 of フ 67 UNIX MAGAZINE 1990.10
特集 「 00t の基礎知識 ◆出力フィルタを指定するフィールド 意味 フィールド名型 テフォルト値 テキストファイルの出力に使うフィルタ名 ( アカウント機能を使うとぎ 文字 if NULL に指定 ) 文字 テキストファイルの出力に使うフィルタ名 ( アカウント機能を使わない NULL ときに指定 ) 文字 cifplot データの出力に使うフィルタ名 NULL 文字 ( dvi ) データの出力に使うフィルタ名 NULL グラフデータ (plot フォーマットのデータ ) の出力に使うフィルタ名 文字 NULL ditroff データの出力に使うフィルタ名 文字 NULL Fortran(ratfor) フ。ログラムの出力に使うフィルタ名 文字 NULL 文字 troff データの出力に使うフィルタ名 NULL raster データの出力に使うフィルタ名 文字 NULL of ◆その他のフィールド 意味 テフォルト値 フィールド名型 スフ。ール・ディレクトリに書き込めるファイルサイズの最大値 ( 単位は BUFSIZ)0 4.3BSD の場合、 BUFSIZ は一般的に 1 , 024 , くイトなので、 1 MB のファイルまで出力できる。 0 を指定すると無制限になる。 BUFSIZ の値は、 /usr/include/stdio. h を参照すれば分かる 指定されたグルーフ。に属していないユーザーがフ。リンタを使うことを禁 止する 数値 1 , 000 文字 NULL rg が一般的です。 プリンタ名 ntxj ( 5 ) そのほかのフィルタだけを指定している プリンタの別名 ntx テキストファイルはフィルタを通らすに直接出力されま 接続方法 ローカル接続 す。テキストファイルの出力がアカウントできなくなる /dev/ttya 接続デバイス ので、このような設定はすべきではありません。 転玉度 9 , 600bps ( 6 ) if 、 of フィルタとその他のフィルタを指定している なし ノヾリティ /usr/spool/ntxj テキストファイルは if フィルタを通して、そのほかのフ スプール・ディレクトリ /usr/spool/ntxj/log ァイルはファイルに応したフィルタを通して出力されま ログファイル /usr/adm/ntxj-acct す。ジョブヘッダは、 of フィルタを通して出力されま アカウント・ファイル /usr/lib/ntxjif す。 if フィルタ ( 7 ) フィルタは何も指定していない /usr/lib/ntxjof of フィルタ すべての出力は、ジョブヘッダも含めて直接プリンタに /usr/lib/ntxjdf df フィルタ 送られます。この設定はあまり意味がないでしよう。 出力しない ジョフ・ヘッダ これらの組合せを理解すれば、フィルタの指定は簡単に これをもとにして printcap を設定すると、次のように できます。よく使われるのは ( 1 ) ( 2 ) ( 4 ) ( 6 ) で、そのほかの なります。 組合せはあまり使われません。 ntxjl ntx lLaserWriter 工工 NTX—J : \ ローカルプリンタの : lp=/dev/ttya : br # 9600 : \ : rw : fc # 0177474 : fs # 0303 : \ それでは、設定例を紹介しましよう。次のような設定で : sd=/usr/spool/ntxj : \ : lf=/usr/spool/ntxj /log : \ プリンタを接続するとします。 : af=/usr/adm/ntxj-acct : \ : if=/usr/lib/ntxjif : \ 69 UNIX MAGAZINE 1990.10
プリンタ自由自在 表ー printcap のおもなフィールド ◆ファイル・ディレクトリ関係 テフォルト値 意味 フィールド名型 文字 af NULL アカウントファイル名 文字 / dev/console If ログファイル名 文字 /dev/lp 出力デ・バイス名 文字 /usr/spool/lpd スフ。ール・ディレクトリ名 sd ◆ RS232 に接続するプリンタ車 型デフォルト値 フィールド名 意味 数値 なし 転送速度 (bps) br 数値 tty のモードフラグのうちクリアするビット ( 8 進数 ) 数値 tty のモードフラグのうちセットするビット ( 8 進数 ) 数値 tty のローカル・モードフラグのうちクリアするビット ( 8 進数 ) XC 数値 tty のローカル・モードフラグのうちセットするビット ( 8 進数 ) XS ◆プリンタの動作に車するもの フィールド名 型テフォルト値 意味 文字 フ。リンタの改ページコード 侖理 tty デ六イスのオーフ。ン時に改ページコードを送る false 侖理 データの出力後にジョブヘッダを出力する hl false 数値 出力用紙の行数 66 数値 出力用紙の桁数 132 PW 侖理 出力デ六イスを読み書きできるモードでオープンする false 侖理 1 行だけのジョブヘッダを出力する sb false 侖理 改ページコードを出力しない false 侖理 ジョフ。ヘッダを出力しない sh false 文字 スフ。ール・ディレクトリの全ファイルの出力後にフ。リンタへ送る文字列 NULL tr ◆リモートプリンタの言聢に車するもの フィールド名型 テフォルト値 意 文字 リモートフ。リンタのホスト名。フ。リンタが接続されているホスト名を書く NULL 文字 リモートフ。リンタのフ。リンタ名 侖理 フ。リンタが接続されているホストに loginID をもっていないユーザーが 使用することを禁止する イルタでは誰が何枚出力したかか調べられないので、アカ れます。アカウント機能は使えません。 ウント処理ができないのです。そのほかのフィルタは、 ( 2 ) if フィルタしか指定していない " 垣 X や ditroff などのような特定のアプリケーションか すべての出力は if フィルタを通してプリンタに出力さ ら出力された非テキストファイルを出力するときに指定し れます。アカウント機能が使えます。 ます。これらのフィルタは、全部が必要というわけではあ ( 3 ) of フィルタとそのほかのフィルタを指定している りません。必要なものだけ指定すればいいでしよう。どの of フィルタはジョブヘッダの出力にだけ使われます。し フィルタを使用するかは、 lpr の引数で指定します。 かし、テキストファイルの出力のアカウント処理ができ なくなるので、このような設定はすべきではありません。 当 f 〃 % f 〃以外のフィルタが指定されている場合には、 of ( 4 ) if フィルタとそのほかのフィルタを指定している フィルタはジョブヘッダの出力だけに用います。 こで、フィルタ指定の組合せについて考えてみましょ テキストファイルは if フィルタを通して、そのほかのフ ァイルはファイルに応したフィルタを通して出力されま す。ジョブヘッダはどのフィルタも通らすに直接出力さ れます。 of フィルタを省略する場合には、 sh フィールド を指定してジョブヘッダを出力しないようにしておくの 0 一 -0 -0 0 一 ニニロニ二ロ 一三ロニ二ロ一三口一三ロ false ニごロ ( 1 ) of フィルタしか指定していない すべての出力は of フィルタを通してプリンタに出力さ 68 UNIX MAGAZINE 1990.10
プリンタ自由自在 図 5 Sun のサンプル printcap # This is a sample of printcap entries used by various printers/plotters. # A11 entries have been commented out to avoid complalnts from the line # printer daemon about printers that don't rea11y exist. # # DecWriter over a tty line. # 1 可叩引 ucbarpal 一 180 DecWriter III : \ : br # 1200 : fs # 06320 : tr=\f : of=/usr/lib/lpf : lf=/usr/adm/lpd—errs : # # typical remote printer entry # ucbvaxl vaxl vxl ucbvax 1 土Ⅱ e printer : \ : lp= :m=ucbvax : sd=/usr/spool/vaxlpd: lf=/usr/adm/lpd-errs : # varian lva IBenson Varian: \ : vf=/usr/lib/vpltdmp: lf=/usr/adm/lpd-errs : gf=/usr/lib/vplotf :df=/usr/local/dvif : \ : of=/usr/lib/vpf : if=/usr/lib/vpf : tf=/usr/lib/rvcat : cf=/usr/lib/vdmp : \ : 1p=/dev/vaO: sd=/usr/sp001/vad:mx#2000 : pl # 58 : px # 2112 : py # 1700 : tr=\f : \ す。上の図 5 は Sun に入っているものです。 printcap の書き方は、 termcap や gettytab と同しで す。行頭に # がある行はコメント行で、行末の "\" は が次の行に続くことを表します。それぞれのフィールドは、 文字型 フィールドには 3 つのタイプがあります。 フィールド 〃によって区切られています。 # DecWriter over a tty 1ine. 転送速度や用紙の桁数などのような数値を指定するとき 数値型 例 : : sd=/usr/spool/lw: フィールド名と文字列の区切りには = 記号を用います。 フィルタ名やディレクトリ名を指定するときに使います。 ゝに使います。フィールド名と文字列の区切りには # 記号を用 います。 例 : : br # 9600 : 言里型 改ページコードを出力する、ページへッダを付けるなど のように、プリンタに対して特定の機能を使うことを指定 するために使います。論理型のフィールドは、そのエント リが printcap に書いてあるかどうかで真偽 (true/false) を判定します。 例 . Sun のサンプル printcap は、実際に存在しないプリン タの設定を記述しておくと lpd がエラーメッセージを出 すため、わざわざすべての設定をコメントにしてあります。 つまり、実際にプリンタが存在するのなら、 1 可叩引 ucbarpal ー 180 DecWriter 工Ⅱ : \ ←プリンタ名のフィールド : br # 1200 : fs # 06320 : tr=\f : of=/usr/lib/lpf : lf=/usr/adm/lpd—errs : のような設定が入ることになります。 最初の行はコメント行ですから、 2 ~ 3 行目が実際の設 定ということになります。 2 行目に書かれているのはプリンタ名です。プリンタ名 のフィールドはヾにで区切ることによって別名を定義す ることができます。 したがって、次の例、 66 lpr -P1p lp て -Pap lpr -Parpa UNIX MAGAZINE 1990.10 行末には、、 \ 〃がありますから、次の行も同しプリンタの設 ていますが、かならすしも必要というわけではありません。 プリンタ名の最後には機種名を書いておくのが慣習になっ は、すべて同一のプリンタへ出力することを意味します。
連載 LittIe Language srekcah@sra. CO. JP PerIX 門 (6) はじめに UNIX MAGAZINE 1990.10 ルができますから、これを自分で作ったオプジェクトとリ 以外のオプジェクトをリンクした uperl. 0 というファイ てリンクします。つまり、 Perl を make すると usersub. 0 含まれていますが、このファイルを適当なものに置き換え perl のソースのなかには usersub. c というファイルが こで、仕組みについて簡単に解説しておきます。 なく、ある程度 perl のソースに関する知識が必要です。そ ています。ただし、この機能は簡単に利用できるわけでは perl が用意され、これを作るのに必要なファイルが含まれ から curses ライプラリを利用できるようにする curse - スタマイズできるようになりました。例として perl のなか ューサーが定義したライプラリをリンクして、 perl をカ ライプラリのリンク機能 Perl 3.0 ー 28 での変更点 みることにしましよう。 で、ますは perl パッチレベル 28 の新機能について書いて を出力すると、なんと 72 ページもあります。というわけ いくっかあり、数日後にパッチ 28 が出ました。マニュアル ます。そのためか、あらたに埋め込まれてしまったバグか ィックスのほかにいくつかの機能追加や変史が含まれてい ~ 27 が一挙に送られてきました。このパッチには、バグフ つき、だいぶ安定していたのですが、つい先日パッチ 19 3.0 も 5 月末のパッチ 18 でパッチレベルが Per12.0 に追い 今月は、ひさしぶりに「 PerI 入門」の 6 回目です。 Perl ンクすれはよいのです ousersub. c には userinit( ) という 関数があるので、これを適当に変更します。あとは、その なかで自分の好きなように設定するだけです。 C の関数を perl の関数呼出しとリンクするには、 make ー usub ( ) という関数が用意されています。また、 magicname( ) という関数で perl の変数に参照や変更か 生したときに呼び出す C の関数が指定できます。 make- usub( ) や magicname( ) では、呼び出す関数のはかに引 数を 1 つ指定することができます。一方、 curseperl ではそ れぞれ 1 つの関数を定義し、そのなかで引数によって処理 を変えるようになっています。このなかには mus という perl のスクリプトが入っており、スタブ関数が容易に書け るように工夫されています。 これらについてのドキュメントはいっさいありません。 例を見て適当にやってくれということのようです。とはい っても、いすれは整備されるでしようから、どうしても必 要な人以外はもうすこし待ったほうがよさそうですね。待 てない人は、例を見ながらノ、ツクしてください。 requnre ライプラリ・ファイルを読み込むには do を使いますが、 すでにそのライプラリを読み込んでいるときには同しファ イルを 2 度読むことになってしまいます。しかし、代わり に require を使うと、まだ読み込まれていない場合だけに なります。 require は、 requlre ' ctime. p1 ) ・ のように使用します。これは、ライプラリのなかで別のラ イプラリを必要とする場合などに便利な機能です。 125
連載① A First ok at 1 元 \vbox{ \parskip = 12pt \hsize = 23pc {\tt [ 1 ] } This is a paragraph. We will finish this paragraph and then have tWO centered lines f0110W 土 ng it ・ We need an empty line after this paragraph before using {\tt\string\centerline}. So here it is : \vskip\parskip % IMPORTANT \centerline{{\tt [ 2 ] } A centered line} \centerline{{\tt [ 3 ] } A second centered 1 土Ⅱ e } {\tt [ 4 ] } And here ve start the next paragraph. Observe that the empty line preceeding this paragraph IS not necessary. [ 1 ] This is a paragraph. We will finish this paragraph and then have two centered lines following it. We need an empty line after this paragraph before using \centerline. SO here it is: [ 2 ] A centered line [ 3 ] A second centered line [ 4 ] And here we start the next paragraph. Observe that the empty line preceeding this paragraph is not necessary. 図 3 : \parskip の応用例 2. \everypar = { $ \ bullet $ } では、各段落の先頭に レットが印字される ( 図 4 参昭 ) 3. 次の例は、段落に自動的に番号を振るものである。 1 2 3 4 5 \newcount\ParCount \ParCount = 0 \everypar = { % \advance\ParCount by {\tt [\the\ParCount] } 1 4. 段落の先頭行を自動的にインデントする機能がに ないと仮定すると、 \everypar がこの目的に利用でき る。段落の本文が印字される前に水平スキップを実現 122 する \everypar = {\hskip 20pt} という命令を入 力すれよ、先頭行は 20pt ぶんインデントされる。 ユーサーによる改行指定 では、ユーザーカ敏行を指定することもできる。た とえば、詩や戯曲の台本などを組む場合には改行の制御が 不可欠だが、これを実現するには次の 3 つの方法がある。 1. \hfil\break を用し、て段落内で強制改行する。 2. 1 行を 1 段落として扱う (\obeylines を利用 ) 。 3. hbox を利用する。各行を 1 つの hbox とし、各 hbox のな力、で水平グルーによってテキストを適正な水平位置 UNIX MAGÄZINE 1990.10