diff --git a/scribble-lib/scribble/base.rkt b/scribble-lib/scribble/base.rkt index 4463c7d51f..7ba7f4cbf6 100644 --- a/scribble-lib/scribble/base.rkt +++ b/scribble-lib/scribble/base.rkt @@ -561,6 +561,9 @@ (#:underline? any/c) #:rest (listof pre-content?) element?)] + [pageref (->* ((or/c taglet? generated-tag?)) + (#:underline? any/c) + element?)] [secref (->* (string?) (#:doc (or/c #f module-path?) #:tag-prefixes (or/c #f (listof string?)) @@ -590,6 +593,9 @@ (define (elemref #:underline? [u? #t] t . body) (make-link-element (if u? #f "plainlink") (decode-content body) `(elem ,t))) +(define (pageref t #:underline? [u? #t]) + (make-link-element (if u? #f "plainlink") null `(page ,t))) + (define (secref s #:underline? [u? #t] #:doc [doc #f] #:tag-prefixes [prefix #f] #:link-render-style [link-style #f]) (make-link-element (let ([name (if u? #f "plainlink")]) diff --git a/scribble-lib/scribble/core.rkt b/scribble-lib/scribble/core.rkt index 69714a2259..3ce8e1aa73 100644 --- a/scribble-lib/scribble/core.rkt +++ b/scribble-lib/scribble/core.rkt @@ -53,11 +53,15 @@ (resolve-get/ext-id* part ri key #f)) (define (resolve-get/ext-id* part ri key search-key) - (let-values ([(v ext-id) (resolve-get/where part ri key)]) - (when ext-id - (hash-set! (resolve-info-undef ri) (tag-key key ri) - (if v 'found search-key))) - (values v ext-id))) + (let ((real-key + (if (pageref-tag? key) + (cons 'elem (cdr key)) + key))) + (let-values ([(v ext-id) (resolve-get/where part ri real-key)]) + (when ext-id + (hash-set! (resolve-info-undef ri) (tag-key real-key ri) + (if v 'found search-key))) + (values v ext-id)))) (define (resolve-get part ri key) (resolve-get* part ri key #f)) @@ -108,6 +112,11 @@ (serializable? (cadr s)))) (null? (cddr s)))) +(provide pageref-tag?) +(define (pageref-tag? x) + (and (tag? x) + (equal? (car x) 'page))) + (provide block?) (define (block? p) (or (paragraph? p) diff --git a/scribble-lib/scribble/latex-render.rkt b/scribble-lib/scribble/latex-render.rkt index 68cb13996b..35b1d494b6 100644 --- a/scribble-lib/scribble/latex-render.rkt +++ b/scribble-lib/scribble/latex-render.rkt @@ -341,7 +341,7 @@ (parameterize ([done-link-page-numbers (or (done-link-page-numbers) (link-element? e))]) (when (target-element? e) - (printf "\\label{t:~a}" + (printf "\\phantomsection\\label{t:~a}" (t-encode (add-current-tag-prefix (tag-key (target-element-tag e) ri))))) (when part-label? (define-values (dest ext?) (resolve-get/ext? part ri (link-element-tag e))) @@ -393,8 +393,15 @@ (style-name es) es)] [style (and (style? es) es)] + [pageref? (and (not part-label?) + (link-element? e) + (pageref-tag? (link-element-tag e)) + (not (disable-hyperref)) + (let-values ([(dest ext?) (resolve-get/ext? part ri (cons 'elem (cdr (link-element-tag e))))]) + (and dest (not ext?))))] [hyperref? (and (not part-label?) (link-element? e) + (not (pageref-tag? (link-element-tag e))) (not (disable-hyperref)) (let-values ([(dest ext?) (resolve-get/ext? part ri (link-element-tag e))]) (and dest (not ext?))))] @@ -537,15 +544,18 @@ (wrap e style-name 'exact)] [else (core-render e tt?)])) + (when pageref? + (printf "\\PageRef{\\pageref{t:~a}}" + (t-encode (cons 'elem (cdr (link-element-tag e)))))) (when hyperref? (printf "\\hyperref[t:~a]{" (t-encode (link-element-tag e)))) (let loop ([l (if style (style-properties style) null)] [tt? #f]) (if (null? l) - (if hyperref? - (parameterize ([disable-hyperref #t]) - (finish tt?)) - (finish tt?)) + (cond [pageref? (void)] + [hyperref? (parameterize ([disable-hyperref #t]) + (finish tt?))] + [else (finish tt?)]) (let ([v (car l)]) (cond [(target-url? v) diff --git a/scribble-lib/scribble/scribble.tex b/scribble-lib/scribble/scribble.tex index dec3a0b478..27af9cc768 100644 --- a/scribble-lib/scribble/scribble.tex +++ b/scribble-lib/scribble/scribble.tex @@ -27,6 +27,9 @@ \newcommand{\preDoc}{} \newcommand{\postDoc}{} +% Generated by `pageref'; first arg is a page number +\newcommand{\PageRef}[1]{page~#1} + % Generated by `secref'; first arg is section number, second is section title: \newcommand{\BookRef}[2]{\emph{#2}} \newcommand{\ChapRef}[2]{\SecRef{#1}{#2}}