amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Drucker(PRT:) Tabs setzen [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2007-01-06, 11:22 h

MaikG
Posts: 5172
User
Ich möchte gerne eine Tabelle Drucken, in Textform.
Die einzelnen Einträge sind mit bis zu 24 Zeichen, dh.
sind die Voreingestellten Tabs zu dicht zusammen.
Ich habe eine Escape Anweisung zum Tab setzen im WB Handbuch
gefunden, aber weiss nicht wie ich diese anwende. Steht ja nicht <n>
hinter der Sequence. Hab versucht Leerstrings und jeweils dann
die Sequence zu senden, das brachte keine Änderung.
Weiss jemand wie das geht?

[ - Answer - Quote - Direct link - ]

2007-01-06, 18:38 h

DaxB
Posts: 1422
User
@MaikG:
@MaikG:
Guck mal ins ViNCEd.guide (Aminet). Da stehen ESC, CSI, Steuerzeichen und noch mehr erklärt. Ansonsten hilft vielleicht http://de.wikipedia.org/wiki/Steuerzeichen weiter.

Meinst du mit Drucken, auf Papier oder Konsole/Datei/...?

[ - Answer - Quote - Direct link - ]

2007-01-06, 23:56 h

MaikG
Posts: 5172
User
>Meinst du mit Drucken, auf Papier oder Konsole/Datei/...?

Papier, per PRT: halt. Der Amiga verwendet dafür eigenene
Codes, das im Link ist was anderes. Aminet ist schon wieder
offline.

Ich kenne ja den Befehl, aber ich weiss nicht wie ich damit
ein Tabulator an einer bestimmten Position setzten kann.

Wie ich prinzipell ein Tab Ausgebe weiss ich ja, mit CHR$(9)

[ - Answer - Quote - Direct link - ]

2007-01-07, 12:54 h

DaxB
Posts: 1422
User
@MaikG:
Hier ein kleiner Auszug aus ViNCEd.guide (sollte auch OS3.9 beiliegen):
Vielleicht hilft das ja schon.

ESC H :(C)
The seven bit equivalent of HST, sets a tabulator stop at the current cursor position.

K.A ob CSI für das Drucken funktionieren.

The complete set of CSI sequences follow. They are all introduced by the CSI
code 0x9B (=155 decimal), which can be replaced by ESC [. As
above, "n" is again a number which can be dropped and defaults to
one, unless otherwise stated.


CSI n W :(C)

Cursor TAB control; details are controlled by the argument n.

n=0 :(C) (Default) Set TAB stop at cursor position
n=2 :(C) Clear TAB stop at cursor position
n=5 :(C) Clear all TAB stops


CSI n I :(C)(2)

Move to the next nth TAB stop. If ommitted, this defaults to one. The
argument n is an extension and is allowed to be negative to move backwards.

[ Dieser Beitrag wurde von DaxB am 07.01.2007 um 12:55 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2007-01-07, 15:14 h

MaikG
Posts: 5172
User
>ESC H :(C)
>The seven bit equivalent of HST, sets a tabulator stop at the
>current cursor position.


Also EscH steht im handbuch was das :(C) sein soll weiss ich
nicht. Im Hadbuch ist das ohne Parameter.

Und das hab ich so probiert

Esc[3g - Alle Horizontaltabs löschen

1234567890123456790123 EscH 12345678901234567890123 EscH usw.
Die Zahlen sind aber Space.
Die Tabs waren unverändert so ca. bei 15.

>K.A ob CSI für das Drucken funktionieren.

Was ist CSI??




[ Dieser Beitrag wurde von MaikG am 07.01.2007 um 15:15 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2007-01-07, 15:57 h

Ralf27
Posts: 2779
User
Zitat:
Original von MaikG:
Was ist CSI??


Wenn ich mich recht entsinne kann man mit CSI ( CHR$(155) ) eine Steuersequenz einleiten. z.b. bei Consolen, ob es auch bei Druckern funktioniert...
--
http://www.alternativercomputerclub.de.vu

[ - Answer - Quote - Direct link - ]

2007-01-07, 16:51 h

whose
Posts: 2156
User
@Ralf27:

Soweit ich weiß, sind dem printer.device die CSIs ziemlich egal. Die Codes kennt Maik ja auch schon, die für das printer.device relevant sind.

@MaikG:

Hast Du es mal probiert, den ersten Teil des Textes zu drucken (also die 24 Zeichen), dann ESC H... zu senden und den nächsten Teil zu drucken?

Vermutlich funktioniert das ähnlich wie bei der Console, daß die Tabs nur an der aktuellen "Cursorposition" (sprich: Druckkopf-Position) gesetzt werden können. Ich weiß zwar nicht, wie man das dann bei Texten lösen soll, die deutlich kürzer als 24 Zeichen sind und man zusätzlich einen Drucker hat, der "überflüssige" Leerzeichen "komprimiert", aber irgendeinen Sinn wird das schon haben.

Eventuell werden in diesem Fall (Setzen eines Tabs nach soundsoviel Leerzeichen) die Leerzeichen auch gar nicht wegoptimiert sondern doch ausgewertet. Das würde zwar bei wechselnden Tabs erfordern, daß man eine Zeile "doppelt druckt", aber wenns denn nicht anders geht... ;)

Genaues weiß ich leider selbst nicht, Textdruck via printer.device habe ich nie gemacht.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2007-01-07, 18:04 h

MaikG
Posts: 5172
User
>Hast Du es mal probiert, den ersten Teil des Textes zu drucken
>(also die 24 Zeichen), dann ESC H... zu senden und den nächsten
>Teil zu drucken?

Naja, das ist nicht so einfach weil der erste eintrag z.B.
2-24 Zeichen haben kann.
Deswegen hab ichs mit Leerzeichen probiert, aber ich kann ja
mal testen was passiert wenn ich stattdessen z.B. ein * nehme.

[ - Answer - Quote - Direct link - ]

2007-01-07, 18:37 h

whose
Posts: 2156
User
Zitat:
Original von MaikG:
>Hast Du es mal probiert, den ersten Teil des Textes zu drucken
>(also die 24 Zeichen), dann ESC H... zu senden und den nächsten
>Teil zu drucken?

Naja, das ist nicht so einfach weil der erste eintrag z.B.
2-24 Zeichen haben kann.
Deswegen hab ichs mit Leerzeichen probiert, aber ich kann ja
mal testen was passiert wenn ich stattdessen z.B. ein * nehme.


Hm, bedeutet das jetzt, daß es mit 24 Leerzeichen vor dem Tab-Steuerzeichen nicht funktioniert? Das wäre ja doof :(

Gabs da nicht auch ein "hartes" Blank? ASCII 128, wenn ich mich nicht irre. Eventuell tuts das ja.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2007-01-07, 19:27 h

Holger
Posts: 8116
User
Zitat:
Original von Ralf27:
Zitat:
Original von MaikG:
Was ist CSI??


Wenn ich mich recht entsinne kann man mit CSI ( CHR$(155) ) eine Steuersequenz einleiten. z.b. bei Consolen, ob es auch bei Druckern funktioniert...


<CSI> und <ESC>[ sind äquivalent. <CSI> ist letztendlich ein <ESC>, bei dem das oberste Bit gesetzt ist, also 27 + 128 => 155.

Zitat:
Original von whose:
Gabs da nicht auch ein "hartes" Blank? ASCII 128, wenn ich mich nicht irre. Eventuell tuts das ja.

#160 im iso-latin-1
ASCII geht nur bis 127.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-01-08, 03:06 h

whose
Posts: 2156
User
Zitat:
Original von Holger:
Zitat:
Original von whose:
Gabs da nicht auch ein "hartes" Blank? ASCII 128, wenn ich mich nicht irre. Eventuell tuts das ja.

#160 im iso-latin-1
ASCII geht nur bis 127.


Jup, 160 meinte ich. Ich habe mich ganz dunkel aus C=-ASCII (PETSCII)-Zeiten daran erinnert, daher mit ASCII (fälschlicherweise) gleichgesetzt. Normal habe ich mit Textausgabe sehr wenig zu tun ;)

Jetzt ist nur noch die Frage, ob es beim Setzen der TABs hilft...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2007-01-08, 17:15 h

MaikG
Posts: 5172
User
Ich habs mit 155 jetzt auch probiert und mit * vor dem Tab setzen
und mal mit Leerzeichen zwischen ESC und H, und mal mit kleinem
H. oder mit einer angabe hinter dem H - geht alles nicht.

[ - Answer - Quote - Direct link - ]

2007-01-09, 05:03 h

whose
Posts: 2156
User
@MaikG:

Kennst Du ein älteres Programm, das Tabs setzt beim Druck und mit Quellcode zu kriegen ist? Eventuell kann man sich das dort dann abschauen, wie das mit den Tabs funktioniert.

Bei Adressdatenbanken o.Ä. wurden die Tabs gern genutzt und es gab wohl auch welche, die rein mit Textdruck arbeiteten. Ich selbst kenne jetzt auf die Schnelle allerdings kein Programm :(

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2007-01-09, 10:19 h

MaikG
Posts: 5172
User
>Kennst Du ein älteres Programm, das Tabs setzt beim Druck und mit
>Quellcode zu kriegen ist? Eventuell kann man sich das dort dann
>abschauen, wie das mit den Tabs funktioniert.

Ich hatte noch keins was so druckt. Die Progger sind da alle
clever und wussten wie man das per Grafik ducken kann :-)

[ - Answer - Quote - Direct link - ]

2007-01-09, 10:36 h

whose
Posts: 2156
User
Zitat:
Original von MaikG:
>Kennst Du ein älteres Programm, das Tabs setzt beim Druck und mit
>Quellcode zu kriegen ist? Eventuell kann man sich das dort dann
>abschauen, wie das mit den Tabs funktioniert.

Ich hatte noch keins was so druckt. Die Progger sind da alle
clever und wussten wie man das per Grafik ducken kann :-)


Ich weiß nicht, was daran clever ist, langsamer zu drucken als nötig ;)

Wenn ich mal etwas Zeit erübrigen kann, wühl ich mal etwas im Aminet, vielleicht finde ich was dazu. Textdruck und Tabs kann man bestimmt irgendwann mal gebrauchen.

Edit: Ich bin auf die brilliante Idee gekommen, mir mal ein altes Druckerhandbuch zur Hand zu nehmen (Star LC-10). Da steht bei den horizontalen Tabstops, daß man nach Angabe aller (!) gewünschten Tabstops eine 0 als Abschluß folgen lassen sollte. Vielleicht ist das beim printer.device und dessen Steuerzeichenkonversion genauso?

Das würde dann bedeuten, daß Du ESCH.. gibst, dann alle von Dir vorgesehenen Tabstops und zum Schluß eine 0. Danach dann den Text drucken und jeweils ein TAB senden (also nicht das Steuerzeichen sondern das TAB-Zeichen).

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233


[ Dieser Beitrag wurde von whose am 09.01.2007 um 12:27 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2007-01-09, 12:37 h

Gazelle
Posts: 151
User
@whose:

Das setzen von Tabulatoren ist sicherlich Druckerabhängig. Der Druckertreiber muss es also unterstützen damit die Konsolensequenz in eine Druckeranweisung umgewandelt wird. Wenn ich mir den Beispielcode des Druckertreibers im NDK 3.9 so ansehe, würde ich sagen, dass dieser Treiber es nicht unterstützt (NDK_3.9/Examples/Printer/HP_DeskJet_CMYK/data.c).

Ich vermute mal, das die meisten Programme vor dem Ausdrucken die Tabulatoren in die entsprechende Anzahl von Leerzeichen umwandeln werden.

Ich habe hier eine PCL-Steuercode Liste, in der finde ich keine Sequenz um Tabulatoren zu setzten/löschen, nur eine für das setzen des Cursors auf eine bestimmte Position:
Horizontale Position: <ESC>&a#C (# = Nummer der Spalte)
Um also auf Spalte 30 zu Positionieren schickst Du: <ESC>&a30C (027 038 097 051 048 067)
ACHTUNG: Die Nummer wird wirklich in ASCII ausgeschrieben!

[ - Answer - Quote - Direct link - ]

2007-01-09, 13:00 h

Solar
Posts: 3680
User
Evtl. ein flinker Filter, der Tabs in stdin in eine entsprechende Anzahl Spaces in stdout verwandelt?

$ mount PIPE:
$ type <file> to PIPE:tmpfile
$ <progname> < PIPE:tmpfile > PRT:

Ich habe das jetzt nicht getestet, aber damit müßte die Ausgabe entsprechend Deinen Wünschen formatiert sein. (Ich weiß, mit ein paar {} mehr wäre der Code besser, aber ich wollte mich kurz fassen.)
C code:
#include <stdio.h>

int main()
{
    int c;
    size_t col = 1;
    const int TABSIZE = 24;
    for (;;)
    {
        if ( ( c = getchar() ) == EOF )
            break;
        if ( c == 't' )
            while ( col % TABSIZE )
            {
                putchar( ' ' );
                ++col;
            }
        else
        {
            putchar( c );
            if ( c == 'n' )
                col = 1;
            else
                ++col;
        }
    }
    return 0;
}



[ Dieser Beitrag wurde von Solar am 09.01.2007 um 13:02 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2007-01-09, 15:26 h

whose
Posts: 2156
User
Zitat:
Original von Gazelle:
@whose:

Das setzen von Tabulatoren ist sicherlich Druckerabhängig. Der Druckertreiber muss es also unterstützen damit die Konsolensequenz in eine Druckeranweisung umgewandelt wird. Wenn ich mir den Beispielcode des Druckertreibers im NDK 3.9 so ansehe, würde ich sagen, dass dieser Treiber es nicht unterstützt (NDK_3.9/Examples/Printer/HP_DeskJet_CMYK/data.c).

Ich vermute mal, das die meisten Programme vor dem Ausdrucken die Tabulatoren in die entsprechende Anzahl von Leerzeichen umwandeln werden.

Ich habe hier eine PCL-Steuercode Liste, in der finde ich keine Sequenz um Tabulatoren zu setzten/löschen, nur eine für das setzen des Cursors auf eine bestimmte Position:
Horizontale Position: <ESC>&a#C (# = Nummer der Spalte)
Um also auf Spalte 30 zu Positionieren schickst Du: <ESC>&a30C (027 038 097 051 048 067)
ACHTUNG: Die Nummer wird wirklich in ASCII ausgeschrieben!


Hm, also druckerabhängig ist es tatsächlich, weil gewisse einfache Drucker (und die modernen ohne Zeichensatz-Druck sowieso nicht) keine Tabstops unterstützen. Andererseits gibt es Druckertypen, die weiche Blanks in einer Druckzeile einfach "wegoptimieren" (die HPs sind oftmals solche, aber auch dort nicht alle, das ist wohl abhängig vom PCL Level).

Epsons ESC/P wiederum unterstützt das Setzen von Tabs, den genauen Steuercode dafür kenne ich im Moment nicht (hab das ESC/P Manual gerade nicht greifbar). Beim Star LC24-10 wird es ebenfalls unterstützt und dort geht es mittels "ESC D n1 n2 ...<0>" (der kann sogar Vertikal-Tabs setzen!).

Beim HP-WB-Treiber sollte sich herausfinden lassen, ob ESC H "übersetzt" wird, der Sourcecode ist ja vorhanden. In der Übersetzungstabelle müßte dann die entsprechende Steuersequenz zu finden sein, falls das dort unterstützt wird.

Ich muß mal mein Handbuch zum Deskjet 500 suchen, da sind die Steuersequenzen noch drin.

@MaikG:

Wenn Du Pech hast, unterstützt Dein Drucker (und somit der Treiber) eventuell gar keine Tabstops, da hatte ich zuerst gar nicht gedacht, sry. Sag doch mal, welchen Drucker Du hast.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]

2007-01-10, 00:13 h

MaikG
Posts: 5172
User
Also ich hab mich jetzt für die Space methode entschieden,
ich dachte erst die Zeichen vom drucker haben evtl. nicht
die selbe breite.

In Basic sieht so aus:

Text1$="blabla"
Print #1, Text1$+Space$(28-Len(Text1$));

Sieht jetzt gut aus die Tabelle, danke @all

[ - Answer - Quote - Direct link - ]

2007-01-10, 01:31 h

Holger
Posts: 8116
User
Zitat:
Original von MaikG:
Also ich hab mich jetzt für die Space methode entschieden,
ich dachte erst die Zeichen vom drucker haben evtl. nicht
die selbe breite.

So etwas gibt es zwar auch, aber dann helfen Tabs meistens auch nicht. Deshalb muss man normalerweise auch den Zeichensatz explizit umschalten, um dem Drucker zu vermitteln, dass man mit solchen Eigenheiten klar kommt.

Heutzutage ist das aber eh alles kalter Kaffee...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2007-01-10, 07:59 h

Solar
Posts: 3680
User
Zitat:
Original von MaikG:

In Basic sieht so aus...


Das Du die Tabelle selbst erzeugst, hattest Du bislang verschwiegen...

[ - Answer - Quote - Direct link - ]

2007-01-10, 10:40 h

MaikG
Posts: 5172
User
>So etwas gibt es zwar auch, aber dann helfen Tabs meistens auch
>nicht. Deshalb muss man normalerweise auch den Zeichensatz explizit
>umschalten, um dem Drucker zu vermitteln, dass man mit solchen
>Eigenheiten klar kommt.

Ich verwenden den kleinen Zeichensatz, explitzit wie "Topaz"
kann man ja nicht angeben.



>Das Du die Tabelle selbst erzeugst, hattest Du bislang verschwiegen...

Ja, wusste nicht das einer was anderes denkt.
Aber auch wenn die Tabelle fertig währe könnte man diese verändern.

[ - Answer - Quote - Direct link - ]

2007-01-10, 13:29 h

Gazelle
Posts: 151
User
Zitat:
Ich verwenden den kleinen Zeichensatz, explitzit wie "Topaz"
kann man ja nicht angeben.

Man sollte Pica (10CPI), Elite (12CPI) oder Condensed (15 od. 17 CPI) auswählen können. Ob es auch eine Sequenze für Proportional on/off gibt, weiss ich nicht auswendig.

[ - Answer - Quote - Direct link - ]

2007-01-10, 18:00 h

MaikG
Posts: 5172
User
>Man sollte Pica (10CPI), Elite (12CPI) oder Condensed
>(15 od. 17 CPI) auswählen können. Ob es auch eine Sequenze für
>Proportional on/off gibt, weiss ich nicht auswendig.

Also Elite gibt es ESC[2w, aber die anderen sehe ich nicht.
das kleinste ist Esc4w - was mit Engschrift bezeichnet wird.
Normal ist Esc[0w.
Dazu kann man dann nochmal mit Esc0z den Zeilenabstand verkleinern.

[ - Answer - Quote - Direct link - ]

2007-01-10, 19:29 h

whose
Posts: 2156
User
Zitat:
Original von Gazelle:
Zitat:
Ich verwenden den kleinen Zeichensatz, explitzit wie "Topaz"
kann man ja nicht angeben.

Man sollte Pica (10CPI), Elite (12CPI) oder Condensed (15 od. 17 CPI) auswählen können. Ob es auch eine Sequenze für Proportional on/off gibt, weiss ich nicht auswendig.

Das ist auch druckerabhängig. Die meisten Drucker mit nur einem eigenen Zeichensatz unterstützen keine Proprotionalschrift, andere wiederum nur im Landscape-Modus (sofern vorhanden) usw.

Der von mir erwähnte Star LC24-10 unterstützt Proportionalschrift (hat vier eigene Zeichensätze), der HP DeskJet500 genauso (und hat auch 4 eingebaute Zeichensätze). Die meisten Epson und NEC-Nadler unterstützen das auch. Die Tintenkleckser hingegen meist nur in der alten Generation.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Drucker(PRT:) Tabs setzen [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.