Το PDFlibPas σχεδιάζει ιαπωνικό και κινεζικό κείμενο προς τα κάτω στη σελίδα. Η SetVerticalWritingMode ενεργοποιεί την κάθετη γραφή, οι κοινές κλήσεις DrawText κατόπιν τρέχουν προς τα κάτω, και η GetVerticalWritingMode αναφέρει την τρέχουσα κατάσταση. Πριν υπάρξει αυτή η δυνατότητα, η κάθετη στοίχιση κειμένου σήμαινε τοποθέτηση κάθε χαρακτήρα με το χέρι και ελπίδα ότι η απόσταση θα έδειχνε σωστή
Η κάθετη γραφή δεν είναι οριζόντιο κείμενο περιστραμμένο ενενήντα μοίρες. Οι χαρακτήρες παραμένουν όρθιοι, η προώθηση τρέχει προς τα κάτω αντί προς τα πλάγια, και ένας αριθμός χαρακτήρων αλλάζει εντελώς σχήμα — που είναι το κομμάτι που ξεχωρίζει ένα έγγραφο που διαβάζεται φυσικά από ένα που ένας ιαπωνός αναγνώστης αναγνωρίζει αμέσως ως μηχανής
Τι αλλάζει μέσα στο PDF
Το κείμενο που σχεδιάζεται έτσι διέρχεται από γραμματοσειρά Type0 σε λειτουργία κάθετης γραφής που φέρει τις δικές της κάθετες μετρήσεις της γραμματοσειράς. Αυτό έχει σημασία σε δύο κατευθύνσεις. Ένας αναγνώστης προωθεί κάθε χαρακτήρα κατά την απόσταση που προέβλεψε ο σχεδιαστής του αντί για ένα ομοιόμορφο βήμα, οπότε η στήλη έχει τον ρυθμό για τον οποίο σχεδιάστηκε η γραμματοσειρά. Και η αντιγραφή του κειμένου επιστρέφει τους αρχικούς χαρακτήρες, επειδή η κάθετη εκτέλεση παραμένει πραγματικό κείμενο με σωστή αντιστοίχιση παρά μια ακολουθία τοποθετημένων γλυφών
Μια γραμματοσειρά που δεν φέρει δικές της κάθετες μετρήσεις προωθεί ένα em ανά χαρακτήρα, που είναι αυτό που θα έκανε ένας αναγνώστης με την προεπιλογή. Αυτή η εφεδρική συμπεριφορά αξίζει να τη γνωρίζετε επειδή είναι η διαφορά που θα δείτε όταν ένα έγγραφο αποδίδεται σωστά με μια καλή CJK γραμματοσειρά και φαίνεται μηχανικά στοιχειοθετημένο με μια λατινική γραμματοσειρά που συμβαίνει να περιέχει κάποια kana
var
Lib: TPDFlib;
H: Double;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('MS Mincho', 1); // 1 = embed the face
Lib.SetTextSize(12);
Lib.SetVerticalWritingMode(1); // ordinary DrawText now runs down
H := Lib.GetVerticalTextHeight('MS Mincho', 12, '第三章 保守点検');
Lib.DrawText(480, 72, '第三章 保守点検');
Lib.SetVerticalWritingMode(0); // back to horizontal
Lib.DrawText(72, 72 + H, 'Chapter 3');
Lib.SaveToFile('manual-ja.pdf');
finally
Lib.Free;
end;
end;
Γιατί οι αγκύλες φαίνονται λάθος σε κάθετο κείμενο;
Επειδή μια αγκύλη έχει δύο μορφές και μόνο μία τους ανήκει σε μια στήλη. Οι αγκύλες, το σημάδι μακρού φωνήεντος και τα μικρά kana σχεδιάζονται διαφορετικά όταν το κείμενο τρέχει προς τα κάτω στη σελίδα — μια παρένθεση περιστρέφεται ώστε να κάθεται κατά μήκος της στήλης αντί να ξαπλώνει διαγώνια, και το σημάδι μακρού φωνήεντος γίνεται μια κάθετη γραμμή. Σχεδιάστε τις οριζόντιες μορφές σε κάθετη στήλη και κάθε μία τους ξαπλώνει στο πλάι
Το PDFlibPas παίρνει τις μορφές από το δικό του κάθετο feature της γραμματοσειράς, οπότε κάθε γραμματοσειρά παρέχει ό,τι σχεδίασε ο σχεδιαστής της παρά μια αντικατάσταση που μαντεύεται από τον χαρακτήρα. Αυτή η διάκριση έχει σημασία για την ορθότητα: ένας μαντεμένος πίνακας αντικατάστασης είναι σωστός για τις κοινές περιπτώσεις και λάθος για τις γραμματοσειρές που αντιμετωπίζουν έναν χαρακτήρα διαφορετικά, και μια γραμματοσειρά που δεν ονομάζει κάθετες μορφές σχεδιάζεται ακριβώς όπως πριν παρά να εξαναγκάζεται μέσα από έναν πίνακα που ποτέ δεν ζήτησε
Η GetVerticalTextHeight μετρά τις μορφές που θα σχεδιαστούν πραγματικά, οπότε μια στήλη της οποίας οι χαρακτήρες αλλάζουν σχήμα μετριέται ακόμα σωστά. Το να μετράτε τις οριζόντιες μορφές και να σχεδιάζετε τις κάθετες είναι η κλασική πηγή στηλών που ξεπερνούν το κουτί τους κατά λίγους χαρακτήρες
Σχεδιασμός μιας εκτέλεσης χωρίς αλλαγή της λειτουργίας
Η DrawVerticalText σχεδιάζει μια μεμονωμένη εκτέλεση κάθετα, παίρνοντας τη θέση, το όνομα γραμματοσειράς, το μέγεθος και το κείμενο, και αφήνει τη λειτουργία γραφής ασχολίαστη. Χρησιμοποιήστε την για την κάθετη εξαίρεση μέσα σε ένα οριζόντιο έγγραφο — μια ετικέτα ράχης, μια σφραγίδα, μια μεμονωμένη στήλη ονομάτων — όπου το άνοιγμα και κλείσιμο μιας καθολικής λειτουργίας γύρω από κάθε κλήση είναι περισσότερη κατάσταση από όση αξίζει η εργασία
Οι οριζόντιες και κάθετες μορφές μιας γραμματοσειράς κρατιούνται ξεχωριστά εσωτερικά, οπότε μια σελίδα μπορεί να φέρει και τις δύο χωρίς η μία να ενοχλεί την άλλη. Αυτό είναι που κάνει μια μικτή σελίδα πρακτική: μια σελίδα ιαπωνικού βιβλίου με κάθετο κείμενο σώματος και οριζόντιες κεφαλίδες επανάληψης, ή ένα κινεζικό πιστοποιητικό με κάθετο τίτλο πάνω από οριζόντιες γραμμές λεπτομερειών
// One vertical run inside an otherwise horizontal page
Lib.DrawVerticalText(520, 96, 'MS Mincho', 14, '保守点検記録');
// The horizontal text around it is unaffected
Lib.DrawText(72, 96, 'Maintenance inspection record');
Σωστή ρύθμιση της γραμματοσειράς πριν από οτιδήποτε άλλο
Η κάθετη γραφή εξαρτάται εξ ολοκλήρου από τη γραμματοσειρά. Μια CJK γραμματοσειρά με σωστές κάθετες μετρήσεις και κάθετο feature παράγει σωστή έξοδο χωρίς περαιτέρω εργασία· μια γραμματοσειρά χωρίς αυτά παράγει όρθιους χαρακτήρες που προωθούνται ένα em τη φορά και καθόλου αλλαγές σχήματος. Αν το κάθετο κείμενο φαίνεται διακριτικά λάθος, εξετάστε τη γραμματοσειρά πριν εξετάσετε τον κώδικα
Η ενσωμάτωση ακολουθεί τους συνήθεις κανόνες και το συνηθισμένο κόστος. Μια πλήρης CJK γραμματοσειρά είναι μεγάλη, οπότε το subsetting δεν είναι προαιρετικό για έγγραφα που πάνε οπουδήποτε — οι σημειώσεις για τη βελτιστοποίηση μεγέθους αρχείου PDF και το subsetting γραμματοσειρών καλύπτουν τι να περιμένετε, και η ανάλυση της ενσωμάτωσης γραμματοσειρών που λείπουν σε υπάρχον PDF καλύπτει την περίπτωση επισκευής όταν ένα κάθετο έγγραφο φτάνει χωρίς τις γραμματοσειρές του
Πού το κάθετο κείμενο εξακολουθεί να θέλει απόφάση διάταξης από εσάς
Η σειρά στηλών. Το ιαπωνικό κάθετο κείμενο τρέχει από δεξιά προς αριστερά κατά στήλη, οπότε μια σελίδα δύο στηλών ξεκινά από το δεξί άκρο, και καμία ρύθμιση λειτουργίας γραφής δεν μπορεί να το συμπεράνει αυτό από το κείμενο. Το ίδιο ισχύει για τη σειρά σελίδων σε ένα έγγραφο που διαβάζεται από δεξιά προς αριστερά ως σύνολο, και για το πού κάθονται τα furigana, οι υποσημειώσεις και οι λεζάντες σχημάτων
Αυτό που εγγυάται η βιβλιοθήκη είναι ότι κάθε εκτέλεση στοιχίζεται σωστά: σωστές μορφές, σωστές προωθήσεις, εξαγόμενο κείμενο. Πού πάνε οι εκτελέσεις στη σελίδα είναι ένα πρόβλημα διάταξης, και για έγγραφα συναρμολογημένα από δεδομένα η ανάλυση της αναζήτησης κειμένου και απαρίθμησης στοιχείων σελίδας είναι χρήσιμη για να επαληθεύσετε μετά ότι αυτό που προσγειώθηκε στη σελίδα είναι αυτό που σκοπεύατε
Το PDFlibPas είναι μια native Pascal βιβλιοθήκη PDF για Delphi, C++Builder και Lazarus, και η κάθετη CJK γραφή είναι μέρος του API σχεδίασης παρά ένα πρόσθετο — δείτε τη σελίδα προϊόντος PDFlibPas για τη λίστα χαρακτηριστικών κειμένου και γραμματοσειρών