2009-02-06 5 views
10

आप stringwidth साथ वर्तमान फ़ॉन्ट में एक स्ट्रिंग की चौड़ाई प्राप्त कर सकते हैं और हालांकि यह वास्तव में ऑफसेट धक्का स्टैक पर निर्देशांक, y- मान हमेशा बेकार हो रहा है। क्या स्ट्रिंग की सटीक ऊंचाई निर्धारित करने का कोई तरीका है, जिसमें अवरोधक शामिल हो सकते हैं या नहीं भी?पोस्टस्क्रिप्ट में स्ट्रिंग की ऊंचाई मीट्रिक कैसे प्राप्त कर सकते हैं?

/fontheight { currentfont /FontMatrix get 3 get } bind def 
/lineheight { fontheight 1.2 mul } bind def 

यह सब /FontType रों लिए काम नहीं करेगा:

उत्तर

6

stringwidth, के रूप में यह कहते हैं, स्ट्रिंग की ऊंचाई वापस नहीं करता है। (सभी मामलों में मैंने देखा, stringwidth निष्पादित करने के बाद स्टैक पर दूसरा पूर्णांक 0 था - क्षैतिज दिशा में चलने वाले तारों के लिए। stringwidth(string) show निष्पादित करने के बाद वर्तमान बिंदु के सापेक्ष निर्देशांक देता है।

PLRM यह कहना बारे में stringwidth है:

ध्यान दें कि चौड़ाई stringwidth द्वारा लौटाए वर्तमान बिंदु के आंदोलन के रूप में परिभाषित किया गया है। ग्लिफ रूपरेखा के आयामों के साथ इसका कोई लेना-देना नहीं है।

तो स्ट्रिंग की ऊंचाई को ध्यान में रखने के लिए क्या काम करेगा? पीआरएलएम में पढ़ने के लिए जादू शब्द charpath और pathbbox हैं। इस प्रयास करें:

%! 
/Helvetica findfont 60 scalefont setfont 
200 700 4 0 360 arc fill 
200 700 moveto (test test) dup 
true charpath pathbbox 
3 -1 roll sub 2 div neg 3 1 roll sub 2 div exch 
1 0 0 setrgbcolor 
200 700 moveto rmoveto show showpage 

यह स्ट्रिंग के (लाल रंग में मुद्रित) ऊंचाई की गणना करता है और उस जानकारी कोशिश करते हैं और केंद्र के लिए एक छोटे से भरा चक्र (काले रंग में मुद्रित) ने अपने बाउंडिंग बॉक्स के केंद्र में उपयोग करता है:

Sample PostScript visualized

3

इस समय के सबसे अधिक काम करने के लिए लगता है।

+0

यह भी हो, तो मैट्रिक्स में किसी भी वाई कतरनी काम नहीं करेगा। यदि '/ FontMatrix 5 मिलता है 'शून्य नहीं है, तो एक ग्लिफ की ऊंचाई इसकी चौड़ाई पर निर्भर करेगी। –

+0

अधिक फ़ॉन्ट प्रकारों के लिए काम करने के लिए आपको FontBBox का उपयोग करने की आवश्यकता है: http://stackoverflow.com/questions/8296322/how-to-determine-height-and-depth-of-a-postscript-font/19263342#19263342 –

4

मैं पहले से ही How to determine string height in PostScript? में इस का जवाब दे दिया है, लेकिन यह यहाँ भी उपयोगी है।

बस जोड़ने को pipitas जवाब:

/textheight { 
    gsave         % save graphic context 
    {        
     100 100 moveto      % move to some point 
     (HÍpg) true charpath pathbbox  % gets text path bounding box (LLx LLy URx URy) 
     exch pop 3 -1 roll pop    % keeps LLy and URy 
     exch sub       % URy - LLy 
    } 
    stopped        % did the last block fail? 
    { 
     pop pop       % get rid of "stopped" junk 
     currentfont /FontMatrix get 3 get % gets alternative text height 
    } 
    if 
    grestore        % restore graphic context 
} bind def 

/jumpTextLine { 
    textheight 1.25 mul     % gets textheight and adds 1/4 
    0 exch neg rmoveto      % move down only in Y axis 
} bind def 

विधि को उम्मीद है कि कुछ फॉन्ट पहले से ही निर्धारित है। यह चयनित फ़ॉन्ट (setfont) और इसके आकार (scalefont) पर काम करता है।

मैं (HÍpg) का उपयोग सबसे बड़ी सीमांकन बॉक्स संभव पाने के लिए, बल अपरकेस वर्णों और "रेखा से नीचे" अक्षरों का उपयोग। नतीजा काफी अच्छा है।

वैकल्पिक दृष्टिकोण चुरा dreamlax के जवाब से - कुछ फोंट charpath ऑपरेटर का समर्थन नहीं करते।

सहेजा जा रहा है और ग्राफिक संदर्भ बहाल जगह में वर्तमान बिंदु रहता है, तो यह आपके दस्तावेज़ के "प्रवाह" पर कोई प्रभाव पड़ता है।

आशा है कि मैंने मदद की है।

+0

इसके अतिरिक्त, आप इसे प्राप्त करने के लिए 'charpath pathbbox' का उपयोग करने के बजाय, बाउंडिंग बॉक्स के लिए 'currentfont/FontBBox get' का उपयोग कर सकते हैं ... मेरे मामले में, यह GhostScript के तहत पूरी तरह से काम करता है; हालांकि, प्रिंटर द्वारा व्याख्या किए जाने पर परिणाम अच्छा नहीं था। –

संबंधित मुद्दे