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>처럼 입력하시면 좋습니다.
\@undefined 의미?
2017.05.23 15:43
이제 막 plain TeX과 LaTeX에 입문한 초보자입니다.
\@undefined 를 보통 \ifx 와 함께 사용하는 것은 알겠는데요 이것의 정의는 뭔가요?
아무리 검색해봐도 정의나 용도가 나오질 않아서 질문합니다.
그냥 정의되지 않은, name만 @undefined 인, 존재하지 않는 control sequence 인가요?
그냥 막연하게,
\@undefined 는 그냥 정의되지 않은 매크로이고
\ifx\cs\@undefined
에서 TeX이 ``name space'' 에서 'cs' 와 @undefined 를 찾아서 비교할 때 @undefined 가 없으므로 ``FALSE'' 로 취급해서 \else 로 넘어가는 성질을 이용하는 것이 아닌가 추측하고 있는데 맞는지 모르겠습니다.
댓글 4
-
yihoze
2017.05.24 08:44
-
수똘
2017.05.25 09:25
\@ifundefined 는 TeX 에서 \csname foo\endcsname 를 expand할 때는 만약 \foo 가 존재하지 않으면 일단 \foo 라는 것을 만들고 \relax 의 alias 로 만든다는 메커니즘을 이용해서
\expandafter\ifx\csname foo\endcsname\relax
이렇게 하면, 만약 \foo 가 \relax 랑 다르면 당연히 DEFINED 되어 있는 것이고, \relax 랑 같으면 UNDEFINED 이거나 있어봤자 \relax 랑 같은 상태인 것으로 판단하는 것은 대충 이해가 됩니다. 그런데 여기서
1. \ifx 가 control sequence 토큰을 비교할 때, foo 와 relax 라는 name 을 찾아서 각각의 정의를 비교하는데 아마도 토큰 리스트로서의 비교이겠죠?
2. 그런데 만약 정의되지 않은 cs 가 주어지면 \ifx 가 cs 를 찾아볼 때 name space 에서 찾을 때 없는 상태이므로 @undefined 라는 정의되지 않은 cs 와 비교할 때만 같은 토큰으로서 인정하는 것 같은데 맞나요?
3. 이런 식으로 이해하면 ltdirchk.dtx 에 나오는
63: \ifx\@@input\@undefined\let\@@input\input\fi
이 줄에서 \@undefined 는 그냥 없는 cs 로 이해가 됩니다만 103 줄에서
103: \let\@currdir\@undefined
\@undefined 는 그냥 정의되지 않은 cs 인데 (name space 에도 없을 텐데) 어떻게 이것을 \@currdir 이라는 cs 에 \let equal 로 똑같이 옮기는 것인지 모르겠습니다.
이렇게 한 다음
\meaning\@currdir
해보면 undefined 라고 나옵니다. 그럼 저 줄은 뭘 하는 건가요?
-
yihoze
2017.05.25 14:38
짐작에 불과합니다만, 정의되지 않은 것으로 정의하라, 즉 정의를 없애버리라는 뜻이 아닐까 싶습니다.
-
수똘
2017.05.26 00:37
해보니 실제로 그런 것 같네요. \let 이 존재하지 않는 토큰의 경우엔 그런 식으로 처리하는 거겠죠?
아래 조건문들은 어떤 명령이 정의되어 있는지 확인하는 것인데, 전제와 결과에서 서로 미묘하게 다르다고 합니다.
\ifdefined\foo B \else A \fi
\ifx\foo\undefined A \else B \fi
이것들 사이에는 차이가 없고, \undefined가 정의되어 있지 않아야 합니다.
\@ifundefined{foo}{...}{...}
이것은 \foo를 \relax로 만듭니다.
\ifcsname foo\endcsname B \else A \fi
\ifcsname은 \foo를 \relax로 만들지 않기 때문에, 이것이 가장 안전한 방법이라고 합니다.