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}