よくお世話になるLaTeX2eのパッケージとしてEPSの画像を 文書の中に入れたりするのに使うgraphicxがあります. graphicxはほかにも、文字の大きさや形を変えたり、 文字を回転させたりと様々な機能があります.
これに対して、AWKやPerlなどでフィルタをつくっておけば、 picture環境と組み合わせて文字列の組み方向も 自由自在に操作することができるわけです.
ここでは、picture環境、graphicxと Cを連携させて文字を回転させながら組む、ということを試みました.
特にこれといった理由があるわけでもないのですが、 今回はフィルタの作成にCを用いました.別にPerlなどでも 十分可能でしょう.
以下にソースを出しておきます.colorパッケージも用いて 回転する文字が中心に向かうほど文字がフェードアウトするようにしました.
#include <stdio.h>
#include <math.h>
#define INIT_ANGLE 120.0 /* 1文字目の位置の角度 */
#define LENGTH 560 /* 文字列の長さ */
main(char argc[],char *argv[])
{
int i;
char a[LENGTH+1]; /* 読み込んだ文字列 */
float x,y,r; /* 文字の回転座標、半径、回転角 */
float rot,csize,wspace,gness; /* 各文字の回転角度、サイズ、
文字間隔、色の濃さ */
double PI; /* 円周率 */
FILE *in,*out;
/* 文字列ファイルの読み込み */
if( (in = fopen(argv[1],"r")) == NULL )
{
printf("Can't open \"%s\".\n", argv[1]);
exit(8);
}
in = fopen(argv[1],"r");
fgets(a, LENGTH+1, in);
close(in);
/* LaTeXファイルの書き出し */
if( (out = fopen("rotstring.tex","w")) == NULL )
{
printf("Can't open \"rotstring.tex\".\n");
exit(8);
}
/* プリアンブルからpicture環境の入口まで書き出し */
out = fopen("rotstring.tex","w");
fprintf(out, "\\documentclass{jarticle}\n");
fprintf(out, "\\usepackage{color}");
fprintf(out, "\\usepackage[dvips]{graphicx}\n");
fprintf(out, "\\setlength{\\oddsidemargin}{0pt}\n");
fprintf(out, "\\setlength{\\textwidth}{\\paperwidth}\n");
fprintf(out, "\\addtolength{\\textwidth}{-2in}");
fprintf(out, "\\begin{document}\n\\thispagestyle{empty}\n");
fprintf(out, "\\hspace{1pt}\\vfill\n\\begin{center}\n");
fprintf(out, "\\begin{picture}(400,400)\n");
fprintf(out, "\\newcommand{\\Gtext}[2]{\\textcolor[gray]{.#1}{$#2$}}\n");
/* 各初期値設定 */
PI = 4.0*atan(1.0);
r = 200.0; csize = 2.5; gness = 100.0;
wspace = 45.0;
for(i = 0; i < LENGTH; i += 2)
{
x = r * cos(INIT_ANGLE/180.0 * PI - PI/wspace*(i+1)) + 200;
y = r * sin(INIT_ANGLE/180.0 * PI - PI/wspace*(i+1)) + 200;
rot = 180 * (INIT_ANGLE/180.0 * PI - PI/wspace*(i+1)) / PI - 100;
fprintf(out,"\\put(%d,%d)",(int)x,(int)y);
fprintf(out,"{\\rotatebox{%d}{\\scalebox{%5.3f}",(int)rot,csize);
if(gness < 10.0)
fprintf(out,"{\\Gtext{00%d}{$%c%c$}}}}\n",(int)gness,a[i],a[i+1]);
else if(gness < 100.0)
fprintf(out,"{\\Gtext{0%d}{$%c%c$}}}}\n",(int)gness,a[i],a[i+1]);
else if(i >= LENGTH-6)
fprintf(out,"{\\Gtext{%d}{$…$}}}}\n",(int)gness);
else
fprintf(out,"{\\Gtext{%d}{$%c%c$}}}}\n",(int)gness,a[i],a[i+1]);
csize *= .996;
r -= .6;
gness += 1.0/(float)LENGTH*879.0;
wspace -= .05;
}
/* LaTeXファイルの締め */
fprintf(out, "\\end{picture}\n");
fprintf(out, "\\end{center}\n\\vfill\n\\end{document}");
close(out);
}
さて、実際に組んでみましょう.Linux環境であれば
$ gcc -o rot_str rot_str.c -lm $ ./rot_str string.txt $ platex rotstring
でできます.
その結果がこちらです.まだ各文字の間隔が文字の位置や大きさによって うまく調節できていません.
リンクは御自由に
SUZUKI, Satoshi V. / ssv"atmark"ntt.dis.titech.ac.jp / NITTA Lab / DCISS / IGSSE / Tokyo Tech