
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:
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
\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
Verwendenlistings
literate
, um für jeden Buchstaben, den Sie einfärben möchten, eine Suchen-und-Ersetzen-Funktion anzugeben :
\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}