soulutf8 突出显示打开/关闭

soulutf8 突出显示打开/关闭

soul我对包 (和)有疑问soulutf8。为了轻松打开/关闭突出显示文本 ( \hl{<text>}),我定义了一个计数器highlighter,设置为0(突出显示关闭) 或1(突出显示打开)。编译下面的 MWE 时,文本仍然突出显示,尽管我将计数器设置为0。这仅在我将其用作Fuchsia可选参数时才会发生。我真的不知道哪里出了问题。

\documentclass[12pt]{book}
\usepackage[usenames, svgnames]{xcolor}
\usepackage{soul}
\newcounter{highlighter}
\setcounter{highlighter}{1}
\DeclareRobustCommand{\hilite}[2][Aqua]{%
    \ifnum\arabic{highlighter}=0%
        #2%
    \else%
        {\sethlcolor{#1}\hl{#2}}%
    \fi}

\begin{document}
Sample text with some \hl{highlighted} words.

Sample text with some \hilite{highlighted} words.

Sample text with some \hilite[LawnGreen]{highlighted} words.

\setcounter{highlighter}{0}
Sample \hilite{text} \hilite[LawnGreen]{with} \hilite[Fuchsia]{4} words.
\end{document}

答案1

请注意,此问题与您使用的颜色(第一个参数)无关,问题完全是由突出显示的文本(第二个参数)引起的。如果它是一个数字,事情就会变得很糟糕:尝试\hilite{4}在您的 MWE 中将其与\hilite{0}\hilite{00foo}和进行比较\hilite{12foo}\hilite{007foo}以查看不同的(但仍然是错误的)行为。

这是少数几个您不希望%在行尾出现的情况之一。

\DeclareRobustCommand{\hilite}[2][Aqua]{%
  \ifnum\value{highlighter}=0
    #2%
  \else
    {\sethlcolor{#1}\hl{#2}}%
  \fi}

%末尾没有 a\ifnum\value{highlighter}=0就可以了。

但是,如果在行尾添加一个,为什么会出现错误呢%?请记住,行首的空格无论如何都会被忽略,如果%在行尾添加一个,那么换行符通常会插入的空格也会被忽略。因此,TeX 将宏定义的前两行读取为

\ifnum\arabic{highlighter}=0#2%

这意味着 TeX 在读取 后不会停下来寻找数字0,它将继续解析数字。特别是 TeX 将尽可能多地将 读取#2为数字并使用结果进行比较,只有第二个参数的非数字部分会留在分支中true

如果#2不是以可以解析为数字的某个东西开头,则一切正常。highlighter与进行比较0,整个#2结果位于真实分支中。

如果#2以数字开头,则有两种可能性:(1)TeX 最终解析的数字为零,在这种情况下,#2不构成数字的剩余位将在 true 分支中不突出显示的情况下打印出来。(2)TeX 解析的数字非零,在这种情况下,整个第二个参数将以突出显示的形式打印出来。

\documentclass[12pt]{book}
\usepackage[usenames, svgnames]{xcolor}
\usepackage{soul}
\newcounter{highlighter}
\setcounter{highlighter}{1}
\DeclareRobustCommand{\hilite}[2][Aqua]{%
  \ifnum\value{highlighter}=0
    #2%
  \else
    {\sethlcolor{#1}\hl{#2}}%
  \fi}

\begin{document}
Sample text with some \hl{highlighted} words.

Sample text with some \hilite{highlighted} words.

Sample text with some \hilite[LawnGreen]{highlighted} words.

\setcounter{highlighter}{0}
Sample \hilite{text} \hilite[LawnGreen]{with} \hilite[Fuchsia]{4} words.
\end{document}

相关内容