كيف يمكنك الحصول على ارتفاع متري من سلسلة في حاشية?

StackOverflow https://stackoverflow.com/questions/518837

سؤال

يمكنك الحصول على عرض سلسلة في الخط الحالي مع stringwidth وعلى الرغم من أن هذا الواقع يدفع تعويض الإحداثيات على المكدس ، قيمة y يبدو دائما أن تكون عديمة الفائدة.هل هناك طريقة لتحديد ارتفاع سلسلة ، التي قد أو قد لا تتضمن والأسلة?

هل كانت مفيدة؟

المحلول

stringwidth, كما يقول: لا عودة سلسلة ارتفاع.(في جميع الحالات نظرت الثاني صحيح على المكدس بعد تنفيذ stringwidth كان 0 - على سلاسل التي تعمل في الاتجاه الأفقي.) stringwidth يعطي إحداثيات النسبية من currentpoint بعد تنفيذ (string) show.

على PLRM هذا القول عن stringwidth:

نلاحظ أن عرض إرجاعها من قبل stringwidth بأنها حركة الحالي نقطة.فإنه لا علاقة له مع أبعاد الصورة الرمزية الخطوط العريضة.

لذلك ما من شأنه العمل على أن تأخذ في الاعتبار سلسلة هذا الارتفاع ؟ الكلمات السحرية أن تقرأ عنها في PRLM هي 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

نصائح أخرى

لقد أجبت على هذا في كيفية تحديد سلسلة ارتفاع في حاشية?, لكن من المفيد هنا أيضا.

فقط إضافة إلى 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's الإجابة-بعض الخطوط لا تدعم charpath المشغل.

إنقاذ واستعادة الرسم السياق يبقى النقطة الحالية في المكان ، حيث أنه ليس له أي تأثير على "تدفق" من المستند الخاص بك.

آمل أن أكون قد ساعدت.

ويبدو أن هذا العمل أكثر من مرة:

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

وانها لن تعمل لجميع /FontTypes.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top