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진수"의 형태로 만들도록 함
ext2.10 - 서버에 설치하기 힘든 경우 /LaTeX플러그인을 사용할 수 있게 함
관련 링크
이 패치는 다음 세 가지 구현의 코드를 섞어서(-_-;) 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)에서와 같은 오변환의 가능성이 적어짐
저는 지금부터 자잘한 수정에 들어갈테니 이 글 보시면 의견 좀 주세요. (근데 의견달라고 하면 왜 다들 조용히 계시는지? :-)
$$와 \[ 로 결정
뭔가 좀 부족한 게 있을 듯 합니다만 일단 여기까지 하고 마칩니다~
위키위키분류