6 advi デバしてみた


PIC
____________________________________________________________________

2008 11 LaTeX 使ハンズオンwizzytex-mode から使われている advi がときどきてしまうにつ いて調べてみました

6.1 advi がまる?

advi DVI viewer なのですがなぜか OCaml という言語されています advi からばれる ghostscript ているらしいということまで分かているから調べめま した

6.2 とりあえずアタリをつける

とりあえずきているてきて展開してみます

% apt-get  source advi
...
dpkg-source: extracting advi in advi-1.6.0
dpkg-source: info: unpacking advi_1.6.0.orig.tar.gz
dpkg-source: info: applying advi_1.6.0-13.diff.gz
% cd advi-1.6.0
% ls *.ml
addons.ml     drawimage.ml  font.ml            gs.ml             main.ml     search.ml      transimpl.ml
ageometry.ml  driver.ml     global_options.ml  gterm.ml          misc.ml     shot.ml        ttfont.ml
...

*.ml というのが OCaml スフイルですなんかgs.ml とかいうそのものズバリぽいものがえますgs.ml をまず gs していてみると

...
  let command = Config.gs_path in
  let command_args =
    [|
      command;
      "-dNOPLATFONTS"; "-dNOPAUSE";
      "-sDEVICE=" ^ (if !antialias then x11alpha else x11);
      "-q";
      "-dSAFER";
      "-";
    |] in

  let _ = debugs command;
...

おおそれぽいあとデバぽい- debugs 発見さらにこんどは command 探してい くと

...
  let lpd_in, lpd_out = Unix.pipe () in
...
  let leftout = Unix.out_channel_of_descr lpd_out in
...
  let pid =
    Unix.create_process command command_args lpd_in rpd_out
      (* Unix.stdout *) Unix.stderr
...
    method line l =
      try
        showps l;
        output_string leftout l;
        output_char leftout ’\n’;
...

どうやら gs パイプPS きこんでいるようですshowps とかいうので PS ることができるんじないか とか

6.3 まじめに調べてみたんですが...

もうこんどは gs.ml からデバ能だけていきます

...
let debugs = Misc.debug_endline;;
...
let showps_ref = ref false;;
let showps s =
  if !showps_ref then (print_endline  (Printf.sprintf "%s" s));;
...
Options.add
  "--showps" (Arg.Set showps_ref)
  "  ask advi to print to stdout a copy\
  \n\t of the PostScript program sent to gs.";;
...

Misc.というのは Misc というモジへのですここでは単に misc.ml ればよさそうです showps_ref能なフラグのようですたらすぐコマンドラインからフラグできるように ているようですmisc.ml てみると

...
(* Debugging. *)
let forward_debug_endline =
  ref (function (_ : string) -> failwith "undefined forward debug_endline");;

let debug_endline s = (!forward_debug_endline s : unit);;

let set_forward_debug_endline f = forward_debug_endline := f;;
...

さらにset_forward_debug_endlinegrep するとglobal_options.mlかかるのでそのてみ ると

...
(* To print debugging messages. *)
let debug_endline = Options.debug "--debug" " General debug";;

(* Setting the forward in Misc. *)
Misc.set_forward_debug_endline debug_endline;;
...

結局ちもコマンドラインからできるようですねそくしてみると

% platex debianmeetingresume200812-presentation.tex
...
% advi debianmeetingresume200812-presentation.dvi
...
/usr/bin/gs
-dNOPLATFONTS
-dNOPAUSE
-sDEVICE=x11
-q
-dDELAYSAFER
-
...
%!PS-Adobe-2.0
%%Creator: Active-DVI
%!
[1 0 0 -1 0 0] concat
(/usr/share/texmf-texlive/dvips/base/texc.pro) run
(/usr/share/texmf-texlive/dvips/base/special.pro) run
...
%% Newpage

grestore
0 0 moveto
TeXDict begin 12769384 12769384 div dup /Resolution X /VResolution X end
TeXDict begin /DVImag 194.845342 def end
gsave
flushpage (...
) print flush

たしかに gs コマンドラインらしきものとそれからきこんだ PS らしいものがえてますPS となる文字 される命令flushpage (...) print flushgs きこんでそのているようなのですがてき ていないようです

gs てしまうとそうでないべてみたのですがてしまうPS すのが しくよくわかりませんでした

6.4 ?

なにか方法てしまうのをできないかgs ている部分てみます

...
let rec select fd_in fd_out fd_exn timeout =
  (* dirty hack: Graphics uses itimer internally! *)
  let start = Unix.gettimeofday () in
  try
    Unix.select fd_in fd_out fd_exn timeout
  with
    Unix.Unix_error (Unix.EINTR, _, _) as exn ->
      let now = Unix.gettimeofday () in
      let remaining = start +. timeout -. now in
      if remaining > 0.0 then select fd_in fd_out fd_exn timeout else [], [], []
...
      match select [ rpd_in ] [] [] 1.0 with
      | [], _, _ ->
          begin match Unix.waitpid [ Unix.WNOHANG ] pid with
          | x, Unix.WEXITED y when x > 0 ->
              raise (Killed "gs exited")
          | 0, _ ->
              raise (Killed "gs alive but not responding")
          | _, _ ->
              raise (Killed "gs in strange state")
          end
...

gs select ているようですタイムアウトんであるようですなぜうまくいていないので

ここでは半でされている select ですかくタイムアウトしているのにしているのは もとのですどうりでいつまでたてもタイムアウトしないわけです

...
if remaining > 0.0 then select fd_in fd_out fd_exn timeout else [], [], []
...

これを

...
if remaining > 0.0 then select fd_in fd_out fd_exn remaining else [], [], []
...

直すとgs てもタイムアウトするようになりますgs まるくような的なはできませんで したがとりあえずは advi まらないようにはなりそうです

50 エリア Debian 2009 3
____________________________________________________________________________________________