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>처럼 입력하시면 좋습니다.
DeclareDocumentCommand를 \chapter 내부에서 사용시 pdf bookmark에 식자되는 않는 문제
2022.12.21 15:31
최근에 xparse에 대해 알게되어 기존에 \newcommand로 사용하던 매크로를 \DeclareDocumentCommand로 바꿔서 문서를 작성해보고 있습니다.
문제는 이 매크로를 \chapter, \section 내부에서 사용하게 되면 pdf로 생성된 bookmark 안에는 식자되지 않는 현상이 보이고 있습니다.
\newcommand 로 정의해서 사용할 때는 본문과 bookmark에 모두 같이 식자가 되는 걸로 보아 \DeclareDocumentCommand 매크로에서 나타나는 현상으로 보이는데 제가 매크로를 잘못 사용한 것인지 잘 모르겠습니다.
테스트용 샘플을 첨부파일로 첨부하였습니다.
사용하는 환경은 texlive-2022를 사용해서 xelatex으로 문서를 작성했습니다.
댓글 2
-
yihoze
2022.12.21 16:26
-
noname
2022.12.21 17:44
\NewExpandableDocumentCommand를 쓰게 되면, 아마도 moving arguments에서 매크로가 풀리는 참사가 발생할 것입니다. (샘플의 간단한 문자열 대치 정도라면 문제없어보일 수 있지만 매크로를 조금만 복잡하게 정의해도 풀리면 곤란란 경우가 생깁니다.) 이런 식으로 정의된 명령을 moving arguments로 인자를 내보내는 명령(\section etc)에서 쓰려면 \protect 해주어야 합니다.
\section{\protect\aaa}
이것은... 그다지 좋아 보이지 않습니다. 어차피 bookmark에는 여전히 안 나올테니 ...Expandable...로 정의한 이유가 다시 없어집니다.
Document 명령은 원칙적으로 안 풀리는 매크로로 정의하는 것(\NewDocumentCommand)이 안전합니다. (복잡한 코딩을 하다 보면 "즉시 확장"이 필요한 경우가 있게 되는데 그럴 때 부득이하게 쓰는 것이 ...Expandable...이라고 생각하시는 것이 좋습니다.)
bookmark의 문제는 bookmark 자체로 해결하십시오.
\section{\texorpdfstring{\aaa}{aaa}}
그리고, \Declare... 류 명령은 이전에 같은 이름의 명령을 모두 무시하겠다는 것인데, 과연 확신할 만한 정책인지 의문스럽습니다. \New... 를 쓰고 만약 이미 정의되었다고 하면 조치를 취하는 것이 좋지 않을까 합니다.
\DeclareExpandableDocumentCommand 또는 \NewExpandableDocumentCommand를 사용하세요.
\NewDocumentCommand 또는 \DeclareDocumentCommand에 의해 만들어지는 명령들은 모두 robust합니다. 무슨 말인고 하니, 버틸 수 있을 때까지 풀리지 않습니다. \aaa가 풀려서 AAA로 바뀐 다음에 PDF 북마크에 들어가야 하는데, 그냥 \aaa로 들어가고 PDF 북마크는 그게 뭔지 모르니까 그냥 무시해 버리는 겁니다. robust한 명령은 일장일단이 있어서 좋다 나쁘다 말할 수는 없을 것 같고요.