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 magrittr
R. Entendo que isso ocorre porque o caractere de porcentagem é usado para marcar o início de um comentário. Infelizmente, tentar usar \rtext{\%>\%}
dá \%>\%
como saída, o que não é o desejado.
Qual é a maneira correta de definir a \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}
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 \rtext
em 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}
Para fazer seu \rtext
trabalho 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 \verb
nã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 \scantokens
pode 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 11
para letras, como fiz originalmente nesta resposta. Mas como \detokenize
define 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:
\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 \@rtext
para tornar o código da macro mais legível, apesar de você ter alterado o \catcode
valor %
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
.