Q&A 마당은 텍 관련 질문/답변을 위해 만들었습니다.
- 로그인 없이 자유롭게 글을 읽고 쓸 수 있는 철학은 처음과 같이 계속됩니다.
- 질문 전에 아래를 읽어 보세요. 좋은 질문이 좋은 답을 받을 수 있는 좋은 방법입니다.
- 질문에 맞는 제목을 붙이세요. 질문의 내용과 관련없는 "고수님", "긴급질문", "도와주세요"와 같은 제목은 답이 잘 올라오지 않습니다. 이 게시판에 올라오는 모든 글은 질문입니다. 굳이 [질문], [Q]를 적으실 필요도 없습니다.
- 내용을 충실히 적어 주시고, 같은 상황을 재현할 수 있는 최소한의 예제가 같이 있어야 합니다.
- 최소 예제는 "Minimal working example"을 읽어 보세요.
- 파일을 첨부하실 때에는 가능한 압축하여 파일 크기를 줄여서 올려주시길 바랍니다.
- 개인적으로 사용하신 글꼴이 들어 있는 경우, preparefont.sty에 관한 답변을 참조하세요.
- 스팸 글을 막기 위하여 짧은 시간 내에 다시 글이 등록되는 IP를 막거나, 광고 글을 막기 위하여 금지어로 .com, .net 등을 설정하고 있습니다. 다소간의 불편함이 있으시더라도 양해 바랍니다.
- 금지어에서 stackexchange, stackoverflow, ctan, overleaf, , github, google.com, gmail.com, .org, .io, sil.org, wiki.com, tistory.com등은 해제하였습니다.
- MathJax를 이용한 수식조판을 사용하실 수 있습니다. 여기를 참조하세요.
- 사용하는 편집기는 CKeditor입니다.
- 편집기에서 [enter]를 누르면 <p> 태그가 들어가고, 문단으로 생각하고 한 줄을 비웁니다.
- 글줄만 바꾸려면 [shift-enter]를 누르면 <BR> 태그가 들어가므로 용도에 맞게 나누어 쓸 수 있습니다.
- 수식를 문서내에 삽입하시려면 에디터를 툴바에서 [소스]를 눌러 HTML로 입력할 수 있게 바꾸신 후 <pre> </pre> tag를 사용하셔서 <pre> 여러 줄의 수식 </pre>처럼 입력하시면 좋습니다.
picture environment를 이용한 thumb index 만들기 질문입니다.
2019.05.08 01:56
안녕하세요, 페이지 가장자리에 section 별로 위치가 달라지는 thumb index를 만들고 싶어서 아래와 같은 코드를 만들었습니다.
Picture environment로 사각형을 그린 다음에 그 수직방향 위치를 \value{section}의 함수로 \numexpr을 사용하여 집어넣은 것입니다.
그런데 section의 개수가 너무 많아지면 thumb index가 페이지 밑바닥을 뚫고 없어지기 때문에, 7번마다 한번씩 처음 시작했던 높이로 올라오도록 하고싶습니다. \numexpr는 modulo 연산자를 지원하지 않는 것 같아서 직접 a-(a/b)*b 이런 식으로 고쳐서 썼는데, \numexpr 안에 들어가는 expression에 괄호가 들어가면 컴파일 에러가 나네요... 어찌해야 좋을지 모르겠어서 도움을 청합니다.
\documentclass[twoside,12pt]{xoblivoir}
\usepackage{pdfpages}
\usepackage{fapapersize}
\usepackage{graphicx}
\usepackage{fp}
\usefapapersize{213mm,301mm,10mm,10mm,30mm,25mm} % 좌우상하 여백
\setlength{\unitlength}{10mm}
\newcommand{\blob}{\textcolor{gray}{\rule[-0.25\unitlength]{\unitlength}{\unitlength}}}
\newcommand\rblob{%
\begin{picture}(0,0)
\put(0,\numexpr-\value{section}*3+3\relax){\blob}
\put(0.1,\numexpr-\value{section}*3+3\relax){\textcolor{white}{\LARGE\emph{\textbf{\thesection}}}}
\end{picture}}
\newcommand\lblob{%
\begin{picture}(0,0)
\put(-1.05,\numexpr-\value{section}*3+3\relax){\blob}
\put(-0.9,\numexpr-\value{section}*3+3\relax){\textcolor{white}{\LARGE\emph{\textbf{\thesection}}}}
\end{picture}%
}
\makepagestyle{mystyle}
%\makeheadrule{mystyle}{\textwidth}{2pt}
%\makeevenfoot{mystyle}{\rightmark}{\LARGE\textbf{\thepage}}{}
\makeevenfoot{mystyle}{\textbf{\thepage}\hspace{1em}|\hspace{1em}\rightmark}{}{}
\makeoddfoot{mystyle}{}{}{\rightmark\hspace{1em}|\hspace{1em}\textbf{\thepage}}
\makeevenhead{mystyle}{\lblob}{}{} % leftmark는 문서제목이기에, section명이 나오는 rightmark로 조판.
\makeodd head{mystyle}{}{}{\rblob} % 금지어라서 odd head 띄웠습니다.
\pagestyle{mystyle}
\begin{document}
\pagestyle{mystyle}
\section{test1}
\clearpage
\section{test2}
\clearpage
\section{test3}
\clearpage
\section{test4}
\clearpage
\end{document}
댓글 8
-
noname
2019.05.08 11:24
-
mhd06
2019.05.09 01:09
답변 감사합니다. \numexpr 안에서는 나눗셈이 그런 의미여서 4번째부터 이상한 일이 일어났던 것이었군요! 일러주신 \myMod 자체는 잘 작동하는데 도무지 picture environment의 put의 좌표값으로 집어넣기만 하면 컴파일이 안됩니다.
\newcommand\rblob{%
\begin{picture}(0,0)
\put(0,\numexpr-\myMod{\value{section}}{7}*3\relax){\blob}
\put(0.1,\numexpr-\myMod{\value{section}}{7}*3\relax){\textcolor{white}{\LARGE\emph{\textbf{\thesection}}}}
\end{picture}}제가 plaintex이 약해서 거의 하나하나 다 해보는 수준이라 많이 어렵네요 ㅠ 도와주셔서 감사합니다. ifthen 패키지를 쓰면 계산식을 쓸 필요가 없이 section 번호에 따라 위치를 출력할 수 있나요?
-
noname
2019.05.09 18:57
일단 제가 해본 파일을 올려드립니다.
-
mhd06
2019.05.09 22:57
정말 감사합니다 ㅠㅠ Expl이 뭔진 공부해봐야겠지만 이걸로 바꾼 것만으로도 되는군요 ㅠㅠ
사실 답글을 보기 전에 문제를 해결하긴 했는데, section 대신에 아예 새로운 thumdepth 라는 counter를 정의한 다음에 매 section마다 아래와 같이 update되도록 하였습니다. section이 시작될 때마다 1씩 증가시키되, max 값을 넘기면 다시 1로 만들어버리는 방법이었습니다.
\refstepcounter{thumbdepth}
\ifthenelse{\value{thumbdepth}>7}{\setcounter{thumbdepth}{1}}{}ifthen을 써보라는 말씀을 듣고 생각해본 결과였습니다. 덕분에 많은 공부가 되었습니다. 감사합니다.
-
noname
2019.05.09 23:39
좋은 아이디어라고 생각합니다. 실제 구현하신 코드를 남겨주시면 다른 분들에게도 참고가 될 것입니다.
-
mhd06
2019.05.11 11:32
원래 목적으로 쓰는 section 재정의는 원래 memoir의 section이랑 달라서 예제 만드는데 시간이 좀 걸렸습니다. 역시 plain tex을 공부해야겠다는 생각입니다.
-
noname
2019.05.11 17:57
잘 봤습니다. 예제를 만드느라고 고생하셨네요. :)
제 생각을 조금 적어두겠습니다. 혹시 참고가 되기를 바랍니다.
(0) \refstepcounter는 그냥 \stepcounter로 좋을 듯합니다. thumbdepth 카운터를 ref할 일이 있을 것 같지 않습니다.
(1) \sechook이라는 것.
예시하신 코드에 \section을 \sechook 앞에 추가하셨는데 사실 이 \sechook이라는 것이 "section을 시작할 때 원하는 코드를 추가"하도록 하기 위해서 만들어둔 것입니다. 그러니까 굳이 \section을 재정의할 것 없이 \sechook을 설정해주는 것으로 되리라고 생각합니다. 이를테면 다음과 같습니다.
\setsechook{% \stepcounter{thumbdepth}% \ifthenelse{\value{thumbdepth}>\maxthumbdepth}% {\setcounter{thumbdepth}{1}}{}% % font} }
memoir 매뉴얼의 해당 부분을 참고하십시오.
(2) dummy 카운터를 이용하는 것
지금 할 일은 "section 카운터가 바뀌면 thumbdepth 카운터를 설정한다"입니다. 그러니까 다음과 같은 방법으로 해보는 것이 가능합니다.
- \rblob와 \lbolb 명령이 시작할 때 \checkandsetthumbdepth라는 명령을 실행하도록 해둡니다.
- \checkandsetthumbdepth 명령은, 현재 section의 카운터와 dummy 카운터를 비교하여 만약 이 둘이 다르면, dummy 카운터를 1 증가시키고 thumbdepth도 1 증가시킵니다. 그리고 thumbdepth가 7보다 크면 1로 설정하는 일을 하게 하는 것입니다.
\newcounter{thumbdepth} \newcounter{dummy} \def\maxthumbdepth{7} \newcommand\checkandsetthumbdepth{% \ifthenelse{\value{dummy}=\value{section}}% {}% {% \stepcounter{dummy}% \stepcounter{thumbdepth}% \ifthenelse{\value{thumbdepth}>\maxthumbdepth}% {\setcounter{thumbdepth}{1}}{}% }% } %.... \newcommand\rblob{% \checkandsetthumbdepth \begin{picture}(0,0) \put(0,\numexpr-\value{thumbdepth}*3+3\relax){\blob} \put(0.1,\numexpr-\value{thumbdepth}*3+3\relax){\textcolor{white}{\LARGE\emph{\textbf{\thesection}}}} \end{picture}} \newcommand\lblob{% \checkandsetthumbdepth \begin{picture}(0,0) \put(-1.05,\numexpr-\value{thumbdepth}*3+3\relax){\blob} \put(-0.9,\numexpr-\value{thumbdepth}*3+3\relax){\textcolor{white}{\LARGE\emph{\textbf{\thesection}}}} \end{picture}% }
===
(1)의 방법은 memoir/oblivoir에서 쓸 수 있고 (2)는 클래스와 무관하게 사용할 수 있을 듯하네요.
-
mhd06
2019.05.12 14:03
\sechook에 그런 의미가 있는 줄 몰랐네요. 저는 그냥 memoir.cls 파일에서 의미도 모르고 막 베껴왔는데 어마어마한 공부가 되었습니다 ㅜㅜ
\refstepcounter와 \stepcounter의 차이도 뭔지 모르고 막 썼는데 이런 것이었군요. 사실 제가 올린 예제에 toc를 추가해서 컴파일하면 7n+k번째 section에 대한 하이퍼링크가 k번째 section을 가리키는 이상한 현상이 있었는데, \stepcounter로 고쳐서 컴파일해보니까 깨끗이 사라지네요!
\dummy를 쓰는 방식도 엄청 좋은 아이디어인 것 같습니다. 저같은 초보들도 이해할 수 있는 간단한 명령들만 써서 원하는 일을 달성할 수 있다는 걸 보여주는 좋은 예제인 것 같습니다.
남이 쓴 코드를 이토록 열심히 봐주시다니 프로그래밍 세계에서는 무량공덕을 쌓으신 것 같습니다. 좋은 하루 보내세요 ㅎㅎ
\numexpr 안의 / 연산자는 truncate가 아니라 round입니다. TeX의 \divide와는 다릅니다. modulo를 구하기 위해 a-(a/b)*b하면 음수를 반환하게 되어서 문제가 생깁니다.
원하시는 목적을 위해서 \myMod를 하나 새로 정의하시지요.
\ifnum 이후 코드는 나머지가 0일 때 나누는 수(예시된 7)를 출력해야 뜻대로 동작할 것 같아서 추가한 것입니다.
사족이지만 \value{section}을 쓰기 위한 목적이라면 \usepackage{ifthen}으로 되지 않을까 합니다.
Expl3라면 대략 다음과 같이 할 수 있는데요, 이게 좋은 점은 \int_mod:nn라는 function을 제공한다는 것입니다. 문서 클래스가 oblivoir이므로 \usepackage{xparse}를 따로 안 써도 됩니다.