Como compor o símbolo de porcentagem dentro de \detokenize?

Como compor o símbolo de porcentagem dentro de \detokenize?

Estou escrevendo algumas notas pessoais sobre programação R. Eu defini uma macro para compor funções e operadores R usando um estilo e cor de fonte diferentes:

\newcommand{\rtext}[1]{%
  {\texttt{\detokenize{#1}}}%
}

A macro é capaz de destokenizar caracteres de sublinhado _ para que eu possa digitar facilmente funções R, como \rtext{seq_along}.

Hoje descobri que a macro falha na destokenização do caractere de porcentagem %, por exemplo, quando tento compor o %>%operador que é do pacote magrittrR. Entendo que isso ocorre porque o caractere de porcentagem é usado para marcar o início de um comentário. Infelizmente, tentar usar \rtext{\%>\%}\%>\%como saída, o que não é o desejado.

Qual é a maneira correta de definir a \rtextmacro?

\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}

Dá o erro:

Runaway argument?
{\end {document} 
! File ended while scanning use of \rtext.
<inserted text> 
                \par 

Edite em resposta às respostas: Eu adicionei o uso de \rtextem uma frase. Infelizmente, as respostas fornecidas parecem engolir o espaço após o comando. Existe alguma maneira de corrigir isso?

Responder1

Você pode fazer alguma mágica com código de gato. A ideia geral é a seguinte

\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}

insira a descrição da imagem aqui

Para fazer seu \rtexttrabalho funcionar, você pode abordá-lo desta maneira:

\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}

Conforme observado por @egreg Esta macro não funcionará bem em outra macro ou ambiente que já tenha lido os argumentos. Isso é semelhante ao problema de \verbnão funcionar aninhado em outras macros. Os catcodes já estão definidos e %já são vistos como um caractere de comentário antes domagia do código de gatonunca tem chance de fazer efeito: nem mesmo \scantokenspode vir em socorro aqui. E daí o fato de que eu não poderia simplesmente definir:

\newcommand\rtext[1]{\texttt{\detokenizeWithComments{#1}}

Se você tentar isso, receberá o mesmo erro que teve originalmente.

Em relação aos códigos de categoria, você pode definir o código de categoria 11para letras, como fiz originalmente nesta resposta. Mas como \detokenizedefine os códigos de categoria como 12, definindo

\catcode`\%=12 

faz uma escolha esteticamente mais limpa.

Responder2

Semelhante à resposta de A.Ellett: Mude ocódigo de categoria de%de "personagem de comentário" para "outro" e vice-versa:

insira a descrição da imagem aqui

\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}

Observe que é possível usar caracteres de comentário na definição de \@rtextpara tornar o código da macro mais legível, apesar de você ter alterado o \catcodevalor %para "outro" (e, portanto, imprimível):

\newcommand{\@rtext}[1]{%
  \texttt{\detokenize{#1}}%
  \catcode`\%=14}

A razão para isso é porque os códigos de categoria são fixos no momento da definição e, portanto, %ainda representam um caractere de comentário dentro de \@rtext.

informação relacionada