我尝试\x
使用包\hl
中的命令来突出显示包含的一些文本soul
,其中\x
简单地定义为\def\x{\mathbf{x}}
。
然而,我发现\x
已经在 中定义\hl
。结果,TeX 编译器错误地解释了\hl{How to define $f(\x_i)$?}
,其中\x
实际上将 视为值define
。
我可以知道如何强制执行\x
内部的全局定义\hl
吗?谢谢。
\documentclass[10pt]{article}
\usepackage{color}
\usepackage{soul}
\def\x{\mathbf{x}}
\begin{document}
\title{}
\author{}
\date{}
\maketitle
How to define $\x$?
\hl{How to define $\x$?}
\end{document}
答案1
很不幸,的作者soul
误解了的用法\x
,应该是
\begingroup\edef\x{\endgroup<material>}\x
代替
\edef\x{<material>}\x
前者只\x
在一组中重新定义,而的可能定义\x
无关紧要;当重新定义的\x
执行重新定义时,组结束,重新定义消失。
\x
您可以通过更改为不同的划痕宏来治愈这种疾病,这里我使用了\SOUL@x
。
\documentclass[10pt]{article}
\usepackage{color}
\usepackage{soul}
\usepackage{regexpatch}
\makeatletter
\xpatchcmd*{\SOUL@flushcomma}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@flushapo}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@flushgrave}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@addgroup}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@addmath}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@addprotect}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@addtoken}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\soulregister}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@doword}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@dosyllable}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@gettoken}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@puttoken}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@nexttoken}{\x}{\SOUL@x}{}{}
\xpatchcmd*{\SOUL@soeverytoken}{\x}{\SOUL@x}{}{}
\makeatother
\newcommand\x{\mathbf{x}}
\begin{document}
\title{}
\author{}
\date{}
\maketitle
How to define $\x$?
\hl{How to define $\x$?}
\end{document}
答案2
soul
在内部使用名称\x
作为暂存命令,将内容临时存储在各处。(只需搜索\x
或\edef\x
在http://mirrors.ctan.org/macros/latex/contrib/soul/soul.dtx)由于软件包的编写方式,几乎没有机会让它轻易停止这样做(除非\x
在源代码中用 替换每个出现的地方,\soul@tempa
或者尝试修补软件包以达到相同的效果),所以我想你应该
- 向作者投诉
soul
并建议他使用“内部”名称作为临时命令。 \x
使用除之外的宏名\textbf{x}
。使其具有语义。例如,您可以说\newcommand*{\vector}[1]{\mathbf{#1}}
然后使用
\vector{x}
或如果你想要一个命令\newcommand*{\vector}[1]{\mathbf{#1}} \newcommand*{\vecx}{\vector{x}}
并使用
\vecx
。
通常情况下,避免使用单字母命令更为安全。尽管它们非常方便(至少表面上如此),但许多命令已被占用,重新定义这些命令可能会导致灾难性的后果。
它在这里没有帮助,但在其他情况下可能会有所帮助,因此在 LaTeX 文档中使用它\newcommand
来代替是一种很好的做法\def
。\def
只是覆盖现有命令,而\newcommand
如果您尝试这样做,则会引发错误。 这有助于避免一些更常见的“您定义了一个重要的宏,它在各处都被使用”问题。