Q&A 마당은 텍 관련 질문/답변을 위해 만들었습니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- 질문 전에 아래를 읽어 보세요. 좋은 질문이 좋은 답을 받을 수 있는 좋은 방법입니다.
- 질문에 맞는 제목을 붙이세요. 질문의 내용과 관련없는 "고수님", "긴급질문", "도와주세요"와 같은 제목은 답이 잘 올라오지 않습니다. 이 게시판에 올라오는 모든 글은 질문입니다. 굳이 [질문], [Q]를 적으실 필요도 없습니다.
- 내용을 충실히 적어 주시고, 같은 상황을 재현할 수 있는 최소한의 예제가 같이 있어야 합니다.
- 최소 예제는 "Minimal working example"을 읽어 보세요.
- 파일을 첨부하실 때에는 가능한 압축하여 파일 크기를 줄여서 올려주시길 바랍니다.
- 개인적으로 사용하신 글꼴이 들어 있는 경우, preparefont.sty에 관한 답변을 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 사용하는 편집기는 CKeditor입니다.
- 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한 줄을 비웁니다.
- 글줄만 바꾸려면 [shift-enter]를 누르면 <BR> 태그가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
- 수식를 문서내에 삽입하시려면 에디터를 툴바에서 [소스]를 눌러 HTML로 입력할 수 있게 바꾸신 후 <pre> </pre> tag를 사용하셔서 <pre> 여러 줄의 수식 </pre>처럼 입력하시면 좋습니다.
lualatex 에서 luamplib를 이용한 그림그리기 질문
2013.12.08 19:18
안녕하세요?
질문하나 하려구요~
lualatex 에서 luamplib를 이용한 그림그리기를 다음과 같이 적용을 했습니다.
\documentclass{article}
\usepackage{luamplib}
\begin{document}
%
\begin{figure}[ ]
\begin{center}
\begin{mplibcode}
beginfig(2);
numeric u; u=1cm;
numeric t;
z[1]=origin;
z[2]=(3u,0);
for i = 1 upto 3:
draw z[1]..(1.5u, i*u)..z[2];
label . top(btex $e_1$ etex, (1.5u, i*u));
endfor;
endfig;
\end{mplibcode}
\caption{Figure Test}
\end{center}
\end{figure}
%
\end{document}
일단 에러없이 그림은 나오는데 지금 다음과 같은 문제점을 어떻게 해결해야할지 모르겠어서요~
1. \begin{center}를 했음에도 그림은 중앙에 오지 않는 문제
2. for i = 1 upto 3; 에서 변은 세 개가 그려지는데 라벨은 한 번만 적용되는 문제
3. 문제는 아니지만 라벨에도 변수를 적용해서 e_1, e_2, e_3처럼 쓸 수 있는 방법
알고 계신 분 계시면 답변 부탁드립니다~ -.-
댓글 12
-
정달영
2013.12.08 20:02
-
DohyunKim
2013.12.09 02:33
- 현재 버전의 mplibcode 환경은 수직(vertical) 모드에서 수평(horizontal) 모드로 진입하지 않습니다. 중앙 정렬은 수평 모드에서만 의미가 있습니다. 따라서 \begin{center} 뒤에 \leavevmode 를 추가해서 수평 모드로 전환하면 원하는 결과를 얻을 수 있습니다. mplibcode 시작시 항상 \leavevmode가 실행되게 만들 수도 있지만 원저자(한스 하겐)의 코드에 없었으므로 최소변경의 원칙에 따라 그냥 두었습니다.
- for ... endfor 루프 안에 btex ... etex 코드가 들어갈 것을 미처 예상하지 못했습니다. 버그를 찾아셨습니다. 해결책은 luamplib.sty 파일 43번째 줄 mplibputtextbox 매크로에서 \box를 \copy로 바꾸는 것입니다. 조만간에 CTAN에 새로 릴리스해야겠군요.
- \def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\box#1\hss}}}
+ \def\mplibputtextbox#1{\vbox to 0pt{\vss\hbox to 0pt{\raise\dp#1\copy#1\hss}}} - 원래의 metapost에서 라벨에 변수를 적용하는 것이 가능하다면 심각하게 고민해 보겠습니다. metapost에 문외한인 제 입장에서는 사실 엄두조차 나지 않습니다. 도움 주실 분을 찾습니다.
- 현재 버전의 mplibcode 환경은 수직(vertical) 모드에서 수평(horizontal) 모드로 진입하지 않습니다. 중앙 정렬은 수평 모드에서만 의미가 있습니다. 따라서 \begin{center} 뒤에 \leavevmode 를 추가해서 수평 모드로 전환하면 원하는 결과를 얻을 수 있습니다. mplibcode 시작시 항상 \leavevmode가 실행되게 만들 수도 있지만 원저자(한스 하겐)의 코드에 없었으므로 최소변경의 원칙에 따라 그냥 두었습니다.
-
작은나무
2013.12.09 08:17
mpman 64쪽에 라벨에 변수를 적용하는 방법이 설명되어 있습니다.
예를들어 위의 코드는 아래와 같은 방법(test.mp)으로 가능합니다.
하지만 아래의 코드를 처음 두 줄 제외하고, input TEX; 부터
mplibcode 환경에 넣으니 에러가 발생합니다.
% test.mp
prologues := 3;
outputtemplate := "%j-%c.eps";
input TEX;
beginfig(2);
numeric u; u=1cm;
z[1]=origin;
z[2]=(3u,0);
for i = 1 upto 3:
draw z[1]..(1.5u, i*u)..z[2];
label.top(TEX("$e_{" & decimal(i) & "}$"), (1.5u, i*u));
endfor;
endfig;
end
-
DohyunKim
2013.12.09 09:23
그렇군요.
현재 솔루션은 mplib이 실행되기 이전에 btex 과 etex 사이 것을 박스로 만들어 기억하고 있다가 mplib 수행이 끝나면 적절한 위치에 그 박스들을 배치하는 방식입니다.
이제 이런 방식이 참으로 아마추어적이란 사실이 드러났습니다.
제대로 된 해법은 mplib 수행 도중에 btex...etex 을 만나면 이를 텍에게 의뢰해서 박스를 생성하도록 하는 건데요.
어찌 하면 좋을 지...
-
helper0608
2013.12.09 17:38
답변 감사드립니다~^^
-
DohyunKim
2013.12.10 02:11
https://raw.github.com/dohyunkim/luamplib/master/luamplib.dtx
이 파일을 받아서 tex luamplib.dtx를 실행하면 luamplib.sty와 luamplib.lua 파일이 생성됩니다.
이 두 파일을 작업디렉토리에 두면 textext(...) 혹은 TEX(...) 이 에러 없이 작동합니다.
다만 input TEX은 하지 마세요. TEX.mp에 적혀있는 btex이란 토큰을 읽는 순간 mplib은 에러를 내고 종료합니다.
별 문제가 없다면 열흘 정도 지나 ctan에 업로드하겠습니다.
-
작은나무
2013.12.10 07:49
에러없이 잘 동작하는 것을 확인하였습니다.
\documentclass{article}
\usepackage{luamplib}
\begin{document}
\begin{figure}[ ]
\begin{center}
\leavevmode
\begin{mplibcode}
beginfig(2);
numeric u; u=1cm;
z[1]=origin;
z[2]=(3u,0);
for i = 1 upto 3:
draw z[1]..(1.5u, i*u)..z[2];
label.top(TEX("$e_{" & decimal(i) & "}$"), (1.5u, i*u));
endfor;
endfig;
\end{mplibcode}
\caption{Figure Test}
\end{center}
\end{figure}
\end{document}
-
정달영
2013.12.10 13:07
김교수님 말씀대로 새로 파일을 생성해서 사용하니 잘 되네요.
수학하는 사람들에게는 수식이 신경 쓰이는 부분인데 이제 그림그릴 때도 loop를 이용해서 라벨까지 쓸 수 있으니 많이 편해질 것 같습니다.
이렇게 빠른 시간안에 해결해주시다니 저는 그저 감탄사만...
차가운 날씨에 건강하시기를 바랍니다.
-
helper0608
2013.12.10 13:22
이렇게 빨리 해결해 주셔서 감사합니다.
논문 쓰는데 많은 도움이 되겠습니다.
감사합니다~
-
작나
2013.12.12 10:07
매우 사소한 것인데요.
매뉴얼을 만들기 위한, luamplib.dtx 파일의 18번째 줄
pdflatex luamplib.dtx
에서 pdflatex을 xelatex 이나 lualatex으로 고쳐야 할것 같습니다. :-)
-
Progress
2013.12.12 12:36
얼마 전에 해봤는데
xelatex이나 lualatex으로 컴파일할 경우 Liberation Mono 폰트가 필요합니다.
-
DohyunKim
2013.12.12 13:17
* lualatex luamplib.dtx 로 고치겠습니다.
* 리베라시옹 글꼴은 굳이 따로 받지 않더라도 리눅스라면 이미 패키징돼 있을 테고,
다른 플랫폼이라도 LibreOffice를 설치하면 그 안에 들어있습니다.
개인적으로는 LibreOffice 것을 링크해서 사용하고 있습니다.
2, 3과 관련해서
ConTeXt에서는
for 루프안에서 라벨을 쓰는 것도 문제가 없었고
label.lft(textext("$e_{" & decimal (i) & "}$"),(0, width));
와 같은 방법으로 변수를 표현할 수 있었는데 여기서는 다음과 같은 에러가 나며 잘안되네요.
! Missing argument to textext.
(luamplib) <to be read again>
(luamplib) ,
(luamplib) <for(1)> ...textext("$e_{"&decimal((EXPR0))&"}$")
다른 조치가 필요한 것 같은데 잘몰라서...