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>처럼 입력하시면 좋습니다.
plain TeX \bye에 대한 이해
2020.02.19 23:59
TeXBook의 Chapter 13을 읽던 중, \bye는 \vfill\eject\end의 plain TeX 약자라는 내용이 나왔습니다.
그런데, 마지막 쪽을 조판할 때 왜 굳이 \vfill을 넣어주는 것인가요? 그리고 해보니 \eject없이 그냥 \end만 해도 잘 조판되는 것처럼 보이는데, 왜 굳이 \bye를 쓰는지 궁금합니다.
감사합니다!
+ 아직 처음 읽는 것이라 경고 사인이 있는 부분은 건너뛰고 있습니다.
댓글 11
-
작나
2020.02.20 11:23
-
작나
2020.02.20 12:01
텍북을 읽는다니까 이미 알고있을 수도 있겠지만, 분명히 해둘 것은, 텍북에서 설명하는 텍이 플레인텍이 아니라는 사실입니다.
플레인텍 역시 라텍과 마찬가지로 텍의 포멧 중 하나이고 텍북이 텍을 설명하기 위한 하나의 도구 일 뿐 입니다.
그런데 만들어놓고 보니 쓸만하니(텍을 만든 사람이 만들었으니까), 아직도 살아남았습니다. 라텍이 세상에 나온 후로, 플레인텍으로 문서를 만드는 사람은 거의 없습니다.
-
Zeta
2020.02.20 12:05
아하, 그렇다면 텍북이 말하는 "plain TeX" != "plainTeX"이라는 것인가요? 그럼 텍북은 어떤 텍을 설명하는 것인가요?
-
작나
2020.02.20 12:25
아니 그게 아니고,
텍북이 말하는 플레인텍은 말씀하시는 플레인텍이 맞습니다. ㅎ (즉 포멧 파일로 plain.tex을 사용하는)
텍북은 텍의 원리를 설명하는 책입니다. 박스나 글루라던가 그들을 이용한 line break나 page break 알고리즘이던가, 하이픈 구현방법, 수식 표기 방법, 그외 매크로와 그 외여러가지 프리미티브들 등 텍의 인터널을 그냥 설명하기 어려우니까 이들이 사용된다면 어떻게 사용되는지를 아주 간단한 말그대로 plain한 형태로 구색을 갖추어서 플레인텍이라고 부르고 이를 수단으로 텍을 설명하는 것입니다.
TeX 그 자체로는 프리미티브 외에는 아무런 매크로도 없고, 카테고리코드도 정해져있지 않고, 아무것도 할 수 없으니, 뭔가를 보여주기 위해서 플레인텍을 만든것입니다.
결론은, 차차 아시게 될 것이라는 겁니다.
꾸준히 읽어나가길 바랍니다.
-
Zeta
2020.02.20 16:11
ㅎㅎ 넵 알겠습니다. 계속 읽다보면 깨닫겠지요..!
-
noname
2020.02.20 11:28
TeXbook과 플레인텍을 잘 아시는 분이 계실테지만, 제가 이해한 것을 거칠게 요약하면, \end 명령은 그 명령이 불린 시점에서 아직 남아 있는 vertical list의 모든 것이 출력될 때까지 재귀적으로(반복적으로) 실행된다고 합니다. 그러니까 마지막 페이지를 조판할 적에 "남은 것"을 출력하는 부분과 관련해서 \vfill이 꼭 필요하다고 생각하였습니다.
현재 버전의 plain.tex에서 \bye 명령은
\outer\def\bye{\par\vfill\supereject\end}
이렇게 정의되어 있고 vfill 이후에 \supereject가 호출되는데요, 이 supereject라는 것은 다시
\def\supereject{\par\penalty-\@MM}
여기서 penalty를 -20000으로 한 것은, output에서,
\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% \advancepageno \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
outputpenalty가 -20000보다 크다면 아무 일도 일어나지 않고 (shipout 이후에) 페이지 번호만 증가하지만 이 값이 -20000이면 supereject ("이 위치에서 무조건 eject")를 실행하게 하고 있습니다.
(ps. 올리고 보니 작나 님이 답변을 다셨네요. 링크 거신 글의 내용이 위에 제가 후반부에 설명한 것과 비슷해보입니다. 해당 부분은 결과적으로 중복이지만 삭제하지 않고 그냥 두겠습니다.)
-
Zeta
2020.02.20 16:21
아직 잘은 모르지만, \plainoutput이라는게 매 쪽마다 실행되는 명령일 것 같네요. 그런데 굳이 \outputpenalty라는 다른 변수로 \dosupereject를 실행하는 이유는 아직 잘 모르겠네요. TeXBook 뒤를 읽고 다시 한 번 더 읽으면 이해가 될까요?
-
DohyunKim
2020.02.20 12:22
The TeXbook 제23장 마지막 페이지에 다음과 같이 나와 있습니다.
TeX이
\end
명령을 만나면, main vertical list가 비어있고\deadcycles=0
인 경우에만 작업을 종료한다. 그렇지 않은 경우에는 다음에 해당하는 것을 main vertical list에 첨가한 후\end
토큰을 다시 읽어들인다.\line{} \vfill \penalty-'10000000000
이것은 모든 게 전부 ship out 될 때까지 output routine을 계속 호출하는 효과를 가진다. 특히 이단조판의 마지막 칼럼이 사라지는 것을 방지해준다.
그렇다면
\bye
나\end
나 하는 일이 거의 동일하다고 할 수 있습니다. 단지\line{}
이 있고 없고만 다른데, 이건 눈에 보이지 않는 빈 박스에 불과합니다. 더 큰 차이는\bye
가 outer 매크로로 정의돼 있다는 점이겠지요. 즉\bye
는 다른 매크로나 조건문 안에 쓸 수 없고 독립적으로만 써야 하는 것입니다. -
Zeta
2020.02.20 16:25
위에 noname님께서 말씀하신
"\end 명령은 그 명령이 불린 시점에서 아직 남아 있는 vertical list의 모든 것이 출력될 때까지 재귀적으로(반복적으로) 실행된다고 합니다."
가 이 내용이군요!
둘의 차이를 좀 더 이해하게 된 것 같습니다. 감사합니다 :)
-
작나
2020.02.20 12:44
모처럼 진정한 텍의 세계에 발을 들여놓기 시작한 Zeta님께서 우리나라 텍 guru님들의 설명을 듣고 겁을 먹어 다시 발을 빼는게 아닐까 걱정이 듭니다. ㅎ;
-
Zeta
2020.02.20 16:27
아닙니다 ㅎㅎ 고수님들께서 도와주셔서 더 재밌게 TeXbook을 읽을 수 있을 것 같네요!!
TeXbook을 처음 펼쳤을 때 생각보다 책이 재밌어서 놀랐는데, 어려운 부분은 모두 '경고 표지'에 가려놓았더군요 ㅎㅎ 그 부분을 읽으면 더 길이 험난해질 것으로 생각됩니다..
텍북은 설명의 편의상 언제나 진실만을 말하지 않습니다. \bye도 사실은
입니다.
\end만으로도 \bye와 같은 결과를 주는 이유가 플레인텍에 정의되어있는 output routine과 연관이 있을 것 같은데요,
\bye 가 필요한 이유가 Why does plain TeX have a \bye command? 에 설명이 되어있습니다.
하지만 읽어봐도 이해하기 쉽지 않군요.