2012/01/09

"선택지"에 대하여 3

어느 분이 말씀하시기를 앞서 쓴 몇 개의 글을 이용해서 마치 시험지의 답안 채점한 것 같은 효과를 내게 할 수는 없냐고 하셔서 간단히 만들어 보았다.
체크 마크는 더 예쁘게 그릴 수도 있을 거고, 어쩌면 tikz로 드로잉할 수도 있는 거겠지만 여기서는 시간관계상(...) 그림판에서 발로 그린 걸로...

소스는 여기에 있다. 핵심은 다음과 같다.

1. 원숫자는 hcrnumbers를 이용했다. 이에 대해서 이 글을 참고. 내가 관련된 글을 하나 써둔 것도 있다. 하여튼 이 때문에 xelatex과 함초롬/GSUB 글꼴이 반드시 필요하다.
2. 체크 마크로 쓸 png 파일은 배경색을 투명하게 만들어둔다.
3. 마크를 그려넣는 코드는 다음과 같다. okcheck2.png 파일이 준비되어 있다.


\newcommand*\DrawMark[2][]{\tikz[overlay]\node[anchor=text,xshift=-3pt,yshift=-4pt] {\includegraphics[width=18pt,#1]{okcheck2}};#2}

\def\selectedmark#1{\DrawMark{\circlenumber #1}}
\def\unselectedmark#1{\circlenumber #1}

4. 우리나라 대부분 시험문제의 선택지 항목 간 간격은 추가 간격이 없는 것이 일반적이다. 그러므로 list 환경을 다음과 같이 설계한다.

 \begin{list}{}{%
  \setlength\topsep{2pt}%
  \setlength\labelwidth{10pt}%
  \setlength\labelsep{6pt}%
  \setlength\leftmargin{18pt}%
  \setlength\itemsep{-\parsep}%
  \selectedlabel
 }%


2012/01/06

"선택지"에 대하여 2

테스트 코드를 만들다보면 중간에 잠시 깜빡하는 수가 있다. 원래 의도를 잊어버리고 딴짓하는 것.
아래 "선택지에 대하여"도 그런 것인 셈이다. 인자로 들어온 숫자들을 묶어서 pool로 만들 때 구분자 +를 앞뒤로 둔 이유는 10이 넘어가는 숫자에 대처하기 위한 것이었다. 그런데 이걸 잊어버리고 \theoptionnum하고만 비교하게 해놓구선 \@firstofone으로 한 글자만 추려내게 했으니 바보짓을 했다고 해야 하나. 요컨대 비교하는 숫자의 앞뒤에 + 마크를 붙여둠으로써 한 자리 제한을 제거하였다. 이게 원래 의도였다.

\\makeatletter
\\def\\s@l@cti@nnumb@rp@@l{}
\\newenvironment{selected}[1]{%
 \\@for\\@CurrentItem:=#1\\do{%
  \\edef\\@CurrentItem{+\\@CurrentItem+}%
  \\expandafter\\edef\\expandafter\\s@l@cti@nnumb@rp@@l\\expandafter{\\s@l@cti@nnumb@rp@@l\\@CurrentItem}%
 }
 \\begin{list}{}{%
  \\selectedlabel
 }}{\\end{list}}
\\newcommand\\selectedlabel{%
 \\setcounter{optionnum}{0}
 \\renewcommand\\makelabel{%
  \\stepcounter{optionnum}%
  \\IfSubStr{\\s@l@cti@nnumb@rp@@l}{+\\theoptionnum+}{\\selectedmark}{\\unselectedmark}%
 }%
}
\\makeatother

아무것도 체크하고 싶지 않다면? selected 환경의 첫째 인자를 비우면 된다. \\begin{selected}{}

2012/01/05

"선택지"에 대하여

이호재 선생의 글 http://hoze.tistory.com/497 을 읽었는데 마지막에 재미난 문제를 제시하고 있다.
이 글에 나온 해법을 최대한 재활용하면서 두 개 이상을 선택하는 코드를 만들어보았다.
\\documentclass{memoir}
\\usepackage{xcolor}
\\usepackage{xstring}
\\newcommand\\selectedmark{{\\color{cyan}\\rule{10pt}{5pt}}}
\\newcommand\\unselectedmark{{\\color{red}\\rule{10pt}{5pt}}}
\\newcounter{optionnum}
\\makeatletter
\\def\\s@l@cti@nnumb@rp@@l{}
\\newenvironment{selected}[1]{%
\\@for\\@CurrentItem:=#1\\do{%
\\edef\\@CurrentItem{+\\expandafter\\@firstofone\\@CurrentItem+}%
\\expandafter\\edef\\expandafter\\s@l@cti@nnumb@rp@@l\\expandafter{\\s@l@cti@nnumb@rp@@l\\@CurrentItem}%
}
\\begin{list}{}{%
\\selectedlabel
}}{\\end{list}}
\\newcommand\\selectedlabel{%
\\setcounter{optionnum}{0}
\\renewcommand\\makelabel{%
\\stepcounter{optionnum}%
\\IfSubStr{\\s@l@cti@nnumb@rp@@l}{\\theoptionnum}{\\selectedmark}{\\unselectedmark}%
}%
}
\\makeatother
\\begin{document}
\\mainmatter
\\chapter{Rules of capitalization in titles}
Capitalize the first word of the title and all proper nouns.
\\begin{selected}{2,5,7}
\\item book
\\item chapter
\\item section
\\item subsection
\\item paragraph
\\item subparagraph
\\item subsubparagraph (?)
\\end{selected}
\\end{document}
인자로 들어오는 숫자를 모두 모아서 pool을 만든 다음 해당 아이템을 찍을 때 현재 카운터가 그 pool 안에 있는지 검사하는 방식으로 해결한 것인데 xstring의 \IfSubStr 명령으로 간단히 검사하는 방법을 이용했다. (아마도 9개까지 중에서 선택하는 것이 될 것 같다. 10개가 넘는 경우라면 약간 수정할 곳이 있어 보임.)
(위의 코드를 테스트해보려면 \\를 모두 \로 치환한다.)




2011/12/17

texlive medium으로 살아보기

좀 낡은, Lion도 안 되는 맥(Core Duo)이 하나 있다. 여유 공간은 20기가 남짓. 여기에 texlive를 설치해서 써야 하는 상황이다. 이제 texlive는 그야말로 공룡이 되어버렸다. 3기가 정도가 설치 크기이고 이것저것 쓰다보면 거의 5기가 안팎을 넘어갈지도 모른다. 설치하는 데만 한 시간 이상 소요된다.

전에 윈도우즈에서 texlive를 medium으로 설치해서 쓰는 방법에 대해 간단히 쓴 것이 기억나서 이것도 그렇게 한번 써보기로 했다. 그리고 texliveonfly도 시험해보고 싶었다.

이러면 예전 MiKTeX 생각이 아니 날 수가 없는 것이다. basic만 깔아놓고 필요한 패키지를 그때그때 온라인으로 설치해가면서 운용하는 것. 네트워크가 항상 물려 있고 안정적이기만 하다면 약간의 시간 손실을 감수해야 하지만 이것은 확실히 획기적인 tex system의 운용 방식이었다.
(공정을 기하기 위해 잠깐 이 방식의 문제점을 적어두고자 한다. 이것은 사실 현재도 MiKTeX의 최대 장점이면서 동시에 문제점이라고 나는 생각한다. 경우에 따라 업데이트 시점이 다르기 때문에 패키지 사이의 호환에 문제가 생길 수 있다는 것. 온라인에 물려 있지 않은 이동식 기계에서 곤란한 일이 생길 수 있다는 것. 파일 하나를 컴파일하는 데 상당한 인내심이 필요할 수도 있다는 것. 사실 이것저것 귀찮으면 full 설치가 정답이다.)

다음은 내가 수행한 과정을 적은 것이다.

(1) 먼저 texlive를 medium으로 설치한다.
설치 방법은 간단하다.
http://mirrors.ctan.org/systems/texlive/tlnet/ 에 가서 install-tl-unx.tar.gz를 다운로드받는다.
* 이 파일의 압축을 푼다.
* 터미널을 열고 압축 풀린 폴더(예를 들면 install-tl-20111216/)로 들어가서 다음 명령을 실행하고 패스워드를 입력한다.
sudo ./install-tl
* 그러면 뭔가 텍스트를 죽 보여주고 사용자 명령을 기다리고 있을 것이다. 여기서
   "s" -> "Enter" -> "e" -> "Enter" 하면 scheme-medium이 선택된다. "R" -> "Enter" 하여 이전 화면으로 돌아온다.
* 이제 "i" -> "Enter" 하여 인스톨을 시작한다. 길어야 10분 정도면 설치가 끝난다.

(2) texlive의 설정을 행한다.
* 다음 명령을 수행한다.
sudo ln -s /usr/local/texlive/2011/bin/universal-darwin/ /usr/texbin
* /etc/profile 파일을 superuser 권한으로 열어서 마지막에 다음 행을 추가한다.
export PATH=/usr/texbin:$PATH
(다른 path는 설정하지 않아도 무방하다. 이 path 설정은 사용자의 홈 디렉터리에서 .bashrc를 이용해서 할 수도 있다.)
* 로그아웃 후에 로그인한 다음 터미널을 열어서 env 명령으로 PATH에 /usr/texbin이 잘 들어가 있는지 확인한다. 혹은 which tlmgr 명령으로 tlmgr이 실행가능한지 확인해본다.

* /usr/local/texlive/2011 폴더에 있는 texmf.cnf를 superuser 권한으로 편집한다. 다음 행을 추가하면 된다.
OSFONTDIR = {~/Library/Fonts;/Library/Fonts;/System/Library/Fonts}

(3) ko.TeX을 부분 설치한다.
* 다음 명령을 수행한다.
sudo tlmgr --repo=http://ftp.ktug.or.kr/KTUG/texlive/2011 install kotex
sudo tlmgr --repo=http://ftp.ktug.or.kr/KTUG/texlive/2011 install kotex-dev
(주로 xetexko만 이용할 나는 이 두 패키지만 설치했다. ko.TeX을 full로 설치하려면 마지막 부분을 install collection-kotex으로 한다.)

(4) 폰트를 설치한다.
XeTeX 사용을 위해 폰트를 좀 정리한다. 이거야말로 맥에 고유한 절차일 것이다.
  ** 함초롬체/GSUB을 설치한다. (폰트를 설치한다는 것은 ~/Library/Fonts에 가져다둔다는 의미이다.)
  ** 나눔 글꼴은 Lion에는 이미 있으므로 따로 설치할 필요 없지만 나의 경우 스노레퍼드여서 별도로 설치를 해주었다.
  ** 순전히 편의를 위해서 기본 은 글꼴과 tex gyre 폰트들을 사용자 폰트 폴더에 복사해준다.
cd ~/Library/Fonts
cp /usr/local/texlive/2011/texmf-dist/fonts/truetype/kotex-base/*.ttf .
cp /usr/local/texlive/2011/texmf-dist/fonts/opentype/public/tex-gyre/* .

(5) MacTeX Additions를 설치한다.
MacTeX Additions는 TeXShop, Ghostscript 등 MacTeX에서 texlive 부분을 제외한 프로그램만 모아놓은 패키지이다. http://www.tug.org/mactex/2011/morepackages.html 에서 MacTeXAdditions.pkg 파일을 내려받아서 실행하면 된다.

여기까지 해서 일단 설치는 종료되었다. 이제 texliveonfly를 테스트할 차례다. 테스트에 사용한 파일은 http://www.ktug.or.kr/xe/index.php?document_srl=149936 이 글에 첨부된 testsource.zip이다. 이 소스는 제법 복잡한 패키지를 몇 개 요구하므로 texlive medium만으로는 컴파일되지 않는다.
일단 texliveonfly는 python 스크립트이므로 자신의 시스템에 python이 잘 설치되어 있는지 확인해야 한다.
which python이나 python --version 명령으로 확인해두자. 내 경우 2.6.1.

texliveonfly를 통한 실행

파일의 압축을 풀고 해당 폴더로 이동하여 다음과 같이 터미널에서 실행한다.
sudo texliveonfly -c xelatex tstmdframed

-c 옵션으로 컴파일러를 지정해줄 수 있다. sudo 명령은 texlive의 tlmgr을 sudo로 불러야 하기 때문에 주었다.
컴파일하는 과정에서 몇 개의 패키지가 자동으로 다운로드되어 설치되는 것을 볼 수 있을 것이다. 조금 기다리면 안전하게 컴파일이 끝난다.
좋은 점은 이렇게 설치된 패키지는 이후 tlmgr을 이용한 업데이트에서 항상 새로운 패키지로 갱신된다는 것이다.

그런데 컴파일 과정에서 생성되는 몇 개 파일의 권한이 root로 된다는 것이 문제가 된다. 그러므로 위의 실행이 끝난 후에는 owner를 바꾸어주자.
sudo chown [USER] *

패키지들이 잘 설치되었는지 그냥 xelatex만으로 확인해본다.
xelatex tstmdframed

새로운 파일을 컴파일할 때 최초 한 번 texliveonfly를 실행해주는 것으로 패키지 문제는 거의 해결된다. 물론 texlive에 등록된 패키지만 이것으로 가능하다는 걸 적을 필요는 없을 것이다.

texlive의 업데이트

향후 texlive의 업데이트는 다음과 같이.
sudo tlmgr update --all --self
sudo tlmgr --repo=http://ftp.ktug.or.kr/KTUG/texlive/2011 update --all

복잡한 작업을 계속하면 texlive 크기가 계속 커지는 것은 피할 수 없을테지만 그래도 full로 설치하는 것보다는 가벼운 시작이라고 생각한다.

2011/12/16

mdframed 1.0, 문단을 프레임으로 둘러싸기

framed 패키지는 한동안 문단에 프레임을 치는 문제에서 거의 유일한 해결책이었다. 특히 페이지 사이를 쪼갤 수 있다는 것이 가장 중요한 장점이었고 사용자가 프레임의 모양을 정의하는 것이 (쉽지는 않아도) 가능했다.

mdframed는 여기서 한 발 더 나아간다. 특히 프레임을 그리는 방법에 tikz를 도입함으로써(옵션으로 지정해야 한다) 문단에 프레임을 그리는 문제에 사실상 최종적인(?) 해결책을 제시하고 있다.

이 패키지를 진작 발견했지만 소개하지 않고 있었던 이유는 손쉽게 사용하기에 몇 가지 불만스러운 점이 있었기 때문인데 최근 업데이트로 이 문제들도 거의 해결되어 이제는 실용적으로 사용해도 괜찮을 때가 되지 않았나 싶어서 간단히 메모를 남겨둔다.

1. default(latex), pstricks, tikz 세 가지 방식의 프레임 메서드 옵션을 제공한다. 즉 자신이 주로 사용하는 그림그리기 툴을 이용할 수 있다. (나로서는 tikz 옵션 하나만을 시험했다.)
2. footnote 문제가 (거의) 해결되어 있다. 각주를 프레임 내부 또는 외부에 원하는 대로 찍도록 할 수 있다.
3. 프레임 타이틀을 (비교적 자유롭게) 붙일 수 있다. 이전 버전에서 프레임 타이틀 옵션을 쓰면  프레임 안 첫 문단으로 식자되었는데 이것을 프레임에 걸치도록 만들 수도 있고 원한다면 프레임 타이틀이 식자되는 방식 자체를 정의할 수도 있다.
4. ntheorem 패키지와 함께 쓰여서 theorem형 문단 정의에 활용할 수 있다.
5. 프레임의 색상, 두께, 배경색, 전면색의 정의가 가능하고 심지어 프레임 자체의 색을 세 겹까지 지정할 수 있다.
6. 다음 그림에서 보듯이 필요한 길이값을 거의 모두 정의할 수 있다.
7. 이전 버전에서 보이던 몇몇 패키지와의 충돌이 대부분 해소되었다.
8. twocolumn 문서에서도 잘 된다.
9. 페이지 사이에 걸치는 프레임의 경우 페이지 아래쪽이나 다음 페이지 위쪽 간격값도 설정할 수 있다. (framed를 쓸 때 힘들었던 문제 중 하나)
10. 프레임 라인의 일부를 숨기는 것이 가능하다.
11. enumerate과 같은 list 문단에서도 잘 된다.

이 문서는 여러 개의 매뉴얼과 샘플로 이루어져 있으므로 mdframed 문서뿐 아니라 mdframed-example-default와 같은 예제 문서도 함께 살펴보아야 한다.

문단에 프레임을 치는 문제는 1990년대 후반부터 꾸준히 발전해온 주제 중 하나이다. 지금까지 내가 아는 한 mdframed가 가장 강력한 것 같다. 한편 최근에 추가된 tcolorbox라는 패키지는 mdframed와는 조금 다르지만 간편하게 첫 줄에 색반전 타이틀을 붙이는 형식의 문단을 만드는 데는 오히려 더 편리한 것 같아 보이기도 하였다. 이 패키지와 그밖의 유사한 패키지에 대해서 필요하다면 다른 글을 다음에 더 써보기로 한다.

tikz의 위력은 정말 강력하다. pgf/tikz가 나온 후 이 패키지의 활용가능성에 주목한 많은 패키지들이 쏟아져나오고 있다. 종래 TeX만으로 하기 힘들었던 문단 장식 문제가 거의 해결되어 가는 것을 보고 있는 셈이다. LaTeX의 확장(packages)들은 지금도 계속 발전하는 중이다.

2011/12/12

ledmac을 이용하는 critical edition 테스트

아주 오래 전에(2004년 아니면 2005년 전후로 기억하는데) 다음과 같은 문서를 작성한 일이 있었다.
이 그림이 있는 위치는 KTUG의 예전 위키인데 이 당시는 ko.TeX도 없었고 XeTeX은 출생하기도 전이라 이 정도의 문서를 만들기 위해 CJKLaTeX을 썼던 것 같다. HLaTeX과 ledmac을 함께 쓰는 데 실패했던 기록이기도 하다.

최근 ledmac에 대해 잠시 문답을 주고받을 기회가 있어 이 문서가 떠올랐다. 세상이 변하였으니 당연히 요즘이라면 어떻게 되는지 궁금해지는 것. 그래서 xoblivoir 문서로 포팅해보았다.



훌륭하다.

소스에 관심이 있으신 분은 여기서 볼 수 있다. 사실상 원래의 소스를 그대로 사용했다.

2011/12/06

hoze's templates, TeX 버전

http://hoze.tistory.com/462 
위의 글에 대한 (수동) 트랙백이다.

이호재 선생의 위의 템플릿 생성기를 보고 있다가, 그냥 tex 파일로 해보면 어떨까 해서 만든 것.

다음 파일을 latex으로 컴파일하면 filename과 option을 각각 묻는다. 그냥 엔터만 쳐도 되고 원하는 텍스트를 써넣어도 된다.

 * hoze's template (.tex)

기능(?)은 위의 글에 있는 스크립트와 (거의) 동일하다.

이대로는 너무 짧으니 간단히 두어 가지만 언급해두자면 파일 쓰기는 memoir의 stream 제어 기능을 이용하였고 입력을 받아들이는 것은 ttyin으로 하였다. 소스에 다 나와 있으니 읽어보시면 뭘 하자는 것인지 금방 알 것이다.