Buchstaben oder Muster automatisch einfärben

Buchstaben oder Muster automatisch einfärben

Ich beschäftige mich mit einigen Daten, auf die ich einen automatischen Formatierer anwenden möchte. Ich versuche, das Listings-Paket zu verwenden, um eine „Sprache“ zu definieren, die in mein Modell passt, aber ich habe keinen Erfolg.

Ich möchte beispielsweise Folgendes formatieren:

3 HHHHHHHHHHHHHHLLLHH  21
        |||  |   |   
3 LLHHHHHHHHHHHHLLLLL  21

Zu so etwas:

Bildbeschreibung hier eingeben

D. h. der Buchstabe H in einer bestimmten Farbe, der Buchstabe L in einer anderen Farbe und so weiter. Es wäre ziemlich einfach, wenn es Leerzeichen zwischen den Buchstaben gäbe, da

\lstdefinelanguage{MyKindOfLanguage}
    {morekeywords={H,L,E},
    sensitive=true,
}

Würde H, L und E als Schlüsselwörter erkennen, aber in meinem Fall gibt es keine Leerzeichen zwischen diesen Zeichen. Vielleicht verwende ich dafür das falsche Paket, deshalb frage ich, ob es eine Möglichkeit gibt, dies zu tun. Wenn ich Regex verwenden würde, um die Muster anzugeben, wäre es besser. Ich könnte ein Programm schreiben, um diesen Code mit \textcolor in einen formatierten Code zu übersetzen, aber ich möchte das lieber dem Compiler überlassen.

Antwort1

Bildbeschreibung hier eingeben

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

Antwort2

Verwendenlistingsliterate, um für jeden Buchstaben, den Sie einfärben möchten, eine Suchen-und-Ersetzen-Funktion anzugeben :

Bildbeschreibung hier eingeben

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

Antwort3

Etwas kompliziert, aber mit einer viel benutzerfreundlicheren Schnittstelle zum Definieren der Farben:

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

Bildbeschreibung hier eingeben

verwandte Informationen