自动为先前定义的文本字符串着色

自动为先前定义的文本字符串着色

我正在为某些语言创建一些包含名词、形容词等词形变化的表格。我想为这些实例的某些结尾着色,但手动操作非常繁琐,所以我尝试寻找一种自动化方法。我到处搜索,并在聊天中询问,但什么也没找到。

我本可以使用这些listing包,但字符串是普通文本,而不是代码。此外,还有一些障碍使实现这一点变得更加困难:

  • 在这种情况下,字母不是拉丁字母,而是俄文。

  • 虽然只是单词的结尾,而不是整个单词,但有些结尾匹配单个单词。例如,莫戈是属格(我的),但也有埃戈(他的)。我不希望这最后一个是彩色的。

    例如,如果颜色 = 粗体,则它们应该显示为“мо埃戈“和”его“。下面我将提供一个我想要的非常简单的例子。如果可能的话,我想在不使用表格中的命令的情况下做到这一点(尽管我对此表示严重怀疑)。

这可行吗?这是我想要的结果和一个非常简单的示例。在这种情况下,有一个结局和一种颜色,但我想将其与多种颜色和多种结局一起使用。

表格图

\documentclass[margin=10pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xcolor}

\begin{document}
\begin{tabular}{|c|c|}\hline
  мой & мо\textcolor{blue}{его} \\
  твой & тво\textcolor{blue}{его} \\
  его/её & его/её \\
  наш & наш\textcolor{blue}{его} \\
  ваш & ваш\textcolor{blue}{его} \\
  их & их \\ \hline
\end{tabular}
\end{document}

答案1

我会手动标记后缀,但让 tex 从预先确定的列表中选择颜色:

在此处输入图片描述

\documentclass[margin=10pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xcolor}

\def\>#1 {\csname suffix\detokenize{#1}\endcsname{#1} }

\expandafter\def\csname suffix\detokenize{его}\endcsname{\textcolor{blue}}
\expandafter\def\csname suffix\detokenize{х}\endcsname{\textcolor{red}}
\expandafter\def\csname suffix\detokenize{её}\endcsname{\textcolor{green}}

\begin{document}
\begin{tabular}{|c|c|}\hline
  мой & мо\>его \\
  твой & тво\>его \\
  его/её & его/\>её \\
  наш & наш\>его \\
  ваш & ваш\>его \\
  их & и\>х \\ \hline
\end{tabular}
\end{document}

请注意,此处单词后面的空格是必需的。(如有必要,可以避免)

答案2

按照您的新示例我可以向您展示如何在 TeX 中进行设置。

\input cyrchars
\input opmac

\def\t#1[#2,#3]#4// {{\rulewidth=.8pt \localcolor#1\def\tmpb{#4}%
   \ifx^#2^\else \replacestrings{ #2 }{ {#2} }\replacestrings{#2 }{{#1#2}}\fi
   \ifx^#3^\else \replacestrings{ #3 }{ {#3} }\replacestrings{#3 }{{#1#3}}\fi
   \frame{\vbox{\Black\expandafter\tA\tmpb//}}}%
   \kern5pt
}
\def\tA #1/{\if/#1/\else \hbox to4em{\strut\hss#1\hss}\expandafter\tA\fi}

\hbox{%
\t \Blue[,]    мой / твой / его / её  / наш / ваш / их //   
\t \Blue[его,] моего / твоего / его / её / нашего / вашего / их //
\t \Blue[ему,] моему / твоему / его / её / нашему / вашему / их //
\t \Blue[его,] моего / твоего / его / её / нашего / вашего / их //
\t \Blue[,]    мой / твой / его / её  / наш / ваш / их //     
\t \Blue[им,]  моим / твоим / его / её / нашим / вашим / их //
\t \Blue[ём,]  моём / твоём / его / её / нашём / вашём / их //
}\kern5pt
\hbox{%
\t \Red[я,a]  моя / твоя / его / её  / нашa / вашa / их //   
\t \Red[ей,]  моей / твоей / его / её / нашей / вашей / их //
\t \Red[ей,]  моей / твоей / его / её / нашей / вашей / их //
\t \Red[ю,у]  мою  / твою / его / её  / нашу / вашу / их //  
\t \Red[ю,у]  мою  / твою / его / её  / нашу / вашу / их //  
\t \Red[ей,]  моей / твоей / его / её / нашей / вашей / их //
\t \Red[ей,]  моей / твоей / его / её / нашей / вашей / их //
}\kern5pt
\hbox{%
\t \Green[ё,е]   моё / твоё / его / е{ё}  / наше / ваше / их //     
\t \Green[его,]  моего / твоего / его / её / нашего / вашего / их //
\t \Green[ему,]  моему / твоему / его / её / нашему / вашему / их //
\t \Green[ё,е]   моё / твоё / его / е{ё}  / наше / ваше / их // 
\t \Green[ё,е]   моё / твоё / его / е{ё}  / наше / ваше / их // 
\t \Green[им,]   моим / твоим / его / её / нашим / вашим / их //
\t \Green[ём,ем] моём / твоём / его / её  / нашем / вашем / их //
}   
\bye

用来pdfcsplain处理这个,因为\input cyrchars使用了 csplain 的 UTF8 特性。结果:

莫杰

主要思想是存储转换后的字符串并使用转换过程\replacestrings(我希望 LaTeX 有类似的东西)。转换过程执行以下操作:

\replacestrings{ его }{ {его} }% no conversions, if the suffix=word.
\replacestrings{его }{{\Blue его} }% do conversion

答案3

首先,我要说的是,我不是 xparse.sty 细节方面的专家。话虽如此,我突然想到这样的事情可能会有用:

\documentclass[margin=10pt]{standalone} 
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{collcell}

%% This is a two-part process. collcell.sty wraps the contents of
%% the cell in braces {...}. The first step is to remove the braces.
%% The word in the cell is then split into two arguments at the '.',
%% the second argument possibly being empty (no '.').
%% Change the {.} below to a {*} or a {-} or whatever you like.
%% Note that the default color, blue, is set here.
\DeclareDocumentCommand{\foo}{m}{\fooa#1\stop}
\DeclareDocumentCommand{\fooa}
    {O{blue}>{\SplitArgument{1}{.}}u{\stop}}
    {\coloritt[#1]#2}

%% If there is no '.' just print the word; otherwise print
%% the first half in black and the second half in blue.
\DeclareDocumentCommand\coloritt{omm}{%
     \IfNoValueTF{#3}{#2}{#2\textcolor{#1}{#3}}%
}

%% This is necessary to be able to use the contents of the
%% cell as an argument to \foo.
\newcolumntype{C}{>{\collectcell\foo}c<{\endcollectcell}} 

\begin{document}

\begin{tabular}{|c|C|}\hline
   мой & мо.его \\
   твой &[red] тво.его \\ %% <<-- Alternate color
   его/её & его/её \\
   наш & наш.его \\
   ваш & ваш.его \\
   их & их \\ \hline
 \end{tabular}

\end{document}

由此产生了如下结果:

表格的新示例

只需在想要彩色文本开始的单词中添加一个句点即可。我使用了句点——您可以使用星号甚至连字符。

之后

正如我所说,我不是这方面的专家,但 Joseph Wright 是。感谢他回答我的问题,我修改了代码,以便可以使用其他颜色。只需添加[<color>]到单元格即可——代码中有示例。

答案4

进一步追求 sgmoye 的想法,这里有一个l3regex可以轻松扩展到多个颜色变化标记的实现。

\documentclass[margin=10pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[russian]{babel}
\usepackage{xcolor}
\usepackage{xparse,l3regex}
\usepackage{collcell}

\newcolumntype{C}{>{\collectcell\colorterm}c<{\endcollectcell}}

\ExplSyntaxOn
\NewDocumentCommand{\colorterm}{m}
 {
  \alenanno_colorterm:n { #1 }
 }

\tl_new:N \l_alenanno_colorterm_word_tl

% add here the tokens that mark the color change
% for the moment . and / are set
\regex_const:Nn \c_alenanno_markers_regex { ([./]) (.*) }

\cs_new_protected:Nn \alenanno_colorterm:n
 {
  \tl_set:Nn \l_alenanno_colorterm_word_tl { #1 }
  \regex_replace_once:NnN \c_alenanno_markers_regex
   { \c{alenanno_colorize:nn}\cB\{\1\cE\}\cB\{\2\cE\} }
   \l_alenanno_colorterm_word_tl
  \tl_use:N \l_alenanno_colorterm_word_tl
 }

\cs_new:Nn \alenanno_colorize:nn
 {
  \textcolor{alenanno#1}{#2}
 }
\ExplSyntaxOff

% any token denoting a color change should have
% a corresponding color (name prefixed by alenanno)
\definecolor{alenanno.}{rgb}{1,0,0}
\definecolor{alenanno/}{rgb}{0,0,1}

\begin{document}

\begin{tabular}{|c|C|}\hline
  мой & мо.его \\
  твой & тво.его \\
  его/её & его/её \\
  наш & наш.его \\
  ваш & ваш.его \\
  их & их \\ \hline
\end{tabular}
\end{document}

\colorterm命令也可以在运行文本中使用\colorterm{мо.его},效果相同。

在此处输入图片描述

你想添加另一个标记吗?比如说?,将其添加到列表中

\regex_const:Nn \c_alenanno_markers_regex { ([./?]) (.*) }

并且也

\definecolor{alenanno?}{rgb}{x,y,z}

(或使用 中的任何颜色定义命令xcolor)。

解释。输入мо.его被转换成

мо\alenanno_colorize:nn{.}{его}

并且\alenanno_colorize:nn{#1}{#2}是 的语法糖\textcolor{alenanno#1}{#2}

相关内容