Skip to content

Evidenziare ogni occorrenza di un elenco di parole?

Questa preoccupazione può essere affrontata in diversi modi, pertanto condividiamo quella che a nostro avviso è la soluzione più completa.

Soluzione:

Soluzione che utilizza i callback di LuaTeX. Biblioteca luacolor.lua da luacolor viene utilizzata anche.

Primo pacchetto luahighlight.sty:

ProvidesPackage{luahighlight}
%RequirePackage{luacolor}
@ifpackageloaded{xcolor}{}{RequirePackage{xcolor}}
RequirePackage{luatexbase}
RequirePackage{luacode}
newluatexattributeluahighlight
begin{luacode*}
highlight = require "highlight"
luatexbase.add_to_callback("pre_linebreak_filter", highlight.callback, "higlight")
end{luacode*}

newcommandhighlight[2][red]{
  bgroup
  color{#1}
  luaexec{highlight.add_word("luatexluaescapestring{[email protected]}","luatexluaescapestring{#2}")}
  egroup
}

% save default document color
luaexec{highlight.default_color("luatexluaescapestring{[email protected]}")}

% stolen from luacolor.sty
defluacolorProcessBox#1{%
  luaexec{%
    oberdiek.luacolor.process(number#1)%
  }%
}

% process a page box
RequirePackage{atbegshi}[2011/01/30]
AtBeginShipout{%
  luacolorProcessBoxAtBeginShipoutBox
}
endinput

comando highlight con un parametro obbligatorio e uno opzionale. obbligatorio è la parola evidenziata, opzionale è il colore. In pre_linebreak_filter vengono raccolte le parole e, in caso di corrispondenza, vengono inserite le informazioni sul colore.

Modulo Lua, highlight.lua:

local M = {}

require "luacolor"

local words = {}
local chars = {}

-- get attribute allocation number and register it in luacolor
local attribute = luatexbase.attributes.luahighlight
-- local attribute = oberdiek.luacolor.getattribute
oberdiek.luacolor.setattribute(attribute)

-- make local version of luacolor.get

local get_color = oberdiek.luacolor.getvalue

-- we must save default color
local default_color 

function M.default_color(color)
  default_color = get_color(color)
end

local utflower = unicode.utf8.lower
function M.add_word(color,w)
  local w = utflower(w)
  words[w] = color
end

local utfchar = unicode.utf8.char

-- we don't want to include punctation
local stop = {}
for _, x in ipairs {".",",","!","“","”","?"} do stop[x] = true end

function M.callback(head)
  local curr_text = {}
  local curr_nodes = {}
  for n in node.traverse(head) do
    if n.id == 37 then
      local char = utfchar(n.char)
      -- exclude punctation
      if not stop[char] then 
        local lchar = chars[char] or utflower(char)
        chars[char] = lchar
        curr_text[#curr_text+1] = lchar 
        curr_nodes[#curr_nodes+1] = n
      end
      -- set default color
      local current_color = node.has_attribute(n,attribute) or default_color
      node.set_attribute(n, attribute,current_color)
    elseif n.id == 10  then
      local word = table.concat(curr_text)
      curr_text = {}
      local color = words[word]
      if color then
        print(word)
        local colornumber = get_color(color)
        for _, x in ipairs(curr_nodes) do
          node.set_attribute(x,attribute,colornumber)
        end
      end
      curr_nodes = {}
    end
  end
  return head
end

return M

usiamo pre_linebreak_filter per attraversare l'elenco dei nodi, raccogliamo il file glyph (id 37) in una tabella e quando troviamo un nodo collante (id 10, principalmente spazi), costruiamo una parola dai glifi raccolti. Abbiamo alcuni caratteri proibiti (come la punteggiatura), che eliminiamo. Tutti i caratteri sono minuscoli, in modo da poter individuare anche le parole all'inizio delle frasi, ecc.

Quando una parola viene trovata, impostiamo attribute dei glifi della parola al valore sotto il quale viene salvato il colore relativo in luacolor biblioteca. Gli attributi sono un concetto nuovo in LuaTeX, permettono di memorizzare informazioni nei nodi, che possono essere elaborati in seguito, come nel nostro caso, perché al momento della spedizione, le pagine ale vengono elaborate dalla libreria luacolor e i nodi vengono colorati, a seconda del loro luahighlight attributo.

documentclass{article}

usepackage[pdftex]{xcolor}
usepackage{luahighlight}
usepackage{lipsum}

highlight[red]{Lorem}
highlight[green]{dolor}
highlight[orange]{world}
highlight[blue]{Curabitur}
highlight[brown]{elit}
begin{document}

defworld{earth}
section{Hello world}

Hello world, world? world! textcolor{purple}{but normal colors works} toofootnote{And also footnotes, for instance. World WORLD wOrld}. Hello world.

lipsum[1-12]
end{document}

enter image description hereenter image description here

Eccone un altro con l3regex.

documentclass{scrartcl}
usepackage{xcolor,xparse,l3regex}
ExplSyntaxOn
NewDocumentCommand texthighlight { +m } { david_texthighlight:n { #1 } }
cs_new_protected:Npn david_texthighlight:n #1
 {
  group_begin:
  tl_set:Nn l_tmpa_tl { #1 }
  seq_map_inline:Nn g_david_highlight_colors_seq
   {
    clist_map_inline:cn { g_david_highlight_##1_clist }
     {
      regex_replace_all:nnN { (W)####1(W) }
       { 1c{textcolor}cB{##1cE}cB{####1cE}2 } l_tmpa_tl
     }
   }
  tl_use:N l_tmpa_tl
  group_end:
 }
seq_new:N g_david_highlight_colors_seq
NewDocumentCommand addhighlighting { O{red} m }
 {
  seq_if_in:NnF g_david_highlight_colors_seq { #1 }
   { seq_gput_right:Nn g_david_highlight_colors_seq { #1 } }
  clist_if_exist:cF { g_david_highlight_#1_clist }
   { clist_new:c { g_david_highlight_#1_clist } }
  clist_gput_right:cn { g_david_highlight_#1_clist } { #2 }
 }
ExplSyntaxOff

addhighlighting{amet,Mauris,ut,et,leo}
addhighlighting[blue]{Phasellus,vestibulum}

begin{document}
texthighlight{Lorem ipsum dolor foo sit amet, bar consectetuer adipiscing
elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis.
Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, vulputate a, magna. Donec vehicula augue eu
neque. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus
rhoncus sem. Nulla et lectus foo vestibulum urna fringilla ultrices.
Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien
est, iaculis in, pretium quis, viverra ac, nunc. Praesent eget sem
vel leo ultrices bibendum. Aenean faucibus. Morbi dolor nulla,
malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor semper
nulla. Donec varius orci eget risus. Duis nibh mi, congue eu,
accumsan eleifend, bar sagittis quis, diam. Duis eget orci sit amet orci
dignissim rutrum.

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut
purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, foo vulputate a, magna. Donec vehicula augue eu
neque. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus
rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices.
Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien
est, iaculis in, pretium quis, viverra ac, bar nunc. Praesent eget sem
vel leo ultrices bibendum. Aenean faucibus. Morbi dolor nulla,
malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor semper
nulla. Donec varius orci eget risus. Duis nibh mi, congue eu,
accumsan eleifend, sagittis quis, diam. Duis eget orci sit amet orci
dignissim rutrum.}
end{document}

enter image description here

Si basa fortemente sulla mia risposta a Come inserire un simbolo all'inizio di una riga in cui compare una parola? Tuttavia, ho dovuto estendere la logica per gestire più assegnazioni di colore. La sintassi è costituita da invocazioni multiple di WordsToNote{space separated list}{color} e poi NoteWords{multiple paragraph input}

Le macro nell'input sono limitate allo stile (ad esempio, textit) e alle dimensioni (ad es, small). Altrimenti, viene accettato solo il testo normale.

Come descritto in dettaglio nella risposta citata, adatto il mio titlecaps che normalmente capitalizza la prima lettera di ogni parola del suo argomento, con un elenco di eccezioni specificato dall'utente. Qui, invece di capitalizzare le parole, le lascio intatte. Tuttavia, intrappolo le eccezioni alle parole specificate dall'utente e le uso per impostare un colore diverso.

In questa estensione di tale metodo, ho dovuto rivedere due titlecaps macro: titlecap e [email protected].

Il metodo non può gestire sottoinsiemi di parole, ma può ignorare la punteggiatura.

MODIFICATO per correggere l'errore quando la parola contrassegnata appare con la punteggiatura e il problema con la prima parola dei paragrafi.

documentclass{article}
usepackage{titlecaps}
makeatletter
renewcommandtitlecap[2][P]{%
  [email protected]%
  if Tconverttildedef~{ }fi%
  [email protected]%
  [email protected]{#2}%
  [email protected]{#1}%
  if P#1%
    [email protected]%
    [email protected]{#2}%
    [email protected][email protected]{argi}%
  else%
  fi%
  setcounter{[email protected]}{0}%
  [email protected]%
  def@thestring{}%
  [email protected]{#2}%
  if P#1[email protected]argi{[email protected]}fi%
  whiledo{value{[email protected]} < narg}{%
    addtocounter{[email protected]}{1}%
    if Fcsname [email protected]roman{[email protected]}endcsname%
      [email protected]{csname argroman{[email protected]}endcsname}%
      expandafter[email protected]csname%
           argroman{[email protected]}endcsname{@thestring}%
    else
      [email protected]{csname argroman{[email protected]}endcsname}%
      expandafter[email protected]csname%
         argroman{[email protected]}endcsname{color{%
           csname colorromannumeralvalue{[email protected]}endcsname}%
      @thestringcolor{black}{}}%
    fi%
  }%
  def@thestring{}%
  setcounter{[email protected]}{0}%
  whiledo{value{[email protected]} < narg}{%
    addtocounter{[email protected]}{1}%
    ifthenelse{value{[email protected]} = 1}%
   {}{[email protected]}%
    [email protected]@thestring{@thestring%
      csname argroman{[email protected]}endcsname}%
  }%
  let~SaveHardspace%
  @thestring%
  [email protected]%
[email protected]}

% SEARCH TERTIUS CONVERTED ARGUMENT FOR LOWERCASE WORDS, SET FLAG
% FOR EACH WORD (T = FOUND IN LIST, F= NOT FOUND IN LIST)
renewcommand[email protected][1]{%
[email protected]%
  setcounter{[email protected]}{0}%
  whiledo{value{[email protected]} < narg}{%
    addtocounter{[email protected]}{1}%
    [email protected][email protected]{%
      csname argromannumeralvalue{[email protected]}endcsname}%
    def[email protected]{F}%
    setcounter{[email protected]}{0}%
    expandafterdefcsname%
            [email protected]romannumeralvalue{[email protected]}endcsname{F}%
    whiledo{value{[email protected]} < value{[email protected]}}{%
      addtocounter{[email protected]}{1}%
      [email protected][email protected]{%
        csname lcwordromannumeralvalue{[email protected]}endcsname}%
%% THE FOLLOWING THREE LINES ARE FROM DAVID CARLISLE
  [email protected]tmp{noexpandscantokens{defnoexpandtmp%
   {noexpandifthenelse{noexpandequal{[email protected]}{[email protected]}}}}}%
  tmpifhmodeunskipfitmp
%%
      {expandafterdefcsname%
            [email protected]romannumeralvalue{[email protected]}endcsname{T}%
      expandafter[email protected]csname colorromannumeralvalue{[email protected]}endcsname{%
       csname CoLoRcsname lcwordromannumeralvalue{[email protected]}endcsnameendcsname}%
      setcounter{[email protected]}{value{[email protected]}}%
      }%
      {}%
    }%
  }%
if P#1def[email protected]{F}fi%
[email protected]%
}
makeatother
usepackage{xcolor}
newcommandWordsToNote[2]{Addlcwords{#1}edefassignedcolor{#2}%
  assigncolor#1 relaxrelax}
defassigncolor#1 #2relax{%
  expandafteredefcsname CoLoR#1endcsname{assignedcolor}%
  ifxrelax#2elseassigncolor#2relaxfi%
}
newcommandNoteWords[1]{NoteWordsHelp#1parrelax}
longdefNoteWordsHelp#1par#2relax{%
  titlecap[p]{#1}%
  ifxrelax#2elseparNoteWordsHelp#2relaxfi%
}
begin{document}
WordsToNote{foo bar at}{red}
WordsToNote{Nulla dolor nulla}{cyan}
WordsToNote{amet est et}{orange}
WordsToNote{Lorem Ut ut felis}{green}
NoteWords{
textbf{Lorem ipsum dolor foo sit amet, bar consectetuer adipiscing elit}. Ut
purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, vulputate a, magna. Donec vehicula augue eu
neque. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus
rhoncus sem. textit{Nulla et lectus foo} vestibulum urna fringilla ultrices.
Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien
est, iaculis in, pretium quis, viverra ac, nunc. Praesent eget sem
vel leo ultrices bibendum. scshape Aenean faucibus. Morbi dolor nulla,
malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor semper
nulla. Donec varius orci eget risus. upshape Duis nibh mi, congue eu,
accumsan eleifend, bar sagittis quis, diam. Duis eget orci sit amet orci
dignissim rutrum.

textsf{Lorem ipsum dolor sit amet}, consectetuer adipiscing elit. Ut
purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur
dictum gravida mauris. Nam arcu libero, nonummy eget,
consectetuer id, foo vulputate a, magna. Donec vehicula augue eu
neque. Pellentesque habitant morbi tristique senectus et netus et
malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra metus
rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices.
Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien
est, iaculis in, pretium quis, viverra ac, bar nunc. Praesent eget sem
vel leo ultrices bibendum. Aenean faucibus. Morbi dolor nulla,
malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor semper
nulla. Donec varius orci eget risus. Duis nibh mi, congue eu,
accumsan eleifend, sagittis quis, diam. Large Duis eget orci sit amet orci
dignissim rutrum.normalsize
}
end{document}

enter image description here

Ecco le recensioni e le valutazioni

Ci piacerebbe se potessi raccomandare questa affermazione se ne valesse la pena.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.