Pode groff criar um arquivo ps com caracteres de escape ANSI interpretados?

2

Esta pergunta é inspirada por essa na SU . Como posso imprimir em negrito ou em cores usando lp e seqüências de escape ANSI? Eu sei como exibir, por exemplo, texto em negrito no terminal:

$ echo -e '3[01;1mthis text will be bold3[00;0m,this will not'
this text will be bold,this will not

No entanto, quando eu canalizo isso diretamente para lp , recebo um arquivo assim:

01;1mthis text will be bold00;0m,this will not

Então, eu acho que a maneira de fazer isso seria usar groff para criar um arquivo postscript e imprimi-lo. Parece que groff deve ser capaz de fazer isso, eu sei que ele pode converter corretamente uma página man para um arquivo ps e manter o que estiver em negrito na página man bold no postscript. No entanto, a documentação groff é enorme e meio esotérica para alguém sem experiência com postscript. Eu tentei várias combinações de opções, todas resultando em um arquivo postscript que se parece com a linha acima:

echo  -e '3[01;1mthis text will be bold3[00;0m,this will not' | groff >a.ps
echo  -e '3[01;1mthis text will be bold3[00;0m,this will not' | groff -c >a.ps
echo  -e '3[01;1mthis text will be bold3[00;0m,this will not' | groff -Pc >a.ps
echo  -e '3\[01;1m\]this text will be bold3\[00;0m\],this will not' | groff -Tascii >a.ps 
echo  -e '3[01;1mthis text will be bold'| groff -man >a.ps 
echo  -e '3[01;1mthis text will be bold'| groff -mdoc >a.ps 
echo  -e '3[01;1mthis text will be bold'| groff -me >a.ps
echo  -e '3[01;1mthis text will be bold'| groff -mm >a.ps
echo  -e '3[01;1mthis text will be bold'| groff -ms >a.ps

Então, como posso usar lp e groff ou qualquer outra combinação de ferramentas para imprimir texto em negrito ou colorido no terminal?

    
por terdon 28.03.2013 / 18:51

3 respostas

4

Isso é mais o contrário do que groff foi projetado para fazer.

O que você procura pode ser alcançado pelo menos com essa combinação de ferramentas:

Como:

printf '\e[31;1mfoo\e[mbar\n' |
  aha |
  wkhtmltopdf - - |
  pdf2ps - output.ps

Um pouco exagerado, mas faz o truque. Provavelmente, você pode pular a última parte, pois o PDF é tão facilmente impresso quanto o postscript atualmente:

printf '\e[31;1mfoo\e[mbar\n' |
  aha |
  wkhtmltopdf - output.pdf

Ou você pode alimentá-lo diretamente para lp para impressão.

    
por 28.03.2013 / 22:25
2

PostScript é uma linguagem de programação para colocar marcas no papel. Para tornar as ditas marcas coloridas, você deve incluir as instruções corretas no programa. Eles tomam uma forma muito diferente dos clones de escape ANSI brutos que os clones VT100 entendem.

Eu não lembro muito de troff (e quando eu escrevi minha tese com ele, as impressoras coloridas não eram nem um sonho ...), mas no LaTeX é possível escrever texto colorido que é traduzido em PDF ou PS para imprimir como tal. Mas juntando algo que lida com secuências de fuga e cospe LaTeX não será muito divertido, melhor escrever o texto colorido / com ousado / diretamente em troff ou LaTeX.

    
por 28.03.2013 / 18:58
1

Supondo que o seu subsistema de impressora possa manipular arquivos postscript coloridos, pode usar groff e amigos no terminal para marcar texto e gerar um arquivo de postscript com cores e fontes em negrito e itálico para a sua impressora:

$ cat i
.warn
.color
This is ordinary.
.ft B
This is bold.
.ft I
This is italic.
.ft R
This is ordinary.
.gcolor red
This is red.
.gcolor green
This is green.
.gcolor blue
This is blue.

$ groff i >out.ps
$ lpr out.ps         # printer subsystem must be able to handle postscript

Você pode facilmente formatar exatamente o mesmo arquivo como ASCII com cor ANSI seqüências de escape e exibi-lo em seu terminal:

$ groff -Tascii i    # output appears, in colour, on your screen

Você também pode usar outros dispositivos de saída -T com exatamente o mesmo arquivo de entrada:

$ groff -Thtml i
<!-- Creator     : groff version 1.21 -->
<!-- CreationDate: Wed Oct 16 21:05:36 2013 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
  p       { margin-top: 0; margin-bottom: 0; vertical-align: top }
  pre     { margin-top: 0; margin-bottom: 0; vertical-align: top }
  table   { margin-top: 0; margin-bottom: 0; vertical-align: top }
  h1      { text-align: center }
</style>
<title></title>
</head>
<body>
<hr>
<p>This is not bold. <b>This is bold.</b> <i>This is
italic.</i> This is not bold. <font color="#FF0000">This is
red.</font> <font color="#00FF00">This is green.</font>
<font color="#0000FF">This is blue.</font></p>
<hr>
</body>
</html>

Usando groff como sua linguagem de marcação, você pode imprimir em negrito ou colorido texto do terminal.

    
por 17.10.2013 / 03:09