<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-25910901</id><updated>2015-06-12T04:35:46.493+09:00</updated><category term="LaTeX Tips"/><category term="TeX"/><category term="multimarkdown"/><category term="LaTeX"/><category term="Scrivener"/><category term="expl3"/><category term="LyX"/><category term="ko.TeX"/><category term="arara"/><category term="mmd"/><category term="LaTeX3"/><category term="Mac OS X"/><category term="Editor"/><category term="TeXLive"/><category term="MiKTeX"/><category term="LaTeX Packages"/><category term="Lilypond"/><category term="MiKTeX 2.9"/><category term="TeXshop"/><category term="KoreanUCS"/><category term="csv"/><category term="악보"/><category term="KTUG"/><category term="R"/><category term="Sweave"/><category term="TeXWorks"/><category term="WinEdt"/><category term="tail recursion"/><category term="tnxtex"/><category term="번역"/><category term="Excel"/><category term="LaTeXTips"/><category term="LyX 2.0"/><category term="TeX Live"/><category term="Yosemite"/><category term="koTeXLive"/><category term="sumatrapdf"/><category term="설치"/><category term="악보 조판"/><category term="조판"/><category term="10.10"/><category term="KC2008Plus"/><category term="Lilypond-book"/><category term="Linux Mint"/><category term="MacTeX"/><category term="Marked app"/><category term="TeX Implementation"/><category term="TeX Live 2010"/><category term="TeXmaker"/><category term="TeXnicCenter"/><category term="Textmate"/><category term="W32TeXplus"/><category term="XeTeX"/><category term="araraconfig"/><category term="beamer"/><category term="csvsimple"/><category term="ePub"/><category term="euc-kr"/><category term="factorial"/><category term="gmp"/><category term="iPhone"/><category term="installer"/><category term="knitr"/><category term="latex4wp"/><category term="minted"/><category term="mmd-korean"/><category term="oblivoir"/><category term="svn"/><category term="svn local repository"/><category term="svn without svnserver"/><category term="texfot"/><category term="text reflow"/><category term="tnxtex for mac"/><category term="verbatim"/><category term="wine"/><category term="xetexko"/><category term="패키지 소개"/><category term="Archive Utility"/><category term="Calibre"/><category term="Configuration"/><category term="Cygwin"/><category term="Debian"/><category term="EmEditor"/><category term="Excel2LaTeX"/><category term="HLaTeX"/><category term="HTEX"/><category term="ImageMagick convert"/><category term="JavaScript"/><category term="KC2006"/><category term="KC2007"/><category term="KC2008"/><category term="Keyboard Shortcut"/><category term="LaTeXTip"/><category term="LilypondTool"/><category term="Mac"/><category term="Mac Tip"/><category term="MetaPost"/><category term="Noto Sans Pan CJK"/><category term="OFL"/><category term="Open Street Map"/><category term="OzTeX"/><category term="Platypus"/><category term="Progress"/><category term="QR Code"/><category term="Sigil"/><category term="Source Han Sans"/><category term="TLcontrib"/><category term="Tabular"/><category term="TeX Live Utility"/><category term="TeX Programming"/><category term="TeX 소스"/><category term="TeX2ePub"/><category term="TeXLive2009"/><category term="TeXLive2014"/><category term="TeXnicle"/><category term="Texts app"/><category term="TikZ"/><category term="W32TeX"/><category term="XPM"/><category term="XSLT style sheet"/><category term="XeLaTeX"/><category term="arara rules"/><category term="asymptote"/><category term="bugfix"/><category term="changePitch"/><category term="clist"/><category term="command line image processiong tool"/><category term="cp949"/><category term="datatool"/><category term="dokenzy"/><category term="e-book"/><category term="example"/><category term="frescobaldi"/><category term="gnuplot"/><category term="gnuplottex"/><category term="greek"/><category term="hangul"/><category term="hanjacnt"/><category term="hanoi tower"/><category term="hebrew"/><category term="hvindex"/><category term="in-line math"/><category term="index"/><category term="inverse search"/><category term="jEdit"/><category term="kcmenu"/><category term="komkindex"/><category term="kotex"/><category term="kotex-euc"/><category term="kotexindy"/><category term="l3bigint"/><category term="l3expl"/><category term="latexlab"/><category term="lilybin"/><category term="longtable"/><category term="manual"/><category term="markdown"/><category term="metapost. latex"/><category term="metatex"/><category term="mmd2latex"/><category term="mmd2tex-xslt"/><category term="monitoring file change"/><category term="music engraving"/><category term="music notation"/><category term="notepad++"/><category term="online tex"/><category term="opentype"/><category term="pageref"/><category term="pdf preview"/><category term="pdfLaTeX"/><category term="pstricks"/><category term="random number"/><category term="realscripts"/><category term="refcount"/><category term="sagemath cloud"/><category term="sgame"/><category term="shell script"/><category term="sips"/><category term="sort"/><category term="sorted list"/><category term="sorting"/><category term="sqlite"/><category term="strauss"/><category term="subscript"/><category term="superscript"/><category term="svnX"/><category term="tabu"/><category term="tagged pdf"/><category term="template"/><category term="tex sample"/><category term="theorem"/><category term="thmtools"/><category term="tlmgr"/><category term="tlmgr usermode"/><category term="tnxtexdoc"/><category term="type 1"/><category term="ubuntu"/><category term="unicode"/><category term="verse environment"/><category term="version"/><category term="web"/><category term="weblily"/><category term="wiegenlied"/><category term="windows"/><category term="wpkor"/><category term="xlsx2csv"/><category term="yahTeX"/><category term="구름입력기"/><category term="기타"/><category term="기호"/><category term="나눔글꼴"/><category term="난수"/><category term="농담"/><category term="라이센스"/><category term="매뉴얼"/><category term="문서"/><category term="문장부호"/><category term="문체부 폰트"/><category term="물결표"/><category term="반복문"/><category term="본고딕"/><category term="부수"/><category term="샘플문서"/><category term="서영이네"/><category term="설정"/><category term="소감"/><category term="소개"/><category term="에디터"/><category term="연분수"/><category term="옛말의문법"/><category term="옛한글"/><category term="유니코드"/><category term="일괄 설치"/><category term="입력기"/><category term="자작패키지"/><category term="작업환경"/><category term="지도"/><category term="지읍시다 폰트"/><category term="지저탐험"/><category term="커서 이동"/><category term="테스트"/><category term="텍"/><category term="틸데"/><category term="패키지"/><category term="편집기"/><category term="피보나치"/><category term="한글 TeX"/><category term="한글 인코딩"/><category term="한글화"/><category term="한자"/><category term="한자카운터"/><category term="헤움글꼴"/><title type='text'>책읽기의 낙원</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Karnes</name><uri>http://www.blogger.com/profile/06326076364174832900</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>231</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-25910901.post-5778986693192505161</id><published>2015-05-24T17:21:00.002+09:00</published><updated>2015-05-25T13:58:17.425+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeXTip"/><category scheme="http://www.blogger.com/atom/ns#" term="sqlite"/><title type='text'>sqlite와 LaTeX을 이용한 간단한 문제지 제작</title><content type='html'>&lt;b&gt;(1) 데이터베이스 만들기&lt;/b&gt;&lt;br /&gt;문제, 정답, 풀이, 그리고 메타정보로 이루어진 간단한 문제 db를 작성한다. meta의 값을 integer로 하여 나중에 이 값에 따라 추려내어 식자할 목적이다. (실용적으로는 좀더 복잡한 조건에 따라 meta값을 부여하는 방법을 생각해볼 수 있을 것이다.)&lt;br /&gt;&lt;br /&gt;create table &quot;math&quot; (&lt;br /&gt;&amp;nbsp;id &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;integer,&lt;br /&gt;&amp;nbsp;munje &amp;nbsp; text,&lt;br /&gt;&amp;nbsp;pulee &amp;nbsp; &amp;nbsp;text,&lt;br /&gt;&amp;nbsp;dab &amp;nbsp; &amp;nbsp; &amp;nbsp;text,&lt;br /&gt;&amp;nbsp;meta &amp;nbsp; &amp;nbsp;integer&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;이제 value를 insert하여 db를 만든다. 적당한 sqlite 에디터를 사용하는 편이 좋다.&amp;nbsp;&lt;a href=&quot;https://addons.mozilla.org/ko/firefox/addon/sqlite-manager/&quot; target=&quot;_blank&quot;&gt;Firefox addon인 SQLite Manager&lt;/a&gt;가 훌륭한 듯.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-2KEW743ZWls/VWGHNNdDQeI/AAAAAAAAA_E/8whC1lVviKY/s1600/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%2B2015-05-24%2B%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%2B4.16.54.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;306&quot; src=&quot;http://1.bp.blogspot.com/-2KEW743ZWls/VWGHNNdDQeI/AAAAAAAAA_E/8whC1lVviKY/s400/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%2B2015-05-24%2B%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%2B4.16.54.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;데이터를 입력할 때 주의할 점. 이 간이 db는 나중에 LaTeX으로 처리할 것이고 문제와 해설, 답의 수식에는 LaTeX &amp;nbsp;문법이 쓰인다. 데이터의 성격상 하나의 필드가 장문(여러 문단)으로 이루어질 가능성이 많기 때문에 나중에 csv로 export하면 따옴표로 구분될 것이다.&lt;br /&gt;Mac OS에서 sqlite 편집기로 적당한 것이 없는가 알아보았는데 언급한 SQLite Manager외에도 &lt;a href=&quot;http://sqlitebrowser.org/&quot; target=&quot;_blank&quot;&gt;sqlitebrowser&lt;/a&gt;, &lt;a href=&quot;http://sqlitestudio.pl/&quot; target=&quot;_blank&quot;&gt;sqlitestudio&lt;/a&gt; 등이 괜찮은 것 같고 &lt;a href=&quot;http://www.navicat.com/products/navicat-for-sqlite&quot; target=&quot;_blank&quot;&gt;navicat for sqlite&lt;/a&gt;, &lt;a href=&quot;https://www.sqlitepro.com/&quot; target=&quot;_blank&quot;&gt;sqlitepro&lt;/a&gt;라는 것도 있더라(이건 free가 아닌 듯).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) LaTeX에서 처리할 전략&lt;/b&gt;&lt;br /&gt;간단히 query한 결과를 csv로 저장하고 이것을 읽어들여 식자하는 방식으로 한다.&lt;br /&gt;&lt;br /&gt;meta값이 1인 문제만 추려서 문제만 식자하기 위한 csv를 다음과 같이 만들자.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;$ sqlite3 munjedb&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;sqlite&amp;gt; .mode csv&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;sqlite&amp;gt; .output tmp.csv&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;sqlite&amp;gt; select munje from math where meta in ( select meta from math where meta = 1);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이렇게 하면 meta에 1이 주어진 것들의 &quot;munje&quot;만 추린 것을 csv로 얻을 수 있다. 둘 이상의 column을 select하면 각 column이 쉼표(,)로 분리되고 긴 문단이 들어간 필드가 따옴표(&quot;)로 둘러싸인다. 그러므로 다음 sed 처리를 한 번 해주기로 한다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;p1&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;$ sed &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&#39;s/\&quot;,/},/g;s/,\&quot;/,{/g;s/\&quot;$/}/g;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;s/^\&quot;/{/g&lt;/span&gt;&lt;span class=&quot;s1&quot; style=&quot;color: red;&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: red;&quot;&gt;&amp;nbsp;tmp.csv&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: red;&quot;&gt;&amp;nbsp;&amp;gt;tmp_a.csv&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;이렇게 하여 하나의 필드를 중괄호(braces)로 둘러싸게 하였다. LaTeX은 이것을 하나의 입력단위로 처리할 것이다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) 예제&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;전체소스: &lt;a href=&quot;https://drive.google.com/file/d/0B2evjrJ95hHKcE9ibHlfWWU3elU/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;test-sqlite.zip&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;--shell-escape를 주어서 xelatex을 실행하게 하도록 하고 tex 문서 내에서 query 값을 가지고 외부의 sqlite3를 실행하여 가져오게 한다.&lt;br /&gt;먼저 munje와 dab에 해당하는 column을 query하여 한꺼번에 찍고 페이지를 나누어서 해설(pulee)을 식자하는 방식으로 한다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;\querymeta 명령의 인자가 0이면 모든 데이터를 다 처리하고, 그 이외의 경우는 meta 값에 해당하는 것만 추려낸다.&lt;/li&gt;&lt;li&gt;\munjequery는 sqlite 일괄명령 파일을 임시로 만들고 이것에 대하여 sqlite3를 실행시켜 얻어진 csv에 대하여 따옴표를 제거하는 shell script를 한 번 돌려준다.&lt;/li&gt;&lt;li&gt;\printmunje는 위의 결과인 csv를 불러들여서 식자하는 루틴이다.&lt;/li&gt;&lt;li&gt;같은 방법으로 pulee 필드들을 처리한다.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;당연히 꼭 이런 식으로 하지 않아도 된다. 이를테면 python-sqlite를 이용하는 python script로 명령이 매겨진 .tex 파일을 생성하고 그대로 처리하게 하는 방식도 좋을 것이다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-j6dGMvWKJm8/VWGJ5noxD0I/AAAAAAAAA_Q/XHWfCj-ttRg/s1600/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%2B2015-05-24%2B%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%2B5.20.29.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;278&quot; src=&quot;http://1.bp.blogspot.com/-j6dGMvWKJm8/VWGJ5noxD0I/AAAAAAAAA_Q/XHWfCj-ttRg/s400/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%2B2015-05-24%2B%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%2B5.20.29.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;(4) 결론&lt;/b&gt;&lt;br /&gt;개인이 문항 db를 관리하려 할 때 sqlite는 꽤 쓸모있는 도구이다. 무엇보다 serverless라는 점이 그러하다. sqlite와 LaTeX을 연동하는 방법을 생각해보았는데 lualatex과 luasql-sqlite를 연결할 방법이 없을까 궁금하지만 잠깐 테스트해본 결과 luatex을 새로이 컴파일하지 않는 한 luasql-sqlite.so를 제대로 로드하지 못하는 문제가 있는 것 같다. 이 부분은 좀더 연구가 필요하겠다. 이게 된다면 좋기는 하겠으나 아쉬운 대로 외부 명령의 실행(shell-escape) 방식으로 처리하는 아이디어에 대해 적어본 것이다.&lt;br /&gt;&lt;br /&gt;db를 잘 설계할수록 유용성이 증가할 것이다. 어떤 목적으로 활용하려 하는 것인지, 문항 분류는 어떻게 할 것인지 등을 잘 생각하여야 한다.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/5778986693192505161/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/05/sqlite-latex.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/5778986693192505161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/5778986693192505161'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/05/sqlite-latex.html' title='sqlite와 LaTeX을 이용한 간단한 문제지 제작'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-2KEW743ZWls/VWGHNNdDQeI/AAAAAAAAA_E/8whC1lVviKY/s72-c/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA%2B2015-05-24%2B%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE%2B4.16.54.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-2343205258677621366</id><published>2015-05-15T13:16:00.004+09:00</published><updated>2015-05-15T17:28:13.554+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX3"/><title type='text'>expl3의 인자지정자에 대하여</title><content type='html'>&lt;a href=&quot;http://hoze.tistory.com/1054&quot; target=&quot;_blank&quot;&gt;Hoze ​블로그의 글&lt;/a&gt;을 읽고, 몇 가지 감상.&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;\dim_set:Nn &amp;nbsp;\foo {x}&lt;br /&gt;그러나 이 형식은 여전히 낯설다.&amp;nbsp;&lt;/blockquote&gt;고 하신 언급이 있어 이 글을 쓴다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) expl3와 xparse&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;expl3는 LaTeX3를 위하여 만들어진 언어인 것은 틀림없지만 그 자체로 하나의 (Turing-complete한?) 언어로 취급되고 있다. TeX format 가운데 plainTeX, conTeXt에서 expl3를 쓸 수도 있게 되어 있는 상황이다. 곧, 현재는 LaTeX 포맷에 국한되어 있지 않은 것.&lt;br /&gt;그리고 xparse는 expl3를 LaTeX과 연결해주는 브리지 패키지이다. 그러므로 LaTeX 아닌 다른 포맷에서 xparse는 필요도 없고 쓰지도 않는다. 기본적으로 command니 environment니 하는 것이 LaTeX 특유의 구조이다.&lt;br /&gt;따라서, expl3를 쓰지 않고도 xparse를 얼마든지 잘 이용해먹을 수 있다. xparse의 smo 방식의 인자지정이 편리하게 느껴진다면 종래 해오던 명령 정의 작업을 이 구문만 이용하면서 활용해도 상관없다. \makeatletter 상태로 @문자를 활용하는 것도 가능.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) 함수인가 변수인가?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;TeX/LaTeX에서 매크로를 다루는 데 익숙한 분들이 처음 겪는 혼란 중 하나가 expl3의 &quot;함수&quot;와 &quot;변수&quot;의 구분일 것이다. 둘 다 본질은 매크로일 뿐이지만...&lt;br /&gt;expl3의 함수는 Pascal 언어의 Procedure에 유사하다. 인자를 받아들이기는 하나 반환값이라는 개념이 없다. 정수 인자를 받아들여서 그 2배의 값을 반환하는 함수를 생각해보면 expl3에서는&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\cs_new:Npn \test_a:n #1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_set:Nn \l_tmpa_int { #1 }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_set:Nn \l_output_int { \l_tmpa_int * 2 }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이렇게 정의하여 이후 \l_output_int를 다른 곳에서 쓰게 할 수 있다. 이것은 전형적인 Procedure이다. 그리고 여기서 \l_output_int는 &quot;어떤 (가변)값을 가지는 매크로&quot;이므로 변수로 취급한다.&lt;br /&gt;그런데 이것도 일종의 매크로이기 때문에 이 매크로가 일정한 값을 가지도록 (요컨대, 어떤 값을 input stream에 남기도록) 다음과 같이 정의할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\cs_new:Npn \test_b:n #1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_eval:n { #1 * 2 }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그러면 \test_b:n { 10 }이 불린 위치에서 &quot;20&quot;이라는 값이 입력 토큰열에 포함되게 된다. 이 말은 \test_b:n { 10 }이 하나의 값을 가지게 되므로 마치 반환값이 존재하는 것처럼 다룰 수 있다. (물론 이 때는 소위 &quot;확장&quot;에 유념해야 하지만 그 문제는 차치하고)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) 인자지정자는 뭐하는 물건인가?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hoze께서 예로 드신 \dim_set:Nn을 생각해보자. 이 내장 함수는 그 다음에 오는 토큰 두 개, 즉 N으로 표시되는 &quot;매크로&quot; 하나와 n으로 표시되는 중괄호로 둘러싸인 부분 하나를 취하겠다는 의미이다. 그러므로 이 이후의 입력 토큰열이 \dim_set:Nn \foo_macro { bar_exp } 형식을 갖추어야 한다. dim_set의 의미상 { bar_exp }는 길이 표현(dimension expression)이 되어야 할 것이다.&lt;br /&gt;Pascal에서 생각해보면 Procedure의 정의에서 인자의 종류, 유형, 개수 등을 미리 지정한다. 이를테면 함수의 prototype을 미리 지정하여 인자를 취급하는 것과 완전히 동일하다. expl3는 prototype도 함수/프로시저 선언 없이 이 인자지정자를 통하여 같은 기능을 수행하는 것이다.&lt;br /&gt;예컨대 \tl_set:Nn과 \tl_set:Nx는 어떻게 다른가? 앞의 것은 두 번째 인자로 오는 부분을 있는 그대로 처리해도 되지만 뒤의 것은 그것을 &quot;확장&quot;해야 한다는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\tl_set:Nn \l_tmpa_tl { blah }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\tl_set:Nx \l_tmpb_tl { \l_tmpa_tl }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;둘 사이의 차이가 무엇인지 알 수 있다. 그렇다면 \tl_set_eq:NN이 \tl_set_eq:cc는 될 수 있어도 \tl_set_eq:Nn이 될 수 없는 이유를 이해할 수 있다. 이것은 두 tl 매크로를 일치시키려는 것이므로 둘 다 &quot;매크로&quot;가 아니면 안 되기 때문이다.&lt;br /&gt;&lt;br /&gt;즉, 그것이 &quot;함수&quot;이면 :Nn 식의 인자지정자가 붙는다. 변수나 상수는 그런 게 붙을 이유가 없다. 인자를 취하는 것이 아니므로. (함수의 경우에도 인자를 취하지 않을 수 있는데 이 때는 그냥 \my_noarg_fn: 하는 식으로 이름을 짓게 된다. 인자를 받아들이지 않고 전역 변수들로 작업하는 함수는 이렇게 정의할 수 있다.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4) data type에 관하여&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;expl3의 코딩 편의성을 크게 높여주는 구조 중의 하나가 data type(자료형)일 것이다. 종래의 LaTeX 프로그래밍에서 예를 들어 \mymac이 count인지 skip인지 dimen인지 toks인지는 그 때 그 때 상황에 따라 달랐고 이를 구분하지 않았다. 그러나 expl3에서는 int, fp, dim, bool, skip, keys 등의 자료형과 더불어 tl, seq, clist, prop 등 소위 &quot;리스트형&quot; 자료형이 존재하고 특히 map function을 제공하여 반복 처리나 재귀 호출을 아주 쉽게 구현할 수 있게 해두었다. 이것은 아마도 expl3의 최대 장점 가운데 하나일 것임에 틀림없다. 자료형을 이해하는 것이 expl3 공부의 핵심 부분이 되어야 한다.&lt;br /&gt;&lt;br /&gt;이밖에 생각나는 것으로 expl3의 expansion scheme이 있는데, 이것에 대해서 나중에 언급할 기회가 있으면 하겠다.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/2343205258677621366/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/05/expl3.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2343205258677621366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2343205258677621366'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/05/expl3.html' title='expl3의 인자지정자에 대하여'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-3662381786670531535</id><published>2015-04-27T20:05:00.001+09:00</published><updated>2015-04-27T21:25:29.172+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="csv"/><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeXTips"/><title type='text'>csv 가지고 놀기[2]: 파일 처리</title><content type='html'>&lt;a href=&quot;http://doeun.blogspot.kr/2015/04/csv-1.html&quot; target=&quot;_blank&quot;&gt;이전 글&lt;/a&gt;에서 이어짐.&lt;br /&gt;&lt;br /&gt;db에 데이터를 넣고 이를 호출하는 명령들이 마련되었으므로 이를 이용하여 csv 파일을 조작하는 것을 해본다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) \readcsv 명령&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;두 개의 인자를 취한다. 첫 인자는 csv의 파일 이름이고 두 번째 것을 db의 header가 되게 하려 한다. 즉,&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;\readcsv{sheet1.csv}{cnt,name,age,address}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이렇게 하면 sheet1.csv의 1,2,3,4번 컬럼에 각각 cnt, name, age, address  키가 할당되게 하려는 것이다.&lt;br /&gt;&lt;br /&gt;\ior_new:N \mydb_csv_file&lt;br /&gt;\int_new:N \mydb_csv_cnt&lt;br /&gt;&lt;br /&gt;\NewDocumentCommand \readcsv { m m }&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&amp;nbsp;   &lt;/span&gt;\ior_open:Nn \mydb_csv_file { #1 }&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\mydbhead{#2}&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\int_zero:N \mydb_csv_cnt&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\int_gzero:N \g_mydb_count&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\mydb_read_csv_fn:&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\ior_close:N \mydb_csv_file&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\int_gdecr:N \g_mydb_count&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\int_set_eq:NN \dbmax \g_mydb_count&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;핵심 함수인 \mydb_read_csv_fn: 은 다음과 같이 정의한다. eof가 될 때까지 자기 자신을 재귀 호출하게 되어 있다. csv에서 한 줄씩 읽어서 \mydbin 명령으로 db에 넣는다.&lt;br /&gt;&lt;br /&gt;\cs_new:Npn &lt;span style=&quot;color: red;&quot;&gt;\mydb_read_csv_fn:&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\int_incr:N \mydb_csv_cnt&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\ior_get_str:NN \mydb_csv_file \l_mydb_row_line&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\exp_args:NNf \mydbin{\mydb_csv_cnt}{\l_mydb_row_line}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;\ior_if_eof:NF \mydb_csv_file&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;    &lt;/span&gt;{ &lt;span style=&quot;color: red;&quot;&gt;\mydb_read_csv_fn:&lt;/span&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) &lt;/b&gt;&lt;b&gt;table 만들기&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;앞서 table을 만드는 것은 굳이 전체 데이터를 읽어들여서 처리할 필요 없다고 하였다. 그렇지만 이왕 이렇게 했으니 longtable로 찍어보자. csv 데이터를 테이블로 만들 때는 tabular보다 longtable이 좋다.&lt;br /&gt;&lt;br /&gt;\mydbtable이라는 명령으로 표를 그리게 하려 한다. 이 명령은 두 개의 인자를 취하는데, 첫 번째 것은 표의 header와 데이터를 구성할 줄의 번호이고 두 번째 것은 표의 column을 구성할 key 이름들이다. 즉,&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbtable{1,3-10}{name,pcode,addrA}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이것은 1번 행을 header로 하여 3번 행부터 10번 행까지의 데이터 중에서 name, pcode, addrA에 해당하는 데이터를 추출하여 표로 만들라는 것이다.&lt;br /&gt;첫 번째 인자는 숫자를 일부 생략할 수 있다. 극단적으로 \mydbtable{,-}{name}과 같이 하면 header를 만들지 말고 첫 데이터부터 마지막 데이터까지 모두 표로 만들라는 의미가 되게 하려는 것이다.&lt;br /&gt;&lt;br /&gt;\NewDocumentCommand \mydbtable { m m }&lt;br /&gt;{&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\tl_clear:N \mydb_dbline&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;\parse_range_fn:w&lt;/span&gt; #1 \q_stop&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\int_compare:nF { \header_line_cnt = 0 }&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;{ \mydb_csv_table_headerline:nn { #2 } { \header_line_cnt } }&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\int_set_eq:NN \i_cnt \begin_line_cnt&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\int_while_do:nn { \i_cnt &amp;lt;= \end_line_cnt }&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;{&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;\mydb_csv_table_header:nn { #2 } { \int_to_arabic:n { \i_cnt } }&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;\int_incr:N \i_cnt&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\begin { longtable } { | * { \the\dbmaxcol } { l| } }&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\hline&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\mydb_dbline&lt;br /&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\end { longtable }&lt;br /&gt;}&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;첫 번째 인자를 parse하는 함수 \parse_range_fn:w는 다음과 같이 정의하였다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\cs_new:Npn &lt;span style=&quot;color: red;&quot;&gt;\parse_range_fn:w&lt;/span&gt; #1, #2-#3 \q_stop&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\tl_if_empty:nTF { #1 }&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gzero:N \header_line_cnt }&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gset:Nn \header_line_cnt { #1 } }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\tl_if_empty:nTF { #2 }&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gset:Nn \begin_line_cnt { 1 } }&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gset:Nn \begin_line_cnt { #2 } }&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\tl_if_empty:nTF { #3 }&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gset_eq:NN \end_line_cnt \dbmax }&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \int_gset:Nn \end_line_cnt { #3 } }&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;표의 내용을 구성하기 위해 이런저런 트릭을 좀 썼는데, 핵심은 한 줄이 \​mydb_table_row에 들어간다. 여기에는 각 칼럼을 구분하는 칼럼 구분자(&amp;amp;)도 포함되어 있고 \cr \hline도 들어가 있다. 그리고 이것들을 모아서 \mydb_dbline이라는 매크로로 만들고 longtable 환경 안에 이것을 넣어주는 것이다. 이를 위하여 \protected@xdef을 사용했다. 자세한 것은 &lt;a href=&quot;https://drive.google.com/file/d/0B2evjrJ95hHKdUo0UVVhMFNTY2c/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;소스 코드를 참고&lt;/a&gt;바람.&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbtable{1,4-9}{name,pcode,addrB,cnt}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;위와 같이 한 결과는 다음과 같았다.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-kemwch92TcQ/VT4XC5g-qfI/AAAAAAAAA-c/OBJ0shZl1ec/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-27%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.01.07.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-kemwch92TcQ/VT4XC5g-qfI/AAAAAAAAA-c/OBJ0shZl1ec/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-27%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.01.07.png&quot; height=&quot;138&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;다시 말하지만 이런 정도를 구현하는 패키지는 꽤 좋은 것이 여럿 있다. 이 글에서 보인 것은 내가 그냥 처음부터 패키지 도움 없이 한 번 해본 것을 적은 것이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/3662381786670531535/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/csv-2.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3662381786670531535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3662381786670531535'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/csv-2.html' title='csv 가지고 놀기[2]: 파일 처리'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kemwch92TcQ/VT4XC5g-qfI/AAAAAAAAA-c/OBJ0shZl1ec/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-27%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.01.07.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-5392266749686013184</id><published>2015-04-25T15:00:00.003+09:00</published><updated>2015-04-25T15:06:55.425+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="csv"/><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeXTips"/><title type='text'>csv 가지고 놀기[1]: 특정 데이터에 접근</title><content type='html'>LaTeX에서 csv 파일을 다루는 방법은 이미 훌륭한 것이 몇 가지 있다.&amp;nbsp;혹시 csv 또는 엑셀 파일로 표를 그리거나 하는 용도를 찾고 계시다면 다음 글을 참고하시라. 이 게시글은 이런 좋은 패키지와 상관없이 내가 csv를 가지고 이것저것 해본 것을 기록한 것이다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2011/06/excel-to-latex-conversion.html&quot; target=&quot;_blank&quot;&gt;엑셀 표를 LaTeX 표로 변환하는 문제.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2013/12/csv2latex.html&quot; target=&quot;_blank&quot;&gt;csv2latex의 소개&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2012/11/tex-csv.html&quot; target=&quot;_blank&quot;&gt;csv를 처리하는 LaTeX 패키지 소개&amp;nbsp;&lt;/a&gt;(***)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2010/11/latex.html&quot; target=&quot;_blank&quot;&gt;csvsimple 패키지 소개&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;이 가운데 (***) 표시한 글에서 소개하는 csvsimple, csvtools, datatool이라는 패키지가 눈여겨볼 만한데, 강력한 db 기능이 필요하다면 datatool, 간단히 csv 데이터를 처리하는 데는 csvsimple이나 csvtools가 괜찮아보인다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;각설, 이런 패키지의 도움을 받지 않고 csv 파일을 가지고 놀아본 기록이다. csv는 앞서 주소록 처리에 사용했던 샘플을 이용하였다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(1) 한 줄씩 처리할 건가, 전체 데이터를 한꺼번에 처리할 건가.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;예를 들어 csv를 tabular나 그 비슷한 것으로 표현하려는 것이 목적이라면 데이터 전체를 다 불러들일 이유가 없다. 한 줄씩 처리해도 상관없기 때문. 그러나 예를 들어 3행 5열의 데이터만을 찍으려 하고 이런 식으로 개별 데이터에 대한 접근이 많다면 아예 데이터 전체를 다 불러들인 다음 처리하는 것이 낫다.&lt;/div&gt;&lt;div&gt;앞서 해봤던 주소록으로 라벨을 인쇄하는 작업 같은 것은 전형적으로 한 줄씩 처리하면 되는 것에 해당한다. 이번에는 전체 데이터를 다 읽어서 처리하는 방법을 시도해본다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(2) 2차원 데이터 구조를 표현하는 자료형&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;property list라는 expl3의 자료형을 이용하는 것이 좋아보인다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;number, &amp;nbsp; name, &amp;nbsp; age, &amp;nbsp; address&lt;/div&gt;&lt;div&gt;1, &amp;nbsp; &amp;nbsp; &amp;nbsp; Alice, &amp;nbsp; &amp;nbsp;9, &amp;nbsp; &amp;nbsp;alice&#39;s address&lt;/div&gt;&lt;div&gt;2, &amp;nbsp; &amp;nbsp; &amp;nbsp;Elsa, &amp;nbsp; &amp;nbsp;10, &amp;nbsp; &amp;nbsp; ice palace&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이런 식의 데이터가 있다면,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;propertylist_i ( number = 1, name = alice, age = 9, address = alice&#39;s address )&lt;/div&gt;&lt;div&gt;propertylist_ii ( number = 2, name = elsa, age = 10, address = ice palace )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이와 같이 데이터를 구성하는 것이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(3) \mydbhead 명령&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbhead{cnt,name,age,address}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;이 명령은 쉼표로 분리된 리스트로 각 열(column)의 key 명칭을 부여한다. \mydb_header_clist라는 전역 clist에 인자를 집어넣으면 끝난다.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;\NewDocumentCommand \mydbhead { m }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&amp;nbsp;   &lt;/span&gt;\clist_gset:Nn \mydb_header_clist { #1 }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;(4) \mydbin 명령&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbin{1}{1,alice,9,alice address}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;두 개의 인자를 받는데 처음 것은 행(row)의 번호이다. 그 다음 두 번째 인자는 \mydbhead에 지정된 순으로 실제 데이터를 쉼표로 분리하여 적어준다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbin{2}{2,elsa,10,ice palace}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;여기까지 진행하면 두 개의 데이터가 들어 있게 된다. 현재 몇 개의 데이터가 들어 있는지는 \dbmax라는 매크로에 저장되어 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;\int_new:N \g_mydb_count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;\NewDocumentCommand \mydbin { m m }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \clist_set:Nn \l_tmpa_clist { #2 }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_zero:N \l_tmpa_int&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \tl_set:No \l_tmpa_tl { \int_to_roman:n { #1 } }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \clist_map_inline:Nn \mydb_header_clist&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \int_incr:N \l_tmpa_int&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \clist_pop:NN \l_tmpa_clist \l_tmpb_tl&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \prop_gput:cno { mydb_row_ \l_tmpa_tl }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { ##1 }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { \l_tmpb_tl }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_gincr:N \g_mydb_count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \int_set_eq:NN \dbmax \g_mydb_count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;위의 코드에서 보는 바와 같이 \mydb_row_i, \mydb_row_ii와 같은 property list에 clist 형식으로 들어온 데이터를 header로 지정된 key에 맞추어서 넣어주는 것이다.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(5) \mydbout 명령&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbout{2;age}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;세미콜론으로 구분하여 앞에 오는 숫자는 데이터의 행(row)이고 뒤의 것은 열(column)의 key 명칭이다. 이 명령의 결과는 10이어야 할 것이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;정의의 핵심 부분은 다음과 같다. \mydb_outform_cnt는 인자의 앞 부분 숫자를 로마숫자로 바꾼 것이고 \mydb_outform_key는 뒷 부분에 해당한다. 여기서 정의되는 \l_tmpa_tl을 출력해주면 된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;\prop_get:coN { mydb_row_ \mydb_outform_cnt }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; { \mydb_outform_key }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;&amp;nbsp; &amp;nbsp; \l_tmpa_tl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;(6) 테스트&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;아직 파일 처리에 도달하지 못했다. 일단 여기까지 의도대로 작동하는지 테스트. &lt;a href=&quot;https://drive.google.com/file/d/0B2evjrJ95hHKaXNULTRwRGhrZTQ/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;소스 파일&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbhead{name,age,gender,math}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbin{1}{성춘향,16,여,85}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbin{2}{이몽룡,16,남,16}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbin{3}{​김유신,16,남,20}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbout{1;name}의 수학 점수 \mydbout{1;math}점.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbout{3;name}의 수학 점수 \mydbout{3;math}점.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;\mydbout{2;name}\은 \mydbout{2;gender}자이고 \mydbout{2;age}살입니다.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;현재 데이터는 총 \the\dbmax 개입니다.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-kr4Fl4xyt5Y/VTss8nHIcSI/AAAAAAAAA-I/E6Z89zni8UQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.55.17.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-kr4Fl4xyt5Y/VTss8nHIcSI/AAAAAAAAA-I/E6Z89zni8UQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.55.17.png&quot; height=&quot;157&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(계속)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/5392266749686013184/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/csv-1.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/5392266749686013184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/5392266749686013184'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/csv-1.html' title='csv 가지고 놀기[1]: 특정 데이터에 접근'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kr4Fl4xyt5Y/VTss8nHIcSI/AAAAAAAAA-I/E6Z89zni8UQ/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.55.17.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-249682896158860101</id><published>2015-04-22T09:33:00.003+09:00</published><updated>2015-04-23T08:46:58.443+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="csv"/><category scheme="http://www.blogger.com/atom/ns#" term="Excel"/><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeXTips"/><category scheme="http://www.blogger.com/atom/ns#" term="xlsx2csv"/><title type='text'>우편 발송용 주소록 만들기: expl3</title><content type='html'>dokenzy의 최근 포스팅 &quot;&lt;a href=&quot;http://blog.dokenzy.com/archives/2038&quot; target=&quot;_blank&quot;&gt;Python과 LaTeX으로 우편 발송용 주소록 만들기&lt;/a&gt;&quot;를 읽었다. 흥미로운 주제라고 생각한다.&lt;br /&gt;&lt;br /&gt;사실 이 문제에 대하여 나는 이런저런 테스트를 해본 바 있는데, 2005년 글인 &quot;&lt;a href=&quot;http://faq.ktug.org/faq/Karnes/LaTeXTips#s-1.13&quot; target=&quot;_blank&quot;&gt;Excel 데이터베이스로 주소록 만들기&lt;/a&gt;&quot;가 그 가운데 하나이다. 나중에 Progress, Hoze님의 수정을 거쳐 &lt;a href=&quot;http://hoze.tistory.com/47&quot; target=&quot;_blank&quot;&gt;이름표(명패)를 만드는 데 실용적으로 사용하게 된 코드&lt;/a&gt;의 원형이다.&lt;br /&gt;&lt;br /&gt;뭐 이런 것들로 이미 충분히 잘 되고 있다. 그리고 dokenzy의 방법을 보면 &quot;귀찮은 건 python으로 하고 출력을 LaTeX으로 한다&quot;는 것인데, 대단히 훌륭한 발상이라고 생각한다. 자기가 잘 하는 걸 쓰면 된다. 나는 expl3로 이 문제에 접근해봤다. LaTeX만으로 어떻게 해본다는 정도의 의미일 터이다. 10년 전의 코드와 어떻게 변했는가를 보는 것도 한 가지 재미.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) 엑셀 주소록&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;일단 주소록은 엑셀 파일로 되어 있다고 한다. 이것을 csv로 저장하자. 가끔 엑셀을 csv로 저장하라고 하면 &quot;탭으로 분리된 csv&quot;를 만드는 사람들이 있는데, 꼭 &quot;콤마로 분리된&quot; 것으로 저장하여야 한다. 엑셀 프로그램 자체가 없는 나는 google spreadsheet로 샘플을 작성하였다. 그리고 csv로 다운로드받는다. 여기서는 dokenzy의 샘플과 비슷한 구조를 가진 엑셀 파일을 사용하기로 하였다.&lt;br /&gt;xlsx 파일을 csv로 변환하는 명령행 툴이 없는지 살펴보았더니 python package로 xslx2csv라는 것이 있더라. 잠시 테스트해보았는데 꽤 좋다.&lt;br /&gt;$ pip install xlsx2csv&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) 시나리오&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;주소록의 한 행(row)을 하나의 페이지로 만들기로 하자. 페이지 크기를 잘 정해야 하는데 아래아한글의 주소록 라벨 만들기 샘플을 보니 10.2x3(cm) 짜리 라벨지 18개(9행 2열)가 들어가는 A4 샘플이 있더라. 이 사이즈로 작성하기로 한다.&amp;nbsp;&lt;/li&gt;&lt;li&gt;먼저 라벨지 제작 파일은 이 하나의 데이터를 한 페이지로 하는 pdf를 만들고&amp;nbsp;&lt;/li&gt;&lt;li&gt;최종 출력 파일은 이 원래 pdf를 한 페이지에 18개를 앉혀서 출력한다.&lt;/li&gt;&lt;li&gt;arara로 컴파일하면 최종 출력 파일인 addr-output.pdf가 자동으로 생성된다.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;(3) 코드&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;파일을 읽는 것은 l3file에 주요 명령이 마련되어 있다. 여기서 쓴 것은 \ior_open:Nn, \ior_close:N, \ior_get_str:NN, \ior_if_eof:NTF이다.&amp;nbsp;&lt;/li&gt;&lt;li&gt;한 줄을 읽으면 콤마로 분리된 데이터가 들어 있다. 이것을 property list에 등록한다.&lt;/li&gt;&lt;li&gt;property list로부터 key값 name, addrA, addrB, post로 이름을 준 이름, 주소, 상세주소, 우편번호 토큰열을 얻어서 이것을 tikz로 위치를 잡아 식자한다.&lt;/li&gt;&lt;li&gt;eof에 도달할 때까지 위의 처리를 반복한다. 반복 처리를 구현하는 방법은 여러 가지가 있겠는데 여기서는 간단한 재귀호출을 이용하였다.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;다음 두 가지 사항을 구현해보았다.&lt;/div&gt;&lt;ul&gt;&lt;li&gt;출력에서 이름을 식자할 때 글자 사이에 충분한 간격을 주도록 하였다. 이를 위해서 이름에 해당하는 토큰열의 각 토큰 사이를 분리하여 간격을 주어야 하는데, 흔한(?) 재귀호출로 처리하였다.&lt;/li&gt;&lt;li&gt;우편번호는 박스 안에 식자하게 한다.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;예전에 비하여,&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;페이지별로 만들어진 pdf를 하나의 A4용지에 18개씩 식자하게 하는 데 tcolorbox라는 어마무시한(...) 패키지를 사용하였다. 이거 좋다.&lt;/li&gt;&lt;li&gt;arara라는 workflow 자동화 툴을 이용해서 한 번에 최종출력 파일까지 모두 컴파일하게 할 수 있다. arara도 좋다. 그래서 별도의 배치파일을 만든다든가 할 필요가 없다.&lt;/li&gt;&lt;li&gt;코드의 가독성이 높아졌다. expl3를 썼으니 당연히.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(4) 코드 예: 우편번호 식자&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;다음 코드에서 quark recursion 기법이 이용되었다.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\cs_new:Npn \print_post_num:n #1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\tikz [overlay,remember~picture]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;\node [xshift=-.5cm,yshift=.8\onelineskip,anchor=east]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;at (current~page.south~east)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;   &lt;/span&gt;{ \parse_post_num:n #1 \q_recursion_tail \q_recursion_stop };&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;다음 함수는 숫자이면 박스를 치고 숫자가 아니면(글자이면) 박스를 치지 않게 하는데, xetexko는 한글을 other로 할당하고 있으므로 한글은 박스가 쳐질 것이다. 한 가지 예외사항은 112-345의 가운데 대시의 처리. 이것은 숫자와 catcode가 같기 때문에 별도로 처리하였다.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\cs_new:Npn \parse_post_num:n #1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\quark_if_recursion_tail_stop:n #1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\token_if_eq_catcode:NNTF #1 1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;\token_if_eq_charcode:NNTF #1 - &amp;nbsp;%% &#39;-&#39;의 catcode가 number와 같기 때문에 별도로 검사&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \textcolor {red!80} {--} \kern 1pt }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \color_boxed_num:n { #1 } \kern 1pt }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;#1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\parse_post_num:n&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;테두리를 치는 함수. 여기서는 높이를 고정하기 위하여 parbox의 &quot;두 번째 옵션 인자&quot;를 사용하였다.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;\cs_new:Npn \color_boxed_num:n #1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;\efbox [margin=1pt,linewidth=1pt,linecolor=red!80]&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;  &lt;/span&gt;{ \parbox [c][8pt][c] {.6em}{ \hfil\postnumfont #1 } }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;(5) 결론&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이 샘플에서 파일 처리, 재귀호출을 이용한 문자열 처리, property list 자료형, catcode와 charcode 처리 등 몇 가지 아이디어가 나중에 다른 데서라도 참고할 만한 것이 있어 보인다. 잊어버리지 않기 위하여 적어둔다.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0B2evjrJ95hHKNlVNaFBxeEZJQ28/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;소스파일&lt;/a&gt;&amp;nbsp;(addr.tex) : sheet2.csv라는 파일이 있어야 정상 컴파일된다. 이 파일은 예를 들면 다음과 같은 구조로 되어 있어야 한다.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;일련번호,이름,주소,상세주소,우편번호&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;1,김갑동,세종특별자치시 조치원읍 세종로,2511 고려대학교,339-806&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-cBu1jp9BzXE/VTbqp10L2uI/AAAAAAAAA90/cnrMEpjH104/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-22%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B9.25.50.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-cBu1jp9BzXE/VTbqp10L2uI/AAAAAAAAA90/cnrMEpjH104/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-22%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B9.25.50.png&quot; height=&quot;400&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/249682896158860101/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/expl3.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/249682896158860101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/249682896158860101'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/expl3.html' title='우편 발송용 주소록 만들기: expl3'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-cBu1jp9BzXE/VTbqp10L2uI/AAAAAAAAA90/cnrMEpjH104/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-22%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B9.25.50.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-7927560177753562159</id><published>2015-04-21T12:39:00.001+09:00</published><updated>2015-04-21T12:41:59.622+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="svn"/><category scheme="http://www.blogger.com/atom/ns#" term="svn local repository"/><category scheme="http://www.blogger.com/atom/ns#" term="svn without svnserver"/><title type='text'>svn을 personal하게 쓰기 (계속): dropbox를 이용하자</title><content type='html'>&lt;div&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2015/04/svn-personal.html&quot; target=&quot;_blank&quot;&gt;앞선 글&lt;/a&gt;에서 이어짐.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;나도 마찬가지지만 많은 분들이 자신이 작업하고 있는 자료의 &quot;백업&quot; 때문에 상당한 시간과 비용을 들이는 것으로 알고 있다. 스트레스도 많이 받고.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;글쓰기를 문제삼는 이곳에서 다룰 만한 주제는 자신이 쓰고 있는 &quot;글&quot;을 어떻게 백업하는 것이 좋은가일 것이다. svn의 본연의 기능과 동떨어지게시리 문서 작업의 버전 관리 툴로 써보자는 이 희한한 발상도 이로부터 출발하였다. 날짜별로 작업한 모든 버전을 모두 백업해두는 것은 이전에 작업한 게 사라지지 않고 &quot;어딘가에&quot; 있다는 심정적 안심스러움 말고는 아무런 도움도 되지 않는다. 그 &quot;어딘가&quot;를 뒤지는 데 몇 시간을 소요하고 결국 못 찾아본 경험이 있는 분은 이 말의 의미를 알 것이다.&lt;/div&gt;&lt;div&gt;실로 맥의 타임머신이야말로 궁극의 솔루션이기는 하지만 그건 그거고...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;svn의 repository를 dropbox 안에 둔다면 어떻게 될까?&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;예를 들어 내가 책 한 권을 번역 중이라고 하자. 이 번역 프로젝트를 mmd+latex 방식으로 하고 있다고 할 때, 이 관련 파일 모두를 dry svn (서버 없는 svn)으로 관리한다면,&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;매일 작업한 파일과 폴더를 별도의 백업 폴더로 저장할 필요가 없다. 변경사항은 모두 보관되고 추적되고 복구가능하다.&lt;/li&gt;&lt;li&gt;local 컴퓨터가 망가져도 (같은 버전의) svn 툴만 있다면 언제라도 dropbox의 repository로부터 checkout하여 이전 작업을 계속할 수 있다. 앞선 글에서는 svnX라는 GUI 툴을 주로 설명했지만 실은 명령행 버전만 있어도 된다. (Windows의 tortoiseSVN인가 하는 걸로도 가능할 거다, 아마.)&lt;/li&gt;&lt;li&gt;여러 대의 컴퓨터로 작업하는 것도 가능하다. (다른 컴퓨터에서 작업한 것을 반영하기 위해 svn update 한 다음에 계속하는 것이 좋다.)&lt;/li&gt;&lt;li&gt;개인의 문서 작업에서 branch가 필요할는지는 짐작도 할 수 없지만 그래도 필요하다면 svn이 제공하는 여러 가지 방법으로 문서 작성을 관리할 수 있다.&lt;/li&gt;&lt;li&gt;작업 중인 폴더를 지워버려도 상관없다. repository만 유지되고 있다면 필요할 때 새로 checkout하면 된다.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;필요한 것은 repository를 dropbox 폴더 안에 두는 것뿐이다. 예를 들면,&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;$ ​mkdir -p ~/Dropbox/svnrepos&lt;/div&gt;&lt;div&gt;$ cd ~/Dropbox/svnrepos&lt;/div&gt;&lt;div&gt;$ svnadmin create mytranslations&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(이 이후는 GUI 툴로 하는 것이 쉽다.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;$ cd ~/Documents&lt;/div&gt;&lt;div&gt;$ svn co file:///Users/username/Dropbox/svnrepos/mytranslations&lt;/div&gt;&lt;div&gt;$ cd mytranslations&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(first.tex 생성 후)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;$ svn add first.tex&amp;nbsp;&lt;/div&gt;&lt;div&gt;$ svn status&amp;nbsp;&lt;/div&gt;&lt;div&gt;$ svn commit -m &quot;generate first.tex file&quot;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;등등...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/7927560177753562159/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/svn-personal-dropbox.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7927560177753562159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7927560177753562159'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/svn-personal-dropbox.html' title='svn을 personal하게 쓰기 (계속): dropbox를 이용하자'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-1396988565715931079</id><published>2015-04-21T03:09:00.002+09:00</published><updated>2015-04-22T15:32:51.487+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="svn"/><category scheme="http://www.blogger.com/atom/ns#" term="svn local repository"/><category scheme="http://www.blogger.com/atom/ns#" term="svn without svnserver"/><category scheme="http://www.blogger.com/atom/ns#" term="svnX"/><title type='text'>svn을 personal하게 쓰기</title><content type='html'>문제는 이렇다. 개인적으로 작성하고 있는 문서나 개발 프로젝트에 대하여 버전 관리를 하고 싶은데 적당한 툴이 없느냐는 것. 모든 파일은 전부 &quot;사적인 것&quot;으로서 일반에 공개하거나 할 만한 것이 아니다. 협업을 할 것도 아니다.&lt;br /&gt;&lt;div&gt;시스템은 Mac OS X이며 개인용 기계에 network 서버를 돌릴 것도 아니다. 즉, 개인 컴퓨터에서 서버 없이 파일 베이스로 할 수 있는 버전 관리에 대한 것. 너무 번거로워도 안 되고 GUI가 있으면 좋겠다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;만약 svn이 서버 없이도 쓸 만하다면 이 목적에 충실하다 할 것이다. 그래서 한번 시도해봤다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(1) svn이 Mac OS X에서 제공되는 것이 있기는 한데 중복이 되더라도 homebrew 설치하는 편이 낫다고 판단했다. 기본 svn의 버전은 1.7.19, homebrew 버전은 1.8.13이다.&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ brew install svn&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(2) repository 폴더와 working 폴더를 생각하자. 편의상 모든 프로젝트를 ~/Library/svnrep/ 아래 두기로 하고 작업은 Desktop에서 하는 것으로 한다.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ mkdir -p ~/Library/svnrep&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(3) 약간의 터미널 작업은 어쩔 수 없다. 일단 ~/Library/svnrep/ 아래 첫 번째 프로젝트 레포지토리로 사용할 폴더 firstwork을 만든다. 사용자의 이름은 username이라고 한다.&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ cd ~/Library/svnrep&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ svnadmin create firstwork&lt;/span&gt;&lt;/div&gt;&lt;div&gt;이렇게 하면 ~/Library/svnrep/firstwork 폴더가 생성되고 svn repository 설정이 되어 있다. 현재 revision 0 상태이다.&lt;br /&gt;&lt;br /&gt;(3-a) 새 프로젝트 레포지토리를 만드는 것, &lt;u&gt;repository create는 터미널에서 할 수밖에 없다&lt;/u&gt;. 새로운 프로젝트 생성 시에 터미널을 열고 (3)에서 설명한 방법을 적용한다. 이후는 svnX라는 GUI 툴로 계속하자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;(4) 여기서 &lt;a href=&quot;https://code.google.com/p/svnx/&quot; target=&quot;_blank&quot;&gt;svnX를 설치하고&lt;/a&gt; 실행한다.&lt;br /&gt;&lt;br /&gt;(4-a) svnX를 처음 실행한 후&amp;nbsp;&lt;u&gt;Preferences에서 Path to svn binaries folder를&amp;nbsp;&lt;/u&gt;homebrew svn를 쓰는 경우라면&amp;nbsp;&lt;u&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;/usr/local/bin/&lt;/span&gt;으로, Mac OS의 것을 쓰려면 &lt;span style=&quot;color: #cc0000;&quot;&gt;/usr/bin/&lt;/span&gt;으로 고쳐야 한다.&lt;/u&gt;&amp;nbsp;핵심은 svn의 버전이 프로젝트를 생성할 때 사용한 것과 같은 버전이어야 한다는 것.&lt;br /&gt;&lt;br /&gt;(4-b) Diff Application도 중요한데 이것은 Xcode의 FileMerge (default)를 사용하면 되고 원한다면 TextWrangler 같은 것으로 diff해도 좋다.&lt;br /&gt;&lt;br /&gt;(5) svnX의 메뉴 Windows -&amp;gt; Repositories로 열리는 Repository 관리창에 방금 만든 레포지토리를 등록한다. Path는 탐색 아이콘을 눌러서 Shift-Cmd-G하여 ~/Library/svnrep으로 가는 것이 좋다. 그 아래 있는 firstwork 폴더를 선택하면 된다. 등록된 레포지토리를 더블 클릭하면 Repository 탐색창이 뜬다. 이 창의 툴바를 보면 Checkout이라는 것이 있다. Checkout 하기 전에 이 프로젝트를 작업할 작업 폴더를 하나 만든다. 편의상 Desktop/FirstWork을 만들었다고 하고, Checkout 아이콘을 눌러서 방금 만든 폴더 Desktop/FirstWork을 선택해준다. (이미 다른 레포지토리의 작업 폴더이면 오류.)&lt;br /&gt;&lt;br /&gt;(6) svnX의 Working Copies 관리창에 보면 방금 checkout한 폴더가 등록되어 있을 것이다. (Repository 관리창과 마찬가지 방법으로 Working copy만 별도로 등록할 수도 있다.) 이것을 더블 클릭하면 Working Copy 탐색창이 뜬다. 여기서 툴바의 &quot;Reveal&quot;을 선택하면 파인더에서 이 폴더를 열 수 있다. 이제 Finder로부터 원하는 작업(새로운 파일을 만들거나 가져오거나 수정)을 행한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(7) svnX의 Working Copy 탐색창으로 가서 Refresh를 누르거나 Cmd-R 하여보자. 새로 추가한 파일들이 (파란 색으로) 나와 있을 것이다. 툴바 제일 왼쪽의 View Mode 세 가지가 있는데 적당히 선택해본다. 그리고 Filter에서 All/New/... 등을 맞추어 파일이 어떻게 보이는지 시험해보고 익숙해지게 하자.&lt;br /&gt;&lt;br /&gt;(7-a) 새로 추가할 파일이 있는 상태이므로 Filter를 New로 한다. ​New에 해당하는 모든 파일을 선택(Cmd-A)한 다음 Add 버튼을 눌러서 프로젝트에 추가한다. 추가할 때는 add, 삭제할 때는 remove를 반드시 해주어야 한다. 파일 이름이 바뀐 경우 이전 파일 이름을 remove하고 새 이름을 add한다.&lt;br /&gt;&lt;br /&gt;(7-b) 이제 첫 commit을 해본다. 이 상태에서 Review라는 버튼을 누르면 추가할 파일과 그 내용 (즉 수정사항)을 점검할 수 있다. commit할 때는 반드시 Message를 기록해야 하므로 Message에 &quot;Init project&quot;라고 쓰고 Commit하면 된다. Message가 잠시 귀찮아보일지 모르지만 이것이 변경 내용을 추적하는 주요 정보이므로 되도록 자세하게 적어주는 것이 좋다.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Wc4AGwThxWM/VTU_0IrDPCI/AAAAAAAAA9Y/MRPfHnsphrc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.01.29.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-Wc4AGwThxWM/VTU_0IrDPCI/AAAAAAAAA9Y/MRPfHnsphrc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.01.29.png&quot; height=&quot;260&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(8) Repository 탐색창은 Working Copy 탐색창의 툴바에서 Repository를 눌러도 되고 Repository 관리창에서 더블 클릭해도 된다. 이미 열려 있다면 갱신(Cmd-R)해보자. commit한 결과가 나타날 것이다. 여기까지 진행했다면 일단 된 것이다.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-hxm8Q8cpfIs/VTU_0MuGfvI/AAAAAAAAA9Q/iZQGCyVeQlY/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.02.00.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-hxm8Q8cpfIs/VTU_0MuGfvI/AAAAAAAAA9Q/iZQGCyVeQlY/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.02.00.png&quot; height=&quot;387&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(9) 이제 첫 수정을 통해 revision 2를 만들어보자. 파인더의 작업 폴더에서 파일을 수정한다. 그리고 working copy 탐색창에서 refresh 아이콘을 찾아 누르면 해당 파일의 앞머리에 M자가 붙을 것이다. (보기 filter가 무엇이냐에 따라 보이지 않을 수도 있으므로 이 때는 All로 하는 것이 좋다.) Review를 통해서 하는 것이 안전하지만 변경 파일이 하나라면 바로 Commit할 수 있다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(10) Repository 탐색창을 갱신(Cmd-R)하여 변경 사항이 잘 commit된 것을 확인한다. 이 창의 아랫쪽에 있는 파일 브라우저로 원하는 파일을 선택한 다음 Diff를 눌러보자. (FileMerge라면 한글로 된 파일을 &quot;ascii파일이 아니다&quot;고 불평할 수 있다. 이것은 svn prop 명령으로 mime-type을 text/plain으로 바꿔주어야 해결되는 문제인데... 크게 불편하지 않다면 그냥 쓰자. 그림 파일 등은 FileMerge로 볼 수 없다.) 변경사항이 제법 예쁘게 표시된다. 당연한 얘기지만 현재 버전은 물론이고 이전 버전을 별도로 export하는 것도 가능하다.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-UyVaQSnATY0/VTU_0erdaiI/AAAAAAAAA9U/Y3TRSL49Nec/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.04.31.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-UyVaQSnATY0/VTU_0erdaiI/AAAAAAAAA9U/Y3TRSL49Nec/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.04.31.png&quot; height=&quot;365&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(11) 유념할 것은, svnX나 svn이나 모두 여기서 설명한 것처럼 local machine에서 혼자 쓰도록 고안된 툴이 아니라는 것이다. 그러다보니 몇 가지 동작하지 않는 기능도 있고, 이따금 에러 비슷한 화면이 보일 때도 있는데, 그런 것 무시하고 쓰면 된다. svn의 온갖 복잡한 기능들, 특히 협업과 관련된 것들은 사실 이럴 경우 별 쓸 데가 없다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;개인의 글쓰기 프로젝트라면 휴식이 길어질 때나, 하루에 한 번 정도 정기적으로, 또는 일정한 분량이 차면 commit하는 방식으로 유지하는 것도 나쁘지 않겠다. 적어도 &lt;i&gt;나중에 찾지도 못할 수없이 많은 backup 폴더&lt;/i&gt;는 만들지 않을 수 있는 거 아닐까.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;// 수정: 다음 행을 수정하였다. svnX를 주로 쓰는 방식으로 서술을 바꾸었지만 혹시 명령행 작업에 참고가 될는지 몰라서 없애지는 않았다.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strike&gt;(4) 이 프로젝트에 포함된 파일이 있다면 svn import 명령을 써서 이곳으로 임포트할 수 있다. 이 때는 다음과 같은 명령을 사용한다.&lt;/strike&gt;&lt;/div&gt;&lt;div&gt;&lt;strike&gt;$ svn import ~/Desktop/mywork file:///Users/username/Library/svnrep/firstwork/trunk -m &quot;message&quot;&lt;/strike&gt;&lt;/div&gt;&lt;div&gt;&lt;strike&gt;&lt;br /&gt;&lt;/strike&gt;&lt;/div&gt;&lt;div&gt;&lt;strike&gt;(5) 그런데, 나는 굳이 이렇게 할 것이 아니라 이것을 checkout한 후에 파일을 등록하고 commit하는 것도 좋겠다고 생각했다. Desktop에서 다음 명령을 내린다.&lt;/strike&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;strike&gt;$ cd ~/Desktop (작업 폴더를 둘 곳으로 이동)&lt;/strike&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: blue;&quot;&gt;&lt;strike&gt;$ svn co file:///Users/username/Library/svnrep/firstwork/&lt;/strike&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/1396988565715931079/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/svn-personal.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1396988565715931079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1396988565715931079'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/svn-personal.html' title='svn을 personal하게 쓰기'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Wc4AGwThxWM/VTU_0IrDPCI/AAAAAAAAA9Y/MRPfHnsphrc/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-21%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B3.01.29.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-4495590996076501561</id><published>2015-04-06T18:07:00.000+09:00</published><updated>2015-04-06T18:11:01.942+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="changePitch"/><category scheme="http://www.blogger.com/atom/ns#" term="Lilypond"/><category scheme="http://www.blogger.com/atom/ns#" term="strauss"/><category scheme="http://www.blogger.com/atom/ns#" term="wiegenlied"/><category scheme="http://www.blogger.com/atom/ns#" term="악보"/><category scheme="http://www.blogger.com/atom/ns#" term="악보 조판"/><title type='text'>changePitch를 이용하는 반복 음형의 처리, Lilypond</title><content type='html'>LilyPond 매크로 changePitch를 소개한다.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://gillesth.free.fr/Lilypond/changePitch/&quot;&gt;http://gillesth.free.fr/Lilypond/changePitch/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;\changePitch 라는 매크로를 제공한다. 사용법은 \changePitch pattern newnotes 형식이고 newnotes로 주어지는 note를 pattern의 패턴으로 식자하는 것이다. 예를 들면 다음과 같다.&lt;br /&gt;&lt;br /&gt;\include &quot;changePitch.ly&quot;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;pattern = { c8. c16 }&lt;br /&gt;newnotes = { c d e f g f e d }&lt;br /&gt;&lt;br /&gt;\relative c&#39; {&lt;br /&gt;&amp;nbsp; \changePitch \pattern \newnotes&lt;br /&gt;&amp;nbsp; c2. r4&lt;br /&gt;}&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ihSnunC6r_c/VSIdIkceadI/AAAAAAAAA8Y/aS10-FWrLwc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.43.20.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-ihSnunC6r_c/VSIdIkceadI/AAAAAAAAA8Y/aS10-FWrLwc/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.43.20.png&quot; height=&quot;67&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;잘 쓰면 아주 유용하겠다 싶은 매크로이다. 이것을 Richard Strauss의 자장가 조판에 적용해본 예를 적어둔다.&lt;br /&gt;리하르트 슈트라우스의 작품 41번 &quot;다섯 개의 노래&quot; 첫째 곡인 자장가(Wiegenlied; D-major, 2/2)의 반주부는 다음 그림과 같은 음형이 곡 끝까지 반복된다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-vCMQBsrqX4I/VSIeN6lXXlI/AAAAAAAAA8g/h3zlN-ANp3U/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B1.46.34.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-vCMQBsrqX4I/VSIeN6lXXlI/AAAAAAAAA8g/h3zlN-ANp3U/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B1.46.34.png&quot; height=&quot;162&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;반주분의 오른손 파트 첫 4분음표에 해당하는 패턴을 다음과 같이 작성한다.&lt;br /&gt;&lt;br /&gt;patonce = { r32 c ( [ c c c c c c ] ) }&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그런 다음 changePitch를 이용하여 이것을 식자하는 매크로를 정의하자.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ppI = #(define-music-function (parser location newnotes) (ly:music?)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#{ \changePitch \patonce $newnotes #})&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이 패턴을 2번, 3번, 4번 반복하게 하는 매크로를 같은 방식으로,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;pattwo &amp;nbsp;= \repeat unfold 2 { \patonce }&lt;/div&gt;&lt;div&gt;patthr &amp;nbsp;= \repeat unfold 3 { \patonce }&lt;/div&gt;&lt;div&gt;patfour = \repeat unfold 4 { \patonce }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ppII = #(define-music-function (parser location newnotes) (ly:music?)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #{ \changePitch \pattwo $newnotes #})&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ppIII = #(define-music-function (parser location newnotes) (ly:music?)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#{ \changePitch \patthr $newnotes #})&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ppIV = #(define-music-function (parser location newnotes) (ly:music?)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #{ \changePitch \patfour $newnotes #})&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;첫 마디의 나타냄말 등을 식자하기 위하여 맨 첫 박자를 다음처럼 하고,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\ppI { d,^\markup{\halign #-0.7 \italic &quot;(sehr leicht und fluchtig)&quot; } fis_\markup{ \halign #-.6 \italic &quot;una corda&quot;} a d a fis d }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그 뒤에 같은 음형을 세 번 반복한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\ppIII { d fis a d a fis d }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;그 다음 마디는 간단히&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;\ppIV { d fis a d a fis d }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;이렇게 만들어진 두 마디.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-a1ocTPZ55VA/VSJJaidrUhI/AAAAAAAAA8w/EaQM56MJyGU/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B5.52.27.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-a1ocTPZ55VA/VSJJaidrUhI/AAAAAAAAA8w/EaQM56MJyGU/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B5.52.27.png&quot; height=&quot;87&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;참고로, beam을 subdivide하기 위해서 다음 명령이 추가되어 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; \set subdivideBeams = ##t&lt;/div&gt;&lt;div&gt;&amp;nbsp; \set baseMoment = #(ly:make-moment 1/8)&lt;/div&gt;&lt;div&gt;&amp;nbsp; \set beatStructure = #&#39;(2 2 2 2)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;왼손의 패턴은 다음과 같이 한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;patleft = { c8 r8 c8 r8 \stemUp \change Staff = &quot;right&quot;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; c^\markup{ \halign #-0.5 \italic &quot;L.H.&quot; } r \stemNeutral \change Staff = &quot;lefthand&quot; c8 c8 }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;pL = #(define-music-function (parser location newnotes) (ly:music?)&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; #{ \changePitch \patleft $newnotes #})&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;일반적인 &quot;left&quot;가 아니라 &quot;lefthand&quot;가 된 이유는 왼손과 페달을 분리해서 식자하기 때문이다. 이에 관한 것은 소스를 참고.&lt;/div&gt;&lt;div&gt;두 마디는 다음처럼 쓰면 된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp; \pL { d, a&#39; a&#39;&#39; a,, r } \pL { d, a&#39; a&#39;&#39; a,, r }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wiegenlied의 처음 18마디를 조판한 ly 소스: &lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkTkFvbGtPdlhBV3M/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;testwie.ly&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-tNMQBkxvGu0/VSJLQje3HAI/AAAAAAAAA88/L4DdesRqbHI/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B5.58.37.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-tNMQBkxvGu0/VSJLQje3HAI/AAAAAAAAA88/L4DdesRqbHI/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B5.58.37.png&quot; height=&quot;400&quot; width=&quot;348&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;바바라 보니가 부르는 것을 유튜브에서 들어봤는데, 좋더라.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/NfbzgU82Kxs/0.jpg&quot; frameborder=&quot;0&quot; height=&quot;266&quot; src=&quot;http://www.youtube.com/embed/NfbzgU82Kxs?feature=player_embedded&quot; width=&quot;320&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/4495590996076501561/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/04/changepitch-lilypond.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4495590996076501561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4495590996076501561'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/04/changepitch-lilypond.html' title='changePitch를 이용하는 반복 음형의 처리, Lilypond'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ihSnunC6r_c/VSIdIkceadI/AAAAAAAAA8Y/aS10-FWrLwc/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-04-06%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B2.43.20.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-535149647363021896</id><published>2015-03-30T20:35:00.001+09:00</published><updated>2015-03-30T20:35:29.492+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="lilybin"/><category scheme="http://www.blogger.com/atom/ns#" term="Lilypond"/><category scheme="http://www.blogger.com/atom/ns#" term="music engraving"/><category scheme="http://www.blogger.com/atom/ns#" term="music notation"/><category scheme="http://www.blogger.com/atom/ns#" term="weblily"/><category scheme="http://www.blogger.com/atom/ns#" term="악보 조판"/><title type='text'>Online Lilypond 악보 조판</title><content type='html'>웹 브로우저로 접속하여 Lilypond 작업을 할 수 있는 온라인 악보조판 서비스.&lt;br /&gt;(마우스로 콕콕 찍어서 음표를 입력할 수 있는 악보 만들기 서비스는 몇 종류 되는 것으로 보인다. 그 가운데 ​&lt;a href=&quot;http://www.scorio.com/web/scorio/online-editor&quot; target=&quot;_blank&quot;&gt;scorio&lt;/a&gt;처럼 Lilypond export가 되는 것도 있지만 이 글에서는 전적으로 Lilypond 입력(스니펫이나 파일)을 처리할 수 있는 것만을 문제삼는다.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) tunef! (&lt;a href=&quot;http://www.tunefl.com/&quot;&gt;http://www.tunefl.com/&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;릴리폰드 공식 사이트에 링크가 소개되어 있는데, mini score를 만들 정도이고 악보가 조금 복잡해지니까 &quot;너무 experimental하다&quot;는 좀 거시기한 메시지를 보여준다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) weblily (&lt;a href=&quot;http://weblily.net/web/guest&quot;&gt;http://weblily.net/web/guest&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;이곳의 최대 장점은 템플리트를 제공한다는 것. 그리고 악보의 노트에서 에디터로 inverse search가 된다는 것이다. 이 정도면 나쁘지 않다. midi 파일도 생성하기 때문에 바로 듣거나 다운받을 수 있다. facebook을 통한 공유 가능. 다음 그림은 weblily가 제공하는 템플리트 선택 메뉴이다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-lGmZdv8k_tc/VRk00reXu0I/AAAAAAAAA8E/TE7ykgKDzJU/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-30%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.25.23.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-lGmZdv8k_tc/VRk00reXu0I/AAAAAAAAA8E/TE7ykgKDzJU/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-30%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.25.23.png&quot; height=&quot;320&quot; width=&quot;249&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) lilybin (&lt;a href=&quot;http://lilybin.com/&quot;&gt;http://lilybin.com&lt;/a&gt;)&lt;/b&gt;&lt;br /&gt;매우 깔끔하고 심플한 온라인 릴리폰드 에디터를 제공한다. 사인 업하지 않고도 악보를 만들어볼 수 있다. 악보 보기 창은 그대로 pdf이기 때문에 거꾸로 찾기 등이 안 된다는 단점은 있지만 사실 그 기능이 없으면 작업을 못할 정도는 아니라서 나한테는 제일 설득력있었다. 드롭박스와 연동된다.&lt;br /&gt;&lt;br /&gt;weblily나 lilybin 정도라면 그럭저럭 납득할 만하다는 생각을 하였다. 아기자기한 기능(인버스 서치, 템플리트, 도움말 등등)은 weblily쪽이 좀더 많고 에디터와 뷰어만 필요하다면 lilybin.&lt;br /&gt;&lt;br /&gt;lilybin에서 테스트삼아 악보를 만들고 있는 모습.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-rPgsvKyrlso/VRk0mOPnO6I/AAAAAAAAA78/g6S6MqKjnIA/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-30%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.28.01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-rPgsvKyrlso/VRk0mOPnO6I/AAAAAAAAA78/g6S6MqKjnIA/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-30%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.28.01.png&quot; height=&quot;255&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/535149647363021896/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/03/online-lilypond.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/535149647363021896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/535149647363021896'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/03/online-lilypond.html' title='Online Lilypond 악보 조판'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-lGmZdv8k_tc/VRk00reXu0I/AAAAAAAAA8E/TE7ykgKDzJU/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-30%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B8.25.23.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-4043156534293829395</id><published>2015-03-25T21:45:00.001+09:00</published><updated>2015-03-25T21:45:43.822+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tnxtex"/><category scheme="http://www.blogger.com/atom/ns#" term="tnxtex for mac"/><category scheme="http://www.blogger.com/atom/ns#" term="wine"/><title type='text'>TnXTeX mac/wine 1.4.5</title><content type='html'>* &lt;a href=&quot;http://ktug.kldp.net/TnXTeX/tnxtex-mac-wine-145.zip&quot; target=&quot;_blank&quot;&gt;다운로드 (zip)&lt;/a&gt;&amp;nbsp;(600M)&lt;br /&gt;&lt;br /&gt;아래 글에서 보인 시험판과 다른 점은 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;tnxtex 1.4.5를 기반으로 하였음.&lt;/li&gt;&lt;li&gt;StartTnX.sh 스크립트를 없애고 보통 맥용 앱을 실행하듯이 &lt;u&gt;더블 클릭 또는 Cmd+down으로 실행&lt;/u&gt;되도록 하였음 (터미널이 열림).&lt;/li&gt;&lt;li&gt;C: 드라이브에 해당하는 위치가 &lt;span style=&quot;color: red;&quot;&gt;~/Library/Application Support/org.ktug.tnxtex_...&lt;/span&gt; 으로 바뀜. 정확한 경로를 알고 싶으면 C: 드라이브로 이동한 상태에서 &lt;span style=&quot;color: red;&quot;&gt;winepath . (마침표)&lt;/span&gt; 명령을 실행해본다.&lt;/li&gt;&lt;/ol&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/--em_ZaSSfUE/VRKtooJ1-SI/AAAAAAAAA7o/a1YKjHvrsdM/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B9.42.58.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/--em_ZaSSfUE/VRKtooJ1-SI/AAAAAAAAA7o/a1YKjHvrsdM/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B9.42.58.png&quot; height=&quot;280&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/4043156534293829395/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/03/tnxtex-macwine-145.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4043156534293829395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4043156534293829395'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/03/tnxtex-macwine-145.html' title='TnXTeX mac/wine 1.4.5'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/--em_ZaSSfUE/VRKtooJ1-SI/AAAAAAAAA7o/a1YKjHvrsdM/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-25%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B9.42.58.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-2876475995803014452</id><published>2015-03-16T21:25:00.000+09:00</published><updated>2015-03-19T10:16:26.135+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X"/><category scheme="http://www.blogger.com/atom/ns#" term="tnxtex"/><category scheme="http://www.blogger.com/atom/ns#" term="tnxtex for mac"/><title type='text'>wiNXTeX(?) TnXTeX Mac/Wine 버전 (시험판)</title><content type='html'>&lt;a href=&quot;http://winebottler.kronenberg.org/&quot; target=&quot;_blank&quot;&gt;winebottler&lt;/a&gt;라는 재미있는 툴을 이용해서 TnXTeX을 bottle에 넣어봤다. 맥에서 TeX 환경을 구축하는 것은 어렵지는 않은데 시간이 제법 걸리는 일이라서 &quot;엄두&quot;를 내어야 한다. 급하게 TeX 컴파일이 필요할 때 쓸 수 있을는지도 (진짜?)...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;TnXTeX은 wine으로 실행한다. wine 자체를 app에 내장하였으므로 별도로 wine을 설치할 필요 없다. (그 대신 파일 크기가 커졌다.... 지만... MacTeX보다는...)&lt;/li&gt;&lt;li&gt;TnXTeX은 command line 프로그램이다. 따라서 &lt;u&gt;앱을 실행(더블 클릭 혹은 Cmd+down)하여도 아무 일도 일어나지 않을 수 있다&lt;/u&gt;. 사용방법은 아래 자세히 설명함.&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://ktug.kldp.net/TnXTeX/tnxtex-mac-14.zip&quot; target=&quot;_blank&quot;&gt;다운로드(zip)&lt;/a&gt;&amp;nbsp;(675M)&lt;/li&gt;&lt;li&gt;&quot;즉시 사용&quot;할 수 있도록 하는 데 초점을 두었다. &lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;사용방법(요약):&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;터미널 실행, 다운로드 후 압축해제, 압축해제한 폴더로 이동&lt;/li&gt;&lt;li&gt;sh ./StartTnX.sh&lt;/li&gt;&lt;li&gt;샘플 컴파일&lt;br /&gt;&amp;gt; C:&lt;br /&gt;&amp;gt; cd winebottler\sample&lt;br /&gt;&amp;gt; xelatex testiabout&lt;/li&gt;&lt;li&gt;새 문서 컴파일 (바탕화면에 test.tex을 만들어두고)&lt;br /&gt;&amp;gt; Z:&lt;br /&gt;&amp;gt; cd \users\&lt;span style=&quot;color: red;&quot;&gt;(USERNAME)&lt;/span&gt;\desktop&lt;br /&gt;&amp;gt; xelatex test&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;사용방법(상세설명)&lt;/b&gt;:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;다운로드받(아서 풀어놓)으면 &lt;span style=&quot;color: blue;&quot;&gt;StartTnX.sh&lt;/span&gt;과 &lt;span style=&quot;color: blue;&quot;&gt;TnXTeX14.app&lt;/span&gt;이 생긴다. 이 두 파일은 항상 같은 폴더에 있어야 한다.&lt;/li&gt;&lt;li&gt;터미널을 열고(&lt;b&gt;&lt;u&gt;반드시 터미널을 열고 작업해야 한다&lt;/u&gt;&lt;/b&gt;) StartTnX.sh을 실행한다. (TnXTeX14.app을 더블클릭하여 실행하지 않도록 주의.)&lt;br /&gt;$ &lt;span style=&quot;color: #cc0000;&quot;&gt;sh ./StartTnX.sh&lt;/span&gt;&lt;/li&gt;&lt;li&gt;최초 실행시 wine이 가상 드라이브를 비롯한 환경설정을 행하는데, 이것은 ~/Library/Application Support/ 아래 com.yourcompany.yourapp_142649632316865라는 이름의 폴더를 생성한다. 사용자가 이 폴더에 신경쓸 필요는 별로 없지만 이곳이 바로 wine cmd에서 C: 드라이브로 접근할 곳이므로 알아두면 나중에 도움이 된다.&lt;br /&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-pN11rXgHQSA/VQayvKL4R1I/AAAAAAAAA64/W0gPZk9m6sg/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B7.24.15.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-pN11rXgHQSA/VQayvKL4R1I/AAAAAAAAA64/W0gPZk9m6sg/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B7.24.15.png&quot; height=&quot;142&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;사용자의 드라이브(볼륨)은 Z:에 할당되어 있다. 그러므로 예를 들어 /Users/somebody/Desktop은 Z:\users\somebody\desktop과 같은 곳이다.&amp;nbsp;&lt;/li&gt;&lt;li&gt;설정이 다 이루어지면 cmd 프롬프트가 나타나는데 Z:\ 아래 현재 폴더를 가리키고 있을 것이다.&lt;/li&gt;&lt;li&gt;&lt;strike&gt;mktexlsr을 한 번 실행해준다.&lt;br /&gt;&amp;gt; mktexlsr&lt;/strike&gt;&lt;/li&gt;&lt;li&gt;xelatex은 바로 사용할 수 있지만(처음 실행시 폰트 캐시하는 데 조금 시간 지체가 있다) &lt;strike&gt;luatex을 위한 폰트 캐시는 직접 한 번 해주어야 한다.&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;&amp;gt; luaotfload-tool -u&lt;br /&gt;xelatex을 위한 폰트 캐시는 다음과 같이 한다.&lt;br /&gt;&amp;gt; fc-cache -v&lt;/strike&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;이제 Z:\users\somebody\Desktop (그러니까 사용자의 바탕 화면) 같은 데에 적당한 파일을 하나 만들고 컴파일해본다. xelatex과 lualatex(만)을 쓸 수 있다. pdflatex은 없다. (nanumtype1 폰트도 존재하지 않으므로 lualatex의 경우 반드시 \setmainhangulfont를 적시해야 한다. oblivoir라면 nanum 옵션을 주면 된다. TnXTeX의 설계상의 특징이다.)&lt;br /&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-1T5EpAQqfl0/VQbLcf7me9I/AAAAAAAAA7Q/5DY4XjSA3MM/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B9.23.51.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-1T5EpAQqfl0/VQbLcf7me9I/AAAAAAAAA7Q/5DY4XjSA3MM/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B9.23.51.png&quot; height=&quot;330&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;TnXTeX의 GUI 프로그램 중에서는 되는 것도 있고 안 되는 것도 있을 것이다. sumatrapdf는 잘 되는 것으로 보이지만 변경된 파일의 즉시 갱신은 윈도우즈처럼 원활하지 않으며 tinykcmenu는 되다가 안 되다가 한다. TeXworks(c:\winebottler\texworks\texworks.exe) 역시 실행은 잘 되지만 입력이 원활하지 않을 수도 있으므로...&lt;/li&gt;&lt;li&gt;권장하는 것은 에디터와 pdf 뷰어는 맥의 것을 그냥 사용하라는 것이다. 혹시 패키지 문서를 참고해야 할 일이 있으면 &lt;strike&gt;&lt;a href=&quot;http://doeun.blogspot.kr/2015/02/tnxtexdoc.html&quot; target=&quot;_blank&quot;&gt;아래 tnxtexdoc&lt;/a&gt;도 있고&lt;/strike&gt; tnxtexdoc을 실행.&lt;/li&gt;&lt;li&gt;사용자 패키지나 TnXTeX에서 찾을 수 없는 스타일/패키지/클래스 파일은 C:\winebottler\localtexmf\tex\latex 아래, 즉 ~/Library/Application Support/com.yourcompany..../drive_c/winebottler/localtexmf/tex/latex 아래 넣어두면 된다. 이 곳에 들어간 파일에 대해서는 mktexlsr할 필요 없이 바로 사용 가능.&lt;br /&gt;(이 경로를 wine cmd 상에서 찾고 복사하고 하는 것이 귀찮으면 winefile을 실행하여 탐색기처럼 작업할 수 있다.)&lt;/li&gt;&lt;li&gt;폰트는 nanum truetype, hcr-lvt, noto-sans-kr (xelatex only), kopub, tex gyre, minion/myriad pro 등이 즉시 사용 가능한데 이걸로도 모자라다면 ​3번에서 설명한 위치, 즉 ~/Library/Application Support/com.yourcompany...../drive_c/windows/Fonts 폴더로 필요한 폰트 파일(ttf/otf)을 복사하거나 symlink를 건다.&lt;/li&gt;&lt;li&gt;exit으로 wine cmd를 종료한다. 한 번 더 exit하면 터미널이 닫힌다.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;뭔가 잘 되지 않을 때&lt;/b&gt;:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;이 프로그램의 &lt;i&gt;실행성을 보증하지 않습니다&lt;/i&gt;. 시험판이므로 혹시 잘 안 되면 알려주시되, 문제를 해결해드릴 거라고 장담할 수 없습니다. (잘 돼도 알려주세요.)&lt;/li&gt;&lt;li&gt;TeX이 필요하다면&amp;nbsp;&lt;a href=&quot;http://wiki.ktug.org/wiki/wiki.php/MacOSInstall&quot; target=&quot;_blank&quot;&gt;MacTeX&lt;/a&gt;을 설치하세요.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;참고&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;TnXTeX을 새로 설치하거나 초기화: &lt;br /&gt;rm -rf ~/Library/Application\ Support/com.yourcompany.yourapp_142649632316865&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/2876475995803014452/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/03/winxtex-tnxtex-macwine.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2876475995803014452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2876475995803014452'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/03/winxtex-tnxtex-macwine.html' title='wiNXTeX(?) TnXTeX Mac/Wine 버전 (시험판)'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-pN11rXgHQSA/VQayvKL4R1I/AAAAAAAAA64/W0gPZk9m6sg/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B7.24.15.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-8710489166359094034</id><published>2015-03-16T11:26:00.001+09:00</published><updated>2015-03-16T11:53:17.671+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X"/><category scheme="http://www.blogger.com/atom/ns#" term="sumatrapdf"/><category scheme="http://www.blogger.com/atom/ns#" term="tnxtex"/><category scheme="http://www.blogger.com/atom/ns#" term="wine"/><title type='text'>Mac에서 wine을 통하여 TnXTeX을 써본다는 것</title><content type='html'>&lt;div&gt;Mac에서 TnXTeX을 쓴다는 것은 무슨 의미일까?&lt;br /&gt;TeXworks, tinykcmenu와 같은 에디터를 실행하는 것을 의미하는 것이라면, 불가능하지는 않겠다만 꼭 그렇게 해야 할 필요가 없을 뿐더러, TeXworks에서 한글 입력에 약간의 장애를 겪을 수도 있으므로 그다지...&lt;/div&gt;&lt;div&gt;TnXTeX이 설정해둔 TeX 시스템을 쓰는 것이 가능하다. 아무튼지,&lt;/div&gt;&lt;ol&gt;&lt;li&gt;homebrew로 wine 설치&lt;br /&gt;$ brew install wine&lt;br /&gt;(wine은 ​&lt;a href=&quot;http://winebottler.kronenberg.org/&quot; target=&quot;_blank&quot;&gt;winebottle&lt;/a&gt;로도 설치할 수 있으나 여기서는 homebrew 설치로 테스트.)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://wiki.ktug.org/wiki/wiki.php/TnXTeX&quot; target=&quot;_blank&quot;&gt;TnXTeX-esse&lt;/a&gt; 다운로드 &lt;br /&gt;TnXTeX-esse로 테스트하여 성공. (esse에는 lualatex과 hcr-lvt 폰트가 없다.)&lt;/li&gt;&lt;li&gt;wine으로 실행&lt;br /&gt;$ wine tnxtex-esse-1.4.4.exe&lt;/li&gt;&lt;li&gt;~/.wine/system.reg 파일을 에디터로 열어서 PATH에&lt;br /&gt;C:\\usr\\TnXTeX\\TnXTeXLive\\bin;C:\\usr\\TnXTeX\TnXTeXLive\\bin\\win32;&lt;br /&gt;를 현재 설정에 추가.&lt;/li&gt;&lt;li&gt;wine cmd를 실행하여 c:\usr\tnxtex 폴더에서 tnxtex14를 한 번 실행해준다. (최초 한 번만 실행하면 됨.)&lt;/li&gt;&lt;li&gt;wine cmd 상에서 xelatex이 잘 실행되는지 확인해본다.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;sumatrapdf 잘 실행된다. tinykcmenu와 texworks가 모두 잘 실행되지만... 실제로 편집 작업에 활용하기에는 좀 그렇다.&lt;/div&gt;&lt;div&gt;폰트 문제가 있는데 ~/.wine/drive_c/windows/Fonts 아래(wine cmd 상에서는 c:\windows\fonts) 필요한 걸 가져다두고 fc-cache하면 쓸 수 있는 듯. symlink로도 충분하다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;다음 화면을 보면 fixme:... 하는 메시지가 나오기는 하지만 xelatex이 무사히 실행되고 viewpdf를 통하여 sumatrapdf가 잘 실행되는 것을 볼 수 있다.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-XBKWYe8C-Uc/VQYZu6M19NI/AAAAAAAAA6k/-RnH7vQtfwQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B8.43.52.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-XBKWYe8C-Uc/VQYZu6M19NI/AAAAAAAAA6k/-RnH7vQtfwQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B8.43.52.png&quot; height=&quot;330&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;wine을 테스트한 것에 가깝다. 실용적으로 쓸 일은 없지 않겠는가. 그래도 어마무시한 MacTeX 없이 간단한 문서작성만 해보려면 못 써볼 것도 없겠기는 하다. 그래도 에디터와 pdf 뷰어는 역시 맥의 것이 좋으니까... 컴파일만 TnXTeX으로 하는 것.&lt;br /&gt;TnXTeX은 multimarkdown 설정을 함께 제공하고 wine cmd에서 mmd2tex이 동작한다.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/8710489166359094034/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/03/mac-wine-tnxtex.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/8710489166359094034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/8710489166359094034'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/03/mac-wine-tnxtex.html' title='Mac에서 wine을 통하여 TnXTeX을 써본다는 것'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-XBKWYe8C-Uc/VQYZu6M19NI/AAAAAAAAA6k/-RnH7vQtfwQ/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-03-16%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B8.43.52.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-7100194746882872670</id><published>2015-02-28T15:35:00.001+09:00</published><updated>2015-02-28T15:37:08.513+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tnxtexdoc"/><title type='text'>tnxtexdoc 맥 버전</title><content type='html'>TnXTeX을 위해 &lt;a href=&quot;http://www.ktug.org/xe/index.php?document_srl=202637&amp;amp;mid=KTUG_open_board&quot; target=&quot;_blank&quot;&gt;tnxtexdoc을 만들었다&lt;/a&gt;. 원래 배치파일이었던 것이고 GUI를 씌운 것에 불과하다. 하는 일이래야 그냥 url을 열어주는 것이 전부지만 texdoc을 쓸 수 없을 TnXTeX에서는 가끔 요긴하게 쓰일 때가 있을 것이다.&lt;br /&gt;&lt;br /&gt;맥에서는 대부분 MacTeX을 통해 텍 작업을 할 것이므로 사실 이런 건 필요가 없다. 그러나 TeX이 설치되지 않은 기계에서 sagemath같은 걸로 작업을 하다가 패키지 문서를 참조해야 할 때가 있다. 그래서 Mac용으로 빌드해봤다.&lt;br /&gt;&lt;br /&gt;이 유틸리티의 또다른 장점으로는 KTUG 문서를 읽을 수 있게 해준다는 것이다. 지금은 latex4all과 latex4wp-ko만 등록되어 있지만 앞으로 유용한 한글 문서를 바로 읽을 수 있도록 기능을 확장해갈 생각이다.&lt;br /&gt;&lt;br /&gt;다운로드: &lt;a href=&quot;https://www.dropbox.com/s/gqs4xu9ja28r4p9/tnxtexdoc.zip?dl=1&quot; target=&quot;_blank&quot;&gt;tnxtexdoc (zip)&lt;/a&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-qCUdnGdLunc/VPFhl0gbaKI/AAAAAAAAA4c/-ufw4yxzFrk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-28%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B3.34.33.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-qCUdnGdLunc/VPFhl0gbaKI/AAAAAAAAA4c/-ufw4yxzFrk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-28%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B3.34.33.png&quot; height=&quot;204&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/7100194746882872670/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/tnxtexdoc.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7100194746882872670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7100194746882872670'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/tnxtexdoc.html' title='tnxtexdoc 맥 버전'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-qCUdnGdLunc/VPFhl0gbaKI/AAAAAAAAA4c/-ufw4yxzFrk/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-28%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B3.34.33.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-3078436940594540252</id><published>2015-02-25T00:30:00.000+09:00</published><updated>2015-02-25T00:30:04.212+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX Tips"/><category scheme="http://www.blogger.com/atom/ns#" term="TikZ"/><title type='text'>tikz로 node 그리기</title><content type='html'>&lt;a href=&quot;http://www.ktug.org/xe/index.php?document_srl=202496&amp;amp;mid=KTUG_QnA_board&quot; target=&quot;_blank&quot;&gt;KTUG의 어떤 질문글&lt;/a&gt;을 보니 Mathmode 문서의 p.123에 있는 다음 그림과 같은 것을 구현해보고 싶다는 것이 있었다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-8silT_YkLlg/VOyWWajSq3I/AAAAAAAAA38/BHPP57yXJLA/s1600/%ED%99%94%EB%A9%B4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-8silT_YkLlg/VOyWWajSq3I/AAAAAAAAA38/BHPP57yXJLA/s1600/%ED%99%94%EB%A9%B4.png&quot; height=&quot;187&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;이 비슷한 것을 &lt;a href=&quot;http://www.texample.net/tikz/examples/global-nodes/&quot; target=&quot;_blank&quot;&gt;TikZ로 하는 것에 대한 샘플은 texample.net&lt;/a&gt;에서 찾을 수 있다. 다음 그림과 같은 것이다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-bIpN5Hv3vMc/VOyXQbKYxJI/AAAAAAAAA4E/BLq7XZzd9yc/s1600/%ED%99%94%EB%A9%B4-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-bIpN5Hv3vMc/VOyXQbKYxJI/AAAAAAAAA4E/BLq7XZzd9yc/s1600/%ED%99%94%EB%A9%B4-1.png&quot; height=&quot;106&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;응용하면 간단히 구현할 수 있다. 혹시 나중에라도 참고가 될는지 몰라서 여기 소스를 남겨둔다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkZi01Z1lHV1pJSzA/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;소스 (tex)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-8U1fPtqhS_o/VOyYBzOPBuI/AAAAAAAAA4M/TksuW7u90rE/s1600/%ED%99%94%EB%A9%B4-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-8U1fPtqhS_o/VOyYBzOPBuI/AAAAAAAAA4M/TksuW7u90rE/s1600/%ED%99%94%EB%A9%B4-2.png&quot; height=&quot;151&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/3078436940594540252/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/tikz-node.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3078436940594540252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3078436940594540252'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/tikz-node.html' title='tikz로 node 그리기'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-8silT_YkLlg/VOyWWajSq3I/AAAAAAAAA38/BHPP57yXJLA/s72-c/%ED%99%94%EB%A9%B4.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-4932944373527279978</id><published>2015-02-24T13:53:00.000+09:00</published><updated>2015-02-24T13:55:23.400+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="KoreanUCS"/><category scheme="http://www.blogger.com/atom/ns#" term="LyX"/><title type='text'>LyX 2.1.3 KoreanUCS (Mac)</title><content type='html'>&lt;a href=&quot;http://ktug.kldp.net/LyX2.1/LyX-2.1.3-karnes.zip&quot; target=&quot;_blank&quot;&gt;* 다운로드 LyX-2.1.3-karnes.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* 배포를 위한 자원을 KLDP.NET에서 제공하고 있습니다.&lt;br /&gt;* Windows/Linux에서 KoreanUCS 설정은 2.1.2 버전과 동일합니다. &lt;a href=&quot;http://doeun.blogspot.kr/2014/10/lyx-212-koreanucs.html&quot; target=&quot;_blank&quot;&gt;참고&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/4932944373527279978/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/lyx-213-koreanucs-mac.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4932944373527279978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4932944373527279978'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/lyx-213-koreanucs-mac.html' title='LyX 2.1.3 KoreanUCS (Mac)'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-4679065259907129000</id><published>2015-02-16T08:14:00.002+09:00</published><updated>2015-02-18T06:19:27.097+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="KTUG"/><category scheme="http://www.blogger.com/atom/ns#" term="문서"/><category scheme="http://www.blogger.com/atom/ns#" term="연분수"/><title type='text'>fraction 매크로의 구현</title><content type='html'>지난 주말에 &lt;a href=&quot;http://www.ktug.org/xe/199037&quot; target=&quot;_blank&quot;&gt;ktug 게시판에서 이러이러한 대화&lt;/a&gt;가 있었다. 작나 님이 2007년도 AJT에 소개된 &quot;연분수 자동 조판&quot;을 다시 소개한 것, 그것을 expl3으로 옮기는 문제에 대한 토론.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://ktug.org/~sjnam/pdfs/sjnam.pdf&quot; target=&quot;_blank&quot;&gt;연분수 자동 조판이란 논문은&lt;/a&gt; 그것을 읽을 당시에도 그랬지만 고급 TeX 프로그래밍 기법이 소개되는 훌륭한 글이다. TeX 프로그래밍을 생각하고 있다면 반드시 읽어보아야 한다.&lt;br /&gt;&lt;br /&gt;아무튼 그 대화의 연장선 상에서 쓴 글. 원논문의 \fraction이라는 매크로를 expl3로 고쳐쓴다면 어떻게 될 것인가에 대한 내용이다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkamN2VXhBaTdXVE0/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;\fraction 매크로의 구현 (pdf)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkN3F6VnNmTGxOTWM/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;소스 (tex)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/4679065259907129000/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/fraction.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4679065259907129000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4679065259907129000'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/fraction.html' title='fraction 매크로의 구현'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-552466615314272968</id><published>2015-02-13T10:30:00.000+09:00</published><updated>2015-03-13T10:01:02.987+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mmd-korean"/><category scheme="http://www.blogger.com/atom/ns#" term="multimarkdown"/><category scheme="http://www.blogger.com/atom/ns#" term="일괄 설치"/><title type='text'>Mac OS에서 MultiMarkdown과 mmd-korean 일괄 설치</title><content type='html'>스크리브너+멀티마크다운+mmd-korean으로 한글 LaTeX 문서를 작성하는 시연을 해보고자 했는데, 의외로 설치 과정이 복잡하다는 느낌.&lt;br /&gt;아무리 잘 설명해둬도 일단 몇 단계를 거쳐야 한다면 피곤한 일이다.&lt;br /&gt;&lt;br /&gt;Mac OS X에서 스크리브너를 설치하는 것은 어쩔 수 없이 App Store나 스크리브너 홈페이지를 이용할 수밖에 없겠지만, 멀티마크다운을 설치하고 거기에 한글 문서를 위한 약간의 파일을 추가하는 것은 여기저기 왔다갔다 해야 하고 귀찮다.&lt;br /&gt;&lt;br /&gt;&quot;새 기계 오면 못 쓰겠구만&quot; 하시는 말씀에 자극을 받아서, 간단한 일괄처리 파일을 만들어둔다.&lt;br /&gt;curl과 unzip, git이 필요한데 이거는 Mac에 다 있겠지.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;#!/bin/sh&lt;br /&gt;curl -O http://files.fletcherpenney.net.s3.amazonaws.com/MultiMarkdown-Mac-4.7.1.dmg&lt;br /&gt;open ./MultiMarkdown-Mac-4.7.1.dmg&lt;br /&gt;curl -O http://files.fletcherpenney.net.s3.amazonaws.com/MultiMarkdown-Support-Mac.zip&lt;br /&gt;unzip MultiMarkdown-Support-Mac.zip&lt;br /&gt;open ./MultiMarkdown-Support-Mac-4.6.pkg&lt;br /&gt;git clone https://github.com/fletcher/peg-multimarkdown-latex-support.git&lt;br /&gt;curl -O https://dl.dropboxusercontent.com/s/wosuxng9h14sbce/mmd-korean.zip&lt;br /&gt;unzip mmd-korean.zip&lt;br /&gt;f=`kpsewhich --var-value=TEXMFHOME`&lt;br /&gt;mkdir -p $f/tex/latex&lt;br /&gt;mv peg-multimarkdown-latex-support $f/tex/latex/&lt;br /&gt;mv mmd-korean $f/tex/latex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;다운로드: &lt;a href=&quot;https://drive.google.com/file/d/0B2evjrJ95hHKMHE0ZDU3QVVyTlE/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;getmmd.sh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;터미널에서 sh ./get-mmd-korean.sh 하면 멀티마크다운부터 mmd-korean까지 설치 과정을 진행한다. 중간에 설치 안내 창이 뜨면 보통 pkg 파일을 설치하듯이 진행하면 되겠다.&lt;br /&gt;물론 MacTeX은 설치되어 있어야 한다.&lt;br /&gt;&lt;br /&gt;(현재 MultiMarkdown 최신 버전인 4.6을 깔도록 되어 있다. 나중에 버전이 바뀌면 해당 부분만 수정하면 될 터이다.)&lt;br /&gt;&lt;br /&gt;// 2015/03/13. version 4.7.1 반영.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/552466615314272968/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/mac-os-multimarkdown-mmd-korean.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/552466615314272968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/552466615314272968'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/mac-os-multimarkdown-mmd-korean.html' title='Mac OS에서 MultiMarkdown과 mmd-korean 일괄 설치'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-7757514526245065153</id><published>2015-02-10T15:00:00.002+09:00</published><updated>2015-02-22T08:40:27.455+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux Mint"/><category scheme="http://www.blogger.com/atom/ns#" term="TeX Live"/><category scheme="http://www.blogger.com/atom/ns#" term="tlmgr"/><category scheme="http://www.blogger.com/atom/ns#" term="tlmgr usermode"/><title type='text'>Linux Mint Rebecca에서 LaTeX 작업 환경 구축하기</title><content type='html'>데비안/우분투 계열 리눅스에서 라텍 작업환경을 구축하는 문제에 대하여 그 동안 KTUG 등에서 권유해온 방법은 배포판 패키지를 이용하지 말고 TeX Live를 별도로 설치하라는 것이었다. 사실 속편하고 좋기는 한데, 다음과 같은 몇 가지 불편한 점이 있다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;패키지 의존성 때문에 발생하는 문제. texlive-dummy 패키지를 만들어서 피해가는 방법이 있으나 왠지 좀 거시기하다.&lt;/li&gt;&lt;li&gt;설치하는 데 꽤 시간이 많이 걸리고 업데이트 등을 별도로 하여야 한다.&lt;/li&gt;&lt;/ol&gt;그래서 배포판 패키지를 이용하면 안 될려나 고민해보게 되었다. 이 때 문제가 되는 것은 대부분 배포판에서 제공하는 texlive가 좀 지난 버전이라는 것. 예컨대 이 글을 쓰고 있는 현재 Linux Mint 17의 배포판 패키지는 TeX Live 2013의 2014년 2월 패키징된 버전이다. 그러므로 아주 최신 버전이 반드시 필요한 경우라면 이것저것 생각할 것 없이 TeX Live를 별도설치하는 편이 낫다.&lt;br /&gt;&lt;br /&gt;일반 사용자의 입장에서 그렇게까지 할 필요는 없을 것이다. 그렇지만 한글 패키지들(ko.TeX 관련 패키지)이 이 배포판에 들어 있기는 하나 역시 TeX Live 2014에 포함된 것과 버전 차이가 존재해서 경우에 따라 최신 버전을 필요로 한다. 예컨대 oblivoir의 \setkomainfont 명령을 이 버전으로는 쓸 수 없으며 XeLaTeX에서 나눔글꼴이 &quot;기본&quot; 글꼴로 되는 xetexko의 기능도 동작하지 않는다.&lt;br /&gt;그리고 한글 문서 작성과 관련해서는 KTUG 사설 저장소를 무시할 수 없다. jiwonlipsum 등 몇몇 패키지를 설치해야 한다.&lt;br /&gt;&lt;br /&gt;이 두 가지 문제를 tlmgr의 usermode라는 것으로 해결해보기로 하자. 즉, 이 글에서 제시하는 것은 다음과 같이 하자는 것이다. 내가 보기에 이 방식이 가장 편하고 빠르고 쉽다고 생각한다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;texlive 자체는 배포판 패키지로 설치한다.&lt;/li&gt;&lt;li&gt;몇 가지 최신화가 필요한 패키지들과 KTUG 사설 저장소 패키지를 tlmgr의 usermode로 설치하고 운영한다.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;(1) TeX Live 설치&lt;/b&gt;&lt;br /&gt;texlive-full 패키지가 있다. 이거 한 방이면 다 되니까 그냥 설치하면 되기는 하는데 시간이 좀 걸리는 것은 각오해야 한다. 나는 필요하면 나중에 설치할 생각으로 우선 다음 몇 개의 패키지만 깔았다.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;texlive-latex-base, texlive-xetex, texlive-luatex&lt;/li&gt;&lt;li&gt;texlive-latex-recommended, texlive-fonts-recommended&lt;/li&gt;&lt;li&gt;fonts-lmodern, fonts-texgyre&lt;/li&gt;&lt;li&gt;texlive-lang-cjk&lt;/li&gt;&lt;li&gt;texlive-latex3&lt;/li&gt;&lt;/ul&gt;TL 2013에는 (아직) texlive-lang-korean이 없다. 그냥 texlive-lang-cjk로 설치해야 한다. 조금 더 확장해서 texlive-latex-extra와 texlive-generic-extra까지 설치하면 좋다. math, humanities, picture, music, game 등 다른 texlive 패키지들은 필요해질 때 apt-get하자.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) tlmgr usermode의 활용&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;다음 순서로 진행한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ sudo apt-get install xzdec&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ tlmgr --usermode init-usertree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그 뒤는 --usermode 옵션을 붙이는 것인데 다만 pinning할 때는 조금 주의할 것이 있다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ tlmgr --usermode repository add http://ftp.ktug.org/KTUG/texlive/tlnet ktug&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ sudo tlmgr --usermode pinning add ktug &quot;*&quot;&lt;/span&gt;&lt;br /&gt;여기서 sudo를 한 번 써야 한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ tlmgr --usermode install fontspec xetexko luatexko kotex-plain kotex-oblivoir cjk-ko&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;kotex-utils는 usermode로 설치할 수 없다. relocate할 수 없기 때문이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ tlmgr --usermode install jiwonlipsum kswrapfig hcr-lvt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;사설 저장소를 활성화했기 때문에 필요하다면 kotex-euc도 바로 설치할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;업데이트는 usermode로 설치한 것만 한다. --self는 의미없음.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&lt;span style=&quot;color: black;&quot;&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ tlmgr --usermode update --all &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) 기타&lt;/b&gt;&lt;br /&gt;에디터는 emacs, vim (gvim)도 좋고 latexila도 나쁘지 않다고 본다. texworks는 launchpad의 것을 설치하는 편을 권장.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/7757514526245065153/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/linux-mint-rebecca-latex.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7757514526245065153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/7757514526245065153'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/linux-mint-rebecca-latex.html' title='Linux Mint Rebecca에서 LaTeX 작업 환경 구축하기'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-2915113882022101363</id><published>2015-02-08T14:32:00.002+09:00</published><updated>2015-02-08T15:11:39.151+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="knitr"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX"/><category scheme="http://www.blogger.com/atom/ns#" term="LyX"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><category scheme="http://www.blogger.com/atom/ns#" term="Sweave"/><title type='text'>LyX에서 Sweave/knitr.</title><content type='html'>LaTeX과 R을 연동하여 동적 문서를 만드는 이야기의 마지막 포스팅이 될 듯.&lt;br /&gt;&lt;br /&gt;LyX 최근 버전에 Sweave 또는 knitr 모듈이 들어 있어서 이 일을 즉시 할 수 있다. 좋다면 좋은 기능이다. LyX 2.1.2에서 테스트. R보다 LyX을 먼저 설치했다면 LyX을 한 번 Reconfigure한다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Document -&amp;gt; Settings -&amp;gt; Modules에서 Rnw (knitr) 모듈이나 Sweave 모듈을 포함한다. 둘 중 하나만 쓰는 것이 좋다.&lt;/li&gt;&lt;li&gt;문서에 R (knitr) chunks를 넣으려면 메뉴에서 Insert -&amp;gt; Custom Insets 아래 Chunks나 S/R expression을 쓰면 된다.&lt;/li&gt;&lt;li&gt;작성한 문서를 Rnw로 내보낼 수 있다. File -&amp;gt; Export -&amp;gt;...&lt;/li&gt;&lt;/ol&gt;간단한 샘플로 만들어보았다. &lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkN1dIZFl6U294Skk/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;Download:clt3.lyx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ltR1-tLmpiA/VNb045XWfEI/AAAAAAAAA3U/n9RBNC58PxQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-08%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B1.44.55.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-ltR1-tLmpiA/VNb045XWfEI/AAAAAAAAA3U/n9RBNC58PxQ/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-08%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B1.44.55.png&quot; height=&quot;250&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;이 샘플이 LyX에서 성공적으로 돌려면,&lt;br /&gt;&lt;ol&gt;&lt;li&gt;R 설치, LyX Reconfigure.&lt;/li&gt;&lt;li&gt;knitr package를 인스톨하고 (R 콘솔에서&lt;span style=&quot;color: red;&quot;&gt; install.packages(&#39;knitr&#39;)&lt;/span&gt;. )&lt;/li&gt;&lt;li&gt;Sweave 패키지를 TeX Live에 알려주어야 한다. 이 문제에 대해서는 &lt;a href=&quot;http://doeun.blogspot.kr/2015/02/textmate-sweavelatex-mac.html&quot; target=&quot;_blank&quot;&gt;앞선 포스팅&lt;/a&gt;의 &quot;texmf 통합&quot; 부분을 참고.&lt;/li&gt;&lt;/ol&gt;note. 이 샘플 예제는 KoreanUCS 언어를 사용하고 있으므로 만약 이 설정을 하지 않은 원본 LyX이라면 Language를 Unicode (XeTeX)으로 하여야 한다. oblivoir layout도 설치하지 않았다면 article로 고치되 kotex 패키지를 별도로 얹어야 할 것이다.&lt;br /&gt;&lt;br /&gt;개인적인 감상이지만 LyX을 일상적으로 사용하지 않는 나로서 이것이 나름 편리한 점이 있음에도 불구하고 큰 매력을 느끼지 못하였다. 나만 그런가 모르겠는데 LyX에서 insets 방식으로 &lt;i&gt;코드&lt;/i&gt;를 넣을 때마다 이쪽 세상과 저쪽 세상을 오가는 거 같은 느낌이 들어서 별로다. knitr 모듈의 경우 S/R expression (즉 \Sexpr)은 문장 중간에 들어가는 건데 단축키를 못 찾아서 메뉴질을 해야 했다. (혹시 단축키나 쉬운 insets 방법을 아시는 분을 알려주시기를.) 그러나 LyX 좋아하시는 분들에게는 오히려 편리하게 느껴질 수 있을 것이다. 취향과 익숙함의 문제일 뿐. &lt;br /&gt;&lt;ol&gt;&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/2915113882022101363/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/lyx-sweaveknitr.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2915113882022101363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/2915113882022101363'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/lyx-sweaveknitr.html' title='LyX에서 Sweave/knitr.'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ltR1-tLmpiA/VNb045XWfEI/AAAAAAAAA3U/n9RBNC58PxQ/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-08%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B1.44.55.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-1357344154215692282</id><published>2015-02-07T15:22:00.000+09:00</published><updated>2015-02-07T15:32:16.983+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Keyboard Shortcut"/><category scheme="http://www.blogger.com/atom/ns#" term="Mac"/><category scheme="http://www.blogger.com/atom/ns#" term="커서 이동"/><title type='text'>맥에서 입력 포인터 이동</title><content type='html'>맥을 써본 지 꽤 된 것 같은데도 아직 낯선 커서 이동키, 삭제키, 스크롤 키...&lt;br /&gt;&lt;br /&gt;&lt;u&gt;(0) Delete&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Delete = 왼쪽 글자 지움 &lt;ul&gt;&lt;li&gt;Ctrl-D&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;fn+Delete = 오른쪽 문자 지움 (Windows의 Del)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ctrl-H &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Option+Delete = 왼쪽 단어 삭제&lt;/li&gt;&lt;li&gt;fn+Option+Delete = 오른쪽 단어 삭제&lt;/li&gt;&lt;li&gt;Ctrl+K = 현재 위치에서 행끝까지 삭제. Kill.&lt;/li&gt;&lt;!-----&gt;&lt;/ul&gt;&lt;u&gt;(1) Scroll: PgUp, PgDn, Home, End&lt;/u&gt;&lt;br /&gt;스크롤 키이므로 입력 포인터를 이동시키는 것이 아니다. &lt;u&gt;커서 위치는 고정되어 있고 화면만 움직이는 것&lt;/u&gt;. 예를 들어 한 화면에 모든 내용이 다 보이는 상태(즉 스크롤 필요가 없는 상태)라면 다음 키는 작동하지 않는다. PageUp, PageDown, Home, End 키가 있는 키보드로 작업하는 경우 주의. 맥에서 이 키들은 &quot;입력 포인터&quot; 이동키가 아니라 단지 스크롤 키일 뿐이다. 즉 PgDn으로 한참 내려서 원하는 텍스트를 찾았다 해도 커서를 움직이면 다시 아까 그 자리...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fn+UpArrow = PgUp (Scroll Up)&lt;/li&gt;&lt;li&gt;fn+DnArrow = PgDn (Scroll Down)&lt;/li&gt;&lt;li&gt;fn+Left = Home (Scroll to Beginning)&lt;/li&gt;&lt;li&gt;fn+Right = End (Scroll to End)&lt;/li&gt;&lt;/ul&gt;&lt;u&gt;(2) 텍스트 입력 포인터 이동&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;문서의 처음과 끝으로 이동&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Cmd+Up&lt;/li&gt;&lt;li&gt;Cmd+Dn&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;행의 처음과 끝으로 이동&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Cmd+Left&lt;/li&gt;&lt;li&gt;Cmd+Right&lt;/li&gt;&lt;li&gt;Option+Up&amp;nbsp; 먼저 행처음으로 이동하고 그 후로는 이전 행(단락)의 처음.&lt;/li&gt;&lt;li&gt;Option+Dn 먼저 행끝으로 이동하고 그 후로는 다음 행(단락)의 끝.&lt;/li&gt;&lt;li&gt;Ctrl+A: 행의 처음으로. Cmd+Left와 달리 한 행이 여러 줄로 표시되고 있는(Wordwrap) 경우 그 문단의 처음까지 간다. (Cmd+Left가 듣지 않는 터머널에서 유용.)&lt;/li&gt;&lt;li&gt;Ctrl+E: 행의 마지막으로. Cmd+Right와 달리 한 행이 여러 줄로 표시되는 경우 그 문단의 끝까지 간다.(Cmd+Right가 듣지 않는 터미널에서 유용.)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;행/단락 사이의 이동&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Dn : 다음 행&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ctrl+N 다음 행 Next.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Up : 이전 행&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ctrl+P 이전 행 Previous.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Ctrl+V : PageDown과 비슷함. 아래로 이동. 커서가 이동하는 것으로 Scroll이 아님.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;글자/단어 사이의 이동&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Right, Left: 글자 단위로 이동&lt;/li&gt;&lt;li&gt;Option+Right, Option+Left: 단어 단위로 이동. 앞단어의 처음 또는 다음 단어의 끝으로 이동&lt;/li&gt;&lt;li&gt;Ctrl+F : 다음 글자 (=Right). Forward&lt;/li&gt;&lt;li&gt;Ctrl+B : 이전 글자 (=Left). Backward&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/1357344154215692282/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/blog-post.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1357344154215692282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1357344154215692282'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/blog-post.html' title='맥에서 입력 포인터 이동'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-6493464973402237651</id><published>2015-02-07T12:01:00.000+09:00</published><updated>2015-02-07T12:09:48.384+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arara"/><category scheme="http://www.blogger.com/atom/ns#" term="knitr"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><category scheme="http://www.blogger.com/atom/ns#" term="Sweave"/><category scheme="http://www.blogger.com/atom/ns#" term="TeXshop"/><category scheme="http://www.blogger.com/atom/ns#" term="Textmate"/><title type='text'>knitr Rnw 문서의 처리, TextMate, TeXShop, arara</title><content type='html'>박재성 박사께서 시연하신 바, R과 LaTeX을 결합한 문서작성의 샘플, &lt;a href=&quot;http://wiki.ktug.org/wiki/wiki.php/KTSConference/2015?action=download&amp;amp;value=CLT2.Rnw&quot; target=&quot;_blank&quot;&gt;CLT2.Rnw&lt;/a&gt;를 처리하는 문제.&lt;br /&gt;&lt;br /&gt;일단 이 파일은 Sweave Rnw가 아니라 &lt;a href=&quot;http://yihui.name/knitr/&quot; target=&quot;_blank&quot;&gt;knitr&lt;/a&gt; Rnw이다. 그래서 앞선 글들에서 말한 Sweave로 호출하면 knitr 관련 에러(opts_chunk가 없다는 에러)가 발생한다.&lt;br /&gt;knitr는 R에서 CRAN을 통하여 설치해둔다.&lt;br /&gt;&lt;br /&gt;명령행에서 knitr Rnw를 처리하기 위해서는 Rscript를 사용한다. 기본 형식은 다음과 같다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;$ Rscript -e &quot;library(knitr); knit(&#39;foo.Rnw&#39;)&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) 예제 파일의 정리&lt;/b&gt;&lt;br /&gt;일단 CLT2.Rnw의 preamble을 좀 정리했다. preamble을 따로 떼어내고 글꼴을 바꾸는 식으로 아주 약간 정리. 다른 것은 모두 원본과 동일하다. &lt;a href=&quot;https://drive.google.com/file/d/0ByUakjGSRUEkUlVRS0p3X0VvSWs/view?usp=sharing&quot; target=&quot;_blank&quot;&gt;CLT2.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) TextMate&lt;/b&gt;&lt;br /&gt;Knitr Bundle을 구하여 설치한다. &lt;a href=&quot;https://github.com/fonnesbeck/knitr.tmbundle&quot; target=&quot;_blank&quot;&gt;여기(github)에 있는데&lt;/a&gt;, 안내대로 다음과 같이 하면 간단히 된다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ mkdir -p ~/Library/Applications\ Support/Avian/Bundles/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ cd ~/Library/Applications\ Support/Avian/Bundles&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;$ git clone https://github.com/fonnesbeck/knitr.tmbundle.git&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;cloning이 완료된 후에 TextMate를 재실행한다.&lt;br /&gt;&lt;br /&gt;요세미티에서, PATH 문제를 해결해주어야 한다. Bundles -&amp;gt; Edit Bundles -&amp;gt; knitr -&amp;gt; Menu Actions -&amp;gt; Knit, Typeset &amp;amp; View 스크립트의 2행에 다음 한 줄을 써넣고 저장하면 될 거다. (R은 home brew로 설치하였다.)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;export PATH=/usr/texbin:/usr/local/bin:$PATH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;다른 메뉴에서도 r이나 osascript, Rscript 등을 부르는 것이 있다면 위와 같이 해두는 것이 안전하리라 본다.&lt;br /&gt;&lt;br /&gt;이제 Rnw 파일을 열고 (Sweave 번들도 설치한 경우 Rnw가 SWeave로 열린다. Bundle item을 knitr로 지정) Option-P를 누르면 완성.&lt;br /&gt;&lt;br /&gt;XeLaTeX이 실행되도록 하는 magic comment는 다음과 같다. (등호 좌우에 스페이스 없이.)&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;% -*- program=xelatex -*- &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) TeXShop, arara&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;/usr/local/bin에 knitRnw 셸 스크립트를 만들었다. 내용:&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;#!/bin/sh&lt;br /&gt;exec Rscript -e &quot;library(&#39;knitr&#39;); knit(&#39;${1%.*}.Rnw&#39;)&quot;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;arara rules로 knitr.yaml을 만들었다. 내용:&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;!config&lt;br /&gt;identifier: knitr&lt;br /&gt;name: knitr&lt;br /&gt;command: &amp;lt;arara&amp;gt;&lt;arara&gt; knitRnw &quot;@{getBasename(file)}&quot;.Rnw&lt;br /&gt;arguments: []&lt;/arara&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;arara 지시어는 간단히 다음과 같이 한다.&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;% arara: knitr&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: red;&quot;&gt;% arara: xelatex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;그림은 TextMate에서 knitting하고 있는 것이다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-osnb4WMdEp0/VNV-OQaYOBI/AAAAAAAAA3E/sJr_tflrJh0/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-07%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B11.52.47.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-osnb4WMdEp0/VNV-OQaYOBI/AAAAAAAAA3E/sJr_tflrJh0/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-07%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B11.52.47.png&quot; height=&quot;201&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;사실 Rnw 파일을 다루는 가장 편한 툴은 &lt;a href=&quot;http://www.rstudio.com/&quot; target=&quot;_blank&quot;&gt;RStudio&lt;/a&gt;가 아닐까 싶다. 그러나 LaTeX 작업은 예컨대 TeXShop에서 하고 Rnw는 RStudio에서 하고 하는 것이 불편한 분들에게는 참고가 될 성싶기도 하다. 전해들은 바에 의하면 RStudio가 다 좋은데 편집 기능 자체가 조금 딸린다는 얘기도 있고... 아무튼간에 이 글 자체가 Sublime Text에서 하는 걸 TextMate에서도 할 수 있다는 걸 보이고 싶어서 시작한 것이기도 하니까.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/6493464973402237651/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/knitr-rnw-textmate-texshop-arara.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/6493464973402237651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/6493464973402237651'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/knitr-rnw-textmate-texshop-arara.html' title='knitr Rnw 문서의 처리, TextMate, TeXShop, arara'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-osnb4WMdEp0/VNV-OQaYOBI/AAAAAAAAA3E/sJr_tflrJh0/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-07%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B11.52.47.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-4931181790532736306</id><published>2015-02-07T06:20:00.001+09:00</published><updated>2015-02-07T06:20:05.589+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="command line image processiong tool"/><category scheme="http://www.blogger.com/atom/ns#" term="ImageMagick convert"/><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X"/><category scheme="http://www.blogger.com/atom/ns#" term="sips"/><title type='text'>명령행 그림 변환 (Mac)</title><content type='html'>그 동안 ImageMagick convert에 너무 의존했던 것은 아닌가 싶다. 한때 MacTeX만 설치해도 convert가 (당연히?) 있던 시절에 든 버릇이다.&lt;br /&gt;&lt;br /&gt;그런데 지금은 convert는 대부분 없다. home brew같은 걸로 별도로 설치해야 한다.&lt;br /&gt;&lt;br /&gt;그림의 변환, 예를 들면 TIFF  그림을 PNG로 바꾸는 것 같은 작업을 convert가 없는 맥에서 하려면? 가장 쉬운 거는 Preview에서 포맷을 지정하여 저장하는 것이겠는데, 이런저런 작업을 하다 보면 GUI를 띄우는 것이 피곤할 때가 많다.&lt;br /&gt;&lt;br /&gt;Preview의 명령행 버전이라고 할 수 있는 sips를 이용하자. sips는 Mac OS의 이미지 처리 시스템의 일부이다. 애당초 Applescript에서 쓰라고 만들어둔 것일지도.&lt;br /&gt;&lt;br /&gt;포맷 변환&lt;br /&gt;&lt;br /&gt;$ sips -s format &lt;span style=&quot;color: blue;&quot;&gt;png&lt;/span&gt; &lt;span style=&quot;color: #cc0000;&quot;&gt;foo.tiff&lt;/span&gt; --out &lt;span style=&quot;color: #cc0000;&quot;&gt;foo.png&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;일부 png 그림에 대해서 libpng warning: iCCP 어쩌구... 하는 메시지가 보이는 경우가 있다.&lt;br /&gt;--out 옵션을 주지 않으면 해당 파일 자체에 변경이 가해진다. &lt;br /&gt;&lt;br /&gt;$ sips --deleteColorManagementProperties foo.png ( --out bar.png )&lt;br /&gt;&lt;br /&gt;Clockwise로 회전&lt;br /&gt;&lt;br /&gt;$ sips -r 90 foo.png&lt;br /&gt;&lt;br /&gt;flip&lt;br /&gt;&lt;br /&gt;$ sips -f horizontal foo.png&lt;br /&gt;&lt;br /&gt;cropping (-c height width)&lt;br /&gt;&lt;br /&gt;$ sips -c 100 200 foo.png&lt;br /&gt;&lt;br /&gt;등등...&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/4931181790532736306/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/mac.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4931181790532736306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/4931181790532736306'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/mac.html' title='명령행 그림 변환 (Mac)'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-3160164042370455311</id><published>2015-02-05T12:58:00.001+09:00</published><updated>2015-02-05T12:59:47.802+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="arara"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><category scheme="http://www.blogger.com/atom/ns#" term="Sweave"/><category scheme="http://www.blogger.com/atom/ns#" term="TeXshop"/><title type='text'>Sweave+LaTeX, TeXShop, arara</title><content type='html'>아랫글에 이어서.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) Rnw 확장명 파일에 대한 rule.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이것은 $HOME/araraconfig.yaml에 다음 내용을 추가해야 한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;filetypes:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;- extension: Rnw&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&amp;nbsp; pattern: ^(\s)*%\s+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;전체 araraconfig.yaml은 다음과 같은 모양이 된다.&lt;br /&gt;&lt;br /&gt;!config&lt;br /&gt;paths:&lt;br /&gt;- /Users/&amp;lt;UserName&amp;gt;/yaml/arararules&lt;br /&gt;filetypes:&lt;br /&gt;- extension: Rnw&lt;br /&gt;&amp;nbsp; pattern: ^(\s)*%\s+&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) Sweave.yaml&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;araraconfig.yaml에 paths를 설정해둔 위치(위의 경우 ~/yaml/arararules)에 Sweave.yaml을 만들어넣는다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;!config&lt;br /&gt;identifier: Sweave&lt;br /&gt;name: Sweave&lt;br /&gt;command:&lt;br /&gt;- &lt;arara&gt; R CMD Sweave --encoding=utf8 &quot;@{getBasename(file)}&quot;.Rnw&lt;br /&gt;arguments: []&lt;/arara&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;일단 여기까지 만든 상태에서 test.Rnw 파일을 arara로 처리할 때, 예컨대&lt;br /&gt;&lt;br /&gt;$ arara test.Rnw&lt;br /&gt;&lt;br /&gt;이렇게 실행하면 약간 문제가 생긴다. 그 대신 확장자 없이 arara test라고만 하면 성공적으로 실행된다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) TeXShop arara engine 수정&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;따라서 TeXShop의 arara engine 파일에서 확장자를 넘겨주지 않도록 수정하자.&lt;br /&gt;이 파일은 ~/Library/TeXShop/Engines 폴더에 있어야 한다. arara.engine 파일의 내용을 다음과 같이 수정한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;export PATH=/usr/texbin:/usr/local/bin:$PATH&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;arara -v &quot;${1%.*}&quot;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;설정은 끝났다. 이제 test.Rnw를 TeXShop으로 열어서 문서의 처음에 다음과 같이 arara directives를 써넣는다. (TeXShop에서 arara를 설정하는 방법에 대해서는 &lt;a href=&quot;http://doeun.blogspot.kr/2013/11/texshop-arara.html&quot; target=&quot;_blank&quot;&gt;이 글을 참고&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;%!TEX TS-program = arara&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;% arara: Sweave&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;% arara: xelatex&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;이 상태에서 arara를 처음 실행하면(즉 test.tex이 생성되지 않은 상태) xelatex이 Failure일 수 있다. 이유는 arara가 처음 실행되는 때 test.tex의 arara directive를 찾기 때문이다. 그러므로 (파일에 문제가 없다면) 두 번째 arara 실행 시에 제대로 처리될 것이다.&lt;br /&gt;&lt;br /&gt;아무튼 된다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-9Shi5-FzTWc/VNLqRqAJrXI/AAAAAAAAA20/SAsKFTsLzxk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-05%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.56.33.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-9Shi5-FzTWc/VNLqRqAJrXI/AAAAAAAAA20/SAsKFTsLzxk/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-05%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.56.33.png&quot; height=&quot;238&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/3160164042370455311/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/sweavelatex-texshop-arara.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3160164042370455311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3160164042370455311'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/sweavelatex-texshop-arara.html' title='Sweave+LaTeX, TeXShop, arara'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-9Shi5-FzTWc/VNLqRqAJrXI/AAAAAAAAA20/SAsKFTsLzxk/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-05%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.56.33.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-1660379358345339223</id><published>2015-02-04T12:33:00.002+09:00</published><updated>2015-02-07T17:54:54.610+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X"/><category scheme="http://www.blogger.com/atom/ns#" term="R"/><category scheme="http://www.blogger.com/atom/ns#" term="Sweave"/><category scheme="http://www.blogger.com/atom/ns#" term="Textmate"/><category scheme="http://www.blogger.com/atom/ns#" term="Yosemite"/><title type='text'>TextMate로 Sweave+LaTeX (Mac)</title><content type='html'>지난 달 &lt;a href=&quot;http://conf.ktug.org/2015/index-nm.html&quot; target=&quot;_blank&quot;&gt;한국텍학회 컨퍼런스&lt;/a&gt;에는 꽤 흥미로운 주제들이 몇 발표되었다. 그 가운데 박재성 박사께서 발표하신 &quot;&lt;a href=&quot;http://wiki.ktug.org/wiki/wiki.php/KTSConference/2015?action=download&amp;amp;value=TeXnR.pdf&quot; target=&quot;_blank&quot;&gt;TeX과 R을 결합한 문서작성: Sublime Text를 중심으로&lt;/a&gt;&quot;.&lt;br /&gt;&lt;br /&gt;핵심은 Sweave이다. Sweave란 통계 프로그램(언어) R에서 &quot;문학적 프로그래밍(literate programming)&quot;을 하게 해주는 도구. R의 일부이다.&lt;br /&gt;&lt;br /&gt;발표자께서 Sublime Text로 한 것을, 나는 Textmate로 해보려 했다. 그 과정을 간단히 요약해둔다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(1) R의 설치&lt;/b&gt;&lt;br /&gt;Mac OS에서 R을 설치하는 몇 가지 방법이 있는데, 제일 간단한 것은 설치 패키지를 이용하는 것이겠지만 어쩌다보니 나는 home brew로 설치하게 되었다.&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ brew install homebrew/science/r&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ brew install homebrew/science/r-gui&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;설치 패키지로 설치한 경우와 home brew로 설치한 경우 R.Framework의 위치가 다르다. 이 점만 주의하면 된다.&lt;br /&gt;&lt;br /&gt;R을 설치한 후 CRAN을 통하여 몇 가지 패키지를 추가로 설치해야 할 수 있다. R에서 패키지를 설치하는 방법은 R cmd line에서&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;&amp;nbsp;&amp;gt; install.packages(&#39;knitr&#39;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) texmf의 통합&lt;/b&gt;&lt;br /&gt;Sweave를 제대로 쓰려면 R.Framework에서 제공하는 스타일 몇 개를 TeX Live에서 인식할 수 있어야 한다. 이 파일의 위치는 R을 설치 패키지로 인스톨하였다면 (아마도) /Library/Frameworks/R.framework/&amp;lt;version&amp;gt;/Resources/share/texmf 아래일 것이고 home brew로 설치하였다면 /usr/local/Cellar/r/&amp;lt;version&amp;gt;/Frameworks/R.framework/Resources/share/texmf/ 이다.&lt;br /&gt;&lt;br /&gt;이것을 TeX Live에 통합하는 것은 texmf.cnf를 수정하여 예컨대 TEXMFSWEAVE 변수를 만들고 이것을 TEXMF에 포함시키는 방법도 있겠지만 그냥 texmf-local 아래로 심볼릭 링크를 거는 단순한 방법을 쓰기로 하였다. 다음 예시에서 version 번호인 3.1.2는 달라질 수 있으므로 이대로 따라하려면 버전 확인을 요한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ (sudo) mkdir -p /usr/local/texlive/texmf-local/bibtex&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ (sudo) mkdir -p /usr/local/texlive/texmf-local/tex/latex/R&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ (sudo) ln -s /usr/local/Cellar/r/3.1.2/Frameworks/R.framework/Resources/share/texmf/bibtex/* /usr/local/texlive/texmf-local/bibtex/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ (sudo) ln -s /usr/local/Cellar/r/3.1.2/Frameworks/R.framework/Resources/share/texmf/tex/latex/* /usr/local/texlive/texmf-local/tex/latex/R/&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;$ (sudo) mktexlsr&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;목적지를 texmf-local로 하지 않고 자신의 TEXMFHOME(~/Library/texmf)로 하였다면 마지막의 mktexlsr은 불필요하다. kpsewhich Sweave.sty를 실행하여 링크가 잘 되었는지 확인.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(3) Rnw 파일을 Textmate에서 연다.&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://users.stat.umn.edu/~geyer/Sweave/&quot; target=&quot;_blank&quot;&gt;이 곳&lt;/a&gt;에 있는 foo.Rnw를 가지고 먼저 해보기로 하였다. open -a textmate foo.Rnw&lt;br /&gt;textmate가 파일 유형을 물어오면 SWeave Bundle을 설치하도록 한다. 또는 Preferences-&amp;gt;Bundles에서 SWeave를 설치. &lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-ADfk_3oB5rs/VNGSb3JKUDI/AAAAAAAAA2U/rqzeMnH2-e8/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.09.41.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-ADfk_3oB5rs/VNGSb3JKUDI/AAAAAAAAA2U/rqzeMnH2-e8/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.09.41.png&quot; height=&quot;301&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;(4) 번들 기본값 수정&lt;/b&gt;&lt;br /&gt;이대로 Cmd-R을 눌러서 해보면... 애석하게도 뜻대로 잘 되지 않는다.&lt;br /&gt;먼저 터미널에서 R 소스에 문제가 있는 것은 아닌지 확인해보기로 한다. 즉,&lt;br /&gt;$ R CMD Sweave foo.Rnw&lt;br /&gt;이 명령을 실행해보는 것이다.  에러 없이 출력이 된다면 문제는 다른 데 있다.&lt;br /&gt;&lt;br /&gt;아무튼, 나는 다음과 같은 수정을 행하였다. Textmate의 Bundles-&amp;gt;Edit Bundles-&amp;gt;SWeave-&amp;gt;Menu Actions-&amp;gt;Sweave, Typeset &amp;amp; View 스크립트를 조금 고치기로 한 것이다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;27행 근처 export TEXINPUTS 명령이 있는 곳 직전에 PATH 변수 설정을 위한 행을 하나 둔다. home brew로 r을 설치했을 경우 /usr/local/bin이 꼭 필요하다.&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;export PATH=&lt;span style=&quot;color: blue;&quot;&gt;/usr/texbin:/usr/local/bin:&lt;/span&gt;$PATH&lt;/span&gt;&lt;br /&gt;특히 요세미티에서 이 부분이 중요한데 사용자 PATH를 유지해주지 않는 문제 때문에 이것이 필요하다고 생각했다.&lt;/li&gt;&lt;li&gt;38행 근처 echo -e로 시작하는 행에서 Sweave 인코딩 옵션을 추가하기로 했다. 원래 이것은 \usepackage[utf8]{inputenc}가 있으면 utf8으로 인식하도록 되어 있지만 주로 한글 문서를 다루려 하는 입장에서 아예 Sweave 옵션으로 지정하는 것이 더 낫겠다고 본다.&lt;br /&gt;&lt;span style=&quot;color: #cc0000;&quot;&gt;​echo -e &quot;setwd(&#39;$SW&#39;)\nSweave(&#39;$TM_FILEPATH&#39;,&lt;span style=&quot;color: blue;&quot;&gt;encoding=&#39;utf8&#39;&lt;/span&gt;)&quot; | R --vanilla --quiet | pre&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;이 상태로 저장하였다. Cmd-R로 Sweaving하면 결과를 잘 볼 수 있다.&lt;br /&gt;SWeave Bundle에는 Sweave in R과 Sweave Project in R 등이 더 있는데, 위의 수정 사항 중 1)에 해당하는 경로 문제의 수정을 여기에도 추가하여두면 된다.&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-kXxqlz2TMug/VNGScMevLpI/AAAAAAAAA2Y/OVmvqdQrlI4/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.30.01.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-kXxqlz2TMug/VNGScMevLpI/AAAAAAAAA2Y/OVmvqdQrlI4/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.30.01.png&quot; height=&quot;278&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;(5) 한글 문서&lt;/b&gt;&lt;br /&gt;한글 문서를 작성하는 데 큰 문제는 없다. 다음 두 가지만 주의하면 된다.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;program = xelatex 지시를 미리 해두는 것이 좋다. 문서의 맨 첫 줄에 (등호 좌우로 공백없이)&lt;br /&gt;% -*- program=xelatex -*-&lt;br /&gt;이 지시는 SWeave Bundle이 인식하는 것이다.&lt;/li&gt;&lt;li&gt;한글 클래스는 oblivoir로 좋다. 폰트 설정 따위는 알아서 하면 된다.&lt;/li&gt;&lt;/ol&gt;다음은 이 작업을 하고 있는 스크린샷이다. 훌륭하다.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-0ocwLPkz_4s/VNGSbq2NboI/AAAAAAAAA2Q/dQTlMFi3_FI/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.29.15.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-0ocwLPkz_4s/VNGSbq2NboI/AAAAAAAAA2Q/dQTlMFi3_FI/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.29.15.png&quot; height=&quot;180&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/1660379358345339223/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/02/textmate-sweavelatex-mac.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1660379358345339223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/1660379358345339223'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/02/textmate-sweavelatex-mac.html' title='TextMate로 Sweave+LaTeX (Mac)'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ADfk_3oB5rs/VNGSb3JKUDI/AAAAAAAAA2U/rqzeMnH2-e8/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-02-04%2B%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2B12.09.41.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25910901.post-3640575657226427380</id><published>2015-01-23T14:35:00.000+09:00</published><updated>2015-01-23T14:35:00.970+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="expl3"/><category scheme="http://www.blogger.com/atom/ns#" term="factorial"/><category scheme="http://www.blogger.com/atom/ns#" term="l3bigint"/><category scheme="http://www.blogger.com/atom/ns#" term="LaTeX3"/><category scheme="http://www.blogger.com/atom/ns#" term="반복문"/><title type='text'>bigint와 팩토리얼</title><content type='html'>&lt;a href=&quot;http://doeun.blogspot.kr/2015/01/latex3.html&quot; target=&quot;_blank&quot;&gt;앞선 글&lt;/a&gt;에서 재귀 호출로 팩토리얼을 구하는 LaTeX3 함수를 만들어봤는데, 이게 좀 불만스럽다. int가 short이기 때문에 숫자가 조금만 커지만 arithmetic overflow가 뜬다. 이걸 피하려고 fp형을 썼는데 이건 정수 연산에서는 그다지 어울리지 않는다. int를 short 말고 long으로, 그러니까 bigint를 써서 해볼 수는 없을까?&lt;br /&gt;&lt;br /&gt;xint 패키지가 한 가지 해결책일 것이다. bnumexpr도 결국은 xint 엔진을 이용하니까 마찬가지.&lt;br /&gt;&lt;br /&gt;여기서는 LaTeX3 문법을 일관되게 쓰기 위해서 &lt;a href=&quot;http://latex-project.org/svnroot/experimental/trunk/l3trial/&quot; target=&quot;_blank&quot;&gt;l3bigint&lt;/a&gt;를 사용하여 반복문 형식으로 팩토리얼을 구해보기로 한다.&lt;br /&gt;&lt;br /&gt;\usepackage{l3bigint}&lt;br /&gt;&lt;br /&gt;\bigint_new:N \result_bigint&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;\cs_new:Npn \fact_do:n #1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \int_zero:N \l_tmpa_int&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_set:Nn \result_bigint { 1 }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \int_do_until:nn { \l_tmpa_int &amp;gt;= #1 } &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \int_incr:N \l_tmpa_int&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_set:Nn \l_tmpa_bigint { \int_use:N \l_tmpa_int }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_gset:Nn \result_bigint &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_mul:nn { \l_tmpa_bigint } { \result_bigint } &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-tNoHfJ6pyh4/VMGA1WJk6ZI/AAAAAAAAA1s/5WnYA1f5O9M/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-01-23%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B7.59.03.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-tNoHfJ6pyh4/VMGA1WJk6ZI/AAAAAAAAA1s/5WnYA1f5O9M/s1600/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-01-23%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B7.59.03.png&quot; height=&quot;400&quot; width=&quot;227&quot; /&gt;&lt;/a&gt;&lt;/div&gt;ksforloop 패키지로 반복 부분을 다음처럼 간단히 쓸 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: blue;&quot;&gt;\cs_new:Npn \fact_do:n #1&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_set:Nn \result_bigint { 1 }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; \ksforloop { cts=1+1 } { #1 }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_gset:Nn \result_bigint&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; \bigint_mul:nn { \bigint_use:N \ksforcts } { \result_bigint }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://doeun.blogspot.com/feeds/3640575657226427380/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://doeun.blogspot.com/2015/01/bigint.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3640575657226427380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25910901/posts/default/3640575657226427380'/><link rel='alternate' type='text/html' href='http://doeun.blogspot.com/2015/01/bigint.html' title='bigint와 팩토리얼'/><author><name>Karnes Kim</name><uri>https://plus.google.com/111002374703633311677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-FQyYkeC5kQg/AAAAAAAAAAI/AAAAAAAAA5w/wEMDMbMkkHY/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-tNoHfJ6pyh4/VMGA1WJk6ZI/AAAAAAAAA1s/5WnYA1f5O9M/s72-c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%2B2015-01-23%2B%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2B7.59.03.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>