我正在写一些关于 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
嵌套在其他宏中的问题。catcode 已设置,并且%
已被视为注释字符catcode 魔法有没有机会生效:甚至无法在\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
。