这个问题是宏:替换所有出现的单词,但我希望不同的颜色,即具有不同的预定义文本字符串集,这些文本字符串将以预定义的方式着色,其中颜色取决于它们所在的集合。
要求:
- 每个字符串应该能够包含空格和/或标点符号(例如,字符串可以是
foo's foo doesn't foo
)。
编辑:我被要求提供 MWE,当我正在制作 MWE 时,突然我实现了一个答案我以前没有成功过。不断尝试,不断失败,不断成功。
答案1
(在 OP 表明他/她使用文档类并且可能在和book
的参数中有搜索字符串的实例后更新答案。)\chapter
\section
这是一个基于 LuaLaTeX 的解决方案。除了colorize
执行着色工作的 Lua 函数 之外,代码还设置了两个 TeX 端宏\colorizeOn
和\colorizeOff
。顾名思义,这两个宏用于打开和关闭 Lua 函数的操作。
关于 TeX 端代码的一些评论:
\chapter
如果某些搜索字符串可能出现在和指令的参数中\section
,则需要为要使用的颜色提供全大写的别名。例如,如果适用的颜色名为red
、blue
和orange
,则使用\colorlet
指令设置别名RED
、BLUE
和ORANGE
。据我所知,没有充分的理由或有效的借口让搜索字符串出现在
\label
和的参数中\ref
。
Lua端代码的一些注释:
\
(单个反斜杠)是 Lua 中的特殊字符。要在luacode
环境中生成反斜杠,必须写入\\
。函数中的搜索和替换模式必须用匹配的单引号 ( ) 或双引号 ( )
gsub
分隔。如果搜索模式包含引号字符'
"
同一类型用作分隔符时,搜索模式中的引号必须通过在它们前面加上 进行转义\
。 (下面的代码不是这种情况:第一个搜索字符串中有两个 实例'
,但它们不需要进行转义,因为"
是用来分隔搜索模式的。)第一个搜索字符串中出现的字符
.
和)
在 Lua 中具有特殊的、所谓的“魔法”含义如果它们出现在搜索字符串中。要将它们视为普通字符,必须使用字符进行转义%
。以下是 Lua 的“神奇”字符:
(
)
.
%
+
-
*
?
[
^
$
。例如,要搜索某个%
符号,请将其写为%%
搜索字符串中的内容。在替换字符串(的第三个参数)中不需要转义这些字符
gsub
,因为它们在替换字符串中不具有“神奇”的特性。%0
第三个参数中的术语代表gsub
通过模式匹配找到的整个字符串。
% !TEX TS-program = lualatex
\documentclass{book}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman} % choose various fonts, as needed
\usepackage{xcolor} % for "\textcolor" and "\colorlet" macros
\colorlet{RED}{red} % alias names for colors: use all-uppercase
\colorlet{BLUE}{blue}
\colorlet{ORANGE}{orange}
\usepackage{lipsum} % filler text
\usepackage{luacode} % for "luacode" environment and "\luastring" macro
%% Lua-side code
\begin{luacode}
function colorize ( buff )
buff = string.gsub ( buff, "foo's foo doesn't foo%.%)", "\\textcolor{red}{%0}" )
buff = string.gsub ( buff, "The quick brown fox", "\\textcolor{blue}{%0}" )
buff = string.gsub ( buff, "jumps over the lazy dog", "\\textcolor{orange}{%0}" )
return buff
end
\end{luacode}
%% TeX-side code
\newcommand\colorizeOn{\directlua{luatexbase.add_to_callback
( "process_input_buffer" , colorize , "colorize" )}}
\newcommand\colorizeOff{\directlua{luatexbase.remove_from_callback
( "process_input_buffer" , "colorize" )}}
\AtBeginDocument{\colorizeOn} % turn Lua function on by default
\begin{document}
\chapter{The quick brown fox jumps}
\section{Zorro jumps over the lazy dog}
(Every day, foo's foo doesn't foo.)
The quick brown fox jumps over the lazy dog.
\colorizeOff % switch off the Lua function
The quick brown fox jumps over the lazy dog.
\colorizeOn % switch Lua function back on
The quick brown fox jumps over the lazy dog.
\lipsum[1-12] % filler text
\end{document}
答案2
以下内容基本上改编自用户 Mico 的回答在上述帖子中宏:替换所有出现的单词“:
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{xcolor}
\usepackage{luacode,luatexbase}
%%% RED SET %%%
\begin{luacode}
local function vartosrcvar ( line )
return string.gsub(line, "colour it red" , " \\redder{colour it red} ")
end
luatexbase.add_to_callback( "process_input_buffer", vartosrcvar, "red1")
local function vartosrcvar ( line )
return string.gsub(line, "very red" , " \\redder{very red} ")
end
luatexbase.add_to_callback( "process_input_buffer", vartosrcvar, "red2")
\end{luacode}
\newcommand\redder[1]{\textcolor{red}{#1}}
%%% GREEN SET %%%
\begin{luacode}
local function vartosrcvar ( line )
return string.gsub(line, "coloured it green" , "\\greener{coloured it green}")
end
luatexbase.add_to_callback( "process_input_buffer", vartosrcvar, "green1")
\end{luacode}
\newcommand\greener[1]{\textcolor{green}{#1}}
\begin{document}
For example, here is a string which should be coloured red: colour it red.\\
Here is another string which should be ``coloured it red", it makes its very red.\\
Now, here should be a string, which should be ``coloured it green".
\end{document}