2014-10-20 4 views
2

텍스트 입력을 허용하는 추록 코드가 있습니다. 특정 길이에 도달하면 텍스트를 줄 바꿈하거나 줄임표를 추가하고 싶지만 어떻게해야할지 모르겠다.포스트 스크립트를 사용하여 텍스트에 줄임표를 쓰거나 줄이는 방법은 무엇입니까?

%%% A4 size 
<< /PageSize [595 842] >> setpagedevice 
clippath pathbbox /ury exch def /urx exch def /lly exch def /llx exch def 

%%% Unit 
/cm { 72 2.54 div mul } bind def 

%%% Temporary 
/Fix_long 4.2 cm def 
/Fix_short 3.2 cm def 
%%% Set Image Scale 
/SetFixScale { 2 copy gt { Fix_long Fix_short }{ Fix_short Fix_long }ifelse scale } bind def 

%%% Set put coordinate 
/SetXAdjust { 2 copy gt 
{ X_Step Fix_long sub 2 div floor } 
{ Fix_long Fix_short sub 2 div} ifelse /XAdjust exch def 
} bind def 
/YAdjust 2 cm def 
%%% Temporary 
/Row 4 def 
/Column 3 def 
/X_Step urx llx sub Row div floor def 
/Y_Step ury lly sub Column div floor def 
/Row_pos 0 def 
/Column_pos 1 def 
/SetPutPosition { 
llx X_Step Row_pos mul add 
ury Y_Step Column_pos mul sub translate 
DrawFrame 
DrawFileName 
XAdjust YAdjust translate 
Row 1 sub Row_pos eq { /Row_pos 0 def /Column_pos Column_pos 1 add def }{ /Row_pos Row_pos 1 add def } ifelse 
Column_pos Column gt { /Column_pos 1 def } if 
} bind def 

/DrawFrame { gsave .5 setlinewidth 0 0 X_Step Y_Step rectstroke grestore } bind def 
/DrawFileName { 15 15 moveto 4 -1 roll show } bind def 

/DrwaFileName 부분에/텍스트를 줄 바꿈하고 잘라내어 elipsis를 추가하고 싶습니다. 내가 어떻게 해? 그것에 대한 기능이 있습니까?

답변

3

내장 된 기능이 없으므로 일부 문자열 처리가 필요합니다. "길이"를 측정하는 방법에 따라 적어도 두 가지 방법이 있습니다.

더 간단한 경우에는 "길이"를 문자 수로 간주합니다. 추기 연산자 length은 문자열의 문자 수를 반환합니다. 따라서 귀하의 기능부터 시작하여

/DrawFileName { 15 15 moveto 4 -1 roll show } bind def 
%         ^
% we'll insert our code here, ---------| 
% where the string is on top of the stack, 
% replacing the call to show 

먼저 허용되는 최대 크기와 비교하여 기존 길이를 확인하십시오.

dup length 10 gt { 
}{ 
    show 
} ifelse 

길이가 10보다 큰 경우

의 다른 -clause은 단순히 쇼를 호출합니다. 다음으로 을 채우고 - 절을 잘라 문자열을 다듬습니다.

dup length 10 gt { 
    0 10 getinterval 
    show 
}{ 
    show 
} ifelse 

음, 최적화에 대해 이야기 할 생각은 없었지만 지금 당장이를 고려해 볼 수 있습니다. 줄임표 부분을 추가하기 전에 두 경우 모두 show이라고 부르기 때문에 ifelse 구조 외부에서 한 번 호출하면됩니다. 다른 -clause 비어 있기 때문에

dup length 10 gt { 
    0 10 getinterval 
}{ 
} ifelse 
show 

그리고 물론

, 지금 우리는 ifelse 필요하지 않습니다.

dup length 10 gt { 
    0 10 getinterval 
} if 
show 

이제 생략 부호는 putinterval 연산자를 사용하여 한 문자열에서 다른 문자열로 복사 할 수 있습니다.

dup length 10 gt { 
    0 10 getinterval 
    dup 7 (...) putinterval 
} if 
show 


편집 : 포스트 스크립트 그래픽 언어이기 때문에은 물론, 우리는 대신 페이지에 문자열의 조판 길이에 관심이있을 수 있습니다. 이를 위해 연산자는 show을 호출 한 후 currentpoint이 이동할 금액을 반환합니다. 따라서 show의 전화를 stringwidth rmoveto으로 바꾸려면 적절한 크기의 갭을 남기고 텍스트를 설정하지 마십시오. 다시 시작 부분으로 돌아가서 show으로 전화를 바꿉니다. 우리 코드 조각의 시작 부분에 스택 맨 위에 문자열이 있다고 가정합니다. 서양 알파벳 들어

dup stringwidth pop 50 gt { 
} if 
show 

, 문맥이 파일 이름 때문에 항상 0이 될 것이다 stringwidth에 의해 반환 된 DY 값이 여기에 안전한 가정처럼 보인다. 따라서 우리는 단순히 pop입니다. dx 결과와 50 개의 사용자 공간 포인트를 비교하십시오.

이제는 너무 길면 어떨까요? 그 상처는 어디에서? 그것은 생각할 가치가있는 것입니다. 생각해보세요. 흠. 여기에 줄임표를 추가한다고 생각하면 필드 너비에서 빼기를하고 그 왼쪽에있는 문자열을 자르고 싶습니다. 그래서 여기 내 계획은 문자열을 문자순으로 반복하고 각각의 것을 확인하고 보여 주며, 그 마지막에 스택에 줄임표 문자열을 남깁니다. show. 다음은 부분 기입입니다.

dup stringwidth pop 50 gt {  % str 
    50 (...) stringwidth pop sub % str Max  new maximum length 
    exch       % Max str 
    { % Max c        forall yields the integer value 
     () dup 0 4 3 roll put % Max (c) put it back in a string 
     dup stringwidth pop  % Max (c) dx 
     2 index 2 copy lt  % Max (c) dx Max dx<Max? 
     {      % Max (c) dx Max  dx<Max 
     }{      % Max (c) dx Max  dx>=Max 
     } ifelse 
    } forall 
    (...) 
} if 
show 
각 문자를 반복하면서 최대 문자열과 비교하여 stringwidth를 확인하십시오. max보다 작 으면 문자열을 표시하고 max에서 너비를 뺍니다. 그렇지 않으면 스택을 정리하고 루프를 종료합니다.

dup stringwidth pop 50 gt {  % str 
    50 (...) stringwidth pop sub % str Max  new maximum length 
    exch       % Max str 
    { % Max c        forall yields the integer value 
     () dup 0 4 3 roll put % Max (c) put it back in a string 
     dup stringwidth pop  % Max (c) dx 
     2 index 2 copy lt  % Max (c) dx Max dx<Max? 
     {      % Max (c) dx Max  dx<Max 
      exch sub    % Max (c) Max-dx 
      3 1 roll exch pop % Max-dx (c) 
      show     % Max-dx 
     }{      % Max (c) dx Max  dx>=Max 
      pop pop pop pop exit 
     } ifelse 
    } forall 
    (...) % place (...) on stack for show 
} if 
show 

그리고 나는 그 일을해야한다고 생각합니다.

텍스트를 배치하기 위해 우리는 구석에 그림을 그렸습니다. 문자열의 나머지는 나머지 반복에 의해 수집 된 다음 다시 전체 문자열을 다시 처리하기 전에 문자열로 다시 어셈블해야합니다. 저에게 그 생각을 조금하겠습니다. ...

또는 루프의 중간에 현재 위치의 위치를 ​​바꿀 수 있습니다. X 좌표와 Y 증분을 사용하여 (또는 실제로 페이지를 아래로 이동하기 때문에 감소합니다.) 예 :

currentpoint exch pop % currentY 
X exch    % X currentY 
dY sub    % X currentY-dY 
moveto 
+0

내 실수 였기 때문에 내 의견을 삭제했습니다. 오류의 원인이 된 값을 변경하는 것을 잊었습니다. – user3814700

+0

네, 문제 없습니다. 나는 그것이 일어난 것 같았습니다. –

관련 문제