最終更新:2015-04-06 (月) 14:04:50 (1168d)

ctan-get

ctan-get 開発情報

プラットフォームに依存しないこと

可能な限りプラットフォームに依存しないように構成するか, または依存する場合はプラットフォーム固有の記述をインタフェースに より吸収するという方針でいきたいと思います.

kpathsea

kpathsea ライブラリを使うと TeX ファイル検索は非常に やりやすいと思いますが,そうすると言語が C に束縛されて…

TeX Live or W32TeX を使っている事が前提になるかもしれませんが, kpsetool に頼るというのが妥当な所でしょうか.

  • kpsetool: kpsetool は shell スクリプトです.
    • kpsetool: kpsewhich
    • kpsexpand: kpsewhich -expand-var="$1"
    • kpsepath: kpsewhich -show-path="$format"
  • kpsewhich: これだけあれば大丈夫 kpsetool はあるかどうかも分からないので,kpsewhich を直接使うように すれば OK なはず.

perl から TEXMFMAIN や TEXMF を知るためには kpsewhich を使う.

#!/usr/bin/perl -w

# kpathsea command
$kpscmd   = 'kpsewhich';

print &get_filepath("texmf.cnf") . "\n";
print &get_filepath("ls-R") . "\n";
print &get_varpath("TEXMF") . "\n";
print &get_varpath("TEXMFMAIN") . "\n";
print &get_filepath("article.cls") . "\n";
print &get_format("jsarticle.cls") . "\n";
print &get_filepath("jsarticle.cls") . "\n";
print &get_filepath("hirakaku-w3-h.ofm") . "\n";
print &get_filepath("jplain.bst") . "\n";

sub get_filepath(){
    $param = $_[0];
    $type = &get_format($param);
    $val = `$kpscmd $type $param`;
    chomp ($val);
    return $val;
}

sub get_varpath(){
    $val = `$kpscmd -expand-path='\$$_[0]'`;
    chomp ($val);
    return $val;
}

sub get_format(){
    $_ = $_[0];
    return " --progname='uplatex' "   if(m/\.(tex|dtx|cls|sty)$/i) ;
    return " --progname='upbibtex' "  if(m/\.(bib|bst)$/i) ;
    return " --progname='upmendex' "   if(m/\.(idx|ind|glo|gls)$/i);
    return " --progname='dvipdfmx' " if(m/\.(ttf|ttc|otf)$/i) ;
    return "";
}

debian ubuntu には libkpathsea-perl というパッケージがあって, これが kpathsea のラッパーライブラリとして提供されているようです.