Ich schreibe einige persönliche Notizen zur R-Programmierung. Ich habe ein Makro definiert, um R-Funktionen und -Operatoren mit einem anderen Schriftstil und einer anderen Farbe zu setzen:
\newcommand{\rtext}[1]{%
{\texttt{\detokenize{#1}}}%
}
Das Makro kann Unterstriche detokenisieren, _
sodass ich R-Funktionen wie problemlos eingeben kann \rtext{seq_along}
.
Heute habe ich festgestellt, dass das Makro beim Detokenisieren des Prozentzeichens fehlschlägt %
, beispielsweise wenn ich versuche, den %>%
Operator aus dem R-Paket zu setzen. Ich verstehe, dass dies daran liegt, dass das Prozentzeichen verwendet wird, um den Anfang eines Kommentars zu markieren. Leider führt der Versuch, es magrittr
zu verwenden, zu einer Ausgabe, die nicht erwünscht ist.\rtext{\%>\%}
\%>\%
Wie definiert man das \rtext
Makro richtig?
\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}
Gibt den Fehler aus:
Runaway argument?
{\end {document}
! File ended while scanning use of \rtext.
<inserted text>
\par
Bearbeiten als Reaktion auf Antworten:
Ich habe die Verwendung von \rtext
in einem Satz hinzugefügt. Leider scheinen die bereitgestellten Antworten den Platz nach dem Befehl zu verschlucken. Gibt es eine Möglichkeit, dies zu beheben?
Antwort1
Sie können etwas Catcode-Magie anwenden. Die Grundidee ist wie folgt
\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}
Um Ihr \rtext
Projekt zum Laufen zu bringen, können Sie folgendermaßen vorgehen:
\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}
Wie von @egreg angemerkt, funktioniert dieses Makro nicht gut in einem anderen Makro oder einer Umgebung, die die Argumente bereits eingelesen hat. Dies ist ähnlich dem Problem, dass es \verb
nicht in anderen Makros verschachtelt funktioniert. Die Catcodes sind bereits festgelegt und das %
wird bereits als Kommentarzeichen vor demCatcode-Magiehat überhaupt eine Chance zu wirken: nicht einmal \scantokens
kann hier zur Rettung kommen. Und daher die Tatsache, dass ich nicht einfach definieren konnte:
\newcommand\rtext[1]{\texttt{\detokenizeWithComments{#1}}
Wenn Sie das versuchen, erhalten Sie lediglich den gleichen Fehler wie ursprünglich.
Bezüglich der Kategoriecodes könnten Sie den Kategoriecode 11
für Buchstaben auf setzen, wie ich es ursprünglich in dieser Antwort getan habe. Da aber \detokenize
die Kategoriecodes auf gesetzt werden 12
, ist die Einstellung
\catcode`\%=12
trifft eine ästhetisch sauberere Wahl.
Antwort2
Ähnlich wie A.Elletts Antwort: Schalten Sie dieKategoriecode von%
von "Kommentarzeichen" zu "Sonstiges" und wieder zurück:
\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}
Beachten Sie, dass Sie in der Definition von Kommentarzeichen verwenden könnten, \@rtext
um den Makrocode lesbarer zu machen, obwohl Sie von \catcode
in %
„anderes“ (und damit druckbar) geändert haben:
\newcommand{\@rtext}[1]{%
\texttt{\detokenize{#1}}%
\catcode`\%=14}
Der Grund hierfür liegt darin, dass die Kategoriecodes bei der Definition festgelegt werden und daher %
darin immer noch ein Kommentarzeichen darstellen \@rtext
.