可能重复:
soul 包的 \hl 中的自定义命令
为了使文档更容易理解(并且更容易编写),我定义了:
\newcommand{\code}[1]{\texttt{#1}}
我已经\code{some code}
在hyperref
很多其他地方使用过,一切都很好。
但是,现在我将它与\ul
(来自soul
包)一起使用,如下所示:
\ul{\code{Hello}} world
我收到此警告:
! Argument of \code has an extra }.
<inserted text>
\par
l.52 \ul{\code{Hello}}
world
我定义命令的方式有问题吗?如果我使用,\ul{\texttt{Hello}}
则没有问题。我的代码不应该有效地简化为那样吗?!
笔记:我并不是\code{\ul{Hello}}
在寻找答案或类似的东西来改变文本。主要原因是我从另一个文件生成文本,该文件可能会决定在代码周围添加下划线。对我来说,更改文本中的顺序要比修复定义困难得多,甚至用 s 替换所有\code
s\texttt
并完全忘记宏!
答案1
看一下soul
手册第 5.2 节:
为了确保
soul
不要将字体切换(或其他)命令提供给分析器,而是立即执行它们,还必须注册它们。宏\soulregister
采用\soulregister
命令名称的名称以及0
参数1
数量:
\soulregister{<command name>}{<number of arguments>}
这意味着,尽管\code
本质上是\texttt
,你必须确保soul
通过使用 对其进行适当处理\soulregister{\code}{1}
。
最小工作示例:
\documentclass{article}
\usepackage{soul}
\newcommand{\code}[1]{\texttt{#1}}
\soulregister{\code}{1}
\begin{document}
\ul{\code{Hello}} world
\end{document}