如何在已经定义变量的命令中使用该变量的全局定义?

如何在已经定义变量的命令中使用该变量的全局定义?

我尝试\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\xhttp://mirrors.ctan.org/macros/latex/contrib/soul/soul.dtx)由于软件包的编写方式,几乎没有机会让它轻易停止这样做(除非\x在源代码中用 替换每个出现的地方,\soul@tempa或者尝试修补软件包以达到相同的效果),所以我想你应该

  1. 向作者投诉soul并建议他使用“内部”名称作为临时命令。
  2. \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如果您尝试这样做,则会引发错误。 这有助于避免一些更常见的“您定义了一个重要的宏,它在各处都被使用”问题。

相关内容