Destacando a primeira ocorrência da palavra. Tornando-o insensível a maiúsculas e minúsculas

Destacando a primeira ocorrência da palavra. Tornando-o insensível a maiúsculas e minúsculas

primeira vez fazendo uma pergunta.

Estou implementando a resposta das egregs desta pergunta:Destaque a primeira ocorrência de uma palavra específica

%%% Code to set up special term treatment
\makeatletter
\newcommand{\specialterms}[1]{%
  \@for\next:=#1\do
  {\@namedef{specialterm@\detokenize\expandafter{\next}}{}}%
}
\newcommand\term[1]{%
  \@ifundefined{specialterm@\detokenize{#1}}
    {#1}{\emph{#1}\global\expandafter\let\csnamespecialterm@\detokenize{#1}\endcsna    me\relax}%
}
\makeatother

%%% Here we define the special terms we want
\specialterms{foo,bar,baz}

Isso enfatiza a primeira menção das palavras na \specialtermslista. Isso está funcionando bem no momento. Quero que ele reconheça versões em maiúsculas das palavras listadas em \specialterms, para que funcione melhor com a primeira palavra de uma frase. Usando o exemplo acima, quero \term{Foo}ser enfatizado sem precisar adicionar Foo à \specialtermslista.

Eu tentei o seguinte:

\@ifundefined{specialterm@\MakeLowercase{\detokenize{#1}}}

No entanto, isso não funciona. Acho que preciso adicionar alguns \csnamescomandos \expandaftere tudo o mais, mas minha compreensão do que esses comandos realmente fazem é muito limitada. Qualquer sugestão seria muito apreciada. Talvez eu devesse ter postado isso como um comentário no tópico original, mas como acabei de entrar no site, não tenho reputação suficiente para fazer isso.

Responder1

Podemos examinar a versão em minúsculas do termo.

\documentclass{article}

%%% Code to set up special term treatment
\makeatletter
\newcommand{\specialterms}[1]{%
  \@for\next:=#1\do
    {\@namedef{specialterm@\detokenize\expandafter{\next}}{}}%
}
\newcommand\term[1]{%
  \specialterm@lower{#1}% save the lowercased term in \specialterm@current
  \@ifundefined{specialterm@\specialterm@current}
    {#1}% not the first occurrence
    {% first occurrence
     \emph{#1}% print it in italics
     % then undefine the macro
     \global\expandafter\let\csname specialterm@\specialterm@current\endcsname\relax
    }%
}
\newcommand{\specialterm@lower}[1]{%
  \begingroup\edef\next{\detokenize{#1}}%
  \edef\x{\endgroup\lowercase{\def\noexpand\specialterm@current{\next}}}\x
}
\makeatother

%%% Here we define the special terms we want
\specialterms{foo,bar,baz}

\begin{document}

First occurrence of \term{foo} and second occurrence of \term{foo}.

First occurrence of \term{baz}. \term{Bar} and
again \term{bar} and \term{baz} and \term{foo}.

\end{document}

insira a descrição da imagem aqui

Uma implementação mais simples com expl3, que também funciona com UTF-8 (embora não seja obrigatório).

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{xparse}

%%% Code to set up special term treatment
\ExplSyntaxOn
\NewDocumentCommand{\specialterms}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \bool_new:c { \__lasse_boolean_name:n { ##1 } _bool }
   }
 }

\NewDocumentCommand{\term}{m}
 {
  \bool_if:cTF { \__lasse_boolean_name:n { #1 } _bool }
   {
    #1
   }
   {
    \emph { #1 }
    \bool_gset_true:c { \__lasse_boolean_name:n { #1 } _bool }
   }
 }

% syntactic sugar
\cs_new:Nn \__lasse_boolean_name:n
 {
  g_lasse_specialterms_ \str_lowercase:n { #1 }
 }
\ExplSyntaxOff

%%% Here we define the special terms we want
\specialterms{foo,bar,báz,bäz}

\begin{document}

First occurrence of \term{foo} and second occurrence of \term{foo}.

First occurrence of \term{báz}. \term{Bar} and
again \term{bar} and \term{báz} and \term{foo}.

\term{Bäz} \term{bäz}

\end{document}

Responder2

Aqui está uma solução

\documentclass{article}

\newcommand*{\term}[1]{%
\lowercase{\expandafter\ifx\csname mt\detokenize{#1}term\endcsname\relax}
\emph{#1}%
\lowercase{\expandafter\let\csname mt\detokenize{#1}term\endcsname\empty}%
\else#1\fi}
\begin{document}
First occurrence of \term{foo} and second occurrence of \term{foo}.

First occurrence of \term{baz}. Now \term{bar} and
again \term{bar} and \term{baz} and \term{foo}. \term{fOo}


First occurrence of \term{BOM}. Now \term{bOm} and
again \term{BOm} and \term{bom} and \term{FOo} and \term{fOo}.
\end{document}

informação relacionada