自动为所有出现的某些字符串着色(不同的词组使用不同的颜色)

自动为所有出现的某些字符串着色(不同的词组使用不同的颜色)

这个问题是宏:替换所有出现的单词,但我希望不同的颜色,即具有不同的预定义文本字符串集,这些文本字符串将以预定义的方式着色,其中颜色取决于它们所在的集合。

要求:

  • 每个字符串应该能够包含空格和/或标点符号(例如,字符串可以是foo's foo doesn't foo

编辑:我被要求提供 MWE,当我正在制作 MWE 时,突然我实现了一个答案我以前没有成功过。不断尝试,不断失败,不断成功。

答案1

(在 OP 表明他/她使用文档类并且可能在和book的参数中有搜索字符串的实例后更新答案。)\chapter\section

这是一个基于 LuaLaTeX 的解决方案。除了colorize执行着色工作的 Lua 函数 之外,代码还设置了两个 TeX 端宏\colorizeOn\colorizeOff。顾名思义,这两个宏用于打开和关闭 Lua 函数的操作。

关于 TeX 端代码的一些评论:

  • \chapter如果某些搜索字符串可能出现在和指令的参数中\section,则需要为要使用的颜色提供全大写的别名。例如,如果适用的颜色名为redblueorange,则使用\colorlet指令设置别名REDBLUEORANGE

  • 据我所知,没有充分的理由或有效的借口让搜索字符串出现在\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}

相关内容