산술 연산에 groff를 사용할 수 있습니까?
내가 현재 어느 페이지에 있는지 계산하고 싶고 현재 2페이지에 있다고 가정해 보겠습니다. 다음을 사용하여 다음 페이지의 페이지 번호를 얻을 수 있습니다.
.PP
Next page is number \n[.pn]
으로 컴파일됩니다 Next page is number 3
.
렌더링을 위해 산술 연산을 수행하려면 어떻게 해야 합니까?
.PP
Current page is ((\n[.pn]-1))
입력하다 Current page is 2
?
답변1
현재 페이지 번호는 입니다 \n%
.
산술식의 결과를 삽입하려면 먼저 숫자 레지스터에 넣어야 할 것 같아요.
이것은 표현식을 인수로 취하고 그 결과를 (아마도 사용되지 않은) 레지스터에 할당한 __
다음 레지스터의 내용을 삽입하는 매크로(완전히 테스트되지 않음)입니다.
Current page is \n%.
.br
.\" EI - eval and interpolate
.\" $1 is an expression to evaluate
.\" $2 (optional) is a string to append to the interpolated expression,
.\" without any intervening whitespace
.de EI
.nr __ \\$1
\&\\n(__\\$2
..
.nr x 4
4 times 3 minus 5 is
'EI (\nx*3-5)
\&.
.br
Here there's no space before the period:
'EI (\nx*3-5) .
.br
nroff를 실행한 후:
Current page is 1.
4 times 3 minus 5 is 7 .
Here there's no space before the period: 7.
이것은 흔한 일인 것 같고 표준 매크로 패키지에 이미 유사한 매크로가 있을 수도 있지만 이에 대해 잘 모르겠습니다.
답변2
예, groff
산술 연산을 수행할 수 있습니다. 이것은 온라인 또는 GNU Info 형식으로 제공되는 전체 groff 매뉴얼에 문서화되어 있습니다(전체 매뉴얼을 사용 info groff
하거나 pinfo groff
보십시오)... 많은 GNU 프로그램과 마찬가지로 매뉴얼 페이지는 단지 빠른 참조일 뿐이며 전체 문서는 info 형식입니다.
~에서https://www.gnu.org/software/groff/manual/html_node/Expressions.html
gtroff에는 대부분의 다른 언어에 공통적인 산술 연산자가 있습니다.
- 산술: "+"(더하기), "-"(뺄셈), "/"(나누기), "*"(곱하기), "%"(모듈로).
gtroff는 정수 연산만 제공합니다. 계산 결과에 사용되는 내부 유형은 'int'이며 일반적으로 32비트 부호 있는 정수입니다.
비교: '<'(보다 작음), '>'(보다 큼), '<='(작거나 같음), '>='(크거나 같음), '='(같음), '=='('='동일).
논리: '&'(논리 AND), ':'(논리 OR).
단항 연산자: "-"(부정, 즉 부호 변경), "+"(완전성을 위해, 표현식에서 아무 작업도 수행하지 않음), "!"(논리적 아님, if 및 while 요청에만 적용됨) 모션 요청에서 단항 연산자를 사용하는 방법은 아래를 참조하세요.
위에서 언급했듯이 논리 not 연산자는 if 및 while 요청에서만 작동합니다. 또한 표현식 시작 부분에만 나타나 전체 표현식을 무효화할 수도 있습니다.
표현식에 "!" 연산자를 삽입하려고 하면 "숫자 표현식 필요" 경고가 나타납니다. 이는 이전 버전의 troff와의 호환성을 유지합니다.
예:
.nr X 1 .nr Y 0 .\" This does not work as expected .if (\n[X])&(!\n[Y]) .nop X only . .\" Use this construct instead .if (\n[X]=1)&(\n[Y]=0) .nop X only
그런데, info
이것은 표준 GNU Info 문서 뷰어입니다. 개인 정보다음과 유사한 "브라우저와 유사한" UI를 제공하는 또 다른 뷰어입니다 lynx
. 개인적으로 참을 수 없어서 info
사용할 수 pinfo
없습니다. 대부분의 배포판에 대해 사전 패키지로 제공되며 소스 코드는 위의 핀포 링크에서 찾을 수 있습니다.