如何排版 \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嵌套在其他宏中的问题。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

相关内容