\detokenize 안에 백분율 기호를 어떻게 조판하나요?

\detokenize 안에 백분율 기호를 어떻게 조판하나요?

저는 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.

관련 정보