\detokenize 内でパーセント記号をタイプセットするにはどうすればいいですか?

\detokenize 内でパーセント記号をタイプセットするにはどうすればいいですか?

R プログラミングに関する個人的なメモを書いています。異なるフォント スタイルと色を使用して R 関数と演算子をタイプセットするためのマクロを定義しました。

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

このマクロはアンダースコア文字をトークン化解除できる_ ので、 などの R 関数を簡単に入力できます\rtext{seq_along}

今日、マクロがパーセント文字のトークン化解除に失敗することがわかりました%。たとえば、%>%R パッケージの演算子をタイプセットしようとすると失敗しますmagrittr。これは、パーセント文字がコメントの開始を示すために使用されるためだと理解しています。残念ながら、 を使用しようとすると、出力として\rtext{\%>\%}が与えられます\%>\%が、これは望ましい結果ではありません。

マクロを定義する正しい方法は何ですか\rtext?

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

次のエラーが発生します:

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

回答に応じて編集:\rtext文中に の 使用を追加しました。残念ながら、提供された回答はコマンドの後のスペースを飲み込んでいるようです。これを修正する方法はありますか?

答え1

catcodeマジックをすることができます。一般的な考え方は次のとおりです。

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

ここに画像の説明を入力してください

を機能させるには\rtext、次の方法でアプローチできます。

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

@egreg が指摘したように、このマクロは、すでに引数を読み込んでいる別のマクロや環境内ではうまく動作しません。これは、\verb他のマクロ内でネストされたときに動作しない問題に似ています。catcodes はすでに設定されており、は%既にコメント文字として認識されています。キャットコードマジック効果を発揮する機会は一度もありません。\scantokensここでは救いの手を差し伸べることすらできません。そのため、私は次のように定義することができませんでした。

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

それを試すと、最初と同じエラーが発生します。

11カテゴリコードに関しては、この回答で最初にやったように、文字のカテゴリコードを に設定できます。しかし、 は\detokenizeカテゴリコードを に設定するので12

\catcode`\%=12 

見た目にもきれいな選択になります。

答え2

A.Ellettの回答と同様:カテゴリコード%「コメント文字」から「その他」へ、そしてまた戻る:

ここに画像の説明を入力してください

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

の を「その他」(したがって印刷可能) に\@rtext変更したにもかかわらず、マクロ コードをより読みやすくするために、の定義でコメント文字を使用できることに注意してください。\catcode%

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

その理由は、カテゴリ コードは定義時に固定されるため、%内部では依然としてコメント文字を表しているからです\@rtext

関連情報