2010/07/02

SLaTeXを使う。Gaucheで。

SLaTeXをGaucheで使いたい。

SLaTeXは、Schemeのコードを装飾するためのtex->texコンバータ。\scheme|...|とか\begin{schemedisplay}...\end{schemedisplay}といった感じでSchemeのコードを(La)TeXの原稿中に書いておくと、その各部分に装飾を施した一時的なtexファイルをSchemeスクリプトで大量に生成してくれる。それをTeXの処理系に渡すところまでやってくれるslatexというシェルスクリプトがついているので、latex foo.texのかわりにslatex foo.texとすればよい。

よいのだけど、実際に使うとなんとなく微妙。一時ファイルが大量にできるのは気持ちが悪いし、添付のスタイルが(少なくとも日本語環境では)あんまりうまくない。プリティプリンタというわけでもなさそうで、インデントの面倒も見てくれない。

あと、現時点ではそのままGaucheで使えない。とりあえず使えるように、次のようなパッチをあてた。これでgosh /(path to scmxlate)/scmxlate.scmのようにすると、Gauche用のslatex.scmと、platexを使うシェルスクリプトができる。
diff -rupN slatex/dialects/dialects-supported.scm myslatex/dialects/dialects-supported.scm
--- slatex/dialects/dialects-supported.scm 2002-11-24 05:06:34.000000000 +0900
+++ myslatex/dialects/dialects-supported.scm 2010-07-02 16:31:41.000000000 +0900
@@ -1,6 +1,7 @@
bigloo
chez
gambit
+gauche
guile
mitscheme
mzscheme
diff -rupN slatex/dialects/gauche-slatex-src.scm myslatex/dialects/gauche-slatex-src.scm
--- slatex/dialects/gauche-slatex-src.scm 1970-01-01 09:00:00.000000000 +0900
+++ myslatex/dialects/gauche-slatex-src.scm 2010-07-02 18:08:41.000000000 +0900
@@ -0,0 +1,12 @@
+(define getenv sys-getenv)
+
+(define *scheme-version*
+ (string-append "Gauche " (gauche-version)))
+
+(define void
+ (lambda ()
+ (if #f #f)))
+
+(scmxlate-postprocess
+ (define *scheme-command-name* "gosh")
+ (load "./dialects/make-echo-script.scm"))
diff -rupN slatex/dialects/make-echo-script.scm myslatex/dialects/make-echo-script.scm
--- slatex/dialects/make-echo-script.scm 2002-03-25 01:26:22.000000000 +0900
+++ myslatex/dialects/make-echo-script.scm 2010-07-02 17:13:53.000000000 +0900
@@ -3,12 +3,16 @@
(rename-file "my-slatex-src.scm" "slatex.scm")
(delete-file "slatex")
(delete-file "callsla.scm"))
+ ((gauche)
+ (sys-rename "my-slatex-src.scm" "slatex.scm")
+ (if (file-exists? "slatex") (sys-remove "slatex"))
+ (if (file-exists? "callsla.scm") (sys-remove "callsla.scm")))
(else
(system "mv my-slatex-src.scm slatex.scm")
(system "rm -f slatex callsla.scm")))


-(load "dialects/make-callsla.scm")
+(load "./dialects/make-callsla.scm")

(call-with-output-file "slatex"
(lambda (o)
@@ -18,11 +22,7 @@
(display ")" o) (newline o)
(display ";check pathname above is correct for you" o)
(newline o)
- (display "(slatex" o)
- (display (if (eqv? *dialect* 'bigloo)
- "$$"
- "::") o)
- (display "process-main-tex-file \"'$1'\")" o)
+ (display "(process-main-tex-file \"'$1'\")" o)
(if (eqv? *dialect* 'scsh)
(begin
(newline o)
@@ -32,10 +32,11 @@
(newline o)
(display "if test -f pltexchk.jnk" o) (newline o)
(display "then tex $1; rm pltexchk.jnk" o) (newline o)
- (display "else latex $1" o) (newline o)
+ (display "else platex $1" o) (newline o)
(display "fi" o) (newline o)))

(case *dialect*
((scsh) (run (chmod "+x" slatex)))
+ ((gauche) (sys-chmod "slatex" 484))
(else (system "chmod +x slatex")))

diff -rupN slatex/scmxlate-slatex-src.scm myslatex/scmxlate-slatex-src.scm
--- slatex/scmxlate-slatex-src.scm 2009-09-29 08:28:56.000000000 +0900
+++ myslatex/scmxlate-slatex-src.scm 2010-07-02 17:07:17.000000000 +0900
@@ -16,10 +16,10 @@

(scmxlate-eval
;on denali
- ;(define *target-file* "/home/dorai/.www/slatex/slatex.scm")
+ (define *target-file* "/home/kshikano/src/slatex/slatex.scm")

;on mac
- (define *target-file* "/Users/doraisitaram/public_html/slatex/slatex.scm")
+ ;(define *target-file* "/Users/doraisitaram/public_html/slatex/slatex.scm")
)

;You may define slatex::*texinputs* here. Eg,
@@ -30,7 +30,7 @@
;(define slatex::*texinputs*
;"/home/dorai/tex:/usr/local/lib/tex/macros") ;in Unix

-;(define slatex::*texinputs* (getenv "TEXINPUTS"))
+(define slatex::*texinputs* (sys-getenv "TEXINPUTS"))

;Unfortunately, that last one is not really as convenient as
;it seems, even if your Scheme has a getenv procedure.