29 번째 수정본
(29 번째 수정본부터 29 번째 수정본까지의 변경사항)
(소소한 수정, 다른 사용자에 의한 수정)
(두 수정본의 내용이 동일하거나, 수정본을 비교할 수 없음.)
LaTeX 수식 지원
LaTeX의 수식 기능을 사용하여 수식과 기호를 쉽게 표시하도록 함
-  필수 요구 사항: 많다 -_-;
-  당연히 [LaTeX] 패키지가 설치되어 있어야 한다
 -  당연히 [TeX]도 설치되어 있어야 한다
 -  변환을 위해서 [ImageMagick]의 convert 바이너리가 있어야 한다.
 -  위키에서 실행하는 명령어는 pwd, latex, dvips, convert 이다.
 
 -  선택 요구 사항: 
-  Digest::MD5 펄 모듈이 있으면 좋다. (아래 부작용 참조)
 
 
-  사용법:
-  /Configuration 파일에서
-  $UseLatex = 1 로 세팅한다. (기본값은 0)
 -  $EVN{PATH} 에 다음 네 가지 명령이 있는 경로를 포함해 준다: pwd, latex, dvips, convert
-  예) $ENV{PATH}="/bin:/usr/bin:/usr/texmf/bin";
 
 
 -  $$수식$$ - inline 수식이 된다.
 -  \[수식\] - 별도 라인의 수식이 된다.
 -  위의 수식을 입력하면 wiki.pl은 다음의 동작을 수행한다.
-  수식의 내용을 MD5로 해쉬값을 얻어서 그것을 그림파일의 이름으로 한다. 확장자는 png이다. 이 파일 이름을 "그림파일.png"라고 하자.
 -  이 "그림파일.png"가 $UploadDir(/화일업로드 참조)에 지정된 디렉토리 아래 latex 디렉토리 아래에 존재하면 img 태그를 써서 출력한다.
-  따라서, 하나의 수식은 처음 한 번만 latex 를 통해 변환하고 그 다음부터는 여기에 저장된 그림파일을 바로 보여준다.
 
 -  $DataDir/temp/ 아래에 임시 디렉토리를 만들고, 그 디렉토리에 srender.tex 파일을 저장한다.
-  srender.tex 파일은 $DataDir/latex.template 파일(제일 처음 LaTeX변환을 할 때 자동으로 생성되며, 사용자가 고쳐서 사용할 수 있다)에서, <math>라고 되어 있는 부분을 사용자가 입력한 수식으로 대체한 것이다.
 
 -  저장한 tex 파일에 대해 latex, dvips, convert 명령을 차례로 실행하여 png 파일을 만든다.
 -  만들어진 png 파일을 $UploadDir/latex 라는 디렉토리를 만들어 그 아래 저장한다.
 -  임시 디렉토리를 삭제한다.
 -  원래 수식이 입력된 자리에 img 태그를 써서 $UploadUrl/latex/만든파일.png 를 출력한다.
 
 
 
-  사용예: (GyparkWiki에는 LaTeX이 설치되어 있지 않아 테스트는 불가능하다. 아래의 사용예는 다른 서버에서 생성된 그림을 가져온 것이다. 더 많은 예제는 [여기]에서 볼 것)
 
$$y = x^2 + \frac{2}{3}\cdot x - 1$$이므로 다음 식이 성립한다. \[\displaystyle{\int\frac{e^{3x}}{1+e^{3x}}\,dx}=\displaystyle\frac13\ln(1+e^{3x})+\mathcal C.\] ok?
이므로 다음 
식이 성립한다. 

ok? 
-  부작용: 뭐 딱히 부작용이랄 것은 없어 보이고..
-  Digest::MD5 모듈이 없을 경우는, crypt() 함수를 써서 파일이름을 결정하는데, 이 함수의 특성상 해쉬가 썩 잘 되지 않는다. 그래서 수식의 일부를 변경했는데도 파일의 이름이 달라지지 않아서 기존의 그림파일이 그대로 출력되어 버릴 수 있다.
 
 
config.pl 수정
다음 항목 수정 및 추가
$ENV{PATH}   = "/bin:/usr/bin/";     
$UseLatex    = 1;       
wiki.pl 수정
use vars qw(
    ...
    $UseLatex   # 추가
    );
sub CommonMarkup {
    ...
        s/\&__LT__;code\&__GT__;((.|\n)*?)\&__LT__;\/code\&__GT__;/&StorePre($1, "code")/ige;
        if ($UseLatex) {
            s/\\\[((.|\n)*?)\\\]/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "display"))/ige;
            s/\$\$((.|\n)*?)\$\$/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "inline"))/ige;
        }
    ...
}
다음 함수 통채로 추가
sub UnquoteHtmlForPageContent {
    my ($html) = @_;
    $html =~ s/&__GT__;/>/g;
    $html =~ s/&__LT__;/</g;
    $html =~ s/&__AMP__;/&/g;
    $html =~ s/\\
/\\\\\n/g;
    $html =~ s/\
/\\\n/g;
    return $html;
}
다음 함수 통채로 추가
sub MakeLaTeX {
    my ($latex,  $type) = @_;
    $latex = &UnquoteHtmlForPageContent($latex);
    
    my $hash;
    my $hasMD5 = eval "require Digest::MD5;";
    if ($hasMD5) {
        $hash = Digest::MD5::md5_base64($latex);
    } else {
        $hash = crypt($latex, $HashKey);
    }
    $hash =~ s/(\W)/uc sprintf "_%02x", ord($1)/eg;
    
    my $hashimage = "$hash.png";
    my $imgpath = "";
    my $LatexDir = "$UploadDir/latex";
    my $LatexUrl = "$UploadUrl/latex";
    my $TemplateFile = "$DataDir/latex.template";
    
    &CreateDir($UploadDir);
    &CreateDir($LatexDir);
    if (-f "$LatexDir/$hashimage" && not -z "$LatexDir/$hashimage") {
        
    } else {
        
        my $hashdir = "$TempDir/$hash";
        my $DefaultTemplate = << 'EOT';
\documentclass[12pt]{amsart}
% Your can use the desire symbol packages
% Of course, MikTeX needs to be able to get the
% package that you specify
\usepackage{mathptmx,bm,calrsfs}
% "sboxit" puts two marks on top and bottom of the math
% equation for ImageMagick to cut out the image
\def\sboxit#1{%
\setbox0=\hbox{#1}\hbox{\vbox{\hsize=\wd0\hrule height1pt width2pt%
\hbox{\vrule width0pt\kern0pt\vbox{%
\vspace{1pt}\noindent\unhbox0\vspace{1pt}}%
\kern1pt\vrule width0pt}\hrule height1pt width2pt}}}
\mathchardef\gt="313E % type $a\gt b$ instead of $a > b$
\mathchardef\lt="313C % type $a\lt b$ instead of $a < b$
\pagestyle{empty}
\begin{document}
\thispagestyle{empty}
% the first hbox make the depth of the equation right
\sboxit{\hbox to 0pt{\phantom{g}}<math>}
\end{document}
EOT
        if (not -d $hashdir) {
            mkdir($hashdir,0775) or return "[Unable to create $hash dir]";
        }
        if (not -f $TemplateFile) {
            &WriteStringToFile($TemplateFile, $DefaultTemplate);
        }
        my $template = &ReadFile($TemplateFile);
        $template =~ s/<math>/$latex/ige;
        my $pwd = `pwd`;
        $pwd =~ s/(.*)((\n|\r)*)?/$1/;
        chdir ($hashdir);
        
        open (OUTFILE, ">srender.tex");
        print OUTFILE $template;
        close OUTFILE;
        open SAVEOUT, ">&STDOUT";
        open SAVEERR, ">&STDERR";
        open STDOUT, ">hash.log";
        open STDERR, ">&STDOUT";
        
        qx(latex -interaction=nonstopmode srender.tex);
        qx(dvips srender.dvi);
        qx(convert -transparent "white" -density 100x100 -trim -shave 0x2 srender.ps $hashimage);
        close STDOUT;
        close STDERR;
        open STDOUT, ">&SAVEOUT";
        open STDERR, ">&SAVEERR";
        
        chdir($pwd);
        if (-f "$hashdir/$hashimage" && not -z "$hashdir/$hashimage") {
            my $png = &ReadFile("$hashdir/$hashimage");
            &WriteStringToFile("$LatexDir/$hashimage", $png);
        } else {
            return "[Error retrieving image from $hashdir:$pwd]";
        }
        unlink (glob("$hashdir/*")) or return "[[unlink fail]]";
        rmdir ($hashdir) or return "[[rmdir fail]]";
    }
    
    if ($type eq "inline") {
        $imgpath = "<IMG border=0 vspace=0 hspace=0 align='middle' ".
            "src='$LatexUrl/$hashimage' ".
            "alt=\"\$$latex\$\">";
    } elsif ($type eq "display") {
        $imgpath = "<br>".
            "<IMG border=0 vspace=15 hspace=40 align='middle' ".
            "src='$LatexUrl/$hashimage' ".
            "alt=\"$latex\">".
            "</br>";
    }
    return $imgpath;
}
추가 업데이트 내역
ext1.71 - UnquoteHtmlForPageContent 함수가 고쳐졌습니다. 
ext1.74d - png 파일명을 결정하는 부분 개선. 특수 문자를 삭제하지 않고 아스키코드로 표현하게 함 
ext1.74e - 1.74d 에서, 특수문자를 "%16진수"의 형태로 만들었더니 문제가 있어서, "_16진수"의 형태로 만들도록 함 
관련 링크
이 패치는 다음 세 가지 구현의 코드를 섞어서(-_-;) ext버전에 맞게 수정한 것이다.
사용자 의견
오. 드디어 들어가는 겁니까. 사실 저 같은 계정 사용자는 LaTeX를 실행시킬 수 있을지가 고민입니다. (예전에 해보려다 포기) 
-  저도 마찬가지로, 이 계정에는 tetex부터 설치를 해야 될 판이라... -_-; 이 작업은 제 연구실 서버에 따로 위키 깔아서 하고 있습니다. 제 홈에서는 예제를 보이기 힘들 것 같네요. 
 
[여기]에 현재까지 작업된 결과를 볼 수 있습니다. 
왕입니다요 !!! -- 
Bab2 2005-1-14 6:33 pm 
LaTeX 변환을 위한 문법을 어떻게 해야 될지 고민 중입니다.
1) usemod 구현
$a<b$   - 문장 내에 삽입
$$a<b$$ - 별개의 줄로
    LaTeX과 동일한 방식이라 LaTeX 코드를 그대로 쓸 수 있음.
    그러나 $a<b$ 의 경우 "$"가 다른 의미로 쓰인 곳에서도 LaTeX변환이 이뤄질 경우가 많음 (ex. "$UploadDir, $UploadUrl 을 설정한다"와 같은 경우)
2) oddmuse 구현
$$a<b$$ - 문장 내에 삽입
\[a<b\] - 별개의 줄로
    다른 데서 $$ 나 \[ 를 사용할 일이 거의 없기 때문에 오변환의 가능성이 적지만 LaTeX에서의 문법과 의미가 달라진다.
3) oddmuse 에서 별도 옵션 사용
$a<b$   - 문장 내에 삽입
$$a<b$$ - 별개의 줄로
\[a<b\] - 별개의 줄로
4) moniwiki 구현
$(공백)a<b$(공백) - 문장 내에 삽입
    공백이 반드시 있어야 하기 때문에 1)에서와 같은 오변환의 가능성이 적어짐
저는 지금부터 자잘한 수정에 들어갈테니 이 글 보시면 의견 좀 주세요. (근데 의견달라고 하면 왜 다들 조용히 계시는지? :-) 
$$와 \[ 로 결정 
뭔가 좀 부족한 게 있을 듯 합니다만 일단 여기까지 하고 마칩니다~ 
위키위키분류