| <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> |
| <!-- |
| $Id$ |
| |
| Copyright © 2003 Keith Packard |
| |
| Permission to use, copy, modify, distribute, and sell this software and its |
| documentation for any purpose is hereby granted without fee, provided that |
| the above copyright notice appear in all copies and that both that |
| copyright notice and this permission notice appear in supporting |
| documentation, and that the name of Keith Packard not be used in |
| advertising or publicity pertaining to distribution of the software without |
| specific, written prior permission. Keith Packard makes no |
| representations about the suitability of this software for any purpose. It |
| is provided "as is" without express or implied warranty. |
| |
| KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, |
| DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
| TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| PERFORMANCE OF THIS SOFTWARE. |
| --> |
| <article> |
| <artheader> |
| <title>Fontconfig Users Guide</title> |
| <titleabbrev>Fontconfig</titleabbrev> |
| <author><firstname>Keith</><surname>Packard</></author> |
| <authorinitials>krp</authorinitials> |
| </artheader> |
| <sect1><title>NAME</title> |
| <para> |
| fontconfig - Font configuration and customization library |
| </para> |
| </sect1> |
| <sect1><title>DESCRIPTION</title> |
| <para> |
| Fontconfig is a library designed to provide system-wide font configuration, |
| customization and application access. |
| </para> |
| </sect1> |
| <sect1><title>FUNCTIONAL OVERVIEW</title> |
| <para> |
| Fontconfig contains two essential modules, the configuration module which |
| builds an internal configuration from XML files and the matching module |
| which accepts font patterns and returns the nearest matching font. |
| </para> |
| <sect2><title>FONT CONFIGURATION</title> |
| <para> |
| The configuration module consists of the FcConfig datatype, libexpat and |
| FcConfigParse which walks over an XML tree and ammends a configuration with |
| data found within. From an external perspective, configuration of the |
| library consists of generating a valid XML tree and feeding that to |
| FcConfigParse. The only other mechanism provided to applications for |
| changing the running configuration is to add fonts and directories to the |
| list of application-provided font files. |
| </para><para> |
| The intent is to make font configurations relatively static, and shared by |
| as many applications as possible. It is hoped that this will lead to more |
| stable font selection when passing names from one application to another. |
| XML was chosen as a configuration file format because it provides a format |
| which is easy for external agents to edit while retaining the correct |
| structure and syntax. |
| </para><para> |
| Font configuration is separate from font matching; applications needing to |
| do their own matching can access the available fonts from the library and |
| perform private matching. The intent is to permit applications to pick and |
| choose appropriate functionality from the library instead of forcing them to |
| choose between this library and a private configuration mechanism. The hope |
| is that this will ensure that configuration of fonts for all applications |
| can be centralized in one place. Centralizing font configuration will |
| simplify and regularize font installation and customization. |
| </para> |
| </sect2> |
| <sect2> |
| <title>FONT PROPERTIES</title> |
| <para> |
| While font patterns may contain essentially any properties, there are some |
| well known properties with associated types. Fontconfig uses some of these |
| properties for font matching and font completion. Others are provided as a |
| convenience for the applications rendering mechanism. |
| </para> |
| <table> |
| <title>Property Definitions</title> |
| <tgroup cols=3 align=left colsep=1 rowsep=1> |
| <colspec colname=Property> |
| <colspec colname=Type> |
| <colspec colname=Description> |
| <thead> |
| <row> |
| <entry>Property</entry> |
| <entry>Type</entry> |
| <entry>Description</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row><entry>family</entry><entry>String</entry><entry>Font family name</entry></row> |
| <row><entry>style</entry><entry>String</entry><entry>Font style. Overrides weight and slant</entry></row> |
| <row><entry>slant</entry><entry>Int</entry><entry>Italic, oblique or roman</entry></row> |
| <row><entry>weight</entry><entry>Int</entry><entry>Light, medium, demibold, bold or black</entry></row> |
| <row><entry>size</entry><entry>Double</entry><entry>Point size</entry></row> |
| <row><entry>aspect</entry><entry>Double</entry><entry>Stretches glyphs horizontally before hinting</entry></row> |
| <row><entry>pixelsize</entry><entry>Double</entry><entry>Pixel size</entry></row> |
| <row><entry>spacing</entry><entry>Int</entry><entry>Proportional, monospace or charcell</entry></row> |
| <row><entry>foundry</entry><entry>String</entry><entry>Font foundry name</entry></row> |
| <row><entry>antialias</entry><entry>Bool</entry><entry>Whether glyphs can be antialiased</entry></row> |
| <row><entry>hinting</entry><entry>Bool</entry><entry>Whether the rasterizer should use hinting</entry></row> |
| <row><entry>verticallayout</entry><entry>Bool</entry><entry>Use vertical layout</entry></row> |
| <row><entry>autohint</entry><entry>Bool</entry><entry>Use autohinter instead of normal hinter</entry></row> |
| <row><entry>globaladvance</entry><entry>Bool</entry><entry>Use font global advance data</entry></row> |
| <row><entry>file</entry><entry>String</entry><entry>The filename holding the font</entry></row> |
| <row><entry>index</entry><entry>Int</entry><entry>The index of the font within the file</entry></row> |
| <row><entry>ftface</entry><entry>FT_Face</entry><entry>Use the specified FreeType face object</entry></row> |
| <row><entry>rasterizer</entry><entry>String</entry><entry>Which rasterizer is in use</entry></row> |
| <row><entry>outline</entry><entry>Bool</entry><entry>Whether the glyphs are outlines</entry></row> |
| <row><entry>scalable</entry><entry>Bool</entry><entry>Whether glyphs can be scaled</entry></row> |
| <row><entry>scale</entry><entry>Double</entry><entry>Scale factor for point->pixel conversions</entry></row> |
| <row><entry>dpi</entry><entry>Double</entry><entry>Target dots per inch</entry></row> |
| <row><entry>rgba</entry><entry>Int</entry><entry>unknown, rgb, bgr, vrgb, vbgr, none - subpixel geometry</entry></row> |
| <row><entry>minspace</entry><entry>Bool</entry><entry>Eliminate leading from line spacing</entry></row> |
| <row><entry>charset</entry><entry>CharSet</entry><entry>Unicode chars encoded by the font</entry></row> |
| <row><entry>lang</entry><entry>String</entry><entry>List of RFC-3066-style languages this font supports</entry></row> |
| </tbody> |
| </tgroup> |
| </table> |
| </sect2> |
| <sect2> |
| <title>FONT MATCHING</title> |
| <para> |
| Fontconfig performs matching by measuring the distance from a provided |
| pattern to all of the available fonts in the system. The closest matching |
| font is selected. This ensures that a font will always be returned, but |
| doesn't ensure that it is anything like the requested pattern. |
| </para><para> |
| Font matching starts with an application constructed pattern. The desired |
| attributes of the resulting font are collected together in a pattern. Each |
| property of the pattern can contain one or more values; these are listed in |
| priority order; matches earlier in the list are considered "closer" than |
| matches later in the list. |
| </para><para> |
| The initial pattern is modified by applying the list of editing instructions |
| specific to patterns found in the configuration; each consists of a match |
| predicate and a set of editing operations. They are executed in the order |
| they appeared in the configuration. Each match causes the associated |
| sequence of editing operations to be applied. |
| </para><para> |
| After the pattern has been edited, a sequence of default substitutions are |
| performed to canonicalize the set of available properties; this avoids the |
| need for the lower layers to constantly provide default values for various |
| font properties during rendering. |
| </para><para> |
| The canonical font pattern is finally matched against all available fonts. |
| The distance from the pattern to the font is measured for each of several |
| properties: foundry, charset, family, lang, spacing, pixelsize, style, |
| slant, weight, antialias, rasterizer and outline. This list is in priority |
| order -- results of comparing earlier elements of this list weigh more |
| heavily than later elements. |
| </para><para> |
| There is one special case to this rule; family names are split into two |
| bindings; strong and weak. Strong family names are given greater precedence |
| in the match than lang elements while weak family names are given lower |
| precedence than lang elements. This permits the document language to drive |
| font selection when any document specified font is unavailable. |
| </para><para> |
| The pattern representing that font is augmented to include any properties |
| found in the pattern but not found in the font itself; this permits the |
| application to pass rendering instructions or any other data through the |
| matching system. Finally, the list of editing instructions specific to |
| fonts found in the configuration are applied to the pattern. This modified |
| pattern is returned to the application. |
| </para><para> |
| The return value contains sufficient information to locate and rasterize the |
| font, including the file name, pixel size and other rendering data. As |
| none of the information involved pertains to the FreeType library, |
| applications are free to use any rasterization engine or even to take |
| the identified font file and access it directly. |
| </para><para> |
| The match/edit sequences in the configuration are performed in two passes |
| because there are essentially two different operations necessary -- the |
| first is to modify how fonts are selected; aliasing families and adding |
| suitable defaults. The second is to modify how the selected fonts are |
| rasterized. Those must apply to the selected font, not the original pattern |
| as false matches will often occur. |
| </para> |
| </sect2> |
| <sect2><title>FONT NAMES</title> |
| <para> |
| Fontconfig provides a textual representation for patterns that the library |
| can both accept and generate. The representation is in three parts, first a |
| list of family names, second a list of point sizes and finally a list of |
| additional properties: |
| </para> |
| <programlisting> |
| <families>-<point sizes>:<name1>=<values1>:<name2>=<values2>... |
| </programlisting> |
| <para> |
| Values in a list are separated with commas. The name needn't include either |
| families or point sizes; they can be elided. In addition, there are |
| symbolic constants that simultaneously indicate both a name and a value. |
| Here are some examples: |
| </para> |
| <table colsep=0 rowsep=0> |
| <title>Sample Font Names</title> |
| <tgroup cols=2 align=left colsep=0 rowsep=0> |
| <thead><row> |
| <entry>Name</entry> |
| <entry>Meaning</entry> |
| </row></thead> |
| <tbody> |
| <row><entry>Times-12</entry><entry>12 point Times Roman</entry></row> |
| <row><entry>Times-12:bold</entry><entry>12 point Times Bold</entry></row> |
| <row><entry>Courier:italic</entry><entry>Courier Italic in the default size</entry></row> |
| <row><entry>Monospace:matrix=1 .1 0 1</entry><entry>The users preferred monospace font |
| with artificial obliquing</entry></row> |
| </tbody> |
| </tgroup> |
| </table> |
| </sect2> |
| </sect1> |
| <sect1><title>LANG TAGS</title> |
| <para> |
| Each font in the database contains a list of languages it supports. This is |
| computed by comparing the Unicode coverage of the font with the orthography |
| of each language. Languages are tagged using an RFC-3066 compatible naming |
| and occur in two parts -- the ISO639 language tag followed a hyphen and then |
| by the ISO 3166 country code. The hyphen and country code may be elided. |
| </para><para> |
| Fontconfig has orthographies for several languages built into the library. |
| No provision has been made for adding new ones aside from rebuilding the |
| library. It currently supports 122 of the 139 languages named in ISO 639-1, |
| 141 of the languages with two-letter codes from ISO 639-2 and another 30 |
| languages with only three-letter codes. |
| </para> |
| </sect1> |
| <sect1><title>CONFIGURATION FILE FORMAT</title> |
| <para> |
| Configuration files for fontconfig are stored in XML format; this |
| format makes external configuration tools easier to write and ensures that |
| they will generate syntactically correct configuration files. As XML |
| files are plain text, they can also be manipulated by the expert user using |
| a text editor. |
| </para><para> |
| The fontconfig document type definition resides in the external entity |
| "fonts.dtd"; this is normally stored in the default font configuration |
| directory (/etc/fonts). Each configuration file should contain the |
| following structure: |
| <programlisting> |
| <?xml version="1.0"?> |
| <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> |
| <fontconfig> |
| ... |
| </fontconfig> |
| </programlisting> |
| </para> |
| <sect2><title><fontconfig></title><para> |
| This is the top level element for a font configuration and can contain |
| <dir>, <cache>, <include>, <match> and <alias> elements in any order. |
| </para></sect2> |
| <sect2><title><dir></title><para> |
| This element contains a directory name which will be scanned for font files |
| to include in the set of available fonts. |
| </para></sect2> |
| <sect2><title><cache></title><para> |
| This element contains a file name for the per-user cache of font |
| information. If it starts with '~', it refers to a file in the users |
| home directory. This file is used to hold information about fonts that |
| isn't present in the per-directory cache files. It is automatically |
| maintained by the fontconfig library. The default for this file |
| is ``~/.fonts.cache-<version>'', where <version> is the font configuration |
| file version number (currently 1). |
| </para></sect2> |
| <sect2><title><include ignore_missing="no"></title><para> |
| This element contains the name of an additional configuration file. When |
| the XML datatype is traversed by FcConfigParse, the contents of the file |
| will also be incorporated into the configuration by passing the filename to |
| FcConfigLoadAndParse. If 'ignore_missing' is set to "yes" instead of the |
| default "no", a missing file will elicit no warning message from the library. |
| </para></sect2> |
| <sect2><title><config></title><para> |
| This element provides a place to consolodate additional configuration |
| information. <config> can contain <blank> and <rescan> elements in any |
| order. |
| </para></sect2> |
| <sect2><title><blank></title><para> |
| Fonts often include "broken" glyphs which appear in the encoding but are |
| drawn as blanks on the screen. Within the <blank> element, place each |
| Unicode characters which is supposed to be blank in an <int> element. |
| Characters outside of this set which are drawn as blank will be elided from |
| the set of characters supported by the font. |
| </para></sect2> |
| <sect2><title><rescan></title><para> |
| The <rescan> element holds an <int> element which indicates the default |
| interval between automatic checks for font configuration changes. |
| Fontconfig will validate all of the configuration files and directories and |
| automatically rebuild the internal datastructures when this interval passes. |
| </para></sect2> |
| <sect2><title><match target="pattern"></title><para> |
| This element holds first a (possibly empty) list of <test> elements and then |
| a (possibly empty) list of <edit> elements. Patterns which match all of the |
| tests are subjected to all the edits. If 'target' is set to "font" instead |
| of the default "pattern", then this element applies to the font name |
| resulting from a match rather than a font pattern to be matched. |
| </para></sect2> |
| <sect2><title><test qual="any" name="property" compare="eq"></title><para> |
| This element contains a single value which is compared with the pattern |
| property "property" (substitute any of the property names seen |
| above). 'compare' can be one of "eq", "not_eq", "less", "less_eq", "more", or |
| "more_eq". 'qual' may either be the default, "any", in which case the match |
| succeeds if any value associated with the property matches the test value, or |
| "all", in which case all of the values associated with the property must |
| match the test value. |
| </para></sect2> |
| <sect2><title><edit name="property" mode="assign" binding="weak"></title><para> |
| This element contains a list of expression elements (any of the value or |
| operator elements). The expression elements are evaluated at run-time and |
| modify the property "property". The modification depends on whether |
| "property" was matched by one of the associated <test> elements, if so, the |
| modification may affect the first matched value. Any values inserted into |
| the property are given the indicated binding. 'mode' is one of: |
| <table> |
| <title>Edit Element Modes</title> |
| <tgroup cols=3 align=left colsep=0 rowsep=0> |
| <thead> |
| <row> |
| <entry>Mode</entry> |
| <entry>Operation With Match</entry> |
| <entry>Operation Without Match</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row><entry>"assign"</entry><entry>Replace matching value</entry><entry>Replace all values</entry></row> |
| <row><entry>"assign_replace"</entry><entry>Replace all values</entry><entry>Replace all values</entry></row> |
| <row><entry>"prepend"</entry><entry>Insert before matching value</entry><entry>Insert at head of list</entry></row> |
| <row><entry>"prepend_first"</entry><entry>Insert at head of list</entry><entry>Insert at head of list</entry></row> |
| <row><entry>"append"</entry><entry>Append after matching value</entry><entry>Append at end of list</entry></row> |
| <row><entry>"append_last"</entry><entry>Append at end of list</entry><entry>Append at end of list</entry></row> |
| </tbody> |
| </tgroup> |
| </table> |
| </para></sect2> |
| <sect2><title><int>, <double>, <string>, <bool></title><para> |
| These elements hold a single value of the indicated type. <bool> elements |
| hold either true or false. |
| </para></sect2> |
| <sect2><title><matrix></title><para> |
| This element holds the four <double> elements of an affine |
| transformation. |
| </para></sect2> |
| <sect2><title><name></title><para> |
| Holds a property name. Evaluates to the first value from the property of |
| the font, not the pattern. |
| </para></sect2> |
| <sect2><title><const></title><para> |
| Holds the name of a constant; these are always integers and serve as |
| symbolic names for common font values: |
| <table> |
| <title>Symbolic Constants</title> |
| <tgroup cols=3 align=left colsep=0 rowsep=0> |
| <thead> |
| <row> |
| <entry>Constant</entry> |
| <entry>Property</entry> |
| <entry>CPP Symbol</entry> |
| </row> |
| </thead> |
| <tbody> |
| <row><entry>light</entry><entry>weight</entry></row> |
| <row><entry>medium</entry><entry>weight</entry></row> |
| <row><entry>demibold</entry><entry>weight</entry></row> |
| <row><entry>bold</entry><entry>weight</entry></row> |
| <row><entry>black</entry><entry>weight</entry></row> |
| <row><entry>roman</entry><entry>slant</entry></row> |
| <row><entry>italic</entry><entry>slant</entry></row> |
| <row><entry>oblique</entry><entry>slant</entry></row> |
| <row><entry>proportional</entry><entry>spacing</entry></row> |
| <row><entry>mono</entry><entry>spacing</entry></row> |
| <row><entry>charcell</entry><entry>spacing</entry></row> |
| <row><entry>unknown</entry><entry>rgba</entry></row> |
| <row><entry>rgb</entry><entry>rgba</entry></row> |
| <row><entry>bgr</entry><entry>rgba</entry></row> |
| <row><entry>vrgb</entry><entry>rgba</entry></row> |
| <row><entry>vbgr</entry><entry>rgba</entry></row> |
| <row><entry>none</entry><entry>rgba</entry></row> |
| </tbody> |
| </tgroup> |
| </table> |
| </para> |
| </sect2> |
| <sect2><title><or>, |
| <and>, |
| <plus>, |
| <minus>, |
| <times>, |
| <divide></title><para> |
| These elements perform the specified operation on a list of expression |
| elements. <or> and <and> are boolean, not bitwise. |
| </para> |
| </sect2> |
| <sect2><title><eq>, |
| <not_eq>, |
| <less>, |
| <less_eq>, |
| <more>, |
| <more_eq></title><para> |
| These elements compare two values, producing a boolean result. |
| </para></sect2> |
| <sect2><title><not></title><para> |
| Inverts the boolean sense of its one expression element |
| </para></sect2> |
| <sect2><title><if></title><para> |
| This element takes three expression elements; if the value of the first is |
| true, it produces the value of the second, otherwise it produces the value |
| of the third. |
| </para></sect2> |
| <sect2><title><alias></title><para> |
| Alias elements provide a shorthand notation for the set of common match |
| operations needed to substitute one font family for another. They contain a |
| <family> element followed by optional <prefer>, <accept> and <default> |
| elements. Fonts matching the <family> element are edited to prepend the |
| list of <prefer>ed families before the matching <family>, append the |
| <accept>able familys after the matching <family> and append the <default> |
| families to the end of the family list. |
| </para></sect2> |
| <sect2><title><family></title><para> |
| Holds a single font family name |
| </para></sect2> |
| <sect2><title><prefer>, <accept>, <default></title><para> |
| These hold a list of <family> elements to be used by the <alias> element. |
| </article> |
| </para></sect2> |
| </sect1> |
| <sect1><title>EXAMPLE CONFIGURATION FILE</title> |
| <sect2><title>System configuration file</title> |
| <para> |
| This is an example of a system-wide configuration file |
| </para> |
| <programlisting> |
| <?xml version="1.0"?> |
| <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> |
| <!-- /etc/fonts/fonts.conf file to configure system font access --> |
| <fontconfig> |
| <!-- |
| Find fonts in these directories |
| --> |
| <dir>/usr/X11R6/lib/X11/fonts/truetype</dir> |
| <dir>/usr/X11R6/lib/X11/fonts/Type1</dir> |
| |
| <!-- |
| Accept deprecated 'mono' alias, replacing it with 'monospace' |
| --> |
| <match target="pattern"> |
| <test qual="any" name="family"><string>mono</string></test> |
| <edit name="family" mode="assign"><string>monospace</string></edit> |
| </match> |
| |
| <!-- |
| Names not including any well known alias are given 'sans' |
| --> |
| <match target="pattern"> |
| <test qual="all" name="family" mode="not_eq">sans</test> |
| <test qual="all" name="family" mode="not_eq">serif</test> |
| <test qual="all" name="family" mode="not_eq">monospace</test> |
| <edit name="family" mode="append_last"><string>sans</string></edit> |
| </match> |
| |
| <!-- |
| Load per-user customization file, but don't complain |
| if it doesn't exist |
| --> |
| <include ignore_missing="yes">~/.fonts.conf</include> |
| |
| <!-- |
| Alias well known font names to available TrueType fonts. |
| These substitute TrueType faces for similar Type1 |
| faces to improve screen appearance. |
| --> |
| <alias> |
| <family>Times</family> |
| <prefer><family>Times New Roman</family></prefer> |
| <default><family>serif</family></default> |
| </alias> |
| <alias> |
| <family>Helvetica</family> |
| <prefer><family>Verdana</family></prefer> |
| <default><family>sans</family></default> |
| </alias> |
| <alias> |
| <family>Courier</family> |
| <prefer><family>Courier New</family></prefer> |
| <default><family>monospace</family></default> |
| </alias> |
| |
| <!-- |
| Provide required aliases for standard names |
| Do these after the users configuration file so that |
| any aliases there are used preferentially |
| --> |
| <alias> |
| <family>serif</family> |
| <prefer><family>Times New Roman</family></prefer> |
| </alias> |
| <alias> |
| <family>sans</family> |
| <prefer><family>Verdana</family></prefer> |
| </alias> |
| <alias> |
| <family>monospace</family> |
| <prefer><family>Andale Mono</family></prefer> |
| </alias> |
| </fontconfig> |
| </programlisting> |
| </sect2> |
| <sect2><title>User configuration file</title> |
| <para> |
| This is an example of a per-user configuration file that lives in |
| ~/.fonts.conf |
| </para> |
| <programlisting> |
| <?xml version="1.0"?> |
| <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> |
| <!-- ~/.fonts.conf for per-user font configuration --> |
| <fontconfig> |
| |
| <!-- |
| Private font directory |
| --> |
| <dir>~/misc/fonts</dir> |
| |
| <!-- |
| use rgb sub-pixel ordering to improve glyph appearance on |
| LCD screens. Changes affecting rendering, but not matching |
| should always use target="font". |
| --> |
| <match target="font"> |
| <edit name="rgba" mode="assign"><const>rgb</const></edit> |
| </match> |
| </fontconfig> |
| </programlisting> |
| </sect2> |
| </sect1> |
| <sect1><title>FILES</title> |
| <para> |
| <emphasis>fonts.conf</emphasis> |
| contains configuration information for the fontconfig library |
| consisting of directories to look at for font information as well as |
| instructions on editing program specified font patterns before attempting to |
| match the available fonts. It is in xml format. |
| </para> |
| <para> |
| <emphasis>fonts.dtd</emphasis> |
| is a DTD that describes the format of the configuration files. |
| </para> |
| <para> |
| <emphasis>~/.fonts.conf</emphasis> |
| is the conventional location for per-user font configuration, although the |
| actual location is specified in the global fonts.conf file. |
| </para> |
| <para> |
| <emphasis> ~/.fonts.cache-*</emphasis> |
| is the conventional repository of font information that isn't found in the |
| per-directory caches. This file is automatically maintained by fontconfig. |
| </para> |
| </sect1> |
| </article> |