저는 R 프로그래밍에 관해 개인적인 노트를 작성하고 있습니다. 나는 다른 글꼴 스타일과 색상을 사용하여 R 함수와 연산자를 조판하는 매크로를 정의했습니다.
\newcommand{\rtext}[1]{%
{\texttt{\detokenize{#1}}}%
}
매크로는 밑줄 문자의 토큰화를 해제 _
하여 \rtext{seq_along}
.
오늘 나는 매크로가 퍼센트 문자의 토큰화를 해제하는 데 실패한다는 것을 발견했습니다 . 예를 들어 R 패키지에 있는 연산자를 %
조판하려고 할 때였습니다 . 댓글의 시작을 표시하는 데 퍼센트 문자가 사용되기 때문인 것으로 알고 있습니다. 불행하게도, 사용하려고 하면 원하는 결과가 아닌 출력이 제공됩니다 .%>%
magrittr
\rtext{\%>\%}
\%>\%
매크로 를 정의하는 올바른 방법은 무엇입니까 \rtext
?
\documentclass{article}
\newcommand{\rtext}[1]{%
{\texttt{\detokenize{#1}}}%
}
\begin{document}
You can write commands in a natural order
by using the \rtext{%>%} infix operator.
\end{document}
오류가 발생합니다.
Runaway argument?
{\end {document}
! File ended while scanning use of \rtext.
<inserted text>
\par
답변에 대한 응답으로 편집:\rtext
문장에 의 용법을 추가했습니다 . 불행히도 제공된 답변은 명령 뒤의 공백을 삼키는 것 같습니다. 이 문제를 해결할 수 있는 방법이 있나요?
답변1
catcode 마법을 사용할 수 있습니다. 일반적인 아이디어는 다음과 같습니다
\documentclass{article}
\makeatletter
\newcommand\detokenizeWithComments{%%
\bgroup
\catcode`\%=12
\ae@detokenize@with@comments
}
\def\ae@detokenize@with@comments#1{%%
\detokenize{#1}%%
\egroup}
\makeatother
\begin{document}
Hello world
\detokenizeWithComments{This has % in it}
%% back to normal
back to normal (shouldn't be repeated)
%% but this next line will fail if uncommented!!!
%%\texttt{\detokenizeWithComments{This has % in it}}
\end{document}
작업을 수행하려면 \rtext
다음과 같은 방식으로 접근할 수 있습니다.
\documentclass{article}
\makeatletter
\newcommand\rtext{%%
\bgroup
\catcode`\%=12
\ae@r@text
}
\def\ae@r@text#1{%%
\texttt{\detokenize{#1}}%%
\egroup}
\makeatother
\begin{document}
Detokenized: \rtext{{This has % in it}}
Back to normal
\end{document}
@egreg가 언급한 바와 같이 이 매크로는 이미 인수를 읽은 다른 매크로나 환경 내에서는 제대로 작동하지 않습니다. 이는 \verb
다른 매크로 내에 중첩되어 작동하지 않는 문제와 유사합니다 . catcode는 이미 설정되어 있으며 해당 문자 %
는 이미 주석 문자로 표시됩니다.캣코드 매직효과를 발휘할 기회는 없습니다. \scantokens
여기에서 구조하러 올 수도 없습니다. 따라서 제가 정의할 수 없는 사실은 다음과 같습니다.
\newcommand\rtext[1]{\texttt{\detokenizeWithComments{#1}}
그렇게 시도하면 원래 겪었던 것과 동일한 오류가 발생하게 됩니다.
11
카테고리 코드와 관련하여 이 답변에서 원래 했던 것처럼 문자에 대한 카테고리 코드를 설정할 수 있습니다 . 하지만 \detokenize
카테고리 코드를 로 설정했기 12
때문에
\catcode`\%=12
미적으로 더 깨끗한 선택을 하게 됩니다.
답변2
A.Ellett의 답변과 유사합니다.카테고리 코드%
"주석 문자"에서 "기타"로 그리고 다시 그 반대로:
\documentclass{article}
\makeatletter
% Switch catcode for % to other
\newcommand{\rtext}{%
\catcode`\%=12
\@rtext}
% Switch catcode for % back to comment character
\newcommand{\@rtext}[1]{\texttt{\detokenize{#1}}\catcode`\%=14}
\makeatother
\begin{document}
\rtext{%>%}
\end{document}
of를 "other"로 \@rtext
변경하여 인쇄 가능하게 했음에도 불구하고 매크로 코드를 더 읽기 쉽게 만들기 위해 정의에 주석 문자를 사용할 수 있습니다 .\catcode
%
\newcommand{\@rtext}[1]{%
\texttt{\detokenize{#1}}%
\catcode`\%=14}
그 이유는 카테고리 코드가 정의 시 고정되어 있기 때문에 %
여전히 내부에 주석 문자가 표시되기 때문입니다 \@rtext
.