WarningThis document is not an ISO International Standard. It is distributed for review and comment. It is subject to change without notice and may not be referred to as an International Standard. Recipients of this draft are invited to submit, with their comments, notification of any relevant patent rights of which they are aware and to provide supporting documentation. |
Copyright noticeThis ISO document is a Draft International Standard and is copyright-protected by ISO. Except as permitted under the applicable laws of the user's country, neither this ISO draft nor any extract from it may be reproduced, stored in a retrieval system or transmitted in any form or by any means, electronic, photocopying, recording or otherwise, without prior written permission being secured. Requests for permission to reproduce should be addressed to either ISO at the address below or ISO's member body in the country of the requester. Reproduction may be subject to royalty payments or a licensing agreement.ISO copyright office Case postale 56 · CH-1211 Geneva 20 Tel + 41 22 749 01 11 Fax + 41 22 749 09 47 E-mail copyright@iso.org Web www.iso.org Violators may be prosecuted. |
ISO (the International Organization for Standardization) and IEC (the International Electrotechnical Commission) form the specialized system for worldwide standardization. National bodies that are members of ISO or IEC participate in the development of International Standards through technical committees established by the respective organization to deal with particular fields of technical activity. ISO and IEC technical committees collaborate in fields of mutual interest. Other international organizations, governmental and non-governmental, in liaison with ISO and IEC, also take part in the work. In the field of information technology, ISO and IEC have established a joint technical committee, ISO/IEC JTC 1.
International Standards are drafted in accordance with the rules given in the ISO/IEC Directives, Part 2.
The main task of the joint technical committee is to prepare International Standards. Draft International Standards adopted by the joint technical committee are circulated to national bodies for voting. Publication as an International Standard requires approval by at least 75 % of the national bodies casting a vote.
Attention is drawn to the possibility that some of the elements of this document may be the subject of patent rights. ISO and IEC shall not be held responsible for identifying any or all such patent rights. ISO/IEC 9541-2 was prepared by Joint Technical Committee ISO/IEC JTC 1, Information technology, Subcommittee SC 34, Document description and processing languages.
This second edition cancels and replaces the first edition (ISO/IEC 9541-2:1991), of which it constitutes a minor revision. It also incorporates the following Amendments and Corrigenda:
ISO/IEC 9541 consists of the following parts, under the general title Information technology -- Font information interchange:
The use of open networks for the interchange of documents in office and publishing environments has shown the need for a mechanism enabling the interchange of font information.
It is foreseen that publishing and document technologies will merge and that this development will be facilitated by definition of a standard font resource architecture and a limited number of standard font resource interchange formats.
At the publication of ISO/IEC 9541-1/Amd.4 and ISO/IEC 9541-2:1991/Amd.2:2009, ISO/CO suggested developing the 2nd editions incorporating all the Amendments and Corrigenda. The editors and ISO/CO discussed and concluded that the 2nd editions of ISO/IEC 9541-1, 2 and 3 should be published after the publication of ISO/IEC 9541-1/Amd.4 and ISO/IEC 9541-2:1991/Amd.2:2009 and that the 2nd editions should incorporate all the Amendments and Corrigenda and include editorial changing syntax to XML(DSDL, ISO/IEC 19757-2) from SGML/DTD and ASN.1.
ISO/IEC 9541, as a whole, specifies the architecture of font resources, as well as the formats for font interchange amongst information processing systems. It also specifies the architecture and formats that can be used to construct font references in general electronic document interchange.
This part of ISO/IEC 9541 specifies the interchange formats for font information, and the minimum subsets of that information required for interchange. This part of ISO/IEC 9541 requires the property definitions as defined in ISO/IEC 9541-1.
Font subsets defined by this part of ISO/IEC 9541 establish the minimum set of font properties that must occur within an ISO font resource. To accommodate the broad range of document and text processing functions found in office and publishing environments, it is anticipated that ISO font resources will contain more than the minimum number of font properties.
Font resources defined by this part of ISO/IEC 9541 are used in various document processing environments in which RELAX NG Compact Syntax schema (ISO/IEC 19757-2) parsing algorithms is recognized. The format of font resource information as defined in this part of ISO/IEC 9541 is specified in RELAX NG Compact Syntax for consistent generation of font resources for use in the processing environments.
A font resource conforming to this part of ISO/IEC 9541 shall contain property values for all of the minimum subset font properties specified in this part of ISO/IEC 9541, clause 5. A conforming font resource may contain more ISO or non-ISO properties than specified in this part of ISO/IEC 9541, clause 5. In addition, all properties contained in a conforming font resource shall be formatted as defined in one of the two interchange formats defined in this part of ISO/IEC 9541, clause 6.
A font resource using system (one which receives font information for subsequent processing) may claim conformance to this part of ISO/IEC 9541 if it has the ability to syntactically interpret and semantically process the relevant font subset(s) specified in this part of ISO/IEC 9541, clause 5.
A font resource supplying system (one which creates or modifies font information for subsequent supply to a font resource using system) may claim conformance to this part of ISO/IEC 9541 if it has the ability to create a syntactically correct instance of a conforming font resource.
A font resource transmission system (one which receives, optionally holds, and subsequently transmits font information) may claim conformance to this part of ISO/IEC 9541 if it has the ability to receive and send a syntactically correct instance of a conforming font resource without loss of information.
The following standards contain provisions which, through reference in this text, constitute provisions of this part of ISO/IEC 9541. At the time of publication, the editions indicated were valid. All standards are subject to revision, and parties to agreements based on this part of ISO/IEC 9541 are encouraged to investigate the possibility of applying the most recent editions of the standards indicated below. Members of IEC and ISO maintain registers of currently valid International Standards.
ISO/IEC 19757-2:2008, Information technology — Document Schema Definition Language (DSDL) — Part 2: Regular-grammar-based validation — RELAX NG.
ISO/IEC 9070:1991, Information technology — SGML support facilities — Registration procedures for public text owner identifiers.
ISO/IEC 9541-1, Information technology — Font information interchange — Part 1: Architecture.
For the purposes of this part of ISO/IEC 9541, the definitions given in ISO/IEC 9541-1 and the following definition apply.
A set or collection of font properties, usually associated by application usage and functional capability.
This clause defines the minimum set of font properties which shall occur within a font resource conforming to this part of ISO/IEC 9541. The required set of font resource properties is divided into font subsets representing three major groupings of required font resource information (font description information, modal metric information, and glyph metric information). ISO font subsets consist entirely of ISO font properties, as those properties are defined in ISO/IEC 9541-1.
NOTE 1 Glyph shape information may be resident within a presentation device and not interchanged with the other font resource information. The shape information may be interchanged with a font resource, but is not a required subset of an ISO font resource.
The minimum subset of font description information includes identification of the font resource and descriptive information about the font resource.
This font subset consists of the following properties (higher order property-lists containing these properties are also required):
FONTNAME | Font Resource Name | |
STANDARDVERSION | Standard Version Number | |
DSNSOURCE | Design Source Name | |
FONTFAMILY | Font Family Name | |
POSTURE | Posture Code | |
WEIGHT | Weight Code | |
PROPWIDTH | Proportionate Width Code | |
INCGLYPHCOLS | Included Glyph Collection(s) | | One or |
INCGLYPHS | Included Glyph(s) | | Both |
DSNSIZE | Design Size | |
MINSIZE | Minimum Size | |
MAXSIZE | Maximum Size | |
DSNGROUP | Design Group Codes | |
STRUCTURE | Structure Code |
NOTE 2 For font resource implementation consistency and for font reference comparison efficiency it is recommended that all font resources specify the Relative Rational Units, and use that specified value as the denominator for all Relative Rational values. For consistency with existing industry practice, it is recommended that a value of 1000 be used for the Relative Rational Units.
The minimum subset of modal metric information includes identification of at least one writing mode and modal metric values for the collection of all glyphs in the font resource.
This subset consists of the following properties, which are repeated for each writing mode supported by the font resource (higher order property-lists containing these properties are also required):
WRMODENAME | Writing Mode Name | |
NOMESCDIR | Nominal Escapement Direction | |
ESCCLASS | Escapement Class | |
AVGESCX | Average x-Escapement | | |
AVGESCY | Average y-Escapement | | x or y |
AVGLCESCX | Average Lower Case x-Escapement | | must be |
AVGLCESCY | Average Lower Case y-Escapement | | present, |
AVGCAPESCX | Average Capital x-Escapement | | depending |
AVGCAPESCY | Average Capital y-Escapement | | on writing |
TABESCX | Tabular x-Escapement | | mode |
TABESCY | Tabular y-Escapement | | |
MAXFONTEXT | Maximum Font Extents |
The minimum subset of glyph metric information includes identification of each glyph contained in the font resource and metric information for each of those identified glyphs.
This subset consists of the following properties, which are repeated for each writing mode supported by the font resource and for each glyph supported in that writing mode (higher order property-lists containing these properties are also required):
GNAME | Glyph Structured Name | |
EX | X Escapement Point | | One or |
EY | Y Escapement Point | | both |
EXT | Extents |
ISO font resources for interchange shall be defined using ISO/IEC 19757-2 (RELAX NG Compact Syntax) schema defined below.
NOTE 3 The architecture of ISO/IEC 9541-1 and the interchange formats of this part of ISO/IEC 9541 permit the existence of empty property-lists, however, there are no assumed values associated with such lists.
# © ISO/IEC 2011 # The following permission notice and disclaimer shall be included in all # copies of this RELAX NG schema ("the Schema"), and derivations of the Schema: # Permission is hereby granted, free of charge in perpetuity, to any # person obtaining a copy of the Schema, to use, copy, modify, merge and # distribute free of charge, copies of the Schema for the purposes of # developing, implementing, installing and using software based on the # Schema, and to permit persons to whom the Schema is furnished to do so, # subject to the following conditions: # THE SCHEMA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SCHEMA OR THE USE OR # OTHER DEALINGS IN THE SCHEMA. # In addition, any modified copy of the Schema shall include the following notice: # THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO/IEC 19757-3:2010, # AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD." default namespace = "http://sc34wg2.org/font_resource" start = fontres simval = msg | str | int | card | code | propdata | relr | ratl | bool | glbname | octstr | ang | time compval = vlist | ovlist | plist | oplist fontres = element fontres { namencd? , namtabl? , fontname , fontdes , wrmodes , gshapes? , niprop* } # FONT RESOURCE namencd = element namencd { octstr } # char encoding for names namtabl = element namtabl { (prefix , strucnm)+ } # name prefix table, # see global name note at the end of this clause prefix = element prefix { code } # prefix index fontname = element fontname { glbname } # FONTNAME # description properties fontdes = element fontdes { dataver? & stdver & datasrce? & datacopy? & dsnsrce & dsncopy? & relunits? & typeface? & fontfam & posture & postang? & weight & propwdth & glycomp & nomwrmde? & dsnsize & minsize & maxsize & caphght? & lchght? & dsngroup & structur & mnfeatsz? & nomcsw? & nomlcsw? & verticalunit-property & fillratio-property & designareas-property & niprop* } # FONTDESCRIPTION dataver = element dataver { card?, card?, time? } # DATAVERSION stdver = element stdver { card } # STANDARD VERSION datasrce = element datasrce { glbname } # DATASOURCE datacopy = element datacopy { msg } # DATACOPYRIGHT dsnsrce = element dsnsrce { glbname } # DSNSOURCE dsncopy = element dsncopy { msg } # DSNCOPYRIGHT relunits = element relunits { card } # RELUNITS, defaults to 1 typeface = element typeface { msg } # TYPEFACE fontfam = element fontfam { str } # FONTFAMILY posture = element posture { code } # POSTURE postang = element posting { ang } # POSTUREANGLE weight = element weight { code } # WEIGHT propwdth = element propwdth { code } # PROPWIDTH glycomp = element glycomp { numglyph? , iglycols?, xglycols?, iglys?, xglys?, niprop* } # GLYPHCOMP numglyph = element numglyph { xsd:integer } # NUMGLYPHS iglycols = element iglycols { glbname+ } xglycols = element xglycols { glbname+ } iglys = element iglys { glbname+ } xglys = element xglys { glbname+ } # INC/EXCGLYPHCOLS,INC/EXCGLYPHS nomwrmde = element nomwrmde { glbname } # NOMWRMODE dsnsize = element dsnsize { ratl } # DSNSIZE minsize = element minsize { ratl } # MINSIZE maxsize = element maxsize { ratl } # MAXSIZE caphght = element caphght { relr } # CAPHEIGHT Ichght = element lchght { relr } # LCHEIGHT dsngroup = element dsngroup { code,code,code } # DSNGROUP structur = element structur { code } # STRUCTURE mnfeatsz = element mnfeatsz { relr } # MINFEATSZ nomcsw = element nomcsw { relr } # NOMCAP nomlcsw = element nomlcsw { relr } # NOMLCSTEMWIDTH typefaceclass = element typefaceclass { glbname } kind = element kind { glbname } serifstyle = element serifstyle { glbname } # Writing mode dependent properties wrmodes = element wrmodes { wrmode* & niprop* } # WRMODES wrmode = element wrmode { wrmdnam , ( nescdir & escclass & (avgescx & avgescy & avlcescx & avlcescy & avcpescx & avcpescy & averageesc-property & tabescx & tabescy ) & mxfntext & sectors? & escadjs? & mineas? & maxeas? & scores? & varscrps? & minlinsp? & minanasc? & maxanasc? & nomalign? & algnmds? & copyfits? & genkendot-property & ILC-property & (dsnwdadd? & dsnwdamp? & minwdadd? & minwdamp? & maxwdadd? & maxwdamp? & dsnltadd? & dsnltamp? & minltadd? & minltamp? & maxltadd? & maxltamp?) & gmetrics & niprop*) } # WRMODE wrmdnam = element wrmdnam { glbname } # WRMODENAME nescdir = element nescdir { ang } # NOMESCDIR escclass = element escclass { code } # ESCCLASS avgescx = element avgescx { relr } # AVGESCX avgescy = element avgescy { relr } # AVGESCY avlcescx = element avlcescx { relr } # AVGLCESCX avlcescy = element avlcescy { relr } # AVGLCESCY avcpescx = element avcpescx { relr } # AVGCAPESCX avcpescy = element avcpescy { relr } # AVGCAPESCY tabescx = element tabescx { relr } # TABESCX tabescy = element tabescy { relr } # TABESCY mxfntext = element mxfntext { relr , relr , relr , relr } # MAXFONTEXT sectors = element sectors { sector* & niprop* } # SECTORS sector = element sector { relr , relr } # SECTOR (left and right) escadjs = element escadjs { ascadj* & niprop* } # ESCADJS escadj = element escadj { adjname, (cpea? & sec? & niprop*) } # ESCADJ adjname = element adjname { glbname } # ESCADJNAME cpea = element cpea { ncpeafwd & ncpeabwd & cpeax? & cpeay? & niprop* } # CPEA ncpeafwd = element ncpeafwd { card } # NCPEAFORWD ncpeabwd = element ncpeabwd { card } # NCPEABACKWD cpeax = element cpeax { relr+ } # CPEAX cpeay = element cpeay { relr+ } # CPEAY sec = element sec { secx? & secy? & niprop* } # SEC secx = element secx { (ratl, relr)+ } # SECX secy = element secy { (ratl, relr)+ } # SECY mineas = element mineas { ratl } # MINESCADJSZE maxeas = element maxeas { ratl } # MAXESCADJSZE scores = element scores { score+ & niprop* } # SCORES score = element score { scname, (scoffx? & scoffy? & scthick? & niprop* ) } # SCORE scname = element scname { glbname } # SCORENAME scoffx = element scoffx { relr } # SCOREOFFSETX scoffy = element scoffy { relr } # SCOREOFFSETY scthick = element scthick { relr } # SCORETHICK varscrps = element varscrps { varscrp* & niprop* } # VSCRIPTS varscrp = element varscrp { (vsname , (vsoffx? & vsoffy? & vsscalex? & vsscaley? & niprop* ) } # VSCRIPT vsname = element vsname { glbname } # VSNAME vsoffx = element vsoffx { relr } # VSOFFSETX vsoffy = element vsoffy { relr } # VSOFFSETY vsscalex = element vsscalex { ratl } # VSSCALEX vsscaley = element vsscaley { ratl } # VSSCALEY minlinsp = element minlinsp { relr , relr } # MINLINESP minanasc = element minanasc { ratl } # MINANASCALE maxanasc = element maxanasc { ratl } # MAXANASCALE nomalign = element nomalign { glbname } # NOMALIGN algnmds = element algnmds { align* & niprop* } # ALIGNMODES align = element align { alname, (aloffx? & aloffy? & ascalex? & ascaley? & niprop*) } # ALIGN alname = element alname { glbname } # ALIGNNAME aloffx = element aloffx { relr } # ALIGNOFFSETX aloffy = element aloffy { relr } # ALIGNOFFSETY ascalex = element ascalex { ratl } # ALIGNSCALEX ascaley = element ascaley { ratl } # ALIGNSCALEY copyfits = element copyfits { copyfit* & niprop* } # COPYFITS copyfit = element copyfit { cfname, (cfmeas? & niprop*) } # COPYFIT cfname = element cfname { glbname } # COPYFITNAME cfmeas = element cfmeas { ratl } # COPYFITMEASURE dsnwdadd = element dsnwdadd { relr } minwdadd = element minwdadd { relr } maxwdadd = element maxwdadd { relr } dsnltadd = element dsnltadd { relr } minltadd = element minltadd { relr } maxltadd = element maxltadd { relr } # word and letter space additions dsnwdamp = element dsnwdamp { ratl } minwdamp = element minwdamp { ratl } maxwdamp = element maxwdamp { ratl } dsnltamp = element dsnltamp { ratl } minltamp = element minltamp { ratl } maxltamp = element maxltamp { ratl } # word and letter space amplifications # Glyph Metric Information gmetrics = element gmetrics { gmetric+ & niprop* } # GLYPHMETRICS gmetric = element gmetric { glname , (px & py & ex & ey & ext & Igs? & peas? & cpeai? & eai? & minex? & miney? & maxex? & maxey? & niprop*) } glname = element glname { glbname } # GNAME px = element px { relr } # PX py = element py { relr } # PY ex = element ex { relr } # EX ey = element ey { relr } # EY ext = element ext { relr , relr , relr , relr } # EXT lgs = element lgs { lg* & niprop* } # LGS lg = element lg { lgn, lgsn } # LG lgn = element lgn { glbname } # LGN lgsn = element lgsn { glbname+ } # LGSN peas = element peas { pea* & niprop* } # PEAS pea = element pea { pean, ( peax? & peay? & spfx? & spfy? & spbx? & spby? & niprop* ) } # PEA pean = element pean { glbname } # PEAN peax = element peax { (glbname, relr)+ } # PEAX peay = element peay { (glbname, relr)+ } # PEAY spfx = element spfx { relr+ } spfy = element spfy { relr+ } spbx = element spbx { relr+ } spby = element spby { relr+ } # SPEA Extents cpeai = element cpeai { card , card } # CPEAI eai = element eai { code } # EAI minex = element minex { relr } # MINEX miney = element miney { relr } # MINEY maxex = element maxex { relr } #MAXEX maxey = element maxey { relr } #MAXEY # Glyph Shape information default namespace = "http://sc34wg2.org/glyph_shapes" # ISO/IEC 9541-3 start = gshapes # 'Non-ISO Property' and elemental type definitions Niprop = element niprop { name , value } # for non-ISO properties. # NB. only ISO-defined value types allowed. name = element name { glbname } value = element value { simval | compval } # elemental value types plist = element plist { (defnmpre? , niprop)+ } oplist = element oplist { (defnmpre? , niprop)+ } # property-lists defnmpre = element defnmpre { prefix } # default name prefix vlist = element vlist { simval+ } # value list ovlist = element ovlist { simval+ } # value list glbname = element glbname { prefix?, strucnm } # global name # see global name note at the end of this clause str = element str { strtype , strvalue } # machine parsable string strtype = element strtype { code } # identifier of character string type strvalue = xsd:string # character string msg = element msg { msgtype , msgvalue } # human-readable message msgtype = element msgtype { code } # identifier of character string type msgvalue = element msgvalue { xsd:string } # character string int = element int { xsd:integer } # integer (- 231 to 231 - 1) card = element card { xsd:integer { minInclusive 0 } } # cardinal (0 to 232 - 1) code = element code { xsd:integer { maxInclusive 255, minInclusive 0 } } # code or "short integer" (0 to 255) time = element time { xsd:time } # W3C Schema data type Time String octstr = element octstr { xsd:string | # octet string ratl = element ratl { num , den? } # denominator defaults to 1 relr = element relr { num , den? } # denominator defaults to relunits ang = element ang { num , den? } # angle (in degrees) bool = element bool { attribute value { (true | false) "true" }, empty } # boolean ('true' or 'false') propdata = element propdata { msg? , key? , octstr } # proprietary data key = element key { octstr } # encryption key num = element num { xsd:integer } # numerator den = element den { xsd:integer } # denominator # Schema for 8.9.1 Vertical Units and Horizontal Units verticalunit-property = element verticalunit-property { verticalunit-name, verticalunit-value } verticalunit-name = element verticalunit-name { glbname } verticalunit-value = element verticalunit-value { card } horizontalunit-property = element horizontalunit-property { horizontalunit-name, horizontalunit-value } horizontalunit-name = element horizontalunit-name { glbname } horizontalunit-value = element horizontalunit-value { card } # Schema for 8.9.2 Fill Ratio fillratio-property = element fillratio-property { fillratio-name, fillratio-value-property-list } fillratio-name = element fillratio-name { glbname } fillratio-value-property-list = element fillratio-value-property-list { blackness+ } blackness = element blackness { reference-glyph, fillratio-value } reference-glyph = element reference-glyph { msg } fillratio-value = element fillratio-value { ratl } # Schema for 8.9.3 Design Areas designareas-property = element designareas-property { designareas-name, designareas-value-property-list } designareas-name = element designareas-name { glbname } designareas-value-property-list = element designareas-value-property-list { (designarea-property|plist)+ } designarea-property = element designarea-property { designarea-name, designarea-value-property-list } designarea-name = element designarea-name { glbname } designarea-value-property-list = element designarea-value-property-list { letter-face+ } letter-face = element letter-face { dsnarea-glyphset-name, dsnarea-height, dsnarea-width } dsnarea-glyphset-name = element dsnarea-glyphset-name { msg } dsnarea-height = element dsnarea-height { ralr } dsnarea-width = element dsnarea-width { ralr } # Schema for 8.9.4 Average ESC averageesc-property = element averageesc-property { averageesc-name, averageesc-value-property-list } averageesc-name = element averageesc-name { glbname } averageesc-value-property-list = element averageesc-value-property-list { (averagelen-property|plist)+ } averagelen-property = element averagelen-property { averagelen-name, averagelen-value-property-list } averagelen-name = element averagelen-name { glbname } averagelen-value-property-list = element averagelen-value-property-list { average-length+ } average-length = element average-length { averlen-glyphset-name, avrlen-height, avrlen-width } averlen-glyphset-name = element averlen-glyphset-name { msg } averlen-height = element averlen-height { ralr } averlen-width = element averlen-width { ralr } # Schema for 8.9.5 Generalized Kendot genkendot-property = element genkendot-property { genkendot-name, genkendot-value-property-list } genkendot-value-property-list = element genkendot-value-property-list { (genkendot-offsetx-property | genkendot-offsety-property | genkendot-thick-property | genkendot-shape-property)+ } genkendot-offsetx-property = element genkendot-offsetx-property { genkendot-offsetx-name, genkendot-offsetx-value } genkendot-offsetx-name= element genkendot-offsetx-name { glbname } genkendot-offsetx-value = element genkendot-offsetx-value { ralr } genkendot-offsety-property = element genkendot-offsety-property { genkendot-offsety-name, genkendot-offsety-value } genkendot-offsety-name = element genkendot-offsety-name { glbname } genkendot-offsety-value = element genkendot-offsety-value { ralr } genkendot-thick-property = element genkendot-thick-property { genkendot-thick-name,genkendot-thick-value } genkendot-thick-name = element genkendot-thick-name { glbname } genkendot-thick-value = element genkendot-thick-value { ralr } genkendot-shape-property = element genkendot-shape-property { genkendot-shape-name, genkendot-shape-value } genkendot-shape-name = element genkendot-shape-name { glbname } genkendot-shape-value = element genkendot-shape-value { glbname } # Schema for 8.10 Interlinear/intercharacter Object Properties ILC-property = element ILC-property { ILC-name, ILC-value-property-list } ILC-name = element ILC-name { glbname } ILC-value-property-list = element ILC-value-property-list { (ILC-type-property|ILC-font-size-property | ILC-typeface-property|ILC-rotation-property | ILC-writing-direction-offset-property | ILC-formatting-type-property | ILC-line-progression-direction-offset-property)+ } ILC-type-property = element ILC-type-property { ILC-type-name, ILC-type-value } ILC-type-name = element ILC-type-name { glbname } ILC-type-value = element ILC-type-value { glbname } ILC-font-size-property = element ILC-font-size-property { ILC-font-size-name, ILC-font-size-value-type, ILC-font-size-value } ILC-font-size-name = element ILC-font-size-name { glbname } ILC-font-size-value-type = element ILC-font-size-value-type { attribute type { (ABS | RELATIVE) "ABS" }, empty } ILC-font-size-value = element ILC-font-size-value { relr } ILC-typeface-property = element ILC-typeface-property { ILC-typeface-name, ILC-typeface-value } ILC-typeface-name = element ILC-typeface-name { glbname } ILC-typeface-value = element ILC-typeface-value { glbname } ILC-rotation-property = element ILC-rotation-property { ILC-rotation-name, ILC-rotation-value } ILC-rotation-name = element ILC-rotation-name { relr } ILC-rotation-value = element ILC-rotation-value { attribute value { (0 | 90 | 180 | 270) "0" }, empty } ILC-writing-direction-offset-property = element ILC-writing-direction-offset-property { ILC-writing-direction-offset-name, ILC-writing-direction-offset-value, ILC-writing-direction-offset-value } ILC-writing-direction-offset-name = element ILC-writing-direction-offset-name { glbname } ILC-writing-direction-offset-value-type = element ILC-writing-direction-offset-value-type { attribute type { (ABS|RELATIVE) "ABS" }, empty } ILC-writing-direction-offset-value = element ILC-writing-direction-offset-value { relr } ILC-formatting-type-property = element ILC-formatting-type-property { ILC-formatting-type-name, ILC-formatting-type-value } ILC-formatting-type-name = element ILC-formatting-type-name { glbname } ILC-formatting-type-value = element ILC-formatting-type-value { attribute value { (HEAD | CENTER | TAIL | JUSTIFICATION) "HEAD" }, empty } ILC-line-progression-direction-offset-property = element ILC-line-progression-direction-offset-property { ILC-line-progression-direction-offset-name, ILC-line-progression-direction-offset-value, ILC-line-progression-direction-offset-value-type } ILC-line-progression-direction-offset-name = element ILC-line-progression-direction-offset-name { glbname } ILC-line-progression-direction-offset-value-type = element ILC-line-progression-direction-offset-value-type { attribute value { (ABS | RELATIVE) "ABS" }, empty } ILC-line-progression-direction-offset-value = element ILC-line-progression-direction-offset-value { relr }
NOTE 4 The glbname and nametbl elements represent an encoding efficiency that permits the use of short Structured-Names (as short as one Object-Name-Component) within the body of a font resource or font reference. The nametbl element is an indexed list of fully rooted Structured-Name values (containing some number of name components) that are to be paired with the unrooted Structured-Name value (containing the remaining number of name components) of any glbname element containing the corresponding prefix value. For example, if a glyph has a fully qualified Structured-Name value of "ISO/IEC 10036/RA//Glyphs..1234", then a fully rooted Structured-Name Name-Prefix value would be a Structured-Name value beginning with ISO/IEC 10036", not including the smallest unrooted Structured-Name value of "1234". If no prefix value is provided in a glbname element, then the strucnm value specified is a fully qualified Structured-Name. Caution should be exercised in the creation of nametbl values since no Validation checking can be performed to verify the fully qualified Structured-Name resulting from the combination.
This annex defines an RELAX NG Compact Syntax schema (ISO/IEC 19757-2) of the font information that may be used in a font reference data structure. A font reference is intended for use in the identification and selection of a font resource that matches the set of property values specified in the font reference; glyph metrics, if present, are intended only to aid font selection. A complete font reference needs to be based on the processing and user requirements of the document architecture in which the reference is defined.
The structure defined below retains the same format as a font resource, except all properties are optional and glyph shapes are excluded. The structure may be used directly as a font reference (by specifying the selection semantics), or may be used as a building block for more complex font selection or Substitution requirements. Only those properties considered to be relevant to the originator need be specified in a font reference.
This clause specifies a RELAX NG Compact Syntax schema (ISO/IEC 19757-2) representation of a font property set, as defined in this part of ISO/IEC 9541.
# © ISO/IEC 2011 # The following permission notice and disclaimer shall be included in all # copies of this RELAX NG schema ("the Schema"), and derivations of the Schema: # Permission is hereby granted, free of charge in perpetuity, to any # person obtaining a copy of the Schema, to use, copy, modify, merge and # distribute free of charge, copies of the Schema for the purposes of # developing, implementing, installing and using software based on the # Schema, and to permit persons to whom the Schema is furnished to do so, # subject to the following conditions: # THE SCHEMA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SCHEMA OR THE USE OR # OTHER DEALINGS IN THE SCHEMA. # In addition, any modified copy of the Schema shall include the following notice: # THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO/IEC 19757-3:2010, # AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD.". default namespace = "http://sc34wg2.org/font_attribute" start = fontset simval = msg | str | int | card | code | propdata | relr | ratl | bool | glbname | octstr | ang | time compval = vlist | ovlist | plist | oplist fontset = element fontset { namencd?, namtabl?, fontname?, fontdes?, wrmodes?, niprop* } # FONT REFERENCE SET namencd = element namencd { octstr } # char encoding for names namtabl = element namtabl { (prefix, strucnm)+ } # name prefix table # see NOTE 4 at the end of 6.2 prefix = element prefix { code } # prefix index fontname = element fontname { glbname } # FONTNAME # description properties fontdes = element fontdes { dataver? & stdver? & datasrce? & datacopy? & dsnsrce? & dsncopy? & relunits? & typeface? & fontfam? & posture? & postang? & weight? & propwdth? & glycomp? & nomwrmde? & dsnsize? & minsize? & maxsize? & caphght? & Ichght? & dsngroup? & structur? & mnfeatsz? & nomcsw? & nomlcsw? & niprop* } # FONTDESCRIPTION dataver = element dataver { card?, card?, time? } # DATAVERSION stdver = element stdver { card } # STANDARDVERSION datasrce = element datasrce { glbname } # DATASOURCE datacopy = element datacopy { msg } # DATACOPYRIGHT dsnsrce = element dsnsrce { glbname } # DSNSOURCE dsncopy = element dsncopy { msg } # DSNCOPYRIGHT relunits = element relunits { card } # RELUNITS, defaults to 1 typeface = element typeface { msg } # TYPEFACE fontfam = element fontfam { str } # FONTFAMILY posture = element posture { code } # POSTURE postang = element posting { ang } # POSTUREANGLE weight = element weight { code } # WEIGHT propwdth = element propwdth { code } # PROPWIDTH glycomp = element glycomp { numglyph?, iglycols?, xglycols?, iglys?, xglys?, niprop* } # GLYPHCOMP numglyph = element numglyph { xsd:integer } # NUMGLYPHS iglycols = element iglycols { glbname+ } # INCGLYPHCOLS xglycols = element xglycols { glbname+ } # EXCGLYPHCOLS iglys = element iglys { glbname+ } # INCGLYPHS xglys = element xglys { glbname+ } # EXCGLYPHS nomwrmde = element nomwrmde { glbname } # NOMWRMODE dsnsize = element dsnsize { ratl } # DSNSIZE minsize = element minsize { ratl } # MINSIZE maxsize = element maxsize { ratl } # MAXSIZE caphght = element caphght { relr } # CAPHEIGHT lchght = element lchght { relr } # LCHEIGHT dsngroup = element dsngroup { code, code, code } # DSNGROUP structur = element structur { code } # STRUCTURE mnfeatsz = element mnfeatsz { relr } # MINFEATSZ nomcsw = element nomcsw { relr } # NOMCAPSTEMWIDTH nomlcsw = element nomlcsw { relr } # NOMLCSTEMWIDTH typefaceclass = element typefaceclass { glbname } kind = element kind { glbname } serifstyle = element serifstyle { glbname } # Writing mode dependent properties wrmodes = element wrmodes { wrmode* & niprop* } # WRMODES wrmode = element wrmode { wrmdnam, ( nescdir? & escclass? & (avgescx? & avgescy? & avlcescx? & avlcescy? & avcpescx? & avcpescy? & tabescx? & tabescy?) & mxfntext? & sectors? & escadjs? & mineas? & maxeas? & scores? & varscrps? & minlinsp? & minanasc? & maxanasc? & nomalign? & algnmds? & copyfits? & (dsnwdadd? & dsnwdamp? & minwdadd? & minwdamp? & maxwdadd? & maxwdamp? & dsnltadd? & dsnltamp? & minltadd? & minltamp? & maxltadd? & maxltamp?) & gmetrics & niprop*) } # WRMODE wrmdnam = element wrmdnam { glbname } # WRMODENAME nescdir = element nescdir { ang } # NOMESCDIR escclass = element escclass { code } # ESCCLASS avgescx = element avgescx { relr } # AVGESCX avgescy = element avgescy { relr } # AVGESCY avlcescx = element avlcescx { relr } # AVGLCESCX avlcescy = element avlcescy { relr } # AVGLCESCY avcpescx = element avcpescx { relr } # AVGCAPESCX avcpescy = element avcpescy { relr } # AVGCAPESCY tabescx = element tabescx { relr } # TABESCX tabescy = element tabescy { relr } # TABESCY mxfntext = element mxfntext { relr, relr, relr, relr } # MAXFONTEXT sectors = element sectors { sector* & niprop* } # SECTORS sector = element sector { relr, relr } # SECTOR (left and right) escadjs = element escadjs { ascadj* & niprop* } # ESCADJS escadj = element escadj { adjname, (cpea? & sec? & niprop*) } # ESCADJ adjname = element adjname { glbname } # ESCADJNAME cpea = element cpea { ncpeafwd & ncpeabwd & cpeax? & cpeay? & niprop* } # CPEA ncpeafwd = element ncpeafwd { card } # NCPEAFORWD ncpeabwd = element ncpeabwd { card } # NCPEABACKWD cpeax = element cpeax { relr+ } # CPEAX cpeay = element cpeay { relr+ } # CPEAY sec = element sec { secx? & secy? & niprop* } # SEC secx = element secx { (ratl, relr)+ } # SECX secy = element secy { (ratl, relr)+ } # SECXY mineas = element mineas { ratl } # MINESCADJSZE maxeas = element maxeas { ratl } # MAXESCADJSZE scores = element scores { score+ & niprop* } # SCORES score = element score { scname, (scoffx? & scoffy? & scthick? & niprop* ) } # SCORE scname = element scname { glbname } # SCORENAME scoffx = element scoffx { relr } # SCOREOFFSETX scoffy = element scoffy { relr } # SCOREOFFSETY scthick = element scthick { relr } # SCORETHICK varscrps = element varscrps { varscrp* & niprop* } # VSCRIPTS varscrp = element varscrp { vsname, (vsoffx? & vsoffy? & vsscalex? & vsscaley? & niprop* ) } # VSCRIPT vsname = element vsname { glbname } # VSNAME vsoffx = element vsoffx { relr } # VSOFFSETX vsoffy = element vsoffy { relr } # VSOFFSETY vsscalex = element vsscalex { ratl } # VSSCALEX vsscaley = element vsscaley { ratl } # VSSCALEY minlinsp = element minlinsp { relr , relr } # MINLINESP minanasc = element minanasc { ratl } # MINANASCALE maxanasc = element maxanasc { ratl } # MAXANASCALE nomalign = element nomalign { glbname } # NOMALIGN algnmds = element algnmds { align* & niprop* } # ALIGNMODES align = element align { alname, (aloffx? & aloffy? & ascalex? & ascaley? & niprop*) } # ALIGN alname = element alname { glbname } # ALIGNNAME aloffx = element aloffx { relr } # ALIGNOFFSETX aloffy = element aloffy { relr } # ALIGNOFFSETY ascalex = element ascalex { ratl } # ALIGNSCALEX ascaley = element ascaley { ratl } # ALIGNSCALEY copyfits = element copyfits { copyfit* & niprop* } # COPYFITS copyfit = element copyfit { cfname, (cfmeas? & niprop*) } # COPYFIT cfname = element cfname { glbname } # COPYFITNAME cfmeas = element cfmeas { ratl } # COPYFITMEASURE dsnwdadd = element dsnwdadd { relr } minwdadd = element minwdadd { relr } maxwdadd = element maxwdadd { relr } dsnltadd = element dsnltadd { relr } minltadd = element minltadd { relr } maxltadd = element maxltadd { relr } # word and letter space additions dsnwdamp = element dsnwdamp { ratl } minwdamp = element minwdamp { ratl } maxwdamp = element maxwdamp { ratl } dsnltamp = element dsnltamp { ratl } minltamp = element minltamp { ratl } maxltamp = element maxltamp { ratl } # word and letter space amplifications # Glyph metric properties gmetrics = element gmetrics { gmetric+ & niprop* } # GLYPHMETRICS gmetric = element gmetric { glname , (px? & py? & ex? & ey? & ext? & Igs? & peas? & cpeai? & eai? & minex? & miney? & maxex? & maxey? & niprop*) } glname = element glname { glbname } # GNAME px = element px { relr } # PX py = element py { relr } # PY ex = element ex { relr } # EX ey = element ey { relr } # EY ext = element ext { relr, relr, relr, relr } # EXT Igs = element Igs { lg* & niprop* } # LGS lg = element Ig { lgn, lgsn ) # LG lgn = element Ign { glbname } # LGN lgsn = element Igsn { glbname+ } # LGSN peas = element peas { pea* & niprop* } # PEAS pea = element pea { pean, ( peax? & peay? & spfx? & spfy? & spbx? & spby? & niprop* ) } # PEA pean = element pean { glbname } # PEAN peax = element peax { (glbname, relr)+ } # PEAX peay = element peay { (glbname, relr)+ } # PEAY spfx = element spfx { relr+ } spfy = element spfy { relr+ } spbx = element spbx { relr+ } spby = element spby { relr+ } # SPEA Extents cpeai = element cpeai { card , card } # CPEAI eai = element eai { code } # EAI minex = element minex { relr } # MINEX miney = element miney { relr } # MINEY maxex = element maxex { relr } # MAXEX maxey = element maxey { relr } # MAXEY # 'Non-ISO Property' and elemental type definitions niprop = element niprop { name, value } # for non-ISO properties. # NB. only ISO-defined value types allowed. name = element name { glbname } value = element value { simval | compval } # elemental value types plist = element plist { (defnmpre? , niprop)+ } oplist = element oplist { (defnmpre? , niprop)+ } # property-lists defnmpre = element defnmpre { prefix } # default name prefix vlist = element vlist { simval+ } # value lists ovlist = element ovlist { simval+ } # value lists glbname = element glbname { prefix?, strucnm } # global name # see global name note at the end of clause 6.2 str = element str { strtype, strvalue } # machine parsable string strtype = element strtype { code } # identifier of character string type strvalue = xsd:string # character string msg = element msg { msgtype, msgvalue } # human-readable message msgtype = element msgtype { code } # identifier of character string type msgvalue = element msgvalue { xsd:string } # character string int = element int { xsd:integer } # integer (-231 to 231 -1) card = element card { xsd:integer { minInclusive 0 } } # cardinal (0 to 232 -1) code = element code { xsd:integer { maxInclusive 255, minInclusive 0 } } # code or "short integer" (0 to 255) time = element time { xsd:time } # W3C Schema data type Time String octstr = element octstr { xsd:string } # octet string ratl = element ratl { num, den?} # denominator defaults to 1 relr = element relr { num, den?} # denominator defaults to relunits ang = element ang { num, den?} # angle (in degrees) bool = element bool { attribute value { (true | false) "true" }, empty } # boolean ('true' or 'false') propdata = element propdata { msg?, key?, octstr } # proprietary data key = element key { octstr } # encryption key num = element num { xsd:integer } # numerator den = element den { xsd:integer } # denominator
This annex defines the interchange format of structured-name public identifiers for use in font information interchange as defined in this part of ISO/IEC 9541. The application of structured-name public identifiers in this annex is in accordance with the structured name constructs defined in ISO 9070.
A valid structured-name is one that is fully rooted, either by explicitly defining the full set of owner-name and object-name components or by implicitly defining the root and some number of name components and explicitly defining the remaining name components.
NOTE 5 RELAX NG Compact Syntax schema (ISO/IEC 19757-2) formats defined in this Annex show all elements of the structured name as being optional. These formats are for coding efficiency, permitting separation of the structured-name components into a separate name prefix and a name suffix. These format conveniences do not imply that a structured name does not need to be fully rooted.
"Object Name" is an optional sequence of 1 or more alphanumeric or numeric object name components that constitute an unambiguous name within the context of the "Owner Name" of the structured name.
An alphanumeric name element is composed of 1 or more graphic characters from the repertoire: "A-Z, a-z, O-9, hyphen, and period." A numeric name element is a graphic character from the repertoire "1-9", followed by 0 or more graphic characters from the repertoire "0-9".
NOTE 6 Numeric name elements have the property that they will compare identically as strings if and only if the integer quantities they represent are equal, and vice versa. At the discretion of the naming authority, object names may be registered as a hierarchical structure consisting of an arbitrary number of elements, each level of the hierarchy, in effect, defining a class of objects.
There are four representations for structured name public identifiers:
This clause specifies a ISO/IEC 19757-2 (RELAX NG Compact Syntax) schema representation of a structured name, as defined in this part of ISO/IEC 9541. The specification is in the form of SGML public text, so that it can be referenced from documents without having to duplicate the text.
# © ISO/IEC 2011 # The following permission notice and disclaimer shall be included in all # copies of this RELAX NG schema ("the Schema"), and derivations of the Schema: # Permission is hereby granted, free of charge in perpetuity, to any # person obtaining a copy of the Schema, to use, copy, modify, merge and # distribute free of charge, copies of the Schema for the purposes of # developing, implementing, installing and using software based on the # Schema, and to permit persons to whom the Schema is furnished to do so, # subject to the following conditions: # THE SCHEMA IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SCHEMA OR THE USE OR # OTHER DEALINGS IN THE SCHEMA. # In addition, any modified copy of the Schema shall include the following notice: # THIS SCHEMA HAS BEEN MODIFIED FROM THE SCHEMA DEFINED IN ISO/IEC 19757-3:2010, # AND SHOULD NOT BE INTERPRETED AS COMPLYING WITH THAT STANDARD.". default namespace = "http://sc34wg2.org/structured_name" start = strucnm strucnm = element strucnm { ownernm?, owndesc?, objnm?, objdesc? } # structured name public identifier ownernm = element ownernm { opre?, ownc* } # owner name opre = xsd:string # owner prefix, # visible string characters, except for "//" and "::" ownc = xsd:string # owner name component, # visible string characters, except for "//" and "::" owndesc = element owndesc { mtype, mvalue } # owner description mtype = element mtype { code } # message type code = element code { xsd:integer { maxInclusive 255, minInclusive 0 } } # "short integer" (0-255) mvalue = xsd:string # message value objnm = element objnm { obnc* } # object name obnc = xsd:string # object name component, # "A-Z", "a-z", "0-9", Hyphen, and Period, with the first digit being # in the range of 1 to 9, if the name component is a number objdesc = element objdesc { mtype, mvalue } # object description