[Tex/LaTex] How to insert a keyword with accents (extendedchars) in listings

listings

This is what I would like to do:

morekeywords={SENÃO, ENTÃO, FAÇA, ATÉ, ENQUANTO, PARA, SE, DECLARA, DECLARE, E, OU, FIM_ENQUANTO, FIM_PARA}

I'm defining a new language, and I would like to use natural language words as keywords.

The problem is with keywords: SENÃO, ENTÃO, FAÇA, ATÉ.

I have solved the first problem, in showing special chars with:
How to insert code with accents with listings?

The alsoletter here, doesn't work for me, I got an error when using it: alsoletter={Ç,É,Ã}.

test.tex

\documentclass{article}

\usepackage[brazilian]{babel}
\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc}
\usepackage{listingsutf8}

\usepackage{listings}

\lstset{%
        inputencoding=utf8,
        extendedchars=true,
        literate=%
        {é}{{\'{e}}}1
        {è}{{\`{e}}}1
        {ê}{{\^{e}}}1
        {ë}{{\¨{e}}}1
        {É}{{\'{E}}}1
        {Ê}{{\^{E}}}1
        {û}{{\^{u}}}1
        {ù}{{\`{u}}}1
        {â}{{\^{a}}}1
        {à}{{\`{a}}}1
        {á}{{\'{a}}}1
        {ã}{{\~{a}}}1
        {Á}{{\'{A}}}1
        {Â}{{\^{A}}}1
        {Ã}{{\~{A}}}1
        {ç}{{\c{c}}}1
        {Ç}{{\c{C}}}1
        {õ}{{\~{o}}}1
        {ó}{{\'{o}}}1
        {ô}{{\^{o}}}1
        {Õ}{{\~{O}}}1
        {Ó}{{\'{O}}}1
        {Ô}{{\^{O}}}1
        {î}{{\^{i}}}1
        {Î}{{\^{I}}}1
        {í}{{\'{i}}}1
        {Í}{{\~{Í}}}1
}

\lstdefinelanguage{pseudo}
{
extendedchars=true,
alsoletter={_},
morekeywords={ENQUANTO,PARA,SE,SEN\~{A}O,ENTÃO,ATÉ,FA\c{C}A,DECLARA,DECLARE,E,OU,FIM_ENQUANTO,FIM_PARA,FAÇA},
ndkeywords={NUMERO,TEXTO,LEIA,ESCREVA},
sensitive=true,
morecomment=[l]{//},
morecomment=[s]{/*}{*/},
morestring=[b]"
}

\begin{document}
\lstinputlisting[language=pseudo]{foo.pseudo}
\end{document}

foo.pseudo

ENQUANTO nota != -1 FAÇA
// Comment example
 LEIA nota
 SE nota >= 7 ENTÃO
   ESCREVA "Aprovado"
 SENÃO
   ESCREVA "Reprovado"
   TEST "Algo mais"
/*
mais 
comentário
*/

FIM_ENQUANTO 

I have seen:

Best Answer

I managed to "solve" this by replicating the keywordstyle within the literate set. There is probably a better way to do it, but this works well for a few keywords.

\documentclass{article}

\usepackage[brazilian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{color}
\usepackage{listings}

\newcommand\keywordstyle[1]{{\color{red}\bfseries{#1}}}%

\lstset{%
literate=
        {Ç}{{\c{C}}}1
        {Ã}{{\~{A}}}1
        {á}{{\'{a}}}1
        {ENTÃO}{{\keywordstyle{ENT\~{A}O}}}5
        {SENÃO}{{\keywordstyle{SEN\~{A}O}}}5
        {FAÇA}{{\keywordstyle{FA\c{C}A}}}4
}

\lstdefinelanguage{pseudo}
{
extendedchars=true,
alsoletter={_},
morekeywords={ENQUANTO,PARA,SE,DECLARA,DECLARE,E,OU,FIM_ENQUANTO,FIM_PARA},
ndkeywords={NUMERO,TEXTO,LEIA,ESCREVA},
sensitive=true,
morecomment=[l]{//},
morecomment=[s]{/*}{*/},
morestring=[b]"
}

\begin{document}
\lstinputlisting[language=pseudo]{foo.pseudo}
\end{document}