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 magrittr
R. 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 \rtext
macro?
\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 \rtext
en 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}
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 \verb
no 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 \scantokens
aquí 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 11
para letras como lo hice originalmente en esta respuesta. Pero dado que \detokenize
establece 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:
\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 \@rtext
para que el código de la macro sea más legible a pesar de que haya cambiado el \catcode
de %
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
.