お知らせ+活動記録+たわごと

HP と Twitter を補完するとともに、互いの密接な連携を図るため、本ブログを開設した。三位一体を目指す。情報提供、広報活動、教育・啓蒙活動の一環として、肩の力を抜き、冗長性を廃し、簡にして要を得た文章を書くよう心がける。
<< December 2019 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
「Windows 用 BusyBox について」の公開
無料ハンズオンの参加者限定で配付している Windows 用 RIETAN-FP・VENUSシステムでは64ビット版 BusyBox を徹底活用しています。busybox64.exe を bash.exe と改名し、bash スクリプトを bash.exe、ひいては BusyBox multi-call binary に関連付けておくだけで UNIX アプレット(コマンド)を bash ウィンドウ中や bash スクリプトで 使えるようになります。秀丸マクロから実行されるシェルスクリプト *.command では grep, sed, awk に代表される UNIX コマンドを駆使しており、bash シェルによるテキスト処理のテクニックを習得するのにも役立ちます。

このたび、Evernote ノート「Windows 用 BusyBox について」を公開することにしました。Microsoft Windows 上で BusyBox のシェル(ash+α)や UNIX コマンドを活用するための初歩的知識とノウハウを詳述しました。WSL (Windows Subsystem for Linux) と異なり Windows 7 以降で使えます。お役に立てば幸いです。
Google 翻訳 + スプレッドシートによるサバイバル英作文
英語論文の執筆に四苦八苦している人々が随喜の涙を流して喜ぶ(かもしれない)翻訳テクニックをここに公開する。もともとは理工系大学院生を対象とする英語教育の一環として昨年執筆した Evernote のノートである。京大、名大、名工大、大阪府立大における英語論文執筆に関する講義・セミナーで紹介した。

1. 和文英訳方式による論文執筆の妥当性


本ノートでは、和文英訳による論文執筆について述べる。英文を直接スイスイ書ける優秀な人は以下を読んでも意味がないことをあらかじめお断りしておく。

英語論文を書く際には、英文を直接書き下すことが望ましい。和文の影響を受けず、執筆が大幅に速まる上、英語を話すスキルも向上するからである。筆者は終始一貫そうしてきた。

一方、英語アレルギーの日本人にとって、完成度が高く論理的に筋が通っている和文をまず書いてから、それを英訳する方が難易度が低いのは事実である。ところが、そうは問屋が卸さない。英語弱者は語彙が貧弱で、辞書の活用を怠りがちで、英文法に詳しくないと相場が決まっている。研究者として生きるか死ぬかの瀬戸際に丸腰で戦っても勝ち目はなく、為す術もなく撤退するか、下手をすれば致命傷を負いかねない。PC やネットを利用する飛び道具を駆使すべき理由はそこにある。

2. 研究者として生き残るための武装


英作文能力の不足を補う強力な武器さえ入手すれば、論文として発表するに値する成果を得た研究者が論文執筆でつまずくという最悪の事態は回避できる。ネット接続した PC 上で手軽に使えるソフトウェア
はそういう武力装備に他ならない。

Google スプレッドシートは英作文に尻込みする人の背中を押す翻訳用ツールとしてすこぶる役立つ。電動アシスト自転車のような感じという人もいる。電子辞典も欠かせない。英語が苦手で語彙が貧弱な人が辞書をまめに引かなかったら、自殺行為の誹りを免れないいことを肝に銘じるべきである。「新英和・和英中辞典」は熟成の進んだ由緒正しい辞書であり、信頼性が高い。さらに、205 万もの英和見出し数を誇り、多数の理工系専門用語を収録しており、Windows 上で手軽に検索できる PDIC-R/Unicode を使わない手はない。辞書に consult(「引く」の英訳)するのを厭わなければ、自ずと実力が身についていくだろう。

3. Google の翻訳エンジンについて


Google 翻訳のエンジンは 2016 年 11 月に Phrase-Based Machine Translation (PBMT) システムから Google Neural Machine Translation (GNMT) システムへと移行した。GNMT では多層ニューラルネットワークによる深層学習が採用され、文章をパーツごとではなく自然な文の流れとして解析・翻訳するようにした結果、翻訳精度が大幅に改善された。今のところ GNMT システムは完璧と言い難いが、今後、翻訳精度は着実に向上していくだろう。

英訳文は電子辞書も動員しつつ自分でブラッシュアップできるし、翻訳前の和文に手を入れることにより英訳結果を改善するという手もある。英作文が得意な人にとっても、語彙が豊富になるというメリットがある。おまけに長大な文章でも短時間で英文に変換してくれることから、一種の安心感と達成感を味わえる。英語が苦手な人にとっては、英文を直接書くのに比べとっつきやすいのは間違いない。

4. Google スプレッドシートの利点と魅力


Google スプレッドシートには Microsoft Excel が持ち合わせていない三つの強みがある:
  1. Gooogle Apps Script (GAS) のメソッド translate による翻訳。
  2. ネットを通じたスプレッドシートの共有、リアルタイム共同編集 (最大 50 人まで)、チャット。
  3. ネット接続した PC さえあれば無料で使える。
GAS は translate というメソッド一つからなる翻訳用クラス LanguageApp を備えている。上記の GNMT システムが translate メソッドに導入されていることは意外と知られていない。下記の ★ メニューを利用した翻訳でも GNMT システムが使われる。ワークシート関数 translate のコードをスクリプトエディタで保存し、ワークシートのセルで使えるようにする手続きについては、「Google Spreadsheet の googletranslate 関数の代わりに LanguageApp を使うワークシート関数を作ってイケてる翻訳ができるようにする」を参照せよ.

Google スプレッドシートではセル内に収めた文を translate で翻訳でき、セル間の対応が単純明快で混乱しにくい。もちろん表計算ソフトの機能も利用できるので、原文と翻訳結果の枠しか備えていない Google 翻訳を利便性と柔軟性で凌駕している。その上 Google スプレッドシートでは、教師と生徒が (互いに遠く離れていても) 同一のスプレッドシートをリアルタイム編集でき、チャットも可能である。さらに、ボタンをクリックするだけでファイルを添付したメールの送付作業へと移れるため、ネットを徹底活用した論文執筆教育に適している。

なお Google スプレッドシートに標準装備されている関数 googletranslate は前世代の PBMT システムに基づいており、賞味期限切れといって過言でない。Web で発信されている情報ではたいてい googletranslate を使用していることに注意せよ。

5. 新たなスプレッドシートの作成

  1. 「Google スプレッドシート」の Web サイトにアクセスする。
  2. [Google スプレッドシートを使う] をクリックする。
  3. 必要なら Gmail のアドレスとパスワードを入力した後、[次へ] をクリックする。
  4. 「新しいスプレッドシートを作成」 で 「空白」 をクリックし、新たなスプレッドシートを開く。
  5. 「ツール > スクリプトエディタ」を選ぶと、新たなタブが生成してスクリプトエディタに入る。「コード.gs」の右側の ▼ をクリックし、Translation.gs に改名する。
  6. ★ メニュー(7節参照)と function translate を使えるようにするための Google Apps Script のスクリプファイル Translation.gs に下記のソースコード(解凍する必要あり)をコピー&ペーストした後、「ファイル > 保存」(ツールバーにボタンあり)を選んで保存する。以後、現スプレッドシート(ワークシート)で translate 関数と ★ メニューが併用できる。
  7. スプレッドシートのタブをクリックしてスプレッドシートに戻る。
  8. 「ファイル > スプレッドシートの設定」で「言語と地域:日本」と「タイムゾーン:東京」を選ぶ。
  9. 「表示形式」 メニューで 「フォント サイズ 」 を 12 とし、「配置」 で 「左」 と 「上」 をチェックし、「テキストの折り返し」で「折り返す」 をチェックする。
Translation.gs のソースコードtranslate.zip

6. translate 関数による英訳の手続き


★ メニューを使う翻訳(次節参照)の方が明らかに効率的だが、まず translate 関数による翻訳について述べておく。

注意: macOS を使っている場合、 以後の記述中の「Ctrl」を「⌘」に代えて読むこと。
  1. 任意のブラウザーで Google スプレッドシートの Web ページを開く。
  2. 「ファイル > インポート > アップロード」 を選んだ後、 [パソコンからファイルを選択] をクリックして翻訳作業用ひな形ファイル *.xlsx をアップロードする。
  3. A1 を 「オリジナル和文」、B1 を「修正和文」、C1 を 「英文」、D1 を「修正英文」とする。
  4. 必要ならA, B, C, … をクリックして 「挿入 > メモ」 を選び、各列に関するメモを入力する。たとえば C1 には "=translate(B2,"ja",”en”)” とメモする。
  5. A 列の A2 以降の各セルに適度な長さの文章をコピー&ペーストする。 OS、ブラウザ、環境によって選べるフォントが異なる。MS P ゴシック、メイリオ、ヒラギノ角ゴ Pro (Mac) などの視認性の高い日本語フォントを使うことを推奨する。Ctrl-A を押して全セルを選択し、すべて同じフォント、サイズ、配置、テキストの折り返しにすると、単純でよい。
  6. A2 以降のセルすべてを選択し、Ctrl-C を押してクリップボードに保存する。前後関係が訳文に影響しそうな箇所では、複数の文 (最長で一段落) をまとめてコピー&ペーストする方が高品質の英訳を与えることもある。
  7. B2 を選択して Ctrl-V を押すと、B列がすべて埋まる。B列の和文は適切に英訳されるよう文脈や単語を修正するのに使う。
  8. "=translate(B2,"ja","en")" を C2 にコピー&ペーストすると C2 に英訳が現れる。
  9. C2 が選択された状態のまま Ctrl -C を押すと、B列を英訳して対応するC列に格納する命令がクリップボードに入る。
  10. Shift キーを押しながら C 列の最後のセルをクリックし、Ctrl-V を押す。
  11. C列の各セルをクリックすると、fx の右側に当該セルの翻訳関数が表示される。
  12. Cをクリックし、ツールバー中の 「垂直方向の配置」 をクリックして「上」を選び、さらに「テキストを折り返す」 をクリックしてから「折り返す」を選ぶと、英文が上に移動し、折り返される。
  13. 左端の行番号同士の境界線をマウスドラッグすることにより、適当な幅の空白を行間に入れて見やすくする。
  14. 翻訳結果を参考にしながら Google 先生が理解しやすいようにB列の各セルを書き直した後 を押すと自動的に再英訳され、C列の隣接セルが更新される。
  15. C 列を選択して Ctrl-C を押してからD列を選択し、Ctrl+shift-V(「編集 > 特殊貼り付け > 値のみ貼り付け」のショートカット)を押してC列の内容をD列にコピーする**。
  16. 「ファイル > 名前を変更」で名前を変更してから、「ファイル > 形式を指定してダウンロード」で PC や iCloud に保存できる。
  17. 必要なら、C2 以降の全セルを選択してから Ctrl-C を押し、テキストデータをクリップボードに入れた後、テキストエディターまたは Microsoft Word の新規文書にペーストする。
  18. 最上部の左端の [スプレッドシート ホーム] (緑のアイコン) をクリックして編集を終え、スプレッドシート一覧に戻る。
* 英文和訳には "=translate(和訳したいセル,"en","ja")" という形式の関数を使う。

** macOS で ⌘+shift-V を押すか Parallels Desktop + Windows 10 で Ctrl+shift-V を押してクリップボードの内容をペーストする場合、クリップボード・ユーティリティー Clipy で相当するショートカットを設定しないよう注意せよ。

7. ★ メニューを使う翻訳


★ メニューの追加:
https://www.infoscoop.org/blogjp/2014/09/16/google-apps-script-translate/

★ メニューを利用できるようにするには、Google Apps Script の初回実行時に承認を得なければならない:
https://www.virment.com/step-allow-google-apps-script

具体的な操作は次の通り:
  1. 「★ > 日本語→英語」を選ぶと「承認が必要」というダイアログが現れる。
  2. [続行] をクリックする。
  3. 「アカウントの選択」というダイアログで「自分の名前+ Gmail アドレス」をクリックする。
  4. 「このアプリは確認されていません」というダイアログで、「詳細」(左下)をクリックする。
  5. 「translation(安全ではないページ)に移動」(最下部)をクリックする。"translation" は "testProject" など別な文字列の場合がある。
  6. [許可] をクリックする。
スプレッドシートを開いてからメニューバーに ★ が現れるまでには多少時間がかかることに留意せよ。

特定のセルを選択する。複数のセルを選択するには、始点のセルをクリックしてから、shift キーを押しながら終点のセルをクリックする。メニューバーの ★ をクリックしてから「日本語→英語」または「英語→日本語」を選ぶと、選択部分の右に訳文が現れる。訳文は単なる文字データなので、Ctrl+shift-V でなく Ctrl-V でペーストできるというメリットがある。

8. 翻訳結果の改善


Cをクリックし、Ctrl-C を押す。Dをクリックしてから 「編集 > 特殊貼り付け > 値のみ貼り付け」 を選ぶか、Ctrl+shift-V を押す。こうすれば、列に割り当てられた関数がコピーされずに済む。D列の例文は自力でブラッシュアップする。修正過程では電子辞典が強力な援軍となる。

書籍由来の新英和・和英中辞典は一般的な目的に使えるが、名詞が countable(可算)か uncountable(不可算)かを調べるのにとりわけ役立つ。

英辞郎検索アプリケーション PDIC-R/Unicode は貧弱な語彙と低い英作文能力を補ってくれ、添削結果の質的向上をもたらす。Ctrl-Cで単語をコピーするだけでただちに検索できるクイック・ポップアップ検索やクリップボード検索はとくに威力を発揮するだろう。「Search > 全文検索」を選ぶか、[F2] を押して利用する全文検索はきわめて強力で、AND/OR 検索も可能となっている。

英訳に供する日本語の文章を書く際には、今のところ熟成度が高くない翻訳エンジンの身になって、あらかじめ最適化しておくのも重要である。たとえば次のようなノウハウが役立つだろう。
  1. 長文になればなるほど翻訳精度が落ちるので、できるだけ各文を短文にするのが望ましい。
  2. 複文(述語が二つ以上存在する文)や重文(短文を二つ以上並列させた文)はできるだけ避ける。
  3. 余計な副詞や修飾語は避け、平易、簡潔、かつ論理的な文章にする。
  4. 主語、述語、目的語が入っている明確な文章を書くよう努める。
  5. 漢字を使える部分は積極的に使う。
  6. 別な意味に誤解されかねない曖昧な表現は避ける。
  7. 英訳と和訳を繰り返すと、英文と和文の完成度が低い部分がわかり、結果として英文の質が向上する可能性がある。
  8. 可算名詞と不可算名詞をしばしば取り違えるので、疑問を感じたら新英和中辞典を引くことを推奨する。
  9. 英訳の冒頭が However (Nevertheless), Therefore (Accordingly, Hence), On the other hand, Further (In addition) となり過ぎる傾向がある。目に余る場合は、Though (Although), Because, Since, While, Whereas, also, too などで書き直すとよい。
短文化(1) の例::名詞がいくつか並んでいる場合、便宜上一つだけにすると適切に訳せる可能性が増す。生成した英文に削除した名詞を追加するのは容易である。

9. Lutwig の活用


せっかくネットに接続した状態で Google スプレッドシートを利用しているのだから、オンライン英文検索サービス Lutwig の活用も推奨したい。
Lutwig の Web サイト: https://ludwig.guru/
Evernote の公開ノート (Ludwig): https://bit.ly/2UQB0fY

Lutwig は他力本願の翻訳サービスではない。Lutwig 中の "Search here..." という枠に各セルの文章をコピー&ペーストして、類似した文脈を含む 15 個(登録済みの場合)の英文を検索し、それらを参考にして自分の英文をブラッシュアップする。高品位の例文を手軽に参照できるため、効果てきめんである。

10. ファイル関係の操作


普通は「自分がオーナー」を選んで表示させる。左から三つ目のボタンでリスト表示とギャラリー表示をボタンで切り替えられる。リスト表示で各ファイルの右端にある点三つのボタンをクリックすると、「名前を変更」と「削除」を選べる。

右端の「ファイル選択ツールで開く」で「アップロード」をクリックし、「パソコンからファイルを選択」をクリックすれば、PC 上のファイルを読み込める。

「ファイル > 形式を指定してのダウンロード > Microsoft Excel」 を選ぶと、ブラウザーのダウンロード先に指定したフォルダーに Excel 互換のファイル hoge.xlsx が保存される。「ファイル > メールに添付して送信」を選ぶと、ただちにメールの作成・送付に移行できる。添付ファイルをオフラインで編集した後、返送してもらえばよい。

11. シートの追加


左下の +(シートを追加)をクリックすると、新たなシートで翻訳できる。

既存シートの 1 行目だけ利用する場合の手続きは次の通り。
  1. 既存シートのタブを右クリックし「コピーを作成」を選ぶ。
  2. 右側に新シートがコピーされる。
  3. 2 行目以降のデータを削除する。
  4. 新シート名を右クリックし、「名前を変更」を選んでから名前を変更する。

12. ファイル共有によるリアルタイム共同編集

  1. スプレッドシート (以後、hoge と記述する) 編集中に右上の [共有] をクリックするか「ファイル > 共有」を選ぶ。
  2. スプレッドシートを公開したい相手の Gmail のメールアドレスを入力した後、左下の [送信] をクリックする。
  3. 相手に 「hoge - 編集へのご招待」 というメールが届く。
  4. そのメールを開き [スプレッドシートで開く] をクリックすると、ただちに hoge の共同編集作業に従事できる。Help の右横で、編集参加者としてピンクに色づけられる。
  5. 編集済みセル以外を選択すると、相手のスプレッドシートにリアルタイムで反映される。誤ってスプレッドシートを閉じないよう注意せよ。
  6. 画面右上にある四角いチャットマークをクリックすれば、チャットを開始できる。カナ漢字変換結果の確定以外で を押すと、入力データが送信されることに注意せよ。いったんエディターで入力した後、コピー&ペーストするのが安全である。
  7. チャットの内容は保存されないので、必要なら Google ドキュメントにコピー&ペーストする。チャットのウィンドウ内をクリックしてから、Ctrl-A, Ctrl-C を押し、ドキュメントのウィンドウ内で Ctrl-V を押せばよい。スレッドシートと同様に Gmail のアドレスを持っている人に共有を通知と共有できる。
必要に応じて 「ファイル > 共同編集者にメールを送信」 も利用するとよい。

付録: Google ドキュメントを利用する翻訳


Google ドキュメントでは GNMT システムによって和文を各国語に翻訳できる。Google ドキュメントで日本語.doc を英訳し、English.doc を得るときの操作は次の通り:
    1. Google ドキュメントの「新しいドキュメントを作成」で「空白」をクリックし、「無題のドキュメント」を日本語.doc に改名し、和文を入力する。
    2. メニューバーで「ツール > ドキュメントを翻訳」を選ぶ。
    3. 「新規ドキュメントのタイトル」を English.doc と入力し、翻訳する言語として「英語」を選択する。
    4. [翻訳] をクリックすると、English.doc に新たなタブが割り当てられ英訳結果が表示される。
    後で日本語.doc を開いたときに「ファイル > 開く」を選べば、English.doc も別なタブの下に開くことができる。

    選択した文字を上付き(下付き)文字にするには、「表示形式 > テキスト > 上付き(下付き)文字」を選択する。

    ファイルを共有しているときは、右上の [コメント履歴を開く] ([共有]の左)をクリックした後、[+ コメント] (コメントを追加)をクリックしてコメントを入力し、[コメント]をクリックして相手とのコミュニケーションを図るとよい。

    各コメントで [解決] の右にある「その他のオプション」(ポイントが縦に三つ並んだアイコン)をクリックすれば、コメントを編集・削除できる。

    「ファイル > 形式を指定してダウンロード > Microsoft Word (.docx)」を選べば、Word 互換ファイル *.docx が保存される。
Quantum ESPRESSO のインストール
Quantum ESPRESSO は擬ポテンシャル法と平面波基底を用いた第一原理計算プログラム・スイートである。PWscf (Plane-Wave Self-Consistent Field) と称することもある。無料アプリケーションとしてはトップレベルの人気を誇っている。

最近、CIF を Quantumu ESPRESSO 用入力ファイル hoge.in に変換できるように CIF コンバーター cifconv.command をバージョンアップした後、MacBook Pro (OS: macOS Mojave) に Quantum ESPRESSO 5.3.0 をインストールした。その手続きを忘れないうちに、以下に記しておく。
  1. 必要なら AppStore で Xcode の最新版をインストールしておく。
  2. Homebrew で gcc をインストールする。gcc は Quantum ESPRESSO をコンパイルするための Fortran コンパイラー gfortran を含んでいる。
  3. GitLab 中の "Click here to download the sources in in .tgz format" という箇所で "here" をクリックして Quantum ESPRESSO 6.3 用インストーラー q-e-qe-6.3.tar.gz をダウンロードし、ダブルクリックして解凍すると q-e-qe-6.3 フォルダーが生成する。
  4. Quantum ESPRESSO 講習会(東工大)の Web ページ 中の 2.3 と 2.4 に従って
    ./configure
    make pw
    make pp
    と入力することにより pw と pp をコンパイルする。フォノンを計算したい場合は ph もコンパイルする。
  5. q-e-qe-6.3 フォルダーを Quantum_ESPRESSO に改名し、/Applications フォルダー中に移す。
  6. 「グラフェンの scf 計算」で公開されている入力ファイル graphene.scf.in を使ってテストしてみる。Terminal で graphene.scf.in の存在するフォルダーに降りてから
    /Applications/Quantum_ESPRESSO/bin/pw.x < graphene.scf.in > graphene.scf.out
    と入力すればよい。その際、カレントフォルダーに擬ポテンシャルのファイル C.pz-van_ak.UPF を置くのを忘れてはならない。
  7. 計算結果が graphen.scf.out に出力される。
  8. 「グラフェンの scf 計算」下部の部分出力リストと比較して、正常に計算されたことを確認する。
macOS=UNIX である以上、Mac にLinux用パーティションを切らずに macOS 用アプリケーションを使うのが自然である。スピードを重視するなら Intel の Fortran コンパイラーでビルドすることを推奨する。gfortran は最適化レベルがやや低い。
二つ以上のスペースで区切られた文字列を取り出す
文字列 '␣␣␣2␣␣3␣␣␣4␣␣5' の先頭の空白 3 つを sed で削除し、tr により連続空白を 1 つの空白にまとめた上で、cut で 3 番目のフィールドを出力ための命令は次の通り。

% echo '␣␣␣2␣␣3␣␣␣4␣␣5' | sed 's/^ *//' | tr -s '␣' | cut -d '␣' -f 3
4

tr コマンドでオプション -s を指定すると、連続した同一文字(この場合、空白)が 1 文字に置き換えられる。自己満足に過ぎないものの、低速な awk を使わず済むのは心地よい。

sed で先頭の空白を削除しないと、先頭にヌル文字が存在すると見なされる。そこで、

% echo '␣␣␣2␣␣3␣␣␣4␣␣5' | tr -s '␣' | cut -d '␣' -f 4
4

としてもよい。
GNU sed 4.4 の公開
Mac 用 RIETAN-FP・VENUS システム用のシェルスクリプトでは、文字列の置換や行の抽出・削除などにストリーム・エディター sed を使いまくっている。grep や awk よりも利用頻度がはるかに高い。

E2J.command では、英語 → 日本語置換のためにパイプ経由で sed を繰り返し実行することにより、LaTeX 文書の「和訳」を実現した。パイプによる並列処理はきわめて高速で、E2J における律速段階は pLaTeX による組版の方だ。反射リストからデータを抽出して CIF を作成するシェルスクリプト refln.command では、反射リストと数値の抽出に sed を使用する。極め付けは逐次リートベルト解析用スクリプトsda.commandで、ユーザーが正規表現対応の置換エンジンとして sed コマンドを自分で入力する仕組みとなっている。

それほどお世話になっている sed が最近 v4.3 にバージョンアップしたことを知り、小躍りしたのは言うまでもない。その直後に早くも v4.4 にマイナー・アップデートされた。v4.3以降では、正規表現マッチング速度が約10倍高速化したそうだ。

v4.4は次の手続きに従ってビルドできる。
  1. GNU sed の Web サイトから sed-4.4.tar.xz をダウンロードする。
  2. sed-4.4.tar.xz をダブルクリックして解凍すると、sed-4.4 フォルダーが生成する。
  3. sed-4.4/INSTALL(テキストファイル)に記載されている手続きに従ってビルドする。
  4. 実行可能プログラム sed-4.4/sed/sed が生成する。
Mac 用 RIETAN-FP・VENUS 統合支援環境のシェルスクリプトはすべて sed 4.4 を使うよう変更した。今後も積極的に sed を活用していく所存である。
Gnuplot で pdfcairo ターミナルを使うための手続き
1. pdfcairo ターミナルに切り換えたきっかけ

最近購入した "Gnuplot in Action", 2nd ed. を流し読みしていたとき、
A major breakthrough is the development of a family of terminals that are all based on a single set of contemporary libraries for graphics and text rendering. Because these terminals all share the same back end, you can now create bitmaps (PNG), vector images (PDF), and graphs for interactive viewing (wxWidgets) with consistent appearance across all formats. Gnuplot takes advantage of the cotemporary features of the underlying libraries to produce high-quality graphs through the use of over-sampling, anti-aliasing, and so on.
.....
In the past, gnuplot's support for PDF was relatively weak, particularly in comparison to the very full-featureed PostScript terminal. This situation has now been reversed, and the Cairo-based PDF terminal is probably to be preferred over the classic PostScript terminal.
という指摘(14ページ)が目にとまった。213, 214, 220, 233ページでも 2D グラフィックス・ライブラリー cairo に基づくターミナルに言及している。その的確な現状認識に触発され、RIETAN-FP v2.81 に至るまで長く出力先に指定してきた gnuplot の postscript ターミナルを pdfcairo ターミナルに切り換えようと決意した。グラフの枠と目盛りの線幅を同一にできないという postscript ターミナルの欠陥には我慢がならなかった。古くからあるターミナルだが、未だに枯れきっていないのである。PDF ファイルへの変換に余計な時間がかかるのも気に入らなかった。一方、pdfcairo なら高品質の PDF ファイルが直接生成する。

以前 pdfcairo の利用を検討した際には、Homebrew を通じて macOS 上で gnuplot と cairo とを連携させる方法が突き止められず、あえなく挫折した。今回は不退転の覚悟で臨み、徹底的に調査した。その結果、習い覚えたノウハウとテクニックを以下に報告する。

2. macOS 版のインストール

macOS 用 gnuplot は、次の手続きに従ってインストールすることを推奨する:
  1. すでに gnuplot をインストール済みだったら、必ずアンインストールする。たとえば Homebrew でインストールした場合は、ターミナルで "brew uninstall gnuplot" と入力してアンインストールする。
  2. 古いバージョンの gnuplot が残っている場合は削除用コマンドが指示されるので、その通り入力する。
  3. Wake Forest University の Web サーバー から gnuplot のインストーラー gnuplot-5.2.3-quartz.pkg をダウンロードする。
  4. gnuplot-5.2.3-quartz.pkg をダブルクリックして gnuplot 5.2.3 をインストールする。
  5. Applications フォルダーに gnuplot(実体は Gnuplot.app パッケージ)が生成したことを確認する。
gnuplot をダブルクリックし、"gnuplot> set terminal" と入力すると利用できるターミナルが出力されるが、その中に cairo、多言語テキスト配置・レンダリング用ライブラリー pango、フォント選択用ライブラリー fontconfig を使うターミナル pdfcairo, pngcairo, epscairo に加え、wxt と aquaterm ターミナルも含まれている。

残念ながら、上記サーバーで公開されている gnuplot は更新頻度が低い。こうしてインストールした gnuplot 5.2.3 は最新版ではないものの、拙作ソフトから起動している限り安定に動く。対数グラフさえプロットしなければ、まずトラブルは起きないだろう。

3. macOS 版の実行用コマンド

上記の macOS 用 gnuplot は pdfcairo を出力先とする RIETAN-FP v2.82 以降と互換性がある。macOS 版 RIETAN-FP の出力する hoge.plt における文字のシフトやマージンはこの gnuplot 用に最適化されている。シェルスクリプト中では
/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot-run.sh
を gnuplot コマンドとして使えばよい。gnuplot-run.sh 中で11個の環境変数が定義された後、同じフォルダー内の(環境変数を設定できない)実行形式ファイル gnuplot が起動する。/usr/local/bin/gnuplot が存在しなければ、起動可能な /usr/local/bin/gnuplot が置かれるが、以前インストールした gnuplot が残っていると、それが実行されてしまう。したがって絶対パス付きの gnuplot-run.sh を実行する方が安全・確実である。Gnuplot スクリプトファイル *.plt は cat コマンドでテキストデータに変えた後、パイプを通じて gnuplot-run.sh に渡すか、gnuplot-run.sh の引数にすればよい。たとえば hoge.plt を入力して hoge.pdf を生成するには、
cat hoge.plt | /Applications/Gnuplot.app/Contents/Resources/bin/gnuplot-run.sh > hoge.pdf
とする。

4. Windows 版のインストール

Windows 用インストーラーは SourceForge からダウンロードできる。Windows 用 RIETAN-FP・VENUS システムに同梱している gnuplot は、インストーラーの実行によって生成した gnuplot フォルダーに他ならない。ありがたいことに、その gnuplot では cairo + pango + fontconfig、ひいては pdfcairo が標準で使える。ただし、fontscale と offset の最適値は macOS 用と微妙に異なる。

5. Windows 版の実行

Windows 版 BusyBox を活用する bash スクリプトでは gnuplot は macOS の場合と同様に実行できる。たとえば hoge.plt を入力して hoge.pdf を生成する時は、
cat hoge.plt | "C:/Program Files/gnuplot/bin/gnuplot" > hoge.pdf
とする。すなわち gnuplot.exe を絶対パス付きで実行すればよい。

6. 特殊文字と日本語の出力

出力先として pdfcairo を指定したとき、gnuplot スクリプトファイル中でギリシャ文字や記号などをどのように記述すればいいのかについては、"Gnuplot in Action" の10.2.3を参照されたい。RIETAN-FP v2.82 以降が出力する *.plt も恰好の手本となる。その際の手間を減らすために、RIETAN-FP・VENUS システムのマクロが出力する *.plt ファイル中の8進コード(\+3桁の8進数の繰り返し)を以下に列挙しておく:
\316\261: α
\316\262: β
\316\263: γ
\316\270: θ
\316\273: λ
\316\274: μ
\302\260: ° (度)
\303\205: Å
\342\210\222: −(マイナス; UNICODE: U+2212)
\342\200\262: ′ (プライム)
\342\200\262: ̋ (ダブルプライム)
特定文字の8進コードを知るには、「文字コード変換」で変換するとよい。その際には「Unicode 対応 文字コード表」も役立つ。イタリックの書体にするには、たとえば θ の場合 "{/:Italic \316\270}" と入力する。

イタリックでない文字は、たとえば
{/Symbol \260}: ° (度)
{/Symbol \242}: ′ (プライム)
というように PostScript 文字コードを書いてもよい。ただし sans-serif 書体(6節参照)にはならない。

上述の8進コードや PostScript 文字コード (Symbol) は macOS、Windows を問わずに通用する。Unicode のテキストファイルを出力できない高級言語でビルドしたプログラムで gnuplot スクリプトファイルを出力する場合に役立つ。

一方、テキストエディターでスクリプトファイルを編集するのであれば、「RIETAN vs. Z-Rietveld」に例示したように "set encoding utf8" という行を挿入し、それ以降にギリシャ文字、記号、かな漢字などを直接書いて、UTF-8 エンコーディングでファイルを保存する方がはるかに楽だ。

7. 最適なグラフ用フォント

欧文フォントは serif 体と sans-serif 体に大別される(「セリフ体とサンセリフ体の違いとは?欧文フォントの基本と種類」参照)。一般に、グラフ中のラベルや数値には serif 体よりも sans-serif 体のフォントが適している。事実、Gnuplot のマニュアルには pdfcairo ターミナルのデフォールトは sans (= sans-serif) だと記されている。sans-serif 体の代表的フォント Arial は macOS にも標準で組み込まれる。したがって具体的なフォントを指定したいならば、Windows、macOS を問わず font "Arial" とすればよい。「gnuplotのTips」によれば、Windows の場合、OS によるフォントの別名が有効ではなく,C:¥Windows¥Fonts にあるフォント(ArialやSymbolなど)以外では sans-serif, serif 程度しか有効でないそうである。確かに Windows では、Arial を指定しないとイタリックの書体にならない。

"Gnuplot in Action" の215ページには
If a sans-serif font is selected as the default font for a terminal, then the font subsystem will attempt to find sans-serif glyphs for all requested characters even for special symbols.
と書かれている。つまり、記号やギリシャ文字なども同様な外見のフォントが自動的に選ばれる。

なお、fontscale のデフォールトは0.5だが、これの変更により実質的なフォント・サイズを一挙に変えられる。

8. マイナスの出力法

Gnuplot 5.0.4以前の pdfcairo には major tics(主目盛)に対する数値が負のとき、数字の前にマイナスでなくハイフンが付いてしまうという瑕疵があった。Gnuplot 5.0.5からは "set minussign" コマンドによりハイフンでなくマイナス (UNICODE: U+2212) を出力できるようになった。ただし、前述の UTF-8 エンコーディングを適用するため、
set encoding utf8
set minussign
という二つの命令をペアで実行しなければならない。両コマンドを使ってプロットした Ni の分散補正と質量減衰係数の波長(エネルギー)依存性を下図に示す。確かに負の f' と f'' の符号がハイフンでなくマイナスになっている。


9. 余白の切り取り

terminal pdfcairo には crop オプションがなく、pdfcairo へのグラフ出力では余白が自動的にカットされることも、利便性の高さと処理時間の短縮に寄与する。タイトルやラベルの一部が隠れてしまうようだったら、
set margins <left>, <right>, <bottom>, <top>
という命令で余白を微調整すればよい。負の値だと gnuplot が決めたマージンが使われる。

10. Parallels Desktop + Windows 10 上で使用する際の留意点

Retina ディスプレイの Mac を使い、Parallels Desktop + Windows 10 の環境下で Gnuplot 5.2.X を実行すると、文字サイズが異常に大きくなる。そういうトラブルを避けるには、Windows のスクリーン設定を変更する必要があることを二年近くかけて突き止めた。詳しくは Evernote ノート「Windows 用 Gnuplot 5.2.7 を活用するためのノウハウ」を参照せよ。

11. ターミナル間の互換性

"Gnuplot in Action" 中の一節(213〜214ページ)、
Because an entire family of terminals(注: pngcairo, pdfcairo, epscairo, wxt のこと)shares a common back end, it's now possible to generate bitmap (PNG), vector (PDF and EPS), and interactive (wxWidgets) versions of the same graph, with only minor differences between them.
では cairo・pango ライブラリーを使うターミナル間の互換性の高さが強調されているが、実際はそう簡単にターミナルを変更できる訳ではない。グラフの見かけ、とりわけラベルや数値のサイズとオフセットを最適化するには、試行錯誤を繰り返さねばならない。

12. おわりに

ターミナル pdfcairo への出力で得られた PDF ファイルは LaTeX, Microsoft Word, Keynote, Adobe Illustrator などの文書に直接挿入できる。文書に貼り付ける図は PDF ファイルに統一しているし、余白を切り取ったグラフが出力されるのも好都合なため、今後は pdfcairo をフル活用していく。
FINDSTR 実行後の ERRORLEVEL に応じた条件分岐
Windows に標準で備わっているコマンドプロンプトはシェルに比べると非力だが、UNIX 系コマンドさえ導入すれば、そこそこ便利に使える。バッチファイルにおいて、文字列がテキストファイル中に存在するか否かで後続処理を変えるとき重宝する構文をここで紹介したい。

コマンドプロンプト用文字列検索コマンド FINDSTR は UNIX 標準の grep/egrep の機能を劣化させたようなコマンドであり、単純な正規表現しか使えない。FINDSTR は文字列を含む行を出力するとともに、文字列が見つかったら ERRORLEVEL=0、見つからなかったら ERRORLEVEL=1 という復帰コードを返す。しかし文字列が存在しようがしまいがエラーとは言い難く、文字列の有無を知るために %ERRORLEVEL% の値を調べるのには心理的抵抗がある。たとえば RETURNCODE とすべきではないか。いずれにせよ、長くて鬱陶しい復帰コード名だ。

FINDSTR と &&(論理積)または ||(論理和)とを組み合わせると、IF, ELSE, ELSE IF, %ERRORLEVEL% が不要となり、バッチファイル中の検索・条件分岐部分が実にすっきりする。たとえば、test.txt というテキストファイル中に
  1. 正規表現 (Regular expression) の文字列 reg_string1 が存在する、
  2. さもなければ正規表現の文字列 reg_string2 が存在する、
  3. いずれも存在しない、
という三通りの検索結果に応じて後続処理を切り換えるには、次のようにブロック化する:

FINDSTR /R /C:"reg_string1" test.txt >NUL 2>&1 && (
  .....
) || FINDSTR /R /C:"reg_string2" test.txt >NUL 2>&1 && (
  .....
) || (
  .....
)

/R は正規表現の文字列を探索するオプションである。FINDSTR は簡易正規表現しか扱えないという手抜き仕様に留まっているが、通常の目的には十分だろう。/C: は文字列中の空白が文字列同士の区切り文字とみなされないようにするオプションであり、">NUL 2>&1" はコマンドプロンプト窓が散らかるのを防ぐための呪文である。&& に続く (.....) ブロック内には検索に成功した場合 (ERRORLEVEL = 0)、|| に続く (.....) ブロック内にはヒットしなかった場合 (ERRORLEVEL = 1) の処理を記述する。ブロックの始まりと終わりを意味する "(" と ")" は必ずペアになっていなければならない。

reg_string1 が test.txt 中に存在しないときは、単に

FINDSTR /R /C:"reg_string1" test.txt >NUL 2>&1 || (
  .....
)

とするだけで済む。

通常の文字列 "string" を探索する際には、/R の代わりに /L を指定するか、

FIND "string" test.txt

を使う。オプション不要なところがありがたい。

コマンド実行後の && と || による条件分岐は広く認知されているとは言い難く、ネット情報はほとんど見かけない。呪文めいてはいるものの、頻用されてしかるべき便利な表現である。

なお FINDSTR と FIND では原則として Shift_JIS コードのファイルを処理するためのコマンドだが、ASCII 文字の検索に限定するならば、EUC や UTF-8 コードのファイルも扱えるようだ。

Windows 用 RIETAN-FP・VENUS 統合支援環境には、テキストファイル中に特定の文字列が含まれているか否かを調べてから後続処理を条件分岐するバッチファイルがいくつか含まれている。従来は FOR 文の実行結果を環境変数に代入し、その値を IF 文で参照するという、ややこしい手続きを踏んでいた。遅延展開せざるを得ない可能性がある環境変数の増加はできるだけ控えたい。

たとえば RIETAN.bat 中では、あらかじめ "MEP = 1" が hoge.lst 中に存在するか否かを

FOR /F "TOKENS=3 USEBACKQ" %%T IN (`FINDSTR /R /C:"^ *MEP = 1$" "%SAMPLE%.lst"`) DO SET MEP=%%T

という長い FOR 文を通じて変数 MEP に代入した後、

IF "%MEP%"=="1" (
  .....
)

という IF ブロックを実行するかどうかを判定していた。意味が理解しにくい上、冗長だ。同等の条件分岐を

FINDSTR /R /C:"^ *MEP = 1$" %SAMPLE%.lst >NUL 2>&1 && (
  .....
)

という簡潔な命令で実行できるのは感動的ですらある。次期配付ファイルでは、FINDSTR または FIND コマンドでストレートに場合分けするよう全面的に書き換える予定である。
macOS・Windows 用 TeX Live のインストール
最近、結晶構造解析の結果を文書化するための CIF・TeX 関連ユーティリティー cif2pdf, E2J, refln を実行するための Jedit X秀丸用のマクロを作成した。 いずれ公開する予定だが、cif2pdf と E2J を実行するには、TeX Live が必要不可欠である。ここで macOS と Windows 上で TeX 文書をタイプセットする環境を整えるための情報を提供しておく。

OS X 用 TeX Live は MacTeX の Web ページから MacTeX.pkg をダウンロードし、それをダブルクリックしてインストールする。/Library/TeX/texbin にパスを通せば、TeX 関連プログラムが使えるようになる。パッケージの更新法や TeXShop の設定については、「Mac 用 TeX による英文・和文のタイプセット」を参照されたい。

Windows 用 TeX Live は CTAN から install-tl-windows.exe をダウンロードし、右クリックしてから「管理者権限として実行」を選べば、perl.exe が裏で動いてインストールされる。TeX Live YYYY("YYYY" は "2016" のような年号を表す)の場合、システム変数 Path に C:¥texlive¥YYYY¥bin¥win32 が追加される。TeX 関連実行形式プログラムはそのフォルダーに入っている。同フォルダー中の tlmgr-gui.exe をダブルクリックし、[導入済みのものをすべて更新] をクリックすればすべてのパッケージを更新できる。更新に失敗したならば、時間を置いて再度トライするとよい。

(C) 2019 ブログ JUGEM Some Rights Reserved.