diff options
Diffstat (limited to 'tex/context/base/enco-pfr.tex')
-rw-r--r-- | tex/context/base/enco-pfr.tex | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/tex/context/base/enco-pfr.tex b/tex/context/base/enco-pfr.tex new file mode 100644 index 000000000..16012a281 --- /dev/null +++ b/tex/context/base/enco-pfr.tex @@ -0,0 +1,187 @@ +%D \module +%D [ file=enco-pfr, +%D version=2000.12.10, +%D title=\CONTEXT\ Encoding Macros, +%D subtitle=PDF Font Resource Inclusion, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This is an experimental module in which we implement +%D font resource inclusion in \PDF. One reason to include +%D font resources is that it enables a search engine to +%D perform a search (I'm told). This feature ws requested by +%D Petr Ferdus from Czech. + +%D A simple test file may look like this (watch how we first +%D load the encoding and then the font; previous font +%D definitions are left untouched.) +%D +%D \starttypen +%D % output=pdftex interface=en +%D +%D \useencoding[pfr] +%D \setupbodyfont[csr] +%D +%D \starttext +%D test \`z \'z \bf test \sl test \bs quite funny \`z \page +%D test \`z \'z \bf test \sl test \bs quite funny \`z \page +%D \stoptext +%D \stoptypen +%D +%D We do our best to include a (often large) font resources +%D only once. The current implementation is not that +%D general which is also due to the fact that \type +%D {\pdffontattr} is expanded instantly and persistent. A +%D more versatile (but also slower) approach is to keep track +%D of the fonts and either flush the information at shipout +%D time, or at the end of the document. + +\unprotect + +%D \macros +%D {ifincludepdffontresources} +%D +%D You can turn of this feature using the following switch. + +\newif\ifincludepdffontresources \includepdffontresourcestrue + +%D The name of the resource is stored in a macro, as is its +%D object reference. A resource is only processed once. When +%D done, the resource name is erased, and we use this fact to +%D prevent redefinition as well as well as reloading. So, a +%D macro defined with \type {\pdffontfileresource} can have +%D three states: +%D +%D \startopsomming[opelkaar] +%D \som undefined: not yet loaded, and not yet included +%D \som some value: loaded, but not yet included +%D \som empty: loaded, and already included +%D \stopopsomming + +\def\pdffontresource% + {\strippedcsname\pdffontresource\currentencoding} + +\def\pdffontfileresource% + {pdfr:\pdffontresource} + +%D A resource is defined in a file prefixed by \type {pdfr-}. +%D The following \PDF\ code is compsed by Ondrej Koala Vacha (i +%D probably mispelled this name). +%D +%D \starttypen +%D \startpdffontresource[il2] +%D /CIDInit /ProcSet findresource begin +%D 12 dict begin +%D begincmap +%D /CIDSystemInfo +%D << /Registry (Adobe) +%D /Ordering (T1UV) +%D /Supplement 0 +%D >> def +%D /CMapName /Adobe-Identity-UCS def +%D /CMapType 1 def +%D 1 begincodespacerange +%D <00> <FF> +%D endcodespacerange +%D %%FontSpecificEncoding +%D 191 beginbfrange +%D <20> <20> <0020> % space dec: 32 oct:040 hex:20 +%D .... .... ...... . ........ .... .. ....... ...... +%D <ff> <ff> <00ff> % dotaccent dec:255 oct:377 hex:ff +%D endbfrange +%D endcmap +%D CMapName currentdict /CMap defineresource pop end +%D end +%D \stoppdffontresource +%D \stoptypen +%D +%D We don't preload such huge definitions, and process them +%D run||time to save memory. Therefore, in the encoding +%D vector, we only add an entry like: +%D +%D \starttypen +%D \startencoding [il2] +%D \usepdffontresource il2 +%D \stopencoding +%D \stoptypen +%D +%D This macro is defined as follows. + +\def\usepdffontresource #1 % + {\doifundefinedelse{\pdffontfileresource} % okay, undefined, so either + {\setxvalue{\pdffontfileresource}{#1}} % band new, or not yet loaded + {\doifvaluesomething{\pdffontfileresource} % only if not loaded in which + {\setxvalue{\pdffontfileresource}{#1}}}} % case it's made empty + +%D Watch how we check for duplicated loading. The resource +%D itself, when asked for, is included immediately, after which +%D we save its reference. Normally a document will have one +%D such a resource. + +\long\def\startpdffontresource[#1]#2\stoppdffontresource% + {\donefalse % we use boolean due to \par + \doifundefined{\pdffontresource}% should be \long + {\doif{#1}{\currentencoding}{\donetrue}}% + \ifdone + \immediate\pdfobj stream {#2}% + \setxvalue{\pdffontresource}{\the\pdflastobj}% + \fi} + +%D The reference to such a vector is to be handled at font +%D definition time, which is why we hook it into the font +%D loading routine. A little bit of indirectness speeds up +%D the process when this feature is disabled and keeps the +%D macros readable. + +\appendtoksonce \includepdffontresource \to \everyfont + +\def\includepdffontresource% + {\ifincludepdffontresources + \ifx\pdffontattr\undefined + % we're not using (a recent version of) pdftex + \else\ifcase\pdfoutput + % we're not in pdf mode + \else + \doincludepdffontresource + \fi\fi + \fi} + +\def\doincludepdffontresource% + {% does this font has an special encoding entry + \doifdefined{\purefontname\font\s!encoding} + {% does this encoding entry has a value + \doifvaluesomething{\purefontname\font\s!encoding} + {\bgroup + % quick and dirty switch + \edef\currentencoding{\getvalue{\purefontname\font\s!encoding}}% okay? + % is there a pdf font encoding resource file defined + \doifdefined{\pdffontfileresource} + {% load the pdf font resource + \doifvaluesomething{\pdffontfileresource} + {% but load it only once + \startreadingfile + \readsysfile{pdfr-\getvalue{\pdffontfileresource}}{}{}% messages + \stopreadingfile + % but do that only once, so forget the flag, empty==loaded + \global\letvalue{\pdffontfileresource}\empty}}% + % is there a resource indeed, i.e. an object reference + \doifdefined{\pdffontresource} + {% if so, create a reference to the object + \expanded{\pdffontattr\font % current font + {/ToUnicode \getvalue{\pdffontresource}\space0 R}}}% + \egroup}}} + +%D For the moment, we keep this definition here, if only +%D because \type {\usepdffontencoding} is not defined in the +%D core. In the end, this will go to enco-il2. + +\startencoding [il2] + \usepdffontresource il2 +\stopencoding + +\protect \endinput |