Я пишу личные заметки о программировании на 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
.