自动格式化 PDFLaTeX 文档中关键字列表中的单词

自动格式化 PDFLaTeX 文档中关键字列表中的单词

在撰写技术文档时,我经常希望以特定方式格式化“技术短语”(例如某些技术的名称),但当我频繁输入这些短语时,就会变得很烦人。

我想知道是否有一种方法可以在我的 LaTeX 文档中定义一个“关键字”列表,当在文档中的其他地方遇到该列表时,该列表会自动以特定方式格式化(我将定义)。

例如,当前的方法如下:

The \textbf{gmond} daemon is the blurst. I hate \textbf{gmond} and \textbf{gmetad}.

我可以写一些类似的东西

\keywords{gmond, gmetad}{\textbf}

The gmond daemon is the blurst. I hate gmond and gmetad.

这将产生与上面相同的输出。

这有可能吗?我很高兴能够写\gmond,只要我不必为关键字列表中的每个单词定义命令。

答案1

这是一个keywordmarkup生成器方法expl3(注意:关键字,而不是关键短语)

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\clist_new:N \l_antiearth_keywords_clist

\newcommand{\keywordslist}[2]{%
  \clist_set:Nn \l_antiearth_keywords_clist {#1}
  \clist_map_inline:Nn \l_antiearth_keywords_clist {%
    \expandafter\newcommand\csname ##1\endcsname{{#2 ##1}}
  }
}
\ExplSyntaxOff

\begin{document}
\keywordslist{gmond, gmetad}{\bfseries}

Here is an example with \gmond\ and \gmetad. 

\end{document}

更新

使用不同的列表(样式处理还不是很好)

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\keywordslist}{mmm}{%
  \clist_new:c {l_antiearth_#1_clist}
  \clist_set:cn {l_antiearth_#3_clist} {#2}
  \clist_map_inline:cn {l_antiearth_#3_clist} {%
    \expandafter\NewDocumentCommand\csname ##1\endcsname{}{{\csname #3\endcsname ##1}}
  }
}
\ExplSyntaxOff

\begin{document}
\keywordslist{boldlist}{gmond, gmetad}{bfseries}
\keywordslist{italiclist}{other, nope}{itshape}

Here is an example with \gmond\ and \gmetad.

Here is an example with \other\  and \nope.


\end{document}

在此处输入图片描述

答案2

您可以将项目添加到列表中,并替换命令参数中的单词。您可以使用

\keywords{comma separated list}{\text…}

其中\text…必须是一个只接受一个参数的命令。替换是通过

\applykeywords{text}

因为text在空格处被分割,所以必须考虑标点符号,请参见下面的示例。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \g_anti_keywords

\cs_new_protected:Npn \anti_add_keywords:nN #1#2
 {
  \clist_map_inline:nn { #1 }
   {
    \tl_gput_right:Nn \g_anti_keywords {{##1}{#2{##1}}}
   }
 }

\cs_new_protected:Npn \anti_apply_keywords:n #1
 {
  \seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
  \seq_map_inline:Nn \l_tmpa_seq
   {
    \str_case:nVF { ##1 } \g_anti_keywords { ##1 } ~
   }
   \tex_unskip:D
 }

\NewDocumentCommand \keywords { m m }
 {
  \anti_add_keywords:nN { #1 } #2
 }

\NewDocumentCommand \applykeywords { m }
 {
  \anti_apply_keywords:n { #1 }
 }

\ExplSyntaxOff

\begin{document}
\keywords{gmond, gmetad}{\textbf}
\keywords{blurst., gmetad.}{\textit}

\applykeywords{The gmond daemon is the blurst. I hate gmond and gmetad.}
\end{document}

在此处输入图片描述

答案3

\documentclass[12pt,letterpaper,fleqn,parskip=half]{scrartcl}
\usepackage[T1]{fontenc} 
\usepackage[latin1]{inputenc} 
\usepackage{bookman} 
\newcommand{\gm}{\textbf{gmond}}
\newcommand{\gt}{\textbf{gmetad}}

\begin{document}

The \gm\ daemon is the blurst. I hate \gm\ and \gt.

\end{document}

然而,回应@Anti Earth 对上述内容的公正批评,xelatex (感谢@jfbu)似乎以一种简约的方式很好地做到了这一点:

\documentclass {article}
\usepackage {fontspec}
\setmainfont {TeX Gyre Schola} 
\usepackage{soul}
\usepackage{color}
\sethlcolor{yellow}
\usepackage{xesearch}   
\UndoBoundary{-}
\SearchList{phrases}{\hl{#1}}{555-222-1212,Fido,Tinkerbell}
\robustify{\hl}
\SearchList{poems}{\textbf{#1}}{theatre,convention,Timbuktu}
\SearchList{advice}{\textit{#1}{productive,conductive,inductive}

  \begin{document}

    Once upon a time Tinkerbell called the Fairy Princess, at 555-222-1212, to complain that Fido was tinkling on the pretty flowers.
    \bigskip

    Away from the town of Timbuktu

    The theatre of the wise

    And the convention of the poor

    Combined to make the party
    \bigskip

    Your counsel is to only be seen as productive if conductive to proper inductive reasoning.

  \end{document}

生成结果:

在此处输入图片描述

相关内容