내장 된 기능이 없으므로 일부 문자열 처리가 필요합니다. "길이"를 측정하는 방법에 따라 적어도 두 가지 방법이 있습니다.
더 간단한 경우에는 "길이"를 문자 수로 간주합니다. 추기 연산자 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
내 실수 였기 때문에 내 의견을 삭제했습니다. 오류의 원인이 된 값을 변경하는 것을 잊었습니다. – user3814700
네, 문제 없습니다. 나는 그것이 일어난 것 같았습니다. –