-1,33 +1,276 |
== LaTeX 수식 지원 == |
<color(red,현재 작업중...)> |
LaTeX의 수식 기능을 사용하여 수식과 기호를 쉽게 표시하도록 함 |
|
* 필수 요구 사항: |
* 선택 요구 사항: |
* 필수 요구 사항: 많다 -_-; |
** 당연히 [http://www.latex-project.org LaTeX] 패키지가 설치되어 있어야 한다 |
** 당연히 [http://www.tug.org/teTeX/ TeX]도 설치되어 있어야 한다 |
** 변환을 위해서 [http://www.imagemagick.org/ 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"; |
** <nowiki>$$수식$$</nowiki> - inline 수식이 된다. |
** <nowiki>\[수식\]</nowiki> - 별도 라인의 수식이 된다. |
** 위의 수식을 입력하면 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 파일을 <nowiki>$UploadDir/latex</nowiki> 라는 디렉토리를 만들어 그 아래 저장한다. |
*** 임시 디렉토리를 삭제한다. |
*** 원래 수식이 입력된 자리에 img 태그를 써서 $UploadUrl/latex/만든파일.png 를 출력한다. |
|
* 사용예: (GyparkWiki에는 LaTeX이 설치되어 있지 않아 테스트는 불가능하다. 아래의 사용예는 다른 서버에서 생성된 그림을 가져온 것이다. 더 많은 예제는 [http://ssrnet.snu.ac.kr/~gypark/cgi-bin/testwiki/wiki.pl?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? |
}}} |
** 아래와 같이 보인다. |
<html> |
<IMG alt="$$y = x^2 + \frac{2}{3}\cdot x - 1$$" hspace=0 |
src="http:/pub/gyparkwiki/upload/O3lhWXZhYIzCyTmstOXXA.png" align=middle border=0>이므로 다음 |
식이 성립한다. <BR><IMG |
alt="$\displaystyle{\int\frac{e^{3x}}{1+e^{3x}}\,dx}=\displaystyle\frac13\ln(1+e^{3x})+\mathcal C.$" |
hspace=40 src="http:/pub/gyparkwiki/upload/1EnCERhqRLlis6d6SBerw.png" align=middle |
vspace=15 border=0><BR>ok? |
</html> |
|
* 부작용: 뭐 딱히 부작용이랄 것은 없어 보이고.. |
** Digest::MD5 모듈이 없을 경우는, crypt() 함수를 써서 파일이름을 결정하는데, 이 함수의 특성상 해쉬가 썩 잘 되지 않는다<footnote([[주인장]]이 정확히 아는 것은 아니고 테스트해보니 그랬다)>. 그래서 수식의 일부를 변경했는데도 파일의 이름이 달라지지 않아서 기존의 그림파일이 그대로 출력되어 버릴 수 있다. |
|
=== config.pl 수정 === |
다음 항목 수정 및 추가 |
{{{#!vim perl |
$ENV{PATH} = "/bin:/usr/bin/"; # 기존의 값 뒤에 콜론(:)을 써서 각 프로그램들이 있는 경로를 붙여적는다. |
### LaTeX 변환 지원 |
$UseLatex = 1; # 1 = Use LaTeX conversion 2 = Don't convert |
}}} |
|
=== wiki.pl 수정 === |
수정 내용 |
{{{#!vim perl |
### 패치를 위해 추가된 환경설정 변수 |
use vars qw( |
... |
$UseLatex # 추가 |
); |
### |
}}} |
|
{{{#!vim perl |
sub CommonMarkup { |
... |
s/\&__LT__;code\&__GT__;((.|\n)*?)\&__LT__;\/code\&__GT__;/&StorePre($1, "code")/ige; |
|
############### |
### added by gypark |
### LaTeX 지원 - 이 단락 추가 |
if ($UseLatex) { |
# s/\$\$((.|\n)*?)\$\$/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "display"))/ige; |
# s/\$((.|\n)*?)\$/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "inline"))/ige; |
s/\\\[((.|\n)*?)\\\]/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "display"))/ige; |
s/\$\$((.|\n)*?)\$\$/&StoreRaw(&MakeLaTeX("\$"."$1"."\$", "inline"))/ige; |
} |
### |
############### |
... |
} |
}}} |
|
다음 함수 통채로 추가 |
{{{#!vim perl |
sub UnquoteHtmlForPageContent { |
my ($html) = @_; |
$html =~ s/&__GT__;/>/g; |
$html =~ s/&__LT__;/</g; |
$html =~ s/&__AMP__;/&/g; |
$html =~ s/&__DOUBLEBACKSLASH__;/\\\\\n/g; |
$html =~ s/&__SINGLEBACKSLASH__;/\\\n/g; |
return $html; |
} |
}}} |
|
다음 함수 통채로 추가 |
{{{#!vim perl |
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); |
|
# 원본 tex 생성 |
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"; |
|
# upload 경로 그림 옮김 |
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]]"; |
} |
|
# IMG 태그 출력 |
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 함수가 고쳐졌습니다. <mysign([[Raymundo]],2005-1-23 11:41 pm)> |
|
ext1.74d - png 파일명을 결정하는 부분 개선. 특수 문자를 삭제하지 않고 아스키코드로 표현하게 함 <mysign([[Raymundo]],2005-2-12 2:55 pm)> |
|
ext1.74e - 1.74d 에서, 특수문자를 "%16진수"의 형태로 만들었더니 문제가 있어서, "_16진수"의 형태로 만들도록 함 <mysign([[Raymundo]],2005-2-14 11:10 am)> |
|
ext2.10 - 서버에 설치하기 힘든 경우 [[/LaTeX플러그인]]을 사용할 수 있게 함<mysign([[Raymundo]],2012-2-3 12:31 am)> |
=== 관련 링크 === |
* UseMod:LatexPatch - 출력이 영 예쁘지 않다. |
* http://moonstone.math.ncku.edu.tw/cgi-bin/um.pl?LaTeXPatch 와 http://moonstone.math.ncku.edu.tw/cgi-bin/um.pl?LaTeXExamples - 이게 더 나은 듯... 이걸 수정하기로 결정 |
이 패치는 다음 세 가지 구현의 코드를 섞어서(-_-;) ext버전에 맞게 수정한 것이다. |
* UseMod:LatexPatch - UseModWiki 홈피에 누군가 올린 패치 |
* http://moonstone.math.ncku.edu.tw/cgi-bin/um.pl?LaTeXPatch - 윈도XP를 서버로 쓰는 사람이 자신의 환경에 맞춰 작성한 패치 |
* http://www.oddmuse.org/cgi-bin/oddmuse/LaTeX_Extension - OddMuse의 구현. 제일 훌륭해 보이지만 ext버전에 적용하기가 너무 힘들다... 해 보았으나 실패. |
사실 앞의 두 가지의 출력의 차이는 단지 컨버팅 프로그램의 옵션이나 템플릿 파일의 질에 따라 달라지는 게 아닌가 싶긴 한데... |
|
=== 사용자 의견 === |
|
오. 드디어 들어가는 겁니까. 사실 저 같은 계정 사용자는 LaTeX를 실행시킬 수 있을지가 고민입니다. (예전에 해보려다 포기) <mysign([[조프]],2005-1-14 10:32 am)> |
|
: 저도 마찬가지로, 이 계정에는 tetex부터 설치를 해야 될 판이라... -_-; 이 작업은 제 연구실 서버에 따로 위키 깔아서 하고 있습니다. 제 홈에서는 예제를 보이기 힘들 것 같네요. <mysign([[Raymundo]],2005-1-14 10:35 am)> |
|
[http://ssrnet.snu.ac.kr/~gypark/cgi-bin/testwiki/wiki.pl?HomePage 여기]에 현재까지 작업된 결과를 볼 수 있습니다. <mysign([[Raymundo]],2005-1-14 6:16 pm)> |
[http://ssrnet.snu.ac.kr/~gypark/cgi-bin/testwiki/wiki.pl?LaTex 여기]에 현재까지 작업된 결과를 볼 수 있습니다. <mysign([[Raymundo]],2005-1-14 6:16 pm)> |
|
왕입니다요 !!! <mysign([[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)에서와 같은 오변환의 가능성이 적어짐 |
}}} |
저는 지금부터 자잘한 수정에 들어갈테니 이 글 보시면 의견 좀 주세요. (근데 의견달라고 하면 왜 다들 조용히 계시는지? :-) <mysign([[Raymundo]],2005-1-14 8:04 pm)> |
|
|
$$와 \[ 로 결정 <mysign([[Raymundo]],2005-1-15 12:35 am)> |
|
뭔가 좀 부족한 게 있을 듯 합니다만 일단 여기까지 하고 마칩니다~ <mysign([[Raymundo]],2005-1-15 1:21 am)> |
<longcomments(UseModWiki소스수정/LaTeX,100)> |
---- |
[[위키위키분류]] |