
Я имею дело с некоторыми данными, к которым я хотел бы применить автоматическое форматирование. Я пытаюсь использовать пакет listings, чтобы определить "язык", который подходит для моей модели, но у меня ничего не получается.
Например, я хотел бы отформатировать это:
3 HHHHHHHHHHHHHHLLLHH 21
||| | |
3 LLHHHHHHHHHHHHLLLLL 21
Что-то вроде этого:
То есть, буква H с определенным цветом, буква L с другим цветом и т. д. Было бы довольно просто, если бы между буквами были пробелы, так как
\lstdefinelanguage{MyKindOfLanguage}
{morekeywords={H,L,E},
sensitive=true,
}
Распознает H, L и E как ключевые слова, но в моем случае между этими символами нет пробелов. Возможно, я использую не тот пакет для этого, поэтому я спрашиваю, есть ли способ сделать это. Если бы я использовал regex для указания шаблонов, было бы лучше. Я мог бы написать программу для перевода этого кода в форматированный с помощью \textcolor, но я хотел бы позволить компилятору сделать это за меня.
решение1
\documentclass{article}
\usepackage{color}
{
\catcode`H\active
\catcode`L\active
\catcode`\ \active
\gdef\foo{%
\catcode`H\active
\catcode`L\active
\catcode`\ \active
\ttfamily\obeylines\obeyspaces
\def {\ }%
\defH{\textcolor{magenta}{\stringH}}%
\defL{\textcolor{yellow}{\stringL}}%
}%
}%
\def\endfoo{\par}
\begin{document}
\begin{foo}
3 HHHHHHHHHHHHHHLLLHH 21
||| | |
3 LLHHHHHHHHHHHHLLLLL 21
\end{foo}
\end{document}
решение2
Использоватьlistings
возможность literate
указать поиск и замену для каждой из букв, которые вы хотите раскрасить:
\documentclass{article}
\usepackage{listings,xcolor}
\lstnewenvironment{foo}[1][]
{\lstset{
basicstyle=\ttfamily,
literate={H}{{{\color{red!20!blue}H}}}1
{L}{{{\color{yellow!20!green}L}}}1,
#1
}}
{}
\begin{document}
\begin{foo}
3 HHHHHHHHHHHHHHLLLHH 21
||| | |
3 LLHHHHHHHHHHHHLLLLL 21
\end{foo}
\end{document}
решение3
Немного сложнее, но с гораздо более удобным интерфейсом для определения цветов:
\documentclass{article}
\usepackage{xparse,l3regex,xcolor}
\usepackage{lipsum}
\ExplSyntaxOn
\NewDocumentCommand{\foo}{}
{
\begin{flushleft}\ttfamily
% we need to make spaces active, so we let them to a skip
% the change is local to the flushleft environment
\char_set_active_eq:nN { `\ } \buzatto_foo_space:
\char_set_catcode_active:n { `\ }
\buzatto_foo_process:n
}
\NewDocumentCommand{\definefoocolor}{mm}
{
% store in a property list: <letter> -> <color>
\prop_gput:Nnn \g_buzatto_foo_prop { #1 } { #2 }
}
\tl_new:N \l_buzatto_foo_arg_tl
\prop_new:N \g_buzatto_foo_prop
\cs_new_protected:Nn \buzatto_foo_space:
{
\hspace*{.5em}
}
\cs_new_protected:Nn \buzatto_foo_process:n
{
\tl_set:Nn \l_buzatto_foo_arg_tl { #1 }
% process all the keys in the property list
\prop_map_inline:Nn \g_buzatto_foo_prop
{
% any run of the current letter is changed into
% \textcolor{<color>}{<run of letters>}
\regex_replace_all:nnN
{ (##1+) }
{ \c{textcolor}\cB\{##2\cE\}\cB\{\1\cE\} }
\l_buzatto_foo_arg_tl
}
% use the returned token list
\tl_use:N \l_buzatto_foo_arg_tl
\end{flushleft}
}
\ExplSyntaxOff
\definefoocolor{H}{red!20!blue}
\definefoocolor{L}{yellow!20!green}
\begin{document}
\lipsum[2]
\foo{
3 HHHHHHHHHHHHHHLLLHH 21 \\
||| | | \\
3 LLHHHHHHHHHHHHLLLLL 21
}
\lipsum[3]
\end{document}