如何排版\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

你可以施展一些貓代碼魔法。整體思路如下

\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無法嵌套在其他巨集中的問題類似。目錄代碼已設置,並%已被視為前面的註釋字符貓碼魔術曾經有機會生效:甚至無法\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}

請注意,儘管您已將of更改為“其他”(因此可列印),但仍可以在 的定義中使用註釋字元\@rtext以使巨集程式碼更具可讀性:\catcode%

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

這樣做的原因是因為類別代碼在定義時是固定的,因此%仍然代表 中的註解字元\@rtext

相關內容