LaTeX でロシア語テクストを含む URL を出力しなければならないとき,url パッケージの \url 命令だと,キリル文字が出力できない。hyperref パッケージの \href
URL エンコードを行うツールはあちこちに転がっていて,Web なら http://www.tagindex.com/tool/url.html などの便利なサイトがある。Emacs 用の Elisp も探せばあるかも知れない。でも,LaTeX で,この URL エンコードを埋め込むとなると,% 文字が含まれるため,これをいちいちエスケープする手間が別途発生し,これまた面倒である。そこで,これくらいならツールを探す時間の間に出来てしまうと思い,自前で LaTeX 向け UTF-8 前提 URL エンコード・ツールを作ってみた。Perl である。U+0080 以上の UTF-8 文字を URL エンコードするので,ロシア語以外に日本語,ドイツ語などを含む URL にも適用できるはずである。同じ必要に駆られる方もいらっしゃると思うので,以下にそのコードを掲載しておく。ここにも置いておくので,ダウンロードして使っていただいてよい(無保証)。
#!/usr/bin/perl -w # -*- coding: utf-8; mode: cperl; -*- # URL encoding: convert chars over U+0080 to format %hex. # Usage: urlenc [ -l ] < stdin (url text) use strict; use utf8; use Getopt::Std; # command line processing use File::Basename; # get file basename # command line my %opts = ('l' => 0); Getopt::Std::getopts('l', \%opts) || die "Usage: " . basename($0) . " [ -l ] \< (stdin)\n -l: insert \\ before % for LaTeX\n"; my $sfx = "%"; $sfx = "\\" . $sfx if ($opts{'l'}); # hex format while (<STDIN>) { utf8::decode($_); my $enc = ""; foreach my $chr (split(//, $_)) { if ($chr ge "\x{0080}") { utf8::encode($chr); foreach my $bchr (split(//, $chr)) { $enc .= $sfx . sprintf("%x", ord($bchr)); } } else { $enc .= $chr; } } print $enc; }
Perl コードはこれだけである。標準入力から読んだ URL 文字列のうち U+0080 以上を %xx 形式に変換して,標準出力に書き出す。オプション -l を指定すると LaTeX 向けに \%xx とエスケープした形で出力する。このプログラムを urlenc と名付けて,パスの通ったところにコピーして利用する。Mac OS X ターミナルでの実行例を以下に示す。
Emacs から利用する場合は,以下の内容を .emacs に記述し,関数定義を C-x C-e で Emacs に認識させるか,Emacs を再起動すれば,urlencode 命令が利用可能となる。ウラで上記 urlenc プログラムが動くので先きにこれを組込んでおくこと。urlenc の絶対パスは利用者の環境に応じて変更する必要がある。LaTeX 原稿において変換したいテクストをリージョン設定し,M-x urlencode RTN とすれば,当該リージョンが URL エンコード変換される。Emacs の set-
;; ;; URL encoding for LaTeX ;; (set-default-coding-systems 'utf-8) ;; すでに設定されていれば不要 ;; (defun urlencode (start end) "URL encoding for LaTeX" (interactive "r") (call-process-region start end "/usr/local/bin/urlenc" ;; urlenc の絶対パスを指定 t (list t nil) nil "-l") ;; urlenc LaTeX 用オプション )
Emacs 上での変換の様子を以下に示す。