答案1
在这里,我扩展了我的答案突出显示单词列表中的每个出现?解决整个单词和单个字母的突出显示问题。
首先,我们有一个宏\onlywords
(默认T
),它告诉宏\colorize{}
只对整个单词进行操作(这意味着foo
不会被着色为单词 的一部分xfoox
)。如果\onlywords
设置为F
,那么对 的搜索foo
将被着色为 的一部分xfoox
。
搜索字母/字符串或单词用 设定\setcolor{<string>}{<color>}
。
可以通过调用 来重置搜索字符串\resetcolorize
。
我应该指出,大写字母不会妨碍字符串搜索,因此Baz
标记为正匹配baz
。此外,对于整个单词搜索,标点符号会被筛选掉,因此xfoox
在搜索整个单词时不会标记while foo
。(foo)
另一方面,meta-foo
将正确定位为一个foo
单词。
在下面的 MWE 中,在第一段中,我只搜索整个单词
\setcolor{foo}{red}
\setcolor{bar}{blue!70}
\setcolor{baz}{cyan}
\setcolor{biz}{green!70!black}
而在第二段中,我搜索单词内的字母
\setcolor{a}{red}
\setcolor{e}{orange!90!black}
\setcolor{i}{cyan}
\setcolor{o}{green!85!black}
\setcolor{u}{blue!20!blue}
以下是 MWE:
\documentclass{article}
\usepackage{listofitems,xcolor}
\def\onlywords{T}
\def\onlywordstrue{T}
\newcounter{colorwords}
\newcommand\colorize[1]{%
\expandafter\setsepchar\expandafter{\theparselist/ /,||.||!||?||;||:||-||(||)||[||]}%
\reademptyitems%
\greadlist\thewords{#1}%
\foreachitem\x\in\thewords[]{%
\x%
\ifnum\xcnt<\listlen\thewords[]\relax%
\if\relax\thewords[\xcnt,-1,-1]\relax%
\if\relax\thewords[\the\numexpr\xcnt+1,1,1]\relax%
\textcolor{\csname\thewordssep[\xcnt]color\endcsname}{\thewordssep[\xcnt]}%
\else%
\conditionalcolor{\xcnt}%
\fi%
\else%
\conditionalcolor{\xcnt}%
\fi%
\fi%
}%
}
\newcommand\conditionalcolor[1]{%
\ifx\onlywords\onlywordstrue%
\thewordssep[#1]%
\else%
\textcolor{\csname\thewordssep[#1]color\endcsname}{\thewordssep[#1]}%
\fi%
}
\def\theparselist{}
\makeatletter
\newcommand\setcolor[2]{%
\stepcounter{colorwords}%
\ifnum\value{colorwords}=1\g@addto@macro\theparselist{#1}\else%
\g@addto@macro\theparselist{||#1}\fi
\expandafter\def\csname#1color\endcsname{#2}%
\edef\thestring{\Capitalize#1\relax}%
\g@addto@macro\theparselist{||}
\expandafter\g@addto@macro\expandafter\theparselist\expandafter{\thestring}
\expandafter\def\csname\thestring color\endcsname{#2}%
}
\makeatother
\def\Capitalize#1#2\relax{%
\ifcase\numexpr`#1-`a\relax
A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or
N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else
#1\fi#2%
}
\newcommand\resetcolorize{\gdef\theparselist{}\setcounter{colorwords}{0}}
\begin{document}
\setcolor{foo}{red}
\setcolor{bar}{blue!70}
\setcolor{baz}{cyan}
\setcolor{biz}{green!70!black}
\colorize{Lorem ipsum dolor foo sit amet bar: consectetuer adipiscing elit baz! Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Baz curabitur baz dictum gravida
mauris. Nam biz arcu libero, nonummy eget, consectetuer id, vulputate a, bar magna.
Donec vehicula augue eu neque. foox xfoo ,foo foo, foo. xfoox meta -foo meta-foo
(foo)-bar.}
\def\onlywords{F}
\resetcolorize
\setcolor{a}{red}
\setcolor{e}{orange!90!black}
\setcolor{i}{cyan}
\setcolor{o}{green!85!black}
\setcolor{u}{blue!70}
\colorize{Lorem ipsum dolor foo sit amet bar: consectetuer adipiscing elit baz! Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Baz curabitur baz dictum gravida
mauris. Nam biz arcu libero, nonummy eget, consectetuer id, vulputate a, bar magna.
Donec vehicula augue eu neque. foox xfoo ,foo foo, foo. xfoox meta -foo meta-foo
(foo)-bar.}
\end{document}