我正在写一篇关于编程的文章,想包含一些内联小代码片段。在 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}
结果如下: