Friday, September 6, 2013

MathML Word에 붙이기

MathJax èWord

MS Word 2007부터는 MathML을 문서에 바로 붙여넣을 수 있다.

이 블로그의 거의 대부분의 수식은 MathJax로 작성되어 있는데,
오른쪽 버튼 클릭하고 메뉴에서 MathML 또는 TeX 형식으로 export할 수 있다(폰에서는 못 한다는 얘긴가...).

MathML 형식을 선택하면, 코드가 담긴 창이 열린다. 거기서 코드를 전부 복사한다.

  • 코드가 길어서 마우스로는 선택하기 어려울 테니 ctrl-A, ctrl-C 연타를 추천한다.



그리고 Word에 붙여넣기 하면 안 된다(...) [1]

선택하여 붙여넣기(ctrl-alt-v)를 한 후, 서식 없는 텍스트를 고른다.
아니면 한 번 메모장에 붙여넣어서 html 태그를 제거한 후에, MathML 코드만 붙여넣어도 된다.
잘 붙은 모습[2]

Word èMathJax 

이제 반대로, Word 수식을 MathML 코드로 변환해 보자. 그냥 복사, 붙여넣기를 하면 코드가 아니라 눈으로 읽을 수 있는 것만 텍스트로 저장된다. 예를 들어 \(sin^2x\)는 sin2x로 나타나는 식이다(...)
이는 기본값이 "1차원 형식을 일반 텍스트로 클립보드에 복사"이기 때문이다. 수식 도구에서 저 작은 버튼을 눌러서 옵션을 변경해 주어야 한다.
MathML을 클립보드에 복사하는 것이 우리의 목표이므로
"MathML을 일반 텍스트로 클립보드에 복사"에 체크하고 확인한다.
그 결과는 다음과 같이 엄청나게 긴 코드이다(...)

MathJax도 MathML을 지원하긴 하지만 MathML 코드를 블로그에 붙이기에는 xml 형식의 MathML은 가독성도 떨어지고 손으로 쓰는 게 사실상 불가능하다. 그나마 TeX이니까 느릿느릿 손으로 쓰는 게 가능하지...
이런 제품이 있다: http://www.grindeq.com/


MathML 코드를 붙여넣은 모습[3]:

cos3x=cos(2x+x)=cos2xcosx-sin2xsinx=(2cos2x-1)cosx-2sin2xcosx=2cos3x-cosx-2cosx+2cos3x=4cos3x-3cosx(16)

으아니 이거 왜 정렬이 또 가운데로 되는 거야...
워드에 붙였을 때랑 같은 이유겠지 뭐.
그렇다면 MathML을 TeX으로 변환해주는 사이트를 이용한다:
http://www.orcca.on.ca/MathML/texmml/mmltotex.html (근데 안 된다)








[1] 아니 왜! 분명히 Word 2007에서 MathML 지원한댔는데! Google에서 word 2007 mathML 검색해봤자 그냥 붙여넣으면 된다는 말밖에 없고, 반대로 Word 수식을 MathML로 변환하는 것에 관한 문서만 주르륵 나온다.
이유는 뭐 당연히...MathJax에서 생성해 준 MathML 코드 페이지가 plain text가 아니고 html이기 때문.

[2] 사실 위 식 같이 \begin{equation}\begin{split} \\으로 행을 나누고 정렬한 식은 붙여넣은 직후에는 Word에서 정렬이 흐트러져서 나온다.
이렇게-_-
수식에 오른쪽 버튼을 눌러 컨텍스트메뉴에서 열맞춤을 왼쪽으로 변경해 줘야 한다.

* 이건 수식 전체의 [양쪽맞춤]과는 다르다. 양쪽맞춤은 왼쪽 버튼을 눌렀을 때 나오는 메뉴에 있다.

[3] 이게 제대로 보이기 위해서는 구글 Blogger 템플릿 코드를 수정해야 한다.
<html xmlns:mml="http://www.w3.org/1998/Math/MathML">
이 코드를 삽입해야 하는데, 아마도 <html 태그는 이미 존재할 테니
<html xmlns:abcdefg="xyzwo" xmlns:kmlqpr="12345">
여기에 '추가'를 해야 한다. 즉
<html xmlns:abcdefg="xyzwo" xmlns:kmlqpr="12345" xmlns:mml="http://www.w3.org/1998/Math/MathML">
이런 식이 될 것이다.

No comments:

Post a Comment

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...