-
확장하거나 확장하지 않거나TeX과 친구들 2018. 8. 13. 10:26
매크로의 확장 원리를 굳이 깊이 이해하려 하지 않았다. 기대와 달리 확장되지 않을 때 \exp_args:NNx 따위를 사용하면 해결되기 때문이다. 최근에 fontspec-xetex.sty가 (expl3 원칙에 따라 매크로 이름을 바꾼 것이 대부분인 듯) 업데이트되면서 xetexko-font.sty도 업데이트되었다. 그 가운데 하나가 이것이다.
\protected\edef\rmfamily{\unexpanded\expandafter{\rmfamily\XK@rm@korean@font}}\unexpanded가 무엇인지 몰라 \rmfamily가 어떻게 재정의되는지 언뜻 이해되지 않았다.
\protected는 버틸 수 있는 한 풀리지 말라는 뜻이다. 따라서 \rmfamily는 토큰 리스트가 만들어질 때 마지막으로 확장될 것이다.
\edef는 매크로 정의부에 포함된 모든 매크로들을 확장하여 매크로를 정의하라는 뜻이다.
\expandafter는 다음 다음 토큰을 다음 토큰보다 먼저 확장하라는 뜻이다.
\unexpanded는 그룹 안에 있는 것들을 확장하지 말라는 뜻이다. 그런데 \expandafter는 그룹이 시작되기 전에 있으므로 유효하고 따라서 다음 토큰인 "{" 뒤에 있는 \rmfamily가 한 번 확장된다. 따라서 \unexpanded\expandafter{...}가 기존 정의에 새로운 것을 추가하는 방법으로 사용될 수 있다.
http://www.ktug.org/xe/index.php?document_srl=46142&mid=blog
내친김에, 어떤 차이가 있을지 보고자, memoir의 \patchcommand, \addtodef, 그리고 etoolbox의 \preto 및 \appto를 사용해 보았다. 각각의 결과 사이에 아무런 차이가 없다.
\documentclass{memoir}\usepackage{xcolor}\usepackage{etoolbox}% memoir%\patchcommand{\verbatim}{\medbreak\setbox0\vbox\bgroup\hsize=\linewidth}{}%\patchcommand{\endverbatim}{}{\egroup\noindent\colorbox{gray!30}{\box0}\medbreak}\addtodef{\verbatim}{\medbreak\setbox0\vbox\bgroup\hsize=\linewidth}{}\addtodef{\endverbatim}{}{\egroup\noindent\colorbox{gray!30}{\box0}\medbreak}% etoolbox%\preto\verbatim{\medbreak\setbox0\vbox\bgroup\hsize=\linewidth}%\appto\endverbatim{\egroup\noindent\colorbox{gray!30}{\box0}\medbreak}\begin{document}Hello\begin{verbatim}HelloWorld!\end{verbatim}World\end{document}개인적으로, 자유로운 재정의가 가능하기 때문에, 다음과 같은 방법을 선호한다.
\cs_set_eq:NN \orgfoo \foo\RenewDocumentCommand \foo { m }{...\orgfoo{#1}...}'TeX과 친구들' 카테고리의 다른 글
고대 그리스어 키보드 (0) 2020.01.14 페르시아 쐐기 문자 (0) 2019.12.20 토큰 리스트 (0) 2019.04.04 이단 조판을 위한 세 가지 방법 (0) 2019.01.23 블리드와 슬러그 (2) 2018.08.10