强制 Latex 将命令解析为原始文本

强制 Latex 将命令解析为原始文本

我正在写一篇关于编程的文章,想包含一些内联小代码片段。在 markdown 中,只需使用反引号即可test。这会自动变为等宽字体。我想要一个简单的命令来实现这一点。(反引号甚至更好)

我尝试使用:

\newcommand{\mon}[1]{
    \mbox{\texttt{\detokenize{#1}}}
}

我的命令带有\mon一个参数,\texttt 用于等宽字体,而 detokenize 用于本来会被 Latex 解析的字符。(例如 $、& 等)但是这对 不起作用#。如果我想使用,\mon{F#}我会收到此错误:

Illegal parameter number in definition of \reserved@a. \mon{F#}

以下是一个测试文档:

\documentclass{article}

\newcommand{\mon}[1]{
    \mbox{\texttt{\protect\detokenize{#1}}}
}

\begin{document}
    \mon{F#}
\end{document}

lstlistings我也尝试使用自定义环境。我想既然正在这样做,那肯定是可行的。

谢谢

答案1

你可以用 来实现\verb。但是让我们看看你的尝试会发生什么。在

\newcommand{\mon}[1]{%
  \mbox{%
    \texttt{%
      \protect\detokenize{#1}%
    }%
  }%
}

有一个放错位置的\protect,但它并没有造成什么坏处。问题是 TeX 在“去标记化”实际发生之前就看到了#6,这会导致传递给 的参数是一个错误的标记列表\texttt。事实上,如果你使用 ,\ttfamily问题就解决了:

\newcommand{\mon}[1]{%
  \mbox{%
    \ttfamily
    \detokenize{#1}%
  }%
}

\detokenize在做其他事情之前可以先执行不同的策略:

\newcommand{\mon}[1]{%
   \expandafter\monAUX\expandafter{\detokenize{#1}}%
}
\newcommand{\monAUX}[1]{%
  \mbox{\texttt{#1}}%
}

然而没有用 解决问题F#,因为您会清楚地看到#翻倍了。这就是\detokenize工作原理的一部分(TeX 就是这样设计的),所以对于这个特定的应用程序,恐怕\verb这就是解决方案。或者使用一些不太费力的技巧来更改 的类别代码#(因此它不能在另一个命令的参数中使用)。


不同的方法可能是expl3

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\tl_const:Nx \c_ledfan_doublehash_tl { \tl_to_str:n { # } }
\tl_new:N \l_ledfan_mon_tl

\NewDocumentCommand{\mon}{m}
 {
  \tl_set:Nf \l_ledfan_mon_tl { \tl_to_str:n { #1 } }
  \tl_replace_all:NVV \l_ledfan_mon_tl \c_ledfan_doublehash_tl \c_hash_str
  \texttt{ \tl_use:N \l_ledfan_mon_tl }
 }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NVV }
\ExplSyntaxOff

\begin{document}

\mon{F#}

\mon{C##}

\end{document}

假设##我们构建的标记列表中的任何一个都来自\tl_to_str:n(伪装的\detokenize)应用于#6 个标记,因此它被一个标记替换。

在此处输入图片描述

\protected@edef这仍然存在一些限制,因为它不能进入​​执行某些或的任何参数的参数\protected@write;例如\textbf和类似的命令或\section\caption和朋友。

答案2

感谢 tex 上答案和其他问题中的所有信息,我终于找到了适合我的情况的 100% 有效的解决方案。我的问题可能不够清楚。

我想要的是:

  • 可以在任何我想要的地方使用\mon,包括表格和项目中,也可以在其他命令中使用。(这对 verbatim 不起作用)
  • 使用等宽字体
  • 也许使用灰色背景

有些用户在这里报告说我应该使用它,lstinline事实证明这是解决方案。我在我的课堂上使用以下代码:

\newenvironment{stable}{
    \begin{longtable}{ p{6cm}  p{10cm} }
}{
    \\
\end{longtable}
}
\lstset{%
    basicstyle=\tt
}

\newcommand{\mon}[1]{%
    \colorbox{lightgray!30}{\lstinline{#1}}
}

\newcommand{\sitem}[1]{%
    \\ { \bfseries #1} &    
}

并且知道我可以在我的文档中创建像这样的“双列页面”:

\begin{stable}      
    \sitem{Use \mon{const string*}} lorem ipsum \mon{string}
\end{stable}

结果如下:

结果

相关内容