| -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)> |
| ---- |
| [[위키위키분류]] |