graphicxで「まわす」「のばす」

よくお世話になるLaTeX2eのパッケージとしてEPSの画像を 文書の中に入れたりするのに使うgraphicxがあります. graphicxはほかにも、文字の大きさや形を変えたり、 文字を回転させたりと様々な機能があります.

これに対して、AWKやPerlなどでフィルタをつくっておけば、 picture環境と組み合わせて文字列の組み方向も 自由自在に操作することができるわけです.

ここでは、picture環境、graphicxと Cを連携させて文字を回転させながら組む、ということを試みました.

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

でできます.

その結果がこちらです.まだ各文字の間隔が文字の位置や大きさによって うまく調節できていません.

[回転文字LaTeX組み]

リンクは御自由に

SUZUKI, Satoshi V. / ssv"atmark"ntt.dis.titech.ac.jp / NITTA Lab / DCISS / IGSSE / Tokyo Tech