Как набрать символ процента внутри \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неработоспособностью вложенных макросов. Коды cat уже установлены, и %уже рассматривается как символ комментария передмагия кошачьего кодакогда-либо имеет шанс вступить в силу: даже не \scantokensможет прийти на помощь здесь. И отсюда тот факт, что я не мог просто определить:

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

Если вы попробуете это сделать, вы получите ту же ошибку, что и изначально.

Что касается кодов категорий, вы можете установить код категории 11для букв, как я изначально сделал в этом ответе. Но поскольку \detokenizeустанавливает коды категорий на 12, установка

\catcode`\%=12 

делает эстетически более чистый выбор.

решение2

Аналогично ответу А.Эллетта: Переключитекод категории%из «символа комментария» в «другой» и обратно:

введите описание изображения здесь

\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чтобы сделать код макроса более читабельным, несмотря на то, что вы изменили of \catcodeна %«other» (и, следовательно, на печатаемое):

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

Причина этого в том, что коды категорий фиксируются во время определения и, следовательно, %по-прежнему представляют собой символ комментария внутри \@rtext.

Связанный контент