¿Cómo componer el símbolo de porcentaje dentro de \detokenize?

¿Cómo componer el símbolo de porcentaje dentro de \detokenize?

Estoy escribiendo algunas notas personales sobre la programación en R. Definí una macro para componer funciones y operadores de R usando un estilo y color de fuente diferente:

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

La macro puede detokenizar caracteres de subrayado _ para que pueda escribir fácilmente funciones de R como \rtext{seq_along}.

Hoy descubrí que la macro falla al destokenizar el carácter de porcentaje %, por ejemplo cuando intento escribir el %>%operador que es del paquete magrittrR. Entiendo que esto se debe a que el carácter de porcentaje se utiliza para marcar el inicio de un comentario. Desafortunadamente, intentar utilizarlo \rtext{\%>\%}da \%>\%como resultado, que no es lo que se desea.

¿Cuál es la forma correcta de definir la \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}

Da el error:

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

Editar en respuesta a las respuestas: Agregué el uso de \rtexten una oración. Desafortunadamente, las respuestas proporcionadas parecen ocupar el espacio después del comando. ¿Hay alguna forma de arreglar esto?

Respuesta1

Puedes hacer algo de magia con catcode. La idea general es la siguiente.

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

ingrese la descripción de la imagen aquí

Para que funcione \rtext, puede abordarlo de esta manera:

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

Como señaló @egreg, esta macro no funcionará bien dentro de otra macro o entorno que ya haya leído los argumentos. Esto es similar al problema de \verbno funcionar anidado en otras macros. Los catcodes ya están configurados y %ya se ve como un carácter de comentario antes delmagia de código de gatoalguna vez tiene la oportunidad de surtir efecto: ni siquiera \scantokensaquí puede venir al rescate. Y de ahí el hecho de que no podía simplemente definir:

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

Si intentas eso, obtendrás el mismo error que tenías originalmente.

Con respecto a los códigos de categoría, puede configurar el código de categoría 11para letras como lo hice originalmente en esta respuesta. Pero dado que \detokenizeestablece los códigos de categoría en 12, configuración

\catcode`\%=12 

hace una elección estéticamente más limpia.

Respuesta2

Similar a la respuesta de A.Ellett: cambie elcódigo de categoría de%de "carácter de comentario" a "otro" y viceversa:

ingrese la descripción de la imagen aquí

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

Tenga en cuenta que se podrían usar caracteres de comentario en la definición de \@rtextpara que el código de la macro sea más legible a pesar de que haya cambiado el \catcodede %para que sea "otro" (y por lo tanto imprimible):

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

La razón de esto es que los códigos de categoría se fijan en el momento de la definición y, por lo tanto, %todavía representan un carácter de comentario dentro \@rtext.

información relacionada