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