단어의 첫 번째 출현을 강조합니다. 대소문자를 구분하지 않게 만들기

단어의 첫 번째 출현을 강조합니다. 대소문자를 구분하지 않게 만들기

처음으로 질문합니다.

이 질문에 대한 egregs 답변을 구현하고 있습니다.특정 단어의 첫 번째 발생 강조 표시

%%% 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}

이는 목록에 있는 단어의 첫 번째 언급을 강조합니다 \specialterms. 현재는 잘 작동하고 있습니다. 에 나열된 단어의 대문자 버전을 인식하여 \specialterms문장의 첫 번째 단어와 더 잘 작동하도록 하고 싶습니다 . 위의 예를 사용하여 \term{Foo}Foo를 목록에 추가하지 않고도 강조하고 싶습니다 \specialterms.

나는 다음을 시도했다:

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

그러나 이것은 작동하지 않습니다. 나는 몇 가지 명령과 당신이 가지고 있는 것을 추가해야 한다고 생각 \csnames하지만 \expandafter이러한 명령이 실제로 수행하는 작업에 대한 나의 이해는 매우 제한적입니다. 어떤 제안이라도 주시면 감사하겠습니다. 원래 스레드에 이 내용을 댓글로 게시했어야 했지만, 방금 사이트에 가입했기 때문에 이 작업을 수행할 평판이 충분하지 않습니다.

답변1

용어의 소문자 버전을 검토할 수 있습니다.

\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}

여기에 이미지 설명을 입력하세요

UTF-8에서도 작동하는 더 간단한 구현입니다 expl3(필수는 아님).

\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}

답변2

여기에 해결책이 있습니다

\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}

관련 정보