Wie wird das Prozentzeichen in \detokenize gesetzt?

Wie wird das Prozentzeichen in \detokenize gesetzt?

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 magrittrzu verwenden, zu einer Ausgabe, die nicht erwünscht ist.\rtext{\%>\%}\%>\%

Wie definiert man das \rtextMakro 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 \rtextin 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}

Bildbeschreibung hier eingeben

Um Ihr \rtextProjekt 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 \verbnicht 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 \scantokenskann 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 11für Buchstaben auf setzen, wie ich es ursprünglich in dieser Antwort getan habe. Da aber \detokenizedie 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:

Bildbeschreibung hier eingeben

\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, \@rtextum den Makrocode lesbarer zu machen, obwohl Sie von \catcodein %„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.

verwandte Informationen