biblatex-biber-2.4000755000765000024 012667073765 14343 5ustar00philkimestaff000000000000biblatex-biber-2.4/Build.PL000444000765000024 565212667073765 16004 0ustar00philkimestaff000000000000use strict; use warnings; use utf8; require Module::Build; my $class = Module::Build->subclass ( class => 'My::Builder', code => q{ sub ACTION_test { my $self = shift; $ENV{'LANG'} = 'C'; # set LANG to something known for tests $self->SUPER::ACTION_test; } sub ACTION_docs { my $self = shift; $self->depends_on('code'); $self->depends_on('manpages'); # skip html on perls where it's enabled } } ); my $builder = $class->new( dist_name => 'biblatex-biber', license => 'perl', dist_author => 'Philip Kime ', dist_abstract => 'Biber is a much-augmented bibtex replacement for biblatex users', dist_version_from => 'lib/Biber/Config.pm', test_requires => { 'Test::More' => 0, 'Test::Differences' => 0, 'File::Which' => 0 }, add_to_cleanup => [ 'biber-*' ], configure_requires => { 'Module::Build' => 0.38 }, build_requires => { 'Config::AutoConf' => '0.15', 'ExtUtils::LibBuilder' => '0.02' }, requires => { 'autovivification' => 0, 'Class::Accessor' => 0, 'Data::Dump' => 0, 'Data::Compare' => 0, 'Data::Uniqid' => 0, 'Date::Simple' => 0, 'File::Slurp' => 0, 'IPC::Cmd' => 0, 'IPC::Run3' => 0, 'List::AllUtils' => 0, 'List::MoreUtils' => 0, 'List::MoreUtils::XS' => 0, 'Mozilla::CA' => '20141217', 'Regexp::Common' => 0, 'Log::Log4perl' => 0, 'Unicode::Collate' => '1.14', 'Unicode::Normalize' => '1.25', 'Unicode::GCString' => 0, 'Encode::EUCJPASCII' => 0, 'Encode::JIS2K' => 0, 'Encode::HanExtra' => 0, 'XML::LibXML' => 1.70, 'XML::LibXML::Simple' => 0, 'XML::LibXSLT' => 0, 'XML::Writer' => 0, 'Text::Roman' => 0, 'URI' => 0, 'Text::BibTeX' => '0.71', 'LWP::Simple' => 0, 'LWP::Protocol::https' => 0, 'Business::ISBN' => 0, 'Business::ISSN' => 0, 'Business::ISMN' => 0, 'perl' => '5.16.0' }, script_files => [ glob( "bin/*" ) ], data_files => {'data/schemata/config.rnc' => 'lib/Biber/config.rnc', 'data/schemata/config.rng' => 'lib/Biber/config.rng', 'data/schemata/bcf.rnc' => 'lib/Biber/bcf.rnc', 'data/schemata/bcf.rng' => 'lib/Biber/bcf.rng', 'data/biber-tool.conf' => 'lib/Biber/biber-tool.conf', 'lib/Biber/LaTeX/recode_data.xml' => 'lib/Biber/LaTeX/recode_data.xml', 'data/bcf.xsl' => 'lib/Biber/bcf.xsl', 'data/latinkeys.txt' => 'lib/Unicode/Collate/latinkeys.txt' } ); $builder->add_build_element('data'); $builder->create_build_script(); biblatex-biber-2.4/Changes000444000765000024 5100412667073765 16013 0ustar00philkimestaff000000000000Revision history for Biber 2.4 (2016-03-01) * Misc bug fixes * There is now a 64-bit windows build built on windows 10 * Biblatexml datasources now support sourcemapping and have a schema automatically generated from the datamodel. See new biber options 'validate-bltxml' and 'no-bltxml-schema' in --help output. * New functionality in sourcemaps for creating new entries and looping over specified fields. * Sorting key used to sort names is now customisable. See \DeclareSortingNamekeyScheme in biblatex manual. * Support for Zotero RDF/XML and Endnote removed. These were experimental and messy. 2.3 (2015-12-28) * Misc bug fixes 2.2 (2015-10-21) * Tool mode now preserves comments at the end of the file * New ISBN formatting options for biber (--isbn10, --isnb13, --isbn-normalise) * Implemented way of ignoring certain regexps when counting fixed-width string in labels (see biblatex \DeclareNolabelwidthcount macro) * Updated binary builds to perl 5.22 * Cygwin binary build is now handled by Texlive builders * Misc bug fixes 2.1 (2015-05-06) * Misc bug fixes 2.0 (2015-04-20) * Misc bug fixes * New negated "per type" sourcemap verb for negating the application of maps to specific entry types * New "entry clone" sourcemap verb for cloning entries during sourcemapping. See PDF documentation for biber. * Added range length calculation support. Biber now calculates the length of ranges for biblatex and can handle roman numerals, including just about any UTF-8 composed, non-composed or compat versions * Complete re-write of the biblatex use* name functionality now automatically supports all name fields defined in the data model. See biblatex manual * Moved labelname and labeltitle resolution from biber to biblatex for more flexibility and future extensions * Moved to perl 5.20 for all internals and builds 1.9 (2014-05-25) * Misc bug fixes * Option names accept dashes as well as underscores for general TeX option compatibility. * New "--input-directory" option * Tool mode now also supports data validation * Perl 5.18 is now used to build all biber binaries * Locale-sensitive sorting now more granular (see biblatex "sortlocale" documentation) * Source mapping feature now interpolates from previous matches * Now supports generalised separated values lists using new "--xsvsep" option. * Macro <-> UTF-8 conversion now more robust * New Text::BibTeX library now supports generating initials from general UTF-8 strings (for, e.g. Russian names) 1.8 (2013-10-21) * Perl 5.18 compatibility (hash order randomisation) * Removed Data::Diver module due to linux licensing restrictions * Misc Bug Fixes 1.7 (2013-07-07) * Added clrmacros option * Added map_nomatch * Added --tool_macro_fields option * Exposed sorting option to user-level config file (so sorting in tool mode is possible) 1.6 (2013-04-30) * Bugfixes * Now uses perl 5.16. Non-binary (unpacked) use requires perl 5.16+ * Improved tool mode with some formatting options * Made Unicode NFD/NFC boundaries more robust * labelyear is now labeldate to match biblatex 2.6 * Support for new CLONESOURCEKEY field (see biblatex 2.6 docs) * New padding character option in labelalphatemplate (see biblatex 2.6 docs) 1.5 (2013-01-10) * Added new source mapping option "map_entry_null" * Renamed some options (old ones remain as aliases): bibencoding -> input_encoding bblencoding -> output_encoding bblsafechars -> output_safechars bblsafecharsset -> output_safecharsset outfile -> output_file outformat -> output_format * New "tool" mode with "--tool" option which takes a data source as argument and just performs reencoding and source mappings etc. as per options and config file. * Support for customisable BibTeX data source list and name separators * Better debug output for source mapping * Better defined source mapping hierarchy with bugfixes 1.4 (2012-11-28) * Support for biblatex 2.4 style sourcemaps (See \DeclareStyleSourcemap in biblatex docs) * entrykey is now a possible read-only pseudo field in sourcemaps * Reencode data interface completely re-written. New user option --recodedata allows users to specify a new data file for defining reencoding sets. * Internal changes to allow multiple script/lang variants of fields in biblatex in the future. * Citation key aliases now supported more comprehensively, in crossrefs etc. * Support for new RELATEDOPTIONS field (see biblatex docs) * Misc bug fixes 1.3 (01-11-2012) * New "append" mode for sourcemap to allow combining of fields * map_final now possible for map_set_field steps which causes map to stop completely if map_overwrite is false and the field to set already exists * Allow extrayear generation when there is no labelyear 1.2 (20-08-2012) * Misc bug fixes 1.1 (01-08-2012) * Misc bug fixes * Fixed later CentOS libz issue by including latest libz for linux builds * Fixed DOT output (SF bug 3544894) 1.0 (01-07-2012) * Internal data model processing changes * New labeltitleyear and extratitleyear disambiguation tracker * New labeltitle and extratitle disambiguation tracker * Sorting per list enabled for biblatex 2.0 * New noinit option for ignoring parts of names when generating initials * Some optimisations for large data sources * Fixed build issues which broke PAR::Packer binary under latest Debian (Wheezy) 0.9.9 (30-03-2012) * Added sortfirstinits option * HTTPS support for remote data sources * Biber now ignores names when it can't determine minimal information like a lastname. Before, it would throw lots of errors and die. * Strips UTF-8 BOMs before passing to Text::BibTeX otherwise it complains * Merged --graph and --bltxml options into --outformat option * Updated some internal Unicode 6.0 things * Minor bug fixes 0.9.8 (20-12-2012) * Changed config file sourcemap syntax and docs * Support for citekey aliases * New DOT output format 0.9.7 (27-11-2011) * per-datasource mapping restrictions * Completely new config file format to allow for extensions * Fixed --help issue with PAR::Packer * Fixed .bcf XSL inheritance attribute value issue * Moved XDATA output skip into structure where it should have been originally 0.9.6 (13-11-2011) * Fixed binary issue with Readonly::XS not being detected * Fixed bug tracker ticket #3436870 * Match/replace functionality for data source field filtering * New AUCTeX patches for better biblatex/biber support * Now requires perl 5.14 for full Unicode 6.0 support * New XDATA entrytype and field to allow more complex macro-style data inheritance * crossref cascading is in guaranteed resolve order now * Warnings/error summary is now a more consistent format with all other biber messages. * Matching of .bcf keys to datasource keys is now case-sensitive * Fixed biblatex bug tracker ticket #3399744 * Fixed bug tracker ticket #3402114 * max/minnames -> max/mincitenames * max/min* now all per-type and per-entry * uniquelist/uniquename now per-entry * Re-factored recode module with XML data and XSL->HTML transform doc 0.9.5 (18-08-2011) * Fixed auto-bblsafechars bug * refactored explicit "and others" in bibtex data sources * Fixed issue with sorting=none and \nocite{*} 0.9.4 (30-07-2011) * Added support for "SORTSHORTHAND" field * New "map" option to allow user field/entry type mapping (aliasing) in addition to .dcf settings * Made the relevant places depend on max/min{alpha,bib}names instead of just max/minnames * Bug fixes to bblsafechars * Implemented user-customisable labelalpha (not yet in biblatex) * Implemented per-name hashes 0.9.3 (05-06-2011) * New mininit and minfull uniquename options * New minyear uniquelist option * Major revamp of uniqueness code * Moved to new external process calling module because IPC::Run doesn't work on Windows in packed binaries (kpsewhich was returning nothing). 0.9.2 (09-05-2011) * Some internal changes for perl 5.14 * Bug fixes for uniquelist processing 0.9.1 (29-04-2011) * Made temp files all use a global temp dir. * Moved temp .utf8 conversions to temp dir so biber works using .bib files which are in non-writable locations. * Added back an info log message about finding data sources (Lyx compat) 0.9 (29-03-2011) * No longer auto-escapes any TeX markup in bibtex data sources. This is fraught with danger and is a mess. Best not to do it at all. * Supports biblatex \bibnamedelimi macro * Implementation of uniquename and uniquelist options for biblatex 1.4+ 0.8.4 (19-03-2011) * Bug fixes (wrong escaping of "[", "_" and "]" in .bbl) 0.8.3 14-03-2011 * Biber now in TexLive * Added several new binary builds * All name part and element formatting is now abstracted into macros so that it can be controlled via biblatex. * Much more documentation on binary builds for packagers * Bug fixes 0.8.2 (14-02-2011) * Bug fixes 0.8.1 (12-02-2011) * Small bug with default bibtex month macro support * Made remote file support a little more robust (URI return codes) 0.8 (11-02-2011) * Forces biblatex format for month field * Added support for remote data sources * Added experimental support for RIS data sources * Took out -a and -d flags. These are no longer very useful as the increasingly sophisticated biblatex options cannot be set on the command line anyway and so these flags are less and less relevant * New inheritance model in sync with biblatex defaults * Bug fixes 0.7.4 (05-02-2011) * Fix for mincrossrefs leaking across sections (biblatex SF bug #3173032) 0.7.3 (03-02-2011) * Performance tuning for sorting * Text::BibTeX 0.51 for increased macro stack space * Support for old BibTeX month macros by default * Re-write of datasource processing to allow for modular plugins * Generalised nosort option. * Merged LaTeX::Decode into Biber::LaTeX::Recode and added encoding to deal with inputenc's limitations for PDFLaTeX users * new options for forcing/tuning UTF-8 -> LaTeX macro conversion * Bug fixes 0.7.2 (08-01-2011) * Improved latexmk compatibility more 0.7.1 (07-01-2011) * Improved latexmk compatibility * Added "x-ascii" encoding alias for "ascii" to deal with inputenx ascii. * Bug fixes 0.7 (05-01-2011) * Completely re-written sorting routine using Schwartzian transform for real multi-field support and per-field sorting settings. * Bug fixes 0.6.9 (dev beta) * Bug fixes 0.6.8 (dev beta) * Generalised sorting behaviour in several respects * Bug fixes 0.6.7 (dev beta) * Bug fixes 0.6.6 (dev beta) * More generalised sorting options * Bug fixes 0.6.5 (dev beta) * Bug fixes 0.6.4 (dev beta) * Bug fixes 0.6.3 (dev beta) * Outputs labelname name list to the .bbl * Support for dynamic sets and simpler static set interface * Misc bug fixes 0.6.2 (dev beta) * Internal cleanup of structure code * Misc bug fixes 0.6.1 (dev beta) * More comprehensive structural checks on allowed entrytypes/fields and field combinations/formats * Added option validate_structure to turn on structural checks * Renamed option validate -> validate_control * Renamed option output-directory -> output_directory * Added labelname and labelyear as possible sort specifications * Misc bug fixes 0.6 (20-11-2010) * First non-beta release * More abstracted and extensible crossref inheritance model * U::C dependency to 0.67 * sortcase and sortupper options now take same argument forms as in biblatex * Misc bug fixes 0.5.7 (09-10-2010) * Misc bug fixes 0.5.6 (04-10-2010) * Latex character macro decoding is now better defined in the whole (re)encoding workflow. * "inputenc" option is now "bblencoding" * "locale" option is now "sortlocale" * New option "sortupper" * Unicode::Collate sorting is now default as version 0.61 of this has XS module and CLDR tailoring. * Added binary dist build scripts * Removed bundled Module::Build as there are some conflicts with later versions. This is less of a problem anyway because the binary build makes it less necessary to make builds easy on perl<5.10 * Misc bug fixes 0.5.5 (29-08-2010) * Biber::BibTeX moved to Biber::Input::BibTeX. If upgrading, please remove your installed /Biber/BibTeX.pm, just to be tidy * New aliases for EPRINT classes and types implemented (see BibLaTeX docs). * Biber now resolves XREFs as well as CROSSREFs so one less LaTeX pass is needed * Allows UTF-8 citekeys. Requires Text::BibTeX >= 0.46 and a fully UTF-8 aware TeX macro package (e.g. XeTeX or LuaLaTeX). Normal LaTeX with \inputenc will not work because the UTF-8 it uses is incomplete, macro based and not native. * RecDescent parser is no longer supported or included. If upgrading, please remove your installed /Biber/BibTeX directory, just to be tidy * Now requires LaTeX::Decode >= 0.03 * Stricter version dependency for Text::BibTeX. Older than 0.42 is rather useless for complex names. * Re-factored and enhanced auto-re-encoding of .bib/.bbl. With biblatex 0.9c, Biber handles all reencoding. * Misc bug fixes 0.5.4 (04-08-2010) * Case-sensitive sorting option * Multi-section support. Only one biber pass needed to process all bib sections using extended biblatex 0.9b .bbl format. * .aux file is no longer used by biber - all information is passed in .bcf file. * Misc bug fixes * LaTeX::Decode is now a separate CPAN module and is no longer included 0.5.3 (19-03-2010) * Changed semantics of --outfile and --output-directory. --outfile is now relative to --output-directory. If --outfile is absolute, it is stripped to the filename and the path discarded. Absolute .aux paths are stripped to filename for appending to --output-directory. * Updated PRD to use new encoding option names. Now works with -e. * sortlos was not settable to use bib sort order * With Text::BibTeX >= 0.42, will do all name/initials generation with btparse library. * Abstracted BBL output into Biber::Output class for better re-use and potential for output formats other than .bbl. * Synced uniquename .bcf values with change in biblatex 0.9a 0.5.2 (04-03-2010) * Locale fixes * Uniquename fixed to match BibLaTeX option values * Improved error message for malformed names * Fixed config file problems under windows and also added option to ignore config file * Bug with conflicting case between citations and bib entries * Moved pure perl parsename to PRD.pm * Re-write of name parsing to use Text::BibTeX::Name by default * Fields which can be null are explicitly flagged * Add THANKS file * Die early when biber is called without argument * Fixed Mac config path error * .bib parse continues after certain errors * regularised collate options processing * field nameaddon was missing from Biber::Constants * Improved warning message for missing backend=biber * SF bug 2952347 fix (empty date range end) * uniquename counter was being provided incorrectly 0.5.1 (15-02-2010) * Remove support for legacy control files (\jobname-blx.bib): Biber now only reads .bcf files written by biblatex with the option "backend=biber". * Improved handling of "uniquename" and "namehash". * Don't apply latexescape in bbl output, as it breaks math formatting. 0.5 (13-02-2010) * Supports all changes introduced by biblatex 0.9 * Moved all parts relating to the experimental BibLaTeXML format to the "biblatexml" branch on the git repo * Communication between biblatex and Biber can be done through a XML-based config file (extension .bcf): this is enabled with the experimental biblatex option "backend=biber" * Biber can now be customized with a configuration file * Considerable refactoring and cleanup of the code * Further enhancements to the test suite * Improved logging mechanism * More robust parsing of personal names * Ignore certain prefixes and diacritics in sort strings, for instance ʿAlī is sorted under A, and al-Hasan under H. This can be customized in the configuration file (biber.conf). * New command-line option --output-directory (like TeX) * Many, many bugfixes 0.4.3 (23-07-2009) * With biblatex option "backend=biber" and biber option --v2 the new experimental control file \jobname.bcf is used, which brings in many new features, such as per-entrytype settings. * More sophisticated/customizable sorting mechanism * More extensive test suite * Improved BibLaTeXML schema * improved handling of BibLaTeXML (enable nested children, formatting elements, nosort elements) * Do not apply latexescape() by default on xml strings * Skip title handling in BibLaTeXML when not existing * Ignore maxline, add option wraplines * Built-in sort is now default (option --fastsort) * Sorting with Unicode::Collate is possible with option --collate * Make tests succeed w/o Parse::RD and Regexp::Common * Don't output date and urldate in the bbl * Add missing fields "date" "urldate" "organization" "annotator" "foreword" and "eventtitle" * Use Data::Dump instead of Data::Dumper for debugging * Fields "library" and "remarks" are now skipped * Bugfix for aliases (e.g. address, school) * Bugfix: process urldate to get urlyear,urlmonth,urlday * Remove illegal value shorttranslator from labelname option * Changed biberdebug option to debug * Changed option inputencoding to bibencoding 0.4.2 (25-04-2009) * New option --inputencoding to handle 8-bit encoded bib files * $BIBINPUT environment is now searched * Improved parsing of personal names * @comments are now silently ignored * Fixed handling of @preamble; multiple preambles are allowed * Warnings and errors behave more like BibTeX * Alias fields are automatically converted (e.g. address -> location) * Take care of "phdthesis" and "mathesis" types * Cite keys of bib files are now case-insensitive * Default Unicode collation now uses the table "latinkeys.txt" (this is much faster than "allkeys.txt" which contains rules for all Unicode glyphs) * Unicode::Collate parameters can be passed as a command-line option * Faster sorting (with option -f) is also possible for specific locales given with option --locale (this is OS-dependent however) * PRD grammar is now precompiled * bbl output is now wrapped acc to maxline option * Empty fields are no longer printed in the bbl * Sorting is much improved. * Use sortstring separators 0 1 2 like biblatex.bst * Handle truncation of name lists acc to minnames/maxnames * bib2biblatexml has been improved * Windows version of Text::BibTeX provided as ppm. * Many more bugfixes 0.4.1 (31-03-2009) * Text::BibTeX now optional dependency 0.4 (27-03-2009) * Initial beta release biblatex-biber-2.4/MANIFEST000444000765000024 667612667073765 15650 0ustar00philkimestaff000000000000bin/biber Build.PL Changes data/bcf.xsl data/biber-tool.conf data/latinkeys.txt data/schemata/bcf.rnc data/schemata/bcf.rng data/schemata/config.rnc data/schemata/config.rng data/schemata/texmap.rnc data/texmap.xsl doc/biber.pdf doc/biber.tex lib/Biber/Config.pm lib/Biber/Constants.pm lib/Biber/DataModel.pm lib/Biber/Entries.pm lib/Biber/Entry/Name.pm lib/Biber/Entry/Names.pm lib/Biber/Entry.pm lib/Biber/Input/file/biblatexml.pm lib/Biber/Input/file/bibtex.pm lib/Biber/Input/file/ris.pm lib/Biber/Internals.pm lib/Biber/LaTeX/recode_data.xml lib/Biber/LaTeX/Recode.pm lib/Biber/Output/base.pm lib/Biber/Output/biblatexml.pm lib/Biber/Output/bibtex.pm lib/Biber/Output/bbl.pm lib/Biber/Output/dot.pm lib/Biber/Output/test.pm lib/Biber.pm lib/Biber/Section.pm lib/Biber/Sections.pm lib/Biber/SortList.pm lib/Biber/SortLists.pm lib/Biber/UCollate.pm lib/Biber/Utils.pm MANIFEST META.json META.yml README t/basic-misc.t t/bcfvalidation.t t/biblatexml.t t/bibtex-aliases.t t/bibtex-output.t t/configfile.t t/crossrefs.t t/dm-constraints.t t/dm-dateformats.t t/encoding.t t/extratitle.t t/extratitleyear.t t/extrayear.t t/full.t THANKS t/labelalpha.t t/labelname.t t/names.t TODO.org t/options.t t/related-entries.t t/remote-files.t t/ris.t t/sections-complex.t t/sections.t t/set-dynamic.t t/set-legacy.t t/set-static.t t/skips.t t/sort-case.t t/sort-complex.t t/sorting.t t/sortlists.t t/sort-order.t t/sort-uc.t t/tool.t t/tool-bltxml.t t/tool-bltxml-inout.t t/tdata/basic-misc.bcf t/tdata/biber-test.conf t/tdata/tool-test.conf t/tdata/biblatexml.bcf t/tdata/biblatexml.bltxml t/tdata/bibtex-aliases.bcf t/tdata/bibtex-aliases.bib t/tdata/bibtex-output.bcf t/tdata/crossrefs.bcf t/tdata/crossrefs.bib t/tdata/dm-constraints.bcf t/tdata/dm-constraints.bib t/tdata/dm-dateformats.bcf t/tdata/dm-dateformats.bib t/tdata/encoding1.bcf t/tdata/encoding1.bib t/tdata/encoding2.bcf t/tdata/encoding2.bib t/tdata/encoding3.bcf t/tdata/encoding3.bib t/tdata/encoding4.bcf t/tdata/encoding4.bib t/tdata/encoding5.bcf t/tdata/encoding5.bib t/tdata/encoding6.bcf t/tdata/encoding6.bib t/tdata/examples.bib t/tdata/extratitle.bcf t/tdata/extratitle.bib t/tdata/extratitleyear.bcf t/tdata/extratitleyear.bib t/tdata/extrayear.bcf t/tdata/extrayear.bib t/tdata/extrayear.bib t/tdata/full1.bbl t/tdata/full.bcf t/tdata/full.bib t/tdata/general.bcf t/tdata/labelalpha.bcf t/tdata/labelalpha.bib t/tdata/labelalpha.bib t/tdata/names.bcf t/tdata/names.bib t/tdata/names.bib t/tdata/options.bcf t/tdata/options.bib t/tdata/options.bib t/tdata/related.bcf t/tdata/related.bib t/tdata/remote-files.bcf t/tdata/ris1.ris t/tdata/ris.bcf t/tdata/sections1.bib t/tdata/sections2.bib t/tdata/sections3.bib t/tdata/sections4.bib t/tdata/sections.bcf t/tdata/sections-complex.bcf t/tdata/set-dynamic.bcf t/tdata/set-legacy.bcf t/tdata/sets.bib t/tdata/set-static.bcf t/tdata/skips.bcf t/tdata/skips.bib t/tdata/skips.bib t/tdata/sort.bib t/tdata/sort-case.bcf t/tdata/sort-case.bib t/tdata/sort-complex.bcf t/tdata/sortlists.bcf t/tdata/sortlists.bib t/tdata/sortlists.bltxml t/tdata/sort-order.bcf t/tdata/sort-order.bib t/tdata/sort-order.bib t/tdata/sort-uc.bcf t/tdata/sort-uc.bib t/tdata/tool.bib t/tdata/uniqueness1.bcf t/tdata/uniqueness1.bib t/tdata/uniqueness2.bcf t/tdata/uniqueness2.bib t/tdata/uniqueness3.bcf t/tdata/uniqueness3.bib t/tdata/uniqueness4.bcf t/tdata/uniqueness4.bib t/tdata/uniqueness5.bcf t/tdata/uniqueness5.bib t/tdata/xdata.bcf t/tdata/xdata.bib t/tdata/xdata.bltxml t/uniqueness.t t/utils.t t/xdata.t visual.pl biblatex-biber-2.4/META.json000444000765000024 1046312667073765 16145 0ustar00philkimestaff000000000000{ "abstract" : "Biber is a much-augmented bibtex replacement for biblatex users", "author" : [ "Philip Kime " ], "dynamic_config" : 1, "generated_by" : "Module::Build version 0.4214", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "biblatex-biber", "prereqs" : { "build" : { "requires" : { "Config::AutoConf" : "0.15", "ExtUtils::LibBuilder" : "0.02" } }, "configure" : { "requires" : { "Module::Build" : "0.38" } }, "runtime" : { "requires" : { "Business::ISBN" : "0", "Business::ISMN" : "0", "Business::ISSN" : "0", "Class::Accessor" : "0", "Data::Compare" : "0", "Data::Dump" : "0", "Data::Uniqid" : "0", "Date::Simple" : "0", "Encode::EUCJPASCII" : "0", "Encode::HanExtra" : "0", "Encode::JIS2K" : "0", "File::Slurp" : "0", "IPC::Cmd" : "0", "IPC::Run3" : "0", "LWP::Protocol::https" : "0", "LWP::Simple" : "0", "List::AllUtils" : "0", "List::MoreUtils" : "0", "List::MoreUtils::XS" : "0", "Log::Log4perl" : "0", "Mozilla::CA" : "20141217", "Regexp::Common" : "0", "Text::BibTeX" : "0.71", "Text::Roman" : "0", "URI" : "0", "Unicode::Collate" : "1.14", "Unicode::GCString" : "0", "Unicode::Normalize" : "1.25", "XML::LibXML" : "1.7", "XML::LibXML::Simple" : "0", "XML::LibXSLT" : "0", "XML::Writer" : "0", "autovivification" : "0", "perl" : "v5.16.0" } }, "test" : { "requires" : { "File::Which" : "0", "Test::Differences" : "0", "Test::More" : "0" } } }, "provides" : { "Biber" : { "file" : "lib/Biber.pm" }, "Biber::Config" : { "file" : "lib/Biber/Config.pm", "version" : "2.4" }, "Biber::Constants" : { "file" : "lib/Biber/Constants.pm" }, "Biber::DataModel" : { "file" : "lib/Biber/DataModel.pm" }, "Biber::Entries" : { "file" : "lib/Biber/Entries.pm" }, "Biber::Entry" : { "file" : "lib/Biber/Entry.pm" }, "Biber::Entry::Name" : { "file" : "lib/Biber/Entry/Name.pm" }, "Biber::Entry::Names" : { "file" : "lib/Biber/Entry/Names.pm" }, "Biber::Input::file::biblatexml" : { "file" : "lib/Biber/Input/file/biblatexml.pm" }, "Biber::Input::file::bibtex" : { "file" : "lib/Biber/Input/file/bibtex.pm" }, "Biber::Input::file::ris" : { "file" : "lib/Biber/Input/file/ris.pm" }, "Biber::Internals" : { "file" : "lib/Biber/Internals.pm" }, "Biber::LaTeX::Recode" : { "file" : "lib/Biber/LaTeX/Recode.pm" }, "Biber::Output::base" : { "file" : "lib/Biber/Output/base.pm" }, "Biber::Output::bbl" : { "file" : "lib/Biber/Output/bbl.pm" }, "Biber::Output::biblatexml" : { "file" : "lib/Biber/Output/biblatexml.pm" }, "Biber::Output::bibtex" : { "file" : "lib/Biber/Output/bibtex.pm" }, "Biber::Output::dot" : { "file" : "lib/Biber/Output/dot.pm" }, "Biber::Output::test" : { "file" : "lib/Biber/Output/test.pm" }, "Biber::Section" : { "file" : "lib/Biber/Section.pm" }, "Biber::Sections" : { "file" : "lib/Biber/Sections.pm" }, "Biber::SortList" : { "file" : "lib/Biber/SortList.pm" }, "Biber::SortLists" : { "file" : "lib/Biber/SortLists.pm" }, "Biber::UCollate" : { "file" : "lib/Biber/UCollate.pm" }, "Biber::Utils" : { "file" : "lib/Biber/Utils.pm" } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "2.4" } biblatex-biber-2.4/META.yml000444000765000024 531312667073765 15753 0ustar00philkimestaff000000000000--- abstract: 'Biber is a much-augmented bibtex replacement for biblatex users' author: - 'Philip Kime ' build_requires: Config::AutoConf: '0.15' ExtUtils::LibBuilder: '0.02' File::Which: '0' Test::Differences: '0' Test::More: '0' configure_requires: Module::Build: '0.38' dynamic_config: 1 generated_by: 'Module::Build version 0.4214, CPAN::Meta::Converter version 2.150001' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: biblatex-biber provides: Biber: file: lib/Biber.pm Biber::Config: file: lib/Biber/Config.pm version: '2.4' Biber::Constants: file: lib/Biber/Constants.pm Biber::DataModel: file: lib/Biber/DataModel.pm Biber::Entries: file: lib/Biber/Entries.pm Biber::Entry: file: lib/Biber/Entry.pm Biber::Entry::Name: file: lib/Biber/Entry/Name.pm Biber::Entry::Names: file: lib/Biber/Entry/Names.pm Biber::Input::file::biblatexml: file: lib/Biber/Input/file/biblatexml.pm Biber::Input::file::bibtex: file: lib/Biber/Input/file/bibtex.pm Biber::Input::file::ris: file: lib/Biber/Input/file/ris.pm Biber::Internals: file: lib/Biber/Internals.pm Biber::LaTeX::Recode: file: lib/Biber/LaTeX/Recode.pm Biber::Output::base: file: lib/Biber/Output/base.pm Biber::Output::bbl: file: lib/Biber/Output/bbl.pm Biber::Output::biblatexml: file: lib/Biber/Output/biblatexml.pm Biber::Output::bibtex: file: lib/Biber/Output/bibtex.pm Biber::Output::dot: file: lib/Biber/Output/dot.pm Biber::Output::test: file: lib/Biber/Output/test.pm Biber::Section: file: lib/Biber/Section.pm Biber::Sections: file: lib/Biber/Sections.pm Biber::SortList: file: lib/Biber/SortList.pm Biber::SortLists: file: lib/Biber/SortLists.pm Biber::UCollate: file: lib/Biber/UCollate.pm Biber::Utils: file: lib/Biber/Utils.pm requires: Business::ISBN: '0' Business::ISMN: '0' Business::ISSN: '0' Class::Accessor: '0' Data::Compare: '0' Data::Dump: '0' Data::Uniqid: '0' Date::Simple: '0' Encode::EUCJPASCII: '0' Encode::HanExtra: '0' Encode::JIS2K: '0' File::Slurp: '0' IPC::Cmd: '0' IPC::Run3: '0' LWP::Protocol::https: '0' LWP::Simple: '0' List::AllUtils: '0' List::MoreUtils: '0' List::MoreUtils::XS: '0' Log::Log4perl: '0' Mozilla::CA: '20141217' Regexp::Common: '0' Text::BibTeX: '0.71' Text::Roman: '0' URI: '0' Unicode::Collate: '1.14' Unicode::GCString: '0' Unicode::Normalize: '1.25' XML::LibXML: '1.7' XML::LibXML::Simple: '0' XML::LibXSLT: '0' XML::Writer: '0' autovivification: '0' perl: v5.16.0 resources: license: http://dev.perl.org/licenses/ version: '2.4' biblatex-biber-2.4/README000444000765000024 367112667073765 15367 0ustar00philkimestaff000000000000 Biber is a BibTeX replacement for users of biblatex, with full Unicode support. * Please note - the default download for all platforms is 64-bit. Please look in the files section for the correct 32-bit platform instead of using the default download button if you want 32-bit. REQUIREMENTS Biber is written in Perl with the aim of providing a customised and sophisticated data preparation backend for biblatex. You do not need to install Perl use biber--binaries are provided for many operating systems via the main TeX distributions (TeXLive, MacTeX, MiKTeX) and also via download from SourceForge. You only need a Perl installation to use biber in one of the following cases: * A binary version is not available for your OS/platform * You wish to keep up with all of the bleeding-edge git commits before they are packaged into a binary. For the vast majority of users, using the latest binary for the OS/platform you are using will be what you want to do. For details on the requirements for installing the Perl program version, please see the biber PDF documentation. The git repository for Biber is kept on github: https://github.com/plk/biber SUPPORT AND DOCUMENTATION After installing, biber --help will give you the basic documentation. The latest PDF documentation can be found here: https://sourceforge.net/projects/biblatex-biber/files/biblatex-biber More information, bugfix releases, forums and bug tracker are available at: https://github.com/plk/biber ========================== COPYRIGHT AND LICENCE Copyright (C) 2009--2016 François Charette and Philip Kime This program is free software; you can redistribute it and/or modify it under the terms of either: * the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or * the Artistic License version 2.0. ========================== biblatex-biber-2.4/THANKS000444000765000024 74012667073765 15374 0ustar00philkimestaff000000000000We acknowledge the help of: Philipp Lehman, who gave us biblatex, and without whose close collaboration Biber development would not be possible. Alberto Manuel Brandão Simões, the maintainer of Text-BibTeX, for willingly complying to our special requests. John Collins for integration with the excellent latexmk tool. We also wish to thank the following persons for their useful feedback, bug reports, etc.: Simon Spiegel Thomas Arildsen and several others biblatex-biber-2.4/TODO.org000444000765000024 272712667073765 15766 0ustar00philkimestaff000000000000* DONE biblatex firstinits option to giveninits * DONE useprefix per names/name? * DONE More flexible sorting allowing arbitrary name part order? * DONE name taxonomy (first, middle, last) needs to be generalised. Internally in Biber too ** firstname -> given ** lastname -> family ** middlename -> middle ** prefix -> prefix ** suffix -> suffix * DONE lastname mandatory relaxed? How about just mandatory that some part is defined since sorting isn't always on lastname first? * DONE name parts and gender types in data model as constants * DONE \keypart round \namepart * DONE make namepart specs ** DONE named ** DONE selectable per sortlist *** TODO abx@aux@sortscheme etc. probably this needs to be generalised to mentioned refcontexts ** DONE per-entry ** DONE per-namelist, per name * DONE hashes use static construction from DM name constants - problem with uniquelist * DONE tool mode bltx output should write schema but controlled by option (normal output uses same option) * DONE per-names/name options are not in .bcf - matters? * DONE per-namelists/per-name options ** DONE needs per names/name support in biblatex and in bbl ** DONE sortnamekeyscheme needs per entry/names/name in bbl ** DONE biblatex macro support in formats for sortnamekeyscheme ** DONE What to do with gender attribute on name? * DONE Document example in biblatex manual of compound keypart * DONE implement patronymic namepart example * TODO Document year/month (datepart fields) are not allowed in bltxml biblatex-biber-2.4/visual.pl000444000765000024 55412667073765 16324 0ustar00philkimestaff000000000000# Module::Build "Build test" invokes this after all test scripts to provide some user # feedback. See the manual for Module::Build. The name of this script is not arbitrary. use Biber; BEGIN { push @INC, 'blib/lib/'; } my $v = $Biber::Config::VERSION; $v .= ' (beta)' if $Biber::Config::BETA_VERSION; print "Finished testing biber $v using Perl $] at $^X\n"; biblatex-biber-2.4/bin000755000765000024 012667073765 15113 5ustar00philkimestaff000000000000biblatex-biber-2.4/bin/biber000555000765000024 6576712667073765 16326 0ustar00philkimestaff000000000000#!/usr/bin/perl use v5.16; use strict; use warnings; use constant { EXIT_OK => 0, EXIT_ERROR => 2 }; use Carp; use IPC::Cmd qw( can_run run ); use Log::Log4perl qw(:no_extra_logdie_message); use Log::Log4perl::Level; use POSIX qw(strftime); use Biber; use Biber::Utils; use File::Spec; use Pod::Usage; use List::AllUtils qw( first ); use Getopt::Long qw/:config no_ignore_case/; my $opts = {}; GetOptions( $opts, 'bibencoding=s', # legacy alias for input_encoding 'bblencoding=s', # legacy alias for output_encoding 'bblsafechars', # legacy alias for output_safechars 'bblsafecharsset=s', # legacy alias for output_safecharsset 'cache', 'clrmacros', 'collate|C', 'collate_options|collate-options|c=s', 'configfile|g=s', 'convert_control|convert-control', 'debug|D', 'decodecharsset=s', 'dieondatamodel', 'dot_include|dot-include:s@', 'fastsort|f', 'fixinits', 'help|h|?', 'input_directory|input-directory=s', 'input_encoding|input-encodinge=s', 'input_format|input-format=s', 'isbn10', 'isbn13', 'isbn_normalise|isbn-normalise', 'listsep=s', 'logfile=s', 'mincrossrefs|m=s', 'namesep=s', 'no_bltxml_schema|no-bltxml-schema', 'noconf', 'nodieonerror', 'nolog', 'nostdmacros', 'onlylog', 'others_string|others-string=s', 'outfile=s', # legacy alias for output_file 'outformat=s', # legacy alias for output_format 'output_align|output-align', 'output_directory|output-directory=s', 'output_encoding|output-encoding|E=s', 'output_fieldcase|output-fieldcase=s', 'output_file|output-file|O=s', 'output_format|output-format=s', 'output_indent|output-indent=s', 'output_macro_fields|output-macro-fields=s', 'output_resolve|output-resolve', 'output_safechars|output-safechars', 'output_safecharsset|output-safecharsset=s', 'quiet|q+', 'recodedata=s', 'noskipduplicates', 'sortcase=s', 'sortgiveninits|sortfirstinits=s', 'sortlocale|l=s', 'sortupper=s', 'ssl-nointernalca', 'ssl-noverify-host', 'strip_comments|strip-comments', 'tool', 'tool_align|tool-align', # legacy alias for output_align 'tool_config|tool-config', 'tool_fieldcase|tool-fieldcase=s', # legacy alias for output_fieldcase 'tool_indent|tool-indent=s', # legacy alias for output_indent 'tool_macro_fields|tool-macro-fields=s', # legacy alias for output_macro_fields 'tool_resolve|tool-resolve', # legacy alias for output_resolve 'trace|T', 'u', # alias for input_encoding=UTF-8 'U', # alias for output_encoding=UTF-8 'validate_config|validate-config', 'validate_control|validate-control', 'validate_bltxml|validate-bltxml', 'validate_datamodel|validate-datamodel|V', 'version|v', 'wraplines|w', 'xsvsep=s', ) or pod2usage(-verbose => 0, -exitval => EXIT_ERROR); # verbose > 1 uses external perldoc, this doesn't work with PAR::Packer binaries # so use "-noperldoc" to use built-in POD::Text if (exists $opts->{'help'}) { pod2usage(-verbose => 2, -noperldoc => 1, -exitval => EXIT_OK); } if (exists $opts->{'version'}) { my $v = "biber version: $Biber::Config::VERSION"; $v .= ' (beta)' if $Biber::Config::BETA_VERSION; say "$v"; exit EXIT_OK; } # Show location of PAR::Packer cache if (exists $opts->{'cache'}) { if (my $cache = $ENV{PAR_TEMP}) { $cache =~ s|//|/|og; # Sanitise path in case it worries people say $cache; } else { say "No cache - you are not running the PAR::Packer executable version of biber"; } exit EXIT_OK; } # Show location of default tool mode config file and exit if (exists $opts->{'tool_config'}) { (my $vol, my $dir, undef) = File::Spec->splitpath( $INC{"Biber/Config.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' say File::Spec->catpath($vol, "$dir", 'biber-tool.conf'); exit EXIT_OK; } # Catch this situation early unless (@ARGV) { pod2usage(-verbose => 0, -exitval => EXIT_ERROR); } # Sanitise collate option if fastsort is specified if ($opts->{fastsort}) { delete $opts->{collate}; } # Resolve some option shortcuts and legacy aliases if (my $o = $opts->{tool_align}) { $opts->{output_align} = $o; delete $opts->{tool_align}; } if (my $o = $opts->{tool_fieldcase}) { $opts->{output_fieldcase} = $o; delete $opts->{tool_fieldcase}; } if (my $o = $opts->{tool_indent}) { $opts->{output_indent} = $o; delete $opts->{tool_indent}; } if (my $o = $opts->{tool_macro_fields}) { $opts->{output_macro_fields} = $o; delete $opts->{tool_macro_fields}; } if (my $o = $opts->{tool_resolve}) { $opts->{output_resolve} = $o; delete $opts->{tool_resolve}; } if (my $o = $opts->{bibencoding}) { $opts->{input_encoding} = $o; delete $opts->{bibencoding}; } if (my $o = $opts->{bblencoding}) { $opts->{output_encoding} = $o; delete $opts->{bblencoding}; } if (my $o = $opts->{bblsafechars}) { $opts->{output_safechars} = $o; delete $opts->{bblsafechars}; } if (my $o = $opts->{bblsafecharsset}) { $opts->{output_safecharsset} = $o; delete $opts->{bblsafecharsset}; } if (my $o = $opts->{outfile}) { $opts->{output_file} = $o; delete $opts->{outfile}; } if (my $o = $opts->{outformat}) { $opts->{output_format} = $o; delete $opts->{outformat}; } if ($opts->{u}) { $opts->{input_encoding} = 'UTF-8'; delete $opts->{u}; } if ($opts->{U}) { $opts->{output_encoding} = 'UTF-8'; delete $opts->{U}; } # Check the output_format option if (my $of = $opts->{output_format}) { unless ($opts->{output_format} =~ /\A(?:bbl|dot|bibtex|biblatexml)\z/xms) { say STDERR "Biber: Unknown output format '$of', must be one of 'bbl', 'dot', 'bibtex', 'biblatexml'"; exit EXIT_ERROR; } } if (exists($opts->{tool}) and exists($opts->{output_format}) and $opts->{output_format} !~ /\A(?:bibtex|biblatexml)\z/xms) { say STDERR "Biber: Output format in tool mode must be one of 'bbl' or 'biblatexml'"; exit EXIT_ERROR; } # Set default output format if (not exists($opts->{output_format})) { if (exists($opts->{tool})) { $opts->{output_format} = 'bibtex'; # default for tool mode is different } else { $opts->{output_format} = 'bbl'; # default for normal use } } # Check ISBN options if (exists($opts->{isbn10}) and exists($opts->{isbn13})) { say STDERR "Biber: Select only one of 'isbn10' or 'isbn13' but not both"; exit EXIT_ERROR; } # Check the tool_* options if (exists($opts->{output_indent}) and $opts->{output_indent} !~ /^\d+$/) { say STDERR "Biber: Invalid non-numeric argument for 'output_indent' option!"; exit EXIT_ERROR; } if (exists($opts->{output_fieldcase}) and $opts->{output_fieldcase} !~ /^(?:upper|lower|title)$/i) { say STDERR "Biber: Invalid argument for 'output_fieldcase' option - must be one of 'upper', 'lower' or 'title'!"; exit EXIT_ERROR; } # Check the dot_include option if (exists($opts->{dot_include}) and (not exists($opts->{output_format}) or (exists($opts->{output_format}) and $opts->{output_format} ne 'dot'))) { say STDERR "Biber: DOT output format specified but output format is not DOT!"; exit EXIT_ERROR; } if (exists($opts->{dot_include})) { $opts->{dot_include} = {map {lc($_) => 1} split(/,/,join(',',@{$opts->{dot_include}}))}; my @suboptions = ( 'section', 'field', 'crossref', 'xref', 'xdata', 'related' ); foreach my $g (keys %{$opts->{dot_include}}) { unless (first {$_ eq lc($g)} @suboptions) { say STDERR "Biber: '$g' is an invalid output type for DOT output"; exit EXIT_ERROR; } } } # Check input_format option if (exists($opts->{input_format}) and not exists($opts->{tool}) ) { say STDERR "Biber: 'input_format' option is only valid in tool mode"; exit EXIT_ERROR; } if (exists($opts->{input_format}) and $opts->{input_format} !~ /^(?:bibtex|biblatexml|)$/i) { say STDERR 'Biber: ' . $opts->{input_format} . ' is an invalid input format in tool mode'; exit EXIT_ERROR; } # Create Biber object, passing command-line options my $biber = Biber->new(%$opts); # get the logger object my $logger = Log::Log4perl::get_logger('main'); my $screen = Log::Log4perl::get_logger('screen'); my $logfile = Log::Log4perl::get_logger('logfile'); my $outfile; my $time_string = strftime "%a %b %e, %Y, %H:%M:%S", localtime; $logfile->info("=== $time_string"); my $bcf = Biber::Config->getoption('bcf'); if (Biber::Config->getoption('output_file')) { $outfile = Biber::Config->getoption('output_file') } else { if (Biber::Config->getoption('tool')) { if (Biber::Config->getoption('output_format') eq 'bibtex') { # tool .bib output $outfile = $ARGV[0] =~ s/\..+$/_bibertool.bib/r; } elsif (Biber::Config->getoption('output_format') eq 'biblatexml') { # tool .blxtxml output $outfile = $ARGV[0] =~ s/\..+$/_bibertool.bltxml/r; } } else { if (Biber::Config->getoption('output_format') eq 'dot') { # .dot output $outfile = $bcf =~ s/bcf$/dot/r; } elsif (Biber::Config->getoption('output_format') eq 'bibtex') { # bibtex output $outfile = $bcf =~ s/\..+$/_biber.bib/r; } elsif (Biber::Config->getoption('output_format') eq 'bbl') { # bbl output $outfile = $bcf =~ s/bcf$/bbl/r; } else { say "output_format option '" . Biber::Config->getoption('output_format') . "' only makes sense in tool mode (--tool)"; exit EXIT_ERROR; } } } # Set the .bbl path to the output dir, if specified if (my $outdir = Biber::Config->getoption('output_directory')) { my (undef, undef, $file) = File::Spec->splitpath($outfile); $outfile = File::Spec->catfile($outdir, $file) } # Set the output class. Should be a subclass of Biber::Output::base if (Biber::Config->getoption('output_format') eq 'dot') { # .dot output require Biber::Output::dot; $biber->set_output_obj(Biber::Output::dot->new()); } else { my $package = 'Biber::Output::' . Biber::Config->getoption('output_format'); eval "require $package" or biber_error("Error loading data source package '$package': $@"); $biber->set_output_obj(eval "${package}->new()"); } # Get reference to output object my $biberoutput = $biber->get_output_obj; # Fake some necessary .bcf parts if in tool mode if (Biber::Config->getoption('tool')) { $biber->tool_mode_setup; } else { # parse the .bcf control file $biber->parse_ctrlfile($bcf); } # Postprocess biber options now that they are all read from the various places Biber::Config->postprocess_biber_opts; # Set the output target file name # Must come after ctrlfile/option parsing otherwise output encoding is not set $biberoutput->set_output_target_file($outfile); # Check to see if the .bcf set debug=1. If so, increase logging level # We couldn't set this on logger init as the .bcf hadn't been read then if (Biber::Config->getoption('debug')) { $logger->level($DEBUG); } if (Biber::Config->getoption('trace')) { $logger->trace("\n###########################################################\n", "############# Dump of initial config object: ##############\n", Data::Dump::pp($Biber::Config::CONFIG), "\n", "############# Dump of initial biber object: ###############\n", $biber->_stringdump, "\n###########################################################") } # Do all the real work Biber::Config->getoption('tool') ? $biber->prepare_tool : $biber->prepare; if (Biber::Config->getoption('trace')) { $logger->trace("\n###########################################################\n", "############# Dump of final config object: ################\n", Data::Dump::pp($Biber::Config::CONFIG), "\n", "############# Dump of final biber object: #################\n", $biber->_stringdump, "\n###########################################################") } # Write the output to the target $biberoutput->output; $biber->display_problems; exit EXIT_OK; __END__ =pod =encoding utf8 =head1 NAME C - A bibtex replacement for users of biblatex =head1 SYNOPSIS biber [options] file[.bcf] biber [options] --tool Creates "file.bbl" using control file "file.bcf" (".bcf" extension is optional). Normally use with biblatex requires no options as they are all set in biblatex and passed via the ".bcf" file In "tool" mode (see B<--tool> option), takes a datasource (defaults to "bibtex" datasource) and outputs a copy of the datasource with any command-line or config file options applied. Please run "biber --help" for option details =head1 DESCRIPTION C provides a replacement of the bibtex processor for users of biblatex. =head1 OPTIONS =over 4 =item B<--cache> If running as a PAR::Packer binary, show the cache location and exit. =item B<--clrmacros> Clears any BibTeX macros (@STRING) between BibLaTeX refsections. This prevents BibTeX warnings about macro redefinitions if you are using the same datasource several times for different refsections. =item B<--collate|-C> Sort with C instead of the built-in sort function. This is the default. =item B<--collate-options|-c [options]> Options to pass to the C object used for sorting (default is 'level => "4", variable => "non-ignorable"'). See C for details. =item B<--configfile|-g [file]> Use F as configuration file for C. The default is the first file found among F in the current directory, C<$HOME/.biber.conf>, or else the output of C. In tool mode, (B<--tool>) the F installed with Biber is always used to set defaults before potentially overriding the defaults with a user-defined config specified with this option. Use the B<--tool-config> option to view the location of the default tool mode config file. =item B<--convert-control> Converts the F<.bcf> control file into html using an XSLT transform. Can be useful for debugging. File is named by appending C<.html> to F<.bcf> file. =item B<--decodecharsset=[recode set name]> The set of characters included in the conversion routine when decoding LaTeX macros into UTF-8 (which happens when B<--bblencoding|-E> is set to UTF-8). Set to "full" to try harder with a much larger set or "base" to use a smaller basic set. Default is "base". You may want to try "full" if you have less common UTF-8 characters in your data source. The recode sets are defined in the reencoding data file which can be customised. See the --recodedata option and the PDF manual. The virtual set name "null" may be specified which effectively turns off macro decoding. =item B<--debug|-D> Turn on debugging for C. =item B<--dieondatamodel> Exit immediately with error if using C<--validate-datamodel> and a datamodel validation error is found. Default is to warn and continue. =item B<--dot-include=section,field,xdata,crossref,xref,related> Specifies the element to include in GraphViz DOT output format if the output format is 'dot'. You can also choose to display crossref, xref, xdata and/or related entry connections. The default if not specified is C<--dot_include=section,xdata,crossref,xref>. =item B<--fastsort|-f> Use Perl's sort instead of C for sorting. Also uses OS locale definitions (which may be broken for some languages ...). =item B<--fixinits> Try to fix broken multiple initials when they have no space between them in BibTeX data sources. That is, "A.B. Clarke" becomes "A. B. Clarke" before name parsing. This can slightly mess up things like "{U.K. Government}" and other esoteric cases. =item B<--help|-h> Show this help message. =item B<--input-directory [directory]> F<.bcf> and data files will be looked for first in the F. See the biber PDF documentation for the other possibilities and how this interacts with the C<--output_directory> option. =item B<--input-encoding|-e [encoding]> Specify the encoding of the data source file(s). Default is "UTF-8" Normally it's not necessary to set this as it's passed via the .bcf file from biblatex's C option. See "perldoc Encode::Supported" for a list of supported encodings. The legacy option B<--bibencoding> is supported as an alias. =item B<--input-format=bibtex|biblatexml> Biber input format. This option only means something in tool mode (see B option) since normally the input format of a data source is specified in the F<.bcf> file and therefore from the B<\addbibresouce> macro in BibLaTeX. The default value when in tool mode is 'bibtex' =item B<--isbn10> Force all ISBNs to 10-digit versions on output. This will convert the ISBN internally to an ISBN object which will not have hyphens on output. If you use this option and want an ISBN with hyphens in the correct place on output, use the B<--isbn-normalise> option. =item B<--isbn13> Force all ISBNs to 13-digit versions on output. This will convert the ISBN internally to an ISBN object which will not have hyphens on output. If you use this option and want an ISBN with hyphens in the correct place on output, use the B<--isbn-normalise> option. =item B<--isbn-normalise> Normalise ISBNs with hyphens in the correct places on output. =item B<--logfile [file]> Use F as the name of the logfile. =item B<--listsep=[sep]> Use F as the separator for BibTeX data source list fields. Defaults to BibTeX's usual 'and'. =item B<--mincrossrefs|-m [number]> Set threshold for crossrefs. =item B<--namesep=[sep]> Use F as the separator for BibTeX data source name fields. Defaults to BibTeX's usual 'and'. =item B<--no-bltxml-schema> When reading or writing biblatexml data sources, don't generate an RNG XML schema from the data model. =item B<--noconf> Don't look for a configfile. =item B<--nodieonerror> Don't exit on errors, just log and continue as far as possible. This can be useful if the error is something from, for example, the underlying BibTeX parsing C library which can complain about parsing errors which can be ignored. =item B<--nolog> Do not write any logfile. =item B<--nostdmacros> Don't automatically define any standard macros like month abbreviations. If you also define these yourself, this option can be used to suppress macro redefinition warnings. =item B<--onlylog> Do not write any message to screen. =item B<--others-string=[string]> Use F as the final name in a name field which implies "et al". Defaults to BibTeX's usual 'others'. =item B<--output-align> Align field values in neat columns in output. Effect depends on the output format. Default is false. The legacy option B<--tool_align> is supported as an alias. =item B<--output-directory [directory]> Output files (including log files) are output to F instead of the current directory. Input files are also looked for in F before current directory (but after C<--input_directory> if that is specified). =item B<--output-encoding|-E [encoding]> Specify the encoding of the output C<.bbl> file. Default is "UTF-8". Normally it's not necessary to set this as it's passed via the .bcf file from biblatex's C option. See C for a list of supported encodings. The legacy option B<--bblencoding> is supported as an alias. =item B<--output-indent=[num]> Indentation for body of entries in output. Effect depends on the output format. Defaults to 2. The legacy option B<--tool_indent> is supported as an alias. =item B<--output-fieldcase=upper|lower|title> Case for field names output. Effect depends on the output format. Defaults to 'upper'. The legacy option B<--tool_fieldcase> is supported as an alias. =item B<--output-file|-O [file]> Output to F instead of F F is relative to B<--output_directory>, if set (absolute paths in this case are stripped to filename only). F can be absolute if B<--output_directory> is not set. The legacy option B<--outfile> is supported as an alias. =item B<--output-format=dot|bibtex|biblatexml|bbl> Biber output format. Default if not specified is of course, F. Use F to output a GraphViz DOT file instead of F<.bbl>. This is a directed graph of the bibliography data showing entries and, as requested, sections and fields. You must process this file with C, e.g. C to render the graph. See the B<--dot_include> option to select what is included in the DOT output. The legacy option B<--outformat> is supported as an alias. =item B<--output-macro-fields=[field1, ... fieldn]> A comma-separated list of field names whose values are, on output, treated as BibTeX macros. Effectively this means that they are not wrapped in braces. Effect depends on the output format. The legacy option B<--tool_macro_fields> is supported as an alias. =item B<--output-resolve> Whether to resolve aliases and inheritance (XDATA, CROSSREF etc.) in tool mode. Defaults to 'false'. The legacy option B<--tool_resolve> is supported as an alias. =item B<--output-safechars> Try to convert UTF-8 chars into LaTeX macros when writing the output. This can prevent unknown char errors when using PDFLaTeX and inputenc as this doesn't understand all of UTF-8. Note, it is better to switch to XeTeX or LuaTeX to avoid this situation. By default uses the --output_safecharsset "base" set of characters. The legacy option B<--bblsafechars> is supported as an alias. =item B<--output-safecharsset=[recode set name]> The set of characters included in the conversion routine for --output_safechars. Set to "full" to try harder with a much larger set or "base" to use a basic set. Default is "base" which is fine for most use cases. You may need to load more macro packages to deal with the results of "full" (Dings, Greek characters, special symbols etc.). The recode sets are defined in the reencoding data file which can be customised. See the --recodedata option and the PDF manual. The legacy option B<--bblsafecharsset> is supported as an alias. The virtual set name "null" may be specified which effectively turns off macro encoding. =item B<--quiet|-q> Log only errors. If this option is used more than once, don't even log errors. =item B<--recodedata=[file]> The data file to use for the reencoding between UTF-8 and LaTeX macros. It defines the sets specified with the --output_safecharsset and --decodecharsset options. It defaults to F in the same directory as Biber's F module. See the PDF documentation for the format of this file. If this option is used, then F should be somewhere C can find it. =item B<--noskipduplicates> Don't skip duplicate bibliography keys if found. The detection of duplicate keys is done across all data sources. Sometimes you might need duplicates when using several data sources across several refsections in which case you might need to use this option. =item B<--sortcase=true|false> Case-sensitive sorting (default is true). =item B<--sortgiveninits=true|false> When sorting names, use only the given name initials, not full given name. Some people expect the biblatex B option to do this but it needs to be a separate option in case users, for example, need to show only initials but sort with full given names (default is false). =item B<--sortlocale|-l [locale]> Set the locale to be used for sorting. With default sorting (B<--collate|-C>), the locale is used to add CLDR tailoring to the sort (if available for the locale). With B<--fastsort|-f> this sets the OS locale for sorting. =item B<--sortupper=true|false> Whether to sort uppercase before lowercase when using default sorting (B<--collate|-C>). When using B<--fastsort|-f>, your OS collation locale determines this and this option is ignored (default is true). =item B<--ssl-nointernalca> Don't try to use the default Mozilla CA certificates when using HTTPS to fetch remote data. This assumes that the user will set one of the perl LWP::UserAgent module environment variables to find the CA certs. =item B<--ssl-noverify-host> Turn off host verification when using HTTPS to fetch remote data sources. You may need this if the SSL certificate is self-signed for example. =item B<--strip-comments> In tool mode, strip all comments from the output file. =item B<--tool> Run in tool mode. This mode is datasource centric rather than document centric. biber reads a datasource (and a config file if specified), applies the command-line and config file options to the datasource and writes a new datasource. Essentially, this allows you to change your data sources using biber's transformation options (such as source mapping, sorting etc.) =item B<--tool-config> Show the location of the default tool mode config file and exit. Useful when you need to copy this file and customise it. =item B<--trace|T> Turn on tracing. Also turns on B<--debug|d> and additionally provides a lot of low-level tracing information in the log. =item B<-u> Alias for B<--input-encoding=UTF-8> =item B<-U> Alias for B<--output-encoding=UTF-8> =item B<--validate-config> Schema validate the biber config file. =item B<--validate-control> Schema validate the F<.bcf> biblatex control file. =item B<--validate-bltxml> Schema validate BibLaTeXML datasources against a schema auto-generated from the BibLaTeX datamodel. The schema will be auto-generated with the name of the F<.bcf> file with a F<.rng> extension. The generated schema can be kept and used with standard XML editors to validate the datasource during datasource development. The schema validation does not validate all semantic aspects of the datamodel (i.e. the data model constraints)---for this use the C<--validate-datamodel> option. =item B<--validate-datamodel|-V> Validate the data against a data model. =item B<--version|-v> Display version number. =item B<--wraplines|-w> Wrap lines in the F<.bbl> file. =item B<--xsvsep=[sep]> Use F as the separator for fields of format type "xsv" in the data model. A Perl regexp can be specified. Defaults to a single comma surround by optional whitespace (\s*,\s*). =back =head1 AUTHOR François Charette, CE<10> Philip Kime, C =head1 BUGS & DOCUMENTATION To see the full documentation, run B or get the F manual from SourceForge. Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/data000755000765000024 012667073765 15254 5ustar00philkimestaff000000000000biblatex-biber-2.4/data/bcf.xsl000444000765000024 15015312667073765 16740 0ustar00philkimestaff000000000000
sort_final &darr; &uarr; Aa/ aA/ Aa/ aA/ A a A a
  • > <
Key
  • Heading Format: (sort-direction)(case-order)/(case-sensitivity)
  • Heading key: &uarr; = ascending sort, &darr; = descending sort, Aa = sort uppercase before lower, aA = sort lowercase before upper, A = case-sensitive sorting, a = case-insensitive sorting, sort fieldset is final master key if defined
  • Field key: Padding specification e.g. 0000field = pad field "field" from left with "0" to width 4. Substring specification e.g. field<<<< = take width 4 substring from right side of field "field"
BibLaTeX control file

BibLaTeX Control File (format version: )


options for

OptionValue
,&nbsp;

Option Scope

OptionDatatype

Datasource Mappings

Mappings for datatype (default overwrite = 1 0 )

Mapping ( overwrite = default overwrite , for types: , , for datasources: , , foreach loop field= )
map_final @ &rarr;@ map_newentryNEW created with key "" map_final &rarr; &asymp; &rarr; map_null ="" =TYPE =FIELD =FIELDVAL map_newentry applied to target ""

Key
  • @entrytype: Entrytype for entry must match or mapping terminates
  • field: Entry must have field or mapping terminates
  • @source&rarr;@target: Change source entrytype to target entrytype
  • source&rarr;target: Change source field to target field
  • field: Delete field
  • field="string": Set field to "string"
  • TYPE: Most recently mentioned source entrytype
  • FIELD: Most recently source field
  • FIELDVAL: Most recently source field value
  • field&asymp;MATCH: field must match Regular Expression MATCH
  • field&asymp;MATCH &rarr; REPLACE: Perform Regular Expression match/replace on field

Labelalpha Templates

Template for type

Part
  • la_final la_compound namecount>&rarr; > la_namerange= < v/ vf/ l &otimes;
Key
  • Heading key: Label parts are concatenated together in part order shown
  • Labelpart key: Final label, no more parts are considered. "namecount>n&rarr;field" - conditional field part, only used if there are more than n names. Substring specification: >>>field = use three chars from left side of field, field<< = use two chars from right side of field, fieldv/n = variable-width substring, max n chars, fieldvf/n = variable-width substring fixed to same length as longest string occuring at least n times, fieldl = list scope disambiguation where the label as a whole is unique, not necessarily the individual parts. field with compound substring extraction enabled. field=range = only use the names in the specified range to form the labelpart, &otimes; = supress alphaothers

Inheritance

Defaults

Child type &asymp; Parent typeSource field &rarr; Target field
* &asymp; * inherit_override * &rarr; inherit_override * inherit_override * &rarr; inherit_override &empty;
* &asymp; * inherit_override * &asymp; inherit_override * inherit_override * &rarr; inherit_override &empty;

Specifications

Child type &asymp; Parent typeSource field &rarr; Target field
  • * &asymp; *
  • &rarr; &empty; inherit_override &rarr; inherit_override
Key
  • * matches all entrytypes or fields
  • X &asymp; Y: X inherits from Y
  • X &rarr; &empty;: Field X is suppressed
  • F &rarr; F': Field F in parent becomes field F' in child. If both field F and field F' exist, field in red overrides the other.

Global Default Sorting Options

Presort defaults

EntrytypePresort default
ALL

Sorting exclusions

EntrytypeFields excluded from sorting
,&nbsp;

Sorting Name Key Specification

OrderKeypart
(if use=) +

Sorting Specification


Data Model

Constants

NameTypeValue

Legal entrytypes

EntrytypeLegal fields for entrytype
GLOBAL
,
GLOBAL fields
GLOBAL fields
,

Field Types

FieldField FormatData type
&empty; &loz; standard &nbsp;
Key
  • &empty; = field can null in .bbl, &loz; = field is not output to .bbl

Constraints

EntrytypesConstraint
  • &forall; &exist; &not;&exist; ( , ) &rarr; &forall; &exist; &not;&exist; ( , ) &le; ( , ) &le; ( , ) must be dates &oplus; ( field_xor_coerce , ) &or; ( , )
Key
  • C &rarr; C': If condition C is met then condition C' must also be met
  • &forall; ( ... ): True if all fields in list exist
  • &exist; ( ... ): True if one field in list exists
  • &not;&exist; ( ... ): True if no fields in list exist
  • n &le; ( ... ) &le; m: True if fields in list are have values in the range n-m
  • &oplus; ( ... ): True if at least and at most one of the fields in the list exists (XOR). If more than field in the set exists, all will be ignored except for the one in red
  • &or; ( ... ): True if at least one of the fields in the list exists (OR)

Reference Sections

Section 0

Data sourcesCitekeysDynamic sets
  • (&nbsp;)
  • &nbsp;()

Section

Data sourcesCitekeys
  • (&nbsp;)

Sorting Lists

Sorting list ""

Filters
Filter typeFilter value
Sorting Specification
Using sorting name key scheme:
(global default)
biblatex-biber-2.4/data/biber-tool.conf000444000765000024 17250312667073765 20366 0ustar00philkimestaff000000000000 prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvreference mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata month year day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label langid langidopts library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthandintro subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes shorthand shortjournal shortseries shorttitle urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec translator shortauthor shorteditor sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref date eventdate origdate urldate doi eprint file verba verbb verbc url xdata ids entryset related keywords options relatedoptions pages execute abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedoptions relatedstring relatedtype shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage pagetotal publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender biblatex-biber-2.4/data/latinkeys.txt000444000765000024 56545712667073765 20243 0ustar00philkimestaff000000000000# unidata-7.0.0.txt # Date: 2014-04-07, 19:21:08 GMT [KW] # # This file defines the Default Unicode Collation Element Table # (DUCET) for the Unicode Collation Algorithm # # Copyright (c) 2001-2014 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # # See UTS #10, Unicode Collation Algorithm, for more information. # # Diagnostic weight ranges # Primary weight range: 0200..4CFC (19197) # Secondary weight range: 0020..010C (237) # Variant secondaries: 0108..010C (5) # Tertiary weight range: 0002..001F (30) # @version 7.0.0 0000 ; [.0000.0000.0000] # NULL (in 6429) 0001 ; [.0000.0000.0000] # START OF HEADING (in 6429) 0002 ; [.0000.0000.0000] # START OF TEXT (in 6429) 0003 ; [.0000.0000.0000] # END OF TEXT (in 6429) 0004 ; [.0000.0000.0000] # END OF TRANSMISSION (in 6429) 0005 ; [.0000.0000.0000] # ENQUIRY (in 6429) 0006 ; [.0000.0000.0000] # ACKNOWLEDGE (in 6429) 0007 ; [.0000.0000.0000] # BELL (in 6429) 0008 ; [.0000.0000.0000] # BACKSPACE (in 6429) 000E ; [.0000.0000.0000] # SHIFT OUT (in 6429) 000F ; [.0000.0000.0000] # SHIFT IN (in 6429) 0010 ; [.0000.0000.0000] # DATA LINK ESCAPE (in 6429) 0011 ; [.0000.0000.0000] # DEVICE CONTROL ONE (in 6429) 0012 ; [.0000.0000.0000] # DEVICE CONTROL TWO (in 6429) 0013 ; [.0000.0000.0000] # DEVICE CONTROL THREE (in 6429) 0014 ; [.0000.0000.0000] # DEVICE CONTROL FOUR (in 6429) 0015 ; [.0000.0000.0000] # NEGATIVE ACKNOWLEDGE (in 6429) 0016 ; [.0000.0000.0000] # SYNCHRONOUS IDLE (in 6429) 0017 ; [.0000.0000.0000] # END OF TRANSMISSION BLOCK (in 6429) 0018 ; [.0000.0000.0000] # CANCEL (in 6429) 0019 ; [.0000.0000.0000] # END OF MEDIUM (in 6429) 001A ; [.0000.0000.0000] # SUBSTITUTE (in 6429) 001B ; [.0000.0000.0000] # ESCAPE (in 6429) 001C ; [.0000.0000.0000] # FILE SEPARATOR (in 6429) 001D ; [.0000.0000.0000] # GROUP SEPARATOR (in 6429) 001E ; [.0000.0000.0000] # RECORD SEPARATOR (in 6429) 001F ; [.0000.0000.0000] # UNIT SEPARATOR (in 6429) 007F ; [.0000.0000.0000] # DELETE (in 6429) 0080 ; [.0000.0000.0000] # 0081 ; [.0000.0000.0000] # 0082 ; [.0000.0000.0000] # BREAK PERMITTED HERE (in 6429) 0083 ; [.0000.0000.0000] # NO BREAK HERE (in 6429) 0084 ; [.0000.0000.0000] # 0086 ; [.0000.0000.0000] # START OF SELECTED AREA (in 6429) 0087 ; [.0000.0000.0000] # END OF SELECTED AREA (in 6429) 0088 ; [.0000.0000.0000] # CHARACTER TABULATION SET (in 6429) 0089 ; [.0000.0000.0000] # CHARACTER TABULATION WITH JUSTIFICATION (in 6429) 008A ; [.0000.0000.0000] # LINE TABULATION SET (in 6429) 008B ; [.0000.0000.0000] # PARTIAL LINE FORWARD (in 6429) 008C ; [.0000.0000.0000] # PARTIAL LINE BACKWARD (in 6429) 008D ; [.0000.0000.0000] # PARTIAL LINE FEED (in 6429) 008E ; [.0000.0000.0000] # SINGLE SHIFT TWO (in 6429) 008F ; [.0000.0000.0000] # SINGLE SHIFT THREE (in 6429) 0090 ; [.0000.0000.0000] # DEVICE CONTROL STRING (in 6429) 0091 ; [.0000.0000.0000] # PRIVATE USE ONE (in 6429) 0092 ; [.0000.0000.0000] # PRIVATE USE TWO (in 6429) 0093 ; [.0000.0000.0000] # SET TRANSMIT STATE (in 6429) 0094 ; [.0000.0000.0000] # CANCEL CHARACTER (in 6429) 0095 ; [.0000.0000.0000] # MESSAGE WAITING (in 6429) 0096 ; [.0000.0000.0000] # START OF GUARDED AREA (in 6429) 0097 ; [.0000.0000.0000] # END OF GUARDED AREA (in 6429) 0098 ; [.0000.0000.0000] # START OF STRING (in 6429) 0099 ; [.0000.0000.0000] # 009A ; [.0000.0000.0000] # SINGLE CHARACTER INTRODUCER (in 6429) 009B ; [.0000.0000.0000] # CONTROL SEQUENCE INTRODUCER (in 6429) 009C ; [.0000.0000.0000] # STRING TERMINATOR (in 6429) 009D ; [.0000.0000.0000] # OPERATING SYSTEM COMMAND (in 6429) 009E ; [.0000.0000.0000] # PRIVACY MESSAGE (in 6429) 009F ; [.0000.0000.0000] # APPLICATION PROGRAM COMMAND (in 6429) 00AD ; [.0000.0000.0000] # SOFT HYPHEN 0009 ; [*0201.0020.0002] # HORIZONTAL TABULATION (in 6429) 000A ; [*0202.0020.0002] # LINE FEED (in 6429) 000B ; [*0203.0020.0002] # VERTICAL TABULATION (in 6429) 000C ; [*0204.0020.0002] # FORM FEED (in 6429) 000D ; [*0205.0020.0002] # CARRIAGE RETURN (in 6429) 0020 ; [*0209.0020.0002] # SPACE 0021 ; [*025F.0020.0002] # EXCLAMATION MARK 0022 ; [*02FF.0020.0002] # QUOTATION MARK 0023 ; [*038B.0020.0002] # NUMBER SIGN 0025 ; [*038C.0020.0002] # PERCENT SIGN 0026 ; [*0389.0020.0002] # AMPERSAND 0027 ; [*02F8.0020.0002] # APOSTROPHE 0028 ; [*030A.0020.0002] # LEFT PARENTHESIS 0029 ; [*030B.0020.0002] # RIGHT PARENTHESIS 002A ; [*0382.0020.0002] # ASTERISK 002B ; [*05D6.0020.0002] # PLUS SIGN 002C ; [*0221.0020.0002] # COMMA 002D ; [*020D.0020.0002] # HYPHEN-MINUS 002E ; [*0274.0020.0002] # FULL STOP 002F ; [*0387.0020.0002] # SOLIDUS 003A ; [*0238.0020.0002] # COLON 003B ; [*0233.0020.0002] # SEMICOLON 003C ; [*05DA.0020.0002] # LESS-THAN SIGN 003D ; [*05DB.0020.0002] # EQUALS SIGN 003E ; [*05DC.0020.0002] # GREATER-THAN SIGN 003F ; [*0264.0020.0002] # QUESTION MARK 0040 ; [*0381.0020.0002] # COMMERCIAL AT 005B ; [*030C.0020.0002] # LEFT SQUARE BRACKET 005C ; [*0388.0020.0002] # REVERSE SOLIDUS 005D ; [*030D.0020.0002] # RIGHT SQUARE BRACKET 005E ; [*0449.0020.0002] # CIRCUMFLEX ACCENT 005F ; [*020B.0020.0002] # LOW LINE 0060 ; [*0446.0020.0002] # GRAVE ACCENT 007B ; [*030E.0020.0002] # LEFT CURLY BRACKET 007C ; [*05DE.0020.0002] # VERTICAL LINE 007D ; [*030F.0020.0002] # RIGHT CURLY BRACKET 007E ; [*05E0.0020.0002] # TILDE 0085 ; [*0206.0020.0002] # NEXT LINE (in 6429) 00A0 ; [*0209.0020.001B] # NO-BREAK SPACE 00A1 ; [*0260.0020.0002] # INVERTED EXCLAMATION MARK 00A6 ; [*05DF.0020.0002] # BROKEN BAR 00A7 ; [*037C.0020.0002] # SECTION SIGN 00A8 ; [*044D.0020.0002] # DIAERESIS 00A9 ; [*0546.0020.0002] # COPYRIGHT SIGN 00AB ; [*0308.0020.0002] # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 00AC ; [*05DD.0020.0002] # NOT SIGN 00AE ; [*0547.0020.0002] # REGISTERED SIGN 00AF ; [*044A.0020.0002] # MACRON 00B0 ; [*04BA.0020.0002] # DEGREE SIGN 00B1 ; [*05D7.0020.0002] # PLUS-MINUS SIGN 00B4 ; [*0447.0020.0002] # ACUTE ACCENT 00B6 ; [*037E.0020.0002] # PILCROW SIGN 00B7 ; [*0288.0020.0002] # MIDDLE DOT 00B8 ; [*0450.0020.0002] # CEDILLA 00BB ; [*0309.0020.0002] # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 00BF ; [*0265.0020.0002] # INVERTED QUESTION MARK 00D7 ; [*05D9.0020.0002] # MULTIPLICATION SIGN 00F7 ; [*05D8.0020.0002] # DIVISION SIGN 207A ; [*05D6.0020.0014] # SUPERSCRIPT PLUS SIGN 207B ; [*05E1.0020.0014] # SUPERSCRIPT MINUS 207C ; [*05DB.0020.0014] # SUPERSCRIPT EQUALS SIGN 207D ; [*030A.0020.0014] # SUPERSCRIPT LEFT PARENTHESIS 207E ; [*030B.0020.0014] # SUPERSCRIPT RIGHT PARENTHESIS 208A ; [*05D6.0020.0015] # SUBSCRIPT PLUS SIGN 208B ; [*05E1.0020.0015] # SUBSCRIPT MINUS 208C ; [*05DB.0020.0015] # SUBSCRIPT EQUALS SIGN 208D ; [*030A.0020.0015] # SUBSCRIPT LEFT PARENTHESIS 208E ; [*030B.0020.0015] # SUBSCRIPT RIGHT PARENTHESIS 2104 ; [*0548.0020.0002] # CENTRE LINE SYMBOL 2108 ; [*0549.0020.0002] # SCRUPLE 2114 ; [*054A.0020.0002] # L B BAR SYMBOL 2117 ; [*054B.0020.0002] # SOUND RECORDING COPYRIGHT 2118 ; [*054C.0020.0002] # SCRIPT CAPITAL P 211E ; [*054D.0020.0002] # PRESCRIPTION TAKE 211F ; [*054E.0020.0002] # RESPONSE 2123 ; [*054F.0020.0002] # VERSICLE 2125 ; [*0550.0020.0002] # OUNCE SIGN 2127 ; [*0551.0020.0002] # INVERTED OHM SIGN 2129 ; [*0552.0020.0002] # TURNED GREEK SMALL LETTER IOTA 212E ; [*0553.0020.0002] # ESTIMATED SYMBOL 213A ; [*0554.0020.0002] # ROTATED CAPITAL Q 2140 ; [*05D5.0020.0005] # DOUBLE-STRUCK N-ARY SUMMATION 2141 ; [*0555.0020.0002] # TURNED SANS-SERIF CAPITAL G 2142 ; [*0556.0020.0002] # TURNED SANS-SERIF CAPITAL L 2143 ; [*0557.0020.0002] # REVERSED SANS-SERIF CAPITAL L 2144 ; [*0558.0020.0002] # TURNED SANS-SERIF CAPITAL Y 214A ; [*0559.0020.0002] # PROPERTY LINE 214B ; [*0671.0020.0002] # TURNED AMPERSAND 214C ; [*055A.0020.0002] # PER SIGN 214F ; [*055B.0020.0002] # SYMBOL FOR SAMARITAN SOURCE A720 ; [*04B4.0020.0002] # MODIFIER LETTER STRESS AND HIGH TONE A721 ; [*04B5.0020.0002] # MODIFIER LETTER STRESS AND LOW TONE A788 ; [*04B6.0020.0002] # MODIFIER LETTER LOW CIRCUMFLEX ACCENT A789 ; [*04B7.0020.0002] # MODIFIER LETTER COLON A78A ; [*04B8.0020.0002] # MODIFIER LETTER SHORT EQUALS SIGN FB29 ; [*05D6.0020.0005] # HEBREW LETTER ALTERNATIVE PLUS SIGN 1D6C1 ; [*05CC.0020.0005] # MATHEMATICAL BOLD NABLA 1D6DB ; [*05C8.0020.0005] # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL 1D6FB ; [*05CC.0020.0005] # MATHEMATICAL ITALIC NABLA 1D715 ; [*05C8.0020.0005] # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL 1D735 ; [*05CC.0020.0005] # MATHEMATICAL BOLD ITALIC NABLA 1D74F ; [*05C8.0020.0005] # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL 1D76F ; [*05CC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD NABLA 1D789 ; [*05C8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL 1D7A9 ; [*05CC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA 1D7C3 ; [*05C8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL 1F1E6 ; [*09C3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER A 1F1E7 ; [*09C4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER B 1F1E8 ; [*09C5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER C 1F1E9 ; [*09C6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER D 1F1EA ; [*09C7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER E 1F1EB ; [*09C8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER F 1F1EC ; [*09C9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER G 1F1ED ; [*09CA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER H 1F1EE ; [*09CB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER I 1F1EF ; [*09CC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER J 1F1F0 ; [*09CD.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER K 1F1F1 ; [*09CE.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER L 1F1F2 ; [*09CF.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER M 1F1F3 ; [*09D0.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER N 1F1F4 ; [*09D1.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER O 1F1F5 ; [*09D2.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER P 1F1F6 ; [*09D3.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Q 1F1F7 ; [*09D4.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER R 1F1F8 ; [*09D5.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER S 1F1F9 ; [*09D6.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER T 1F1FA ; [*09D7.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER U 1F1FB ; [*09D8.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER V 1F1FC ; [*09D9.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER W 1F1FD ; [*09DA.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER X 1F1FE ; [*09DB.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Y 1F1FF ; [*09DC.0020.0002] # REGIONAL INDICATOR SYMBOL LETTER Z FB1E ; [.0000.0061.0002] # HEBREW POINT JUDEO-SPANISH VARIKA 00A4 ; [.18D6.0020.0002] # CURRENCY SIGN 00A2 ; [.18D7.0020.0002] # CENT SIGN 0024 ; [.18D8.0020.0002] # DOLLAR SIGN 00A3 ; [.18D9.0020.0002] # POUND SIGN 00A5 ; [.18DA.0020.0002] # YEN SIGN 0030 ; [.1902.0020.0002] # DIGIT ZERO 1F100 ; [.1902.0020.0004][*0274.0020.0004] # DIGIT ZERO FULL STOP 1F101 ; [.1902.0020.0004][*0221.0020.0004] # DIGIT ZERO COMMA 1D7CE ; [.1902.0020.0005] # MATHEMATICAL BOLD DIGIT ZERO 1D7D8 ; [.1902.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO 1D7E2 ; [.1902.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ZERO 1D7EC ; [.1902.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO 1D7F6 ; [.1902.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ZERO 24EA ; [.1902.0020.0006] # CIRCLED DIGIT ZERO 24FF ; [.1902.0020.0006] # NEGATIVE CIRCLED DIGIT ZERO 1F10B ; [.1902.0020.0006] # DINGBAT CIRCLED SANS-SERIF DIGIT ZERO 1F10C ; [.1902.0020.0006] # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO 2070 ; [.1902.0020.0014] # SUPERSCRIPT ZERO 2080 ; [.1902.0020.0015] # SUBSCRIPT ZERO 0031 ; [.1903.0020.0002] # DIGIT ONE 2474 ; [*030A.0020.0004][.1903.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT ONE 2488 ; [.1903.0020.0004][*0274.0020.0004] # DIGIT ONE FULL STOP 1F102 ; [.1903.0020.0004][*0221.0020.0004] # DIGIT ONE COMMA 1D7CF ; [.1903.0020.0005] # MATHEMATICAL BOLD DIGIT ONE 1D7D9 ; [.1903.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT ONE 1D7E3 ; [.1903.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT ONE 1D7ED ; [.1903.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT ONE 1D7F7 ; [.1903.0020.0005] # MATHEMATICAL MONOSPACE DIGIT ONE 2460 ; [.1903.0020.0006] # CIRCLED DIGIT ONE 24F5 ; [.1903.0020.0006] # DOUBLE CIRCLED DIGIT ONE 00B9 ; [.1903.0020.0014] # SUPERSCRIPT ONE 2081 ; [.1903.0020.0015] # SUBSCRIPT ONE 247D ; [*030A.0020.0004][.1903.0020.0004][.1902.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER TEN 2491 ; [.1903.0020.0004][.1902.0020.0004][*0274.0020.0004] # NUMBER TEN FULL STOP 2469 ; [.1903.0020.0006][.1902.0020.0006] # CIRCLED NUMBER TEN 24FE ; [.1903.0020.0006][.1902.0020.0006] # DOUBLE CIRCLED NUMBER TEN 247E ; [*030A.0020.0004][.1903.0020.0004][.1903.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER ELEVEN 2492 ; [.1903.0020.0004][.1903.0020.0004][*0274.0020.0004] # NUMBER ELEVEN FULL STOP 246A ; [.1903.0020.0006][.1903.0020.0006] # CIRCLED NUMBER ELEVEN 24EB ; [.1903.0020.0006][.1903.0020.0006] # NEGATIVE CIRCLED NUMBER ELEVEN 247F ; [*030A.0020.0004][.1903.0020.0004][.1904.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER TWELVE 2493 ; [.1903.0020.0004][.1904.0020.0004][*0274.0020.0004] # NUMBER TWELVE FULL STOP 246B ; [.1903.0020.0006][.1904.0020.0006] # CIRCLED NUMBER TWELVE 24EC ; [.1903.0020.0006][.1904.0020.0006] # NEGATIVE CIRCLED NUMBER TWELVE 00BD ; [.1903.0020.001E][*05E6.0020.001E][.1904.0020.001E] # VULGAR FRACTION ONE HALF 2480 ; [*030A.0020.0004][.1903.0020.0004][.1905.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER THIRTEEN 2494 ; [.1903.0020.0004][.1905.0020.0004][*0274.0020.0004] # NUMBER THIRTEEN FULL STOP 246C ; [.1903.0020.0006][.1905.0020.0006] # CIRCLED NUMBER THIRTEEN 24ED ; [.1903.0020.0006][.1905.0020.0006] # NEGATIVE CIRCLED NUMBER THIRTEEN 2481 ; [*030A.0020.0004][.1903.0020.0004][.1906.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER FOURTEEN 2495 ; [.1903.0020.0004][.1906.0020.0004][*0274.0020.0004] # NUMBER FOURTEEN FULL STOP 246D ; [.1903.0020.0006][.1906.0020.0006] # CIRCLED NUMBER FOURTEEN 24EE ; [.1903.0020.0006][.1906.0020.0006] # NEGATIVE CIRCLED NUMBER FOURTEEN 00BC ; [.1903.0020.001E][*05E6.0020.001E][.1906.0020.001E] # VULGAR FRACTION ONE QUARTER 2482 ; [*030A.0020.0004][.1903.0020.0004][.1907.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER FIFTEEN 2496 ; [.1903.0020.0004][.1907.0020.0004][*0274.0020.0004] # NUMBER FIFTEEN FULL STOP 246E ; [.1903.0020.0006][.1907.0020.0006] # CIRCLED NUMBER FIFTEEN 24EF ; [.1903.0020.0006][.1907.0020.0006] # NEGATIVE CIRCLED NUMBER FIFTEEN 2483 ; [*030A.0020.0004][.1903.0020.0004][.1908.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER SIXTEEN 2497 ; [.1903.0020.0004][.1908.0020.0004][*0274.0020.0004] # NUMBER SIXTEEN FULL STOP 246F ; [.1903.0020.0006][.1908.0020.0006] # CIRCLED NUMBER SIXTEEN 24F0 ; [.1903.0020.0006][.1908.0020.0006] # NEGATIVE CIRCLED NUMBER SIXTEEN 2484 ; [*030A.0020.0004][.1903.0020.0004][.1909.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER SEVENTEEN 2498 ; [.1903.0020.0004][.1909.0020.0004][*0274.0020.0004] # NUMBER SEVENTEEN FULL STOP 2470 ; [.1903.0020.0006][.1909.0020.0006] # CIRCLED NUMBER SEVENTEEN 24F1 ; [.1903.0020.0006][.1909.0020.0006] # NEGATIVE CIRCLED NUMBER SEVENTEEN 2485 ; [*030A.0020.0004][.1903.0020.0004][.190A.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER EIGHTEEN 2499 ; [.1903.0020.0004][.190A.0020.0004][*0274.0020.0004] # NUMBER EIGHTEEN FULL STOP 2471 ; [.1903.0020.0006][.190A.0020.0006] # CIRCLED NUMBER EIGHTEEN 24F2 ; [.1903.0020.0006][.190A.0020.0006] # NEGATIVE CIRCLED NUMBER EIGHTEEN 2486 ; [*030A.0020.0004][.1903.0020.0004][.190B.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER NINETEEN 249A ; [.1903.0020.0004][.190B.0020.0004][*0274.0020.0004] # NUMBER NINETEEN FULL STOP 2472 ; [.1903.0020.0006][.190B.0020.0006] # CIRCLED NUMBER NINETEEN 24F3 ; [.1903.0020.0006][.190B.0020.0006] # NEGATIVE CIRCLED NUMBER NINETEEN 0032 ; [.1904.0020.0002] # DIGIT TWO 2475 ; [*030A.0020.0004][.1904.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT TWO 2489 ; [.1904.0020.0004][*0274.0020.0004] # DIGIT TWO FULL STOP 1F103 ; [.1904.0020.0004][*0221.0020.0004] # DIGIT TWO COMMA 1D7D0 ; [.1904.0020.0005] # MATHEMATICAL BOLD DIGIT TWO 1D7DA ; [.1904.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT TWO 1D7E4 ; [.1904.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT TWO 1D7EE ; [.1904.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT TWO 1D7F8 ; [.1904.0020.0005] # MATHEMATICAL MONOSPACE DIGIT TWO 2461 ; [.1904.0020.0006] # CIRCLED DIGIT TWO 24F6 ; [.1904.0020.0006] # DOUBLE CIRCLED DIGIT TWO 00B2 ; [.1904.0020.0014] # SUPERSCRIPT TWO 2082 ; [.1904.0020.0015] # SUBSCRIPT TWO 2487 ; [*030A.0020.0004][.1904.0020.0004][.1902.0020.0004][*030B.0020.0004] # PARENTHESIZED NUMBER TWENTY 249B ; [.1904.0020.0004][.1902.0020.0004][*0274.0020.0004] # NUMBER TWENTY FULL STOP 2473 ; [.1904.0020.0006][.1902.0020.0006] # CIRCLED NUMBER TWENTY 24F4 ; [.1904.0020.0006][.1902.0020.0006] # NEGATIVE CIRCLED NUMBER TWENTY 0033 ; [.1905.0020.0002] # DIGIT THREE 2476 ; [*030A.0020.0004][.1905.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT THREE 248A ; [.1905.0020.0004][*0274.0020.0004] # DIGIT THREE FULL STOP 1F104 ; [.1905.0020.0004][*0221.0020.0004] # DIGIT THREE COMMA 1D7D1 ; [.1905.0020.0005] # MATHEMATICAL BOLD DIGIT THREE 1D7DB ; [.1905.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT THREE 1D7E5 ; [.1905.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT THREE 1D7EF ; [.1905.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT THREE 1D7F9 ; [.1905.0020.0005] # MATHEMATICAL MONOSPACE DIGIT THREE 2462 ; [.1905.0020.0006] # CIRCLED DIGIT THREE 24F7 ; [.1905.0020.0006] # DOUBLE CIRCLED DIGIT THREE 00B3 ; [.1905.0020.0014] # SUPERSCRIPT THREE 2083 ; [.1905.0020.0015] # SUBSCRIPT THREE 00BE ; [.1905.0020.001E][*05E6.0020.001E][.1906.0020.001E] # VULGAR FRACTION THREE QUARTERS 0034 ; [.1906.0020.0002] # DIGIT FOUR 2477 ; [*030A.0020.0004][.1906.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT FOUR 248B ; [.1906.0020.0004][*0274.0020.0004] # DIGIT FOUR FULL STOP 1F105 ; [.1906.0020.0004][*0221.0020.0004] # DIGIT FOUR COMMA 1D7D2 ; [.1906.0020.0005] # MATHEMATICAL BOLD DIGIT FOUR 1D7DC ; [.1906.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR 1D7E6 ; [.1906.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FOUR 1D7F0 ; [.1906.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR 1D7FA ; [.1906.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FOUR 2463 ; [.1906.0020.0006] # CIRCLED DIGIT FOUR 24F8 ; [.1906.0020.0006] # DOUBLE CIRCLED DIGIT FOUR 2074 ; [.1906.0020.0014] # SUPERSCRIPT FOUR 2084 ; [.1906.0020.0015] # SUBSCRIPT FOUR 0035 ; [.1907.0020.0002] # DIGIT FIVE 2478 ; [*030A.0020.0004][.1907.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT FIVE 248C ; [.1907.0020.0004][*0274.0020.0004] # DIGIT FIVE FULL STOP 1F106 ; [.1907.0020.0004][*0221.0020.0004] # DIGIT FIVE COMMA 1D7D3 ; [.1907.0020.0005] # MATHEMATICAL BOLD DIGIT FIVE 1D7DD ; [.1907.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE 1D7E7 ; [.1907.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT FIVE 1D7F1 ; [.1907.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE 1D7FB ; [.1907.0020.0005] # MATHEMATICAL MONOSPACE DIGIT FIVE 2464 ; [.1907.0020.0006] # CIRCLED DIGIT FIVE 24F9 ; [.1907.0020.0006] # DOUBLE CIRCLED DIGIT FIVE 2075 ; [.1907.0020.0014] # SUPERSCRIPT FIVE 2085 ; [.1907.0020.0015] # SUBSCRIPT FIVE 0036 ; [.1908.0020.0002] # DIGIT SIX 2479 ; [*030A.0020.0004][.1908.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT SIX 248D ; [.1908.0020.0004][*0274.0020.0004] # DIGIT SIX FULL STOP 1F107 ; [.1908.0020.0004][*0221.0020.0004] # DIGIT SIX COMMA 1D7D4 ; [.1908.0020.0005] # MATHEMATICAL BOLD DIGIT SIX 1D7DE ; [.1908.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SIX 1D7E8 ; [.1908.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SIX 1D7F2 ; [.1908.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SIX 1D7FC ; [.1908.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SIX 2465 ; [.1908.0020.0006] # CIRCLED DIGIT SIX 24FA ; [.1908.0020.0006] # DOUBLE CIRCLED DIGIT SIX 2076 ; [.1908.0020.0014] # SUPERSCRIPT SIX 2086 ; [.1908.0020.0015] # SUBSCRIPT SIX 0037 ; [.1909.0020.0002] # DIGIT SEVEN 247A ; [*030A.0020.0004][.1909.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT SEVEN 248E ; [.1909.0020.0004][*0274.0020.0004] # DIGIT SEVEN FULL STOP 1F108 ; [.1909.0020.0004][*0221.0020.0004] # DIGIT SEVEN COMMA 1D7D5 ; [.1909.0020.0005] # MATHEMATICAL BOLD DIGIT SEVEN 1D7DF ; [.1909.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN 1D7E9 ; [.1909.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT SEVEN 1D7F3 ; [.1909.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN 1D7FD ; [.1909.0020.0005] # MATHEMATICAL MONOSPACE DIGIT SEVEN 2466 ; [.1909.0020.0006] # CIRCLED DIGIT SEVEN 24FB ; [.1909.0020.0006] # DOUBLE CIRCLED DIGIT SEVEN 2077 ; [.1909.0020.0014] # SUPERSCRIPT SEVEN 2087 ; [.1909.0020.0015] # SUBSCRIPT SEVEN 0038 ; [.190A.0020.0002] # DIGIT EIGHT 247B ; [*030A.0020.0004][.190A.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT EIGHT 248F ; [.190A.0020.0004][*0274.0020.0004] # DIGIT EIGHT FULL STOP 1F109 ; [.190A.0020.0004][*0221.0020.0004] # DIGIT EIGHT COMMA 1D7D6 ; [.190A.0020.0005] # MATHEMATICAL BOLD DIGIT EIGHT 1D7E0 ; [.190A.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT 1D7EA ; [.190A.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT EIGHT 1D7F4 ; [.190A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT 1D7FE ; [.190A.0020.0005] # MATHEMATICAL MONOSPACE DIGIT EIGHT 2467 ; [.190A.0020.0006] # CIRCLED DIGIT EIGHT 24FC ; [.190A.0020.0006] # DOUBLE CIRCLED DIGIT EIGHT 2078 ; [.190A.0020.0014] # SUPERSCRIPT EIGHT 2088 ; [.190A.0020.0015] # SUBSCRIPT EIGHT 0039 ; [.190B.0020.0002] # DIGIT NINE 247C ; [*030A.0020.0004][.190B.0020.0004][*030B.0020.0004] # PARENTHESIZED DIGIT NINE 2490 ; [.190B.0020.0004][*0274.0020.0004] # DIGIT NINE FULL STOP 1F10A ; [.190B.0020.0004][*0221.0020.0004] # DIGIT NINE COMMA 1D7D7 ; [.190B.0020.0005] # MATHEMATICAL BOLD DIGIT NINE 1D7E1 ; [.190B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK DIGIT NINE 1D7EB ; [.190B.0020.0005] # MATHEMATICAL SANS-SERIF DIGIT NINE 1D7F5 ; [.190B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD DIGIT NINE 1D7FF ; [.190B.0020.0005] # MATHEMATICAL MONOSPACE DIGIT NINE 2468 ; [.190B.0020.0006] # CIRCLED DIGIT NINE 24FD ; [.190B.0020.0006] # DOUBLE CIRCLED DIGIT NINE 2079 ; [.190B.0020.0014] # SUPERSCRIPT NINE 2089 ; [.190B.0020.0015] # SUBSCRIPT NINE 0061 ; [.190C.0020.0002] # LATIN SMALL LETTER A 249C ; [*030A.0020.0004][.190C.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER A 1D41A ; [.190C.0020.0005] # MATHEMATICAL BOLD SMALL A 1D44E ; [.190C.0020.0005] # MATHEMATICAL ITALIC SMALL A 1D482 ; [.190C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL A 1D4B6 ; [.190C.0020.0005] # MATHEMATICAL SCRIPT SMALL A 1D4EA ; [.190C.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL A 1D51E ; [.190C.0020.0005] # MATHEMATICAL FRAKTUR SMALL A 1D552 ; [.190C.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL A 1D586 ; [.190C.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL A 1D5BA ; [.190C.0020.0005] # MATHEMATICAL SANS-SERIF SMALL A 1D5EE ; [.190C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL A 1D622 ; [.190C.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL A 1D656 ; [.190C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A 1D68A ; [.190C.0020.0005] # MATHEMATICAL MONOSPACE SMALL A 24D0 ; [.190C.0020.0006] # CIRCLED LATIN SMALL LETTER A 0041 ; [.190C.0020.0008] # LATIN CAPITAL LETTER A 1F110 ; [*030A.0020.0004][.190C.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER A 1D400 ; [.190C.0020.000B] # MATHEMATICAL BOLD CAPITAL A 1D434 ; [.190C.0020.000B] # MATHEMATICAL ITALIC CAPITAL A 1D468 ; [.190C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL A 1D49C ; [.190C.0020.000B] # MATHEMATICAL SCRIPT CAPITAL A 1D4D0 ; [.190C.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL A 1D504 ; [.190C.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL A 1D538 ; [.190C.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL A 1D56C ; [.190C.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL A 1D5A0 ; [.190C.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL A 1D5D4 ; [.190C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL A 1D608 ; [.190C.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL A 1D63C ; [.190C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A 1D670 ; [.190C.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL A 24B6 ; [.190C.0020.000C] # CIRCLED LATIN CAPITAL LETTER A 1F150 ; [.190C.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER A 00AA ; [.190C.0020.0014] # FEMININE ORDINAL INDICATOR 1D43 ; [.190C.0020.0014] # MODIFIER LETTER SMALL A 2090 ; [.190C.0020.0015] # LATIN SUBSCRIPT SMALL LETTER A 1D2C ; [.190C.0020.001D] # MODIFIER LETTER CAPITAL A 1F130 ; [.190C.0020.001D] # SQUARED LATIN CAPITAL LETTER A 1F170 ; [.190C.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER A 00E1 ; [.190C.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH ACUTE 00C1 ; [.190C.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH ACUTE 00E0 ; [.190C.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH GRAVE 00C0 ; [.190C.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH GRAVE 0103 ; [.190C.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE 0102 ; [.190C.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE 1EAF ; [.190C.0020.0002][.0000.0026.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH BREVE AND ACUTE 1EAE ; [.190C.0020.0008][.0000.0026.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE 1EB1 ; [.190C.0020.0002][.0000.0026.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH BREVE AND GRAVE 1EB0 ; [.190C.0020.0008][.0000.0026.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE 1EB5 ; [.190C.0020.0002][.0000.0026.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH BREVE AND TILDE 1EB4 ; [.190C.0020.0008][.0000.0026.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH BREVE AND TILDE 1EB3 ; [.190C.0020.0002][.0000.0026.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE 1EB2 ; [.190C.0020.0008][.0000.0026.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE 00E2 ; [.190C.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX 00C2 ; [.190C.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX 1EA5 ; [.190C.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE 1EA4 ; [.190C.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE 1EA7 ; [.190C.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE 1EA6 ; [.190C.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE 1EAB ; [.190C.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE 1EAA ; [.190C.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE 1EA9 ; [.190C.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE 1EA8 ; [.190C.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE 01CE ; [.190C.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER A WITH CARON 01CD ; [.190C.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER A WITH CARON 00E5 ; [.190C.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER A WITH RING ABOVE 00C5 ; [.190C.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE 212B ; [.190C.0020.0008][.0000.0029.0002] # ANGSTROM SIGN 01FB ; [.190C.0020.0002][.0000.0029.0002][.0000.0024.0002] # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE 01FA ; [.190C.0020.0008][.0000.0029.0002][.0000.0024.0002] # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE 00E4 ; [.190C.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER A WITH DIAERESIS A79B ; [.190C.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK AE 00C4 ; [.190C.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS A79A ; [.190C.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK AE 01DF ; [.190C.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON 01DE ; [.190C.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON 00E3 ; [.190C.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER A WITH TILDE 00C3 ; [.190C.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER A WITH TILDE 0227 ; [.190C.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER A WITH DOT ABOVE 0226 ; [.190C.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE 01E1 ; [.190C.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON 01E0 ; [.190C.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON 0105 ; [.190C.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER A WITH OGONEK 0104 ; [.190C.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER A WITH OGONEK 0101 ; [.190C.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER A WITH MACRON 0100 ; [.190C.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER A WITH MACRON 1EA3 ; [.190C.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER A WITH HOOK ABOVE 1EA2 ; [.190C.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER A WITH HOOK ABOVE 0201 ; [.190C.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER A WITH DOUBLE GRAVE 0200 ; [.190C.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE 0203 ; [.190C.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER A WITH INVERTED BREVE 0202 ; [.190C.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER A WITH INVERTED BREVE 1EA1 ; [.190C.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER A WITH DOT BELOW 1EA0 ; [.190C.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER A WITH DOT BELOW 1EB7 ; [.190C.0020.0002][.0000.0042.0002][.0000.0026.0002] # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW 1EB6 ; [.190C.0020.0008][.0000.0042.0002][.0000.0026.0002] # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW 1EAD ; [.190C.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW 1EAC ; [.190C.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW 1E01 ; [.190C.0020.0002][.0000.0044.0002] # LATIN SMALL LETTER A WITH RING BELOW 1E00 ; [.190C.0020.0008][.0000.0044.0002] # LATIN CAPITAL LETTER A WITH RING BELOW A733 ; [.190C.0020.0004][.190C.0020.0004] # LATIN SMALL LETTER AA A732 ; [.190C.0020.000A][.190C.0020.000A] # LATIN CAPITAL LETTER AA 1F18E ; [.190C.0020.001D][.1925.0020.001D] # NEGATIVE SQUARED AB 2100 ; [.190C.0020.0004][*0387.0020.0004][.193E.0020.0004] # ACCOUNT OF 00E6 ; [.190C.0020.0004][.0000.0108.0004][.196E.0020.0004] # LATIN SMALL LETTER AE 00C6 ; [.190C.0020.000A][.0000.0108.0004][.196E.0020.000A] # LATIN CAPITAL LETTER AE 1D2D ; [.190C.0020.0014][.0000.0108.0014][.196E.0020.0014] # MODIFIER LETTER CAPITAL AE 01FD ; [.190C.0020.0004][.0000.0108.0004][.196E.0020.0004][.0000.0024.0002] # LATIN SMALL LETTER AE WITH ACUTE 01FC ; [.190C.0020.000A][.0000.0108.0004][.196E.0020.000A][.0000.0024.0002] # LATIN CAPITAL LETTER AE WITH ACUTE 01E3 ; [.190C.0020.0004][.0000.0108.0004][.196E.0020.0004][.0000.0032.0002] # LATIN SMALL LETTER AE WITH MACRON 01E2 ; [.190C.0020.000A][.0000.0108.0004][.196E.0020.000A][.0000.0032.0002] # LATIN CAPITAL LETTER AE WITH MACRON A735 ; [.190C.0020.0004][.1AA1.0020.0004] # LATIN SMALL LETTER AO A734 ; [.190C.0020.000A][.1AA1.0020.000A] # LATIN CAPITAL LETTER AO 2101 ; [.190C.0020.0004][*0387.0020.0004][.1B33.0020.0004] # ADDRESSED TO THE SUBJECT 214D ; [.190C.0020.000A][*0387.0020.0004][.1B33.0020.000A] # AKTIESELSKAB A737 ; [.190C.0020.0004][.1B77.0020.0004] # LATIN SMALL LETTER AU A736 ; [.190C.0020.000A][.1B77.0020.000A] # LATIN CAPITAL LETTER AU A739 ; [.190C.0020.0004][.1BA5.0020.0004] # LATIN SMALL LETTER AV A738 ; [.190C.0020.000A][.1BA5.0020.000A] # LATIN CAPITAL LETTER AV A73B ; [.190C.0020.0004][.0000.0108.0004][.1BA5.0020.0004] # LATIN SMALL LETTER AV WITH HORIZONTAL BAR A73A ; [.190C.0020.000A][.0000.0108.0004][.1BA5.0020.000A] # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR A73D ; [.190C.0020.0004][.1BCD.0020.0004] # LATIN SMALL LETTER AY A73C ; [.190C.0020.000A][.1BCD.0020.000A] # LATIN CAPITAL LETTER AY 1E9A ; [.190C.0020.0004][.1C3F.0020.0004] # LATIN SMALL LETTER A WITH RIGHT HALF RING 1D00 ; [.1910.0020.0002] # LATIN LETTER SMALL CAPITAL A 2C65 ; [.1911.0020.0002] # LATIN SMALL LETTER A WITH STROKE 023A ; [.1911.0020.0008] # LATIN CAPITAL LETTER A WITH STROKE 1D8F ; [.1912.0020.0002] # LATIN SMALL LETTER A WITH RETROFLEX HOOK 1D01 ; [.1913.0020.0002] # LATIN LETTER SMALL CAPITAL AE 1D02 ; [.1914.0020.0002] # LATIN SMALL LETTER TURNED AE 1D46 ; [.1914.0020.0014] # MODIFIER LETTER SMALL TURNED AE 0250 ; [.1916.0020.0002] # LATIN SMALL LETTER TURNED A 2C6F ; [.1916.0020.0008] # LATIN CAPITAL LETTER TURNED A 1D44 ; [.1916.0020.0014] # MODIFIER LETTER SMALL TURNED A 0251 ; [.191A.0020.0002] # LATIN SMALL LETTER ALPHA 2C6D ; [.191A.0020.0008] # LATIN CAPITAL LETTER ALPHA 1D45 ; [.191A.0020.0014] # MODIFIER LETTER SMALL ALPHA 1D90 ; [.191F.0020.0002] # LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK 0252 ; [.1920.0020.0002] # LATIN SMALL LETTER TURNED ALPHA 2C70 ; [.1920.0020.0008] # LATIN CAPITAL LETTER TURNED ALPHA 1D9B ; [.1920.0020.0014] # MODIFIER LETTER SMALL TURNED ALPHA 0062 ; [.1925.0020.0002] # LATIN SMALL LETTER B 249D ; [*030A.0020.0004][.1925.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER B 1D41B ; [.1925.0020.0005] # MATHEMATICAL BOLD SMALL B 1D44F ; [.1925.0020.0005] # MATHEMATICAL ITALIC SMALL B 1D483 ; [.1925.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL B 1D4B7 ; [.1925.0020.0005] # MATHEMATICAL SCRIPT SMALL B 1D4EB ; [.1925.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL B 1D51F ; [.1925.0020.0005] # MATHEMATICAL FRAKTUR SMALL B 1D553 ; [.1925.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL B 1D587 ; [.1925.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL B 1D5BB ; [.1925.0020.0005] # MATHEMATICAL SANS-SERIF SMALL B 1D5EF ; [.1925.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL B 1D623 ; [.1925.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL B 1D657 ; [.1925.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B 1D68B ; [.1925.0020.0005] # MATHEMATICAL MONOSPACE SMALL B 24D1 ; [.1925.0020.0006] # CIRCLED LATIN SMALL LETTER B 0042 ; [.1925.0020.0008] # LATIN CAPITAL LETTER B 1F111 ; [*030A.0020.0004][.1925.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER B 212C ; [.1925.0020.000B] # SCRIPT CAPITAL B 1D401 ; [.1925.0020.000B] # MATHEMATICAL BOLD CAPITAL B 1D435 ; [.1925.0020.000B] # MATHEMATICAL ITALIC CAPITAL B 1D469 ; [.1925.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL B 1D4D1 ; [.1925.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL B 1D505 ; [.1925.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL B 1D539 ; [.1925.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL B 1D56D ; [.1925.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL B 1D5A1 ; [.1925.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL B 1D5D5 ; [.1925.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL B 1D609 ; [.1925.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL B 1D63D ; [.1925.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B 1D671 ; [.1925.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL B 24B7 ; [.1925.0020.000C] # CIRCLED LATIN CAPITAL LETTER B 1F151 ; [.1925.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER B 1D47 ; [.1925.0020.0014] # MODIFIER LETTER SMALL B 1D2E ; [.1925.0020.001D] # MODIFIER LETTER CAPITAL B 1F131 ; [.1925.0020.001D] # SQUARED LATIN CAPITAL LETTER B 1F171 ; [.1925.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER B 1E03 ; [.1925.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER B WITH DOT ABOVE 1E02 ; [.1925.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER B WITH DOT ABOVE 1E05 ; [.1925.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER B WITH DOT BELOW 1E04 ; [.1925.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER B WITH DOT BELOW 1E07 ; [.1925.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER B WITH LINE BELOW 1E06 ; [.1925.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER B WITH LINE BELOW 0299 ; [.1929.0020.0002] # LATIN LETTER SMALL CAPITAL B 0180 ; [.192D.0020.0002] # LATIN SMALL LETTER B WITH STROKE 0243 ; [.192D.0020.0008] # LATIN CAPITAL LETTER B WITH STROKE 1D2F ; [.1931.0020.0002] # MODIFIER LETTER CAPITAL BARRED B 1D03 ; [.1932.0020.0002] # LATIN LETTER SMALL CAPITAL BARRED B 1D6C ; [.1933.0020.0002] # LATIN SMALL LETTER B WITH MIDDLE TILDE A797 ; [.1934.0020.0002] # LATIN SMALL LETTER B WITH FLOURISH A796 ; [.1934.0020.0008] # LATIN CAPITAL LETTER B WITH FLOURISH 1D80 ; [.1935.0020.0002] # LATIN SMALL LETTER B WITH PALATAL HOOK 0253 ; [.1936.0020.0002] # LATIN SMALL LETTER B WITH HOOK 0181 ; [.1936.0020.0008] # LATIN CAPITAL LETTER B WITH HOOK 0183 ; [.193A.0020.0002] # LATIN SMALL LETTER B WITH TOPBAR 0182 ; [.193A.0020.0008] # LATIN CAPITAL LETTER B WITH TOPBAR 0063 ; [.193E.0020.0002] # LATIN SMALL LETTER C 249E ; [*030A.0020.0004][.193E.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER C 1D41C ; [.193E.0020.0005] # MATHEMATICAL BOLD SMALL C 1D450 ; [.193E.0020.0005] # MATHEMATICAL ITALIC SMALL C 1D484 ; [.193E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL C 1D4B8 ; [.193E.0020.0005] # MATHEMATICAL SCRIPT SMALL C 1D4EC ; [.193E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL C 1D520 ; [.193E.0020.0005] # MATHEMATICAL FRAKTUR SMALL C 1D554 ; [.193E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL C 1D588 ; [.193E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL C 1D5BC ; [.193E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL C 1D5F0 ; [.193E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL C 1D624 ; [.193E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL C 1D658 ; [.193E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C 1D68C ; [.193E.0020.0005] # MATHEMATICAL MONOSPACE SMALL C 24D2 ; [.193E.0020.0006] # CIRCLED LATIN SMALL LETTER C 0043 ; [.193E.0020.0008] # LATIN CAPITAL LETTER C 2103 ; [*04BA.0020.0004][.193E.0020.000A] # DEGREE CELSIUS 1F112 ; [*030A.0020.0004][.193E.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER C 2102 ; [.193E.0020.000B] # DOUBLE-STRUCK CAPITAL C 212D ; [.193E.0020.000B] # BLACK-LETTER CAPITAL C 1D402 ; [.193E.0020.000B] # MATHEMATICAL BOLD CAPITAL C 1D436 ; [.193E.0020.000B] # MATHEMATICAL ITALIC CAPITAL C 1D46A ; [.193E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL C 1D49E ; [.193E.0020.000B] # MATHEMATICAL SCRIPT CAPITAL C 1D4D2 ; [.193E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL C 1D56E ; [.193E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL C 1D5A2 ; [.193E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL C 1D5D6 ; [.193E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL C 1D60A ; [.193E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL C 1D63E ; [.193E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C 1D672 ; [.193E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL C 24B8 ; [.193E.0020.000C] # CIRCLED LATIN CAPITAL LETTER C 1F12B ; [.193E.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER C 1F152 ; [.193E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER C 1D9C ; [.193E.0020.0014] # MODIFIER LETTER SMALL C 1F132 ; [.193E.0020.001D] # SQUARED LATIN CAPITAL LETTER C 1F172 ; [.193E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER C 0107 ; [.193E.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH ACUTE 0106 ; [.193E.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH ACUTE 0109 ; [.193E.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER C WITH CIRCUMFLEX 0108 ; [.193E.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER C WITH CIRCUMFLEX 010D ; [.193E.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER C WITH CARON 010C ; [.193E.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER C WITH CARON 010B ; [.193E.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER C WITH DOT ABOVE 010A ; [.193E.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER C WITH DOT ABOVE 00E7 ; [.193E.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER C WITH CEDILLA 00C7 ; [.193E.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER C WITH CEDILLA 1E09 ; [.193E.0020.0002][.0000.0030.0002][.0000.0024.0002] # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE 1E08 ; [.193E.0020.0008][.0000.0030.0002][.0000.0024.0002] # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE 1F12D ; [.193E.0020.000C][.1953.0020.000C] # CIRCLED CD 1F191 ; [.193E.0020.001D][.1A3B.0020.001D] # SQUARED CL 2105 ; [.193E.0020.0004][*0387.0020.0004][.1AA1.0020.0004] # CARE OF 1F192 ; [.193E.0020.001D][.1AA1.0020.001D][.1AA1.0020.001D][.1A3B.0020.001D] # SQUARED COOL 2106 ; [.193E.0020.0004][*0387.0020.0004][.1B77.0020.0004] # CADA UNA 1D04 ; [.1942.0020.0002] # LATIN LETTER SMALL CAPITAL C 023C ; [.1943.0020.0002] # LATIN SMALL LETTER C WITH STROKE 023B ; [.1943.0020.0008] # LATIN CAPITAL LETTER C WITH STROKE A793 ; [.1947.0020.0002] # LATIN SMALL LETTER C WITH BAR A792 ; [.1947.0020.0008] # LATIN CAPITAL LETTER C WITH BAR A794 ; [.1948.0020.0002] # LATIN SMALL LETTER C WITH PALATAL HOOK 0188 ; [.1949.0020.0002] # LATIN SMALL LETTER C WITH HOOK 0187 ; [.1949.0020.0008] # LATIN CAPITAL LETTER C WITH HOOK 0255 ; [.194D.0020.0002] # LATIN SMALL LETTER C WITH CURL 1D9D ; [.194D.0020.0014] # MODIFIER LETTER SMALL C WITH CURL A73F ; [.1952.0020.0002] # LATIN SMALL LETTER REVERSED C WITH DOT A73E ; [.1952.0020.0008] # LATIN CAPITAL LETTER REVERSED C WITH DOT 0064 ; [.1953.0020.0002] # LATIN SMALL LETTER D 249F ; [*030A.0020.0004][.1953.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER D 2146 ; [.1953.0020.0005] # DOUBLE-STRUCK ITALIC SMALL D 1D41D ; [.1953.0020.0005] # MATHEMATICAL BOLD SMALL D 1D451 ; [.1953.0020.0005] # MATHEMATICAL ITALIC SMALL D 1D485 ; [.1953.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL D 1D4B9 ; [.1953.0020.0005] # MATHEMATICAL SCRIPT SMALL D 1D4ED ; [.1953.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL D 1D521 ; [.1953.0020.0005] # MATHEMATICAL FRAKTUR SMALL D 1D555 ; [.1953.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL D 1D589 ; [.1953.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL D 1D5BD ; [.1953.0020.0005] # MATHEMATICAL SANS-SERIF SMALL D 1D5F1 ; [.1953.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL D 1D625 ; [.1953.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL D 1D659 ; [.1953.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D 1D68D ; [.1953.0020.0005] # MATHEMATICAL MONOSPACE SMALL D 24D3 ; [.1953.0020.0006] # CIRCLED LATIN SMALL LETTER D 0044 ; [.1953.0020.0008] # LATIN CAPITAL LETTER D 1F113 ; [*030A.0020.0004][.1953.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER D 2145 ; [.1953.0020.000B] # DOUBLE-STRUCK ITALIC CAPITAL D 1D403 ; [.1953.0020.000B] # MATHEMATICAL BOLD CAPITAL D 1D437 ; [.1953.0020.000B] # MATHEMATICAL ITALIC CAPITAL D 1D46B ; [.1953.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL D 1D49F ; [.1953.0020.000B] # MATHEMATICAL SCRIPT CAPITAL D 1D4D3 ; [.1953.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL D 1D507 ; [.1953.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL D 1D53B ; [.1953.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL D 1D56F ; [.1953.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL D 1D5A3 ; [.1953.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL D 1D5D7 ; [.1953.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL D 1D60B ; [.1953.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL D 1D63F ; [.1953.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D 1D673 ; [.1953.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL D 24B9 ; [.1953.0020.000C] # CIRCLED LATIN CAPITAL LETTER D 1F153 ; [.1953.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER D 1D48 ; [.1953.0020.0014] # MODIFIER LETTER SMALL D 1D30 ; [.1953.0020.001D] # MODIFIER LETTER CAPITAL D 1F133 ; [.1953.0020.001D] # SQUARED LATIN CAPITAL LETTER D 1F173 ; [.1953.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER D 010F ; [.1953.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER D WITH CARON 010E ; [.1953.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER D WITH CARON 1E0B ; [.1953.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER D WITH DOT ABOVE 1E0A ; [.1953.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER D WITH DOT ABOVE 1E11 ; [.1953.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER D WITH CEDILLA 1E10 ; [.1953.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER D WITH CEDILLA 0111 ; [.1953.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER D WITH STROKE 0110 ; [.1953.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER D WITH STROKE 1E0D ; [.1953.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER D WITH DOT BELOW 1E0C ; [.1953.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER D WITH DOT BELOW 1E13 ; [.1953.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW 1E12 ; [.1953.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW 1E0F ; [.1953.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER D WITH LINE BELOW 1E0E ; [.1953.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER D WITH LINE BELOW 00F0 ; [.1953.0020.0004][.0000.0108.0004] # LATIN SMALL LETTER ETH 00D0 ; [.1953.0020.000A][.0000.0108.0004] # LATIN CAPITAL LETTER ETH 1D9E ; [.1953.0020.0014][.0000.0108.0014] # MODIFIER LETTER SMALL ETH A77A ; [.1953.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR D A779 ; [.1953.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR D 0238 ; [.1953.0020.0004][.1925.0020.0004] # LATIN SMALL LETTER DB DIGRAPH 1F190 ; [.1953.0020.001D][.1A10.0020.001D] # SQUARE DJ 01F3 ; [.1953.0020.0004][.1BE3.0020.0004] # LATIN SMALL LETTER DZ 02A3 ; [.1953.0020.0004][.1BE3.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH 01F2 ; [.1953.0020.000A][.1BE3.0020.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z 01F1 ; [.1953.0020.000A][.1BE3.0020.000A] # LATIN CAPITAL LETTER DZ 01C6 ; [.1953.0020.0004][.1BE3.0020.0004][.0000.0028.0004] # LATIN SMALL LETTER DZ WITH CARON 01C5 ; [.1953.0020.000A][.1BE3.0020.0004][.0000.0028.0004] # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON 01C4 ; [.1953.0020.000A][.1BE3.0020.000A][.0000.0028.0004] # LATIN CAPITAL LETTER DZ WITH CARON 02A5 ; [.1953.0020.0004][.1BF6.0020.0004] # LATIN SMALL LETTER DZ DIGRAPH WITH CURL 02A4 ; [.1953.0020.0004][.1C00.0020.0004] # LATIN SMALL LETTER DEZH DIGRAPH 1D05 ; [.1957.0020.0002] # LATIN LETTER SMALL CAPITAL D 1D06 ; [.1958.0020.0002] # LATIN LETTER SMALL CAPITAL ETH 1D6D ; [.1959.0020.0002] # LATIN SMALL LETTER D WITH MIDDLE TILDE 1D81 ; [.195A.0020.0002] # LATIN SMALL LETTER D WITH PALATAL HOOK 0256 ; [.195B.0020.0002] # LATIN SMALL LETTER D WITH TAIL 0189 ; [.195B.0020.0008] # LATIN CAPITAL LETTER AFRICAN D 0257 ; [.195F.0020.0002] # LATIN SMALL LETTER D WITH HOOK 018A ; [.195F.0020.0008] # LATIN CAPITAL LETTER D WITH HOOK 1D91 ; [.1963.0020.0002] # LATIN SMALL LETTER D WITH HOOK AND TAIL 018C ; [.1964.0020.0002] # LATIN SMALL LETTER D WITH TOPBAR 018B ; [.1964.0020.0008] # LATIN CAPITAL LETTER D WITH TOPBAR 0221 ; [.1968.0020.0002] # LATIN SMALL LETTER D WITH CURL A771 ; [.196C.0020.0002] # LATIN SMALL LETTER DUM 1E9F ; [.196D.0020.0002] # LATIN SMALL LETTER DELTA 0065 ; [.196E.0020.0002] # LATIN SMALL LETTER E 24A0 ; [*030A.0020.0004][.196E.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER E 212F ; [.196E.0020.0005] # SCRIPT SMALL E 2147 ; [.196E.0020.0005] # DOUBLE-STRUCK ITALIC SMALL E 1D41E ; [.196E.0020.0005] # MATHEMATICAL BOLD SMALL E 1D452 ; [.196E.0020.0005] # MATHEMATICAL ITALIC SMALL E 1D486 ; [.196E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL E 1D4EE ; [.196E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL E 1D522 ; [.196E.0020.0005] # MATHEMATICAL FRAKTUR SMALL E 1D556 ; [.196E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL E 1D58A ; [.196E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL E 1D5BE ; [.196E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL E 1D5F2 ; [.196E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL E 1D626 ; [.196E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL E 1D65A ; [.196E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E 1D68E ; [.196E.0020.0005] # MATHEMATICAL MONOSPACE SMALL E 24D4 ; [.196E.0020.0006] # CIRCLED LATIN SMALL LETTER E 0045 ; [.196E.0020.0008] # LATIN CAPITAL LETTER E 1F114 ; [*030A.0020.0004][.196E.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER E 2130 ; [.196E.0020.000B] # SCRIPT CAPITAL E 1D404 ; [.196E.0020.000B] # MATHEMATICAL BOLD CAPITAL E 1D438 ; [.196E.0020.000B] # MATHEMATICAL ITALIC CAPITAL E 1D46C ; [.196E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL E 1D4D4 ; [.196E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL E 1D508 ; [.196E.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL E 1D53C ; [.196E.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL E 1D570 ; [.196E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL E 1D5A4 ; [.196E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL E 1D5D8 ; [.196E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL E 1D60C ; [.196E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL E 1D640 ; [.196E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E 1D674 ; [.196E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL E 24BA ; [.196E.0020.000C] # CIRCLED LATIN CAPITAL LETTER E 1F154 ; [.196E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER E 1D49 ; [.196E.0020.0014] # MODIFIER LETTER SMALL E 2091 ; [.196E.0020.0015] # LATIN SUBSCRIPT SMALL LETTER E 1D31 ; [.196E.0020.001D] # MODIFIER LETTER CAPITAL E 1F134 ; [.196E.0020.001D] # SQUARED LATIN CAPITAL LETTER E 1F174 ; [.196E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER E 00E9 ; [.196E.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH ACUTE 00C9 ; [.196E.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH ACUTE 00E8 ; [.196E.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH GRAVE 00C8 ; [.196E.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH GRAVE 0115 ; [.196E.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH BREVE 0114 ; [.196E.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH BREVE 00EA ; [.196E.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX 00CA ; [.196E.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX 1EBF ; [.196E.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE 1EBE ; [.196E.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE 1EC1 ; [.196E.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE 1EC0 ; [.196E.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE 1EC5 ; [.196E.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE 1EC4 ; [.196E.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE 1EC3 ; [.196E.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE 1EC2 ; [.196E.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE 011B ; [.196E.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER E WITH CARON 011A ; [.196E.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER E WITH CARON 00EB ; [.196E.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER E WITH DIAERESIS 00CB ; [.196E.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER E WITH DIAERESIS 1EBD ; [.196E.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER E WITH TILDE 1EBC ; [.196E.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER E WITH TILDE 0117 ; [.196E.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER E WITH DOT ABOVE 0116 ; [.196E.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER E WITH DOT ABOVE 0229 ; [.196E.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER E WITH CEDILLA 0228 ; [.196E.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER E WITH CEDILLA 1E1D ; [.196E.0020.0002][.0000.0030.0002][.0000.0026.0002] # LATIN SMALL LETTER E WITH CEDILLA AND BREVE 1E1C ; [.196E.0020.0008][.0000.0030.0002][.0000.0026.0002] # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE 0119 ; [.196E.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER E WITH OGONEK 0118 ; [.196E.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER E WITH OGONEK 0113 ; [.196E.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER E WITH MACRON 0112 ; [.196E.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER E WITH MACRON 1E17 ; [.196E.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER E WITH MACRON AND ACUTE 1E16 ; [.196E.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE 1E15 ; [.196E.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER E WITH MACRON AND GRAVE 1E14 ; [.196E.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE 1EBB ; [.196E.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER E WITH HOOK ABOVE 1EBA ; [.196E.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER E WITH HOOK ABOVE 0205 ; [.196E.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER E WITH DOUBLE GRAVE 0204 ; [.196E.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE 0207 ; [.196E.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER E WITH INVERTED BREVE 0206 ; [.196E.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER E WITH INVERTED BREVE 1EB9 ; [.196E.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER E WITH DOT BELOW 1EB8 ; [.196E.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER E WITH DOT BELOW 1EC7 ; [.196E.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW 1EC6 ; [.196E.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW 1E19 ; [.196E.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW 1E18 ; [.196E.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW 1E1B ; [.196E.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER E WITH TILDE BELOW 1E1A ; [.196E.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER E WITH TILDE BELOW 1D07 ; [.1972.0020.0002] # LATIN LETTER SMALL CAPITAL E 0247 ; [.1975.0020.0002] # LATIN SMALL LETTER E WITH STROKE 0246 ; [.1975.0020.0008] # LATIN CAPITAL LETTER E WITH STROKE 1D92 ; [.1979.0020.0002] # LATIN SMALL LETTER E WITH RETROFLEX HOOK 2C78 ; [.197B.0020.0002] # LATIN SMALL LETTER E WITH NOTCH 01DD ; [.197C.0020.0002] # LATIN SMALL LETTER TURNED E 018E ; [.197C.0020.0008] # LATIN CAPITAL LETTER REVERSED E 1D32 ; [.197C.0020.001D] # MODIFIER LETTER CAPITAL REVERSED E 2C7B ; [.1980.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED E 0259 ; [.1981.0020.0002] # LATIN SMALL LETTER SCHWA 018F ; [.1981.0020.0008] # LATIN CAPITAL LETTER SCHWA 1D4A ; [.1981.0020.0014] # MODIFIER LETTER SMALL SCHWA 2094 ; [.1981.0020.0015] # LATIN SUBSCRIPT SMALL LETTER SCHWA 1D95 ; [.1985.0020.0002] # LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK 025B ; [.1986.0020.0002] # LATIN SMALL LETTER OPEN E 0190 ; [.1986.0020.0008] # LATIN CAPITAL LETTER OPEN E 2107 ; [.1986.0020.000A] # EULER CONSTANT 1D4B ; [.1986.0020.0014] # MODIFIER LETTER SMALL OPEN E 1D93 ; [.198A.0020.0002] # LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK 0258 ; [.198B.0020.0002] # LATIN SMALL LETTER REVERSED E 025A ; [.198F.0020.0002] # LATIN SMALL LETTER SCHWA WITH HOOK 025C ; [.1993.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E A7AB ; [.1993.0020.0008] # LATIN CAPITAL LETTER REVERSED OPEN E 1D9F ; [.1993.0020.0014] # MODIFIER LETTER SMALL REVERSED OPEN E 1D94 ; [.1997.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK 1D08 ; [.1998.0020.0002] # LATIN SMALL LETTER TURNED OPEN E 1D4C ; [.1998.0020.0014] # MODIFIER LETTER SMALL TURNED OPEN E 025D ; [.1999.0020.0002] # LATIN SMALL LETTER REVERSED OPEN E WITH HOOK 025E ; [.199D.0020.0002] # LATIN SMALL LETTER CLOSED REVERSED OPEN E 029A ; [.19A1.0020.0002] # LATIN SMALL LETTER CLOSED OPEN E 0264 ; [.19A5.0020.0002] # LATIN SMALL LETTER RAMS HORN 0066 ; [.19A9.0020.0002] # LATIN SMALL LETTER F 24A1 ; [*030A.0020.0004][.19A9.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER F 1D41F ; [.19A9.0020.0005] # MATHEMATICAL BOLD SMALL F 1D453 ; [.19A9.0020.0005] # MATHEMATICAL ITALIC SMALL F 1D487 ; [.19A9.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL F 1D4BB ; [.19A9.0020.0005] # MATHEMATICAL SCRIPT SMALL F 1D4EF ; [.19A9.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL F 1D523 ; [.19A9.0020.0005] # MATHEMATICAL FRAKTUR SMALL F 1D557 ; [.19A9.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL F 1D58B ; [.19A9.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL F 1D5BF ; [.19A9.0020.0005] # MATHEMATICAL SANS-SERIF SMALL F 1D5F3 ; [.19A9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL F 1D627 ; [.19A9.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL F 1D65B ; [.19A9.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F 1D68F ; [.19A9.0020.0005] # MATHEMATICAL MONOSPACE SMALL F 24D5 ; [.19A9.0020.0006] # CIRCLED LATIN SMALL LETTER F 0046 ; [.19A9.0020.0008] # LATIN CAPITAL LETTER F 2109 ; [*04BA.0020.0004][.19A9.0020.000A] # DEGREE FAHRENHEIT 1F115 ; [*030A.0020.0004][.19A9.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER F 2131 ; [.19A9.0020.000B] # SCRIPT CAPITAL F 1D405 ; [.19A9.0020.000B] # MATHEMATICAL BOLD CAPITAL F 1D439 ; [.19A9.0020.000B] # MATHEMATICAL ITALIC CAPITAL F 1D46D ; [.19A9.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL F 1D4D5 ; [.19A9.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL F 1D509 ; [.19A9.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL F 1D53D ; [.19A9.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL F 1D571 ; [.19A9.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL F 1D5A5 ; [.19A9.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL F 1D5D9 ; [.19A9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL F 1D60D ; [.19A9.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL F 1D641 ; [.19A9.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F 1D675 ; [.19A9.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL F 24BB ; [.19A9.0020.000C] # CIRCLED LATIN CAPITAL LETTER F 1F155 ; [.19A9.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER F 1DA0 ; [.19A9.0020.0014] # MODIFIER LETTER SMALL F 1F135 ; [.19A9.0020.001D] # SQUARED LATIN CAPITAL LETTER F 1F175 ; [.19A9.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER F 1E1F ; [.19A9.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER F WITH DOT ABOVE 1E1E ; [.19A9.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER F WITH DOT ABOVE A77C ; [.19A9.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR F A77B ; [.19A9.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR F 213B ; [.19A9.0020.000A][.190C.0020.000A][.1BC1.0020.000A] # FACSIMILE SIGN FB00 ; [.19A9.0020.0004][.19A9.0020.0004] # LATIN SMALL LIGATURE FF FB03 ; [.19A9.0020.0004][.19A9.0020.0004][.19F6.0020.0004] # LATIN SMALL LIGATURE FFI FB04 ; [.19A9.0020.0004][.19A9.0020.0004][.1A3B.0020.0004] # LATIN SMALL LIGATURE FFL FB01 ; [.19A9.0020.0004][.19F6.0020.0004] # LATIN SMALL LIGATURE FI FB02 ; [.19A9.0020.0004][.1A3B.0020.0004] # LATIN SMALL LIGATURE FL 02A9 ; [.19A9.0020.0004][.1A9C.0020.0004] # LATIN SMALL LETTER FENG DIGRAPH 1F193 ; [.19A9.0020.001D][.1AF5.0020.001D][.196E.0020.001D][.196E.0020.001D] # SQUARED FREE A730 ; [.19AD.0020.0002] # LATIN LETTER SMALL CAPITAL F A799 ; [.19AF.0020.0002] # LATIN SMALL LETTER F WITH STROKE A798 ; [.19AF.0020.0008] # LATIN CAPITAL LETTER F WITH STROKE 1D6E ; [.19B0.0020.0002] # LATIN SMALL LETTER F WITH MIDDLE TILDE 1D82 ; [.19B1.0020.0002] # LATIN SMALL LETTER F WITH PALATAL HOOK 0192 ; [.19B2.0020.0002] # LATIN SMALL LETTER F WITH HOOK 0191 ; [.19B2.0020.0008] # LATIN CAPITAL LETTER F WITH HOOK 214E ; [.19B6.0020.0002] # TURNED SMALL F 2132 ; [.19B6.0020.0008] # TURNED CAPITAL F A7FB ; [.19B7.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED F 0067 ; [.19B8.0020.0002] # LATIN SMALL LETTER G 24A2 ; [*030A.0020.0004][.19B8.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER G 210A ; [.19B8.0020.0005] # SCRIPT SMALL G 1D420 ; [.19B8.0020.0005] # MATHEMATICAL BOLD SMALL G 1D454 ; [.19B8.0020.0005] # MATHEMATICAL ITALIC SMALL G 1D488 ; [.19B8.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL G 1D4F0 ; [.19B8.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL G 1D524 ; [.19B8.0020.0005] # MATHEMATICAL FRAKTUR SMALL G 1D558 ; [.19B8.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL G 1D58C ; [.19B8.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL G 1D5C0 ; [.19B8.0020.0005] # MATHEMATICAL SANS-SERIF SMALL G 1D5F4 ; [.19B8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL G 1D628 ; [.19B8.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL G 1D65C ; [.19B8.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G 1D690 ; [.19B8.0020.0005] # MATHEMATICAL MONOSPACE SMALL G 24D6 ; [.19B8.0020.0006] # CIRCLED LATIN SMALL LETTER G 0047 ; [.19B8.0020.0008] # LATIN CAPITAL LETTER G 1F116 ; [*030A.0020.0004][.19B8.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER G 1D406 ; [.19B8.0020.000B] # MATHEMATICAL BOLD CAPITAL G 1D43A ; [.19B8.0020.000B] # MATHEMATICAL ITALIC CAPITAL G 1D46E ; [.19B8.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL G 1D4A2 ; [.19B8.0020.000B] # MATHEMATICAL SCRIPT CAPITAL G 1D4D6 ; [.19B8.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL G 1D50A ; [.19B8.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL G 1D53E ; [.19B8.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL G 1D572 ; [.19B8.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL G 1D5A6 ; [.19B8.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL G 1D5DA ; [.19B8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL G 1D60E ; [.19B8.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL G 1D642 ; [.19B8.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G 1D676 ; [.19B8.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL G 24BC ; [.19B8.0020.000C] # CIRCLED LATIN CAPITAL LETTER G 1F156 ; [.19B8.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER G 1D4D ; [.19B8.0020.0014] # MODIFIER LETTER SMALL G 1D33 ; [.19B8.0020.001D] # MODIFIER LETTER CAPITAL G 1F136 ; [.19B8.0020.001D] # SQUARED LATIN CAPITAL LETTER G 1F176 ; [.19B8.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER G 01F5 ; [.19B8.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER G WITH ACUTE 01F4 ; [.19B8.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER G WITH ACUTE 011F ; [.19B8.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER G WITH BREVE 011E ; [.19B8.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER G WITH BREVE 011D ; [.19B8.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER G WITH CIRCUMFLEX 011C ; [.19B8.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER G WITH CIRCUMFLEX 01E7 ; [.19B8.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER G WITH CARON 01E6 ; [.19B8.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER G WITH CARON 0121 ; [.19B8.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER G WITH DOT ABOVE 0120 ; [.19B8.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER G WITH DOT ABOVE 0123 ; [.19B8.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER G WITH CEDILLA 0122 ; [.19B8.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER G WITH CEDILLA 1E21 ; [.19B8.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER G WITH MACRON 1E20 ; [.19B8.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER G WITH MACRON A7A1 ; [.19B8.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER G WITH OBLIQUE STROKE A7A0 ; [.19B8.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE 1D79 ; [.19B8.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR G A77D ; [.19B8.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR G 0261 ; [.19BC.0020.0002] # LATIN SMALL LETTER SCRIPT G A7AC ; [.19BC.0020.0008] # LATIN CAPITAL LETTER SCRIPT G 1DA2 ; [.19BC.0020.0014] # MODIFIER LETTER SMALL SCRIPT G 0262 ; [.19C1.0020.0002] # LATIN LETTER SMALL CAPITAL G 01E5 ; [.19C5.0020.0002] # LATIN SMALL LETTER G WITH STROKE 01E4 ; [.19C5.0020.0008] # LATIN CAPITAL LETTER G WITH STROKE 1D83 ; [.19C9.0020.0002] # LATIN SMALL LETTER G WITH PALATAL HOOK 0260 ; [.19CA.0020.0002] # LATIN SMALL LETTER G WITH HOOK 0193 ; [.19CA.0020.0008] # LATIN CAPITAL LETTER G WITH HOOK 029B ; [.19CE.0020.0002] # LATIN LETTER SMALL CAPITAL G WITH HOOK 1D77 ; [.19D2.0020.0002] # LATIN SMALL LETTER TURNED G A77F ; [.19D3.0020.0002] # LATIN SMALL LETTER TURNED INSULAR G A77E ; [.19D3.0020.0008] # LATIN CAPITAL LETTER TURNED INSULAR G 0263 ; [.19D4.0020.0002] # LATIN SMALL LETTER GAMMA 0194 ; [.19D4.0020.0008] # LATIN CAPITAL LETTER GAMMA 01A3 ; [.19D8.0020.0002] # LATIN SMALL LETTER OI 01A2 ; [.19D8.0020.0008] # LATIN CAPITAL LETTER OI 0068 ; [.19DC.0020.0002] # LATIN SMALL LETTER H 24A3 ; [*030A.0020.0004][.19DC.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER H 210E ; [.19DC.0020.0005] # PLANCK CONSTANT 1D421 ; [.19DC.0020.0005] # MATHEMATICAL BOLD SMALL H 1D489 ; [.19DC.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL H 1D4BD ; [.19DC.0020.0005] # MATHEMATICAL SCRIPT SMALL H 1D4F1 ; [.19DC.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL H 1D525 ; [.19DC.0020.0005] # MATHEMATICAL FRAKTUR SMALL H 1D559 ; [.19DC.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL H 1D58D ; [.19DC.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL H 1D5C1 ; [.19DC.0020.0005] # MATHEMATICAL SANS-SERIF SMALL H 1D5F5 ; [.19DC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL H 1D629 ; [.19DC.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL H 1D65D ; [.19DC.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H 1D691 ; [.19DC.0020.0005] # MATHEMATICAL MONOSPACE SMALL H 24D7 ; [.19DC.0020.0006] # CIRCLED LATIN SMALL LETTER H 0048 ; [.19DC.0020.0008] # LATIN CAPITAL LETTER H 1F117 ; [*030A.0020.0004][.19DC.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER H 210B ; [.19DC.0020.000B] # SCRIPT CAPITAL H 210C ; [.19DC.0020.000B] # BLACK-LETTER CAPITAL H 210D ; [.19DC.0020.000B] # DOUBLE-STRUCK CAPITAL H 1D407 ; [.19DC.0020.000B] # MATHEMATICAL BOLD CAPITAL H 1D43B ; [.19DC.0020.000B] # MATHEMATICAL ITALIC CAPITAL H 1D46F ; [.19DC.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL H 1D4D7 ; [.19DC.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL H 1D573 ; [.19DC.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL H 1D5A7 ; [.19DC.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL H 1D5DB ; [.19DC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL H 1D60F ; [.19DC.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL H 1D643 ; [.19DC.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H 1D677 ; [.19DC.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL H 24BD ; [.19DC.0020.000C] # CIRCLED LATIN CAPITAL LETTER H 1F157 ; [.19DC.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER H 2095 ; [.19DC.0020.0015] # LATIN SUBSCRIPT SMALL LETTER H 1D34 ; [.19DC.0020.001D] # MODIFIER LETTER CAPITAL H 1F137 ; [.19DC.0020.001D] # SQUARED LATIN CAPITAL LETTER H 1F177 ; [.19DC.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER H 0125 ; [.19DC.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER H WITH CIRCUMFLEX 0124 ; [.19DC.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER H WITH CIRCUMFLEX 021F ; [.19DC.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER H WITH CARON 021E ; [.19DC.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER H WITH CARON 1E27 ; [.19DC.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER H WITH DIAERESIS 1E26 ; [.19DC.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER H WITH DIAERESIS 1E23 ; [.19DC.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER H WITH DOT ABOVE 1E22 ; [.19DC.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER H WITH DOT ABOVE 1E29 ; [.19DC.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER H WITH CEDILLA 1E28 ; [.19DC.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER H WITH CEDILLA 0127 ; [.19DC.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER H WITH STROKE 210F ; [.19DC.0020.0002][.0000.0039.0002] # PLANCK CONSTANT OVER TWO PI 0126 ; [.19DC.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER H WITH STROKE A7F8 ; [.19DC.0020.0014][.0000.0039.0014] # MODIFIER LETTER CAPITAL H WITH STROKE 1E25 ; [.19DC.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER H WITH DOT BELOW 1E24 ; [.19DC.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER H WITH DOT BELOW 1E2B ; [.19DC.0020.0002][.0000.0047.0002] # LATIN SMALL LETTER H WITH BREVE BELOW 1E2A ; [.19DC.0020.0008][.0000.0047.0002] # LATIN CAPITAL LETTER H WITH BREVE BELOW 1E96 ; [.19DC.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER H WITH LINE BELOW 1F14A ; [.19DC.0020.001D][.1BA5.0020.001D] # SQUARED HV 029C ; [.19E0.0020.0002] # LATIN LETTER SMALL CAPITAL H 0195 ; [.19E4.0020.0002] # LATIN SMALL LETTER HV 01F6 ; [.19E4.0020.0008] # LATIN CAPITAL LETTER HWAIR A795 ; [.19E8.0020.0002] # LATIN SMALL LETTER H WITH PALATAL HOOK 0266 ; [.19E9.0020.0002] # LATIN SMALL LETTER H WITH HOOK A7AA ; [.19E9.0020.0008] # LATIN CAPITAL LETTER H WITH HOOK 2C68 ; [.19ED.0020.0002] # LATIN SMALL LETTER H WITH DESCENDER 2C67 ; [.19ED.0020.0008] # LATIN CAPITAL LETTER H WITH DESCENDER 2C76 ; [.19EE.0020.0002] # LATIN SMALL LETTER HALF H 2C75 ; [.19EE.0020.0008] # LATIN CAPITAL LETTER HALF H A727 ; [.19EF.0020.0002] # LATIN SMALL LETTER HENG A726 ; [.19EF.0020.0008] # LATIN CAPITAL LETTER HENG 0267 ; [.19F0.0020.0002] # LATIN SMALL LETTER HENG WITH HOOK 0069 ; [.19F6.0020.0002] # LATIN SMALL LETTER I 24A4 ; [*030A.0020.0004][.19F6.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER I 2139 ; [.19F6.0020.0005] # INFORMATION SOURCE 2148 ; [.19F6.0020.0005] # DOUBLE-STRUCK ITALIC SMALL I 1D422 ; [.19F6.0020.0005] # MATHEMATICAL BOLD SMALL I 1D456 ; [.19F6.0020.0005] # MATHEMATICAL ITALIC SMALL I 1D48A ; [.19F6.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL I 1D4BE ; [.19F6.0020.0005] # MATHEMATICAL SCRIPT SMALL I 1D4F2 ; [.19F6.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL I 1D526 ; [.19F6.0020.0005] # MATHEMATICAL FRAKTUR SMALL I 1D55A ; [.19F6.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL I 1D58E ; [.19F6.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL I 1D5C2 ; [.19F6.0020.0005] # MATHEMATICAL SANS-SERIF SMALL I 1D5F6 ; [.19F6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL I 1D62A ; [.19F6.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL I 1D65E ; [.19F6.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I 1D692 ; [.19F6.0020.0005] # MATHEMATICAL MONOSPACE SMALL I 24D8 ; [.19F6.0020.0006] # CIRCLED LATIN SMALL LETTER I 0049 ; [.19F6.0020.0008] # LATIN CAPITAL LETTER I 1F118 ; [*030A.0020.0004][.19F6.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER I 2110 ; [.19F6.0020.000B] # SCRIPT CAPITAL I 2111 ; [.19F6.0020.000B] # BLACK-LETTER CAPITAL I 1D408 ; [.19F6.0020.000B] # MATHEMATICAL BOLD CAPITAL I 1D43C ; [.19F6.0020.000B] # MATHEMATICAL ITALIC CAPITAL I 1D470 ; [.19F6.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL I 1D4D8 ; [.19F6.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL I 1D540 ; [.19F6.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL I 1D574 ; [.19F6.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL I 1D5A8 ; [.19F6.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL I 1D5DC ; [.19F6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL I 1D610 ; [.19F6.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL I 1D644 ; [.19F6.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I 1D678 ; [.19F6.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL I 24BE ; [.19F6.0020.000C] # CIRCLED LATIN CAPITAL LETTER I 1F158 ; [.19F6.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER I 2071 ; [.19F6.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER I 1D62 ; [.19F6.0020.0015] # LATIN SUBSCRIPT SMALL LETTER I 1D35 ; [.19F6.0020.001D] # MODIFIER LETTER CAPITAL I 1F138 ; [.19F6.0020.001D] # SQUARED LATIN CAPITAL LETTER I 1F178 ; [.19F6.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER I 00ED ; [.19F6.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH ACUTE 00CD ; [.19F6.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH ACUTE 00EC ; [.19F6.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER I WITH GRAVE 00CC ; [.19F6.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER I WITH GRAVE 012D ; [.19F6.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER I WITH BREVE 012C ; [.19F6.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER I WITH BREVE 00EE ; [.19F6.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER I WITH CIRCUMFLEX 00CE ; [.19F6.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER I WITH CIRCUMFLEX 01D0 ; [.19F6.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER I WITH CARON 01CF ; [.19F6.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER I WITH CARON 00EF ; [.19F6.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER I WITH DIAERESIS 00CF ; [.19F6.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS 1E2F ; [.19F6.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE 1E2E ; [.19F6.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE 0129 ; [.19F6.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER I WITH TILDE 0128 ; [.19F6.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER I WITH TILDE 0130 ; [.19F6.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER I WITH DOT ABOVE 012F ; [.19F6.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER I WITH OGONEK 012E ; [.19F6.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER I WITH OGONEK 012B ; [.19F6.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER I WITH MACRON 012A ; [.19F6.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER I WITH MACRON 1EC9 ; [.19F6.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER I WITH HOOK ABOVE 1EC8 ; [.19F6.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER I WITH HOOK ABOVE 0209 ; [.19F6.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER I WITH DOUBLE GRAVE 0208 ; [.19F6.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE 020B ; [.19F6.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER I WITH INVERTED BREVE 020A ; [.19F6.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER I WITH INVERTED BREVE 1ECB ; [.19F6.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER I WITH DOT BELOW 1ECA ; [.19F6.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER I WITH DOT BELOW 1E2D ; [.19F6.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER I WITH TILDE BELOW 1E2C ; [.19F6.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER I WITH TILDE BELOW 1F18B ; [.19F6.0020.001D][.193E.0020.001D] # NEGATIVE SQUARED IC 1F194 ; [.19F6.0020.001D][.1953.0020.001D] # SQUARED ID 0133 ; [.19F6.0020.0004][.1A10.0020.0004] # LATIN SMALL LIGATURE IJ 0132 ; [.19F6.0020.000A][.1A10.0020.000A] # LATIN CAPITAL LIGATURE IJ 0131 ; [.19FA.0020.0002] # LATIN SMALL LETTER DOTLESS I 1D6A4 ; [.19FA.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS I 026A ; [.19FE.0020.0002] # LATIN LETTER SMALL CAPITAL I 1DA6 ; [.19FE.0020.0014] # MODIFIER LETTER SMALL CAPITAL I A7FE ; [.1A02.0020.0002] # LATIN EPIGRAPHIC LETTER I LONGA A7F7 ; [.1A03.0020.0002] # LATIN EPIGRAPHIC LETTER SIDEWAYS I 1D09 ; [.1A04.0020.0002] # LATIN SMALL LETTER TURNED I 1D4E ; [.1A04.0020.0014] # MODIFIER LETTER SMALL TURNED I 0268 ; [.1A05.0020.0002] # LATIN SMALL LETTER I WITH STROKE 0197 ; [.1A05.0020.0008] # LATIN CAPITAL LETTER I WITH STROKE 1DA4 ; [.1A05.0020.0014] # MODIFIER LETTER SMALL I WITH STROKE 1D7B ; [.1A09.0020.0002] # LATIN SMALL CAPITAL LETTER I WITH STROKE 1DA7 ; [.1A09.0020.0014] # MODIFIER LETTER SMALL CAPITAL I WITH STROKE 1D96 ; [.1A0A.0020.0002] # LATIN SMALL LETTER I WITH RETROFLEX HOOK 0269 ; [.1A0B.0020.0002] # LATIN SMALL LETTER IOTA 0196 ; [.1A0B.0020.0008] # LATIN CAPITAL LETTER IOTA 1DA5 ; [.1A0B.0020.0014] # MODIFIER LETTER SMALL IOTA 1D7C ; [.1A0F.0020.0002] # LATIN SMALL LETTER IOTA WITH STROKE 006A ; [.1A10.0020.0002] # LATIN SMALL LETTER J 24A5 ; [*030A.0020.0004][.1A10.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER J 2149 ; [.1A10.0020.0005] # DOUBLE-STRUCK ITALIC SMALL J 1D423 ; [.1A10.0020.0005] # MATHEMATICAL BOLD SMALL J 1D457 ; [.1A10.0020.0005] # MATHEMATICAL ITALIC SMALL J 1D48B ; [.1A10.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL J 1D4BF ; [.1A10.0020.0005] # MATHEMATICAL SCRIPT SMALL J 1D4F3 ; [.1A10.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL J 1D527 ; [.1A10.0020.0005] # MATHEMATICAL FRAKTUR SMALL J 1D55B ; [.1A10.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL J 1D58F ; [.1A10.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL J 1D5C3 ; [.1A10.0020.0005] # MATHEMATICAL SANS-SERIF SMALL J 1D5F7 ; [.1A10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL J 1D62B ; [.1A10.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL J 1D65F ; [.1A10.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J 1D693 ; [.1A10.0020.0005] # MATHEMATICAL MONOSPACE SMALL J 24D9 ; [.1A10.0020.0006] # CIRCLED LATIN SMALL LETTER J 004A ; [.1A10.0020.0008] # LATIN CAPITAL LETTER J 1F119 ; [*030A.0020.0004][.1A10.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER J 1D409 ; [.1A10.0020.000B] # MATHEMATICAL BOLD CAPITAL J 1D43D ; [.1A10.0020.000B] # MATHEMATICAL ITALIC CAPITAL J 1D471 ; [.1A10.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL J 1D4A5 ; [.1A10.0020.000B] # MATHEMATICAL SCRIPT CAPITAL J 1D4D9 ; [.1A10.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL J 1D50D ; [.1A10.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL J 1D541 ; [.1A10.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL J 1D575 ; [.1A10.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL J 1D5A9 ; [.1A10.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL J 1D5DD ; [.1A10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL J 1D611 ; [.1A10.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL J 1D645 ; [.1A10.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J 1D679 ; [.1A10.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL J 24BF ; [.1A10.0020.000C] # CIRCLED LATIN CAPITAL LETTER J 1F159 ; [.1A10.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER J 2C7C ; [.1A10.0020.0015] # LATIN SUBSCRIPT SMALL LETTER J 1D36 ; [.1A10.0020.001D] # MODIFIER LETTER CAPITAL J 1F139 ; [.1A10.0020.001D] # SQUARED LATIN CAPITAL LETTER J 1F179 ; [.1A10.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER J 0135 ; [.1A10.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER J WITH CIRCUMFLEX 0134 ; [.1A10.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER J WITH CIRCUMFLEX 01F0 ; [.1A10.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER J WITH CARON 0237 ; [.1A14.0020.0002] # LATIN SMALL LETTER DOTLESS J 1D6A5 ; [.1A14.0020.0005] # MATHEMATICAL ITALIC SMALL DOTLESS J 1D0A ; [.1A18.0020.0002] # LATIN LETTER SMALL CAPITAL J 0249 ; [.1A19.0020.0002] # LATIN SMALL LETTER J WITH STROKE 0248 ; [.1A19.0020.0008] # LATIN CAPITAL LETTER J WITH STROKE 029D ; [.1A1D.0020.0002] # LATIN SMALL LETTER J WITH CROSSED-TAIL 1DA8 ; [.1A1D.0020.0014] # MODIFIER LETTER SMALL J WITH CROSSED-TAIL 025F ; [.1A21.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE 1DA1 ; [.1A21.0020.0014] # MODIFIER LETTER SMALL DOTLESS J WITH STROKE 0284 ; [.1A25.0020.0002] # LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK 006B ; [.1A29.0020.0002] # LATIN SMALL LETTER K 24A6 ; [*030A.0020.0004][.1A29.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER K 1D424 ; [.1A29.0020.0005] # MATHEMATICAL BOLD SMALL K 1D458 ; [.1A29.0020.0005] # MATHEMATICAL ITALIC SMALL K 1D48C ; [.1A29.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL K 1D4C0 ; [.1A29.0020.0005] # MATHEMATICAL SCRIPT SMALL K 1D4F4 ; [.1A29.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL K 1D528 ; [.1A29.0020.0005] # MATHEMATICAL FRAKTUR SMALL K 1D55C ; [.1A29.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL K 1D590 ; [.1A29.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL K 1D5C4 ; [.1A29.0020.0005] # MATHEMATICAL SANS-SERIF SMALL K 1D5F8 ; [.1A29.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL K 1D62C ; [.1A29.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL K 1D660 ; [.1A29.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K 1D694 ; [.1A29.0020.0005] # MATHEMATICAL MONOSPACE SMALL K 24DA ; [.1A29.0020.0006] # CIRCLED LATIN SMALL LETTER K 004B ; [.1A29.0020.0008] # LATIN CAPITAL LETTER K 212A ; [.1A29.0020.0008] # KELVIN SIGN 1F11A ; [*030A.0020.0004][.1A29.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER K 1D40A ; [.1A29.0020.000B] # MATHEMATICAL BOLD CAPITAL K 1D43E ; [.1A29.0020.000B] # MATHEMATICAL ITALIC CAPITAL K 1D472 ; [.1A29.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL K 1D4A6 ; [.1A29.0020.000B] # MATHEMATICAL SCRIPT CAPITAL K 1D4DA ; [.1A29.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL K 1D50E ; [.1A29.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL K 1D542 ; [.1A29.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL K 1D576 ; [.1A29.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL K 1D5AA ; [.1A29.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL K 1D5DE ; [.1A29.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL K 1D612 ; [.1A29.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL K 1D646 ; [.1A29.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K 1D67A ; [.1A29.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL K 24C0 ; [.1A29.0020.000C] # CIRCLED LATIN CAPITAL LETTER K 1F15A ; [.1A29.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER K 1D4F ; [.1A29.0020.0014] # MODIFIER LETTER SMALL K 2096 ; [.1A29.0020.0015] # LATIN SUBSCRIPT SMALL LETTER K 1D37 ; [.1A29.0020.001D] # MODIFIER LETTER CAPITAL K 1F13A ; [.1A29.0020.001D] # SQUARED LATIN CAPITAL LETTER K 1F17A ; [.1A29.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER K 1E31 ; [.1A29.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER K WITH ACUTE 1E30 ; [.1A29.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER K WITH ACUTE 01E9 ; [.1A29.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER K WITH CARON 01E8 ; [.1A29.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER K WITH CARON 0137 ; [.1A29.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER K WITH CEDILLA 0136 ; [.1A29.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER K WITH CEDILLA A7A3 ; [.1A29.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER K WITH OBLIQUE STROKE A7A2 ; [.1A29.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE 1E33 ; [.1A29.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER K WITH DOT BELOW 1E32 ; [.1A29.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER K WITH DOT BELOW 1E35 ; [.1A29.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER K WITH LINE BELOW 1E34 ; [.1A29.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER K WITH LINE BELOW 1D0B ; [.1A2D.0020.0002] # LATIN LETTER SMALL CAPITAL K 1D84 ; [.1A2E.0020.0002] # LATIN SMALL LETTER K WITH PALATAL HOOK 0199 ; [.1A2F.0020.0002] # LATIN SMALL LETTER K WITH HOOK 0198 ; [.1A2F.0020.0008] # LATIN CAPITAL LETTER K WITH HOOK 2C6A ; [.1A33.0020.0002] # LATIN SMALL LETTER K WITH DESCENDER 2C69 ; [.1A33.0020.0008] # LATIN CAPITAL LETTER K WITH DESCENDER A741 ; [.1A34.0020.0002] # LATIN SMALL LETTER K WITH STROKE A740 ; [.1A34.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE A743 ; [.1A35.0020.0002] # LATIN SMALL LETTER K WITH DIAGONAL STROKE A742 ; [.1A35.0020.0008] # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE A745 ; [.1A36.0020.0002] # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE A744 ; [.1A36.0020.0008] # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE 029E ; [.1A37.0020.0002] # LATIN SMALL LETTER TURNED K A7B0 ; [.1A37.0020.0008] # LATIN CAPITAL LETTER TURNED K 006C ; [.1A3B.0020.0002] # LATIN SMALL LETTER L 24A7 ; [*030A.0020.0004][.1A3B.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER L 2113 ; [.1A3B.0020.0005] # SCRIPT SMALL L 1D425 ; [.1A3B.0020.0005] # MATHEMATICAL BOLD SMALL L 1D459 ; [.1A3B.0020.0005] # MATHEMATICAL ITALIC SMALL L 1D48D ; [.1A3B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL L 1D4C1 ; [.1A3B.0020.0005] # MATHEMATICAL SCRIPT SMALL L 1D4F5 ; [.1A3B.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL L 1D529 ; [.1A3B.0020.0005] # MATHEMATICAL FRAKTUR SMALL L 1D55D ; [.1A3B.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL L 1D591 ; [.1A3B.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL L 1D5C5 ; [.1A3B.0020.0005] # MATHEMATICAL SANS-SERIF SMALL L 1D5F9 ; [.1A3B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL L 1D62D ; [.1A3B.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL L 1D661 ; [.1A3B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L 1D695 ; [.1A3B.0020.0005] # MATHEMATICAL MONOSPACE SMALL L 24DB ; [.1A3B.0020.0006] # CIRCLED LATIN SMALL LETTER L 004C ; [.1A3B.0020.0008] # LATIN CAPITAL LETTER L 1F11B ; [*030A.0020.0004][.1A3B.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER L 2112 ; [.1A3B.0020.000B] # SCRIPT CAPITAL L 1D40B ; [.1A3B.0020.000B] # MATHEMATICAL BOLD CAPITAL L 1D43F ; [.1A3B.0020.000B] # MATHEMATICAL ITALIC CAPITAL L 1D473 ; [.1A3B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL L 1D4DB ; [.1A3B.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL L 1D50F ; [.1A3B.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL L 1D543 ; [.1A3B.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL L 1D577 ; [.1A3B.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL L 1D5AB ; [.1A3B.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL L 1D5DF ; [.1A3B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL L 1D613 ; [.1A3B.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL L 1D647 ; [.1A3B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L 1D67B ; [.1A3B.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL L 24C1 ; [.1A3B.0020.000C] # CIRCLED LATIN CAPITAL LETTER L 1F15B ; [.1A3B.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER L 2097 ; [.1A3B.0020.0015] # LATIN SUBSCRIPT SMALL LETTER L 1D38 ; [.1A3B.0020.001D] # MODIFIER LETTER CAPITAL L 1F13B ; [.1A3B.0020.001D] # SQUARED LATIN CAPITAL LETTER L 1F17B ; [.1A3B.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER L 013A ; [.1A3B.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER L WITH ACUTE 0139 ; [.1A3B.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER L WITH ACUTE 013E ; [.1A3B.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER L WITH CARON 013D ; [.1A3B.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER L WITH CARON 013C ; [.1A3B.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER L WITH CEDILLA 013B ; [.1A3B.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER L WITH CEDILLA 0142 ; [.1A3B.0020.0002][.0000.0039.0002] # LATIN SMALL LETTER L WITH STROKE 0141 ; [.1A3B.0020.0008][.0000.0039.0002] # LATIN CAPITAL LETTER L WITH STROKE 1E37 ; [.1A3B.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER L WITH DOT BELOW 1E36 ; [.1A3B.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW 1E39 ; [.1A3B.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON 1E38 ; [.1A3B.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON 1E3D ; [.1A3B.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW 1E3C ; [.1A3B.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW 1E3B ; [.1A3B.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER L WITH LINE BELOW 1E3A ; [.1A3B.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER L WITH LINE BELOW 0140 ; [.1A3B.0020.0002][.0000.0108.0002] # LATIN SMALL LETTER L WITH MIDDLE DOT 013F ; [.1A3B.0020.0008][.0000.0108.0002] # LATIN CAPITAL LETTER L WITH MIDDLE DOT 01C9 ; [.1A3B.0020.0004][.1A10.0020.0004] # LATIN SMALL LETTER LJ 01C8 ; [.1A3B.0020.000A][.1A10.0020.0004] # LATIN CAPITAL LETTER L WITH SMALL LETTER J 01C7 ; [.1A3B.0020.000A][.1A10.0020.000A] # LATIN CAPITAL LETTER LJ 1EFB ; [.1A3B.0020.0004][.1A3B.0020.0004] # LATIN SMALL LETTER MIDDLE-WELSH LL 1EFA ; [.1A3B.0020.000A][.1A3B.0020.000A] # LATIN CAPITAL LETTER MIDDLE-WELSH LL 02AA ; [.1A3B.0020.0004][.1B33.0020.0004] # LATIN SMALL LETTER LS DIGRAPH 02AB ; [.1A3B.0020.0004][.1BE3.0020.0004] # LATIN SMALL LETTER LZ DIGRAPH 029F ; [.1A3F.0020.0002] # LATIN LETTER SMALL CAPITAL L 1DAB ; [.1A3F.0020.0014] # MODIFIER LETTER SMALL CAPITAL L A747 ; [.1A43.0020.0002] # LATIN SMALL LETTER BROKEN L A746 ; [.1A43.0020.0008] # LATIN CAPITAL LETTER BROKEN L 1D0C ; [.1A44.0020.0002] # LATIN LETTER SMALL CAPITAL L WITH STROKE A749 ; [.1A45.0020.0002] # LATIN SMALL LETTER L WITH HIGH STROKE A748 ; [.1A45.0020.0008] # LATIN CAPITAL LETTER L WITH HIGH STROKE 019A ; [.1A46.0020.0002] # LATIN SMALL LETTER L WITH BAR 023D ; [.1A46.0020.0008] # LATIN CAPITAL LETTER L WITH BAR 2C61 ; [.1A4A.0020.0002] # LATIN SMALL LETTER L WITH DOUBLE BAR 2C60 ; [.1A4A.0020.0008] # LATIN CAPITAL LETTER L WITH DOUBLE BAR 026B ; [.1A4B.0020.0002] # LATIN SMALL LETTER L WITH MIDDLE TILDE 2C62 ; [.1A4B.0020.0008] # LATIN CAPITAL LETTER L WITH MIDDLE TILDE 026C ; [.1A51.0020.0002] # LATIN SMALL LETTER L WITH BELT A7AD ; [.1A51.0020.0008] # LATIN CAPITAL LETTER L WITH BELT 1D85 ; [.1A56.0020.0002] # LATIN SMALL LETTER L WITH PALATAL HOOK 1DAA ; [.1A56.0020.0014] # MODIFIER LETTER SMALL L WITH PALATAL HOOK 026D ; [.1A57.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK 1DA9 ; [.1A57.0020.0014] # MODIFIER LETTER SMALL L WITH RETROFLEX HOOK A78E ; [.1A5B.0020.0002] # LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT 0234 ; [.1A5C.0020.0002] # LATIN SMALL LETTER L WITH CURL A772 ; [.1A60.0020.0002] # LATIN SMALL LETTER LUM 026E ; [.1A61.0020.0002] # LATIN SMALL LETTER LEZH A781 ; [.1A65.0020.0002] # LATIN SMALL LETTER TURNED L A780 ; [.1A65.0020.0008] # LATIN CAPITAL LETTER TURNED L 019B ; [.1A66.0020.0002] # LATIN SMALL LETTER LAMBDA WITH STROKE 028E ; [.1A6A.0020.0002] # LATIN SMALL LETTER TURNED Y 006D ; [.1A6E.0020.0002] # LATIN SMALL LETTER M 24A8 ; [*030A.0020.0004][.1A6E.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER M 1D426 ; [.1A6E.0020.0005] # MATHEMATICAL BOLD SMALL M 1D45A ; [.1A6E.0020.0005] # MATHEMATICAL ITALIC SMALL M 1D48E ; [.1A6E.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL M 1D4C2 ; [.1A6E.0020.0005] # MATHEMATICAL SCRIPT SMALL M 1D4F6 ; [.1A6E.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL M 1D52A ; [.1A6E.0020.0005] # MATHEMATICAL FRAKTUR SMALL M 1D55E ; [.1A6E.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL M 1D592 ; [.1A6E.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL M 1D5C6 ; [.1A6E.0020.0005] # MATHEMATICAL SANS-SERIF SMALL M 1D5FA ; [.1A6E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL M 1D62E ; [.1A6E.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL M 1D662 ; [.1A6E.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M 1D696 ; [.1A6E.0020.0005] # MATHEMATICAL MONOSPACE SMALL M 24DC ; [.1A6E.0020.0006] # CIRCLED LATIN SMALL LETTER M 004D ; [.1A6E.0020.0008] # LATIN CAPITAL LETTER M 1F11C ; [*030A.0020.0004][.1A6E.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER M 2133 ; [.1A6E.0020.000B] # SCRIPT CAPITAL M 1D40C ; [.1A6E.0020.000B] # MATHEMATICAL BOLD CAPITAL M 1D440 ; [.1A6E.0020.000B] # MATHEMATICAL ITALIC CAPITAL M 1D474 ; [.1A6E.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL M 1D4DC ; [.1A6E.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL M 1D510 ; [.1A6E.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL M 1D544 ; [.1A6E.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL M 1D578 ; [.1A6E.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL M 1D5AC ; [.1A6E.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL M 1D5E0 ; [.1A6E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL M 1D614 ; [.1A6E.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL M 1D648 ; [.1A6E.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M 1D67C ; [.1A6E.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL M 24C2 ; [.1A6E.0020.000C] # CIRCLED LATIN CAPITAL LETTER M 1F15C ; [.1A6E.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER M 1D50 ; [.1A6E.0020.0014] # MODIFIER LETTER SMALL M 2098 ; [.1A6E.0020.0015] # LATIN SUBSCRIPT SMALL LETTER M 1D39 ; [.1A6E.0020.001D] # MODIFIER LETTER CAPITAL M 1F13C ; [.1A6E.0020.001D] # SQUARED LATIN CAPITAL LETTER M 1F17C ; [.1A6E.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER M 1E3F ; [.1A6E.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER M WITH ACUTE 1E3E ; [.1A6E.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER M WITH ACUTE 1E41 ; [.1A6E.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER M WITH DOT ABOVE 1E40 ; [.1A6E.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER M WITH DOT ABOVE 1E43 ; [.1A6E.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER M WITH DOT BELOW 1E42 ; [.1A6E.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER M WITH DOT BELOW 1F16A ; [.1A6E.0020.0014][.193E.0020.0014] # RAISED MC SIGN 1F16B ; [.1A6E.0020.0014][.1953.0020.0014] # RAISED MD SIGN 1F14B ; [.1A6E.0020.001D][.1BA5.0020.001D] # SQUARED MV 1D0D ; [.1A72.0020.0002] # LATIN LETTER SMALL CAPITAL M 1D6F ; [.1A73.0020.0002] # LATIN SMALL LETTER M WITH MIDDLE TILDE 1D86 ; [.1A74.0020.0002] # LATIN SMALL LETTER M WITH PALATAL HOOK 0271 ; [.1A75.0020.0002] # LATIN SMALL LETTER M WITH HOOK 2C6E ; [.1A75.0020.0008] # LATIN CAPITAL LETTER M WITH HOOK 1DAC ; [.1A75.0020.0014] # MODIFIER LETTER SMALL M WITH HOOK A7FD ; [.1A7A.0020.0002] # LATIN EPIGRAPHIC LETTER INVERTED M A7FF ; [.1A7B.0020.0002] # LATIN EPIGRAPHIC LETTER ARCHAIC M A773 ; [.1A7C.0020.0002] # LATIN SMALL LETTER MUM 006E ; [.1A7D.0020.0002] # LATIN SMALL LETTER N 24A9 ; [*030A.0020.0004][.1A7D.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER N 1D427 ; [.1A7D.0020.0005] # MATHEMATICAL BOLD SMALL N 1D45B ; [.1A7D.0020.0005] # MATHEMATICAL ITALIC SMALL N 1D48F ; [.1A7D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL N 1D4C3 ; [.1A7D.0020.0005] # MATHEMATICAL SCRIPT SMALL N 1D4F7 ; [.1A7D.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL N 1D52B ; [.1A7D.0020.0005] # MATHEMATICAL FRAKTUR SMALL N 1D55F ; [.1A7D.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL N 1D593 ; [.1A7D.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL N 1D5C7 ; [.1A7D.0020.0005] # MATHEMATICAL SANS-SERIF SMALL N 1D5FB ; [.1A7D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL N 1D62F ; [.1A7D.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL N 1D663 ; [.1A7D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N 1D697 ; [.1A7D.0020.0005] # MATHEMATICAL MONOSPACE SMALL N 24DD ; [.1A7D.0020.0006] # CIRCLED LATIN SMALL LETTER N 004E ; [.1A7D.0020.0008] # LATIN CAPITAL LETTER N 1F11D ; [*030A.0020.0004][.1A7D.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER N 2115 ; [.1A7D.0020.000B] # DOUBLE-STRUCK CAPITAL N 1D40D ; [.1A7D.0020.000B] # MATHEMATICAL BOLD CAPITAL N 1D441 ; [.1A7D.0020.000B] # MATHEMATICAL ITALIC CAPITAL N 1D475 ; [.1A7D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL N 1D4A9 ; [.1A7D.0020.000B] # MATHEMATICAL SCRIPT CAPITAL N 1D4DD ; [.1A7D.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL N 1D511 ; [.1A7D.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL N 1D579 ; [.1A7D.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL N 1D5AD ; [.1A7D.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL N 1D5E1 ; [.1A7D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL N 1D615 ; [.1A7D.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL N 1D649 ; [.1A7D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N 1D67D ; [.1A7D.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL N 24C3 ; [.1A7D.0020.000C] # CIRCLED LATIN CAPITAL LETTER N 1F15D ; [.1A7D.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER N 207F ; [.1A7D.0020.0014] # SUPERSCRIPT LATIN SMALL LETTER N 2099 ; [.1A7D.0020.0015] # LATIN SUBSCRIPT SMALL LETTER N 1D3A ; [.1A7D.0020.001D] # MODIFIER LETTER CAPITAL N 1F13D ; [.1A7D.0020.001D] # SQUARED LATIN CAPITAL LETTER N 1F17D ; [.1A7D.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER N 0144 ; [.1A7D.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER N WITH ACUTE 0143 ; [.1A7D.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER N WITH ACUTE 01F9 ; [.1A7D.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER N WITH GRAVE 01F8 ; [.1A7D.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER N WITH GRAVE 0148 ; [.1A7D.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER N WITH CARON 0147 ; [.1A7D.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER N WITH CARON 00F1 ; [.1A7D.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER N WITH TILDE 00D1 ; [.1A7D.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER N WITH TILDE 1E45 ; [.1A7D.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER N WITH DOT ABOVE 1E44 ; [.1A7D.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER N WITH DOT ABOVE 0146 ; [.1A7D.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER N WITH CEDILLA 0145 ; [.1A7D.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER N WITH CEDILLA A7A5 ; [.1A7D.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER N WITH OBLIQUE STROKE A7A4 ; [.1A7D.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE 1E47 ; [.1A7D.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER N WITH DOT BELOW 1E46 ; [.1A7D.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER N WITH DOT BELOW 1E4B ; [.1A7D.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW 1E4A ; [.1A7D.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW 1E49 ; [.1A7D.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER N WITH LINE BELOW 1E48 ; [.1A7D.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER N WITH LINE BELOW 1F195 ; [.1A7D.0020.001D][.196E.0020.001D][.1BB7.0020.001D] # SQUARED NEW 1F196 ; [.1A7D.0020.001D][.19B8.0020.001D] # SQUARED NG 01CC ; [.1A7D.0020.0004][.1A10.0020.0004] # LATIN SMALL LETTER NJ 01CB ; [.1A7D.0020.000A][.1A10.0020.0004] # LATIN CAPITAL LETTER N WITH SMALL LETTER J 01CA ; [.1A7D.0020.000A][.1A10.0020.000A] # LATIN CAPITAL LETTER NJ 2116 ; [.1A7D.0020.000A][.1AA1.0020.0004] # NUMERO SIGN 0274 ; [.1A81.0020.0002] # LATIN LETTER SMALL CAPITAL N 1DB0 ; [.1A81.0020.0014] # MODIFIER LETTER SMALL CAPITAL N 1D3B ; [.1A85.0020.0002] # MODIFIER LETTER CAPITAL REVERSED N 1D0E ; [.1A86.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED N 1D70 ; [.1A87.0020.0002] # LATIN SMALL LETTER N WITH MIDDLE TILDE 0272 ; [.1A88.0020.0002] # LATIN SMALL LETTER N WITH LEFT HOOK 019D ; [.1A88.0020.0008] # LATIN CAPITAL LETTER N WITH LEFT HOOK 1DAE ; [.1A88.0020.0014] # MODIFIER LETTER SMALL N WITH LEFT HOOK 019E ; [.1A8C.0020.0002] # LATIN SMALL LETTER N WITH LONG RIGHT LEG 0220 ; [.1A8C.0020.0008] # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG A791 ; [.1A90.0020.0002] # LATIN SMALL LETTER N WITH DESCENDER A790 ; [.1A90.0020.0008] # LATIN CAPITAL LETTER N WITH DESCENDER 1D87 ; [.1A91.0020.0002] # LATIN SMALL LETTER N WITH PALATAL HOOK 0273 ; [.1A92.0020.0002] # LATIN SMALL LETTER N WITH RETROFLEX HOOK 1DAF ; [.1A92.0020.0014] # MODIFIER LETTER SMALL N WITH RETROFLEX HOOK 0235 ; [.1A96.0020.0002] # LATIN SMALL LETTER N WITH CURL A774 ; [.1A9B.0020.0002] # LATIN SMALL LETTER NUM 014B ; [.1A9C.0020.0002] # LATIN SMALL LETTER ENG 014A ; [.1A9C.0020.0008] # LATIN CAPITAL LETTER ENG 1D51 ; [.1A9C.0020.0014] # MODIFIER LETTER SMALL ENG 006F ; [.1AA1.0020.0002] # LATIN SMALL LETTER O 24AA ; [*030A.0020.0004][.1AA1.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER O 2134 ; [.1AA1.0020.0005] # SCRIPT SMALL O 1D428 ; [.1AA1.0020.0005] # MATHEMATICAL BOLD SMALL O 1D45C ; [.1AA1.0020.0005] # MATHEMATICAL ITALIC SMALL O 1D490 ; [.1AA1.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL O 1D4F8 ; [.1AA1.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL O 1D52C ; [.1AA1.0020.0005] # MATHEMATICAL FRAKTUR SMALL O 1D560 ; [.1AA1.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL O 1D594 ; [.1AA1.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL O 1D5C8 ; [.1AA1.0020.0005] # MATHEMATICAL SANS-SERIF SMALL O 1D5FC ; [.1AA1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL O 1D630 ; [.1AA1.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL O 1D664 ; [.1AA1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O 1D698 ; [.1AA1.0020.0005] # MATHEMATICAL MONOSPACE SMALL O 24DE ; [.1AA1.0020.0006] # CIRCLED LATIN SMALL LETTER O 004F ; [.1AA1.0020.0008] # LATIN CAPITAL LETTER O 1F11E ; [*030A.0020.0004][.1AA1.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER O 1D40E ; [.1AA1.0020.000B] # MATHEMATICAL BOLD CAPITAL O 1D442 ; [.1AA1.0020.000B] # MATHEMATICAL ITALIC CAPITAL O 1D476 ; [.1AA1.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL O 1D4AA ; [.1AA1.0020.000B] # MATHEMATICAL SCRIPT CAPITAL O 1D4DE ; [.1AA1.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL O 1D512 ; [.1AA1.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL O 1D546 ; [.1AA1.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL O 1D57A ; [.1AA1.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL O 1D5AE ; [.1AA1.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL O 1D5E2 ; [.1AA1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL O 1D616 ; [.1AA1.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL O 1D64A ; [.1AA1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O 1D67E ; [.1AA1.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL O 24C4 ; [.1AA1.0020.000C] # CIRCLED LATIN CAPITAL LETTER O 1F15E ; [.1AA1.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER O 00BA ; [.1AA1.0020.0014] # MASCULINE ORDINAL INDICATOR 1D52 ; [.1AA1.0020.0014] # MODIFIER LETTER SMALL O 2092 ; [.1AA1.0020.0015] # LATIN SUBSCRIPT SMALL LETTER O 1D3C ; [.1AA1.0020.001D] # MODIFIER LETTER CAPITAL O 1F13E ; [.1AA1.0020.001D] # SQUARED LATIN CAPITAL LETTER O 1F17E ; [.1AA1.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER O 00F3 ; [.1AA1.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH ACUTE 00D3 ; [.1AA1.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH ACUTE 00F2 ; [.1AA1.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH GRAVE 00D2 ; [.1AA1.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH GRAVE 014F ; [.1AA1.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER O WITH BREVE 014E ; [.1AA1.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER O WITH BREVE 00F4 ; [.1AA1.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX 00D4 ; [.1AA1.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX 1ED1 ; [.1AA1.0020.0002][.0000.0027.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE 1ED0 ; [.1AA1.0020.0008][.0000.0027.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE 1ED3 ; [.1AA1.0020.0002][.0000.0027.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE 1ED2 ; [.1AA1.0020.0008][.0000.0027.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE 1ED7 ; [.1AA1.0020.0002][.0000.0027.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE 1ED6 ; [.1AA1.0020.0008][.0000.0027.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE 1ED5 ; [.1AA1.0020.0002][.0000.0027.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE 1ED4 ; [.1AA1.0020.0008][.0000.0027.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE 01D2 ; [.1AA1.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER O WITH CARON 01D1 ; [.1AA1.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER O WITH CARON 00F6 ; [.1AA1.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH DIAERESIS A79D ; [.1AA1.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK OE 00D6 ; [.1AA1.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS A79C ; [.1AA1.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK OE 022B ; [.1AA1.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON 022A ; [.1AA1.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON 0151 ; [.1AA1.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER O WITH DOUBLE ACUTE 0150 ; [.1AA1.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE 00F5 ; [.1AA1.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH TILDE 00D5 ; [.1AA1.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH TILDE 1E4D ; [.1AA1.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH TILDE AND ACUTE 1E4C ; [.1AA1.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE 1E4F ; [.1AA1.0020.0002][.0000.002D.0002][.0000.002B.0002] # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS 1E4E ; [.1AA1.0020.0008][.0000.002D.0002][.0000.002B.0002] # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS 022D ; [.1AA1.0020.0002][.0000.002D.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH TILDE AND MACRON 022C ; [.1AA1.0020.0008][.0000.002D.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH TILDE AND MACRON 022F ; [.1AA1.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER O WITH DOT ABOVE 022E ; [.1AA1.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE 0231 ; [.1AA1.0020.0002][.0000.002E.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON 0230 ; [.1AA1.0020.0008][.0000.002E.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON 00F8 ; [.1AA1.0020.0002][.0000.002F.0002] # LATIN SMALL LETTER O WITH STROKE 00D8 ; [.1AA1.0020.0008][.0000.002F.0002] # LATIN CAPITAL LETTER O WITH STROKE 01FF ; [.1AA1.0020.0002][.0000.002F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH STROKE AND ACUTE 01FE ; [.1AA1.0020.0008][.0000.002F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE 01EB ; [.1AA1.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER O WITH OGONEK 01EA ; [.1AA1.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER O WITH OGONEK 01ED ; [.1AA1.0020.0002][.0000.0031.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH OGONEK AND MACRON 01EC ; [.1AA1.0020.0008][.0000.0031.0002][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON 014D ; [.1AA1.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER O WITH MACRON 014C ; [.1AA1.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER O WITH MACRON 1E53 ; [.1AA1.0020.0002][.0000.0032.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH MACRON AND ACUTE 1E52 ; [.1AA1.0020.0008][.0000.0032.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE 1E51 ; [.1AA1.0020.0002][.0000.0032.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH MACRON AND GRAVE 1E50 ; [.1AA1.0020.0008][.0000.0032.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE 1ECF ; [.1AA1.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HOOK ABOVE 1ECE ; [.1AA1.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HOOK ABOVE 020D ; [.1AA1.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER O WITH DOUBLE GRAVE 020C ; [.1AA1.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE 020F ; [.1AA1.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER O WITH INVERTED BREVE 020E ; [.1AA1.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER O WITH INVERTED BREVE 01A1 ; [.1AA1.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER O WITH HORN 01A0 ; [.1AA1.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER O WITH HORN 1EDB ; [.1AA1.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER O WITH HORN AND ACUTE 1EDA ; [.1AA1.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER O WITH HORN AND ACUTE 1EDD ; [.1AA1.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER O WITH HORN AND GRAVE 1EDC ; [.1AA1.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER O WITH HORN AND GRAVE 1EE1 ; [.1AA1.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER O WITH HORN AND TILDE 1EE0 ; [.1AA1.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER O WITH HORN AND TILDE 1EDF ; [.1AA1.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE 1EDE ; [.1AA1.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE 1EE3 ; [.1AA1.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH HORN AND DOT BELOW 1EE2 ; [.1AA1.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW 1ECD ; [.1AA1.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER O WITH DOT BELOW 1ECC ; [.1AA1.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER O WITH DOT BELOW 1ED9 ; [.1AA1.0020.0002][.0000.0042.0002][.0000.0027.0002] # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW 1ED8 ; [.1AA1.0020.0008][.0000.0042.0002][.0000.0027.0002] # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW 0153 ; [.1AA1.0020.0004][.0000.0108.0004][.196E.0020.0004] # LATIN SMALL LIGATURE OE 0152 ; [.1AA1.0020.000A][.0000.0108.0004][.196E.0020.000A] # LATIN CAPITAL LIGATURE OE A7F9 ; [.1AA1.0020.0014][.0000.0108.0014][.196E.0020.0014] # MODIFIER LETTER SMALL LIGATURE OE 1F197 ; [.1AA1.0020.001D][.1A29.0020.001D] # SQUARED OK A74F ; [.1AA1.0020.0004][.1AA1.0020.0004] # LATIN SMALL LETTER OO A74E ; [.1AA1.0020.000A][.1AA1.0020.000A] # LATIN CAPITAL LETTER OO 1D0F ; [.1AA5.0020.0002] # LATIN LETTER SMALL CAPITAL O 1D11 ; [.1AA6.0020.0002] # LATIN SMALL LETTER SIDEWAYS O 0276 ; [.1AA8.0020.0002] # LATIN LETTER SMALL CAPITAL OE 1D14 ; [.1AAC.0020.0002] # LATIN SMALL LETTER TURNED OE 1D13 ; [.1AB2.0020.0002] # LATIN SMALL LETTER SIDEWAYS O WITH STROKE 0254 ; [.1AB4.0020.0002] # LATIN SMALL LETTER OPEN O 0186 ; [.1AB4.0020.0008] # LATIN CAPITAL LETTER OPEN O 1D53 ; [.1AB4.0020.0014] # MODIFIER LETTER SMALL OPEN O 1D10 ; [.1AB8.0020.0002] # LATIN LETTER SMALL CAPITAL OPEN O 1D12 ; [.1AB9.0020.0002] # LATIN SMALL LETTER SIDEWAYS OPEN O 1D97 ; [.1ABB.0020.0002] # LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK A74D ; [.1ABC.0020.0002] # LATIN SMALL LETTER O WITH LOOP A74C ; [.1ABC.0020.0008] # LATIN CAPITAL LETTER O WITH LOOP 1D16 ; [.1ABD.0020.0002] # LATIN SMALL LETTER TOP HALF O 1D54 ; [.1ABD.0020.0014] # MODIFIER LETTER SMALL TOP HALF O 1D17 ; [.1ABE.0020.0002] # LATIN SMALL LETTER BOTTOM HALF O 1D55 ; [.1ABE.0020.0014] # MODIFIER LETTER SMALL BOTTOM HALF O 2C7A ; [.1ABF.0020.0002] # LATIN SMALL LETTER O WITH LOW RING INSIDE 0275 ; [.1AC0.0020.0002] # LATIN SMALL LETTER BARRED O 019F ; [.1AC0.0020.0008] # LATIN CAPITAL LETTER O WITH MIDDLE TILDE 1DB1 ; [.1AC0.0020.0014] # MODIFIER LETTER SMALL BARRED O A74B ; [.1AC4.0020.0002] # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY A74A ; [.1AC4.0020.0008] # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY 0277 ; [.1AC5.0020.0002] # LATIN SMALL LETTER CLOSED OMEGA 0223 ; [.1AC9.0020.0002] # LATIN SMALL LETTER OU 0222 ; [.1AC9.0020.0008] # LATIN CAPITAL LETTER OU 1D3D ; [.1AC9.0020.001D] # MODIFIER LETTER CAPITAL OU 1D15 ; [.1ACD.0020.0002] # LATIN LETTER SMALL CAPITAL OU 0070 ; [.1ACE.0020.0002] # LATIN SMALL LETTER P 24AB ; [*030A.0020.0004][.1ACE.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER P 1D429 ; [.1ACE.0020.0005] # MATHEMATICAL BOLD SMALL P 1D45D ; [.1ACE.0020.0005] # MATHEMATICAL ITALIC SMALL P 1D491 ; [.1ACE.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL P 1D4C5 ; [.1ACE.0020.0005] # MATHEMATICAL SCRIPT SMALL P 1D4F9 ; [.1ACE.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL P 1D52D ; [.1ACE.0020.0005] # MATHEMATICAL FRAKTUR SMALL P 1D561 ; [.1ACE.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL P 1D595 ; [.1ACE.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL P 1D5C9 ; [.1ACE.0020.0005] # MATHEMATICAL SANS-SERIF SMALL P 1D5FD ; [.1ACE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL P 1D631 ; [.1ACE.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL P 1D665 ; [.1ACE.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P 1D699 ; [.1ACE.0020.0005] # MATHEMATICAL MONOSPACE SMALL P 24DF ; [.1ACE.0020.0006] # CIRCLED LATIN SMALL LETTER P 0050 ; [.1ACE.0020.0008] # LATIN CAPITAL LETTER P 1F11F ; [*030A.0020.0004][.1ACE.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER P 2119 ; [.1ACE.0020.000B] # DOUBLE-STRUCK CAPITAL P 1D40F ; [.1ACE.0020.000B] # MATHEMATICAL BOLD CAPITAL P 1D443 ; [.1ACE.0020.000B] # MATHEMATICAL ITALIC CAPITAL P 1D477 ; [.1ACE.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL P 1D4AB ; [.1ACE.0020.000B] # MATHEMATICAL SCRIPT CAPITAL P 1D4DF ; [.1ACE.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL P 1D513 ; [.1ACE.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL P 1D57B ; [.1ACE.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL P 1D5AF ; [.1ACE.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL P 1D5E3 ; [.1ACE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL P 1D617 ; [.1ACE.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL P 1D64B ; [.1ACE.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P 1D67F ; [.1ACE.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL P 24C5 ; [.1ACE.0020.000C] # CIRCLED LATIN CAPITAL LETTER P 1F15F ; [.1ACE.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER P 1D56 ; [.1ACE.0020.0014] # MODIFIER LETTER SMALL P 209A ; [.1ACE.0020.0015] # LATIN SUBSCRIPT SMALL LETTER P 1D3E ; [.1ACE.0020.001D] # MODIFIER LETTER CAPITAL P 1F13F ; [.1ACE.0020.001D] # SQUARED LATIN CAPITAL LETTER P 1F17F ; [.1ACE.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER P 1F18A ; [.1ACE.0020.001D] # CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P 1E55 ; [.1ACE.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER P WITH ACUTE 1E54 ; [.1ACE.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER P WITH ACUTE 1E57 ; [.1ACE.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER P WITH DOT ABOVE 1E56 ; [.1ACE.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER P WITH DOT ABOVE 1F18C ; [.1ACE.0020.001D][.190C.0020.001D] # NEGATIVE SQUARED PA 1F14E ; [.1ACE.0020.001D][.1ACE.0020.001D][.1BA5.0020.001D] # SQUARED PPV 1D18 ; [.1AD2.0020.0002] # LATIN LETTER SMALL CAPITAL P 1D7D ; [.1AD3.0020.0002] # LATIN SMALL LETTER P WITH STROKE 2C63 ; [.1AD3.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE A751 ; [.1AD4.0020.0002] # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER A750 ; [.1AD4.0020.0008] # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER 1D71 ; [.1AD5.0020.0002] # LATIN SMALL LETTER P WITH MIDDLE TILDE 1D88 ; [.1AD6.0020.0002] # LATIN SMALL LETTER P WITH PALATAL HOOK 01A5 ; [.1AD7.0020.0002] # LATIN SMALL LETTER P WITH HOOK 01A4 ; [.1AD7.0020.0008] # LATIN CAPITAL LETTER P WITH HOOK A753 ; [.1ADB.0020.0002] # LATIN SMALL LETTER P WITH FLOURISH A752 ; [.1ADB.0020.0008] # LATIN CAPITAL LETTER P WITH FLOURISH A755 ; [.1ADC.0020.0002] # LATIN SMALL LETTER P WITH SQUIRREL TAIL A754 ; [.1ADC.0020.0008] # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL A7FC ; [.1ADD.0020.0002] # LATIN EPIGRAPHIC LETTER REVERSED P 0278 ; [.1ADE.0020.0002] # LATIN SMALL LETTER PHI 1DB2 ; [.1ADE.0020.0014] # MODIFIER LETTER SMALL PHI 2C77 ; [.1AE2.0020.0002] # LATIN SMALL LETTER TAILLESS PHI 0071 ; [.1AE3.0020.0002] # LATIN SMALL LETTER Q 24AC ; [*030A.0020.0004][.1AE3.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Q 1D42A ; [.1AE3.0020.0005] # MATHEMATICAL BOLD SMALL Q 1D45E ; [.1AE3.0020.0005] # MATHEMATICAL ITALIC SMALL Q 1D492 ; [.1AE3.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Q 1D4C6 ; [.1AE3.0020.0005] # MATHEMATICAL SCRIPT SMALL Q 1D4FA ; [.1AE3.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Q 1D52E ; [.1AE3.0020.0005] # MATHEMATICAL FRAKTUR SMALL Q 1D562 ; [.1AE3.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Q 1D596 ; [.1AE3.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Q 1D5CA ; [.1AE3.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Q 1D5FE ; [.1AE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Q 1D632 ; [.1AE3.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Q 1D666 ; [.1AE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q 1D69A ; [.1AE3.0020.0005] # MATHEMATICAL MONOSPACE SMALL Q 24E0 ; [.1AE3.0020.0006] # CIRCLED LATIN SMALL LETTER Q 0051 ; [.1AE3.0020.0008] # LATIN CAPITAL LETTER Q 1F120 ; [*030A.0020.0004][.1AE3.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Q 211A ; [.1AE3.0020.000B] # DOUBLE-STRUCK CAPITAL Q 1D410 ; [.1AE3.0020.000B] # MATHEMATICAL BOLD CAPITAL Q 1D444 ; [.1AE3.0020.000B] # MATHEMATICAL ITALIC CAPITAL Q 1D478 ; [.1AE3.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Q 1D4AC ; [.1AE3.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Q 1D4E0 ; [.1AE3.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Q 1D514 ; [.1AE3.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Q 1D57C ; [.1AE3.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Q 1D5B0 ; [.1AE3.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Q 1D5E4 ; [.1AE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Q 1D618 ; [.1AE3.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q 1D64C ; [.1AE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q 1D680 ; [.1AE3.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Q 24C6 ; [.1AE3.0020.000C] # CIRCLED LATIN CAPITAL LETTER Q 1F160 ; [.1AE3.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Q 1F140 ; [.1AE3.0020.001D] # SQUARED LATIN CAPITAL LETTER Q 1F180 ; [.1AE3.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Q 0239 ; [.1AE3.0020.0004][.1ACE.0020.0004] # LATIN SMALL LETTER QP DIGRAPH A757 ; [.1AE7.0020.0002] # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER A756 ; [.1AE7.0020.0008] # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER A759 ; [.1AE8.0020.0002] # LATIN SMALL LETTER Q WITH DIAGONAL STROKE A758 ; [.1AE8.0020.0008] # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE 02A0 ; [.1AE9.0020.0002] # LATIN SMALL LETTER Q WITH HOOK 024B ; [.1AED.0020.0002] # LATIN SMALL LETTER Q WITH HOOK TAIL 024A ; [.1AED.0020.0008] # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL 0138 ; [.1AF1.0020.0002] # LATIN SMALL LETTER KRA 0072 ; [.1AF5.0020.0002] # LATIN SMALL LETTER R 24AD ; [*030A.0020.0004][.1AF5.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER R 1D42B ; [.1AF5.0020.0005] # MATHEMATICAL BOLD SMALL R 1D45F ; [.1AF5.0020.0005] # MATHEMATICAL ITALIC SMALL R 1D493 ; [.1AF5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL R 1D4C7 ; [.1AF5.0020.0005] # MATHEMATICAL SCRIPT SMALL R 1D4FB ; [.1AF5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL R 1D52F ; [.1AF5.0020.0005] # MATHEMATICAL FRAKTUR SMALL R 1D563 ; [.1AF5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL R 1D597 ; [.1AF5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL R 1D5CB ; [.1AF5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL R 1D5FF ; [.1AF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL R 1D633 ; [.1AF5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL R 1D667 ; [.1AF5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R 1D69B ; [.1AF5.0020.0005] # MATHEMATICAL MONOSPACE SMALL R 24E1 ; [.1AF5.0020.0006] # CIRCLED LATIN SMALL LETTER R 0052 ; [.1AF5.0020.0008] # LATIN CAPITAL LETTER R 1F121 ; [*030A.0020.0004][.1AF5.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER R 211B ; [.1AF5.0020.000B] # SCRIPT CAPITAL R 211C ; [.1AF5.0020.000B] # BLACK-LETTER CAPITAL R 211D ; [.1AF5.0020.000B] # DOUBLE-STRUCK CAPITAL R 1D411 ; [.1AF5.0020.000B] # MATHEMATICAL BOLD CAPITAL R 1D445 ; [.1AF5.0020.000B] # MATHEMATICAL ITALIC CAPITAL R 1D479 ; [.1AF5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL R 1D4E1 ; [.1AF5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL R 1D57D ; [.1AF5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL R 1D5B1 ; [.1AF5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL R 1D5E5 ; [.1AF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL R 1D619 ; [.1AF5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL R 1D64D ; [.1AF5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R 1D681 ; [.1AF5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL R 24C7 ; [.1AF5.0020.000C] # CIRCLED LATIN CAPITAL LETTER R 1F12C ; [.1AF5.0020.000C] # CIRCLED ITALIC LATIN CAPITAL LETTER R 1F161 ; [.1AF5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER R 1D63 ; [.1AF5.0020.0015] # LATIN SUBSCRIPT SMALL LETTER R 1D3F ; [.1AF5.0020.001D] # MODIFIER LETTER CAPITAL R 1F141 ; [.1AF5.0020.001D] # SQUARED LATIN CAPITAL LETTER R 1F181 ; [.1AF5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER R 0155 ; [.1AF5.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER R WITH ACUTE 0154 ; [.1AF5.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER R WITH ACUTE 0159 ; [.1AF5.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER R WITH CARON 0158 ; [.1AF5.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER R WITH CARON 1E59 ; [.1AF5.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER R WITH DOT ABOVE 1E58 ; [.1AF5.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER R WITH DOT ABOVE 0157 ; [.1AF5.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER R WITH CEDILLA 0156 ; [.1AF5.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER R WITH CEDILLA A7A7 ; [.1AF5.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER R WITH OBLIQUE STROKE A7A6 ; [.1AF5.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE 0211 ; [.1AF5.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER R WITH DOUBLE GRAVE 0210 ; [.1AF5.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE 0213 ; [.1AF5.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER R WITH INVERTED BREVE 0212 ; [.1AF5.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER R WITH INVERTED BREVE 1E5B ; [.1AF5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER R WITH DOT BELOW 1E5A ; [.1AF5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW 1E5D ; [.1AF5.0020.0002][.0000.0042.0002][.0000.0032.0002] # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON 1E5C ; [.1AF5.0020.0008][.0000.0042.0002][.0000.0032.0002] # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON 1E5F ; [.1AF5.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER R WITH LINE BELOW 1E5E ; [.1AF5.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER R WITH LINE BELOW A783 ; [.1AF5.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR R A782 ; [.1AF5.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR R 0280 ; [.1AFA.0020.0002] # LATIN LETTER SMALL CAPITAL R 01A6 ; [.1AFA.0020.0008] # LATIN LETTER YR A75B ; [.1AFF.0020.0002] # LATIN SMALL LETTER R ROTUNDA A75A ; [.1AFF.0020.0008] # LATIN CAPITAL LETTER R ROTUNDA 1D19 ; [.1B00.0020.0002] # LATIN LETTER SMALL CAPITAL REVERSED R 024D ; [.1B01.0020.0002] # LATIN SMALL LETTER R WITH STROKE 024C ; [.1B01.0020.0008] # LATIN CAPITAL LETTER R WITH STROKE 1D72 ; [.1B05.0020.0002] # LATIN SMALL LETTER R WITH MIDDLE TILDE 0279 ; [.1B06.0020.0002] # LATIN SMALL LETTER TURNED R 1D1A ; [.1B0A.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED R 027A ; [.1B0B.0020.0002] # LATIN SMALL LETTER TURNED R WITH LONG LEG 1D89 ; [.1B0F.0020.0002] # LATIN SMALL LETTER R WITH PALATAL HOOK 027B ; [.1B10.0020.0002] # LATIN SMALL LETTER TURNED R WITH HOOK 2C79 ; [.1B14.0020.0002] # LATIN SMALL LETTER TURNED R WITH TAIL 027C ; [.1B15.0020.0002] # LATIN SMALL LETTER R WITH LONG LEG 027D ; [.1B19.0020.0002] # LATIN SMALL LETTER R WITH TAIL 2C64 ; [.1B19.0020.0008] # LATIN CAPITAL LETTER R WITH TAIL 027E ; [.1B1E.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK 1D73 ; [.1B22.0020.0002] # LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE 027F ; [.1B23.0020.0002] # LATIN SMALL LETTER REVERSED R WITH FISHHOOK 0281 ; [.1B2C.0020.0002] # LATIN LETTER SMALL CAPITAL INVERTED R A775 ; [.1B30.0020.0002] # LATIN SMALL LETTER RUM A776 ; [.1B31.0020.0002] # LATIN LETTER SMALL CAPITAL RUM A75D ; [.1B32.0020.0002] # LATIN SMALL LETTER RUM ROTUNDA A75C ; [.1B32.0020.0008] # LATIN CAPITAL LETTER RUM ROTUNDA 0073 ; [.1B33.0020.0002] # LATIN SMALL LETTER S 24AE ; [*030A.0020.0004][.1B33.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER S 1D42C ; [.1B33.0020.0005] # MATHEMATICAL BOLD SMALL S 1D460 ; [.1B33.0020.0005] # MATHEMATICAL ITALIC SMALL S 1D494 ; [.1B33.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL S 1D4C8 ; [.1B33.0020.0005] # MATHEMATICAL SCRIPT SMALL S 1D4FC ; [.1B33.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL S 1D530 ; [.1B33.0020.0005] # MATHEMATICAL FRAKTUR SMALL S 1D564 ; [.1B33.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL S 1D598 ; [.1B33.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL S 1D5CC ; [.1B33.0020.0005] # MATHEMATICAL SANS-SERIF SMALL S 1D600 ; [.1B33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL S 1D634 ; [.1B33.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL S 1D668 ; [.1B33.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S 1D69C ; [.1B33.0020.0005] # MATHEMATICAL MONOSPACE SMALL S 24E2 ; [.1B33.0020.0006] # CIRCLED LATIN SMALL LETTER S 0053 ; [.1B33.0020.0008] # LATIN CAPITAL LETTER S 1F122 ; [*030A.0020.0004][.1B33.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER S 1F12A ; [*036C.0020.0004][.1B33.0020.000A][*036D.0020.0004] # TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S 1D412 ; [.1B33.0020.000B] # MATHEMATICAL BOLD CAPITAL S 1D446 ; [.1B33.0020.000B] # MATHEMATICAL ITALIC CAPITAL S 1D47A ; [.1B33.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL S 1D4AE ; [.1B33.0020.000B] # MATHEMATICAL SCRIPT CAPITAL S 1D4E2 ; [.1B33.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL S 1D516 ; [.1B33.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL S 1D54A ; [.1B33.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL S 1D57E ; [.1B33.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL S 1D5B2 ; [.1B33.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL S 1D5E6 ; [.1B33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL S 1D61A ; [.1B33.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL S 1D64E ; [.1B33.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S 1D682 ; [.1B33.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL S 24C8 ; [.1B33.0020.000C] # CIRCLED LATIN CAPITAL LETTER S 1F162 ; [.1B33.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER S 209B ; [.1B33.0020.0015] # LATIN SUBSCRIPT SMALL LETTER S 1F142 ; [.1B33.0020.001D] # SQUARED LATIN CAPITAL LETTER S 1F182 ; [.1B33.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER S 015B ; [.1B33.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER S WITH ACUTE 015A ; [.1B33.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER S WITH ACUTE 1E65 ; [.1B33.0020.0002][.0000.0024.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE 1E64 ; [.1B33.0020.0008][.0000.0024.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE 015D ; [.1B33.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER S WITH CIRCUMFLEX 015C ; [.1B33.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER S WITH CIRCUMFLEX 0161 ; [.1B33.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER S WITH CARON 0160 ; [.1B33.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER S WITH CARON 1E67 ; [.1B33.0020.0002][.0000.0028.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE 1E66 ; [.1B33.0020.0008][.0000.0028.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE 1E61 ; [.1B33.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT ABOVE 1E60 ; [.1B33.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT ABOVE 015F ; [.1B33.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER S WITH CEDILLA 015E ; [.1B33.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER S WITH CEDILLA A7A9 ; [.1B33.0020.0004][.0000.0035.0004] # LATIN SMALL LETTER S WITH OBLIQUE STROKE A7A8 ; [.1B33.0020.000A][.0000.0035.0004] # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE 1E63 ; [.1B33.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER S WITH DOT BELOW 1E62 ; [.1B33.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW 1E69 ; [.1B33.0020.0002][.0000.0042.0002][.0000.002E.0002] # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE 1E68 ; [.1B33.0020.0008][.0000.0042.0002][.0000.002E.0002] # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE 0219 ; [.1B33.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER S WITH COMMA BELOW 0218 ; [.1B33.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER S WITH COMMA BELOW 017F ; [.1B33.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER LONG S A785 ; [.1B33.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR S A784 ; [.1B33.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR S 1E9B ; [.1B33.0020.0004][.0000.0109.0004][.0000.002E.0002] # LATIN SMALL LETTER LONG S WITH DOT ABOVE 1F18D ; [.1B33.0020.001D][.190C.0020.001D] # NEGATIVE SQUARED SA 1F14C ; [.1B33.0020.001D][.1953.0020.001D] # SQUARED SD 2120 ; [.1B33.0020.0014][.1A6E.0020.0014] # SERVICE MARK 1F198 ; [.1B33.0020.001D][.1AA1.0020.001D][.1B33.0020.001D] # SQUARED SOS 1F14D ; [.1B33.0020.001D][.1B33.0020.001D] # SQUARED SS 00DF ; [.1B33.0020.0004][.0000.0108.0004][.1B33.0020.0004] # LATIN SMALL LETTER SHARP S 1E9E ; [.1B33.0020.000A][.0000.0108.0004][.1B33.0020.000A] # LATIN CAPITAL LETTER SHARP S FB06 ; [.1B33.0020.0004][.1B57.0020.0004] # LATIN SMALL LIGATURE ST FB05 ; [.1B33.0020.0004][.0000.0109.0004][.1B57.0020.0004] # LATIN SMALL LIGATURE LONG S T A731 ; [.1B37.0020.0002] # LATIN LETTER SMALL CAPITAL S 1D74 ; [.1B38.0020.0002] # LATIN SMALL LETTER S WITH MIDDLE TILDE 1D8A ; [.1B39.0020.0002] # LATIN SMALL LETTER S WITH PALATAL HOOK 0282 ; [.1B3A.0020.0002] # LATIN SMALL LETTER S WITH HOOK 1DB3 ; [.1B3A.0020.0014] # MODIFIER LETTER SMALL S WITH HOOK 023F ; [.1B3E.0020.0002] # LATIN SMALL LETTER S WITH SWASH TAIL 2C7E ; [.1B3E.0020.0008] # LATIN CAPITAL LETTER S WITH SWASH TAIL 1E9C ; [.1B42.0020.0002] # LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE 1E9D ; [.1B43.0020.0002] # LATIN SMALL LETTER LONG S WITH HIGH STROKE 0283 ; [.1B44.0020.0002] # LATIN SMALL LETTER ESH 01A9 ; [.1B44.0020.0008] # LATIN CAPITAL LETTER ESH 1DB4 ; [.1B44.0020.0014] # MODIFIER LETTER SMALL ESH 1D8B ; [.1B49.0020.0002] # LATIN SMALL LETTER ESH WITH PALATAL HOOK 01AA ; [.1B4A.0020.0002] # LATIN LETTER REVERSED ESH LOOP 0285 ; [.1B4E.0020.0002] # LATIN SMALL LETTER SQUAT REVERSED ESH 1D98 ; [.1B52.0020.0002] # LATIN SMALL LETTER ESH WITH RETROFLEX HOOK 0286 ; [.1B53.0020.0002] # LATIN SMALL LETTER ESH WITH CURL 0074 ; [.1B57.0020.0002] # LATIN SMALL LETTER T 24AF ; [*030A.0020.0004][.1B57.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER T 1D42D ; [.1B57.0020.0005] # MATHEMATICAL BOLD SMALL T 1D461 ; [.1B57.0020.0005] # MATHEMATICAL ITALIC SMALL T 1D495 ; [.1B57.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL T 1D4C9 ; [.1B57.0020.0005] # MATHEMATICAL SCRIPT SMALL T 1D4FD ; [.1B57.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL T 1D531 ; [.1B57.0020.0005] # MATHEMATICAL FRAKTUR SMALL T 1D565 ; [.1B57.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL T 1D599 ; [.1B57.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL T 1D5CD ; [.1B57.0020.0005] # MATHEMATICAL SANS-SERIF SMALL T 1D601 ; [.1B57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL T 1D635 ; [.1B57.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL T 1D669 ; [.1B57.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T 1D69D ; [.1B57.0020.0005] # MATHEMATICAL MONOSPACE SMALL T 24E3 ; [.1B57.0020.0006] # CIRCLED LATIN SMALL LETTER T 0054 ; [.1B57.0020.0008] # LATIN CAPITAL LETTER T 1F123 ; [*030A.0020.0004][.1B57.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER T 1D413 ; [.1B57.0020.000B] # MATHEMATICAL BOLD CAPITAL T 1D447 ; [.1B57.0020.000B] # MATHEMATICAL ITALIC CAPITAL T 1D47B ; [.1B57.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL T 1D4AF ; [.1B57.0020.000B] # MATHEMATICAL SCRIPT CAPITAL T 1D4E3 ; [.1B57.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL T 1D517 ; [.1B57.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL T 1D54B ; [.1B57.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL T 1D57F ; [.1B57.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL T 1D5B3 ; [.1B57.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL T 1D5E7 ; [.1B57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL T 1D61B ; [.1B57.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL T 1D64F ; [.1B57.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T 1D683 ; [.1B57.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL T 24C9 ; [.1B57.0020.000C] # CIRCLED LATIN CAPITAL LETTER T 1F163 ; [.1B57.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER T 1D57 ; [.1B57.0020.0014] # MODIFIER LETTER SMALL T 209C ; [.1B57.0020.0015] # LATIN SUBSCRIPT SMALL LETTER T 1D40 ; [.1B57.0020.001D] # MODIFIER LETTER CAPITAL T 1F143 ; [.1B57.0020.001D] # SQUARED LATIN CAPITAL LETTER T 1F183 ; [.1B57.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER T 0165 ; [.1B57.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER T WITH CARON 0164 ; [.1B57.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER T WITH CARON 1E97 ; [.1B57.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER T WITH DIAERESIS 1E6B ; [.1B57.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER T WITH DOT ABOVE 1E6A ; [.1B57.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER T WITH DOT ABOVE 0163 ; [.1B57.0020.0002][.0000.0030.0002] # LATIN SMALL LETTER T WITH CEDILLA 0162 ; [.1B57.0020.0008][.0000.0030.0002] # LATIN CAPITAL LETTER T WITH CEDILLA 1E6D ; [.1B57.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER T WITH DOT BELOW 1E6C ; [.1B57.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER T WITH DOT BELOW 021B ; [.1B57.0020.0002][.0000.0045.0002] # LATIN SMALL LETTER T WITH COMMA BELOW 021A ; [.1B57.0020.0008][.0000.0045.0002] # LATIN CAPITAL LETTER T WITH COMMA BELOW 1E71 ; [.1B57.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW 1E70 ; [.1B57.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW 1E6F ; [.1B57.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER T WITH LINE BELOW 1E6E ; [.1B57.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER T WITH LINE BELOW A787 ; [.1B57.0020.0004][.0000.0109.0004] # LATIN SMALL LETTER INSULAR T A786 ; [.1B57.0020.000A][.0000.0109.0004] # LATIN CAPITAL LETTER INSULAR T 02A8 ; [.1B57.0020.0004][.194D.0020.0004] # LATIN SMALL LETTER TC DIGRAPH WITH CURL 2121 ; [.1B57.0020.000A][.196E.0020.000A][.1A3B.0020.000A] # TELEPHONE SIGN 1D7A ; [.1B57.0020.0004][.0000.0108.0004][.19DC.0020.0004] # LATIN SMALL LETTER TH WITH STRIKETHROUGH 2122 ; [.1B57.0020.0014][.1A6E.0020.0014] # TRADE MARK SIGN 01BE ; [.1B57.0020.0004][.1B33.0020.0004] # LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE 02A6 ; [.1B57.0020.0004][.1B33.0020.0004] # LATIN SMALL LETTER TS DIGRAPH 02A7 ; [.1B57.0020.0004][.1B44.0020.0004] # LATIN SMALL LETTER TESH DIGRAPH A729 ; [.1B57.0020.0004][.1BE3.0020.0004] # LATIN SMALL LETTER TZ A728 ; [.1B57.0020.000A][.1BE3.0020.0004] # LATIN CAPITAL LETTER TZ 1D1B ; [.1B5B.0020.0002] # LATIN LETTER SMALL CAPITAL T 0167 ; [.1B5C.0020.0002] # LATIN SMALL LETTER T WITH STROKE 0166 ; [.1B5C.0020.0008] # LATIN CAPITAL LETTER T WITH STROKE 2C66 ; [.1B60.0020.0002] # LATIN SMALL LETTER T WITH DIAGONAL STROKE 023E ; [.1B60.0020.0008] # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE 1D75 ; [.1B61.0020.0002] # LATIN SMALL LETTER T WITH MIDDLE TILDE 01AB ; [.1B62.0020.0002] # LATIN SMALL LETTER T WITH PALATAL HOOK 1DB5 ; [.1B62.0020.0014] # MODIFIER LETTER SMALL T WITH PALATAL HOOK 01AD ; [.1B66.0020.0002] # LATIN SMALL LETTER T WITH HOOK 01AC ; [.1B66.0020.0008] # LATIN CAPITAL LETTER T WITH HOOK 0288 ; [.1B6A.0020.0002] # LATIN SMALL LETTER T WITH RETROFLEX HOOK 01AE ; [.1B6A.0020.0008] # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK 0236 ; [.1B6E.0020.0002] # LATIN SMALL LETTER T WITH CURL A777 ; [.1B72.0020.0002] # LATIN SMALL LETTER TUM 0287 ; [.1B73.0020.0002] # LATIN SMALL LETTER TURNED T A7B1 ; [.1B73.0020.0008] # LATIN CAPITAL LETTER TURNED T 0075 ; [.1B77.0020.0002] # LATIN SMALL LETTER U 24B0 ; [*030A.0020.0004][.1B77.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER U 1D42E ; [.1B77.0020.0005] # MATHEMATICAL BOLD SMALL U 1D462 ; [.1B77.0020.0005] # MATHEMATICAL ITALIC SMALL U 1D496 ; [.1B77.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL U 1D4CA ; [.1B77.0020.0005] # MATHEMATICAL SCRIPT SMALL U 1D4FE ; [.1B77.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL U 1D532 ; [.1B77.0020.0005] # MATHEMATICAL FRAKTUR SMALL U 1D566 ; [.1B77.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL U 1D59A ; [.1B77.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL U 1D5CE ; [.1B77.0020.0005] # MATHEMATICAL SANS-SERIF SMALL U 1D602 ; [.1B77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL U 1D636 ; [.1B77.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL U 1D66A ; [.1B77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U 1D69E ; [.1B77.0020.0005] # MATHEMATICAL MONOSPACE SMALL U 24E4 ; [.1B77.0020.0006] # CIRCLED LATIN SMALL LETTER U 0055 ; [.1B77.0020.0008] # LATIN CAPITAL LETTER U 1F124 ; [*030A.0020.0004][.1B77.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER U 1D414 ; [.1B77.0020.000B] # MATHEMATICAL BOLD CAPITAL U 1D448 ; [.1B77.0020.000B] # MATHEMATICAL ITALIC CAPITAL U 1D47C ; [.1B77.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL U 1D4B0 ; [.1B77.0020.000B] # MATHEMATICAL SCRIPT CAPITAL U 1D4E4 ; [.1B77.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL U 1D518 ; [.1B77.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL U 1D54C ; [.1B77.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL U 1D580 ; [.1B77.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL U 1D5B4 ; [.1B77.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL U 1D5E8 ; [.1B77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL U 1D61C ; [.1B77.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL U 1D650 ; [.1B77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U 1D684 ; [.1B77.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL U 24CA ; [.1B77.0020.000C] # CIRCLED LATIN CAPITAL LETTER U 1F164 ; [.1B77.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER U 1D58 ; [.1B77.0020.0014] # MODIFIER LETTER SMALL U 1D64 ; [.1B77.0020.0015] # LATIN SUBSCRIPT SMALL LETTER U 1D41 ; [.1B77.0020.001D] # MODIFIER LETTER CAPITAL U 1F144 ; [.1B77.0020.001D] # SQUARED LATIN CAPITAL LETTER U 1F184 ; [.1B77.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER U 00FA ; [.1B77.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH ACUTE 00DA ; [.1B77.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH ACUTE 00F9 ; [.1B77.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH GRAVE 00D9 ; [.1B77.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH GRAVE 016D ; [.1B77.0020.0002][.0000.0026.0002] # LATIN SMALL LETTER U WITH BREVE 016C ; [.1B77.0020.0008][.0000.0026.0002] # LATIN CAPITAL LETTER U WITH BREVE 00FB ; [.1B77.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX 00DB ; [.1B77.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX 01D4 ; [.1B77.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH CARON 01D3 ; [.1B77.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH CARON 016F ; [.1B77.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER U WITH RING ABOVE 016E ; [.1B77.0020.0008][.0000.0029.0002] # LATIN CAPITAL LETTER U WITH RING ABOVE 00FC ; [.1B77.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH DIAERESIS A79F ; [.1B77.0020.0004][.0000.002B.0004] # LATIN SMALL LETTER VOLAPUK UE 00DC ; [.1B77.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS A79E ; [.1B77.0020.000A][.0000.002B.0004] # LATIN CAPITAL LETTER VOLAPUK UE 01D8 ; [.1B77.0020.0002][.0000.002B.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE 01D7 ; [.1B77.0020.0008][.0000.002B.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE 01DC ; [.1B77.0020.0002][.0000.002B.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE 01DB ; [.1B77.0020.0008][.0000.002B.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE 01DA ; [.1B77.0020.0002][.0000.002B.0002][.0000.0028.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND CARON 01D9 ; [.1B77.0020.0008][.0000.002B.0002][.0000.0028.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON 01D6 ; [.1B77.0020.0002][.0000.002B.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON 01D5 ; [.1B77.0020.0008][.0000.002B.0002][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON 0171 ; [.1B77.0020.0002][.0000.002C.0002] # LATIN SMALL LETTER U WITH DOUBLE ACUTE 0170 ; [.1B77.0020.0008][.0000.002C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE 0169 ; [.1B77.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH TILDE 0168 ; [.1B77.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH TILDE 1E79 ; [.1B77.0020.0002][.0000.002D.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH TILDE AND ACUTE 1E78 ; [.1B77.0020.0008][.0000.002D.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE 0173 ; [.1B77.0020.0002][.0000.0031.0002] # LATIN SMALL LETTER U WITH OGONEK 0172 ; [.1B77.0020.0008][.0000.0031.0002] # LATIN CAPITAL LETTER U WITH OGONEK 016B ; [.1B77.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER U WITH MACRON 016A ; [.1B77.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER U WITH MACRON 1E7B ; [.1B77.0020.0002][.0000.0032.0002][.0000.002B.0002] # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS 1E7A ; [.1B77.0020.0008][.0000.0032.0002][.0000.002B.0002] # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS 1EE7 ; [.1B77.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HOOK ABOVE 1EE6 ; [.1B77.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HOOK ABOVE 0215 ; [.1B77.0020.0002][.0000.003C.0002] # LATIN SMALL LETTER U WITH DOUBLE GRAVE 0214 ; [.1B77.0020.0008][.0000.003C.0002] # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE 0217 ; [.1B77.0020.0002][.0000.003E.0002] # LATIN SMALL LETTER U WITH INVERTED BREVE 0216 ; [.1B77.0020.0008][.0000.003E.0002] # LATIN CAPITAL LETTER U WITH INVERTED BREVE 01B0 ; [.1B77.0020.0002][.0000.003F.0002] # LATIN SMALL LETTER U WITH HORN 01AF ; [.1B77.0020.0008][.0000.003F.0002] # LATIN CAPITAL LETTER U WITH HORN 1EE9 ; [.1B77.0020.0002][.0000.003F.0002][.0000.0024.0002] # LATIN SMALL LETTER U WITH HORN AND ACUTE 1EE8 ; [.1B77.0020.0008][.0000.003F.0002][.0000.0024.0002] # LATIN CAPITAL LETTER U WITH HORN AND ACUTE 1EEB ; [.1B77.0020.0002][.0000.003F.0002][.0000.0025.0002] # LATIN SMALL LETTER U WITH HORN AND GRAVE 1EEA ; [.1B77.0020.0008][.0000.003F.0002][.0000.0025.0002] # LATIN CAPITAL LETTER U WITH HORN AND GRAVE 1EEF ; [.1B77.0020.0002][.0000.003F.0002][.0000.002D.0002] # LATIN SMALL LETTER U WITH HORN AND TILDE 1EEE ; [.1B77.0020.0008][.0000.003F.0002][.0000.002D.0002] # LATIN CAPITAL LETTER U WITH HORN AND TILDE 1EED ; [.1B77.0020.0002][.0000.003F.0002][.0000.003B.0002] # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE 1EEC ; [.1B77.0020.0008][.0000.003F.0002][.0000.003B.0002] # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE 1EF1 ; [.1B77.0020.0002][.0000.003F.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH HORN AND DOT BELOW 1EF0 ; [.1B77.0020.0008][.0000.003F.0002][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW 1EE5 ; [.1B77.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER U WITH DOT BELOW 1EE4 ; [.1B77.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER U WITH DOT BELOW 1E73 ; [.1B77.0020.0002][.0000.0043.0002] # LATIN SMALL LETTER U WITH DIAERESIS BELOW 1E72 ; [.1B77.0020.0008][.0000.0043.0002] # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW 1E77 ; [.1B77.0020.0002][.0000.0046.0002] # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW 1E76 ; [.1B77.0020.0008][.0000.0046.0002] # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW 1E75 ; [.1B77.0020.0002][.0000.0048.0002] # LATIN SMALL LETTER U WITH TILDE BELOW 1E74 ; [.1B77.0020.0008][.0000.0048.0002] # LATIN CAPITAL LETTER U WITH TILDE BELOW 1F199 ; [.1B77.0020.001D][.1ACE.0020.001D][*025F.0020.001C] # SQUARED UP WITH EXCLAMATION MARK 1D1C ; [.1B7B.0020.0002] # LATIN LETTER SMALL CAPITAL U 1DB8 ; [.1B7B.0020.0014] # MODIFIER LETTER SMALL CAPITAL U 1D1D ; [.1B7D.0020.0002] # LATIN SMALL LETTER SIDEWAYS U 1D59 ; [.1B7D.0020.0014] # MODIFIER LETTER SMALL SIDEWAYS U 1D1E ; [.1B7E.0020.0002] # LATIN SMALL LETTER SIDEWAYS DIAERESIZED U 1D6B ; [.1B7F.0020.0002] # LATIN SMALL LETTER UE 0289 ; [.1B82.0020.0002] # LATIN SMALL LETTER U BAR 0244 ; [.1B82.0020.0008] # LATIN CAPITAL LETTER U BAR 1DB6 ; [.1B82.0020.0014] # MODIFIER LETTER SMALL U BAR 1D7E ; [.1B87.0020.0002] # LATIN SMALL CAPITAL LETTER U WITH STROKE 1D99 ; [.1B88.0020.0002] # LATIN SMALL LETTER U WITH RETROFLEX HOOK 0265 ; [.1B8A.0020.0002] # LATIN SMALL LETTER TURNED H A78D ; [.1B8A.0020.0008] # LATIN CAPITAL LETTER TURNED H 1DA3 ; [.1B8A.0020.0014] # MODIFIER LETTER SMALL TURNED H 02AE ; [.1B8E.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK 02AF ; [.1B92.0020.0002] # LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL 026F ; [.1B96.0020.0002] # LATIN SMALL LETTER TURNED M 019C ; [.1B96.0020.0008] # LATIN CAPITAL LETTER TURNED M 1D5A ; [.1B96.0020.0014] # MODIFIER LETTER SMALL TURNED M A7FA ; [.1B9A.0020.0002] # LATIN LETTER SMALL CAPITAL TURNED M 1D1F ; [.1B9B.0020.0002] # LATIN SMALL LETTER SIDEWAYS TURNED M 0270 ; [.1B9C.0020.0002] # LATIN SMALL LETTER TURNED M WITH LONG LEG 1DAD ; [.1B9C.0020.0014] # MODIFIER LETTER SMALL TURNED M WITH LONG LEG 028A ; [.1BA0.0020.0002] # LATIN SMALL LETTER UPSILON 01B1 ; [.1BA0.0020.0008] # LATIN CAPITAL LETTER UPSILON 1DB7 ; [.1BA0.0020.0014] # MODIFIER LETTER SMALL UPSILON 1D7F ; [.1BA4.0020.0002] # LATIN SMALL LETTER UPSILON WITH STROKE 0076 ; [.1BA5.0020.0002] # LATIN SMALL LETTER V 24B1 ; [*030A.0020.0004][.1BA5.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER V 1D42F ; [.1BA5.0020.0005] # MATHEMATICAL BOLD SMALL V 1D463 ; [.1BA5.0020.0005] # MATHEMATICAL ITALIC SMALL V 1D497 ; [.1BA5.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL V 1D4CB ; [.1BA5.0020.0005] # MATHEMATICAL SCRIPT SMALL V 1D4FF ; [.1BA5.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL V 1D533 ; [.1BA5.0020.0005] # MATHEMATICAL FRAKTUR SMALL V 1D567 ; [.1BA5.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL V 1D59B ; [.1BA5.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL V 1D5CF ; [.1BA5.0020.0005] # MATHEMATICAL SANS-SERIF SMALL V 1D603 ; [.1BA5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL V 1D637 ; [.1BA5.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL V 1D66B ; [.1BA5.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V 1D69F ; [.1BA5.0020.0005] # MATHEMATICAL MONOSPACE SMALL V 24E5 ; [.1BA5.0020.0006] # CIRCLED LATIN SMALL LETTER V 0056 ; [.1BA5.0020.0008] # LATIN CAPITAL LETTER V 1F125 ; [*030A.0020.0004][.1BA5.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER V 1D415 ; [.1BA5.0020.000B] # MATHEMATICAL BOLD CAPITAL V 1D449 ; [.1BA5.0020.000B] # MATHEMATICAL ITALIC CAPITAL V 1D47D ; [.1BA5.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL V 1D4B1 ; [.1BA5.0020.000B] # MATHEMATICAL SCRIPT CAPITAL V 1D4E5 ; [.1BA5.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL V 1D519 ; [.1BA5.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL V 1D54D ; [.1BA5.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL V 1D581 ; [.1BA5.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL V 1D5B5 ; [.1BA5.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL V 1D5E9 ; [.1BA5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL V 1D61D ; [.1BA5.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL V 1D651 ; [.1BA5.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V 1D685 ; [.1BA5.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL V 24CB ; [.1BA5.0020.000C] # CIRCLED LATIN CAPITAL LETTER V 1F165 ; [.1BA5.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER V 1D5B ; [.1BA5.0020.0014] # MODIFIER LETTER SMALL V 1D65 ; [.1BA5.0020.0015] # LATIN SUBSCRIPT SMALL LETTER V 2C7D ; [.1BA5.0020.001D] # MODIFIER LETTER CAPITAL V 1F145 ; [.1BA5.0020.001D] # SQUARED LATIN CAPITAL LETTER V 1F185 ; [.1BA5.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER V 1E7D ; [.1BA5.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER V WITH TILDE 1E7C ; [.1BA5.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER V WITH TILDE 1E7F ; [.1BA5.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER V WITH DOT BELOW 1E7E ; [.1BA5.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER V WITH DOT BELOW 1F19A ; [.1BA5.0020.001D][.1B33.0020.001D] # SQUARED VS A761 ; [.1BA5.0020.0004][.1BCD.0020.0004] # LATIN SMALL LETTER VY A760 ; [.1BA5.0020.000A][.1BCD.0020.000A] # LATIN CAPITAL LETTER VY 1D20 ; [.1BA9.0020.0002] # LATIN LETTER SMALL CAPITAL V A75F ; [.1BAA.0020.0002] # LATIN SMALL LETTER V WITH DIAGONAL STROKE A75E ; [.1BAA.0020.0008] # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE 1D8C ; [.1BAB.0020.0002] # LATIN SMALL LETTER V WITH PALATAL HOOK 028B ; [.1BAC.0020.0002] # LATIN SMALL LETTER V WITH HOOK 01B2 ; [.1BAC.0020.0008] # LATIN CAPITAL LETTER V WITH HOOK 1DB9 ; [.1BAC.0020.0014] # MODIFIER LETTER SMALL V WITH HOOK 2C71 ; [.1BB0.0020.0002] # LATIN SMALL LETTER V WITH RIGHT HOOK 2C74 ; [.1BB1.0020.0002] # LATIN SMALL LETTER V WITH CURL 1EFD ; [.1BB2.0020.0002] # LATIN SMALL LETTER MIDDLE-WELSH V 1EFC ; [.1BB2.0020.0008] # LATIN CAPITAL LETTER MIDDLE-WELSH V 028C ; [.1BB3.0020.0002] # LATIN SMALL LETTER TURNED V 0245 ; [.1BB3.0020.0008] # LATIN CAPITAL LETTER TURNED V 1DBA ; [.1BB3.0020.0014] # MODIFIER LETTER SMALL TURNED V 0077 ; [.1BB7.0020.0002] # LATIN SMALL LETTER W 24B2 ; [*030A.0020.0004][.1BB7.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER W 1D430 ; [.1BB7.0020.0005] # MATHEMATICAL BOLD SMALL W 1D464 ; [.1BB7.0020.0005] # MATHEMATICAL ITALIC SMALL W 1D498 ; [.1BB7.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL W 1D4CC ; [.1BB7.0020.0005] # MATHEMATICAL SCRIPT SMALL W 1D500 ; [.1BB7.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL W 1D534 ; [.1BB7.0020.0005] # MATHEMATICAL FRAKTUR SMALL W 1D568 ; [.1BB7.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL W 1D59C ; [.1BB7.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL W 1D5D0 ; [.1BB7.0020.0005] # MATHEMATICAL SANS-SERIF SMALL W 1D604 ; [.1BB7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL W 1D638 ; [.1BB7.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL W 1D66C ; [.1BB7.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W 1D6A0 ; [.1BB7.0020.0005] # MATHEMATICAL MONOSPACE SMALL W 24E6 ; [.1BB7.0020.0006] # CIRCLED LATIN SMALL LETTER W 0057 ; [.1BB7.0020.0008] # LATIN CAPITAL LETTER W 1F126 ; [*030A.0020.0004][.1BB7.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER W 1D416 ; [.1BB7.0020.000B] # MATHEMATICAL BOLD CAPITAL W 1D44A ; [.1BB7.0020.000B] # MATHEMATICAL ITALIC CAPITAL W 1D47E ; [.1BB7.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL W 1D4B2 ; [.1BB7.0020.000B] # MATHEMATICAL SCRIPT CAPITAL W 1D4E6 ; [.1BB7.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL W 1D51A ; [.1BB7.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL W 1D54E ; [.1BB7.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL W 1D582 ; [.1BB7.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL W 1D5B6 ; [.1BB7.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL W 1D5EA ; [.1BB7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL W 1D61E ; [.1BB7.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL W 1D652 ; [.1BB7.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W 1D686 ; [.1BB7.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL W 24CC ; [.1BB7.0020.000C] # CIRCLED LATIN CAPITAL LETTER W 1F166 ; [.1BB7.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER W 1D42 ; [.1BB7.0020.001D] # MODIFIER LETTER CAPITAL W 1F146 ; [.1BB7.0020.001D] # SQUARED LATIN CAPITAL LETTER W 1F186 ; [.1BB7.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER W 1E83 ; [.1BB7.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER W WITH ACUTE 1E82 ; [.1BB7.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER W WITH ACUTE 1E81 ; [.1BB7.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER W WITH GRAVE 1E80 ; [.1BB7.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER W WITH GRAVE 0175 ; [.1BB7.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER W WITH CIRCUMFLEX 0174 ; [.1BB7.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER W WITH CIRCUMFLEX 1E98 ; [.1BB7.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER W WITH RING ABOVE 1E85 ; [.1BB7.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER W WITH DIAERESIS 1E84 ; [.1BB7.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER W WITH DIAERESIS 1E87 ; [.1BB7.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER W WITH DOT ABOVE 1E86 ; [.1BB7.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER W WITH DOT ABOVE 1E89 ; [.1BB7.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER W WITH DOT BELOW 1E88 ; [.1BB7.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER W WITH DOT BELOW 1F14F ; [.1BB7.0020.001D][.193E.0020.001D] # SQUARED WC 1F18F ; [.1BB7.0020.001D][.193E.0020.001D] # NEGATIVE SQUARED WC 1F12E ; [.1BB7.0020.000C][.1BE3.0020.000C] # CIRCLED WZ 1D21 ; [.1BBB.0020.0002] # LATIN LETTER SMALL CAPITAL W 2C73 ; [.1BBC.0020.0002] # LATIN SMALL LETTER W WITH HOOK 2C72 ; [.1BBC.0020.0008] # LATIN CAPITAL LETTER W WITH HOOK 028D ; [.1BBD.0020.0002] # LATIN SMALL LETTER TURNED W 0078 ; [.1BC1.0020.0002] # LATIN SMALL LETTER X 24B3 ; [*030A.0020.0004][.1BC1.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER X 1D431 ; [.1BC1.0020.0005] # MATHEMATICAL BOLD SMALL X 1D465 ; [.1BC1.0020.0005] # MATHEMATICAL ITALIC SMALL X 1D499 ; [.1BC1.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL X 1D4CD ; [.1BC1.0020.0005] # MATHEMATICAL SCRIPT SMALL X 1D501 ; [.1BC1.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL X 1D535 ; [.1BC1.0020.0005] # MATHEMATICAL FRAKTUR SMALL X 1D569 ; [.1BC1.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL X 1D59D ; [.1BC1.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL X 1D5D1 ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF SMALL X 1D605 ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL X 1D639 ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL X 1D66D ; [.1BC1.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X 1D6A1 ; [.1BC1.0020.0005] # MATHEMATICAL MONOSPACE SMALL X 24E7 ; [.1BC1.0020.0006] # CIRCLED LATIN SMALL LETTER X 0058 ; [.1BC1.0020.0008] # LATIN CAPITAL LETTER X 1F127 ; [*030A.0020.0004][.1BC1.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER X 1D417 ; [.1BC1.0020.000B] # MATHEMATICAL BOLD CAPITAL X 1D44B ; [.1BC1.0020.000B] # MATHEMATICAL ITALIC CAPITAL X 1D47F ; [.1BC1.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL X 1D4B3 ; [.1BC1.0020.000B] # MATHEMATICAL SCRIPT CAPITAL X 1D4E7 ; [.1BC1.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL X 1D51B ; [.1BC1.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL X 1D54F ; [.1BC1.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL X 1D583 ; [.1BC1.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL X 1D5B7 ; [.1BC1.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL X 1D5EB ; [.1BC1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL X 1D61F ; [.1BC1.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL X 1D653 ; [.1BC1.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X 1D687 ; [.1BC1.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL X 24CD ; [.1BC1.0020.000C] # CIRCLED LATIN CAPITAL LETTER X 1F167 ; [.1BC1.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER X 2093 ; [.1BC1.0020.0015] # LATIN SUBSCRIPT SMALL LETTER X 1F147 ; [.1BC1.0020.001D] # SQUARED LATIN CAPITAL LETTER X 1F187 ; [.1BC1.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER X 1E8D ; [.1BC1.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER X WITH DIAERESIS 1E8C ; [.1BC1.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER X WITH DIAERESIS 1E8B ; [.1BC1.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER X WITH DOT ABOVE 1E8A ; [.1BC1.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER X WITH DOT ABOVE 1D8D ; [.1BC5.0020.0002] # LATIN SMALL LETTER X WITH PALATAL HOOK 0079 ; [.1BCD.0020.0002] # LATIN SMALL LETTER Y 24B4 ; [*030A.0020.0004][.1BCD.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Y 1D432 ; [.1BCD.0020.0005] # MATHEMATICAL BOLD SMALL Y 1D466 ; [.1BCD.0020.0005] # MATHEMATICAL ITALIC SMALL Y 1D49A ; [.1BCD.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Y 1D4CE ; [.1BCD.0020.0005] # MATHEMATICAL SCRIPT SMALL Y 1D502 ; [.1BCD.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Y 1D536 ; [.1BCD.0020.0005] # MATHEMATICAL FRAKTUR SMALL Y 1D56A ; [.1BCD.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Y 1D59E ; [.1BCD.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Y 1D5D2 ; [.1BCD.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Y 1D606 ; [.1BCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Y 1D63A ; [.1BCD.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Y 1D66E ; [.1BCD.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y 1D6A2 ; [.1BCD.0020.0005] # MATHEMATICAL MONOSPACE SMALL Y 24E8 ; [.1BCD.0020.0006] # CIRCLED LATIN SMALL LETTER Y 0059 ; [.1BCD.0020.0008] # LATIN CAPITAL LETTER Y 1F128 ; [*030A.0020.0004][.1BCD.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Y 1D418 ; [.1BCD.0020.000B] # MATHEMATICAL BOLD CAPITAL Y 1D44C ; [.1BCD.0020.000B] # MATHEMATICAL ITALIC CAPITAL Y 1D480 ; [.1BCD.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Y 1D4B4 ; [.1BCD.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Y 1D4E8 ; [.1BCD.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Y 1D51C ; [.1BCD.0020.000B] # MATHEMATICAL FRAKTUR CAPITAL Y 1D550 ; [.1BCD.0020.000B] # MATHEMATICAL DOUBLE-STRUCK CAPITAL Y 1D584 ; [.1BCD.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Y 1D5B8 ; [.1BCD.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Y 1D5EC ; [.1BCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Y 1D620 ; [.1BCD.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y 1D654 ; [.1BCD.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y 1D688 ; [.1BCD.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Y 24CE ; [.1BCD.0020.000C] # CIRCLED LATIN CAPITAL LETTER Y 1F168 ; [.1BCD.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Y 1F148 ; [.1BCD.0020.001D] # SQUARED LATIN CAPITAL LETTER Y 1F188 ; [.1BCD.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Y 00FD ; [.1BCD.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Y WITH ACUTE 00DD ; [.1BCD.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Y WITH ACUTE 1EF3 ; [.1BCD.0020.0002][.0000.0025.0002] # LATIN SMALL LETTER Y WITH GRAVE 1EF2 ; [.1BCD.0020.0008][.0000.0025.0002] # LATIN CAPITAL LETTER Y WITH GRAVE 0177 ; [.1BCD.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Y WITH CIRCUMFLEX 0176 ; [.1BCD.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX 1E99 ; [.1BCD.0020.0002][.0000.0029.0002] # LATIN SMALL LETTER Y WITH RING ABOVE 00FF ; [.1BCD.0020.0002][.0000.002B.0002] # LATIN SMALL LETTER Y WITH DIAERESIS 0178 ; [.1BCD.0020.0008][.0000.002B.0002] # LATIN CAPITAL LETTER Y WITH DIAERESIS 1EF9 ; [.1BCD.0020.0002][.0000.002D.0002] # LATIN SMALL LETTER Y WITH TILDE 1EF8 ; [.1BCD.0020.0008][.0000.002D.0002] # LATIN CAPITAL LETTER Y WITH TILDE 1E8F ; [.1BCD.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Y WITH DOT ABOVE 1E8E ; [.1BCD.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Y WITH DOT ABOVE 0233 ; [.1BCD.0020.0002][.0000.0032.0002] # LATIN SMALL LETTER Y WITH MACRON 0232 ; [.1BCD.0020.0008][.0000.0032.0002] # LATIN CAPITAL LETTER Y WITH MACRON 1EF7 ; [.1BCD.0020.0002][.0000.003B.0002] # LATIN SMALL LETTER Y WITH HOOK ABOVE 1EF6 ; [.1BCD.0020.0008][.0000.003B.0002] # LATIN CAPITAL LETTER Y WITH HOOK ABOVE 1EF5 ; [.1BCD.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Y WITH DOT BELOW 1EF4 ; [.1BCD.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Y WITH DOT BELOW 028F ; [.1BD1.0020.0002] # LATIN LETTER SMALL CAPITAL Y 024F ; [.1BD5.0020.0002] # LATIN SMALL LETTER Y WITH STROKE 024E ; [.1BD5.0020.0008] # LATIN CAPITAL LETTER Y WITH STROKE 01B4 ; [.1BD9.0020.0002] # LATIN SMALL LETTER Y WITH HOOK 01B3 ; [.1BD9.0020.0008] # LATIN CAPITAL LETTER Y WITH HOOK 1EFF ; [.1BDD.0020.0002] # LATIN SMALL LETTER Y WITH LOOP 1EFE ; [.1BDD.0020.0008] # LATIN CAPITAL LETTER Y WITH LOOP 021D ; [.1BDF.0020.0002] # LATIN SMALL LETTER YOGH 021C ; [.1BDF.0020.0008] # LATIN CAPITAL LETTER YOGH 007A ; [.1BE3.0020.0002] # LATIN SMALL LETTER Z 24B5 ; [*030A.0020.0004][.1BE3.0020.0004][*030B.0020.0004] # PARENTHESIZED LATIN SMALL LETTER Z 1D433 ; [.1BE3.0020.0005] # MATHEMATICAL BOLD SMALL Z 1D467 ; [.1BE3.0020.0005] # MATHEMATICAL ITALIC SMALL Z 1D49B ; [.1BE3.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL Z 1D4CF ; [.1BE3.0020.0005] # MATHEMATICAL SCRIPT SMALL Z 1D503 ; [.1BE3.0020.0005] # MATHEMATICAL BOLD SCRIPT SMALL Z 1D537 ; [.1BE3.0020.0005] # MATHEMATICAL FRAKTUR SMALL Z 1D56B ; [.1BE3.0020.0005] # MATHEMATICAL DOUBLE-STRUCK SMALL Z 1D59F ; [.1BE3.0020.0005] # MATHEMATICAL BOLD FRAKTUR SMALL Z 1D5D3 ; [.1BE3.0020.0005] # MATHEMATICAL SANS-SERIF SMALL Z 1D607 ; [.1BE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL Z 1D63B ; [.1BE3.0020.0005] # MATHEMATICAL SANS-SERIF ITALIC SMALL Z 1D66F ; [.1BE3.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z 1D6A3 ; [.1BE3.0020.0005] # MATHEMATICAL MONOSPACE SMALL Z 24E9 ; [.1BE3.0020.0006] # CIRCLED LATIN SMALL LETTER Z 005A ; [.1BE3.0020.0008] # LATIN CAPITAL LETTER Z 1F129 ; [*030A.0020.0004][.1BE3.0020.000A][*030B.0020.0004] # PARENTHESIZED LATIN CAPITAL LETTER Z 2124 ; [.1BE3.0020.000B] # DOUBLE-STRUCK CAPITAL Z 2128 ; [.1BE3.0020.000B] # BLACK-LETTER CAPITAL Z 1D419 ; [.1BE3.0020.000B] # MATHEMATICAL BOLD CAPITAL Z 1D44D ; [.1BE3.0020.000B] # MATHEMATICAL ITALIC CAPITAL Z 1D481 ; [.1BE3.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL Z 1D4B5 ; [.1BE3.0020.000B] # MATHEMATICAL SCRIPT CAPITAL Z 1D4E9 ; [.1BE3.0020.000B] # MATHEMATICAL BOLD SCRIPT CAPITAL Z 1D585 ; [.1BE3.0020.000B] # MATHEMATICAL BOLD FRAKTUR CAPITAL Z 1D5B9 ; [.1BE3.0020.000B] # MATHEMATICAL SANS-SERIF CAPITAL Z 1D5ED ; [.1BE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL Z 1D621 ; [.1BE3.0020.000B] # MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z 1D655 ; [.1BE3.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z 1D689 ; [.1BE3.0020.000B] # MATHEMATICAL MONOSPACE CAPITAL Z 24CF ; [.1BE3.0020.000C] # CIRCLED LATIN CAPITAL LETTER Z 1F169 ; [.1BE3.0020.000C] # NEGATIVE CIRCLED LATIN CAPITAL LETTER Z 1DBB ; [.1BE3.0020.0014] # MODIFIER LETTER SMALL Z 1F149 ; [.1BE3.0020.001D] # SQUARED LATIN CAPITAL LETTER Z 1F189 ; [.1BE3.0020.001D] # NEGATIVE SQUARED LATIN CAPITAL LETTER Z 017A ; [.1BE3.0020.0002][.0000.0024.0002] # LATIN SMALL LETTER Z WITH ACUTE 0179 ; [.1BE3.0020.0008][.0000.0024.0002] # LATIN CAPITAL LETTER Z WITH ACUTE 1E91 ; [.1BE3.0020.0002][.0000.0027.0002] # LATIN SMALL LETTER Z WITH CIRCUMFLEX 1E90 ; [.1BE3.0020.0008][.0000.0027.0002] # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX 017E ; [.1BE3.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER Z WITH CARON 017D ; [.1BE3.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER Z WITH CARON 017C ; [.1BE3.0020.0002][.0000.002E.0002] # LATIN SMALL LETTER Z WITH DOT ABOVE 017B ; [.1BE3.0020.0008][.0000.002E.0002] # LATIN CAPITAL LETTER Z WITH DOT ABOVE 1E93 ; [.1BE3.0020.0002][.0000.0042.0002] # LATIN SMALL LETTER Z WITH DOT BELOW 1E92 ; [.1BE3.0020.0008][.0000.0042.0002] # LATIN CAPITAL LETTER Z WITH DOT BELOW 1E95 ; [.1BE3.0020.0002][.0000.0049.0002] # LATIN SMALL LETTER Z WITH LINE BELOW 1E94 ; [.1BE3.0020.0008][.0000.0049.0002] # LATIN CAPITAL LETTER Z WITH LINE BELOW 018D ; [.1BE3.0020.0004][.1BB7.0020.0004] # LATIN SMALL LETTER TURNED DELTA 1D22 ; [.1BE7.0020.0002] # LATIN LETTER SMALL CAPITAL Z 01B6 ; [.1BE8.0020.0002] # LATIN SMALL LETTER Z WITH STROKE 01B5 ; [.1BE8.0020.0008] # LATIN CAPITAL LETTER Z WITH STROKE 1D76 ; [.1BEC.0020.0002] # LATIN SMALL LETTER Z WITH MIDDLE TILDE 1D8E ; [.1BED.0020.0002] # LATIN SMALL LETTER Z WITH PALATAL HOOK 0225 ; [.1BEE.0020.0002] # LATIN SMALL LETTER Z WITH HOOK 0224 ; [.1BEE.0020.0008] # LATIN CAPITAL LETTER Z WITH HOOK 0290 ; [.1BF2.0020.0002] # LATIN SMALL LETTER Z WITH RETROFLEX HOOK 1DBC ; [.1BF2.0020.0014] # MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK 0291 ; [.1BF6.0020.0002] # LATIN SMALL LETTER Z WITH CURL 1DBD ; [.1BF6.0020.0014] # MODIFIER LETTER SMALL Z WITH CURL 0240 ; [.1BFA.0020.0002] # LATIN SMALL LETTER Z WITH SWASH TAIL 2C7F ; [.1BFA.0020.0008] # LATIN CAPITAL LETTER Z WITH SWASH TAIL 2C6C ; [.1BFE.0020.0002] # LATIN SMALL LETTER Z WITH DESCENDER 2C6B ; [.1BFE.0020.0008] # LATIN CAPITAL LETTER Z WITH DESCENDER A763 ; [.1BFF.0020.0002] # LATIN SMALL LETTER VISIGOTHIC Z A762 ; [.1BFF.0020.0008] # LATIN CAPITAL LETTER VISIGOTHIC Z 0292 ; [.1C00.0020.0002] # LATIN SMALL LETTER EZH 01B7 ; [.1C00.0020.0008] # LATIN CAPITAL LETTER EZH 1DBE ; [.1C00.0020.0014] # MODIFIER LETTER SMALL EZH 01EF ; [.1C00.0020.0002][.0000.0028.0002] # LATIN SMALL LETTER EZH WITH CARON 01EE ; [.1C00.0020.0008][.0000.0028.0002] # LATIN CAPITAL LETTER EZH WITH CARON 1D23 ; [.1C04.0020.0002] # LATIN LETTER SMALL CAPITAL EZH 01B9 ; [.1C05.0020.0002] # LATIN SMALL LETTER EZH REVERSED 01B8 ; [.1C05.0020.0008] # LATIN CAPITAL LETTER EZH REVERSED 1D9A ; [.1C09.0020.0002] # LATIN SMALL LETTER EZH WITH RETROFLEX HOOK 01BA ; [.1C0A.0020.0002] # LATIN SMALL LETTER EZH WITH TAIL 0293 ; [.1C0E.0020.0002] # LATIN SMALL LETTER EZH WITH CURL 00FE ; [.1C12.0020.0002] # LATIN SMALL LETTER THORN 00DE ; [.1C12.0020.0008] # LATIN CAPITAL LETTER THORN A765 ; [.1C16.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE A764 ; [.1C16.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE A767 ; [.1C17.0020.0002] # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER A766 ; [.1C17.0020.0008] # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER 01BF ; [.1C18.0020.0002] # LATIN LETTER WYNN 01F7 ; [.1C18.0020.0008] # LATIN CAPITAL LETTER WYNN A769 ; [.1C1C.0020.0002] # LATIN SMALL LETTER VEND A768 ; [.1C1C.0020.0008] # LATIN CAPITAL LETTER VEND A76B ; [.1C1D.0020.0002] # LATIN SMALL LETTER ET A76A ; [.1C1D.0020.0008] # LATIN CAPITAL LETTER ET A76D ; [.1C1E.0020.0002] # LATIN SMALL LETTER IS A76C ; [.1C1E.0020.0008] # LATIN CAPITAL LETTER IS A76F ; [.1C1F.0020.0002] # LATIN SMALL LETTER CON A76E ; [.1C1F.0020.0008] # LATIN CAPITAL LETTER CON A770 ; [.1C1F.0020.0014] # MODIFIER LETTER US A778 ; [.1C20.0020.0002] # LATIN SMALL LETTER UM 01BB ; [.1C21.0020.0002] # LATIN LETTER TWO WITH STROKE A72B ; [.1C25.0020.0002] # LATIN SMALL LETTER TRESILLO A72A ; [.1C25.0020.0008] # LATIN CAPITAL LETTER TRESILLO A72D ; [.1C26.0020.0002] # LATIN SMALL LETTER CUATRILLO A72C ; [.1C26.0020.0008] # LATIN CAPITAL LETTER CUATRILLO A72F ; [.1C27.0020.0002] # LATIN SMALL LETTER CUATRILLO WITH COMMA A72E ; [.1C27.0020.0008] # LATIN CAPITAL LETTER CUATRILLO WITH COMMA 01A8 ; [.1C28.0020.0002] # LATIN SMALL LETTER TONE TWO 01A7 ; [.1C28.0020.0008] # LATIN CAPITAL LETTER TONE TWO 01BD ; [.1C2C.0020.0002] # LATIN SMALL LETTER TONE FIVE 01BC ; [.1C2C.0020.0008] # LATIN CAPITAL LETTER TONE FIVE 0185 ; [.1C30.0020.0002] # LATIN SMALL LETTER TONE SIX 0184 ; [.1C30.0020.0008] # LATIN CAPITAL LETTER TONE SIX 0294 ; [.1C34.0020.0002] # LATIN LETTER GLOTTAL STOP 0242 ; [.1C38.0020.0002] # LATIN SMALL LETTER GLOTTAL STOP 0241 ; [.1C38.0020.0008] # LATIN CAPITAL LETTER GLOTTAL STOP 0149 ; [.1C3D.0020.0004][.1A7D.0020.0004] # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE A723 ; [.1C40.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL ALEF A722 ; [.1C40.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF A78C ; [.1C41.0020.0002] # LATIN SMALL LETTER SALTILLO A78B ; [.1C41.0020.0008] # LATIN CAPITAL LETTER SALTILLO 0295 ; [.1C42.0020.0002] # LATIN LETTER PHARYNGEAL VOICED FRICATIVE 1D24 ; [.1C48.0020.0002] # LATIN LETTER VOICED LARYNGEAL SPIRANT 1D25 ; [.1C49.0020.0002] # LATIN LETTER AIN 1D5C ; [.1C49.0020.0014] # MODIFIER LETTER SMALL AIN A725 ; [.1C4A.0020.0002] # LATIN SMALL LETTER EGYPTOLOGICAL AIN A724 ; [.1C4A.0020.0008] # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN 02A1 ; [.1C4B.0020.0002] # LATIN LETTER GLOTTAL STOP WITH STROKE 02A2 ; [.1C4F.0020.0002] # LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE 0296 ; [.1C53.0020.0002] # LATIN LETTER INVERTED GLOTTAL STOP 01C0 ; [.1C57.0020.0002] # LATIN LETTER DENTAL CLICK 01C1 ; [.1C5B.0020.0002] # LATIN LETTER LATERAL CLICK 01C2 ; [.1C5F.0020.0002] # LATIN LETTER ALVEOLAR CLICK 01C3 ; [.1C63.0020.0002] # LATIN LETTER RETROFLEX CLICK 0297 ; [.1C67.0020.0002] # LATIN LETTER STRETCHED C 0298 ; [.1C6B.0020.0002] # LATIN LETTER BILABIAL CLICK 02AC ; [.1C6F.0020.0002] # LATIN LETTER BILABIAL PERCUSSIVE 02AD ; [.1C73.0020.0002] # LATIN LETTER BIDENTAL PERCUSSIVE 1D6C2 ; [.1C77.0020.0005] # MATHEMATICAL BOLD SMALL ALPHA 1D6FC ; [.1C77.0020.0005] # MATHEMATICAL ITALIC SMALL ALPHA 1D736 ; [.1C77.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ALPHA 1D770 ; [.1C77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA 1D7AA ; [.1C77.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA 1D6A8 ; [.1C77.0020.000B] # MATHEMATICAL BOLD CAPITAL ALPHA 1D6E2 ; [.1C77.0020.000B] # MATHEMATICAL ITALIC CAPITAL ALPHA 1D71C ; [.1C77.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ALPHA 1D756 ; [.1C77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA 1D790 ; [.1C77.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA 1D6C3 ; [.1C78.0020.0005] # MATHEMATICAL BOLD SMALL BETA 1D6FD ; [.1C78.0020.0005] # MATHEMATICAL ITALIC SMALL BETA 1D737 ; [.1C78.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL BETA 1D771 ; [.1C78.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL BETA 1D7AB ; [.1C78.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA 1D6A9 ; [.1C78.0020.000B] # MATHEMATICAL BOLD CAPITAL BETA 1D6E3 ; [.1C78.0020.000B] # MATHEMATICAL ITALIC CAPITAL BETA 1D71D ; [.1C78.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL BETA 1D757 ; [.1C78.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA 1D791 ; [.1C78.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA 1D5D ; [.1C78.0020.0014] # MODIFIER LETTER SMALL BETA 1D66 ; [.1C78.0020.0015] # GREEK SUBSCRIPT SMALL LETTER BETA 213D ; [.1C79.0020.0005] # DOUBLE-STRUCK SMALL GAMMA 1D6C4 ; [.1C79.0020.0005] # MATHEMATICAL BOLD SMALL GAMMA 1D6FE ; [.1C79.0020.0005] # MATHEMATICAL ITALIC SMALL GAMMA 1D738 ; [.1C79.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL GAMMA 1D772 ; [.1C79.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA 1D7AC ; [.1C79.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA 213E ; [.1C79.0020.000B] # DOUBLE-STRUCK CAPITAL GAMMA 1D6AA ; [.1C79.0020.000B] # MATHEMATICAL BOLD CAPITAL GAMMA 1D6E4 ; [.1C79.0020.000B] # MATHEMATICAL ITALIC CAPITAL GAMMA 1D71E ; [.1C79.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL GAMMA 1D758 ; [.1C79.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA 1D792 ; [.1C79.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA 1D5E ; [.1C79.0020.0014] # MODIFIER LETTER SMALL GREEK GAMMA 1D67 ; [.1C79.0020.0015] # GREEK SUBSCRIPT SMALL LETTER GAMMA 1D26 ; [.1C7A.0020.0002] # GREEK LETTER SMALL CAPITAL GAMMA 1D6C5 ; [.1C7B.0020.0005] # MATHEMATICAL BOLD SMALL DELTA 1D6FF ; [.1C7B.0020.0005] # MATHEMATICAL ITALIC SMALL DELTA 1D739 ; [.1C7B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL DELTA 1D773 ; [.1C7B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL DELTA 1D7AD ; [.1C7B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA 1D6AB ; [.1C7B.0020.000B] # MATHEMATICAL BOLD CAPITAL DELTA 1D6E5 ; [.1C7B.0020.000B] # MATHEMATICAL ITALIC CAPITAL DELTA 1D71F ; [.1C7B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL DELTA 1D759 ; [.1C7B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA 1D793 ; [.1C7B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA 1D5F ; [.1C7B.0020.0014] # MODIFIER LETTER SMALL DELTA 1D6C6 ; [.1C7C.0020.0005] # MATHEMATICAL BOLD SMALL EPSILON 1D6DC ; [.1C7C.0020.0005] # MATHEMATICAL BOLD EPSILON SYMBOL 1D700 ; [.1C7C.0020.0005] # MATHEMATICAL ITALIC SMALL EPSILON 1D716 ; [.1C7C.0020.0005] # MATHEMATICAL ITALIC EPSILON SYMBOL 1D73A ; [.1C7C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL EPSILON 1D750 ; [.1C7C.0020.0005] # MATHEMATICAL BOLD ITALIC EPSILON SYMBOL 1D774 ; [.1C7C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON 1D78A ; [.1C7C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL 1D7AE ; [.1C7C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON 1D7C4 ; [.1C7C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL 1D6AC ; [.1C7C.0020.000B] # MATHEMATICAL BOLD CAPITAL EPSILON 1D6E6 ; [.1C7C.0020.000B] # MATHEMATICAL ITALIC CAPITAL EPSILON 1D720 ; [.1C7C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL EPSILON 1D75A ; [.1C7C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON 1D794 ; [.1C7C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON 1D7CB ; [.1C7D.0020.0005] # MATHEMATICAL BOLD SMALL DIGAMMA 1D7CA ; [.1C7D.0020.000B] # MATHEMATICAL BOLD CAPITAL DIGAMMA 1D6C7 ; [.1C80.0020.0005] # MATHEMATICAL BOLD SMALL ZETA 1D701 ; [.1C80.0020.0005] # MATHEMATICAL ITALIC SMALL ZETA 1D73B ; [.1C80.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ZETA 1D775 ; [.1C80.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ZETA 1D7AF ; [.1C80.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA 1D6AD ; [.1C80.0020.000B] # MATHEMATICAL BOLD CAPITAL ZETA 1D6E7 ; [.1C80.0020.000B] # MATHEMATICAL ITALIC CAPITAL ZETA 1D721 ; [.1C80.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ZETA 1D75B ; [.1C80.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA 1D795 ; [.1C80.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA 1D6C8 ; [.1C82.0020.0005] # MATHEMATICAL BOLD SMALL ETA 1D702 ; [.1C82.0020.0005] # MATHEMATICAL ITALIC SMALL ETA 1D73C ; [.1C82.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL ETA 1D776 ; [.1C82.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL ETA 1D7B0 ; [.1C82.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA 1D6AE ; [.1C82.0020.000B] # MATHEMATICAL BOLD CAPITAL ETA 1D6E8 ; [.1C82.0020.000B] # MATHEMATICAL ITALIC CAPITAL ETA 1D722 ; [.1C82.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL ETA 1D75C ; [.1C82.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA 1D796 ; [.1C82.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA 1D6C9 ; [.1C83.0020.0005] # MATHEMATICAL BOLD SMALL THETA 1D6DD ; [.1C83.0020.0005] # MATHEMATICAL BOLD THETA SYMBOL 1D703 ; [.1C83.0020.0005] # MATHEMATICAL ITALIC SMALL THETA 1D717 ; [.1C83.0020.0005] # MATHEMATICAL ITALIC THETA SYMBOL 1D73D ; [.1C83.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL THETA 1D751 ; [.1C83.0020.0005] # MATHEMATICAL BOLD ITALIC THETA SYMBOL 1D777 ; [.1C83.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL THETA 1D78B ; [.1C83.0020.0005] # MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL 1D7B1 ; [.1C83.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA 1D7C5 ; [.1C83.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL 1D6AF ; [.1C83.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA 1D6B9 ; [.1C83.0020.000B] # MATHEMATICAL BOLD CAPITAL THETA SYMBOL 1D6E9 ; [.1C83.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA 1D6F3 ; [.1C83.0020.000B] # MATHEMATICAL ITALIC CAPITAL THETA SYMBOL 1D723 ; [.1C83.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA 1D72D ; [.1C83.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL 1D75D ; [.1C83.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA 1D767 ; [.1C83.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL 1D797 ; [.1C83.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA 1D7A1 ; [.1C83.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL 1DBF ; [.1C83.0020.0014] # MODIFIER LETTER SMALL THETA 1D6CA ; [.1C84.0020.0005] # MATHEMATICAL BOLD SMALL IOTA 1D704 ; [.1C84.0020.0005] # MATHEMATICAL ITALIC SMALL IOTA 1D73E ; [.1C84.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL IOTA 1D778 ; [.1C84.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL IOTA 1D7B2 ; [.1C84.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA 1D6B0 ; [.1C84.0020.000B] # MATHEMATICAL BOLD CAPITAL IOTA 1D6EA ; [.1C84.0020.000B] # MATHEMATICAL ITALIC CAPITAL IOTA 1D724 ; [.1C84.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL IOTA 1D75E ; [.1C84.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA 1D798 ; [.1C84.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA 1D6CB ; [.1C86.0020.0005] # MATHEMATICAL BOLD SMALL KAPPA 1D6DE ; [.1C86.0020.0005] # MATHEMATICAL BOLD KAPPA SYMBOL 1D705 ; [.1C86.0020.0005] # MATHEMATICAL ITALIC SMALL KAPPA 1D718 ; [.1C86.0020.0005] # MATHEMATICAL ITALIC KAPPA SYMBOL 1D73F ; [.1C86.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL KAPPA 1D752 ; [.1C86.0020.0005] # MATHEMATICAL BOLD ITALIC KAPPA SYMBOL 1D779 ; [.1C86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA 1D78C ; [.1C86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL 1D7B3 ; [.1C86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA 1D7C6 ; [.1C86.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL 1D6B1 ; [.1C86.0020.000B] # MATHEMATICAL BOLD CAPITAL KAPPA 1D6EB ; [.1C86.0020.000B] # MATHEMATICAL ITALIC CAPITAL KAPPA 1D725 ; [.1C86.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL KAPPA 1D75F ; [.1C86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA 1D799 ; [.1C86.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA 1D6CC ; [.1C87.0020.0005] # MATHEMATICAL BOLD SMALL LAMDA 1D706 ; [.1C87.0020.0005] # MATHEMATICAL ITALIC SMALL LAMDA 1D740 ; [.1C87.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL LAMDA 1D77A ; [.1C87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA 1D7B4 ; [.1C87.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA 1D6B2 ; [.1C87.0020.000B] # MATHEMATICAL BOLD CAPITAL LAMDA 1D6EC ; [.1C87.0020.000B] # MATHEMATICAL ITALIC CAPITAL LAMDA 1D726 ; [.1C87.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL LAMDA 1D760 ; [.1C87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA 1D79A ; [.1C87.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA 1D27 ; [.1C88.0020.0002] # GREEK LETTER SMALL CAPITAL LAMDA 00B5 ; [.1C89.0020.0004] # MICRO SIGN 1D6CD ; [.1C89.0020.0005] # MATHEMATICAL BOLD SMALL MU 1D707 ; [.1C89.0020.0005] # MATHEMATICAL ITALIC SMALL MU 1D741 ; [.1C89.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL MU 1D77B ; [.1C89.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL MU 1D7B5 ; [.1C89.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU 1D6B3 ; [.1C89.0020.000B] # MATHEMATICAL BOLD CAPITAL MU 1D6ED ; [.1C89.0020.000B] # MATHEMATICAL ITALIC CAPITAL MU 1D727 ; [.1C89.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL MU 1D761 ; [.1C89.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL MU 1D79B ; [.1C89.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU 1D6CE ; [.1C8A.0020.0005] # MATHEMATICAL BOLD SMALL NU 1D708 ; [.1C8A.0020.0005] # MATHEMATICAL ITALIC SMALL NU 1D742 ; [.1C8A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL NU 1D77C ; [.1C8A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL NU 1D7B6 ; [.1C8A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU 1D6B4 ; [.1C8A.0020.000B] # MATHEMATICAL BOLD CAPITAL NU 1D6EE ; [.1C8A.0020.000B] # MATHEMATICAL ITALIC CAPITAL NU 1D728 ; [.1C8A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL NU 1D762 ; [.1C8A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL NU 1D79C ; [.1C8A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU 1D6CF ; [.1C8B.0020.0005] # MATHEMATICAL BOLD SMALL XI 1D709 ; [.1C8B.0020.0005] # MATHEMATICAL ITALIC SMALL XI 1D743 ; [.1C8B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL XI 1D77D ; [.1C8B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL XI 1D7B7 ; [.1C8B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI 1D6B5 ; [.1C8B.0020.000B] # MATHEMATICAL BOLD CAPITAL XI 1D6EF ; [.1C8B.0020.000B] # MATHEMATICAL ITALIC CAPITAL XI 1D729 ; [.1C8B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL XI 1D763 ; [.1C8B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL XI 1D79D ; [.1C8B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI 1D6D0 ; [.1C8C.0020.0005] # MATHEMATICAL BOLD SMALL OMICRON 1D70A ; [.1C8C.0020.0005] # MATHEMATICAL ITALIC SMALL OMICRON 1D744 ; [.1C8C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMICRON 1D77E ; [.1C8C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON 1D7B8 ; [.1C8C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON 1D6B6 ; [.1C8C.0020.000B] # MATHEMATICAL BOLD CAPITAL OMICRON 1D6F0 ; [.1C8C.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMICRON 1D72A ; [.1C8C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMICRON 1D764 ; [.1C8C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON 1D79E ; [.1C8C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON 213C ; [.1C8D.0020.0005] # DOUBLE-STRUCK SMALL PI 1D6D1 ; [.1C8D.0020.0005] # MATHEMATICAL BOLD SMALL PI 1D6E1 ; [.1C8D.0020.0005] # MATHEMATICAL BOLD PI SYMBOL 1D70B ; [.1C8D.0020.0005] # MATHEMATICAL ITALIC SMALL PI 1D71B ; [.1C8D.0020.0005] # MATHEMATICAL ITALIC PI SYMBOL 1D745 ; [.1C8D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PI 1D755 ; [.1C8D.0020.0005] # MATHEMATICAL BOLD ITALIC PI SYMBOL 1D77F ; [.1C8D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PI 1D78F ; [.1C8D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PI SYMBOL 1D7B9 ; [.1C8D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI 1D7C9 ; [.1C8D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL 213F ; [.1C8D.0020.000B] # DOUBLE-STRUCK CAPITAL PI 1D6B7 ; [.1C8D.0020.000B] # MATHEMATICAL BOLD CAPITAL PI 1D6F1 ; [.1C8D.0020.000B] # MATHEMATICAL ITALIC CAPITAL PI 1D72B ; [.1C8D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PI 1D765 ; [.1C8D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PI 1D79F ; [.1C8D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI 1D28 ; [.1C8E.0020.0002] # GREEK LETTER SMALL CAPITAL PI 1D6D2 ; [.1C92.0020.0005] # MATHEMATICAL BOLD SMALL RHO 1D6E0 ; [.1C92.0020.0005] # MATHEMATICAL BOLD RHO SYMBOL 1D70C ; [.1C92.0020.0005] # MATHEMATICAL ITALIC SMALL RHO 1D71A ; [.1C92.0020.0005] # MATHEMATICAL ITALIC RHO SYMBOL 1D746 ; [.1C92.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL RHO 1D754 ; [.1C92.0020.0005] # MATHEMATICAL BOLD ITALIC RHO SYMBOL 1D780 ; [.1C92.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL RHO 1D78E ; [.1C92.0020.0005] # MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL 1D7BA ; [.1C92.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO 1D7C8 ; [.1C92.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL 1D6B8 ; [.1C92.0020.000B] # MATHEMATICAL BOLD CAPITAL RHO 1D6F2 ; [.1C92.0020.000B] # MATHEMATICAL ITALIC CAPITAL RHO 1D72C ; [.1C92.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL RHO 1D766 ; [.1C92.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO 1D7A0 ; [.1C92.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO 1D68 ; [.1C92.0020.0015] # GREEK SUBSCRIPT SMALL LETTER RHO 1D29 ; [.1C93.0020.0002] # GREEK LETTER SMALL CAPITAL RHO 1D6D3 ; [.1C95.0020.0005] # MATHEMATICAL BOLD SMALL FINAL SIGMA 1D6D4 ; [.1C95.0020.0005] # MATHEMATICAL BOLD SMALL SIGMA 1D70D ; [.1C95.0020.0005] # MATHEMATICAL ITALIC SMALL FINAL SIGMA 1D70E ; [.1C95.0020.0005] # MATHEMATICAL ITALIC SMALL SIGMA 1D747 ; [.1C95.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA 1D748 ; [.1C95.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL SIGMA 1D781 ; [.1C95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA 1D782 ; [.1C95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA 1D7BB ; [.1C95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA 1D7BC ; [.1C95.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA 1D6BA ; [.1C95.0020.000B] # MATHEMATICAL BOLD CAPITAL SIGMA 1D6F4 ; [.1C95.0020.000B] # MATHEMATICAL ITALIC CAPITAL SIGMA 1D72E ; [.1C95.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL SIGMA 1D768 ; [.1C95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA 1D7A2 ; [.1C95.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA 1D6D5 ; [.1C99.0020.0005] # MATHEMATICAL BOLD SMALL TAU 1D70F ; [.1C99.0020.0005] # MATHEMATICAL ITALIC SMALL TAU 1D749 ; [.1C99.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL TAU 1D783 ; [.1C99.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL TAU 1D7BD ; [.1C99.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU 1D6BB ; [.1C99.0020.000B] # MATHEMATICAL BOLD CAPITAL TAU 1D6F5 ; [.1C99.0020.000B] # MATHEMATICAL ITALIC CAPITAL TAU 1D72F ; [.1C99.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL TAU 1D769 ; [.1C99.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU 1D7A3 ; [.1C99.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU 1D6D6 ; [.1C9A.0020.0005] # MATHEMATICAL BOLD SMALL UPSILON 1D710 ; [.1C9A.0020.0005] # MATHEMATICAL ITALIC SMALL UPSILON 1D74A ; [.1C9A.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL UPSILON 1D784 ; [.1C9A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON 1D7BE ; [.1C9A.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON 1D6BC ; [.1C9A.0020.000B] # MATHEMATICAL BOLD CAPITAL UPSILON 1D6F6 ; [.1C9A.0020.000B] # MATHEMATICAL ITALIC CAPITAL UPSILON 1D730 ; [.1C9A.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL UPSILON 1D76A ; [.1C9A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON 1D7A4 ; [.1C9A.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON 1D6D7 ; [.1C9B.0020.0005] # MATHEMATICAL BOLD SMALL PHI 1D6DF ; [.1C9B.0020.0005] # MATHEMATICAL BOLD PHI SYMBOL 1D711 ; [.1C9B.0020.0005] # MATHEMATICAL ITALIC SMALL PHI 1D719 ; [.1C9B.0020.0005] # MATHEMATICAL ITALIC PHI SYMBOL 1D74B ; [.1C9B.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PHI 1D753 ; [.1C9B.0020.0005] # MATHEMATICAL BOLD ITALIC PHI SYMBOL 1D785 ; [.1C9B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PHI 1D78D ; [.1C9B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL 1D7BF ; [.1C9B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI 1D7C7 ; [.1C9B.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL 1D6BD ; [.1C9B.0020.000B] # MATHEMATICAL BOLD CAPITAL PHI 1D6F7 ; [.1C9B.0020.000B] # MATHEMATICAL ITALIC CAPITAL PHI 1D731 ; [.1C9B.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PHI 1D76B ; [.1C9B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI 1D7A5 ; [.1C9B.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI 1D60 ; [.1C9B.0020.0014] # MODIFIER LETTER SMALL GREEK PHI 1D69 ; [.1C9B.0020.0015] # GREEK SUBSCRIPT SMALL LETTER PHI 1D6D8 ; [.1C9C.0020.0005] # MATHEMATICAL BOLD SMALL CHI 1D712 ; [.1C9C.0020.0005] # MATHEMATICAL ITALIC SMALL CHI 1D74C ; [.1C9C.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL CHI 1D786 ; [.1C9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL CHI 1D7C0 ; [.1C9C.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI 1D6BE ; [.1C9C.0020.000B] # MATHEMATICAL BOLD CAPITAL CHI 1D6F8 ; [.1C9C.0020.000B] # MATHEMATICAL ITALIC CAPITAL CHI 1D732 ; [.1C9C.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL CHI 1D76C ; [.1C9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI 1D7A6 ; [.1C9C.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI 1D61 ; [.1C9C.0020.0014] # MODIFIER LETTER SMALL CHI 1D6A ; [.1C9C.0020.0015] # GREEK SUBSCRIPT SMALL LETTER CHI 1D6D9 ; [.1C9D.0020.0005] # MATHEMATICAL BOLD SMALL PSI 1D713 ; [.1C9D.0020.0005] # MATHEMATICAL ITALIC SMALL PSI 1D74D ; [.1C9D.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL PSI 1D787 ; [.1C9D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL PSI 1D7C1 ; [.1C9D.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI 1D6BF ; [.1C9D.0020.000B] # MATHEMATICAL BOLD CAPITAL PSI 1D6F9 ; [.1C9D.0020.000B] # MATHEMATICAL ITALIC CAPITAL PSI 1D733 ; [.1C9D.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL PSI 1D76D ; [.1C9D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI 1D7A7 ; [.1C9D.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI 1D2A ; [.1C9E.0020.0002] # GREEK LETTER SMALL CAPITAL PSI 1D6DA ; [.1C9F.0020.0005] # MATHEMATICAL BOLD SMALL OMEGA 1D714 ; [.1C9F.0020.0005] # MATHEMATICAL ITALIC SMALL OMEGA 1D74E ; [.1C9F.0020.0005] # MATHEMATICAL BOLD ITALIC SMALL OMEGA 1D788 ; [.1C9F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA 1D7C2 ; [.1C9F.0020.0005] # MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA 2126 ; [.1C9F.0020.0008] # OHM SIGN 1D6C0 ; [.1C9F.0020.000B] # MATHEMATICAL BOLD CAPITAL OMEGA 1D6FA ; [.1C9F.0020.000B] # MATHEMATICAL ITALIC CAPITAL OMEGA 1D734 ; [.1C9F.0020.000B] # MATHEMATICAL BOLD ITALIC CAPITAL OMEGA 1D76E ; [.1C9F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA 1D7A8 ; [.1C9F.0020.000B] # MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA 1D2B ; [.1D96.0020.0002] # CYRILLIC LETTER SMALL CAPITAL EL 1D78 ; [.1DAE.0020.0014] # MODIFIER LETTER CYRILLIC EN FB14 ; [.1FAD.0020.0004][.1F9E.0020.0004] # ARMENIAN SMALL LIGATURE MEN ECH FB15 ; [.1FAD.0020.0004][.1FA4.0020.0004] # ARMENIAN SMALL LIGATURE MEN INI FB17 ; [.1FAD.0020.0004][.1FA6.0020.0004] # ARMENIAN SMALL LIGATURE MEN XEH FB13 ; [.1FAD.0020.0004][.1FAF.0020.0004] # ARMENIAN SMALL LIGATURE MEN NOW FB16 ; [.1FB7.0020.0004][.1FAF.0020.0004] # ARMENIAN SMALL LIGATURE VEW NOW 2135 ; [.1FC1.0020.0004] # ALEF SYMBOL FB21 ; [.1FC1.0020.0005] # HEBREW LETTER WIDE ALEF FB2E ; [.1FC1.0020.0002][.0000.0059.0002] # HEBREW LETTER ALEF WITH PATAH FB2F ; [.1FC1.0020.0002][.0000.005A.0002] # HEBREW LETTER ALEF WITH QAMATS FB30 ; [.1FC1.0020.0002][.0000.005F.0002] # HEBREW LETTER ALEF WITH MAPIQ FB4F ; [.1FC1.0020.0004][.1FCC.0020.0004] # HEBREW LIGATURE ALEF LAMED 2136 ; [.1FC2.0020.0004] # BET SYMBOL FB31 ; [.1FC2.0020.0002][.0000.005F.0002] # HEBREW LETTER BET WITH DAGESH FB4C ; [.1FC2.0020.0002][.0000.0060.0002] # HEBREW LETTER BET WITH RAFE 2137 ; [.1FC3.0020.0004] # GIMEL SYMBOL FB32 ; [.1FC3.0020.0002][.0000.005F.0002] # HEBREW LETTER GIMEL WITH DAGESH 2138 ; [.1FC4.0020.0004] # DALET SYMBOL FB22 ; [.1FC4.0020.0005] # HEBREW LETTER WIDE DALET FB33 ; [.1FC4.0020.0002][.0000.005F.0002] # HEBREW LETTER DALET WITH DAGESH FB23 ; [.1FC5.0020.0005] # HEBREW LETTER WIDE HE FB34 ; [.1FC5.0020.0002][.0000.005F.0002] # HEBREW LETTER HE WITH MAPIQ FB4B ; [.1FC6.0020.0002][.0000.005B.0002] # HEBREW LETTER VAV WITH HOLAM FB35 ; [.1FC6.0020.0002][.0000.005F.0002] # HEBREW LETTER VAV WITH DAGESH FB36 ; [.1FC7.0020.0002][.0000.005F.0002] # HEBREW LETTER ZAYIN WITH DAGESH FB38 ; [.1FC9.0020.0002][.0000.005F.0002] # HEBREW LETTER TET WITH DAGESH FB1D ; [.1FCA.0020.0002][.0000.0056.0002] # HEBREW LETTER YOD WITH HIRIQ FB39 ; [.1FCA.0020.0002][.0000.005F.0002] # HEBREW LETTER YOD WITH DAGESH FB1F ; [.1FCA.0020.0004][.1FCA.0020.0004][.0000.0059.0002] # HEBREW LIGATURE YIDDISH YOD YOD PATAH FB24 ; [.1FCB.0020.0005] # HEBREW LETTER WIDE KAF FB3B ; [.1FCB.0020.0002][.0000.005F.0002] # HEBREW LETTER KAF WITH DAGESH FB3A ; [.1FCB.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL KAF WITH DAGESH FB4D ; [.1FCB.0020.0002][.0000.0060.0002] # HEBREW LETTER KAF WITH RAFE FB25 ; [.1FCC.0020.0005] # HEBREW LETTER WIDE LAMED FB3C ; [.1FCC.0020.0002][.0000.005F.0002] # HEBREW LETTER LAMED WITH DAGESH FB26 ; [.1FCD.0020.0005] # HEBREW LETTER WIDE FINAL MEM FB3E ; [.1FCD.0020.0002][.0000.005F.0002] # HEBREW LETTER MEM WITH DAGESH FB40 ; [.1FCE.0020.0002][.0000.005F.0002] # HEBREW LETTER NUN WITH DAGESH FB41 ; [.1FCF.0020.0002][.0000.005F.0002] # HEBREW LETTER SAMEKH WITH DAGESH FB20 ; [.1FD0.0020.0005] # HEBREW LETTER ALTERNATIVE AYIN FB44 ; [.1FD1.0020.0002][.0000.005F.0002] # HEBREW LETTER PE WITH DAGESH FB43 ; [.1FD1.0020.0019][.0000.005F.0002] # HEBREW LETTER FINAL PE WITH DAGESH FB4E ; [.1FD1.0020.0002][.0000.0060.0002] # HEBREW LETTER PE WITH RAFE FB46 ; [.1FD2.0020.0002][.0000.005F.0002] # HEBREW LETTER TSADI WITH DAGESH FB47 ; [.1FD3.0020.0002][.0000.005F.0002] # HEBREW LETTER QOF WITH DAGESH FB27 ; [.1FD4.0020.0005] # HEBREW LETTER WIDE RESH FB48 ; [.1FD4.0020.0002][.0000.005F.0002] # HEBREW LETTER RESH WITH DAGESH FB2B ; [.1FD5.0020.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH SIN DOT FB2A ; [.1FD5.0020.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH SHIN DOT FB49 ; [.1FD5.0020.0002][.0000.005F.0002] # HEBREW LETTER SHIN WITH DAGESH FB2D ; [.1FD5.0020.0002][.0000.005F.0002][.0000.005D.0002] # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT FB2C ; [.1FD5.0020.0002][.0000.005F.0002][.0000.005E.0002] # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT FB28 ; [.1FD6.0020.0005] # HEBREW LETTER WIDE TAV FB4A ; [.1FD6.0020.0002][.0000.005F.0002] # HEBREW LETTER TAV WITH DAGESH biblatex-biber-2.4/data/texmap.xsl000444000765000024 1327312667073765 17465 0ustar00philkimestaff000000000000 Biber UTF-8 <xsl:text disable-output-escaping="yes">&harr;</xsl:text> LaTeX macro decoding/encoding map

Biber UTF-8 &harr; LaTeX macro decoding/encoding map

If you are using PDFTeX as opposed to a native UTF-8 engine like XeTeX or LuaTeX, you will have to load some extra packages to use macros in this section. See the "symbols" document that comes with TeXLive for a comprehensive list of symbols and the packages you need for PDFTeX (run "texdoc symbols" to see this document on a TeXLive system).

Key
  • In encoding mapping (UTF-8 &rarr; LaTeX macros), when there are multiple possible mappings, red highlighted macro is the preferred mapping
  • In encoding mapping, insert the encoded form as-is with no wrapping braces or escaping etc.

Excluded from encoding (ignore LaTeX special chars)

Character

(sets: )

preferred raw
MacroUnicode characterUnicode hex value
\ &nbsp;

biblatex-biber-2.4/data/schemata000755000765000024 012667073765 17041 5ustar00philkimestaff000000000000biblatex-biber-2.4/data/schemata/bcf.rnc000444000765000024 5370112667073765 20462 0ustar00philkimestaff000000000000namespace bcf = "https://sourceforge.net/projects/biblatex" start = element bcf:controlfile { # This is usually the same as the biblatex version string but not necessarily. # Sometimes the BCF format version doesn't change between biblatex releases attribute version { xsd:string {minLength="1"}}, # "Global" Biber options. It's not clear what a non-global biber option # would be but just in case, we have the option ... element bcf:options { attribute component { "biber" }, attribute type { "global" }, output_encoding, input_encoding, debug, mincrossrefs, sortcase, sortgiveninits, sortupper }, # Global BibLaTeX options. That is, options that apply to all # entrytypes (unless a more specifically scoped option is specified) element bcf:options { attribute component { "biblatex" }, attribute type { "global" }, alphaothers, labelalpha, labelnamespec, labeltitle, labeltitlespec, labeltitleyear, labeldate, labeldatespec, maxalphanames, maxbibnames, maxcitenames, maxitems, minalphanames, minbibnames, mincitenames, minitems, singletitle, sortalphaothers?, sortlocale, sortscheme, uniquelist, uniquename, useprefix, usenames }, # Per-entrytype BibLaTeX options element bcf:options { attribute component { "biblatex" }, attribute type { text }, alphaothers?, labelalpha?, labelnamespec?, labeltitle?, labeltitlespec?, labeltitleyear?, labeldate?, labeldatespec?, maxalphanames?, maxbibnames?, maxcitenames?, maxitems?, minalphanames?, minbibnames?, mincitenames?, minitems?, singletitle?, skipbib?, skiplab?, skipbiblist?, skiplos?, sortalphaothers?, uniquelist?, uniquename?, useprefix?, usenames? }*, # Option scope element bcf:optionscope { attribute type { "GLOBAL" | "ENTRYTYPE" | "ENTRY" | "NAMELIST" | "NAME" }, element bcf:option { attribute datatype { "boolean" | "integer" | "string" | "xml" }, xsd:string }+ }+, # user field/entrytype mapping element bcf:sourcemap { element bcf:maps { attribute datatype { "bibtex" | "biblatexml" | "ris" }, attribute map_overwrite { "0" | "1" }?, attribute level { "user" | "style" | "driver" }?, map+ }+ }?, # labelalpha template specification element bcf:labelalphatemplate { attribute type { xsd:string }?, # per-type? element bcf:labelelement { attribute order { xsd:integer }, element bcf:labelpart { attribute final { "0" | "1" }?, attribute pad_char { xsd:string {minLength="1"}}?, attribute pad_side { "left" | "right" }?, attribute substring_width { xsd:integer | "v" | "vf" | "l" }?, attribute substring_pwidth { xsd:integer }?, attribute substring_fixed_threshold { xsd:integer }?, attribute substring_width_max { xsd:integer }?, attribute substring_side { "left" | "right" }?, attribute substring_compound { "0" | "1" }?, attribute substring_pcompound { "0" | "1" }?, attribute ifnamecount { xsd:integer }?, attribute namerange { text }?, attribute noalphaothers { "0" | "1" }?, xsd:string }+ }+ }+, # Cross-reference inheritance specifications element bcf:inheritance { # Defaults element bcf:defaults { # Whether to inherit all fields attribute inherit_all { "true" | "false" }, # Should we overwrite the target field if it exists? attribute override_target { "true" | "false" }, # Default inherit_all and override_target settings for entrytype source/target pairs element bcf:type_pair { attribute source { "*" | xsd:string {minLength="1"}}, attribute target { "*" | xsd:string {minLength="1"}}, attribute inherit_all { "true" | "false" }?, attribute override_target { "true" | "false" }?, empty }* }, # An inheritance specification element bcf:inherit { # applies to these pairs of source/target entrytypes element bcf:type_pair { attribute source { "*" | xsd:string {minLength="1"}}, attribute target { "*" | xsd:string {minLength="1"}}, empty }+, # and here are the field specifications element bcf:field { ( # either a "skip this field" specification # so we can say inherit all except certain fields OR ... (attribute source { xsd:string }, attribute skip { "true" | "false" }) | # ... a source and target field with an optional override attribute (attribute source { xsd:string {minLength="1"}}, attribute target { xsd:string {minLength="1"}}, attribute override_target { "true" | "false" }?) ), empty }+ }* }, # noinit specification element bcf:noinits { element bcf:noinit { attribute value { xsd:string }, empty }+ }?, # nolabel specification element bcf:nolabels { element bcf:nolabel { attribute value { xsd:string }, empty }+ }?, # nosort specification element bcf:nosorts { element bcf:nosort { attribute field { xsd:string }, attribute value { xsd:string }, empty }+ }?, # Sorting name key specification sortingnamekey, # Global sorting specification sorting, # Data model specification element bcf:datamodel { # Constants element bcf:constants { element bcf:constant { attribute type { "string" | "list" }?, attribute name { text }, text }+ }, # Valid entrytypes element bcf:entrytypes { element bcf:entrytype { # Some entrytypes should be completely skipped on output (XDATA etc.) attribute skip_output { "true" }?, text }+ }, # BibLaTeX field types. Biber uses this to determine how to output various types # to the .bbl element bcf:fields { element bcf:field { # fieldtype is "field" or "list" attribute fieldtype { "field" | "list" }, # format is a specification of the format of the field. If not specified, field contents # are just as is. attribute format { "xsv" }?, # datatype of field content attribute datatype { "literal" | "name" | "key" | "entrykey" | "date" | "verbatim" | "integer" | "range" | "code" | "uri" | "datepart" | "keyword" | "option" }, # Are we allowed to output a null field value to the .bbl for this field? attribute nullok { "true" }?, # Should this field be skipped and not output to the .bbl? attribute skip_output { "true" }?, # Field can be used as a label? This auto-generates some defaults in biblatex attribute label { "true" }?, text }+ }, # Allowable fields for entrytypes # Only one specification per entrytype: even though it might be nice to have several # so that one could share information, this would be hard to manage and confusing as it # not be visible in one place which fields were valid for an entrytype. element bcf:entryfields { element bcf:entrytype { text }*, element bcf:field { text }+ }+, # Constraints on field (co-)existence and format element bcf:constraints { # Set of entrytypes that this constraint applies to # An entrytype can be specified in multiple constraints # element bcf:entrytype { text }*, # A constraint specification element bcf:constraint { ( # Conditional constraints have an antecedent and consequent # both of which have a quantifier. This allows you to enforce # constraints like: # # if field a,b,c are all present then one of x,y,z must be # if one of field a,b,c are present then none of x,y,z must be # etc. (attribute type { "conditional" }, element bcf:antecedent { attribute quant { "all" | "one" | "none"}, element bcf:field { text }+ }, element bcf:consequent { attribute quant { "all" | "one" | "none"}, element bcf:field { text }+ } ) | # Datatype and format constraints (attribute type { "data" }, # range* attributes are for limiting integer type range attribute datatype { "integer" | "isbn" | "issn" | "ismn" | "date" | "pattern" }?, attribute rangemin { xsd:int }?, attribute rangemax { xsd:int }?, attribute pattern { text }?, element bcf:field { text }+ ) | # Mandatoriness constraints which say which fields must appear (attribute type { "mandatory" }, (element bcf:field { text } | # An XOR set of fields so you can enforce: # # One (but not more) of fields a,b,c must exist element bcf:fieldxor { element bcf:field { text }+ } | # An OR set of fields so you can enforce: # # One (possibly more) of fields a,b,c must exist element bcf:fieldor { element bcf:field { text }+ } )+ ) ) }* }+ }?, # Section specifications secspec+, listspec+ } listspec = element bcf:sortlist { attribute section { xsd:integer }, attribute type { "entry" | "list" }, attribute sortscheme { xsd:string {minLength="1"}}, attribute sortnamekeyscheme { xsd:string {minLength="1"}}, # name is only needed for list types attribute name { xsd:string {minLength="1"}}, (filter | filteror )*, element bcf:sorting { # locale for entire sorting specification attribute locale { xsd:string {minLength="1"}}?, sort+ }? }* sortingnamekey = element bcf:sortingnamekey { attribute keyscheme { text }, element bcf:keypart { attribute order { xsd:integer }, element bcf:part { attribute type { "namepart" | "literal" }, attribute order { xsd:integer }, attribute use { "0" | "1" }?, text }+ }+ }+ sorting = element bcf:sorting { # locale for entire sorting specification attribute locale { xsd:string {minLength="1"}}?, # presort default strings for different entry types element bcf:presort { attribute type { text }?, text }+, # excludes of certain fields for sorting for specified types element bcf:sortexclusion { attribute type { text }, element bcf:exclusion { text }+ }*, sort+ } sort = # sort specification element bcf:sort { # order of this specification in the set of all sort specifications attribute order { xsd:integer }, # Should we stop generating sorting information after this item? attribute final { "1" }?, # Sort ascending or descending attribute sort_direction { "ascending" | "descending" }?, # Sort case sensitive or not? attribute sortcase { "0" | "1" }?, # Sort upper before lower? attribute sortupper { "0" | "1" }?, # sortset specific override for locale attribute locale { xsd:string {minLength="1"}}?, # A sort item specification - a field or pseudo-field to get sort information from element bcf:sortitem { # order of this item in the set of all other item specifications attribute order { xsd:integer }, # Just use a part of the item information for sorting? attribute substring_side { "left" | "right" }?, attribute substring_width { xsd:integer }?, # Pad the item information when sorting with it? attribute pad_side { "left" | "right" }?, attribute pad_width { xsd:integer }?, attribute pad_char { xsd:string { minLength = "1" maxLength = "1" } }?, text }+ }+ # Section specification secspec = # data sources element bcf:bibdata { # which sections the datafiles are for attribute section { xsd:integer }, element bcf:datasource { attribute type { "file" }, attribute datatype { "bibtex" | "biblatexml" | "ris" }?, xsd:anyURI }* }?, # citekeys or citekey sets in each section element bcf:section { attribute number { xsd:integer }, element bcf:citekey { ( attribute type { "set" }, attribute members { xsd:string {minLength="1"}}, xsd:string {minLength="1"}) | ( attribute order { xsd:integer }, xsd:string {minLength="1"} ) }* } filteror = element bcf:filteror { filter+ } filter = element bcf:filter { attribute type { "type" | "nottype" | "subtype" | "notsubtype" | "keyword" | "notkeyword" | "field" | "notfield" }, xsd:string {minLength="1"} } # option definitions # use options are dynamically determined from data model usenames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { xsd:string {pattern = "use.*"} }, element bcf:value { "0" | "1" } }+ useprefix = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "useprefix" }, element bcf:value { "0" | "1" } } labelalpha = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "labelalpha" }, element bcf:value { "0" | "1" } } labeltitle = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "labeltitle" }, element bcf:value { "0" | "1" } } labeltitlespec = element bcf:option { attribute type { "multivalued" }, element bcf:key { "labeltitlespec" }, element bcf:value { attribute order { xsd:integer }, attribute lang { text }?, text }+ } labeltitleyear = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "labeltitleyear" }, element bcf:value { "0" | "1" } } labeldate = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "labeldate" }, element bcf:value { "0" | "1" } } labeldatespec = element bcf:option { attribute type { "multivalued" }, element bcf:key { "labeldatespec" }, element bcf:value { attribute order { xsd:integer }, attribute type { "field" | "string" }, text }+ } singletitle = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "singletitle" }, element bcf:value { "0" | "1" } } skipbib = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "skipbib" }, element bcf:value { "0" | "1" } } skiplab = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "skiplab" }, element bcf:value { "0" | "1" } } skiplos = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "skiplos" }, element bcf:value { "0" | "1" } } skipbiblist = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "skipbiblist" }, element bcf:value { "0" | "1" } } # 0 = do not provide uniquelist information # 1 = disambiguate lists regardless of year # 2 = disambiguate lists only when year is the same uniquelist = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "uniquelist" }, element bcf:value { "0" | "1" | "2" } } # 0 = do not provide uniquename information # 1 = disambiguate with initials, only up to maxcitenames/uniquelist # 2 = disambiguate with full name or initials, only up to maxcitenames/uniquelist # 3 = disambiguate with initials, ignore maxcitenames/uniquelist # 4 = disambiguate with full name or initials, ignore maxcitenames/uniquelist # 5 = disambiguate with initials, only between identical lists in different entries # 6 = disambiguate with full name or initials, only between identical lists in different entries uniquename = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "uniquename" }, element bcf:value { "0" | "1" | "2" | "3" | "4" | "5" | "6" } } maxitems = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "maxitems" }, element bcf:value { xsd:integer } } maxbibnames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "maxbibnames" }, element bcf:value { xsd:integer } } maxalphanames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "maxalphanames" }, element bcf:value { xsd:integer } } maxcitenames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "maxcitenames" }, element bcf:value { xsd:integer } } minitems = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "minitems" }, element bcf:value { xsd:integer } } minbibnames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "minbibnames" }, element bcf:value { xsd:integer } } minalphanames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "minalphanames" }, element bcf:value { xsd:integer } } mincitenames = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "mincitenames" }, element bcf:value { xsd:integer } } sortlocale = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortlocale" }, element bcf:value { text } } sortscheme = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortscheme" }, element bcf:value { text } } labelnamespec = element bcf:option { attribute type { "multivalued" }, element bcf:key { "labelnamespec" }, element bcf:value { attribute order { xsd:integer }, attribute lang { text }?, text }+ } mincrossrefs = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "mincrossrefs" }, element bcf:value { xsd:integer } } debug = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "debug" }, element bcf:value { "0" | "1" } } wrapline = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "wrapline" }, element bcf:value { xsd:integer } } output_encoding = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "output_encoding" }, element bcf:value { text } } input_encoding = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "input_encoding" }, element bcf:value { text } } sortcase = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortcase" }, element bcf:value { "0" | "1" } } sortgiveninits = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortgiveninits" }, element bcf:value { "0" | "1" } } alphaothers = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "alphaothers" }, element bcf:value { xsd:normalizedString { pattern = "\S+" } } } sortupper = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortupper" }, element bcf:value { "0" | "1" } } sortalphaothers = element bcf:option { attribute type { "singlevalued" }, element bcf:key { "sortalphaothers" }, element bcf:value { xsd:normalizedString { pattern = "\S+" } } } map = element bcf:map { attribute map_overwrite { "0" | "1" }?, attribute map_foreach { xsd:string {minLength="1"} }?, element bcf:per_datasource { xsd:string {minLength="1"} }*, element bcf:per_type { xsd:string {minLength="1"} }*, element bcf:map_step { ( ( attribute map_entry_new { xsd:string {minLength="1"} }, attribute map_entry_newtype { xsd:string {minLength="1"} } ) | ( attribute map_entry_null { "1" } ) | ( attribute map_type_source { xsd:string {minLength="1"} }, attribute map_type_target { xsd:string {minLength="1"} }?, attribute map_final { "1" }? ) | ( attribute map_field_source { xsd:string {minLength="1"} }, attribute map_field_target { xsd:string {minLength="1"} }?, attribute map_final { "1" }?, attribute map_match { xsd:string {minLength="1"} }?, attribute map_notmatch { xsd:string {minLength="1"} }?, attribute map_replace { xsd:string }? ) | ( attribute map_field_source { xsd:string {minLength="1"} }?, attribute map_entrytarget { xsd:string {minLength="1"} }?, attribute map_field_set { xsd:string {minLength="1"} }?, attribute map_append { "1" }?, attribute map_final { "1" }?, ( attribute map_null { "1" } | attribute map_origfield { "1" } | attribute map_origfieldval { "1" } | attribute map_origentrytype { "1" } | attribute map_field_value { xsd:string {minLength="1"} } ) ) ), empty }+ } # Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. # This code is free software. You can redistribute it and/or # modify it under the terms of the Artistic License 2.0. # This program is distributed in the hope that it will be useful, # but without any warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. biblatex-biber-2.4/data/schemata/bcf.rng000444000765000024 15764112667073765 20516 0ustar00philkimestaff000000000000 1 biber global biblatex global biblatex GLOBAL ENTRYTYPE ENTRY NAMELIST NAME boolean integer string xml bibtex biblatexml ris 0 1 user style driver 0 1 1 left right v vf l left right 0 1 0 1 0 1 true false true false * 1 * 1 true false true false * 1 * 1 true false 1 1 true false string list true field list xsv literal name key entrykey date verbatim integer range code uri datepart keyword option true true true conditional all one none all one none data integer isbn issn ismn date pattern mandatory entry list 1 1 1 1 namepart literal 0 1 1 1 ascending descending 0 1 0 1 1 left right left right 1 1 file bibtex biblatexml ris set 1 1 1 type nottype subtype notsubtype keyword notkeyword field notfield 1 singlevalued use.* 0 1 singlevalued useprefix 0 1 singlevalued labelalpha 0 1 singlevalued labeltitle 0 1 multivalued labeltitlespec singlevalued labeltitleyear 0 1 singlevalued labeldate 0 1 multivalued labeldatespec field string singlevalued singletitle 0 1 singlevalued skipbib 0 1 singlevalued skiplab 0 1 singlevalued skiplos 0 1 singlevalued skipbiblist 0 1 singlevalued uniquelist 0 1 2 singlevalued uniquename 0 1 2 3 4 5 6 singlevalued maxitems singlevalued maxbibnames singlevalued maxalphanames singlevalued maxcitenames singlevalued minitems singlevalued minbibnames singlevalued minalphanames singlevalued mincitenames singlevalued sortlocale singlevalued sortscheme multivalued labelnamespec singlevalued mincrossrefs singlevalued debug 0 1 singlevalued wrapline singlevalued output_encoding singlevalued input_encoding singlevalued sortcase 0 1 singlevalued sortgiveninits 0 1 singlevalued alphaothers \S+ singlevalued sortupper 0 1 singlevalued sortalphaothers \S+ 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 biblatex-biber-2.4/data/schemata/config.rnc000444000765000024 3114412667073765 21172 0ustar00philkimestaff000000000000start = element config { # Option scope element optionscope { attribute type { "GLOBAL" | "PER_TYPE" | "PER_ENTRY" }, element option { xsd:string }+ }+ & element clrmacros { "0" | "1" }? & element collate { "0" | "1" }? & element collate_options { element option { attribute name { text } & attribute value { text } }+ }? & # Can't specify the config file location in the config file ... # element configfile { text }? & element convert_control { "0" | "1" }? & element dot_include { text }? & # Data model specification (mainly for tool mode) datamodel? & element decodecharsset { text }? & element debug { "0" | "1" }? & element fastsort { "0" | "1" }? & element fixinits { "0" | "1" }? & # Would never want this in the config file # element help { "0" | "1" }? & inheritance? & element input_encoding { text }? & element listsep { text }? & element logfile { text }? & element mincrossrefs { xsd:unsignedByte }? & element mssplit { text }? & element namesep { text }? & # Can't specify not to use a config file in the config file ... # element noconf { "0" | "1" }? & element nodieonerror { "0" | "1" }? & element nolog { "0" | "1" }? & # noinit specification element noinit { element option { attribute value { xsd:string }, empty }+ }? & # nosort specification element nosort { element option { attribute name { text } & attribute value { text } }+ }? & element nostdmacros { "0" | "1" }? & element onlylog { "0" | "1" }? & element others_string { text }? & element output_align { "0" | "1" }? & element output_directory { text }? & element output_encoding { text }? & element output_fieldcase { "upper" | "lower" | "title" }? & element output_file { text }? & element output_format { "bibtex" | "bbl" | "biblatexml" | "dot" }? & element output_indent { xsd:unsignedByte }? & element output_macro_fields { text }? & element output_resolve { "0" | "1" }? & element output_safechars { "0" | "1" }? & element output_safecharsset { "base" | "full" }? & element quiet { "0" | "1" }? & element recodedata { text }? & element sortcase { "0" | "1" }? & element sortfirstinits { "0" | "1" }? & sortingnamekey? & sorting? & element sortlocale { text }? & element sortupper { "0" | "1" }? & element sourcemap { element maps { attribute datatype { "bibtex" | "biblatexml" | "ris" }, attribute map_overwrite { "0" | "1" }?, map+ }+ }? & element ssl-nointernalca { "0" | "1" }? & element ssl-noverify-host { "0" | "1" }? & element tool { "0" | "1" }? & element tool_config { text }? & element trace { "0" | "1" }? & element validate_config { "0" | "1" }? & element validate_control { "0" | "1" }? & element validate_datamodel { "0" | "1" }? & # Meaningless in the config file # element version { "0" | "1" }? & element wraplines { "0" | "1" }? } datamodel = element datamodel { # Constants element constants { element constant { attribute type { "string" | "list" }?, attribute name { text }, text }+ }, # Valid entrytypes element entrytypes { element entrytype { # Some entrytypes should be completely skipped on output (XDATA etc.) attribute skip_output { "true" }?, text }+ }, # BibLaTeX field types. Biber uses this to determine how to output various types # to the .bbl element fields { element field { # fieldtype is "field" or "list" attribute fieldtype { "field" | "list" }, # format is a specification of the format of the field. If not specified, field contents # are just as is. attribute format { "csv" }?, # datatype of field content attribute datatype { "literal" | "name" | "key" | "entrykey" | "date" | "verbatim" | "integer" | "range" | "csv" | "code" | "uri" | "datepart" | "keyword" | "option" }, # Are we allowed to output a null field value to the .bbl for this field? attribute nullok { "true" }?, # Should this field be skipped and not output to the .bbl? attribute skip_output { "true" }?, text }+ }, # Allowable fields for entrytypes # Only one specification per entrytype: even though it might be nice to have several # so that one could share information, this would be hard to manage and confusing as it # not be visible in one place which fields were valid for an entrytype. element entryfields { element entrytype { text }*, element field { text }+ }+, # Constraints on field (co-)existence and format element constraints { # Set of entrytypes that this constraint applies to # An entrytype can be specified in multiple constraints # element entrytype { text }*, # A constraint specification element constraint { ( # Conditional constraints have an antecedent and consequent # both of which have a quantifier. This allows you to enforce # constraints like: # # if field a,b,c are all present then one of x,y,z must be # if one of field a,b,c are present then none of x,y,z must be # etc. (attribute type { "conditional" }, element antecedent { attribute quant { "all" | "one" | "none"}, element field { text }+ }, element consequent { attribute quant { "all" | "one" | "none"}, element field { text }+ } ) | # Datatype and format constraints (attribute type { "data" }, # range* attributes are for limiting integer type range attribute datatype { "integer" | "isbn" | "issn" | "ismn" | "date" | "pattern" }?, attribute rangemin { xsd:int }?, attribute rangemax { xsd:int }?, attribute pattern { text }?, element field { text }+ ) | # Mandatoriness constraints which say which fields must appear (attribute type { "mandatory" }, (element field { text } | # An XOR set of fields so you can enforce: # # One (but not more) of fields a,b,c must exist element fieldxor { element field { text }+ } | # An OR set of fields so you can enforce: # # One (possibly more) of fields a,b,c must exist element fieldor { element field { text }+ } )+ ) ) }* }+ } inheritance = # Cross-reference inheritance specifications element inheritance { # Defaults element defaults { # Whether to inherit all fields attribute inherit_all { "true" | "false" }, # Should we overwrite the target field if it exists? attribute override_target { "true" | "false" }, # Default inherit_all and override_target settings for entrytype source/target pairs element type_pair { attribute source { "*" | xsd:string {minLength="1"}}, attribute target { "*" | xsd:string {minLength="1"}}, attribute inherit_all { "true" | "false" }?, attribute override_target { "true" | "false" }?, empty }* }, # An inheritance specification element inherit { # applies to these pairs of source/target entrytypes element type_pair { attribute source { "*" | xsd:string {minLength="1"}}, attribute target { "*" | xsd:string {minLength="1"}}, empty }+, # and here are the field specifications element field { ( # either a "skip this field" specification # so we can say inherit all except certain fields OR ... (attribute source { xsd:string }, attribute skip { "true" | "false" }) | # ... a source and target field with an optional override attribute (attribute source { xsd:string {minLength="1"}}, attribute target { xsd:string {minLength="1"}}, attribute override_target { "true" | "false" }?) ), empty }+ }* } map = element map { attribute map_overwrite { "0" | "1" }?, attribute map_foreach { xsd:string {minLength="1"} }?, element per_datasource { xsd:string {minLength="1"} }*, element per_type { xsd:string {minLength="1"} }*, element map_step { ( ( attribute map_entry_null { "1" } ) | ( attribute map_type_source { xsd:string {minLength="1"} }, attribute map_type_target { xsd:string {minLength="1"} }?, attribute map_final { "1" }? ) | ( attribute map_field_source { xsd:string {minLength="1"} }, attribute map_field_target { xsd:string {minLength="1"} }?, attribute map_final { "1" }?, attribute map_match { xsd:string {minLength="1"} }?, attribute map_notmatch { xsd:string {minLength="1"} }?, attribute map_replace { xsd:string {minLength="1"} }? ) | ( ( attribute map_entry_new { xsd:string {minLength="1"} }, attribute map_entry_newtype { xsd:string {minLength="1"} })?, attribute map_entrytarget { xsd:string {minLength="1"} }?, attribute map_field_set { xsd:string {minLength="1"} }, attribute map_append { "1" }?, attribute map_final { "1" }?, ( attribute map_null { "1" } | attribute map_origfield { "1" } | attribute map_origfieldval { "1" } | attribute map_origentrytype { "1" } | attribute map_field_value { xsd:string {minLength="1"} } ) ) ), empty }+ } sortingnamekey = element sortingnamekey { attribute keyscheme { text }, element keypart { attribute order { xsd:integer }, element part { attribute type { "namepart" | "literal" }, attribute order { xsd:integer }, attribute use { "0" | "1" }?, text }+ }+ } sorting = element sorting { # locale for entire sorting specification attribute locale { xsd:string {minLength="1"}}?, # presort default strings for different entry types element presort { attribute type { text }?, text }+, # excludes of certain fields for sorting for specified types element sortexclusion { attribute type { text }, element exclusion { text }+ }*, sort+ } sort = # sort specification element sort { # order of this specification in the set of all sort specifications attribute order { xsd:integer }, # Should we stop generating sorting information after this item? attribute final { "1" }?, # Sort ascending or descending attribute sort_direction { "ascending" | "descending" }?, # Sort case sensitive or not? attribute sortcase { "0" | "1" }?, # Sort upper before lower? attribute sortupper { "0" | "1" }?, # sortset specific override for locale attribute locale { xsd:string {minLength="1"}}?, # A sort item specification - a field or pseudo-field to get sort information from element sortitem { # order of this item in the set of all other item specifications attribute order { xsd:integer }, # Just use a part of the item information for sorting? attribute substring_side { "left" | "right" }?, attribute substring_width { xsd:integer }?, # Pad the item information when sorting with it? attribute pad_side { "left" | "right" }?, attribute pad_width { xsd:integer }?, attribute pad_char { xsd:string { minLength = "1" maxLength = "1" } }?, attribute form { "original" | "translated" | "romanised" | "uniform" }?, text }+ }+ # Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. # This code is free software. You can redistribute it and/or # modify it under the terms of the Artistic License 2.0. # This program is distributed in the hope that it will be useful, # but without any warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. biblatex-biber-2.4/data/schemata/config.rng000444000765000024 10604012667073765 21214 0ustar00philkimestaff000000000000 GLOBAL PER_TYPE PER_ENTRY 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 upper lower title bibtex bbl biblatexml dot 0 1 0 1 base full 0 1 0 1 0 1 0 1 bibtex biblatexml ris 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 string list true field list csv literal name key entrykey date verbatim integer range csv code uri datepart keyword option true true conditional all one none all one none data integer isbn issn ismn date pattern mandatory true false true false * 1 * 1 true false true false * 1 * 1 true false 1 1 true false 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 namepart literal 0 1 1 1 ascending descending 0 1 0 1 1 left right left right 1 1 original translated romanised uniform biblatex-biber-2.4/data/schemata/texmap.rnc000444000765000024 200112667073765 21171 0ustar00philkimestaff000000000000start = element texmap { element maps { # CSV list of sets attribute set { text }, attribute type { "accents" | "letters" | "diacritics" | "punctuation" | "symbols" | "negatedsymbols" | "superscripts" | "cmdsuperscripts" | "dings" | "greek" }, map+ }+, element encode_exclude { element char { text }+ } } map = element map { element from { attribute preferred {"1"}?,# preferred encoding form if more than one attribute raw {"1"}?,# use the encoding form "as is" in replacement - no extra envs/braces etc. text }, element to { attribute hex { text }, text } } # Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. # This code is free software. You can redistribute it and/or # modify it under the terms of the Artistic License 2.0. # This program is distributed in the hope that it will be useful, # but without any warranty; without even the implied warranty of # merchantability or fitness for a particular purpose. biblatex-biber-2.4/doc000755000765000024 012667073765 15110 5ustar00philkimestaff000000000000biblatex-biber-2.4/doc/biber.pdf000444000765000024 126037012667073765 17114 0ustar00philkimestaff000000000000%PDF-1.4 % 4 0 obj <> endobj 7 0 obj (Important Changes) endobj 8 0 obj <> endobj 11 0 obj (Introduction) endobj 12 0 obj <> endobj 15 0 obj (About) endobj 16 0 obj <> endobj 19 0 obj (Requirements) endobj 20 0 obj <> endobj 23 0 obj (Compatibility Matrix) endobj 24 0 obj <> endobj 27 0 obj (License) endobj 28 0 obj <> endobj 31 0 obj (History) endobj 32 0 obj <> endobj 35 0 obj (Performance) endobj 36 0 obj <> endobj 39 0 obj (Acknowledgements) endobj 40 0 obj <> endobj 43 0 obj (Use) endobj 44 0 obj <> endobj 47 0 obj (Options and config file) endobj 48 0 obj <> endobj 51 0 obj (The output-format option) endobj 52 0 obj <> endobj 55 0 obj (The sourcemap option) endobj 56 0 obj <> endobj 59 0 obj (The inheritance option) endobj 60 0 obj <> endobj 63 0 obj (The noinit option) endobj 64 0 obj <> endobj 67 0 obj (The nolabel option) endobj 68 0 obj <> endobj 71 0 obj (The nolabelwidthcount option) endobj 72 0 obj <> endobj 75 0 obj (The sorting option) endobj 76 0 obj <> endobj 79 0 obj (The nosort option) endobj 80 0 obj <> endobj 83 0 obj (The collate-options option) endobj 84 0 obj <> endobj 87 0 obj (Unicode) endobj 88 0 obj <> endobj 91 0 obj (Input/Output File Locations) endobj 92 0 obj <> endobj 95 0 obj (Control file) endobj 96 0 obj <> endobj 99 0 obj (Data sources) endobj 100 0 obj <> endobj 103 0 obj (Logfile) endobj 104 0 obj <> endobj 107 0 obj (Collation and Localisation) endobj 108 0 obj <> endobj 111 0 obj (Examples) endobj 112 0 obj <> endobj 115 0 obj (Encoding of files) endobj 116 0 obj <> endobj 119 0 obj (LaTeX macro decoding) endobj 120 0 obj <> endobj 123 0 obj (LaTeX macro encoding) endobj 124 0 obj <> endobj 127 0 obj (Examples) endobj 128 0 obj <> endobj 131 0 obj (List and Name Separators) endobj 132 0 obj <> endobj 135 0 obj (Editor Integration) endobj 136 0 obj <> endobj 139 0 obj (BibTeX macros and the MONTH field) endobj 140 0 obj <> endobj 143 0 obj (Biber datasource drivers) endobj 144 0 obj <> endobj 147 0 obj (Visualising the Output) endobj 148 0 obj <> endobj 151 0 obj (Tool Mode) endobj 152 0 obj <> endobj 155 0 obj (Customising Tool Mode Inheritance Resolution) endobj 156 0 obj <> endobj 159 0 obj (Customising Tool Mode Sorting) endobj 160 0 obj <> endobj 163 0 obj (Binaries) endobj 164 0 obj <> endobj 167 0 obj (Binary Caches) endobj 168 0 obj <> endobj 171 0 obj (Binary Architectures) endobj 172 0 obj <> endobj 175 0 obj (Installing) endobj 176 0 obj <> endobj 179 0 obj (OSX) endobj 180 0 obj <> endobj 183 0 obj (Windows) endobj 184 0 obj <> endobj 187 0 obj (Unix/Linux) endobj 188 0 obj <> endobj 191 0 obj (Building) endobj 192 0 obj <> endobj 195 0 obj (Testing a binary build) endobj 196 0 obj <> endobj 199 0 obj (Appendix) endobj 200 0 obj <> endobj 203 0 obj (Babel/Polyglossia language to Locale mapping) endobj 204 0 obj <> endobj 238 0 obj <> stream x[ˎ[9+Q_I 0 z٨`3/FRv9t#p\(HN=m߿l&T|_I:8$Ӑ޴NB{uz󶁎=}*=fۿ Rc4"HS#JEZ^u_V-L7rKl'v #{(N34l$-KD ɸtZ (l"l_(?M ) E$wZ. ڑLH7ޑjO{a,[?2.ʕPW'$)ܾLq/gpCUUvʠi}^M!r4@ajmV^k G*j;x)NL'NFLJsBU+' ' Qy & t GX^Y-.RPo_- c60yΎkMoqud1:Λ BF0A9GL[$!J-M P7xsԑq^hiz)&9|$Qc6於p'bCgQp̂pi&p=/C卺.5( ҽ1qJ)9+YEutD+shdyTXp ǞugƼv ӡriiuBi,n־xϨ@aj6fZO ˨EolPsŪ(nj6):dVb1kd /bMMPD߿in<:+[yK>mdA8w-< f>+S[{&mvNCp |T#0I).Ƃ ?J`>D2 c@00ƽ~u sS4hZ ai(-͍5D~,ڱ酃Ekۤp[[ۅ6d>jG:[c[izi-0,_=g #k͒J"j:ʺ 5 /CaRkKblaG h! mS>w^Y,7# 'F)iK>V6%ݦ_%=%|)7|zEGjKVASC"wUypPIrrIAH ni>nq{PB}C-9֍\c䌰L핇 O;/# 7¥:^?]tD/(maAVx''R!rՏ2)r` /c;(yyRf@`TIFmRj| HY1,u3UدqU *aHđ*fnX]aMւ!&&~ h<] Ԛ:(^ZFf`j̲b*pUgjZִS*#?@bCt(j7Cqdd,Hٞ.N:k=4zQp?3NV-_15M#FІ΂!Zv~b 0rqf^G1"(4gNv)2"i>Fnew wCOșQD1#?. "삾uܽq#Q/eq<|koIq 1hM5i a`egӼ:QŅfnUyڔ^ŎzJN6p1˥oЀ([DHׯHm IjSxqm Y:$d4m`sQO6vHt֍<,Ѯ5'Օ:2py`L4nͿLQoԨ+2Z]U̦\ qfRQ,omU>ٮ p>ۊ2'/Yލ+2 iT[1yӪ6`X;^yA@~AQV"Fed6]ou ˗-YewʑF| ==1[WrkǎZ"4ĔIWb;WS9x۹uw2~VXuzuN쳂j]KLѲǙQ]Á,p.|[3\]x9l1L)ҶwB߈#T:Q0܍"&|jgH8S1볃mdl)̅T.qA)8ET}ޙeՑMr ]oqdI<}60?LǙ'B[ʓvU|Uu}pz*OUjj_dD˕uTZGn[jvƏ53S ESTfTLt8:?A$: endstream endobj 205 0 obj <> endobj 251 0 obj [206 0 R 207 0 R 242 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 246 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 247 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 249 0 R] endobj 206 0 obj <> >> endobj 207 0 obj <> >> endobj 242 0 obj <> >> endobj 208 0 obj <>>> endobj 209 0 obj <>>> endobj 210 0 obj <>>> endobj 211 0 obj <>>> endobj 212 0 obj <>>> endobj 213 0 obj <>>> endobj 214 0 obj <>>> endobj 215 0 obj <>>> endobj 216 0 obj <>>> endobj 217 0 obj <>>> endobj 218 0 obj <>>> endobj 219 0 obj <>>> endobj 220 0 obj <>>> endobj 246 0 obj <>>> endobj 221 0 obj <>>> endobj 222 0 obj <>>> endobj 223 0 obj <>>> endobj 224 0 obj <>>> endobj 225 0 obj <>>> endobj 226 0 obj <>>> endobj 247 0 obj <>>> endobj 227 0 obj <>>> endobj 228 0 obj <>>> endobj 229 0 obj <>>> endobj 230 0 obj <>>> endobj 231 0 obj <>>> endobj 232 0 obj <>>> endobj 233 0 obj <>>> endobj 234 0 obj <>>> endobj 235 0 obj <>>> endobj 236 0 obj <>>> endobj 249 0 obj <>>> endobj 239 0 obj <> endobj 240 0 obj <> endobj 243 0 obj <> endobj 5 0 obj <> endobj 237 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 256 0 obj <> stream xڵZɎ#9WRÀl70Fs>eZ(R(v .CEq}B:?"J#2Ɠ7^N9,RG}(|hLF 1LDΚ}M߉uc}XG{XΎ=J9j4FĘ^Zb)j;3&1mk t6 &Z k9Ah;o.VcqUHămxA*ײsFP3(' B7+LvmQ0'0oO؆j%CQ fbעK/t6{|<:::ܹƮV$sv졪5OIw AMu"CKJO~bqcuk<,~^kX=sYB*8ٔudUW7ƎUX[U^Eh;ZUB+O oH'bfGe lr_`䴦\q@L3mAR$|3CZwP"a!땞<r^yC#;q^0W/$x$W,Mlw:ރ{!C  ZiL؃8k9mHaj` EՊeIQˊk^ZqRv0]7:Ǖ4VROsf&N>u^fOmZ@J7Aפ)nOAbTYVTʵ=bkR Ԉxu5d5Jk;=_Ü-svo"V1H"pR;֏nNTgokh硵msͦ_@f`6xUخ\=4w`82P\}/".(2"%3C[FR^UXL+Dv7[+A1I(:o@Gc:sa7FH!t\u~Pn_%`;<AyA:t#0~[> endobj 259 0 obj [252 0 R 253 0 R] endobj 252 0 obj <>>> endobj 253 0 obj <>>> endobj 257 0 obj <> endobj 254 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 269 0 obj <> stream xڝ[ˎ[9WHQnzkӛbzӿ?ԃ DQ$E*y"/dyK뷷/>hQRD.]T6^=޵qnwwHOҁB!6 \ˌhVHh}';Ƶ}/t`¼o$\XV0/xÕ6TY _Bz2(b 4r!5QZhNv?JHV B⎼O]"_M;s3)LUTndYr*c&SK*Yz؍uUGfӠ22V ͯcHeI.*DIf b۫nhvs4 jeQ{S5xfAC FGоr=}2>z"3ukƑ~@>]D67m}'62TWAfL5uW>TWU wz׳l,zzqfӡZui(_cyaߘUdgfV1!PQ5ETbUds)IAy/OʚOEe~VvSQf7ՈlE2Cy2{Bv@=U3uYp61.fb@kf]@l=V39L$SS)jmlY5B|0IN+tߩ\)k pUER/L(U~sk7/s@yBLO QDñaܴ!'x_>YhEа,+rX!2ٛn7`ѠrwaSh_{?q$Ӿ QYÑ>?{{~$F5y0Z \iկ^T+}B2G@&sΞyӰ,a2:Lh{Q8o.PmR#/4c/䎼6u\eCCQU& _K=-jXѥb^C'}ߘ]tkmnM^:{8^mcP+꠾D8,[^Chl%(LU ;2:_lNNܠ ^HmPN4BN4;Maɾy,;2 -QFt]@d3d[L,Nur"ʲ^*K>㳹aۯO5_Ǔo*O< _<*p(;ռP7zV"-:Xm( +cۅɡYͫ'OB|]dM^ Q Vyx(dt~Mvm_ZTPsOUPo ~P?rK]h'=?[lğ*`,ꛬ]#%`S.JbۙW|b@}QAJ:pٚQã[:/Yx)| iyS*AGnvް:K3{=-~F{r% endstream endobj 268 0 obj <> endobj 272 0 obj [260 0 R 261 0 R 262 0 R] endobj 260 0 obj <>>> endobj 261 0 obj <>>> endobj 262 0 obj <>>> endobj 270 0 obj <> endobj 9 0 obj <> endobj 13 0 obj <> endobj 17 0 obj <> endobj 271 0 obj <> endobj 267 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 278 0 obj <> stream xڵXn6W̐pķ&H.!SW 0$c-J/,z|\:,@AőS,_O_7ye;\YW.Ai/zrnq ߗɬ*Mayy]>j 5],7(wSQZZ7({Vme;SH9m`A95V.+Mȫ/ )YV*MAA@7ȻQQœv !(=Gy{`Nfv&(_=8;EL&s6 0 f1(MS؈J5F(xfG0w bG`#T5QO4kA?A 'MKVe7 RFh|HayjVjex{'*iϊ gcnl]DE/wҌnϕ.RQJ@+t'53.6'de/ʁ)+5xNT"'̴Tp'/I%GSIN,wAF}Qq/LJ=ZWT`XSvQC 2>>ZxtKL^ +j74SHəd+=K'ү!1-c ޴ʞ"| ^"aUQՊVDCȕLYbB>^S'K *װ}l,",EM锄YwyWoV$;>M|V)sɛe7}>=LТD8%/c[Űe1&ۇJu9M,YfZ-=FP޿i7N/.[ֶZXf͹0vc.`Ѥì\GZ V󍒝|ӵ_g]ҡ-0ٜ`C9ӶÝWrt.]ӑaIƀ a>[$*X Ml ItY!.R?kkeJooYe~riߡ}.[[ϦRaU> endobj 283 0 obj [263 0 R 265 0 R 273 0 R 264 0 R 266 0 R] endobj 263 0 obj <>>> endobj 265 0 obj <>>> endobj 273 0 obj <>>> endobj 264 0 obj <> >> endobj 266 0 obj <> >> endobj 279 0 obj <> endobj 280 0 obj <> endobj 21 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <> endobj 276 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 289 0 obj <> stream xڥ[ɮc WJv%]W$"(~(EICJ/_^Vݔ@Tj7o0!ܾq.2RW5}!ǦKD߾B2L9nilW7c̽6mO`p~6YA~˜ϸ3/G]4Z}ФETC BJE2"DEl)$oi?aءSj.onP8.QU}N5")S@,l[+swSMT cXEE@H25`o/ eOHmjӛmK9 -nљ*AYCVH8"쿢'?f@5Gfg-tJ+!Sg†_UJrmoaۜN׿tv{٘ F-o8|dxĂB'WK'5$"[ Zv*=]6ų^4B9-tQ1k!g*vYww^[V!WV6_̘fmLtWZw[=`Z p/m`[O %V]~k(F>+6BB{~m(H&u2AXn@xVdա-rC(lRʦR'YڬqW|gSрMsl/ .V4 cWv1S:'CF"r7G;2~N=O[겇D+N\(Ȱmw>a_֘_t0ʅ{a;z}2jL`󻙋Q8ɮ\ o\faEݴn>^QC,a).Z.fB\Bfw6o>f: mV>"͠!| au1O2Y~4Y'`u)HgVQƔY .fw+2+wWK?B;|۠4wr23r@}Zm{[uf{^[u]gIgLkqlHX"L֧;ȓtL2OdWyc}-3 Ԇ]ztposVŀ|߇mGApRTU} =ק}?CJŔH1T!O-4!Hj#$(\x5Soz@GNl?4&M7\I`j~/8x;K*]U S3`tvLl!j]$/2&!*A87NjI&XfrY1CS qk0fmnD 3G:,Yzr<+%:EUJ\@>녊ff cf1& 7ѹxVC6:0"2P `l"#0g֖VUeFNz8\5>gTi|i>KuY'M5`s9nlk^z2I<5! KZ?fÚaȫٴcc <֌IYY\ڏcC*P@]N )0v8Zt/\nCGggk6ѧ 5+42)xSJm"%VͤWgJ m#*21E]CG_it] xc^]sj7%/;ھ",SSRiۧyJ>?dInYmRb^W%B1UMДrF-W PwaGCP= 3+m {wO9bi¡ A@9zqBz95">kM!OxߚdsŘ6$*?2a@W$\UW7ʯ8ـIƚ^l Ӎ )/m^AܿJI Y'&1a?&?!V T|7yGj%eu& iB!߿%)-=”2{Va .?8.|%DtLjH-݈RJ%}OA/vE!TeR;ˏFw9I1sf ?Baz+D*z4^'RV2AVXeOsm:t+T\'.NuK$4Yp5\ᄂ7X!mYҧQcqŕB_mMGNvWԐڌ-t̍(cp endstream endobj 288 0 obj <> endobj 294 0 obj [274 0 R 284 0 R 285 0 R 286 0 R 275 0 R] endobj 274 0 obj <>>> endobj 284 0 obj <>>> endobj 285 0 obj <>>> endobj 286 0 obj <>>> endobj 275 0 obj <> >> endobj 290 0 obj <> endobj 25 0 obj <> endobj 29 0 obj <> endobj 291 0 obj <> endobj 292 0 obj <> endobj 293 0 obj <> endobj 287 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 302 0 obj <> stream xڽˎ$>_?D=|K27'%{/AJJU];UEM+/_^$~}QRD|Ak/t_2)K{X)yN^_̿TenHX᭮Ϭ%x3|~Ckl@ּP1>ӲWh+FW[%hB 1mՈOUvֶ]m<:4~4e# DQ!&qƒp[WϭV8ѵ/RpIzZ~ Rd$qFX!=thA_|RNӖĢZBGj@ Al$+>pQYDV7w|ޢ.HO¤7E=֕#QI+5t oŖ*BNP?ozv [0Ī]=-dCW, U̶e5@T6ƗbZlsP;3ɹ3fuBE,ެvlveQ5%?*ڍ|WA M'vhE 4ZvF6 rjMݵuLtL@ HAY 3#Wa ~BYw-U:!cc&vl@XJy. pu$~Sh#+ϏAhmu,ѦjNMBȓse`.2e9'c1sC0^NvAxV8 Ԓ ӕ),4^&#`T!S'mOKt*Ffٺ|r;7c)zu.A5Nصg7)Bz;\*D2Ѳ}Mr٬y}H%Bt'rj)9Lw#"3ʨ(3Ug0[&lBw'|b'MɒkTQ4ND^u[o`E*$ߋ-#eEpxˠd来_u7 ѐK X+ΛpVK*,6©بJ2f}-!I5^x%|9H+or\H:TVE[nBw "oVn*)'}"gbQ<o?e{r8PĐ]I3݇9ӿ&,n CwÎ1DrUUgKflk`;-WPTҋରވUUŻ.uP.5=OxnI[3ۜ]6hQl0 M6OwޯLD-UgXxG:a|4ٲn9',ғ2Yx _qc|DlƋV8r3~8:-4Nn*Lswv?\ )ϸoo , VJ(ʚ\Y'e~8% u]eGqݜ묢:aܡckTCy.bq=Έ؝cYsWRYwwt5Nꆃ@*I-ok/ lANՃ` k9SbR {NewQǂ',nZm8 LZ~0V uwF]{LB?7쓫5.\7O>f#/~c<#?YzootGāXnm89٪U[sU7=ӺDhICɫK^v^*T*ʹoyn3sSao0'.G)nMH.i 71i_wm ?mg({4 UbmS3 p""}H)ݻ*xZunL,+b[u84h^N< ygˑ}Tdo޸B(:߳Vi$r j\~$HqvCVq!jF{#gF$8w*lcBwFXg>@?!}zt#6zkXC )V 4u0A?^oPbdd"1K=qƦ1E̮Ҙ}y;oԍލ"1*ڎFs&ảOTڀd7u܎ uf/%fy,l>T}͟LZڋ>6SvLo' %*m+8V^sgփ:bE(r,.Lͩuڑ*XglGD9N_ &I||)@߾#9iN=e> endobj 308 0 obj [295 0 R 296 0 R 297 0 R 298 0 R 299 0 R] endobj 295 0 obj <>>> endobj 296 0 obj <>>> endobj 297 0 obj <>>> endobj 298 0 obj <>>> endobj 299 0 obj <>>> endobj 303 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 307 0 obj <> endobj 300 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 312 0 obj <> stream x\ˮ#WxvWJ 7+qH:"yXbKn?mrܽ+/7EPf 2 iv rwRFۨ/TrJC"nR/?DleEV%$d/}~}4M. mnQ/eM%l%H+q[koܺjV퇯/-k/wK?DxUߧ)~(#d NBz<6.<76Bhظشt l d6;a[~^ǯ ӠfcW2~y?{!TCu;cFMq7&c"x+Frob]@'uFKBZNMnZM40zIX ԥiЕ@4x|(5Է mp0Z׬Z=3Q ݧ'iEa>x#[:ӵ+4UfK|e͠‹*m3&QDyRPifuTH|pt!YXGou:a4jbJ.bۅn*/L0beI].O ~M>>I y 8zwy+Mfhz{ '{nxtv휽S *Aawp.K7N!ʓNsjnf*H Ɗf+J׹i|{4I[Ծ+5~>twZ]w\2h}0ȓK.6LPhAkEe鷼Mz-Ch9N'oZ'W N; k>9`-1Ļ͸DNo3U.\߲CuhbJ.jmF+lXI.B>RI"scD0blܗEjq O|(tC3ʹcbPj\㥖=iJkeND,~ːk1rr1aCrjo\]:NH-o |V)S|vkt1AEU\c 4uƻ gpFoĢPQۄ6]W6YٯC&'$(YA4'lz֗tT;kGؖItRRxA1cgxAr o@[CHC{a#)`(21Ϩ,*EaCJDz<+'..1-N{K 1?^M8ihuD28•,O|"XV9,;ZE0  l=9ZUEPr :ZHb_B j(mB s, a$O`h)={(IG;a}xRft(B.QC=谦A=; Ld#F4Ji\ɟma#vULù~EjWƘ #iddLyqިӱeZRBG$vUb.ծm0J(zcr0I؝&41jE9TиP~/MKт~'.(pF⢆{.@AwFܘ?t+܎Ok%@N͎Ҏvrnl5 hMs.::ݳtū-699 i CDA*;J) jic?4D@B =_HTE=@H`P*;K w:8ܮYFy4]` L7:0/̸A1vJUӱk%;@sA!%JW:Q̔*X80"5Wϊ݇s䳓pG>do`e +WE|ȪHJLpl"rԘ3942 i3<8bJa F:x&|<Ѫ.heiJ/L3p9k|_-ESjt΄tIyaaΣE GSШ)2}bZf< >^5H!pј]oL n+ 2<1f0Op3gyW= nOpDϞ V y<=]۰¾g݊%UWL4EYHyNtOhk?3 ?\yl/CfOEsi >^5];󻜷P7N82-<,qxOFz\F/jƵ Ty<=Mq]7Ε2gtd])݆|i#`JV90oϗ=/]_><1G2 1&)DB{&,.'NrՆg e##.<1f0h3'YO=˥lgS皂k(bOh3'9]uìl[!6ےЖJ?ۜ`A?*[F'̩G ﳊ}W`f)b:,<ǩUoSr<7HV&'Ѭ~6al%oqҭpuoy8f~Vz穵H> endobj 313 0 obj <> endobj 309 0 obj <> endobj 310 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 316 0 obj <> stream x[Ɏ ),Kf=r-596R vw6GJַۏ/7Un&A%`1~7{ ;D-,5XO?Wj'&UӬ.Rlx qmUu9ODf3 rxwel.ܧg3]4JEA7ɤIp^‰+sJ|)~] U2ǟ[z.GAJMӓ٭ ]},={;*Av8!iN<*:5[lbwՉi[~ zީHU6NyHʘ%ZFlTB @ٯBw;^f”(€ 7Ul(|W&+z{ݯN*"AN qȑzZgM x.Q/{^ޚuw>0~7sB_jj/R)YT ϔsXƲ\yI2]ߠriJ@ER|,ͽ񅙱9v΄JRbW`Ff uy̻5I7oC(8 "v "f74pX#cj;TݛYuFqVu ]u$6;8:\O1<.6vN8m@1E~پu*ၻ61CZI`CK] |^]GXC;)pvV*W/ 5mJ5b(DAo̝Z&?t_<@S)߸uf0)WFކtNZ D uRy[V{Х;`XBnr95;CܑZY[jcvcƝ ը=ACo84ݝ`PTƑ@q4 Я LarocpDZB2><]9Bĕ%F rIWUX3Rj>W3cάQ?;ju_%̖nMo`Jr_{봣\Ϊ+p2+DR2zKS5J05Y0XcO'`2w.3jZ/}GS}/<oSx ςLL*dE}FY&L '.kѲ(8hWTۥ: \0Dey (-%0B%k 7oUur!؆y@V~'݈ڣEhpDQtˆ~R*Qzu4G)S!:~=+FpͪxyڏAF\>PVf=z_$s4!+QQy+}l=R,Ofp)x/>YĮBؐ9 OSL[e#QJ=1ZcփU{WyȜg؁.U߅>D:0+2br_$2҈R| 5T^1#"咓YR;ZuN[N)oE߲jks8Ȅ7h9}}"/*dږ|V} ϞfQ7YI%XG( kNxʋ3ϢVZ`2<±1ك_ɜƊKN٠Lȋ@o2#o[S*vJYeEx"<%aC] 9c_ LOwYLX LF)AnV_N2lS.KuR+;kI1E #J-|wVyvL *araQ6ֽB7t_PrbW(rjTeQ\!گd&l*}<:-v$SL>s|c9AXfi4=#&`tӋru|@XO(0+^B D= KvIVª6n9jJ; [ v/yn@{|PO%w^\iåPtQJ\6cL⩜WaM k&jH20BtMވB<"W>".j%wt`<&qT2oy\E@&Ց¶>.!gN#^ԛi˜muz6Mu/B*HQO^QE;GSsal\8%d~#l[S-¤@<-41ea AAZ*V9M RX׵I kFsd(E̊tvA2MQu*b~&g ]uA" Ϳ!JJ@%tjfGlT2vP[N<ɷ )}r4PXNM>%q=q?fks>n(Z-kr~SE򶜬y_;$^9s訒J|QK_NTqrps{uQ|l"`\f7^$`Փ w|:߰HIB90@u)a䃉(n4hXmozu5hǫvhT)S-tH<\Oe52925f!.s 2_wJU ~.,p2LFse̝K&c7xZ+7vr`̦ I7= endstream endobj 315 0 obj <> endobj 317 0 obj <> endobj 318 0 obj <> endobj 319 0 obj <> endobj 33 0 obj <> endobj 37 0 obj <> endobj 41 0 obj <> endobj 314 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 326 0 obj <> stream xڭZ;$ Wth70hwlOvȆx;߷DJ]50]*")>>R%///EIeJod/!\>~^~{+gU;_Au{ ==EEAڙ[)w gFod J 6 xuHb-*eeE_ݾEšYꁫ` paZ̏q.je aAbB$!8mc¡;x~a0^0qRq3Z2ġ}quA;zʀVwB;7-W c\5V0۬qvRTvpÃ%:R5C-ۢ^hi?jky{5*ӺihtMT{LKC3:[tKݗJ buTMͶ5RɵPTlO*8 GH9R?%i-ɲ& zН%(\=2^z\Mh5UFK HLϿT7"z@:D: -^>rj9b aêoS@#;F;x۠S; { ՝F<O9Hq9j4F n\(V+#nS)R؇ή.^FEk6*am@ OeTh3a`<[+3) `eHj^ ދ2MIKu 7C"&7ijU$}ZJ6R4%;&ͤňYE2ֳTHQf a:Xb4kʼnqq5Ea8Tvw8Эl!)EI6x5 gHشk8ǜu) u}'4yy"&HD<6 :Et{cyh:虦҃N9pА\t-".ZM?-G9ebUkY^#nVn}Y;(8_0dPI{tODLDS⠕i4{Po` Hla |:uPB 1:L@*%p3X{*ޔ"88x@z\_di@o~:p`s`7WllPylD%B֧w\tEv\e( b6)ʲqqm3j77]ql|[X|nY1IBg1(̦yTG>h@{xI-[ꦞc,Y׬/+"ۇ.h#uYnI3dw~>>^9#SP/./O/T@2gAx]o o0 D5؄@YDtNO`*%Bzzc^fövVMf#L&ie9 endstream endobj 325 0 obj <> endobj 330 0 obj [320 0 R 321 0 R 322 0 R 323 0 R] endobj 320 0 obj <>>> endobj 321 0 obj <>>> endobj 322 0 obj <>>> endobj 323 0 obj <>>> endobj 327 0 obj <> endobj 45 0 obj <> endobj 329 0 obj <> endobj 324 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 335 0 obj <> stream xڭMo8 +|R$8-69iʶlӉ#KAhb/yEINxdR=0IbB꾽>{|֗x5}st|H9ta$N=/OĈҧߡ}Hhmj]j]Z{oy<ߑ7C72O"p3Ml>eԍAif5~9Eu۟>?.{<+< "M_tFbvOq2R~|4({򜈣?;&p:>Fq & l$3$L"Y?cNeƱOd(Lbd@^RQ]܌p!үI2* ,|}3 _0mҮуtnțj2b8X S`cuĞ\>fl^M U:bgRn/۠7֯lMޯWU:a?/^oSyyp˲dA"ZT%ߌZ ׀B4vR<%ي'!v+)WufdA 񼐶 ,8;eьk٥LV ']g6}g[H(rl jCEWH 3=aʎGZ+Bʳe> endobj 336 0 obj <> endobj 332 0 obj <> endobj 333 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 340 0 obj <> stream xZIoW19L MRoyS|b{W/3M" V9VoW&K_0ɴ <żV[wUYZz#0~.dD?]KWT!NhFsGn:F4WγA\ϟ,dCV[v i&,wO7=*"N9ÞNcq)!l\åon~fHljT5Iٗf{T|NpoN+o9bCq;o \ 3mnsJgW<2h3@ z@ \o^SXsB\6A|+%TlE+|dRs ;-W8qż򺺘w2ady˕)/6Φ\$邬l>2crz9 w2O 4KJK ЩOЅn% >?6_ s EřwRWŋ0 fsV}!?U'1RAJQCFq#q^A  xOM+Y{WG VܞTxcIWѹAF$lg[ϗ9j\!~c{.cUʡ^CI<=MA#|,1US_[K:9cz!K6;YJF-^pѣ%֬˃n{$(ܤB6=vCLfJҕ)ƫ>;kSf\68ɝV^ kn|:p^AഅxBI[=n<߸V#$3iÑR*kP TЋH_+c68=֫ m*(.htFDB_ L~vrD!i-+%'z+e-[]}"z( E,:hh+ 9BXN&$v~&1R"#0: R$v$*ZP_-7\zD}^>KE˗-,EGqC/7}*\txԜL 5̑_F (8".JjTU!!m!Aͮm>U_ԕ%GWFsȃʏbTwp ʨ0ExZ2J+;7ܧ=}rphW$:d44&`'Qհ`vQ^MEeO|[Jp'd[uuukir픣ϋ\^e"^uzw!XxߢD`A~@xpJSc!(rP=V,wϱЭ\,8W%ܟkT1D4ӐUu6%x hKR8[6%= 2LqV$qw>IQ!Y"V^O%K/RtԀm ?Xm)hhS&"ʧ܃R7vNa))9EY]Je۪ ]#1҃-AL!ԎQ9{ z 7 N`K68U0w5uJw鰗 1XiS~!46yST DXDs+.H>)m\P2aq}roU$BqHǜz6<vp qW#>c@# u$&c_mŤ`fPޡ~mJF͙J K3$1헾UIF« =}3Vnm ӌz&fr_P#Wnu+Yvz :Qe5$m@dn4uQQ]T:brȓzme}Vh.c_/HLl/%ʹ%j\x H/*.@^BCbfe%X᠇o[R"/ǢsF*;8hٿJ\Y1~^ fZHͿGش.%E{0 gwyW-#  @)$D&ײ\Cbp081a_/'iZ" i1E *wU:&UdpkP.zt Vdĵ)?TgmIU3ʑ#:4h_ \x{h}g pP@-r_39TK'N'UX-x|{L3fn Hi/U[IP$iPk{czYрO0}Wb>ig_e@gA|_P3U?Ye(Rk\ĄC~-2J4rƷ !3^iRat.wۿ-LXM[raqq$H/u/]BreR7Mަ/ a+:W/`QҌKuFbK3X tfMW{ˬt\v(3D6\Ǐ阮]E{jP"G#W uûh x-#k4 K9P%vnj8R1 |>6jT^ĠAAF#%tzV(@֧tsh6op~(m2r%QF\﬩X6"FSOxJmgA nu> endobj 341 0 obj <> endobj 331 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 346 0 obj <> endobj 347 0 obj <> endobj 348 0 obj <> endobj 349 0 obj <> endobj 350 0 obj <> endobj 338 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 354 0 obj <> stream xZ͎6 SʕDR?@`3 ,ْEj~-O$%GMOjϷuS`I*3xG?)RJ)/d㥖wS{R_dMD3统gKWH1@Ή=o .\pniF1kL2eJ)̞MJ.;=$GDj}Y"g$Y@xYs`u#JN8F`,2¼1t?- 8sU:T+#gȡyF_{9q@gf +sdͤm4_*̔㪶a,bLZ\7'F|rsY;hh5l#ned{-"+?ɫB0mʤWXfA O| (.ofR&fjJkZ^eɤ.7i]. |gJj eɯ|lD-6oY A{@ j q,+ *$!ŗj,g^%Gp!ζS9[ǂr/Lp;=("&|-rUw)?7ts`-VM&ۋ޻Bkbʻ^Duq;.z`3~QA )|p2^C:R@Ht9r&koHGk;%ϹQn5lhr H}}pt4Fw\rV82Udoe|8'㞓-[@u=(q[䇬/[ 6XRgit jYT{8+ endstream endobj 353 0 obj <> endobj 355 0 obj <> endobj 356 0 obj <> endobj 357 0 obj <> endobj 358 0 obj <> endobj 359 0 obj <> endobj 360 0 obj <> endobj 361 0 obj <> endobj 362 0 obj <> endobj 363 0 obj <> endobj 364 0 obj <> endobj 365 0 obj <> endobj 366 0 obj <> endobj 367 0 obj <> endobj 368 0 obj <> endobj 370 0 obj <> endobj 371 0 obj <> endobj 372 0 obj <> endobj 373 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <> endobj 380 0 obj <> endobj 381 0 obj <> endobj 382 0 obj <> endobj 383 0 obj <> endobj 384 0 obj <> endobj 385 0 obj <> endobj 386 0 obj <> endobj 387 0 obj <> endobj 388 0 obj <> endobj 389 0 obj <> endobj 390 0 obj <> endobj 391 0 obj <> endobj 392 0 obj <> endobj 393 0 obj <> endobj 394 0 obj <> endobj 395 0 obj <> endobj 396 0 obj <> endobj 397 0 obj <> endobj 398 0 obj <> endobj 399 0 obj <> endobj 400 0 obj <> endobj 401 0 obj <> endobj 402 0 obj <> endobj 403 0 obj <> endobj 352 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 411 0 obj <> stream xڭˮ+r@O:c_iFYbx4$(ߋE?|{Xw "X?_B' o˿RO)RCĿ-~Ly6Əl0~=2GS? ?p0B# 'uUERKk(ڹPwʮY6#10ʘ0 LEYy|"'wQR BS -6Uw-}yÊ37!Z}/1hGI}m'nk34ձF _Kl{WH;r8h`~F#BEږV oq볆D^nIGU:4G]G2Hh7I+Yi5XըM}+.2>ٺ$UK L0Ix b#A:rz $XqG:^6JԄ8Y#HY쵼.V2-k}Օq|QKD%e zP[B]_ߌNi01gwHWqcM\ݙfo?2IKH4#\l[[DߢOykWP= '1R)";g#ЄijVyJy^N2y~j7!Q=2kR)t(Iy-yupqԝ)UۓS_C&%&U=FI}NM)SBFr$sV[(JJaq[}Q}1a;G[$U ԋ4o8o8kJI҄82Z nmc,} w¸' 3.5,<|xnW^ {_ 5Rq%bRPqHhZtcrSjPI&on ka*qdpn9njFmxbeTU-څrvf8Eyb$E$ߣqFzohP a[ܦN FxZm+ZkvNEC\I6q-XZF[V*'̮kkuZHc2`49!2_1dbH:"sE՜Xr141-#T[ yGu&}KRd`c|G7yg;a<5j٤!2DY d%j;y!?R\iTOR|ƜLG-Uqkx$"pR/.{);HE؝@TQ >*OqVYVnV6:>D^ye6HaSb.Иm$QNRĞAʡ5?hd;ܲiI$!#b2xAh 7lO bB2.';cAl4 .܃K9%KVxRU"1$ThzmQ@'o9Ȣ3C8s,sK_ԈX1c+y7(QcQk8;ӖHB[5qPuY&{53ѕ:޶p=笮3Eco4u.*"3N]6j;0p&$v3hIQ+v".Ȧo.UD7#w0b $UMZJD>B9wnXe,C{GlVmGB'k}`X+k[pihMm1/Ym0{צM$y('#y+ë] /ӿW3?opϹ@ 2y2aUj|k0VX3sPRG\1ܜՁmdmJTYaD}nj44mnuPYf©^?MP!C@Gӏ$ktԵ(ܖ8rSEvGC>vE2gՋRD{XK֞emfhڌi޸Ҋ7Me9w^ 폏QI M=[ OS|d+rwe{wIZ:ܻUdҀ@RܣY],eeʉkD  ݍ kLuh`uku/9_ҵn6/Mhԕ݆s>d^jsRvCہ1WocT3۬ 0:Ӱv{8ưj`PX=sFxcyxz_2DqX/T ֿYsU=|-zˁzT1"az8欃<9H|h#C-Y%`/6[s,9cԡb'$-2[똌ΑXiwOa^Tl~AAm82t3+"Fe+Zyqpė!L<< ]_Dm{ (:GϮ ?'z endstream endobj 410 0 obj <> endobj 418 0 obj [404 0 R 405 0 R 406 0 R 407 0 R 408 0 R] endobj 404 0 obj <>>> endobj 405 0 obj <>>> endobj 406 0 obj <>>> endobj 407 0 obj <>>> endobj 408 0 obj <>>> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj <> endobj 415 0 obj <> endobj 416 0 obj <> endobj 49 0 obj <> endobj 53 0 obj <> endobj 409 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 422 0 obj <> stream xZ9%WP D VoƀCc3۩7ūXd ab] MEo_MI%w/ k̓A۷"uHiSߐ쐰Rf ?* mhӯ4J[Džum_mz{g+c;GJT&?:qv, eOD?rt(jďSB{?s,`.iL{ѯВ(A^~)Lх3׏V<9[*AW,hbVNxC4E;Nb!ֳt6 75qr:.\BEH jd}pv7VZDؙ`'Lj Iuv:T<~)Plj[ +P*/o AW{{P64IY1}ʆ%V߫0vd~ֵXi&MΙ\G!v|og~ʷ%Sl Nu~5Nq_vMuku{}upqHtx uʹrXqqnitmEt_;P2WB 21vW28Nm>6--ҽYR " ü\7^;& 2LG ?o2My@ޛLeͲ[>##'/L07kBV.=$n{ƅ]OJLI;qyb!',{Ӻ|oڛ%/Fk++)B<-Oer <:8siw^aXcCcӦ.t#Ϣ!=GV5 4-OKLwm(f`UW~PO=jd3NdjpM?(֜cH=zz32u ay>1ڏYrz Aվs JOdru.W>vzNuXۉ!|}h %sXL8!Ƨq+a10F@Țܻo>~c/y#WU|m8fw^l<T4ؚ5J[8]ʥqʭ߹hXih)S(R坄yFBۦGNGq804߆㊓C xݭâ σqȈH0el2ZLazn6]<&& .I`Q=n:UFˉo߾[? endstream endobj 421 0 obj <> endobj 442 0 obj [419 0 R] endobj 419 0 obj <>>> endobj 423 0 obj <> endobj 424 0 obj <> endobj 425 0 obj <> endobj 426 0 obj <> endobj 428 0 obj <> endobj 429 0 obj <> endobj 430 0 obj <> endobj 432 0 obj <> endobj 433 0 obj <> endobj 434 0 obj <> endobj 435 0 obj <> endobj 436 0 obj <> endobj 437 0 obj <> endobj 438 0 obj <> endobj 439 0 obj <> endobj 420 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 445 0 obj <> stream xڭZɎ7+bq(@܂\S.Cڛ( Y#6Y˫M˯Mo.J 󟋢'W1翗ޤDh}}оJ-3<ʳ?xŝp 4x ͊PWґuytƽԊtJ"/1Ad.{U%2wpo,k52IKt/& y1kߤYC˨aFmQv<>ۉW8V_f{X6fx"넬׽]J&(w#?A1>dcLu+A2HGZ{@\맶o.YtslVPyd0X ϣoygd()Om( Zc; e pX쳛^$ #N 9 8l:$a1ԵBܭ1|g)q08nZkbX!R3٭^k٘%$>seb8[n F_[{++WS;=vFA o6EɽXMzmnaPs7CZ9*QRJӹe<1P+µ<%#jOK 3Mp[2oa#6^E> lOq0y'CmxӵUX" 9>(;],|h=ݣ)?Hڢq;*}:@GއxM Gtd 1F8ϔpF~-RK<<߻qp[oD 3X?ڝʕ>xX%I:_CgO~~}<K s|Sj;vwp(PLY>g mnnd6_ZzJA?ޭ=1 > endobj 446 0 obj <> endobj 447 0 obj <> endobj 448 0 obj <> endobj 449 0 obj <> endobj 450 0 obj <> endobj 451 0 obj <> endobj 452 0 obj <> endobj 453 0 obj <> endobj 454 0 obj <> endobj 455 0 obj <> endobj 456 0 obj <> endobj 457 0 obj <> endobj 458 0 obj <> endobj 459 0 obj <> endobj 460 0 obj <> endobj 461 0 obj <> endobj 462 0 obj <> endobj 463 0 obj <> endobj 464 0 obj <> endobj 465 0 obj <> endobj 466 0 obj <> endobj 467 0 obj <> endobj 468 0 obj <> endobj 469 0 obj <> endobj 470 0 obj <> endobj 471 0 obj <> endobj 472 0 obj <> endobj 443 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 475 0 obj <> stream xڽn%_hE 0r 䚜rlwcyUHNV˧<ɧo{IId翟T#AA?9pߧ>KBCil?M|+ _ aƝF$⧌ gfBdˎ ղ]K{H?2Z XdTc[+2]R? e28b9a onn7o `ݏve集z*+;dkI &oTEެ=eSip䍎J` W"hxrBW ~)gΚ6JϬ/촣ڕ/j2cEdxSͼ܌"X,}hފ|=hJ0ьp2%~̖]&#{! q2Kd(+xNK V8ldqpޙ8x&ϐYRB dv2 V„!ӹ[BuSM;\(9DG39_A ܌"KMF*Vs^]c K|[Qx6 _}[նAXm1h.Wh|goT8o+eF.a2V`X-s4R.ͤR\lKKKuiI‚F3᱖m`a(6rT^XjXiohx>jZ؁LWy;WJ|ݸ|۫a .zuSv+O `\DQ`3h8Q Eu#.Nߺ,RN2@pGQVcyeYMRLfy؎YG^WbP1P՜r|mQV?d(ueYrΐύZ 1rY{_\єwm` s&5X𵦠 e (t F0ZJ+:0:cfGa?sЂ@PH [P2Q/BXrlf%eOjM45\Hpx3$,:FGPeFGPb`v!j ."ʎ(-:fI7vine ‘EP/U;YWӡ6xj C51x@іGqnᙷy8h:&:&"Q uPT3"`VBod $aJ3֍ Y,?'q:9}-R 3e[*kY0Þ*wz*_gB-Bg&%qHC䥜 EOEz"!(67&,TH L22R:5cJhU$^f+&ǫ8%ϲͺfx5'Ddɒ8*gA1!lWΨIg&F|Q$^kz%Q`tFQe!xh B0, ՛#'L5JI ύ~mg ͜N8MS^gY,"9% ;i ՃJ~F3-Ա~.UY' _uVJTyƄ'r9 ͌fiI缚|Jځ1 H.;IsLuUL{lHzok8+,h\aӠM<;ڽVc;\,Ճ'B;ǫ%!:Ȋ I26/D!hSJ GwωgBڦNKu8-`JF ,|`-^Yv6[QGt>E 't}18cs+y4}0F>ɟhd@9"E$94,)ZBsB)Bm6|Sznh)*C^a(Quѡ1I{X_?S}從F opS_h<]gW4X]ᮦu{<K\tZ+m@R4hxwdpӪwyȠcnOiSa xW'g-(6~V_ƈ:,hG};ԭ}X~Xmfųxžj#wÕa)oA_L"cݰp*5Yv3ŘЄh!]}21vغv0k8j91QZh$>gVuh0<2j.@ 4jFc4sڇ=^]ŀ8; w*`]3,k Wi.uy=YS נ]Bǫޜi<7Bɥ"I)_m}e*[H0la| 7ƘSW8B=bh6ܯuHa,()ICQxi=>PEr1p oU$j54DLB7;>S&[54>&.[Hw܃l-޳d=e@4N]w&~I-0boU 6~&| peKXȘ0gOg ^q~:%u_kO HQdx b_I@^^k}K~[w '|!quSI#D룩{uxѠowYܒ ^?#TU4 g9 ΪZRUx,9VX|.Y7SqXovSGZJ'8F_(ִU䥽 KK717f\V̘=>*eM 4jDsHtVT6Y?C/#< vxe #5NeڴR޸дS4)ݩ ~t<3)2Svh?H7%̨x-2&4ݨ3Ucng-NU0s;v1ڽ/C^zrH{ڲLXe+^UGk0Y klZwqb~1,hF)>L"r endstream endobj 474 0 obj <> endobj 476 0 obj <> endobj 473 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 479 0 obj <> stream xڽ+1߯PhK ph9ѭna]Mj >owi.3? $\ ^~7zϿWuBfAr&?j8O\ w?MΤƕ{Z ·Ts{ۯ2<WgyA7 e~K"%Cx|)o~U鷴9hյr+'J jdbKPCn/ǮuSjPYHyV i Y,MuR FTKVx=k1D/Z=@9\߭|+{ea%싂M&XVD&)+MF Yojn 4o!ٗUPtZilhFJ5Us((. XK~7 Jf$ߪj˔ P?r8"גҟ d; Yu;~xOӦvԿ QR|iX^U 㳽7`rʃX`Ew߸]zF+>.bxlJ)XH‹ʻ]WҌk yOpT]Ds$dSNj[<*-An@A:5Sܪ5$x}vVηl|٫M ɻPp{8!qU3(~~޹ c#H_H+p@'IhPʜ ]{2ia6aaRnMx;;נB ie;  M@{ s^/Q~Zʜas u맿SaՑ9xfOUSrCyn^[rfi2l3eV5Zl3mNH[ Ʉ𽳗p5FԵWsƗ^`{TitɡCyp9yCaj~rC>sRBKf’wTr )נѼi&wF^WzrY7m;\yIڷ;zIx$bS_vGC'iRB1^~d5ߵvnK uWA +:>V^_z/7=4.ӊ +̫f AnȄSJrßE]SHH}'T[GL3I^ӼūOANapw i* JF|'".IF/8 ؂(v+04RFD !7QAEf:F^6jWNi 2753zv\YUQmwtE+& Χ`jO]/k\#!Io=ҳ$ouQ`D4'KhCI`/|墝KYb>)f4+E4W+Uҧ€RwEKC~'RRƦF;Si >YCu(:! ۭ"ՀL豉W#ɥ"wPESXhx[[И^axt2 Au+RЛP8a9:j6z>pU*{oHijG0;S֏]c~j;/>6bcL,Futaa&afkh}bp`2+ŭOb&'*G*GǑv~/B{$J|+[K_Ǖ/- #(wx!kͩ ƠB_Ncp2W36sƧ ޒUo}̖:,өf C G*G+Ƿ"߳Us[e C9Im91m>ʔݶ)Ѧ#CC[SnIViFWZ^_90#}گdq Zg@yu1oy U@z>(T$6DW2+u##:xP>Xk7ҷGÔCUj)@eM -7.agԠ["=&د`uWE9)FN`S-!n 5K[qh)`ʯI,ê.+m~a z`ִsr>Ԏ$mX#X40 f58_E8o}o sΧK#i|m@yqOc?`J endstream endobj 478 0 obj <> endobj 480 0 obj <> endobj 481 0 obj <> endobj 482 0 obj <> endobj 483 0 obj <> endobj 484 0 obj <> endobj 485 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <> endobj 488 0 obj <> endobj 477 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 491 0 obj <> stream xZˎ+'Wx, EF|vgdP4rt˸E8u ,'ϷWA oݐ' =":KF qQO4|];)Ou~l8I<| ӼGqp:+-й9i&=ᚆgq5: YR ۖl*y<>jo.\AҿQ"ZgT5Mws:>k_ح!&J >P8ozxt҉?}V7#, M2^UɊjުh(>KԶݴl C(%+Ph %àТ< dhˡ FB (ZBoEIk._ _Ce#Y,?Ew)Kk=v5$-Ჶ3'kk2+yٓZti%F(yupG<p|TB{rWms0ջ*NzQC% !fIDuUI=fp]oI6* mX_$ ]~Nm@u{L8Dqkh]'hRl-<10~=qn.R&u7e w`PW:BlTCY}C4R/BVShU/fL̰v9̵J>s#i਴YAgHC exMl hDwzu8TT[4VS ;F4Fbōi{帑TbE,6:> =-W*=$X >zX|O Iڮ iOvk'ǝv'~bȞ//lގi-0t* 2{ߠ[0ieŖeT8Qg#ܲsIR>}}{ 4wZ׺tY L7$I?_ȽJ 6}wR Sÿ# ʒ:XC!a6X;ֶڷ#u&bLZj?M\ bmˆӎr`r֚v͸0dY6{RS|m/]~S7i;4h֩Y'm)zE\RaZDKh/hξhgFվUR0%h[ӵw܇V`ĺĶꉉαUY5o5*t)g n4obD>q-o>pr ?vwhwXh2-VW Ǽȅ8F-JqXv{}r ܹ;iu譖 Ga7:mXD.rz'Z$R-%[r3w\gx|e{}9 bvg>u׾enFY!H;YP5Sm*ct\d$4uLD{|R)%6 >=d*U4 0xy{]d endstream endobj 490 0 obj <> endobj 492 0 obj <> endobj 493 0 obj <> endobj 494 0 obj <> endobj 495 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <> endobj 500 0 obj <> endobj 501 0 obj <> endobj 502 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <> endobj 507 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <> endobj 510 0 obj <> endobj 511 0 obj <> endobj 512 0 obj <> endobj 513 0 obj <> endobj 514 0 obj <> endobj 515 0 obj <> endobj 516 0 obj <> endobj 517 0 obj <> endobj 518 0 obj <> endobj 519 0 obj <> endobj 520 0 obj <> endobj 521 0 obj <> endobj 522 0 obj <> endobj 489 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 525 0 obj <> stream xYn6Wl!g/0 {RK&U͐RĕlBw->yΐҗ/}y h5s1ܣ^Y/.]|@sEnq|jJ;,Z]o/T6F.Kޑ)Պ%W~l7w(4V׵Z7=w}Qd(*#:s~c8$jҎoV}Y=nd8& TweCħΦ,Ʃa&AAҟ,4ndJ^O)ZRb_64F6'dkD8E&Ol(s˫Yl pqArgkdovT>mvuGTƘ7s#;NA|\Pr';SzszKj镦9GқCuFu HQRKaf3ku{B.KZe0jrW,l)&@ dυ7^۩m;0BеN$-JCwB|vAFU%ƈJI'od7@_|~š\(މ#gLz+EeܧpJr$j&0^kp!&<7n.|P/ЅhHZNhJ^琐 .[ Fa4xUx IO)}P^/V}V)rbWɦ%[׺ar ebAzAsK刦uǾu[̫ [Թɿ怶AułYz"2\s[S\kB8ɥ}Lzw[ ק l ʓb&{^|NjW:g`:5A`{)oc֝/^ȆhdK3Y|EZ/ͤ^:CBe=2i:&4ɵʝ|)" iRm]n|mm<>?pr0\p3xxrgK)V+QO'VY/RDsȫi4 endstream endobj 524 0 obj <> endobj 526 0 obj <> endobj 527 0 obj <> endobj 528 0 obj <> endobj 529 0 obj <> endobj 530 0 obj <> endobj 531 0 obj <> endobj 532 0 obj <> endobj 533 0 obj <> endobj 534 0 obj <> endobj 535 0 obj <> endobj 536 0 obj <> endobj 537 0 obj <> endobj 538 0 obj <> endobj 539 0 obj <> endobj 540 0 obj <> endobj 541 0 obj <> endobj 542 0 obj <> endobj 543 0 obj <> endobj 544 0 obj <> endobj 545 0 obj <> endobj 546 0 obj <> endobj 547 0 obj <> endobj 548 0 obj <> endobj 549 0 obj <> endobj 550 0 obj <> endobj 551 0 obj <> endobj 552 0 obj <> endobj 553 0 obj <> endobj 554 0 obj <> endobj 555 0 obj <> endobj 556 0 obj <> endobj 523 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 560 0 obj <> stream xYn$7 +\#r-59$jx<@0cq#N'%ӷuyxzy@o@'鏳R?F)T;?ଔo ?EyL^d -(#fZyx=zI+jX˟o?o2 M&o+ikjVN <7KÄ}D_( }\udXG4QWijpowNZMى @[ d7!b\/n>BQx搘@T¥VY۫Iv[".䓳KTZ"e嫿@դʛrR9,pOtgS(nO^UfbP&t"~g13dóyE'QZ^)|VQcPbQEQLؐǿtE#QŅdpęgY9b4Qó:)!4)\T08CV`iu:˾QD.I&QI:nKWRkܯɏ9_^-c dmp&Tn#n%l 6\Ė3['e[4k]46՟+z<(#oNAK<eT:ܓT UmH_V:f}'O!;!\RT5UnfN^.üiŸ h*LzC`kWFj/[v\&үfB5Hgs;+ rzФR4p0 kg}VHziVOhۀ]fZf{JrseC@W)(H!;=Śy"p=T> endobj 561 0 obj <> endobj 562 0 obj <> endobj 563 0 obj <> endobj 564 0 obj <> endobj 565 0 obj <> endobj 566 0 obj <> endobj 567 0 obj <> endobj 568 0 obj <> endobj 569 0 obj <> endobj 570 0 obj <> endobj 571 0 obj <> endobj 572 0 obj <> endobj 573 0 obj <> endobj 574 0 obj <> endobj 575 0 obj <> endobj 576 0 obj <> endobj 577 0 obj <> endobj 578 0 obj <> endobj 579 0 obj <> endobj 580 0 obj <> endobj 581 0 obj <> endobj 582 0 obj <> endobj 583 0 obj <> endobj 584 0 obj <> endobj 585 0 obj <> endobj 586 0 obj <> endobj 587 0 obj <> endobj 588 0 obj <> endobj 558 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 591 0 obj <> stream x[9odWt ! h 84&7#'Y=X㫃&o}߾?Hݔ^)~#_Vho@n?} g?ǼL\)Nݑ0qQHH1=Ӂ,wԐb4g*RL#*/ePHN6ӵ87&k76:.]^(0@s )WU;id,׭&~kXeqʏRzܨ|gRP2Zf|47y6ziîѡ,2y_"& vP[AF $ ED(y XW<" e:fgV'ۚJ:^q &cJs/OZ 1M]"sH;-&7 q#a#GI6B/"$1J΋q(I_j+RAƼv;T:?l\\#Q1Hs1bƋ]2dZЖ[ۼMB.V-on"_9G^Wb@[`X}QjCYGa_q<ٴڽ#善+3ig*K2Ayߟy8/m k;WA^*YJ-a@{*>lF;VU$3V .ɠ`2W;)?/ N8HKwvb0Lyω1FtW>Q`H [Ҷy!ǂr̈tGR]Tm^oSU%e.QT).O3M ~ur29=ފC hU׵"pxrhB6جR(5GګrYK,TO>62<C0=4M"5MĽi#f(B?Ө> hJy/oW#TMΡ]7 cA!ziLUܦ>0yJ=PJ pV[ C0WP:oZ)?4bWF^¢HYWY$i|z}zOO이?dPh{ԊZC__8ғ-%P#hNfhQ[{ ЧԼ2za fH(oB#LzU`6Pi.C-1L?p(VjISVM}U^p_̗6_@7~ й^7E~EMbzGd1>ӪY#-Fl%"B{b@a*uΰ 'EGf2,$mO]Pӓ^vU§@5&egrNP~keK`؟3 Ζڑg\ ;ޖ˨0<>pq庛NA3zxհ rx腵g4_1#v+LU!߶5Qj_׭c<>bY#~PjIm?- I:! ePʦe}D ]AsO9m[W]Jo\Q5w}꽽&`H~ӑ“|rCcO6$N3 AZ2H֠&r(_;Ua2 w@wa;]Q;WB{=)<)8)[h ^}]Jw*JO $6igb.K-&==I%/F:Ln9tq9RrQ^TqOl馊o|봩̪IfEJ'9}";$ʆr-hοjM9Vum2"MBO5M+4Nk򙤂z:ak@1K6Q[s OrNL [+;nLw\v>wߒ:_]{=ߛk&!KdQBNz;nM1[Va>_Wo9kzHѩXcèZ!\n$gw#I~0"cBT 7`uoy\ endstream endobj 590 0 obj <> endobj 613 0 obj [557 0 R] endobj 557 0 obj <>>> endobj 592 0 obj <> endobj 57 0 obj <> endobj 593 0 obj <> endobj 594 0 obj <> endobj 595 0 obj <> endobj 596 0 obj <> endobj 597 0 obj <> endobj 598 0 obj <> endobj 599 0 obj <> endobj 600 0 obj <> endobj 601 0 obj <> endobj 602 0 obj <> endobj 603 0 obj <> endobj 604 0 obj <> endobj 605 0 obj <> endobj 606 0 obj <> endobj 607 0 obj <> endobj 608 0 obj <> endobj 609 0 obj <> endobj 610 0 obj <> endobj 611 0 obj <> endobj 589 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 617 0 obj <> stream xZɎ9+Hj*\O}?JT Dq}"Oo?~~huwߓIOt߀WƓG0ϿN>k QkrZ[חFFA]]y=m/Ą󧨢G<T|~̅m.ײK$'& _XWyT|ޚ?$)<֨AQ!UyxWj;JBT'}}OcjޫQT+ trΪOe {LӄaI!^M?cyY 4$P;ʢ|Y@i㾪eW/<<)je&(ݗyv/gOzLlV0a) ϑS:p[ :ܓBᗐIAQA!~z")/%Sm)]x] _$4@3k8˩ /sN1+=C iKr^! \!Y_\HٕpitNyitҠkuPG}u//x$҇$̃'_ԂlO˔YE:n"\)vozweq6*?SXֿTZy%*Y =A*a!U½ڰ».yWH{f/) {HڕqUw^w /+ Ë Du"xEyس6eʦjCq*"Yn]eg6?ᙨ `ZA[9SE> :\!:.4{ژNrқz (wI1u6L/yn/6c/={>3#մ|k oڰX]ell׏ى|"{DegTLz͘CM y.\SXhގ JFvCΉj潟ۜNgOWݞwL\YDCr3 #Lsʳ@p(]uwI\MT}OTwS4<F]7eU lʼngUU0[oCuzTyy60ޯ~ mPi%y;ڂp8Pi0^dl*kK_9k>F\/Ħ` ?7J:3C= /ŅFAn=,%"%(otSM<tɮzwa]V*(3:Į5\vqܿf:"UPSMפ؎ S%([3)qormeHcLrKH| =!JrqW٨3^~@&з|uUh AƮT!R疽YIziWׁ@6#*Ҕҧ5MhN{liq5Fm:cK3{^q J!\$%Cv.CUʴ,t߱d$Nf>U4 Pu^"yi3{bO+lQҦr'=L%2sK3.`>U%)z$ )Ҭ}kSTt4''1QFukԹfO*Y[~ [2A'J(D6M!a9}Ľ8ŝ ^3pw-Ni7,pܓ`.%ܜM mYLu 3=á×X$xLm]"/KӖ+0cZ@YdS@.`Y_hCE~ȫe*2)lkl[yKm/m$+)wΤRDw#vR:F BbׂB$2 xo籹'70bVN5eܕΣa ӗ漢8B&R)\8i+>s+ʯW F7i([#R> endobj 639 0 obj [614 0 R] endobj 614 0 obj <>>> endobj 618 0 obj <> endobj 619 0 obj <> endobj 620 0 obj <> endobj 621 0 obj <> endobj 622 0 obj <> endobj 623 0 obj <> endobj 624 0 obj <> endobj 625 0 obj <> endobj 626 0 obj <> endobj 627 0 obj <> endobj 628 0 obj <> endobj 629 0 obj <> endobj 630 0 obj <> endobj 631 0 obj <> endobj 632 0 obj <> endobj 633 0 obj <> endobj 634 0 obj <> endobj 635 0 obj <> endobj 636 0 obj <> endobj 637 0 obj <> endobj 638 0 obj <> endobj 61 0 obj <> endobj 615 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 646 0 obj <> stream xZɎ#W%Bd`n6}/}2̔T9T&`,ԧOo߾CQPF&u1w6Sf1 C* F?zq_6VYllSVdܙ:" A!hNoO'rpgd?*N "53>97,HzoĺM籆|Ѻ8xxqTЮ3_pJZ~ Ќ% ?{t!5/sQV_p:zcS0e]{@ya%;cϴ&v)Yul ߿މM|Ѕ\{B 4[$ݧhy9#}'w[ Dz d$r,BX*}BXTupf"?} Sb٧ 6C /kϘ2K1L9VB]vA!:M$h&?v;^#W7:sX& ˤ(Ʋ0@h`SmR"8 eU@\ -(6Re-);uQװes5YnsCsZߓLiȈkn0u{7*i]=0ͻ\{C0+&i G\MWn&Nc ZW.H!|=)Oe|$>$]CS[UH}cv~UG!K6WrD+[ߵᗿP)U.岑5F"BzYU38-12ÂJ @WFsZVڽ&CKNM*&X=d/J#4-$BSګÑ݌ʥmv`Pت6 5)E&\aG,djUcMԂoWbGbQzI뻖tfQ>\qSgf\aE)XHcz2ʞǾ>DTe[`Y ʧǬ =vcn'>vZPUσb_pVVăZѯ^Oz;z{W&)0qرSGьނy^kuiNGrMI{r^ %xLpQQjO?FK{/ ֛jdTR+R]Wu;OiCj9u-V[Ļͧ\%`Po C#)zbQ@'At׳ ų X#C{7>鑰 4'fg2>ʱ~0DvVf'rd;m,m# `ei}LM5VWV^R&Ayi{kQ?kbno ̣L)Olrn$6tKSkugP.bna dZMwb݁n sF޴#߬(YyyWi%.Wr'R3)GٍۜWjMmMbrxosV: }gA(](Anz=C]=n`1i!.l.q`mc~ƅ8s z"|(6ܸ(l^Q9\(V)׫W. wRz>wsHcTqWeg Uyov}m=qu?t޶WWď+x|1Z]x֋*ܲ|7K9#.ÞpSǖFԩmcO, {͜) 7aoAɥv_ӧ_NeӺ(0R_p:14Gv$R?8>g(jM% VFQP-1F9+Jb:X۵7>Q#Rbel+Bkԁ]ň1e endstream endobj 645 0 obj <> endobj 661 0 obj [640 0 R 641 0 R] endobj 640 0 obj <>>> endobj 641 0 obj <> >> endobj 647 0 obj <> endobj 648 0 obj <> endobj 649 0 obj <> endobj 650 0 obj <> endobj 651 0 obj <> endobj 652 0 obj <> endobj 653 0 obj <> endobj 654 0 obj <> endobj 65 0 obj <> endobj 655 0 obj <> endobj 656 0 obj <> endobj 657 0 obj <> endobj 658 0 obj <> endobj 659 0 obj <> endobj 660 0 obj <> endobj 644 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 668 0 obj <> stream xZK#7FGF -)Asؽ_JԃR` <*IE_֧7]~}p2Z->8A91>~9k Nk\sBo]{[>>چ-)Ӝ{!q]K٠۔WBA'ߣ=v'X떓sqSg9(fRH'|>qې_&󧷍J,M%L>VmwfM.TdݎR,n$K0UWGާ _9YXuvH0';m0)oNf>Q jݎ qBM$ue۝3vaܶ`OIEG ;wV_֠).i!dUzpűJ%za rI ~stIʌ% 'wV(DU~cl(wjH \|cyވU̺Ǐ6ԋ8Gmu˜y9XK|ezۈWl-շ*eR<.7h/Է6R(mmXi"G0"a~iԝ1X-anWL ,_ L7EPA^-SvF6  ͂6 !z[N߹W>CFzU ɪme/VXHt?<"]dI\PȨ'bk sBap>"rY1OϺ"aX Knoڪ_ޞ~˯; Dq$PJ<8 (\ԧ~~[Y3ꦬjEI+tKZ(HzEpVL$eWo R[KKD۸㸖4zuz݆~NE O &R_\0{u B)JR_+~ endstream endobj 667 0 obj <> endobj 679 0 obj [642 0 R 662 0 R 643 0 R 663 0 R] endobj 642 0 obj <>>> endobj 662 0 obj <>>> endobj 643 0 obj <> >> endobj 663 0 obj <> >> endobj 669 0 obj <> endobj 69 0 obj <> endobj 670 0 obj <> endobj 671 0 obj <> endobj 672 0 obj <> endobj 673 0 obj <> endobj 674 0 obj <> endobj 675 0 obj <> endobj 676 0 obj <> endobj 73 0 obj <> endobj 677 0 obj <> endobj 678 0 obj <> endobj 666 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 682 0 obj <> stream x[9#W(咬hWNȉ`^Eniր7j5Y,~u"/|o?]A.F+1 ߮R/%֦_-?hwez]&'ww&~dKڄ{&ѣWq K+ b&_"R$L|# @BEz2nUJfZ/2Lyk}hW7o>̵jǴU̴GŀFdie3k hI:=|h(txHywL%+L2HM^\e8.O2^F!B-1|w;EqlQ*&]#Z`wpO:w% %No #=s":}$M[}[HhVo0 (nA p 4X#*%@<+s k޾iN YA@f(g_ +VZT 6>* ׮KyD\N>(wlKiV= rC`xB%fTTGV{,O\{] QbٯF<Ƈ)*ZMRF@08Ԫ&GB*2A*7-<Ӵ\5F5잟b6y:R :qf3?vx jan %S%ģKZ1) ,FwC eAT3]Za{ pdh΢N7UW#OĈh}`a.doʣ04X}`'ǃeX6)дϳ#J>l晪(׫w[ WQ{BX#wHRP>d6F/)ڹa%9u@đ<L0N`ҕx9;E8OY?93ШX ^ O%q ".w1!?]J5*. +f !sSU Y<'Lģ+/rDh giRFX:lbZWu51z6A]\u`}> mJxs;(qAƦ5^(wb`bײå%dJAqx1 qC߷xġTX&:0 ]o["Ze@3Eν51QjQĘto;'&y]tT˛y6aS:g_rDxLey3pB _D"ZL(hgʼ_h:qyxT tPqz񍻕%~/ҙJ1z;dgB̦ᔩS&bԀ^"\¸&J/>f7԰V x#l2_2ns< x-KVVhP7ːAP marz>7FYΓ& eYYƧRf0FmQJcy=˭^ŭ5DVSꚕc]~؏kO;uيJk>Ў)kx!d6Uyþ#WEmt-G4jݖ?0>9vtȚҐvfu|>k*۟,BDuuAEО.\jI" s=Е`[Dk豲/7ԮUmT`!υn ܻp1FW!q"/;y5tLb{Ps0f Zɱ 5d[||ۍ2>؆UYf< #&]GW73= 3d;H&fj'8caWyY02ՆCUFV9aoE#9uuo9EJSCh5E>YmU%SV^1W3:n, ],򥤝Nr'ռ@M@@嵟4[֦3WܷZģlqSPJfv(p1e7\aSB-e{>LVq{o|sɛ#@9+4MftW1ow5x+tR+n2Vۜ^([v\%0q[m)= #"V-KMmB{/Mi[}pp}U ̅=8;:189|nM~I|J_Am!SN R(+6 ]40'Q=ٕXM[cuݻHo7}JCg.e];{K!K/ z/2^MR`7x8JLYAEL䔝-aJp~KXk=b4r"l0ǜD; viշ/vvp+cceA/FLl/E(h 2*\`˥[+58vg4jG)qحg k˸95a'~/tJJ tA2k硼)OjS1Qob3^F" gI[N\4?A")jcrk~[}kq$X5d+ |AaQIa (]Kf endstream endobj 681 0 obj <> endobj 706 0 obj [664 0 R 665 0 R] endobj 664 0 obj <>>> endobj 665 0 obj <>>> endobj 683 0 obj <> endobj 684 0 obj <> endobj 685 0 obj <> endobj 686 0 obj <> endobj 687 0 obj <> endobj 688 0 obj <> endobj 689 0 obj <> endobj 690 0 obj <> endobj 691 0 obj <> endobj 692 0 obj <> endobj 693 0 obj <> endobj 694 0 obj <> endobj 695 0 obj <> endobj 696 0 obj <> endobj 697 0 obj <> endobj 698 0 obj <> endobj 699 0 obj <> endobj 700 0 obj <> endobj 701 0 obj <> endobj 702 0 obj <> endobj 703 0 obj <> endobj 704 0 obj <> endobj 705 0 obj <> endobj 680 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 709 0 obj <> stream x[ˮ# WZ(\\ݶ2]mz"z*Jb`vI")>j}}ҧ?i׷|8~d7slP6ӯc'3sׯgp@2$+ nC 8ַ.'` ̫R4&xvr&Ee|)+aV6!Ev\ќ̶+&V%q}nV0 8bS/ }ME YH*jD΅Un#mz.pG82)m*U6D"8w $#*"ra_#gj-./YEp;u}!:$s vQI@LypX #sh)nM'QiQD^ 2C.۬,ǟ4 kioXOZTʅaRZ˽[LgֶB}O>.zX \xydY)vmuvV&gn  Sn;ee|9r5v>[{*JVr/* :WƳSl0`U-3v6B41*goD0jOLnXbtmƠ?pya%ٜMbgIׅbQ9 #N?'IsN+00;W}QWtI8-4@f5l19%FII)0fw $f\לщ*YA@^AƧ0['g>(a%0hA3wѤ\ACIXM]jFñD"!6h?GƉϚ 'ԧHb ^p$ sG :}&ppJWUK C0|v毷W/{^&#kkwEhf+:@e]YoR֧c0S{NL^J<~t\D`ޱ~/ѿj}Z/[+e:߸ O-vQƙӲ/uj $#,=2CG)_z>3TowE5X[2Ɏ#| Dj5Ͽdm7,VisnQуVO&CƇ8-K 6AVƠ||r2)x' =L (}J_xP/B v%ndM.9h$6483p_:AR7%NҴ"Grݶ=vʸxRK n^蘍'Ts\*e%J+4^)+)]|cW-?`¹Cyܺcj0/nUZD4"-]? jA2`E=7\M۷{y ʛ^/{nzŹ$>Na4@;ܡ-t9:BgMM1wy&蠲7*6 Ryٱõ]Y^eAȫtk٧͏-LJ<^hՆe~n} q9@\ C͍J\$k$_A kܔm6}tt(ښe鹵9氾N! "W;̊,jL3  .wt&e-;Nzh#HHud;?'W-oiߵf_C}v?K{XLc+~ugzܸ h}ffffȋ2vBfjE7ỖxHc5665嵄00BGBpTATD#q] 5 [ï$R^I^T;壟]djta\Z[al +>Yum cis'S~ 5#D6 Qhw,{.Bd2w⑏_ds H=˧9r>Vͧn?iEm^ l(׷@91'K}sTe=bp\E KL:h%/U2Rvx h9/#HKiT'wj_Q8$t%toTVFʥSb;O}F8Tq%]m- <|p .3N:pWLl&GJF%(;` 9} awøwåq( qW_/?h\p jnJ[IȘb.iUک׈$"1\(㈘!XAg>Qvig ǰtE endstream endobj 708 0 obj <> endobj 710 0 obj <> endobj 711 0 obj <> endobj 712 0 obj <> endobj 713 0 obj <> endobj 714 0 obj <> endobj 715 0 obj <> endobj 716 0 obj <> endobj 717 0 obj <> endobj 718 0 obj <> endobj 719 0 obj <> endobj 720 0 obj <> endobj 721 0 obj <> endobj 722 0 obj <> endobj 723 0 obj <> endobj 724 0 obj <> endobj 707 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 727 0 obj <> stream xڭ[ˮ$)W ۗMmzͤ7'xۿZv'|}?F[='3=̟@F C8#Q|gϗDžcAHD4gjōƹP(486+pkXbnygu4D"ϔi5{^ܸ܋;0=-_)ZcB0fbXpҺ1&QE c5mkdr#A$(SG[n+ET^XHX 6u(o ֕t&ߣ3\n(<ƈ5MfsZ}gaJX @Pλsu! V/0 T6mB|5ShcMtcr/j?lۑM\=y~{b/js5z8$넃aPc;aPyS] #V1>nTl;l ŢXqXQՋӇi\.OsG(Ck5=E[T?֕вv=WOe/@(\]x%i!ުV !mPOz7F&ds&B0YcdB)c CЩ !ZM}u3wy}VHH"(} ~JW[?bšTCymK]iϕ$3$S4 \gg«4Pw>Bȩ`SX oLh[ pM d,]9>v1rl%s 4:^82!*%l*g;fCPh‹Vb/I0qD[ˣJi 0=}x-9%[ RK.l. o>6-_ f&qD8=?םyߕn)D/0ʘmxjZOC 7B*}pxJ9G"/19K[!W^-mT oqX!2L8z鰼W=َ.hv;8ydgh^ ER(͏GpfVDO92Oj-a6)&E?̨7` zuw#[}ޙ|?'WV/+Кh_e5 .ƻZGb_KxkLgR$ߋP2&*s mX+O"S&0K|:7U2-L ţ$R,EꍲdQ܆#/E̶'fhtI\ wTh5UI :* PYIշz DQ<,CL9Y-v yUP,u I _@'wKh94KKUm+G mևL+[&t,6-X\x\ DMۀhڹcKUfS͈GSz|V / <D w9@Konr/W:y;v$]k7qΥ]Kti'HM_V У;ݷuK9$(m̒t~pbEu;p3}p nk nin51 ~տ6+էL&d9ҢHs#pn+~7LcJNb/ȕa.HEX9%tdu2sR$ԲJ.۰)ml>7,jJt7P:R:^ syBL+ l=p;>QP"zZ-&pR4)Z4-<.J)gDS zp!^`}J'݄>Ǖ>V-J2).Qi_N /aC+xBJN S{J{KRRWT\v]4Dks<?Xum֕FRF;ȕVAhw~f9ʆ_% GאD;v;9!럋 EFC쮟=LT (^z|Kr _ș,[Pjڅu'097?zvv2O5zbX#iM^CkI?rLk9J#%AQj/p N B4ڔbp^FJgﯱ&/P5]v֓KXzCe|;9Jwr!DŸ7o\Ջ-kVlZE\Ȥfr; 3]݇{p3N]^ܖuɴS>o Ωs󪶙~q'zLzT^TňҚs>8Xjl~tޭ^O&0O(^^_MZ^Z+TByux+ŅV{8B>τ/gKJϟU endstream endobj 726 0 obj <> endobj 728 0 obj <> endobj 729 0 obj <> endobj 730 0 obj <> endobj 731 0 obj <> endobj 732 0 obj <> endobj 733 0 obj <> endobj 734 0 obj <> endobj 735 0 obj <> endobj 736 0 obj <> endobj 725 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 739 0 obj <> stream xڽY9o#7+L swZZ e.6[/áFؒŬ$>7ӯIO?|=};Y7,XLN1'z?;ڼj&>5I7w[|d:eHr:>SYOOn5Ogr+B&p=\Us1(vr9o#CJtg!( ~;VAkJOLdC!ʹFĝXw"mP|-l9=ىmоW3 1\3?q%J(+Yiۉ[(q ,?}ci?Y< 8 R)rþ~ ?HYhTlFgb@P/b7척^8*^\A4YMg-bxJt¿N"$"NFjxZC^3FF%]Ѯ%j*:|p#l>/\[U0OWFTuP=N!xɹ+_dԓE16ʪJDvFP~(#[ޟ ]KH"o ^waRĴ0Dor_,wn*0 QN,r6FLc)](Us嬆@%XKO?++իnbgуXO:I'iVB]&1嫡Z[:R-K-w[۵֚r1/-,m|r0g&A{ pWG"twEvSw*6wb(+%)dndre8Jȥ@:vjJwk_5lzonb4 ܴ43nhf"KFs8#_$g5kG Nzup1JEw -u (ќ1͘ hͦnW+c)2%w`ϹFMIo7& 0lT@U9E.Aov34!":QSā$)\fP;s1YZiLhD^0'2k3F D]mzGI鳨ĸԋںrӳqMԲСcע$2')\ 엙Oҵ O4 pË+W_d&[2#=Q#hb!߉GG';eWdoK  T0A'[e ޲O7߿ E`ʲ/V9wZ7Ϫ$.rl:R'a!}~ߣtݺː/i~ǵZVxtt`\rc\(!ܣNܶ{iϏ[>X~,W׼Nyd̓~A!.( ţd) ΊW+"* uq󋨍QQ!x(yOMP :3 Հ0pJaI3c~7DЊ1)&I*q endstream endobj 738 0 obj <> endobj 740 0 obj <> endobj 741 0 obj <> endobj 742 0 obj <> endobj 743 0 obj <> endobj 744 0 obj <> endobj 745 0 obj <> endobj 746 0 obj <> endobj 747 0 obj <> endobj 748 0 obj <> endobj 749 0 obj <> endobj 750 0 obj <> endobj 751 0 obj <> endobj 752 0 obj <> endobj 753 0 obj <> endobj 754 0 obj <> endobj 755 0 obj <> endobj 756 0 obj <> endobj 757 0 obj <> endobj 758 0 obj <> endobj 759 0 obj <> endobj 760 0 obj <> endobj 761 0 obj <> endobj 762 0 obj <> endobj 763 0 obj <> endobj 764 0 obj <> endobj 765 0 obj <> endobj 766 0 obj <> endobj 767 0 obj <> endobj 768 0 obj <> endobj 769 0 obj <> endobj 770 0 obj <> endobj 771 0 obj <> endobj 772 0 obj <> endobj 773 0 obj <> endobj 774 0 obj <> endobj 737 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 780 0 obj <> stream xɎ+>_0$ŞSwp.p"lvMK\oly"/?H|~}tEtJ2W ŧ UJuO)O>zfǝ?Xm}pz/ +#3>dx|Lme"4D3LIgz!";p'@]q)J]TE/M;0|>/j QXWwumy/g$9=ĿjE[ .QάqurFCС:mijز#u)uДlWR a>|'LuѰm7Ď|Rxߌ?O+C;\52;!WK \SF&k-#nbAwZ[UP iC;#6P^5 bbH>-1Wt@ 3<U˪7bJ[F,#l+rp,i,$:r%b%j%"+훡P3PVMuI`2Cs|9S:Ҩ7R<ë eEN22F++>0 ,KȑmeW5p "Nl8yH7rĩ(#eΟj̮SaXqiWϓNKaO%tAΠ83%bPlN.R,0<姵V؊ĵ\<x)E|;R2 iW~"J%4%Uwf%VD77h: ]y-cLN f0f0X~AF)r+ S){NkmCv-A~.A2g#IQ=N|(t% JD)~Ti]-DgR$B/ !v)ig5wwe@iWD|x/'7nhaak<tDۃ<5F`e!f*Ҧ5R<:$̐ɰܠJwȵՎc=mN-q*MU7AGV؊/.3Uf%lecY]6L* DSN{풛CGD:G'^jHn/M$|O%PeJk&VX[a+] $6YS6Y[.$t >ёX~M-ͽZoF.IX,''>@J3wmbrYQb)$]$K{14~Iw7Rnn#I7<"PǽDQn&eVA ̠ZS5tjИHO49b6%󑟸ic <+AVQv\:" frY]xg]FGa뵾 H7?lH1wӌE&IP䡪9/ۛk]qw*b1lI16ٽW5I85ْn*o"XIFoevkdܼd7|[f{rTG ^#;F@oբchxы*6[@|o n^[&_^ J{8WfSxk *3o/&/J?!o*;oB嗗&6eކQSJɣ77$J[RL/ !v~-[}Tzv/!gjXàz<{D|o)Ba=ڷ%$s endstream endobj 779 0 obj <> endobj 796 0 obj [775 0 R 776 0 R 777 0 R] endobj 775 0 obj <>>> endobj 776 0 obj <>>> endobj 777 0 obj <> >> endobj 781 0 obj <> endobj 782 0 obj <> endobj 783 0 obj <> endobj 784 0 obj <> endobj 785 0 obj <> endobj 786 0 obj <> endobj 787 0 obj <> endobj 77 0 obj <> endobj 788 0 obj <> endobj 789 0 obj <> endobj 790 0 obj <> endobj 791 0 obj <> endobj 792 0 obj <> endobj 793 0 obj <> endobj 794 0 obj <> endobj 795 0 obj <> endobj 778 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 800 0 obj <> stream xڥVn1 +ajqcȭoAN Ks詿_Y Y>>J0 nFgCcAR(Û=$_fw8%rpF9Da0p|/̈ћMwԦcy?]2 ٖs;/]S )ws;C +v>.&5ޛp1 hpVR3[n_m =C:ZFˮұT (6>aZLyd i]ǴŹLI.|nYzeaTnZ/妵[cұ_Ok= V?SBlEtA$ endstream endobj 799 0 obj <> endobj 801 0 obj <> endobj 797 0 obj <> endobj 798 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 806 0 obj <> stream xY;#7 WLH R%i*MJ4f olėOzc˷-ϯ/_/QE/4o+k+ as夵hMW_ϟ^^iVB/!2eoZ"?qy)4U˪$ߍ+ǀaZ˻4g|J4gL,;\PagLڨh{IKFNi(H @ViE,v):͢:x4փ#ttXH8y+}[C& S}[d ikXm[AGtίձﹿ7f@X'#w93!@p:!#b<~!2J>5$)ėÃˡMag?~yͬ2XitsoVJE@lF#?MS_  es|k?+-=G[آr=H:VSK'[LwIBop|v@bVo6,@5Euˮ;8Y9mA :1Ci64nue.m[O7pоn\y5n3aLKvx@k\-zfK3|`Ń,K;> endobj 822 0 obj [802 0 R 803 0 R] endobj 802 0 obj <>>> endobj 803 0 obj <>>> endobj 807 0 obj <> endobj 808 0 obj <> endobj 809 0 obj <> endobj 810 0 obj <> endobj 811 0 obj <> endobj 812 0 obj <> endobj 813 0 obj <> endobj 814 0 obj <> endobj 815 0 obj <> endobj 81 0 obj <> endobj 816 0 obj <> endobj 817 0 obj <> endobj 818 0 obj <> endobj 819 0 obj <> endobj 820 0 obj <> endobj 85 0 obj <> endobj 89 0 obj <> endobj 93 0 obj <> endobj 804 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 825 0 obj <> stream xڵZI#)ׯqP&=Y+#ݺ}L/vLb_>O?h4wd荦s ( jӚZB+=uhCo<뿝wb6V5=ix󓉗\C˝mBf>}h:~|`!g?1sWB~Is4xL]4QlǶ>Y!za2ʮz~b5 9oŞiPA3d >v~ =jȖ2Ltk{.DMDƓKIiZ2< 8Kf,d'X+쑕paGOrWPJVdFkMFMgQn[݋Tj* Wp% ;.79L~6z}VTwgE-AViVu&9OyliJʙʏ9IVya$}^IK#YelE^&wf)UJٻުkS_<6'9K;&9U%w߆H>0O[#Z{[m)^5ڥōSz+Vr`fKr,eک5F"ˆ-j~ch*SF澬=<)٭x=/^b_=*R%$PHnm,ZXBdIKVr<sD)^4'㐳C4ETIvIW@i8glI MZ!5 e8֢J!/X@%JQp~K  :U̗A Գ an[_4c96#DHh(hbE(OܬC,lVj Bw싇ᔲb~`nʗ ]W2 ׹)l}3I(,5ٝ %v{+U\$]1@A1IYuZo"agRJKgDvZ7V"^cAԏHJ6iB֐2z+R ۑnIPN-A[zcOZAצ({lkaa-P8%J[T`' ^NDEҺQ0:DubS&ӷHF zvǥ!=<fSBZt]u&tiR\|k[ ~*ې~eZZ6Dˊ(΃Q |9BG{k]yolPFYBUM|k LSj 6Um:U^vKr<[P-Eh$V|4(5s#5G8+IJ⺨py€͇PҫQ0io/XKVj˿_g8J4$A4Iys9!^Sp;˦SNp!QvSiu܃Z\-ӤltEƯrp2v.go_ endstream endobj 824 0 obj <> endobj 826 0 obj <> endobj 97 0 obj <> endobj 101 0 obj <> endobj 105 0 obj <> endobj 823 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 831 0 obj <> stream xڽ#1PhCр @3ٛڑ`b֛ xѷ/nFMn?y3iFʹlP6ۏ~Zh6}0}M Ce@o1m}Kjg=#tT^ i={h<")K,h3Hߚgh3Ӆ 婺N8efEF DӓjX̓GhJ,9< V^Ȍcc[G2!SC3 _f8JԷ½? 4TtY-#y(Xg'6xCē~P$b̚p׹.zXN5XYR'a!D$ny6KWV|HGuuXwH 捞6FL /x<Z?ƞxe!Sg) &BeH;lD-TP^tRdL;֒ 4_VNxcDvـ9Vx6yz@o]%y-6ug n-*3=|= FO1+gqݪ8u)NŞM +//U}9wr*v @! p=\hA ;[r W¿?HVM'#R*B[(# Y-m8W y> V&I=4CO 5M'̎iIJr41b:9Ð -nXsH}+#i~ᙗ%/DB2U'愫BwM~ Ҁp*T mVҥ 5`l$@L A]*\{b4Bѽ #=഑#0ǝXR&}&KP:/?L %ew۽r&ٲ26 ss]Z,xVgǐGGΔJo3TwlZ 2I[)G32qCYxڥ ՙ=(@  &gi?,Z9)Us%IZS,AIVn̔ 礘f'3-S7"9"#!=C s0:رZiuSdUL+qK2GDZaɧ<Mgx- f:&3Fth@5EzW4HA4R/C#z#l)>փ7T~8TXDݏ̮1c+Da!pXDac 3EȅLd,5ͧZoEoEkЩ`a}QA0ɣ% ssCǞZ^W|zbr|.'ms$sC;l?Ҿ? FBS*D- e!s,f8M"yTiwBakzE7V܅$b&Lt\A4OjM^akET'L?areQa5^O ^as0K jq㱢F홝u%"ٯ}NEu&q׷ӛL}S|6V1(;FteݎJwkF ּpJ;gkxo)~)E_וRKr5VarɡT Psg""u=2?-M+ҡadC+4&B^!N'{OYvl옎pCaa,.(YJ\JPނs#SWgf1 fN%]"yKeoZcWSџQv9y2;Ȏj,bAĵqO~|62*0z|k{ǥHJwO= w R@I4ryc"-/P3l-"  g;xUiԄJeQWBnK3W"6ziT7 wP\rhfz-=X`?6^}CQ cء{|]n)ڐA^pVaNmi90? k/XtؽM6?%y`A\<;uSvpA! +*gpAYu1MvHڞCJ `ČnA/mDZWL풦WHn!b.-h^Tt{Ȝ>ĽV+NN˂- }?j߾-)oo6@pWSMMVjF6)8C68&o_Cl_eѸz"O.®ˊ꾌a"miRV+ S;pgDJLaBJJo~ޕU8Cu՝-{;tOwm4h iaY%?|}Z ڊ 2*LX*{>OtQ: kkj I˚ ãٽ#0(w:JۍKQ;s`U V~+_u IU> endobj 833 0 obj [827 0 R 828 0 R] endobj 827 0 obj <>>> endobj 828 0 obj <>>> endobj 832 0 obj <> endobj 829 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 838 0 obj <> stream xڵI$> E2f{nN2u/D%35]}+yM~"/?=))LnqSL+텵 ۯw)-Hi\=?/_utiyO4#Z+| =^_Ӡ-wpK^ie~*+^*=;N4 N¦t7ߨ"o;rr.ԭ&eE@6oQ%DL= A6$,y#តN4әob 5膡 3A44|M6HIJP/eܽ+%DXx3%ٌP.ρXv'<JH&*c{gk}GKm'|S#QD/4/#y>0 &ǭq. ZGuA\RO;I:<7!WUxDVu׿<#9\9 .i%s|<An.: !.;RM{ʏiJB?*}i8/rJI5!D31qp:xЩf®XĦIym*h9"GV]j.EѣVE`ox?pto݉k_Ѵq$HIْr\Nt׃rSSy8yÉK9+TD$&H%EЃv膽B; acBZoSXSX'dlwЗdMS̶ ߟ2\c(kAQc\Fe/Aso wF9k"2 o2Oyfue[F4 $߲8׉:'OsވTG$rcÌƑ:OFH=]Y`H^ 9fŶzo܁&fڈ:&3j>*slU rN1_(N- YzXPn 93pVG (+ &47ȑ?G1pd%;Gtl7$j5[y#|͑sՑדM#?epY|\lVnEXάfYfuKL6=UU[+&W&nͪ)% RI)$$]E3;.`xbV-L3z`I`ۯ;fDOx?huuv.[_hF(8INߪ'LNB}G5+2LfLe3JODB.[]mO_Ck9U5Ue|i- t!f_xy;K&}Mv*pri.KMvf,b*y[FWTxlSn򧥆2W035[HFz$ɪڢwTLç0j<@}>+YLaeKdJI 8BEM !+9ʗv8c֥[rk;V?Y+o0tԂݜHDžm}T)Uh[hygPk?f5=H4okADZ=5Ix_tQ7Ù˨;+#[~Ѱ+w`e:9Wrw*G~rmd(GFAGA{%4v{8`XPPOH/ZiSjPI,zqu>,i6rs WF`lXݚ2JQ#c3eqeBз2'_:ҋR5-g-`V@Z@(iÉp ^YEvB$W!SUnbLR~ms%#i4p}KR"׮;(~Y.m/n[[mwyȉz@[}*m 7e}[R78.#μ]: Tz\uILKKY, eO8=MCI^v9 C,aQed1'F}ާmfS^V[O%I,UR?Y <54LJ7;H%TGأO%+ྜǺC[cOa-`(;mqP2dQIG~_zw|6\D-qi8R:En m sLPTb㸚0gH9W/LjiXFh=DQ!Z_ԙ%AS m;wzZR CRKuwY;'5|gV5![i)؛r!8ΔWmRFdu?:SȇG][_"4SjHBNQnzL1iJ`LԔCi}sN;Qms! [jڟekY~W]q6>rXdcuAp,+Ւ]2oۆNTg~>~˓-P r YM 4q>Tdss'`I3/x^CGF PE_5v%Otp 5N(@D 7iʍu >s0򖐹9)*s3"([SW~åzC0_-P_d9 G&'/@-{fw d{=Z_\mv}󆵜8XlmAuFK%kt5m=vss:,2-`2J(mf|JwFE?196o6gDV8Gq9p+O7_aͱ>d>jr3[:Od'|K l"$k_}QA/cߞ4" -UOy.[>]~=ygc26$3˿WaP?=&poMCHuۗZBڛN!ikJ-4G_{֫kH,JNƑMR9W#q]GH|4RԬ)"IBA\ͳ*t՝y%RpS ^s3gU!^1jNZ&4^\32C6ե endstream endobj 837 0 obj <> endobj 842 0 obj [834 0 R 835 0 R 841 0 R] endobj 834 0 obj <>>> endobj 835 0 obj <> >> endobj 841 0 obj <> >> endobj 839 0 obj <> endobj 109 0 obj <> endobj 840 0 obj <> endobj 836 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 845 0 obj <> stream xZnl ݿeZf( kl;6HyjpHR֗_o?4#KV9@p/|ɪ mT6.xsAkoo|?W~p7D P6,v`:oAE:|7uuo6| ֡d!a`ZFІۀXǐ|P![k)Wj/^]P_j(8+a w3̃Z? /v#([$ :q-G;-T*k@Gfh^ԠQX~֚{ڴ,A:n&*UY}&S4ǿT!> v=,넆tǾմX7^9`r Yg's1it~{Q)}a<(cReP]DmȱǑ~8F$c oиD;)Ք# ^Mc/!bvpbO,f eИ9L y]~sPEdb,u^ahy4$~~l1`D Ykz,/>3x?CF-IL17nBZrIwЍ#N{p>qi q]~?f" H{۞"D^|0H`cPϕw2,Kڃ%x"] x N;+LԈNVb.iM~hpbsPy KYEdN@ތpVw VRW,[ьҩ5OHn68 ը~, CR:yV;Krqk?x6Y(ƛ"gLp2=SV>I a깭p=}{WZn Ә9}1^*9s*Kb]-@\jR𓒥U?6STp}RhۼXiQ|5)46aLøj=(ɧ襵2CTO]~)paU[u3%.1qɵafc51XornxCS϶a,`t ۅ|x"GvfDBnuJ]GN-Z$ޝ縆m>j6)r!UQV Tmt;iy[,Z RsٿR!f>vc<mm˜ee&n|;ܣ.Fȿh nKnU;8*.q|7[I)`aDR4M4U3#{*dϐJq4i.v /%7>1N&oArQw[v˨[ҵ)ֿ)?xһ%/mqOWa, @L:KwI 2EL (_p̋+u AF^J &*[W{B -~'/U.hYb$ *G񢕷ŸN9dO_|}/ endstream endobj 844 0 obj <> endobj 846 0 obj <> endobj 113 0 obj <> endobj 847 0 obj <> endobj 848 0 obj <> endobj 849 0 obj <> endobj 850 0 obj <> endobj 843 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 855 0 obj <> stream xڽ[K, ϯ?00QK=+ehvQVnVwE19:]Ə/='j-:o (KAm|q֟;oHgulw!CFgCzH='lhnq7O\ ?prզRqUqU:jWHPRKPlϰdhHU_dBq힚uLKnI"h[.y5eYyYr'3>D=Q%e~Pϊ٦IUlU#l8RjR)Gt7AzeM $umxLCsJ,2d} ;j&QZUț-h(fӦ2rElNfc7v4t0ڬo+ S!ye5ӇˮvG`\ \wJ]aO]M>NMRzW׎sEah:tVYs9$%~mDIw\[vDyǕ;Ogǃ.π42Y R2+"4jZw;0'2M~Wps r`~~i`ofJ/:Yώ cGM]N2*< NK*x^ -vV ;fcv+ӄvW1NoBmDmr&;"!쭐sf)Q-ȳH]ŁVjU[&bhlU#-.)Z4#3A`dX86[UV(6ȳFQ .Z Cˬfw-H# i{݄:oJ rɲ+j8ȟ@!ЊB"EF6ivR˚ƪ|L0Q)E,[q< E/I>&V%3 :K>f)&Dz*P6sN8~JCJ-i4=[ #($_BɁPy72Uv}p@ *9R] +tA`,6>& Ώ?u;\**崟)D\= Xs);*01+,YhBZ۫/#feq~o>+uaP4儼8@[@JFm=2P1cY*4!X]XzV훀lW g}{$  gz"( Wdw[(,(ܺ0` loWh`\ fL6{ !LO'.z [{?;,Ҥ+^No竮 kvA^-gZnS Zhg8]#pTӞyPi+V3@}L-^_ШC!׸?=|Skg=WA=o,kw0 1Gqdm英Kk[a=yd=!#pNzaiQoʘoC".2qԦqJ.W\5;i'%T ԘMI1GnΑ!*n\FZޕClwa̡9't^=e϶4ef7]\/%ks/qDuOGgPr: 0ߐ[݀j&&>ӿa~sNWTrď'՜ԇV1 DmW£7b,2 ֟CIqj TTpx_V:@.N=*Iy(GY..:i(NLJZ6`heNWF,|T=́wwv7*٪ ஼i6\J^^̮b5g 1E~\7.|E4q!z l{,sn-tڵc}Ìo$ b%d\qКjӪC4&+DA sҍn]jL i8\qL4b8:Z}diXcS5{kz9=Hgw Rq{ b9:Z:$̲WX:xWVT!w*K 05T[7{-1`ƍ+ղ Z@1h Cr;/logSsݩ u{kFô\'7Ho:p!4춹t*eua*&~ K7*ȔS5ρ\|`ksFpѓ;ғ_$Fy TUԶln%w\VF;##=$^i*::*2,[EtTsU-\E ˁ_Oa_ endstream endobj 854 0 obj <> endobj 864 0 obj [851 0 R 852 0 R] endobj 851 0 obj <>>> endobj 852 0 obj <>>> endobj 856 0 obj <> endobj 117 0 obj <> endobj 857 0 obj <> endobj 858 0 obj <> endobj 859 0 obj <> endobj 860 0 obj <> endobj 861 0 obj <> endobj 862 0 obj <> endobj 863 0 obj <> endobj 121 0 obj <> endobj 853 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 869 0 obj <> stream xI#ޯ&\Քj`N6`_}sgLcN%}cH^y_?˧?() ] " W)I g| Wi/fhlF`&/+8)ɰA |/񹮨ǒΟVNZ xm)a7ˁIpuM\E95sU'7Gs;|ׁ9l-n&;kxo18?!dts+ (+G*KY `aZ*a$U-,YAb@BㆫѠΐ@"Y2<$a&iGUhRZxQ]e {&"Hk kڒ ȯ[~Wm7_YEoC l7xyP=)aq{P'K$pW2Nq㍰XidZ՞s!*$> @Ptl=B(Jw J;mp2 gp Պ Q*!?qsniM@z 28C%gcH|3j5P-0uG4H>sI:YUu3j95c0M3Fό,é4IQ7Jvi#8Td*-Ҕ-֝q\19ϤcΠ.D|2iR!#R̷2zvHuk̫pu'YF$0[#v##B=dro:.P!P`3n3ZFdJh!+ -tٞ=G6ФO \HlXS2*8&s|(sCj);^PW沛JHע;[EAlN![2G 3d tוiCQ2bTY,S16iE`tf(τ-)&Y:vJ :gjVd*k.=?_DfG+ TAΛfsLskxԾh.W3>c.]_PJhsL+T@G37K6 ;,\f*e*x}Pjxx=G^.ٲXYc/d-IR`<,0 jT½ q=_.ރY-Bo' ùz, #_R-"hu/^IgU4״n}{*G!g:҃\ # n|8|T[,F^wB~Ӝ#+TR#{aJgӎ9&`(鐡hajw&ϦZvUp >(]x9C[1R5evSP~0imj p[AL;ac]]H?wxFmK'ZV %˧ol?o)tP_/B:&/ӟOIxkɍC)RH9vpArAH#L^g̞Tz^Jf&v}u{W,yH i Sʐ*Z`Y#< NB5cf*> Ja2Ѻd#6tbIQ;DǛu4$~0;]vt؇pb#F].U& endstream endobj 868 0 obj <> endobj 873 0 obj [865 0 R 866 0 R 872 0 R] endobj 865 0 obj <>>> endobj 866 0 obj <> >> endobj 872 0 obj <> >> endobj 870 0 obj <> endobj 125 0 obj <> endobj 871 0 obj <> endobj 867 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 877 0 obj <> stream xZɎOhY,n@ ǠoAi.yCTEJ=mQ"YW /4htOt@PΥKA/_^5x/7y]|wܥ:ϯqA-]7ZHAE!!SLOk$]"W& t]mG Yi5Vxc!)__9m;*2W§kQOE_`2: Fo,FP`yj}3KY $)V&'kKWQ JiIy߻f~^%:ms 0i<36ZX{S;IQ1)3LDqjnCq"0sY 20a\?8(l(QY/{ySAtߴH8TSU sA4,7RqړʃGWE` 'E!{vNºFuj%i8:2+~ٜf"uGTa?jLs(^(<'c0BTKhlջmUGD|N=ыx٨i`_傂*\eҾ (IiS7mzYmD+F:ts{ҿi( }Q> 7q^g:{V߷6C.Q{5m4:n$q SEgƫ́!ҚثP'Wn7/ل3ffp_&(+:1 j\?vhn *L^o/%zd-$Bw},\ 6n9^؍I^Kh-+N|زQKFLjqrcžA˘v nSgqQ]!읺-;;2m"~k+(:Ӥ)Ҷlw+N[郍isq>L[ZM˽ )k5ʮGF]L>+|Gm'uYnNRV_K-o7! vrU2: 回$7f'=bNZ'4*n%$A>[p(MC~>U9Xan줜зßqa]{(ȗ7ѕo@]7f>:H Ќ"K7A>-u ŚSh(_kwwdDܰ,]Cԩ~Lu۾7rGv i'YqE~`59{,8"o@Lݒa+T8bpq8޿~E, endstream endobj 876 0 obj <> endobj 879 0 obj [874 0 R] endobj 874 0 obj <> >> endobj 878 0 obj <> endobj 129 0 obj <> endobj 133 0 obj <> endobj 875 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 885 0 obj <> stream xڭ[͎# SF+OFiw%bO$!RT*= v$")#%?./z/h.ƨ9.~1Ns%@PoW j?[iZ-h-gpoKc-T1)Nn0OW!}{I,4aZ;lo:nqnS\^m/Mg^P L&B|2 /6\VN7^EmGct:;qr4QiY+N+HrwH+ΫDnG*iFrwey=} = n7uZ1OV dzzߘ0V&4=,Zl1w6Ǫ)h `uP K22ǎE#-,IފO,.7H-vPܿJvVySjR\7rF \Ѥ-FnhN޾ db6D }N:>7kg {Ej~3Y 4! /7V. Awڼ4-·ʲۑaPZYZG(@6`LduQcnO /8|5CN 5$^c`3Vʼnb:q ؂]NleTEkN9$N(:ҩ8nU w[0u)%p-!f%hJKh!Is_?e279+)alڎ!A+r=Z*dFMbX^^H/7WG߾L!\DI NX!ju-+x/2Ic, lja[4gNA&KL 2.*H'In Ѩ$R*Ӓc#fS 4V+\ͥiaOU;!(yS;C[O]Gw6%q9zkJn0:g$̝ܐ 0, jڽ  pZ!qӀikO]E%;9$=Q^<);Tm41%%/e X[o. z)C\(j!Ҿeq̉}a%jKpjkS|A8{Ia'HX[`I;b`~YRFnOمED3O67s3[? N)xഡǕqJQZ>\պԆf\Hx^vIQ/SdlVUUQӴ[br#@Q 'puQ9eDԍ7!x ƥpv&7\(cpf[ȚZdM{[dNY^jUM9: {"nSa8j;%-:dR)֙-;A5MFS/k"WT`̳rduN}T_ND~ ѓ qHc:02k A5yB+ utMeUH&Wso:0 l财Ƒr`wS @zD5"bRDXϣNj=d %z7^*7_ki2{ HG5.0tĩ.@޲=KK0[cQtC-( f)\qyKC!MS]lE0<~A52RVh~E%zIY@,3"^j;MhJ):N5зaQW) W7 8'h!?IWڀ+#B 1CIY@0Zݳ7\M5߈K@ybP ^M#^T&h1xV-LZʢ?Y[*яbֲύvvAVB۟{^Ӄ[8>XT0s&J"hP}0l~f QV{]l39wCIUWxP8P[?i.lmeBt[]%S w;IkjB'F m'/Ș![M@(4Ldgl]Z@}spgV)E [nȶ8[LV6}YRfP[,|ZR.<]y7{Z *ٰ_6C6Q{r}qIü/)[*ޢo^N[7ׂ9nz0'`?`&>4X1sAA"R~o7b-v['=qqQTFE]|NC?!!IO{-AB9msRR[0b}g2ց [Obϸ˹\ PEs&=4#32@e-i Zk܎skK=`r )Xb(U59GqW~ԷH/ױ|3 mq7~'?"?gsғ%2 cOl2^ո붻mHMzX.d:LE(s6.d,SXL_1to[=X@1\\e0캇Ӂo#v3:b|BstAP%b/0?CNRXmuIV:mP8A߿k3 G` y?ʅ1}_\Vˇҩנve{wڼWfɸBfEF>~ƥ< k>dBSŖP‡r+nJO1}MJ8rY$αQ30%dh endstream endobj 884 0 obj <> endobj 889 0 obj [880 0 R 882 0 R 881 0 R] endobj 880 0 obj <>>> endobj 882 0 obj <>>> endobj 881 0 obj <> >> endobj 886 0 obj <> endobj 137 0 obj <> endobj 141 0 obj <> endobj 145 0 obj <> endobj 887 0 obj <> endobj 888 0 obj <> endobj 883 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 893 0 obj <> stream xڭZIc7ׯx`rL݂d.Ӈ2$ɏ,,rE|\ԢUZ% Zr3e"g:ח/$.-DT[2`6-_ޤ4VJ祴FJyS?lWu]^fRK~%4.2u4ʅUy,Ƽ Wm*.:g/ƘSp h|6p~Jz{dT*mH3_j~URool-~AA7kPE= ֓@vkcvogjЙp[ǶQ/Use̚@:|'sX# ))Tr–2BZ8j$"PY ^y=}˞5 q;Y2DW<ƥR3odR8h\ЃE# L~'P?IA:KN(9 v L3݀:&nE*ǝ@ym#TW%߆]j J!mb@OwǒY&/5tK4e \e^m@GP%JM~ep-k`ޘQ:ft3X{$d 05O+']!m˒[{rŇVCcQ7HIHQԷG|-CI졮gOGF>V.+j :9swvWo ~jKE}[#p2@zÝ oSBS"{;ü Qq]W w]+ʐ>v(8KN brRݑsj:QZM*1#k flpphV&TnrPg\=nWԴ g=dMT59UNgs8X40 4ʟ0LS /|Ň o:,r)QV DFk3q)0.'~Mc5FVQ3E=z,CS\[CrȊZu xʦjn+"O@lu4_ V3$YajV‹c,-DHooA!oug}*8+޸_O*a %26 , $ej/)wHQ/sI:bb{Kc19X&0S_Gz>BT}硅/~w Pl,9Q~@ܩQ;FũRfN -ӡe6by4o'ۊ8A<#?V3ZiцTSvk$FF,79x?y,0ؾ,~3xIcF: g綩cmdT{{V2ۿ$ŧrz]˽NrDX˦KrR{4QD=M݈M]X)Լ0ŸBo6 W YĶDn50:Ό7I賌Ί| 5G.ñdZNҰľ2&G:&QN@^}'ezղ "{璭4;Ty oorgܭY{ԋK .ӊ_(7MǐYC+& èZ&*5٣> endobj 896 0 obj [890 0 R] endobj 890 0 obj <>>> endobj 894 0 obj <> endobj 895 0 obj <> endobj 149 0 obj <> endobj 891 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 899 0 obj <> stream xZێ6}WĐ (\6@޶ٷO6@H_=HJ+@vpд_O{F;I gtlwG'" xvBɠ0׽i9#"B++U$ccCQ亖R^o|Z ^ Nk}ۧӛExSTxA;2'/(+LgvJ{= D WaDYHkXɌ~w=}QK l~_~hOkq2jGcb-x.}OO6"c8tPl,xid+"A %pI5eQW@/EQJ-O(}MI*%k^~ѨgOh*ze"wv!\k;GqX +ECۧj)kK]ZjӮӵo`S*zS6~+]-AY߫,K']WC(HeQ`4eXQ[+fzG*m¸0u+mK2VJmCWնֶ셶5@gmFYgf}Y۴76iv&QݖmAsbѯDR4/JD1 m}FpTL YkZdh#g e7S4z݂vԳ襜^B`-hr[Њޔ좜;/˙DqEI_&jxiUM)1b6 :Čӡb#MKHg܄xEωZ#\x67~=}'稤ޟ$lj.Cw UCխD+µ"߫b-c k%kr&YrVftv:M'] s#q3uHC) M棇Q:$@FaŞmI)ϭevG 핵_ (C{JF #䥃ӗ#a<%~:0maKl*.콫0o l̓[v 1SkΏP<3ou ]?֪C-jgzoni3OLV͢A endstream endobj 898 0 obj <> endobj 900 0 obj <> endobj 901 0 obj <> endobj 897 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 905 0 obj <> stream xZˮ )Qu.' t}vE■.$Ei4vgf4#E}E_M緿=m..F _ʥtZ;i ݙTF!]mW]~[r魷.;s RI >^"p l؅m"Y<с3sJ$lYK/y-cPuq*|y%Owac8huSGy̱87NpwC1 N&-9fjk6eD@ʾk9 Rh |8‰͞s;aP8W87fRZ}':"(aJeU{;(fׁJ鰲+aL? rPѳ]\'+J5,="00 wBA|m;-6Փ%;k#8ГVtC DH^=DSXO#'%n,As5S&A$W}DJ Wd4W_<6aqIb;1 uxvn;tz~k>k~z߃CsνI*x!m=Kٙ鹽7]?x_売1^ fU~,UZ,\:jP77QM y(ot/UIЫ;FEmbٛ-:i6AY9;wh{G ĸj{W6*f8^o X!f7=s[Aϗk ;C|rb1rX:ڝjQzd,=EgD%(6SŲ0<>C68zrm۴&QXK *Mgi'\hYWeJ!sYͼQ!E;ĩ3qT7sgbFs@i-ΈLA4:z/IsKx"x]C5hoTbI q>!aN=-eaya] aԎ*p rX$pHߤ/WxytWC4&H޵OۼEKd+}"\WuM:/n{#_Ewt:IMvqx4#%~I~rU|86#VKGWR &AϞh|7Y9UYe"n/)~-)A5IcS1z`mI7, $qԻV=DB a!t%9HJY6(aM(-δ:{/puXIt4Lתfe39MØ#,[+N-tB+]vX Y\qm%G jE!> endobj 906 0 obj <> endobj 907 0 obj <> endobj 908 0 obj <> endobj 909 0 obj <> endobj 910 0 obj <> endobj 911 0 obj <> endobj 912 0 obj <> endobj 913 0 obj <> endobj 914 0 obj <> endobj 915 0 obj <> endobj 916 0 obj <> endobj 917 0 obj <> endobj 903 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 920 0 obj <> stream xXn6+%3|ؾ@EvE3␢^CI$gG߃~X/n!;bƧ43ZO'|,W"]\.Eހ =(mh ą~=y+rE?C&VOnݡtO*P}j~xY0v.fb*O~N>re.VrwN[ vwIҼ2(~y"C;XWuQZJro!#mg0}mpKJ:nfcGWx_+&Aؤh)K:eCWĔI-h 05If=+ځenbb`;ֽEf-e}eu߁M3g՗رBƠϽ^Ahղ);T&to* .6~+K&}aB3)2q4sbum>9okkȳ;`6|%ݍp endstream endobj 919 0 obj <> endobj 921 0 obj <> endobj 922 0 obj <> endobj 923 0 obj <> endobj 924 0 obj <> endobj 925 0 obj <> endobj 926 0 obj <> endobj 927 0 obj <> endobj 928 0 obj <> endobj 929 0 obj <> endobj 930 0 obj <> endobj 931 0 obj <> endobj 932 0 obj <> endobj 933 0 obj <> endobj 934 0 obj <> endobj 935 0 obj <> endobj 936 0 obj <> endobj 937 0 obj <> endobj 938 0 obj <> endobj 939 0 obj <> endobj 940 0 obj <> endobj 941 0 obj <> endobj 942 0 obj <> endobj 943 0 obj <> endobj 944 0 obj <> endobj 945 0 obj <> endobj 946 0 obj <> endobj 947 0 obj <> endobj 948 0 obj <> endobj 949 0 obj <> endobj 950 0 obj <> endobj 951 0 obj <> endobj 952 0 obj <> endobj 953 0 obj <> endobj 954 0 obj <> endobj 955 0 obj <> endobj 918 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 959 0 obj <> stream xZˎ W# hP=U ˠwAnH"%Q]}3`qٖ()ssrkdǿ.61 as.] c|qǛ1Ӂ_̃/eH<VTL>:Z!\U:w٩^ |[B2ןlE<\`6/&S=čЭݸ#{՚o*_͖µMNs/.%$|6ю6@Fk9Ulco [<>RFUs`Yp2֜TЮVYDZRap$9#9Gq9"6x2I]<+QypfZ:S\%UF @u/R$de\H-j=ET؝M(+)y)iT_iKir}hv2xcSRʕЃH6Y,?AEJe"u;m82GҶp*(/FD#3|mondMbw1U|Pr[Lοq·^,odX]\EKʦfC/H1WvȔ/$#u&Slߏ q"CesQKcPݨuBrEg!9No j#w#JXP!~OmJW$}̰x}pG~wxN.* Tw.l:-DkX7(;хMFӻ nDӓ|}-o#铀k]}ȍb0Y[-6c'zSb =n.~ś$]%2弎P[(-HcZme,sݤ(};Cy.q!Pi=u뽤:7ia +]/Kenѹs#7JFi@Ϻa$9$'O}nܾF[̏.ڋBҋ:]FmE~+"}Y'gE֩/ b(12eB/¡kٲD\\wsHcd< hdH]'/`"tgcTHUR%HR&ߤ׎;:wqF(\? d endstream endobj 958 0 obj <> endobj 984 0 obj [956 0 R] endobj 956 0 obj <>>> endobj 960 0 obj <> endobj 961 0 obj <> endobj 962 0 obj <> endobj 963 0 obj <> endobj 964 0 obj <> endobj 965 0 obj <> endobj 966 0 obj <> endobj 967 0 obj <> endobj 968 0 obj <> endobj 969 0 obj <> endobj 970 0 obj <> endobj 971 0 obj <> endobj 972 0 obj <> endobj 973 0 obj <> endobj 974 0 obj <> endobj 975 0 obj <> endobj 976 0 obj <> endobj 977 0 obj <> endobj 978 0 obj <> endobj 979 0 obj <> endobj 980 0 obj <> endobj 981 0 obj <> endobj 982 0 obj <> endobj 983 0 obj <> endobj 957 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 987 0 obj <> stream xXKo#7 WVKPpb{s+zmORG#kv@p#)~7"q. -o-A,UTbnP$XFRɯdtnHGk}_>fߤGe?|[Q_"#nt0^p]$Ūp֧foc!=INenEh=K$R:4ڌΨroh+|%tcvGӬ]m3PslBДRBcؙ $vU50 hZpC(aoha'``@.)[@\S:*ׁIU&~ 㐨Q_C{ .1r %M\6 pMj٥zlG[MGEQJ^ CQj\rFA>$.6@\h ?ܶSO=LULLC%ӥ!vGbǚXkojjlف6'SzI6]̚A7Y3D~eH,G@r2*$ݲ՗CxJv`/d-ΧHIOڨeby{琅wYDL4j㊙OI~tlcKiVRءyܫqc!4B?!?0*JbGKAuq]Γ&MN &g(1ϖEyZo̯w?dwɏ-ɕfӭ<+w/ .ϔ.\ ] {WK틃]o>U1i?@Dy=#˥^ __/c8_0C'> o^SIkbdwӿ" endstream endobj 986 0 obj <> endobj 988 0 obj <> endobj 989 0 obj <> endobj 990 0 obj <> endobj 991 0 obj <> endobj 992 0 obj <> endobj 993 0 obj <> endobj 994 0 obj <> endobj 995 0 obj <> endobj 996 0 obj <> endobj 997 0 obj <> endobj 998 0 obj <> endobj 999 0 obj <> endobj 1000 0 obj <> endobj 1001 0 obj <> endobj 1002 0 obj <> endobj 1003 0 obj <> endobj 1004 0 obj <> endobj 1005 0 obj <> endobj 1006 0 obj <> endobj 1007 0 obj <> endobj 1008 0 obj <> endobj 1009 0 obj <> endobj 1010 0 obj <> endobj 1011 0 obj <> endobj 1012 0 obj <> endobj 1013 0 obj <> endobj 1014 0 obj <> endobj 1015 0 obj <> endobj 1016 0 obj <> endobj 1017 0 obj <> endobj 1018 0 obj <> endobj 1019 0 obj <> endobj 1020 0 obj <> endobj 1021 0 obj <> endobj 1022 0 obj <> endobj 1023 0 obj <> endobj 1024 0 obj <> endobj 1025 0 obj <> endobj 1026 0 obj <> endobj 1027 0 obj <> endobj 1028 0 obj <> endobj 1029 0 obj <> endobj 985 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1036 0 obj <> stream xڽY9,WthK*byog (HVoEv=#bm6n/F4ѫh^}h]~/+-N.~˗ϗ>\X.]ڡA9oooZ[53˫ޢOOyEZ!t\Sk=?>RIqIh y,e $ZHl˘q>0AY B>]f)GqJXI|a/,ƻWG@ q&L..Idg|T2^)jH1Êfs3/zg3$MD>s5 'W?HsR)+U/K̑zMqSב-Q-<GbTiF(@'{ Ko)G`l5IKsV$<:H'v_lQCGp} j]ÏB.z pǏ:Zgw]{Yz$.EK/%Rq}Kh|~, ,2J$" ~NςUYUa%X,3 ]TqbIW׷eZ 8q.w~ZDz^wy5$)+<hg0 *F60LHR3`KZZ(TmVXfuY`ųG`o5.hp օQ l7yǂ`u/lG:7"8 LzS-"I2j,D d(KIr % tAGD&Уy-yD}VEK2dE6b.Ӕu۵Ś251+阖}含)l \hMZ[N2n[tVDjRiW3Cŕes bBrlb; LHQi@u鵵b6vC:*E^.KA7M9]˫#U_$A`gފ|67Q{&J w:E|T5l)=l`7FdS C{mJgkKc3@@pD (׵soFÿּ^3*p >L#xZD3:)Yx[} 3޺ٰ ; WΔl.F çԎHu^El2Ymؖb{rRz޽r2hhwɵݤ=Je|kPd!6U#6>]n1:r:䐷R-ork$iAz蚏P2%̏3$& BPR-!ntm_fدMo6_m%3 k'3"BfOV4l+ ";MRnsmboE&4:={k,oNDP̙JpE7yEV+keۥBLC22!g=岃kC"7n76]X-)G=CF[Ѐ.Ã/P}j({"p[lg[T|G1oQ)5S<VHHƠsvژ5#4*c\pM7׮Z9`O#al:r:ۄ=1>s endstream endobj 1035 0 obj <> endobj 1051 0 obj [1030 0 R 1031 0 R] endobj 1030 0 obj <>>> endobj 1031 0 obj <>>> endobj 1037 0 obj <> endobj 1038 0 obj <> endobj 1039 0 obj <> endobj 1040 0 obj <> endobj 1041 0 obj <> endobj 1042 0 obj <> endobj 1043 0 obj <> endobj 1044 0 obj <> endobj 1045 0 obj <> endobj 1046 0 obj <> endobj 1047 0 obj <> endobj 1048 0 obj <> endobj 1049 0 obj <> endobj 1050 0 obj <> endobj 1034 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1056 0 obj <> stream x[ˎc WZ- (jd.6Y&^(]]3DCR/˟_h.F?Fs (?޴6~o?0_?޿8G8?;?jϵ=+ߘga|>ޓ}+#֧赽WߡWV*O0t(ߡG"u}fyx1>lx"UԖX6țΟжUV®'bT+Dm:og*;@x4JO~'s*idt2ZL#Rɷ[gB$k : e/*U$?K6!9uIUul&;z2xSU>3$;>â먶"y.~Ztwg":a} _EcRA#w/P]t_[;JK3&P kndpa#ֶ=mUeru: oJ4}Wyz׵jy[Z55[8[e[0 ԃv (ѽM! gb̠+#|S[aSY7͇h`O@s^yt%\l2{6Uq:~{izT w6hi;%zUmK'<4_ZXqRybn8-s('5PO V6?{ӏ;ÎdZRaó{ PA(p͘?)A~0~Vc*a|jܲY G'Y%~kA?F!'#ˈ3 L7+љ}Z L0c7DNqr߹l4Q&K>:c[9 ht;[ȔC *Ene+Șc'sh}['$c]D{n]bv h}VanQQyD]ܭ/R߮.nhͥJs1QGQ@+%8M;)1{ϝͽI9`h5;[YMœgu}^F}3^ 5Geٙك)m @v-|=1[G<*GV7UcyVR4}\m xx}5S"5u4AByi3 %f(XeyRuxݚs΢K‘j-!0+Cl5:WL:M(x,zWsI(nӑiG,5GQz/24ѠYW ҷ[-l- zQa'Ry}m;y?gnsdL ŧ,I\y]CD V†*s`JB}7Rwuflz9BΡəEuZ]nq1($SAg~1^\B3)gP>icFњ`O/^GV0Ϊ=Nl`+.TQPO뻞O0r3/wK+Qar#q'ڤ/BA*A􇐒=wrMݬK0MDΉX:]|)h6?~2װM x> tҭdJ0 `W~L:s_ʕm@7fmIdҡuR=.i_n.HO`pUekFJvtKuQ[tqfaRISM#=Yv~ޱVpwu{_Q0>l!eǀ;^Ooc،H|rSwԛvd^EtKsɠyJڕ'&ۥ)%8ggh+c lCq ?-!I.MJs(!Ktʠ_K,q/LNC\\T "CZre]kn*A\2(3f1U٬ [˵ؾ+9Q&\"Mj K-PVQ3mm{S0NJɆ1x/ܢ0}e?Msy m]T6]5] i|ݒڶ7ڌ!e\_ԶlΛy=FrK S$O좲(>XAړ^tW3ho="~~¤ 4c@gmuO T QTrK:՟Lw*o! 1vd }܉"qq{?lUK'a4$^Ht:-6O@Xm9ǶgTp)Da]+ϣn[P]4Ua"(WK+0}%>)n",x X+tY3*sq](C"K(M2*&?5 qmT 5[.9l]Y)U嵑x, %G^>\h9v͵r#]v886;}߿_kFD endstream endobj 1055 0 obj <> endobj 1058 0 obj [1032 0 R 1033 0 R 1052 0 R] endobj 1032 0 obj <>>> endobj 1033 0 obj <>>> endobj 1052 0 obj <>>> endobj 1057 0 obj <> endobj 153 0 obj <> endobj 157 0 obj <> endobj 161 0 obj <> endobj 1054 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1061 0 obj <> stream xڽKo$b4-YOE&\AA3i嵛ޏ]/?׏w]5-.yq-fp`3׿/)@1 ~mZcyOjC}+JNV8?/+>ooJÕ 4x-x-g쭮TH1jD.TWF2}HZ}RoSvUA + ,80//zӉhynj 3ʡ]rx`ą3x ?P]Lq;w4xNBYYBkZŠ| b'\8MHfUH+,$[ݶGkiUR|~x |WnN)7@' XdoJClS!2yc`MYc*+k&DoՁCfwXdBTMFW+W5.R ۝/jҞ:0ǫbI."9ԕ[p-B/9P[NhacNId=zUWJt*ZLM ^ N8ƌ}p"ʍKH7(E4}F^GDpz& S@g?bMpC:"o~YYZ# r3{7'PÔjˏ_Y @9az']SC~[aon憫@ /sKń⁅ZvK ?sM Zk 8W71XwiI, Lj-o6NxeLaJjS63Q^gxwHZ[h$C+rn?u` 5mhCOej!>N8ÃWfdwaSm`bKBK}3V_iY^!ie΋lX nIR2zMZẛzmU<%*ci-0ke:cqSGNS&ʆDW$_H2Ц,/rd81?p?qqN"dm.iڐ5[4U'M+Ԟ/ys#Ju<1 Ё룁bcĽA78 mzһ2vs .+@ϵn6xjdvw8yɏR7)C0W00g+KRr3M!;~2>g͋ĭ߳9mːecTg\ Wfu<@}šS&lX^" ,Z77mKY /[|Bc3\էE7㬛< .2m=3T.J3bK!55pBoƂYpjN [`LJ[cJ@黅~-GPcF F]oz8>x~rЇ`` 3!%*S'v8]+r,_BC/|tlE-g?z3*) hO&4_IX&8v᝭en?w:NyuKwrHS>L}Ѧgi- f,QB>? :JskRZt6 &ןc-hO-pR|KNopcQ:K}[;l&?RfYw950z&IIN牲\=$$g}(L+@H ƗeFڰ2B6O\|œWPC0JNoʩiMn5qR?]%Ԁ .޹?}(I;R)ULeoM40ۗ~/\`W endstream endobj 1060 0 obj <> endobj 1063 0 obj [1053 0 R] endobj 1053 0 obj <>>> endobj 1062 0 obj <> endobj 165 0 obj <> endobj 169 0 obj <> endobj 1059 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1073 0 obj <> stream xڽZKo$5WXc/)4 qrC@papSvdj՛.U9IڝAҿ'E_$DprxzrYZc^~}Rjw\GKiO#=H{q=!n7eA0roSc3KFn1NmQFXBua)XIaQjXꈬ2jX.82? /Wz韸Gyyu"8T@s'ohXn?~h >\A-?1`  @9ޗP>&hLjI4G瘊BK{(vܭ0,k~o4[9>݋jlв,k i8絽Ǚq)B,fبŢ@COp2X %dZYe h6nW ,VO>sO7g:3HfQ`aDSYYU޾k*Ah ޚxK&|<|1UuiDsF%ۓHoꝳzhă d}6u!e1 W`LL4"2QܝApt2>@mnk_ (ơrͫ 3C&)ϴ4Y_yfRyc@ZIP۳@IӅμ:u<-o:XIx6ٓ.VB{C)/0 :2ؔ.6Fݩ7T\Wvno'tNؤY~Wqb{&L f#-Vդ*'cũWr-YpF8I%-{jxd=t,f__qr*=J ;Hx$}bܒ/s8ފ}.۳$mCw՗įx{Y~n?/QiGE}j\YylyNOߌRWUަ8TI$U%^'Cݢ 5. AK*Z!:׌t%T7U9,!H95_HuZ_J(ΛΚ>XbX&O ZڛunȰ@v"PȭyX+n2U+ QTEM|ƝsF6>禇 \QNY`,hn7uɊE p 8`Csђ <9;7Lc+*|gDL#d,+,[*.H) ]錤P#%QFmhS2+oq4)()B-SetZ69agn8`ŻRo>pu\P^P-9mVAohإ0<)؊ʾk*5_?,PXmLhA6&I慪 Dj X)n#]pSv*-h!t߾<̆RySMTA ]NGC0LkjԺcA noٛGy%œJ6ÏRLS>0sr(ԇ:y..|SbyMr/5H@A8Ke2*H endstream endobj 1072 0 obj <> endobj 1077 0 obj [1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R] endobj 1064 0 obj <>>> endobj 1065 0 obj <>>> endobj 1066 0 obj <>>> endobj 1067 0 obj <>>> endobj 1068 0 obj <>>> endobj 1069 0 obj <>>> endobj 1070 0 obj <> >> endobj 1074 0 obj <> endobj 173 0 obj <> endobj 177 0 obj <> endobj 1075 0 obj <> endobj 1076 0 obj <> endobj 1071 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1086 0 obj <> stream xڵZK#7$R/рm/&} rJv/WJTA0U$ϏTӿN9}|:))NT0&8ޟ>~}R)-~#}C~_QR9~WFM|oϟooR׍!.!~7ҢhGiS[~(tMDߴO4MJWX'|OZykW뼘%w&H+1FR*4Zq 孤5 ͮEz,x04hhW3h@i,O`Bz> 1?mѼ luՇ4X4\$x]4g!Y3VvNuOXhM^_Mm]nO-WŊgUβj.A?D$pʹDe~"IR! nyЙO )o,Zȑٚg 1I½ys}Fug;ΜEG:cx(ocX7~OQðD0ù=֢P!,㑢@!cfażM,|9ECY%7sFR)&A$\Lu'EZqQCs<]Kb!2!܂-YV;mweJhwXH3:"?d>vBp66Nwh _(ϝaj;FI.T 1俚)Q yE* k9:$-EK ;i4g˄JQu+C5VG X=}Tr55O;RM4:J9(2_ΩN\- Ғ^*_aG5`aFdE ?1Rϲ b^Z腵-dl;x>yӹcG- AwY@Tf0fdetT>#;:e4%1- n2L&kyk/|2@J+۸z~SbO= ʋ_ɑȖ9GX/L]su (/1|FtK?34ڭta.VxOk򻌦ӈd\3/ uMVUx.M2@oj(a넟Dk ' "{y #L/ɭ7"znDX['ЃZ;yNvfk $;܃t *'~nm%79dP+rm?.fiP\<4|of saBa,MkU<xĩʜǬgHgH#n&:5w%:Ivc]gmi-@?azz V޾hk nkӗ9CjǪ$ gU_%ṛ ;WBw,kgA m T!Nx7y#_&y?˟7EM.u3@|Lty^~4/e\/ݼ#0(@/c6^8< =@Y%Q4Lzq떽P BȗJ;w;Z P ?K7Vjb>  endstream endobj 1085 0 obj <> endobj 1090 0 obj [1082 0 R 1088 0 R 1083 0 R] endobj 1082 0 obj <> >> endobj 1088 0 obj <> >> endobj 1083 0 obj <>>> endobj 1087 0 obj <> endobj 181 0 obj <> endobj 185 0 obj <> endobj 189 0 obj <> endobj 1089 0 obj <> endobj 1084 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1099 0 obj <> stream xڽ[K# ϯEGF{KҷŞ$!GRTw ~\~jmָMkOS+Ox]xxmV [Sn-B);z_~8xTx[[im^; e8NS썵V`)< WQweۊաvAWiUyb=BTh1L諔* :? O6vNhP\ٛ+yg,& gR;V&XxՙSҝw+o#q;ޮQs:u^h6?}m;h| R2wD *iQuvrsOc$E5@=ns[~ot~]담 ڧ#y|Wþ4 [H~U4(2$Om8z UDP6mun]YVX|4_=d`Yw1,7pʁغ~ ۦœ8bܵq6u\g\$ZH34yK[ Z &YX-|6\M*^qL@QX<֭ N9e{DŽ[B>>qo$_C W!G7;Qxb?Z U U#jC߭ii]f_NK^x( ?KajCs*Ӭ F8Ծ [ލqptpSքv#0(G`u#PE43;*XS"cwhv8$>}*zޙ怈`DQEչVؖZO06uIK^:'س#`Q3:Νʱ)QG(-0uIhfD>3/CդAgp;pN1ddŮ[a3QqV4 TZֶ41 k䬋}m~bV /'`W7~|HJ& 0e,{ G,q< +N|Pqhd=q%^H8K5 -l Q zk0!Gap(sQ9թ[Εu眠} 5>Ko"vـF!sSBw;VwyS1.em%/Җt2j sp hp*H C~ouGP=E!gJ<^=Dڊy9Ni,,&@&i@V ->$&ۜSښzMTR0Xeo5^t/|<5~unS£Z7.Z&¡dgqO\–^pkf&UOlcȾ5^`F|3lބIqdi+`9E PM:T[G>NfAr%j U+Oֆq&ΪՖ/q'ۜ(5L[%cŒE.69=wxx@c4Qmao,)|KFS?25bSFݕ^2J<+lZYfRg }h+3j׫Gٍ*@qBmߺJgB nղ7fG)W[HOw FuӁI~ջu6#i K_R-,at]`hv>7p1% Dyބ(䔂Ex缸DY Nb8Α)M ]TZw'b\TѯA4>*l?. uDPGTu"zj(? nϭty%SbƄu xAx,mW1+Jt!J l^-`ݩB.]ۺrb4nN.ԔVs'3Rv6qh7n+`~Z!H2U3.$[T^V η穙t'jcy225rK2-hcLߩRЌ`L0 ] km={!0l[;߻U翼H7cz9|Hl-N|9b\/XFp fvkllgr,3+5e f]U0 =#kk+I4+z["93pH,Ƿ`.寉cK 6u?#%׉UOxw҉9lE_QiQڿ|pY9T~dfkJN1 .}8n ْu~)ޯn onJ K/8f4PE9}niXV~WV j"C򟵟 Fl3P"B}X68s5eQ:tƮs<)2&=B4&, endstream endobj 1098 0 obj <> endobj 1106 0 obj [1091 0 R 1093 0 R 1092 0 R 1094 0 R] endobj 1091 0 obj <>>> endobj 1093 0 obj <>>> endobj 1092 0 obj <> >> endobj 1094 0 obj <> >> endobj 1100 0 obj <> endobj 1101 0 obj <> endobj 1102 0 obj <> endobj 1103 0 obj <> endobj 1104 0 obj <> endobj 1097 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1109 0 obj <> stream xZɎ7W&Y\H [>9H.!å,L R^G.-rIN/oO/F-J(ӿEW k ay|~RY)}},C8)I4lVpY~Pi̦1{+U/o/_g_9&x!b )7!hDqxg8vygu0e#gvRߝ'@G.M9C!h|xyO;nNu_7CL7m7 mΤtn[;lF [?ySIJ8'ȞBa-,7sm0c%8J:jV0JLoe4GU\ y9(I~k6X?s1*yTg@DD H+B.50:VZ. "憐8-G0֠R/aCecؖhDSС+ ke |2X[].$%Ua fu_y}fP)/2=ԆZr)&R02%,[QGvN>odP}g<kF[6"VN &Ұ 뒜bN6赢k PN^2%2*:\Q:6w pj&SG q2X=QHN D8YG)O':3#m:m`\-:X *RLy jVM1e֞z$ϵʌ!*L9=u+~1 zSV9OQ8|Ne MVbI1xonO "Ʊ3쨳fؼlIɕz+6#8{*ޭ:Q*GHa»Rj" W6bRKmQ[uیӀsúa5Y`QRDٳ3R}&X3 +h:tp`HKn׌vwa`F"m-TGEQ[|ɰx*Ec1 hl O*b$A{BDrz[+P FŴzp1Yd-ɶɋ3By~}ڕ'Wo^̐8>0# OT|pn 4h=L r f 6y@i#$p~mix πbS.FsoIc^1mQf7 L;Fp_zt@tȻenՐ*G?P!5y꘡6OIW7mv:4,nѸUjysM 3}QGjdO^[vףú†.:\~7[+u[~[;F -ƿq,w(9L3f>Iu/}.} _{[&"\i\-mWOig o<^IJo^AߞXQSQT-_=}"_E a,(~chVDm42E4yL":I'R$*Kbgft%YN^N0D<`9|*8M}q8o$^bڌu!ӻ|岭7)'9J endstream endobj 1108 0 obj <> endobj 1112 0 obj [1095 0 R 1096 0 R] endobj 1095 0 obj <>>> endobj 1096 0 obj <> >> endobj 1110 0 obj <> endobj 193 0 obj <> endobj 1111 0 obj <> endobj 1107 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1115 0 obj <> stream xڭn~ h; .wYe2,M^?ԅ%VIrU]ȏ")ݿm ?~~Z)uW C_;`Bob~t2 Z| ȩ'gʯ[~!sU}rNOUNO?XS=-˨9q9?5FiuI9˹Q<]~^}j#v/Oz4>^k ݟߺt%oI؇Ghu\>?F>yo"* GNr9b#^ae ɶC2dG}x޴ 4q|C|U9Cey7\SJ6^OsF-K66vl~bRIXS sa5s-t l"btt?pu&dh8FK220sk#5jq2$e5rƲ$NtO.&D`0sl2C1$ 5V ڟ;4K18$ M'i\il6~26CMT_TCV|R>wCFGy-DQWnr5?0$|JXulVc1uTS~ŰTͪNu2VU U0IhWjG`8J*m*s_5Rϥϙ;l[KA )0#tMm&JϏ5~n1VQy.0+UkՇFmkn89kgz( pRz149wK9XN,rfYV춾+T'ϥ{s1lVXͿLl2-`ĥSW*-ˡJkR)v*XZgx G3 >K18C>˔WFo\F]څu);4ŅE&>FQR(-+z,.TJ.ĝKףXLR[SI,q(eɶi 6+k@hv Ŵr'q*?ٜvKut8e bbFI\#Rq~oYnk1899gj IbrȲ9 s*NC4qՋ8 +ĭU[sLRez =P\mWS1$|[5p(v)f5ճ*fsC՟z6~7_E}ŜFJ[XYaHO)$B<`BZ;G1$\NzPydڣKrJ_9)|y׻i^dJ@\r@ q(eu Wv[1$G~*,7DصO4(MIIX<ģRVV|V?oK|ġ=E6}JUL% ˹uTj̉߫42(LvLRJ&+VysO26S1$2+R49ex-X@(v,& y0:WvM5'~bS^9M,; $JZkR.I\oh(kً@y$q=O.AR 3Gj<s*sQi]a6ն8(XVx`RjRb:LbU &k PxPT (|$ rg"JL % ̕mu-;8SZQMsJ*2kcFʑmI|5H:IjsJ;1$[o}q;fH܉AquՐ5}9{um(#V0H#n$ Ri!Ȭ,H͈̓C)4vɍb5ic;2IeİQ s*&C 3ټNIT|R>T±w3u&v'f\utC[[Wڶ-@$^HʽQ{Q_qy.NbIš krn(KUlϰ7abJqXS|;.GsֲZ͋%ձWIIsWABoRڠuk:6t:J\JI%qԝ @VUVR q+Fǵj?S{Fy؝E}>|Jk.iU|Z[%HN5s7XF6īRV5eʭHB-0DazD:8l@ 8gNgf^EqRru/PDJY%qm`{n6:s[N7es|9Ĝ(Us"**K=jxԩjmg>g;$Ogvbq\r뾸]LeׄQ7Lg]1$./Ize5gXP!xoڷQRxI\cT%m ĝP׷:ߞ{AŶŠ%,)CKB*ϚU:akʝAk¡PL (F}Gj{K18.Wv> endobj 1116 0 obj <> endobj 197 0 obj <> endobj 201 0 obj <> endobj 1113 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font<>/ProcSet[/PDF/Text]>> endobj 1 0 obj <<>> endobj 2 0 obj <<>> endobj 3 0 obj << /pgfprgb [/Pattern /DeviceRGB] >> endobj 1081 0 obj [1114 0 R/Fit] endobj 1080 0 obj [1114 0 R/Fit] endobj 1079 0 obj [1114 0 R/Fit] endobj 1078 0 obj [1114 0 R/Fit] endobj 1118 0 obj [644.7] endobj 1120 0 obj [531.3] endobj 1121 0 obj [706.2] endobj 1122 0 obj [569.4] endobj 1123 0 obj [14[525]41[525]46[525 525 525]53[525]66[525 525 525 525 525 525 525 525 525]77[525 525 525 525 525]83[525 525 525 525]88[525]] endobj 1124 0 obj <> stream xc`b``pna~ N endstream endobj 1125 0 obj <> stream xuW tSU~iJ+}>Ʃ^qDAPteQQp ԁjmJ4iiuI6]&iI̓R"PqU406AOG38sf^pYNr}OD̚EDyƝ߲=Q'-R G)r$kH&AV . 5 f|kh Fy".^?tbB,ZSQ(Ҥ%Ry@|e+RUT[+ⶦq*En\4).C!/~ B'E,!ˉljuz9"@l$6-KVb["N Qh],&\=O(EawϺ{r֗"YF1b9/9ij:m)Qө }*1S\H!F+=ܷ4:qUF]pPD}4[4u&mhe6 QmcG{C4_LR7샴i0^0lp (},$Ե4^U`f"޾}.MC! .C [> 'M>@xl/d1IQv(`ʥf=' MT0]GieyOCIC]0Xv}W](t[m՞"y%yQ #w3a޾r|s`P--CE56Š u΃ջ+&Ѣ ge $A_R yLpكvsh0R3Hk4= {[.+eVYu<ѱѼ $ur+bQ; \%yP5Ե)詴e q{D؛ 8ߔDtg /:@Ձ;lt)Q,$muAT.CHki.ϪX @ ]/FV+}& <8n? =̥_wK} R/ffRvPw (\LAaqha{$BP5QU>F3@9bM'pޑ9j<Jjf'~|F$1b ,_oؒҴ3-`m\hN$+ ̇o^Dv1uxYRJ0#8G^] @xm5j yxȼ6 [qOcFiZ'q+0 [Abߖ¬:e$Z33\_]/Qf5Zlszr_g%0@Cr☬-Ò6%0ER&ZT2] _%k.^Q2aVbߓ{_Pco!L_>yϗLȼ;zl8*FP OR7k"A 3KdY|Y 1\/,Z~nF2K)Y$J]̣j!fl&%-c1D4Ij=i;xٙbv*4,utЙ>AAH<d ~\PE>p4PsWo L t̓C*X_ 08jrigR|IOYLڌ<5'O;RSeôN . PVމץ ?j g2} .נ/cohzvπgXz43J;36ڽނHV*dr]17*N=fj%ͻzš>8zj|?hoy_yn!Da- JAo~'IڧO~T-e:%'SgZv/'aњX9q?ujcaFhl>~2Dyq3L j`CBvA}gup$u7uQ\+ 'ؓ נ 9Bg-~s *Bhyxv; 8)jݛ/HݖNE e-E ~H6v?ʞw-Ō+K<’ 0YTNtx\ ɐ|VS!)`+1BrJvM 8poAZj>)jyYkd$o>ЁaqUBm-˕KKjHn掎(=)5O|Z`W<%BEڝFkBQ|uT2ud?nKUp:3xLvH~Z4@6fЧYf=BmVI19C";k$7\^. 46Y$Bc{eQ#t63vPVobO%s pCk}.7t敼5լ8jҼXM<mm5m xCP-&cjeǁ~zqaxe~Kh +}URKvi6ssUIOۡy)(%^%*)wgBk˅!Jl IhCCp=>pQ$3y>r6> endobj 1127 0 obj <> stream xڅRj0+fZv[MŻ MvWGX2̒_iPj̼y*f Sհ`nDWvψe_moaiXᬜZ .w{{) s`_??eCZ_u ?h[e-dsxrfpΖGJK{ e9H%1ayuh֥6B⋭R~҅hJZuMǠ8+ ޫFH Ux )΢ha$M%VzlLW0C}6<pGq;ڮS4brF(&hihO&*K> endobj 1128 0 obj <>>> endobj 1129 0 obj [13[525 525]66[525 525 525 525 525 525 525 525 525]76[525 525 525 525 525 525]83[525 525 525 525]88[525]90[525]] endobj 1130 0 obj <> stream xc`cs endstream endobj 1131 0 obj <> stream xڽWyTSW1uuθKvѺR**HD$$ȗ@05%,V ՎZԎQoeΙю홿&y/~ (//J p̠+Y"%NRJ㖄ˢ sݯ__[L9[2=BW ]+@Q5Nvw$18Ϟ{@>сֶ? 83B.]!UF)SL ?[$U(4E*@4,V$٢HVHHc $R5AJ6x˞mdR޽T& Kx6dy?ީJ)ys(5fQ9T5GͧP"*ZL-R˨ j%ZC}$U0C5 $tP/Bѿ24eȻgϥGCn]XZʺM&#Xpœ&"rp5Hiri\)Gi? t TV´8ƶg/lpKA d呒L +@i]T^Zdr|zxV@#kN{@%M- LG튦S`kFxCW!F~.(pA#Ũ`;Vڭ `-}qgj\$j{N=#O>.\^>Kn۬YV84tS@kwuð@# |#Tzi,x)'>)ppj'>%O*g9zvB!ݠCn#xqx ۍ7EP7σհ1i5/w5:z ~|w`mIu 5*\+D]8&| AF2i)O3Q '/xmw8 =* t0@1'O<^t_E.3e}NW,?';#V6Ӭj4We) ]XU#'Hf944mc]oij'#SӧF~XgňW`afa?\\W!5E٨K!dyD csTMW= Eq;"[09DCz'n:+X.ͿgGt(ĝo/yxŜqGM%# '%L&+ ZëϦ8G-N'j6)د_lum i4&yWed@/x8'_ sbiNQׅ]l%R\ EջGu?}?8>:./fY[a 4]C.^̨6fE&0Yk(ͩTԩrԾ7A@4^q\O9 9 =sz[~Y @~v*1rzp2x )z_Ry ieѕNJ SWhfѧ"PE`*@q.~jXЦRMPW퉜Fi{hoB81"WO|-.8}Pkr@ϜOI"z.M>"!Pav:<-'g9$7ˋ'{[ 6IiXfT<<~9XKK0[SȄW3[E;XZ[tˮA;==9o @C5:o( Qϔ,wdаNE'>Low˜kJ2 o_ָC[<?@|HvLW&;[ t/dimO5ZeUǦFiC~W|1G2`;ܳJ Q]*}};}:}Ck endstream endobj 1132 0 obj <> endobj 1133 0 obj <> stream xڍRmK0_q~/Mefa)~ IMSd:^w &B1kAXTכjޔ@e[x6/B?˧܁sw7R!W<'kWeE,;`yJڝ  @R[/(r.5 CCحJ{8!=xSΓbf1/.Y[Y0T[MUKSqnOEz5rOr$$\ )0/eįe7GI y a36xG68$3JiW>Zn[~ts /G'D"RυV,:GŜ} endstream endobj 369 0 obj <> endobj 1134 0 obj <>>> endobj 1136 0 obj [220.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 477.7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 555.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 888.7] endobj 1138 0 obj [833.1] endobj 1139 0 obj [14[358]48[766]66[511]68[460 511 460 306 460]74[306]78[817 562 511 511]83[421 408 332 536 460]] endobj 1140 0 obj <> stream xc`bQ4 endstream endobj 1141 0 obj <> stream xڭW PUC,*1?i뮭VyIB rx$#%m"-غV)V[W;:vioݛ:n2|2 W<11^d\+o^a},r|"@'p_!,!_.qw/pQbz&dL-*Ŋ|q(HF6GbӤ2(K!%d=xYX[$߹G2dr }(>hV|#h ["W(ɬea121`ML 1Llfpߒc|p{?w*P 'GUW4'vC .nJtEn#mݸtn~wp ]nBɫ8fsr/Z UV;jz 5t,TF0Vj+;Pף<~'X' +>8 g\4Ad/{%WX4C'?Op&ȯlrh}$)P۷ 6 ^"X5=i;<ޯ<qyP vA Hz^:dB3ëmvh+!$ pNS %Ƀdp&E^HJsEe9J"qbDA=VXp h4kpbrR˟85v@%KJ|$|ΧEE~ YChg j|5kwLiU6*4{4<փe , % X< )l.f0d>\ihdT5:WZȮV( w -vM^`kAFE},_4E+U;G7nyW* g$#dѪϽ'<CN'R>+VI22`/h!Ŀjs>Pڲ-d ;pzppQGF 4iI4'%Vu.9v^˿MkEShӰJyL?O~M`aiJwGLx]%)|(=}xyҸ h(;<{7o zEZ)!*PМ`\8kj>y{}@<2)@mR)2ɫ,7WY-0~gq׵Y Pl> [)2ie)& ?ɍ)d&C+1te}r/|7W|Y(좽w['p qI--wI^,B6TX*!|?p u7wJbu2 gds>#F V~9E]ǍXƞ~[m͠*ԁ/qJXH-X#Mؚ2! glA$ZPf]pT-N=hB]u֎&t/Y=ǁ#^@ݲ/cc!5[*)Nv*9.u T L3*-K2:x :dtC"uV%\J|[ ]*VAvI0i]Ъ٩3@֫:ǣg!{@7ٲ"V{8=;{l ˂Mo8tlNGm0 m3^;2s9葮}_sx4}p= N_ߝt##=9K,c,Tm͗'Se@ s^|/RPRM493jРm}v EE;2zhzKxO\AYP jj[WL*hBIUX8x5n=ټWoI=z&sk` <6-}$iiN.oI<ī@ s\lPq2dWQZLPzdόH?>˛F$[cVg>8 rW@|C(`WgAk-+k]CADjɼDD ӽv4չ[P?},{>|;/}k8A$9]_PH5dw>V.hwYj,6f ſ= )H endstream endobj 1142 0 obj <> endobj 1143 0 obj <> stream x}RMO0W JU`UR@EJԞt-5v8{vS$Tf'W*zzQ~;z0KݱdТ`m4tQ.K%5Ku{ nn_V-mQMT yj&x-^jM$TxVb[w'9鄝S ?o'7\{msߩ[sYf R{^Hj:9 1?u0kds2A.hjG6' + J|ajל)./|gi(.}6{3?2Fb6^Fl]V> iCDtwg` /{\ wM]bj endstream endobj 258 0 obj <> endobj 1144 0 obj <>>> endobj 1145 0 obj [2[525 525]5[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525]29[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525]64[525]66[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525]150[525]232[525]522[525]] endobj 1146 0 obj <> stream x3 ` G endstream endobj 1147 0 obj <> stream xڵzyXSPT8t8A[usZX+301a 0!@SPQDCck[[Xmzk^|C 9~kvӳ'۲y jeD\!3w̶`-ЗU`ua*@ ~_o3Gl=Zwoԣ>Wገj69z,1~܇ xlw<#m-a;d~+=8 "7"pg@/z}\P>ke[;ĺGq q0Ӄ0BeD bz3}k#ӏ `1:#a2 Mmg33Ƽü gF0#Qhf 3|g&0Idf 3Lgf013Ylf.3,`>e21sf1,a`2˘ f%qcV3k:f=ȸ3\Qf;ރ2Vk[5'== G  ˄C"n"wW^[۵wi>S;okoCGo{;_տjYNNG> Pcf >a 5dX7z3oj~{^IsE }oh갉҆=g; #F#SGި/w9oHi/ 8N%&!k%8ɕ$xMZ ~&h;.tuDT|[H=9-D#wxSxī$ hGF^llKYv __ǣ(i*@dv&jJd aѾ5%6\1&g?5\w{y"?r݇< _DĿN*L<ׂhR78|%#+E>g H|VԮu6\=7sւZ0iq'6K>޿xþ[7_l6OIxaT1_E\^,js2  rexR,G*Z LOM%)9XTWuSx@ll0!mY9KO?wskX:oxJ/ܴ)<.:;ƙL]ӏM8{i/-ؼSpv_ak\} H J J&o q4AoSr4;kA( (l | =%-Ƹp8s׮rʼn>OUsQ;a#gI\SQ!3 ;<ki%vE)u#dq)Gү[B&m6ifD,c<'=kZQQYPFI7dJ񍟹L-pYI%Ad3LUD7`l|ۍM !:WӈC.0r7sI9Z0 zK SԋK]`[ZiQruKUT ٩aᮠ|sB}f^&sZƓiPe.oo9O(-#"; \UCY*Uƨh 9Z6_)rb3SuLp4қUi*m>>@է@G=cqH_Vl)%p [*17*92yqRG"=-p 8B9K " uNcxTvT&3-uCTlr|JD@W=@lFInZg׫d7+ !MQ[C!#/\,Ȇ"> A}.LNLJx5p‚-7d32{`'8 =G7 oɑ7o\}$﹐삽=VG3:ʝ0yV/(sPwx6c(*|*@ZegŏQ!T᠊M:.)/!3p`eVr$,&$@as ]ufí_beEde}k-ďiܯ]S EI|UNJzm5+p“ֿ_P YghEA1?ʊϖ-Yxt :RR,:Y9Uu(92_|( ϳpYt!a|Q6-8-*ZWSxJB?b_d'jX5r>¸$NlMJJRA\$(14x}FܥΒ?5/~}gs,Z>OTZZMPjfm6;[J!t(6h`؋){[g`=Ŋs%EiiټXUaM BK3FY,/̚+h@p#ͬ搜4Yۤ<,? nvKa6'E#17_K>]b?mQE*~%{]7iނԱխs::UB헧 GƓ7SVHMfdG~>EuQ[ס,cx"1&? w:%B 5Tu*$A6 Og}uӎb ɬ2r[ E D3u9=AqTJˑ%LPf$j9lDWaN> PW@<ݫJOz$.#:&1GT%m;2F ڰ]j*bwJr3S>wJhԱ$06 u(l%5',TjUxEC&&j,aVRfR5 㕱JĺzɄX%>N IUeg|!(46< &6n; "8Vxj8W ]h ٶLPj2L|@hhQe>ip&\$8lk ё A?6@< )# h >G˖y"$}θ!s 0'odLԒ9t3ܗoްm[#l*wUSp e=ʡH5TBrb3TԵyZ"Lا?󠟴 UjJ1~k$+ YnvقіqyT(J Sv57D/mͲ6_e6&mvzf ⓦ jb޷W]m qf00a> VZ lq\>Y8TSRƉCAޮ gˠ&O'(b nH?oKa"u+af[7"iW:zʱ?-O+Ŀh$a2VҔ'**ծhĝDwi/'630"qc hڽXt{+ȴ)co:^kO-kK_?5ŠN.N8vp>փ6C6[v9U ӄpw+;f'&l޸CG Iej_TmNƑɸJFjQ (lUAxbR:>`@^sUA]G};+aTVE(SPߦ=NJ0G|!=ta[4܍JmLVHGRW)AOEӴbOXN g%(DGu6ȨE+حH>#X?fMB}.\ Vسzu|BdGM$0?Tf а-EPM FOjUtMCQfbk0vWtz p Rڞv:Q,&lC@tťUx+q $_l ܣyjwI(Xa Uq+&7 d'\lF0S-NDIW b"wGs (pWK0Oo_~є_i?u4LKΊͅBKA'W[whOہ;SZZ뒽* rEh40@*" \ I$DN)tIJN۸Zb@YXJ,būJ޷b0-~> і)-S% <\"G]/6AOPCtON^~%[<.D/]~v?sE@ߧy(6ȍE-z=p N6):\UI'nt"Yw"3a*|vtZNȤAa3!iUmJ>.RE>:kgTZpIJ$/Y#iSuanW47YDNܽe8@kݎ5w'b?nJ~a^r_4ElHr!C]<ͭ:We fڛDg :vHCt CB;Tх!@b 16ӎmeP&OF’<~+wb;<[U tZzv IwœA;yr=G犺eziGS*9N3′#2l54_i/D2Ӑ_#J"$GbuJ5_ɖ l37)'9r*86{/DfL2[YP,}V)J( Sr6>HȊj48wD%F*c:4}!jgfs*=`kgf3ͭJ|]g|=d-=[ >#1C_ѵU?wya1\ZlM=di4%i4Tõ܇" a#<#m[sӌB{GYz[yxԑ6+0:T|PGWc*]^܎6m\sㅛs'^65ߘnX0u+!}N(T|ħ*媘 s:M(7@)bE9pFCw]JfAޚm{؋>?&8Te'Yc1#?@gHOz}$ƹ3W2SYŌh-<'89kwAlAǮ%_A }OIYGѬy"lP󔴌Qq=s?SuseY\i,~X=]2|_rkb2Nn1f|N1._]iM椧 ip:m5 Ց&\te eU8XʼnmYٴUn6xۅF%̗ershlj[BQv]]IEa60e##gyr_:}hMVk3+iu$6sv߄ '7l'N8h/g򟁻Wx8KD=mM]'x)oa= jwExiOM2Z|n)8ފl*h|$/w'8|/[?m7mcY!6-:MNÛəB a!|Gv٣I`u߳>s]>a?ȸndT2nKpЦXncn͝ӭ vVvm[Tiex)[6}MiTn2HC߷Nzkr zoZud"~h\}Q8ւuE~% _5yp%U%I+s;JGWOZft fKNׯ.0ki1PsU &P?2 *j5&%!M9ʷH<5)t܋OED:D(*H56džvWKjE)TI&4yM/)7=/=[OUQjHGmvU6'slZILđ"Ms?ǩE+ԛ#E$**>Yo+'q5k$Ҡ(ų0ECPvMbCd~bV G+pXqXS%O-b^dKƲ`cP@hHJkςy5۶acTZ?ZI Vgʤ5e+mO\`QQRUf 8̋R^1esr=} Ceae]~Un~R^FVz^6q%?rw=fo3 3djuZf, "~ ٷwKo8{ټ^) endstream endobj 1148 0 obj <> endobj 1149 0 obj <> stream xڍRMo0W!(V(R a[Pk#Qſ=! *ћy:zf6wY`nD[v/em`eXa^ ܝ'Z[={ J_) 7mV[}s*6zC{,mCFO6x ܢܢmOsνcenpk앖<9,IA*ΈʅqXzot gO4_Du[G CgYF!}TMY!)]M] > z9xӥ2ZwYz7#2iP2cr&sBEgrr%IBMnoi{v@?'BǀtPʟJgsA tPz&I x!d_V endstream endobj 248 0 obj <> endobj 1150 0 obj <>>> endobj 1151 0 obj [9[388 388 500 778 277 333 278 500 500 500 500 500 500 500 500 500 500 500 277 278 778]31[778]34[750 708 722 763 680 652 784 750 361 513 777 625 916 750 777 680 777 736 555 722 750 750 1027 750 750]64[778]66[500 555 444 555 444 305 500 555 277 305 527 277 833 555 500 555 527 391 394 388 555 527 722 527 527 444]164[500 500]167[444]208[764]639[333]1608[500 1000]1611[278 278]1621[500 834]1701[555 555]2174[580]2181[302]2231[583 555 555]] endobj 1152 0 obj <> stream xc` 0PF)L,oq  endstream endobj 1153 0 obj <> stream xڵz XS׺vbKXvuljZ: ׷ޕ- Bkgz/4r_^׻Ͽ|FixIHQRg? _yċ^<𗇾\7؁/ \+8L$ zk׹Aރ\6 3rHk^1x蕡e؛B];4zkԵ=%?DVqco S &U QR\qf:[Zovn N*F)L%}{kdl0!x 7{޸/@?Vf-&դG$Dv)UY9wKyX_U93p jCڒDv2?id&yx45~G}Z Bd~Ncs`MŜxyYc5(ȇ\%ɂȠXv)1eC !JL@D4ZSi0)Z_2ȷC*M"ƒ&!C i# ]}Eԕy\ z# \OĠѩ@TՐV\37XiLJLJĹtm^E' ՀATm̽SDH#"B˲Z _^@2jscLt_PbD$N O Dd $)w›E7H#lNtFFEpD.UYf _~M3Bc rP'j2yZXm7h7$qM})}W{|>kkAn~J&@;rUSt#O gh ~rlbp2a:̒Ѝb{S';8]3B뜴NBuq\p졯^8MnuC `x* ~GGCm]BF链=S1bifãąbQx5Nc\ Ƣ&G#Sѕr| {߆)Κw/@d9yESU}Ex?~lhntL{ 7ұw`!v۟8beHB_T/5tڢil R[uz9o&8 M$'tVMNfBt$φ"nEda>2_^t^.QEȨNW,u𑋢*<[@|"n2A3}&8v6A}0: Z4DNune<:{2j<߆_hΉnK~kΏn='NBցor`«Re]f-Ҙ3e:F&>cml F-A,#DP`4e6m``I, 0l57Eo I:iu$+*d)AdTe׫7Cԁ7wFk3>/%ͼE %o~OD,XU8 ?pfm+tn!m59O,#"%qҫ} X kaI ]ACk A1rŹn][wIbca쬫"''KƑۈ ^xrY8fâ Wb,`6QԹ0 99 KiNIrW&ȁ,I P*ԨԤ! ReL!'bB(9#7~(LY @}F:WI$$THHȠ:+ %mkj8]ⅵpBV(CFUo@ yѫ t@ a`f-r& %[^HcQki4JU "~1!'HirqՇn'zߗIāEUT~ɾy1sK{vIsH"6ZqKDIg\\t .]ȽPۉ\٦p:G[`ϻ-rM,XJ3Qz.e%2!ZЬҭnm#d9$^GnG6sOz]K^I/;iWg#׺'ToN0k f]7EB(,1D"iRhZ%":2Q8d@`|H7ܗW%޳yLw>f| MOq۝Y2חLq^njCt45t$R5ٹJet&mQ pti2x_f~I;A^ }@d39ϼil7ӾǺjݠOc4eSx71jPiI:#%Ϛ *39 į vgm޿[tQt\Z~hMj3刈T"+Qe 72 (=%%'N2 th@%ʥ/0Uֿ7=u7E񣓦Zx t'T/2UM?9 i`Fev.zS <#){_R9s)u]nKrʎ6+:VywҷF=%-H,7UnjTюQ%QJ6~3׳^SZ*.T,OUA_Y(t}˛vP4}k*At+z)kdaoȭ\JfsMgnǣ$:%s-;*z1k>J%#l*OND/082Dagx3K Q[1K쇆 fR Ea2. э)e`RH܎:;oU;q7k/Vk:h ЪʰsOh>"ˁӺ@7k"E5~#P}dN%;qH~ؿ^`# r|>$όd/B.6ױ^A:)4NU/s;JG΍I:mb!uc}yѻ"42m󨺁3FRëpp$f~,** *pV4di =gZJ]mF(.'#hZi}'V2`̝<8&ng;չH?'W0-*-3D|'FPiTB1u+?rGwYw/=yCyq \sBrHջ-χrPrxuʪ%2H`Sji(/*ޤ);p<\ƨ b@,Ur:'ZKˋjpܴI7m2hCx|l8*^=q|g"zIR_[`WG0](EZL~9M03p8z-tSt@v'?Ζ~|ӹ+r$}r*] n3!h[>(KVvuPg><.?$d^V[U΅FD$MZQCMʹ]Dx?QҔ=NM6׵':9+3gk'[t Qu^^c/vcƄy:32T*#4 O9;;g#;JgMj==ڧg1W5/ՖNҟ4A5T  "AE)fCAaTn!GUSA\19pYIcvk6~g$矵O2 qHJOjFF ݋tRzəbxtސ\"!N}pv 99yg{č&Xg5{1[# 5RJW>T}Х` F4QC)EO4iv! wڪReR6~"zu$]Vrd ѩ)y/YZO[Uƌ۟_AŧA$ /n+ֆTr8;ŗ=3LnsM,;1%򻹗]\o~]PfqO8ZveI,˝OW !R7z(Bijfg2* R3I._$:o*|))"4 =!6GvIS EכZLIkXu 0-$vO`̧w,;B&/a cN1* Y~"I}إEO|)nuZR-b)mhHh;%hUh,NPr7R%tєJPPkM5+sCz2*[7Za>ЀB0apR|)38daEŒ=gL5-ݺDC -̗ f׮CgCSAKi64i- *%Z0uLB ~m2z}oZ{DyYd6DJ K[^юL4qk"7;uI봪44Ukr4B ׭@ӰyN!JM٦L]C?^ܸƼf\X$H'A(t mL PhX8/m,<  izD%b}}a u%Ę B˞[9wA KaYz]=/`'~QxNt?'~`A5TOvp#4AZmSA R[NO 7֩o5{2{ /.yU8Uձ!\*hu`lZ+sڤL6Xwz(sE7Ka' ;ťLP@&HF,M,8ιw(ֳP{Vo)7li]->XO{U8Jφl2 9`!vErXB7]L}/]K\E%# ,l]N:bhIc- Ļ(ܥE9:%A*0b ?Pa 2dϱە <`s?p[JϣTzTPl%ßV!❆:~ t{=i{=]G$5'?ml)դ)"K+Jΰ= 9ؚ01gA2"zA ƯKq:lu!ْR"$PLEnUtԖ{P3w9'6o_+ ڟ2Ie\z]] \,yZ2K\TEf+u"l "瑕a9o> endobj 1155 0 obj <> stream x}SM0+CⰫDBj7ېV@u+^L)UNmto39jheaD-uH:94Zk%QA$W~ą,:TuWnplފϸ {Ceˡd!.`mАl -83Yj(9n> endobj 1156 0 obj <>>> endobj 1157 0 obj [15[305 550 550 550 550 550 550 550 550 550 550 550]34[733 733 703 794 642 611]41[794 325]45[580 978 794 794 703]51[703 611 733 764 733 1039 733]66[525 561 489 561 511 336 550 561 255]76[530 255 866 561 550 561 561 372 422 404 561 500 744 500 500]1901[586]] endobj 1158 0 obj <> stream xc`>0 w7 endstream endobj 1159 0 obj <> stream x}y xUvUISUaQADYTI +$lN^/% K62 #qATPDd6s3fɓ~9==̐!L@@6-Zxk6JX?mQX|c} H O >1d?\9Tc1 c 铩AW⃞b8BxztؔqɪUg<;㵔䬸tU\lhtvЍφ>nsh|J*Z }`/o/tFߣq2ÙǙ?0!Hf3yL`&2f,3@O Ԍ8ϏQ0ŰaTث}./~cQ3GlOHx#s>kak<cx/iQ-x/n!{}> ye<&p VX^:['KnF_p;KxY'iPgW u!|c6fgC%8P(8@Q<cxo#>XXyp 4%_JJP1D"7r-iqE<G*jKw8k⬫Hx.}mnB0p:R0wjYz0XOYU2qrr e\.VP$xu4`p_$r4U?OoCx c'ÜwS\s#-).>.*mG6y yO) dZN8ބW>-$C9x3'"9Fʻ"9A6ڒZnn{M-56IQ j CYh27G P&O ?¡潧9u8cz{SuC&JZͭ>(Y? By #[,d=Y[$g"9[ոG T wr),& U!Nz&^0M+xy Sx҂\W@ 0f]07ٰ d[:JMI" =<.oKҽvg]5T?9K@+ٴ.7(\{Atw4+=p^7ĶO> mѰ49`k&0 `59 Gw矧]c]J,\|um54föI3eW xzB")9H = 6kuf^/tg܍G!J)4YA^-K1"1½̀c@KCd`Ӗq<_xW wBIMRM]5;ܠqPrOui ¾Z*WOO*CJ_?^1۹oCa) FU*OYc A\Bjz|V}U…M,"1+U[l%E#SެaC34лKdSosF4ta,GawvۚQ)c-!_w(͞Mw_~w6׋8ͧ[L9jk}+lW43(&B9@^ya kOBС|Nm'c8Em%d.MF^|Qިќ'|oV4gـ^b4=$ƚn֖j|͸yNQTE vTjMB")d0L}uܶ@Y7yeF?hxC&] 夎D1 owq-jOQ5FVH5,"LJ֛qh-x?;ǿ쥩;jkq:Vr7Njp&lNQ 4, ܁@\Z Y3|eK;"cLĵ8HJHVi,[ ^r͔^ĭVxR~pMKkh/T?j:7LY?M&f| ?SBp! ,&go~<pGg_zFn7)tffs_7B }!KVSD$RHݰTU UE]iQ2PEL]m΅s>'FhƳl s;J :>SvPstИ41+fw2zMON?,Da3`N&YP CMzRa Y?DM7ߟHN(Iv>/~p5!Za-R}ܦ$!>3/f%Y@.վbUߺzvIS${h4j^~`+ W5$Kq/RA+U\[$*c>\&U-;B:uODXQjlSu6)Fv;A 6h{ z(Lwu"h):y(KKfsI\ܳtrYTVWr?E|@f +akA:Sk!,@v]RɭuEYLph_=P7.VRb yy{tg!mwNj{3sx ]zzGӿ[~tmq[]NZzu_M\q9m*u˯;&$Y[8ev<.kxJ, Ɋb*3/KEdYoLwNɷW~yoaW^mb%Ԁ2,v}m['Hn![:?dootL+ W4W7Qݻkj@a.İtH,܎2Z`&3ys6.G>hHw?)2y-_$N;>JWX<.NfHrăQfHVSy߾-8]Ajz5y5#B[qTYmЂkAybIm/e(Agr+[lxUqtd]dM tvbs|} S`q̲E6#Qјޮo\m/WWN)_99yU1v[I–@팯s(c tͺUPI6+Q6S_,tZ5}t֞vX|2\;j}ga@cf_@pHjܲ.j8;Sv4-1ŒklC!]v9m .i/$"P"x>~V8 ݮ>-]4M5.*irA-H[` LNCgƮ1TEp!\IUrK8JM [CCg!> endobj 1161 0 obj <> stream xڅRj0+dC4-uZzu l$ , 7oF4ZD0rxV`U6l2רgDrj(&Zu7Dε8GֿIk<*}}`ǖ6~/JhUIF;?L6\k_m~sNSC,B9 W$f ay/š$\{ϣd4+~Elq?P}WRWs)_ߘƩf|Ůzٱ?>i endstream endobj 244 0 obj <> endobj 1162 0 obj <>>> endobj 1163 0 obj [9[447 447]13[319]15[319]17[575 575 575 575 575]23[575]27[319]33[894 869]36[830]39[723]44[901]46[1091 900]49[786]55[869 1188]66[559 638 511 638 527 351 575 638 319]76[606 319 958 638 575 638]83[473 453 447 638]88[830 606 606]167[511]1493[319]2113[639]] endobj 1164 0 obj <> stream xcHvl02 BUUY endstream endobj 1165 0 obj <> stream xڝX XSWھ{]lހ}éVu DE$_Mw.^PRԖ3ZQketLN zѱdKWWpkf~5/OZ$lߏ*gIf` ݿg4jɣs>ߺVX _,5t>N:r8!\`2أsƋ 'pB Ub0O=I_b)zbt y}E\.Ț) 82]&toP}wč8]݁ږS< 8TYdpr,/*ϕNI48N҇1iT!GR.j< A6s{W ]K/ӐcycWsDg]Ko)27oALx)#P7dR TZFm!'dG(j*|AڼUQtQ"~qN8D2ŃPbQjY[n Y('۳d p> D<#=むW\ږȂlKq=:$7 >p"N"K PV՗wV8kʡMW)=8 ꪭpō'k  x㻰l4X>M]iZ`ʹ?YSj 9kis/%:؜amv-aʞW񾒬qtV 8Jm1ِÕ&A"-KOHgFtʩt\b'`0$rA+A  S$ ;&_H'}'NBIgKso)n%3p I"2#*tA关vHl3{۰: NqN〩da.~O6+0Js2@oЦApj S?.Ft8RtTK{8peln| {cYg@1Gjt3a} aXC3}7eA/:!f6#uqřE4V[Dbk3b1߆UH${([IX/MKQl.)(;~=1a@3_I c5@AJj\k6A#puLC @B[er}hXgZ!Ҕb[BI߃u8j,wSv3L^WY_wpP8Y̶ǒاIS/M$|mvZ#(B^[]0\]_Zl/U48OwF*?=AAn ٩uPم8\!n֭? ޑMJSMJD!DRo`R8M<ߍ;M[h Ǎj_-ߔa9 fcqjK..GhAF9~^NUCmM$)B5V~Hfn"w74TpԺ!n8j9wؼr+2)! @bP.I"r7LKWѲfº=A[ =M< c_;v//GCoO~F%S'F'xEɍ+mUKyRf>}k:?|7p-6?2zʋy6ɕ cQJ]n6TրYƑd&ۥۿTlr43[{9o%t"Oa-ZȈhI~$7/U-G=En=߬}!lo#_RŰ]Ciz=(ZgM#?iTMM^yÔ乯i8YD^J^"%]*:zM [! qnjU@7(Blwt=r"Y{Z[h9,)1 v3}t~=q"n>Uiq6PAA &=jrEOϵ-Z6¸4P=a_pRGvÉ-N\!Pg2y`ԅ5NpiS[]\ tl6&3Fz=%G@ 2i=88qy Vsvq89SZZ48N_ endstream endobj 1166 0 obj <> endobj 1167 0 obj <> stream x}S0!Rd!H*]-iW)d=y~s;leз*N~Xm96 Wb/]e[&YzxLQzLåwه-OioT]*l״᪩a1]bJ [8H1[$9ܪBM 赸D]S߲'d[?@ɪv;|b?}7%yaG5! F s(b*>עיz=o8:`朤+JP݈,՝tb &2 E#0x H`Rj`0FkN`BZzGp}&bnS(]ŢI{bJ2bHl@*}ҼsyMJy.ߚlLNQ3d_PJAI 7W]K֮L8f#_ endstream endobj 241 0 obj <> endobj 1168 0 obj <>>> endobj 1169 0 obj <> stream xڝxctfmlcضm>qN:mcwlctl'_|w1U5׬j؛DIA ata`ad!zڙ۲0Y((Ԭ\l89[yue,_YYyظx8Y9wCgeji %(D<,,]xV@bObaSK+;b[W;ŒX.&?HHfiLl??O?,&VfvV@F8 bItC𷚙YXX-]\x1+l0iIh&joBg֊Y9Lob݁1.3W&u+@Zq\pY\qpL%Rt-h`@lnl 2yy;]\O ԅ`a7ﶼ._[N7?jf\@$""Lom "bAA+1_7o^?{"ThnO^~12WWw2Sìwj W[ۿ)E/ kꉩUNv1S0jY9KXy̔\L->2 dk(;[uX+QS ٙ!RMͬĪ.&쟎¦NNV <pK߬u> 3NX}Pr6s'~llï=8fJ]*DߒW‰0:Ճa2nSs ȟU9B^͘vnztm9T8]{u։+Ef-gE p"ܬ%] a+4"wHLmDML˜%?;xkݿZ 8дlL<1K;9I>g?/o60]IJc`6hB5!_&TZ޹,w2m|{?89^ϓqmƬ"FX]T=;45}UaLH`ٵ _HwV?·:qI=28yI hD)BdMF'9ձkS8`r}BVN(lDu]l@*ʛ_΂y\!XUmI{跍m/1 39FІińkb / MA1l{2|U҅{N f", ;7U= jA>~ V :am[;CŢι S{|Q+ ƯGRj@k\gFbM2T/F^ji)D/q.a/+= vfxK ؤ~bO *D]$6dHtB_܃08!#&|c"01" PPmKc#I?L3T{Rw}=0u-c)A=lG}_BFpT e/ <cqبQ=Q<#PQ²LA5~,7v&̕}?Y|lM<NTWeiݼgjU]JF$V':'oDŽvϓJu^$cs"L>&ANsj\9<^暑|ei5BW*5p్.R^93tXrq<Y۳HQLjWAVZr.|hřpՙf2 RT'6ڔ *Su=qAP]OP*'ɋtHK q-e':Jq>'f !!af7VL:Xr_&阸eg2HvͫpO ] ھBhZ[H0"@C3 ؏V-c!=U1^&$3D,jx&9if,OR﵃CF̾qZHISk%OkMɝ 6K;,QXl<I4v\T-[\|Fۭ#6U8bo ?UÃDѯmVnV_`}(F ʢ:)[t\"~ęܮ-gyua_9FL VpC$?1'&29qR-< Ukmm Q$Y b9EW]\>٤NoDįxZ7"%li?QVbׂl if[{,S:2XdB!M r8jJ̨ ;Ϙ c [6f 0#Gǐ/%!O&N{VB;H8VޖF6NZrX=ypxjAk3ƴ{Jz4Jjz }.Jߨ7Ăo4/{u?^vtՎ w7\֮loXSEMRzثI!?'Ie̪J餟-Xֳuhb(,@5X(rn/~PU,JX LfBHs%)ꖯO*<ǻ"u }+C?koW4]ךQ7-ӌA[A.|ɓ?gx~%b\7/[V$4SȋRmxm'mP+%3\Na&Ҵȹ~A[;BWm&e D"Kb:_!y@BH o23SF6-Pj p?m]W&b}LL>+ݣh~թd@k|VA5\",I)ԡGv1տ½~Ýѱ%ݍBlzĉ6P1TU9as'ݷB+=x×eح|yC32 Tʡ#,^F4!~8sޛt^2YH}=!S!} +̾PⲴBLH 42EHm#]Kv2$z(qh`2" ~s~⊜!-,,.@e3ÀHE/Rl`/O#5(21N0x{ A6g_HHv5LTɼJe_~'p?Rx֝$9eg *W/~E0fq\x}whEa7( n m>@@N֎骗SʊQasqsrgo/䉺0zVihT%վG$8骺;V^I(Ə0O~^6ONtD"z*٫b)Vק' !}))v͢DyxJXb2[V S7+FNmZ1Q//M$Q,кA`PB5(Ė'uՈǺ 2gIz i0%޾z}%|smȎ=`8 =|N$Ӡ:́M۔̞,Z곢~MU,ҸPh A(q5]uJv3eH NI~S&Faڷx/}|Gyf@Ȃ|—@: 9q5aԝypMCxwi 4'pX)mRQ<j;]aNaKWc;/m!xޑa,.W9$0)PC.~6] x8[12l[bI 5:_N3o \:cX1gYy*6A Z$Py>yy}On6 ,I)Ay.x)jd1箘ċ`ʚ%˲O@JY?He m\+K*K쮃vYËaBRZ>^crLv=9(-R}>dL>r""?&SfT?҂a3Y`@8Iߕ\PdQ_iM.ڹGSYMFaJF;c̗,q>w LꨦʐLHk P ּ?L0w^=A{_󋜇ڐ1"f7PApܗcP .} y\<6As_QrY2w@Ow/C=1ыn8%*jA`ERiyC&&$kJR}VC*<;S5-TI zJS9rбe׬v݃4#p  \ry+cӅratvͥ;QuQ|Diw>I;0ݥRiN`[عKT!9#E_|tHVeQ U{f-@)wex[aڕK<|F6рȹlv-?MٴY\g/.D#aW0~ %NXG圖tsė AHghͼA~YU۵I}WyFImJk`>Q!Xel8†%`>т4Dh܆k{U(+יS`;Ң~#ױ-oBXwe Ì #?/}J89&2V355#/(/:w"BvU hjF%0p#(xm{UpoăMJ.)}ݦe<9Ah+o$] ҡnt7Ĕ8f Eel $%,Bʸ Q;J& ZP*~ aT֪<һ!u>,J,9]oYaƹd>7$~Z;vjMÑrf`_yImYby(PzD^ͷ@> #!sӜ|r&-~$4UzQ/{ItFeW+jM2$U[0K8SS y6d,< sc\+|?"5 sL`YZZa~ EV6ysƕI~FG_RAJo҂zmq@ enH;ӹDײ܊X7j5tlړ-ϥ6ma p'52Sݴ|c\0}F G%Sk%1ڡE {z6T}2 Q@477Yl] Ijg }J푠BzՔ{qo%ORvǴ g3#%GhRT\*Ad߮z VEe,c7-UTѫrx4:i2B_m9{@R(Dog#̦ *!ܦWXB*]"`,bB l^z;4Bs/T2|~؟ ON=ɞ咍ui }i.Cx(cՃb@0+Kuot;vAt]~c?k02r>4m9UJT(vQ|NM#Zyjp莱** #2vhڤI35"RA (QƷ,^8iaM, mWIxt^b17rf :kIYbASlPzI3#,2Ő3|q3ە{ D/+Dq᳣>2Ib/]τӼ K@ @ d:٦S.D=g#?6Hx'b6[3umC Ϭ"{Hѱ[u'6R~(~?ia@\d_t:LNicw[')̥Io!'PŠ# . 6?6aH|O+M %o fd|GVM@0S)9pK48VY ARJjja&Mlpg'SbҼ?4J }#=J|ObNJxvaMJ7z /Z-hǴ2 OP ϮX#6"Q-nk XMLmb3B=P:7ѫꉋ1 4?phwb+vh{ثb֋OK9J !I2;:/ẙ?@?!`-_53Kۄ{Li= No^j}HwMu#\T}V *^*k~@B1 ]67pEHMaxԬGcùfSjj( b:OZPIY"O{`GOmcLjctvR1!j"GٓPZ!ǫ!y$WB,M<Ϛr 4/.ߍi&(^֤)Op"yb M\Q& f |̇/q` aKj-MH9jc|gsŎgP8e/Rk_4 :c<62cVTE;& ųKlԈx`)uj,Ei!R/+um ծ uY͂F2ޤscl)\OYl(vbf[#oRErw~Pt'2W" 'o/|}Y_xmS;%v]hdZVybu\Bٻ%i]Lr? +t1vpQ$FE>q}'%JimAtv 2'N[&& #x* 56=v|m?B~'x:x} w jmx9b@p W*0h 5d51_D@p׾R/}F}_Ni[5Ln_2ߤŐ\|׼{x.f[>[ H -u] quҞ}ʅ 3lYW_;gum 8Rc>%vyNua2;m-Z1ܺ<X _ -4"[G~49OGrkܭFsDn3v00|7iPKr5ZN_k>'-YS""pm?ղzro ߜ31Uݯ-kwq` ukLX׾ūb2|S:ZPΚ=GaCEa5 ɨH] J~S:[ZsA[dv?b44Ⱥ &z:.~w'Gl]UGWԹ#̅1z&XK}/5i®mbN3&^h;!yX?s.\d+E MU=tH#O7P_5TOģmx[VuCBrrmKPE`{A<-R)vNuR=/fi9#c3W#84+?G-Z4|-(uA(Һx/RJ} mM|iJ<+S:LdUJ*C/$W>Vz֩@2͈Fwʥ1=)HN;+rX#g>y9.z(k~@3T}b7)DfDy"Bgq$ :`E51NsLIp׍{b%W;2ܬ\MfIx{9#nLG(@Iqʼn?<~HS]%(H LN'& ds#>PDwPKC|j tH76wOn|7/OgyG9@< 긨^.J%} ZzfZԤכq-hsAa~RR ,RE}{{YYp-,TbZ9 F-amȯd W$YxhSZ PRB_:>gHRrsϞtp`H`O㭚6Q?"sn[Wox}f*͌VOH+t]< kԴ+Q뉛%wse)j |`zL«&z-| 0pOGꏩUK 6f>=?w1VjFJԆ31JQxX_*'θ=x~(3t넑st2|8F 4HUKibfY) lK*# zɦ+ʐ~*?})6c _כca6J| PTLAOqMri7eä^X&H:BxCݵm采aG$o v99kL#ӆ'd-s5u*(AA.a۬8u> endobj 1171 0 obj <> stream xڵTy{Lg4bNQ<1w /Bbhk++pE&ggD@{A0+]9N#-grP_ok#I3ş(y#XcOɠDהȲв<冀swF2Z_zp\T]Z L2<#-w<{(Y&k|Dť]ʟ/Dw_&tr#q_suO^lˍƴ҂ 2*~C"9V6#:j™1 a%)*ƢSմ`|W[YI2.-uY'Jo=ik=Qa0LFMyMEO(Pr׃iLEYj]6հ:;|ߺIƫz0nϽi^*s\z_իp k짣/ny'@K]w=K#˥M!˖Goi=5W+7Vbzē_0p1~rJzVh'`㶱TyPxM E|6"\`H-5ӻH%{C6ۆ> ?h.<|gBYˮMf\8q2,+AU___1Vň/.?۳jLxL5v߬ۥW F:hu6?.j\=hnIl+Ʌԍj]y˳w%Լ`=?=)q+d[wTvO 2Z(1+Mbie<}1Sc_KsF֫E^4es5B{OGiBmCqo'},%W\l8=LHv{t<>):#z؎W.Jm mY1M-r GqEjAܗ\ ][;7QswwSz'o,'Vz ʂM,>tVuE3{yLmfÇ е\yErk Ot=dꖼC ƭ]:c}mEI uţYm][Q ighy}|j?k9{{䌬iOZ/oG'9"eղŝStL{N۶D=}ޛ29:l%wf6* U2u"{ G.I}M/>)/RMlr7M6z]Ym^fѾh-y \:Lt4Ϯ2{[{Ss7otko9~иIA5\oņ)KWj:ʧ7 [ŭQ'Gsvć7xKfEqr#O'^09ëb0cRS;oKƪ;|Vq2}zZ9,s=8Z[O/w/kPXH}ђtD*eYš>E !sCW5]l/b0pVݎE^bU8<5/aL΢zx-ErDnEVSN elVv|tZ^xOۢ;} u V;n[?4l,\sme"֖5cRۏmTOyGJU Z#uBdؤF߰6x*:$mU|Q{Uwj,Cނ$c '86/}Zs Z{2u rT@+TdnS13RiafL \ۧyٚ?zпYd}C!~r5aoZ> endobj 1173 0 obj <> stream xڵT{@s h3x4݅ưb(F= BXl82!@aFFb 1*B2| ,bT C2bDAa!i: ēp;70LZ?]S(uvss!L @ @f7 6"@Kw/ЭQ|g~( S1p7|ma!&̇3Fgq!Dg!a,ZZP?R 8O*4g}#N93`B<8L9~NM6.2It#5SfIT( 8Lp`$@Y 0 % AVlҌ#,}c>MȲQ `b4?C/; !0?󆤨]QA XI'퓕.D*x)4>.iZW++B`b*sA8/?C 9mqfxg%bi ebe H1 (PL?BEpPAz !R{ n{Kc4MTGqPp;:_uM5E4^T|Rtdw D&S/kX(km\Pƅ=gvҎN1#~cʴYU m,,O\=:o4ߺP rjN崢!^NiVM^$lše/s} VɮHM/m̪jGo;̯_y')Uy]?-j>&¼bu݀=BUyvvomj33ͫWt9C9j5z^efX ueUIř9]ik럩2gr1`nS^Ke2>|(sA|@bl4Xu7f{<*WpOԆvEzW^{xJ<1Ϟ{:WiڐN EA9^ňvykŒ26Iʑh`ղ礬zBP[~7ܡ[Nq1 o Z|bܭ?vZH53+LZ,=1u{@]sӖDv̰A_&_V -b)5WAnTiIwjS2b}`V‹E#7MqkŜjk.Z`hM_oU:dI-Ͽr8,l]7v?n[Bw XoU,'LN^<+&G^޺yxP~"nfͅKN'DE]&[nZ~v9_Z5G7шe!p-/1L*X  훕K(@u?nQrBRW ڻ/_Vˣ߸SYI#h(=%Nv-VȳxaԼwzRpZYUZ8\NQx5ǫxY9crs2'k 9$L52]qPUL&$Sj8.I[{y0)+샚$ׄgxJ:tM55]:2*MkHt!srKѶ#ec@h 5y흝_sDIsɺU+ne-3laռrF b02܅aVSS+A;J xQ* ` ldPo$gvۊHveӃ|ƚB%3{^VًVuhqBYOfߎG,pTQӂp5wϥ:\ ;"]2o!믖OA&9@w8)m4=nMg fŤe~7\²=V=S h6uAqPlrI,^ˏj`cf[93J%o9Aimhy٣[=ŷ55rݨOZ?Z6o5#*Oc7sS]|SSjk E4GECI.XuPsHnqZ6Cc9=#pn>ĺdcjI7^Щ_+];NګB%oXԢ:NAjoz3BR[ĩozoϐnQ@-mƚ_V۶|mKudWR'/aWEk;X-S8RQ%_<܃׷ZlC,K?E{bጙj<;.c3-yYJ"Uƺn[hvmSeNewH }GDΎIC٥ I^HCwSpo%؄ endstream endobj 1174 0 obj <> endobj 1175 0 obj <> stream xڴeT\ͺ-]{NN@%xpww >s9{=zGg͚Ucєj掦@)G#+ @^AāQhfg`cba@w$L@@>7 dH`aEH.Ns@2QrhL(;MM\?@Kk Go vFƿf1Ll=\m&9&&LJ@0ZY-@m@ZUICY飰aWSאfH*K i 5Wu~Ko :ʒ`]\lT#+ȉÃbd>u+kW-C + ]7I_N*?>ߚv \yeey``2}|.濡9~L?Wq6stpv"`amY;cSUTSg;L O?JxXJ:;vEKO G/K׶>/nNn@Y0!v寙?'G'+qCq5q@.n@?+7 !͂OuY GH_g~RsG;/9Y!rS4'gbomoF?|֮R֞@sekտ]d}QK;Ǣc>tqX=,l A/\<$ͭ,l\/!qr|X?4mG)f&GG ptAfG_#¿W韱emq(ˇ.X?eo (G+[LӇ`q[ٿΈ4nP 4CX^p4Ii +̟*e:ҖZNj#& 5S8'9iS`ٽ7'VNޚ+Hfk2i+,ues̤ĵ4Fy:&ѯZVs= Xaax.,M1c.a8uw~j9vP>jw>~4Uf1uq8~p3Dҹw^ 0X1OdyYy,9 {'e f7@@ Ǿ&SO]"1leG8ˬagsB\H$Q PHώH߬T 4UJ-05|!)]7=+rZ`nJƤVop"+EFfRbRi'~ˑ1̆sgvm댢o|z`+j0N|AO0(c L.`Ӗ^N$뱾b@OsK/P.΁ gLE_)")=@ )_f:nZu'Gds ›ROsqVh0djeqPn[?9>b:LE£$7T /WCiٿZwm`# ,A=yʤ ?ރk=qAiBU43"ցHYC}Ө\B!B8 Kc?j&&Ɂ$yUؕIt7ʊa6 z}I3\C7yelɧV[ măj|5qSv7SXE&!wvu)2N z+ B%m4HceiAgVsG^_àajzLەx%D.yY1n}cC&vJ;g·tFY 2Nr TgU~ԎPsweBy고a bO3`T$\A=^Ewu=BQd^^_Tyx[i ?n% ֯.>Ύv gT> iCa3nj.hKZ=iHĤEU[A{aR#}s8n`W"N)r23/!pGFJX AAd=i81U9H\)E3hX~VC*35^dT_r:xyd60߿[w 24ӳO%%蝸<޴ W|6xBd_hʓlL]1jc6aX`S%'uy 8GtS_?XmP?2ݏvMnLCߨf_+z Vl*~e掲'%Vj^eu[ nOɌ_Ok =KB ٶ,]#·I5~[) 5 r\8U?k\ MgogxXXĬ<0nF\ +rJ}br*tUm_ ˸RB0GL =h|9flu/F.JR~Qm#ąo_E2`Nx EI2}:{oT1;v&74xBKbӁ~N _"^30J!TQؘ /u s?Pk"^H7k|elWRO"px;~ | %ůq'GM+Ol/JO;?B . ŮJ?yJ x\{+X`!>ml}H9&xgpTJvifHcr.`&*9{.a'Èq 7:tBRY)t1ԝ^rFˮJocyr\AhMw< "aC[͝&@ic2GO.@MƮ.U_o<{BG|ÎU˝YܾEC8{/a4 t|3ryQ3TOtޫ!.e'-;-̂jV尐).wm62DWsBoDȩm"zK~-9F 60) j9= 3uLpNbرu[ܵ/}A~Sk: Ut.?snRgIJ VV Q_Or.if pTN Sѯ`eT"ƒ^|R1W"4\m$է @ꦏ+nzPe})ؚڱa kͽ|1|:~_D7 \a8st}mJ3 }M*"fûܳZ\G[/RInQ w}c,(ZWgE{ݴ:;J)wQf"~/جpsOo ekzZ2}\E3|0d6RLYHBC8l:qfr CJmd0NPۂGP'c+.\=2}^d%Xts"藼 4OI_T4}43w]Q2ג_GN M.iLpe[*FOS)Oit$bƌ7]l ID \Y ݣ{P,Y#e ʻ-69g #6a2 Tt}PYZo*A< !wVmH/RVRfX|Tdٙi¦z1Ae8TS5rъmN c/vZpNeW7qtEkFVrZ9{m=2hy2H<Ezyȕzn/xiz2O+ޝM_2!<*~Cm`v}'~e Ci+%I".C6i3a\n weOFōt"8^%*%&.ȶ{zƢ;%_1DyPm&Q\E~ewNNJ{33P"L>F+;] m?ImYC5O+rΎc.NՃeF͙V*m:,e /2i#a>isax7 ^+z%"~l w kitC Kh^ȷ?-w*C=XY}rt`R? pfW.׼CTJ1 5EejYoE7\hy:JYR'riqdb2JA~F_%DwQ x&kAg /YS88LkQ}8Q&S+J)HWUѣW\]ؾa q֭9;gPwR\MWl?4dmηrtú}#vkڿ}ݯh*UbYf4H@/S د!d vvWe/tV˃c2!+d*5f!.o|'ؒ+kHU,od4>u9WJ җd_h"L9Z>/Xy'+çsq=Q)NLn>»/09ޑ6޺i `VTP!U#v-91QkY[O.e$(3)yU]Ԓlj"Q,[(ge f31ܞ"929ǰk>׼ы@ݳlb ;a"B[qaI6V/'H~=R0 y*M3MVlr3'}* u-z"sK6ܽW4f}6zUeQ b|Dp6^=⦅ R W򞵭M ʋV:3XzS1 y1wSMX̿_ƃC-cBYA('Yaڀ.1'FW[n^v98VSۯ.7KG-X, 1ih^HU6wX}<ȃ{!(疓"Vp볒Ɋ؟ qNX[[Vw2.z9BOd'>B|› :W^LÆm蟼*IMǺ~A-2YK~6$6=|V 3,H@r1@DƢoLO ~mmӯY8j-Jq$IT.3\!DUu6~'|j6L#1;. K vA2dzhP Q6eL(;1pl)r + BuŪ{Su\3t.)L[3OR+8aJG?Z)+DdTHQۄR~z2G+3nIE#:HE+0M 68Ɏ̾=b1A[2h}afUE{be'47wYK4e#x!$|B[s?K>|!YG$w]6|ށlWM\ZsAM ADhwx\5րff%J?e{!2{C?ƌf(q8>~}T^Dw,4A*M9{ 81`%NfS (xG7-:B':ܒS`^ORi6%M7)4GUd\M-`ÈEMZ5:uPQdjkssr}R0OlHo͋*|&V[Z:j`v0iʇy!Z6Gwj$:[#ŷp+PdWzټ88p3_gV"Edq ^ 0 7LS鮛 } Th~BBR4X$14$ռ%2=m* "D$ K򾫝.ЩQگA*C/.ggXg%d%v!#MV؎%䬾1h|#} +m",d7eG픽F J?Nǘ7% 6s8oi{";ty\"%z2)#z2$U)8/ڍކYӌsr&4ۥ! !"YiƙR cp-E&FF5Y17Gqe"0Ba]y?;I[M.0O\clO҆JQ_I]ny9|@ Zydj6S7"nɢI!u^V \fVk_( tk ge|"h >3?ր5U#ZT {[PVR@nY}Ӷ3i,R籚DF#iov<^l\.IX$6ʣG0\P-6x fO1%j>NkCH? V/9mʆÔXPK֙:^m\~~5,Ŀ_fJ4M@CS* m,A,et< |_vr*"X`fP,Ĉ^/1XF/4L vhW]ƔҘU&*6 ԁIַZLA[gffhuf 3~\6LSӼPx7 5T~3@P Y\>E1HBQShZt[a,Z "0:iT?=]+R[œ"ED-͒ϙ6|fKw $2HxY(CUX6I Ay]#J~!Q#u?W'ᐪgqav۞:z_~ WHc'c 0ˮBzom⒔ VFb_SY n,Z[e r>{]tSb`.^q#:b #i`=è1b'q[pr5k/¶&hn-wA?uԹi\0$\5 NJB,$y1 ښ 0@ۗڡ{T !Y#2۴/.pYՏO9_m6 /m=]d\%[D P{R3g>ePٟ~Y$N5Wڙ%=煬\ȩNooMyInctyJcuq:5T <_EEJBYG28Ώ_]3iv/̓Mh/9AcBdwf"Xʊɫ#5Dm7\oF >!@{C뀿1,'E [r6̺zT~[T3Gd/) $NɱUn;N|ތwUk\A֜^g&)wK#GTr\i7]@mw;i7+ɮEQժ3v)^# ?P(tUyLasukG(|$ah{[v S#h7qjiCEj3i2ULbEm;F-ba_vB ؏J#xIMs4QV͞nYZa51,4S5n\k'Vì }^',וf3TŴj$h6٩ `3͞ ~ O95p8%gl =xaM]ӰtcG^ gB8?3!>14԰ pkP' Lmg ؜fºNMit*L@兰 Z~ $}l"<):4{k/ٯҌ7ȿ0''go-pkDU{)KglT^*_;b#UWi!έ ]{F&{bI`$OB,E f)-\]&+uOf!LyF+(_c=0^F˔ZQDh#$:*r':"af*dcM*WsDCRD#`DMC㩮mmmz]IB7`0k[;E%HIp7q M"[[ý¾j\_]3e[מuuVmT|֌3DL:Y`O8O_#UNƞ8׮v`;Ѥcd,`8>*~f.)ocwoȊ mJtcKG6Wǔbޟ:#ݞ&>m3^¸vZ`Zb5$ zCkߡ]u5bVUaXIQ3&C+څ|lCSz ¨]'Egِ7 rmo,1 S`+GB6/| ʲn\@Ҥ@!瑰|+"=}v Я#:FOk'F )ih=E \ ݎ[rLF[ŽhxXREd}Ѣ2D )ބCn6vjk q}w$*Og<1'VݎذX%R09,d4:/Xn]bu2S2*2jaEZz"Vj.8)J1J~1f{4(e=Uv2 ]6H ^feJNtnᨬOdC;k"/˹oG^g>9#t4Tgc*Wwmm_Nb0PyBP5;jm^ϑ4H5KP/o?qk&b K /zg~kbu9.F-dOÊAw.Oލyb'W>g #pl߷ӐN21{䩡2TS)bƱ<:m01Ƨ;xx|1+ڐևMeհ[؆Ӳ<:~ 8ZAIId.[B< k 7摒XUT4>Zzy'}pS]p_C\#1?A1}(mw>e͖Bo[Qq wr75ִ@&Xk/ft7w[<#4c&/M͘->ڣQœ]>Vm`-9/|Q^*UQ8=_˺΋F]̰B"oD@-b_IM8ci\83ISp~'l' yRTng֝xMQ%c 2O! iR3%>7JGL?!ec}ZPdj赩aNC㊖- ?Grn6񨦠,<AG^ҢNOrטF9/ӗ M4,Ca{DHDed9\d):Q{UA^tyǝ8}oQC%-]Clʊ^|j] Yu;D/_)GM_&^![ɏp9l#z/ A$|`aZ?S]i |&- `! TKEKŽ$y -ɰ?BJIu-AFs`н$qfGY}qƘ5L(qbvOuP=$]fwych%qhB=CLv8ΰ̷=Yqhf48#is,&aIygdhgs!y Vy3:0ՙzuf%]${?ElX 6kNBmz(;rnT7wlۺȠTOOhg` m_(9A+ep(sqvۍ{#eP$nlUَ|l3.=ö] ?qԫp Jܬ@qBYq/؏ܦ; &̳76Ca. ޲qbs-<Tuz$P]-:_ԜdCKzi^Qg=:i)$FuR}mٲ?tm{3GrfK8Yu恊 N9"DIזh NX'b|h㞔9v;\e:ipV}'GKN7O᳼}E+ `ў2⑗@ .euReevߡ:fsDyQ2;N@{Rv!V-}[@x#c[wN6V.O=KtixLeАQ>4vP'31"Yĉ <[Ii0s[1ffFg>?OGzk_r!?y&m14D|/'Mۑ3iDE70)&Ixf}6ZEe&qZƽ{ KwA :æ;?c1aF>u~NBݲ/Jσ&>P/n:i=n߉w8*L6ފq`2&qZ- B$w]ALZOOS"8u"sޢ,WQ6 ;J .k7ch֗ZZLqJ ٭'Sbd6ǸQj.M-U!voιWtAǟ'P + mH5l{]J+"fǯbJE޸O0 }B7ET@_J(&aZ %%BB(Şc{Pf  4yYWs##_N;cFxQGu:C3]ԛFv4 VbCVXk7/D} 7K(f0M!f"EnAXkZQ'~ 84;2g%KM6%vv3g{}Q$3]J'5$q{54A5Z+r+5@:/;p$K\w.=\;vQka}~ܵ8 0Jx,{t:a}*Sp̓-19QIxH)#|b|ߥ3}$.Df]mWv,FGYAڳʊOK ){ifչ蔈ar[ &`Qd13˖t7XѦuɘ~} **hVW%(wˠԌ$0 to9ዪ7T86BFhT. U8s@nq|i]q^,{bkڣRO`VKX˯+)R Tt; sb=ASmh%ygtaqv x,>‘3+%%D^Rhbw밫Ԟ]mg\TFAF1VAeP*YXvwUZl_Wt}u#[Ƚ3ӫțJGGup Z]$m;/Yq(Z"OMC8/tXiBP? e }dK!pKXy8v]h'uh͵MA`Ι!B {uC ֎ +6z C :xeZvb1PJcE73K| iҝ w7lqɭ&RjU|=R_1\ӎۗe4/o 1^maG3!LpniOhVtk v^_ uxOp5&0j.YJ距n뷖P%vO7`Ή%j;t81w@l.{}}46rw!^Yo?Ӯ!rĹB\(|}E+{:E423`OiwgysP ˕2&ڧ/Dg -ubݽyѣ9d0 X_1KpeW1 L`Oٸm!z]I&},eHwa>1|+M9Yb}SR[Q{9\FM~hr<W>Rz D, B21ERʃfdQ6[@]m.h?f&LzJ#^I6uN~:& XL4n=< d}tYREaDDv+ " ^$-F]؛ȥrsGy ͓|^5NmOOC \ޓbMp[)8*=oBҒ-yVY!2W}Fv:7(+̦{_zp[LƂl˥Oԯ<>9c*M/@PeΥtKuS-^ɲu2o@^Yqꄮ 9GOaq\lb"e=)5TC S%a5eԒ$Lb8 [[0S}l+wM~:,@O}bI%)G #4NIJg}5[%t1x՚._bB[J SbM_Wm 8&wV\P|M݋[M(ϗauh'sסsTAL\ h1Y:Tn[$|G\Z"1"_eDJ_bKaC)aGq/N#aPYS,F wY>/t ѴUM晰L5ܯOaw.8չ;':H:.oV_)V`Հ!ͣjQ(S(1 Kvӡr }*C{} 0)xd$O+> [{m t~Fk1q?,!wDF*g8ֻ ܵsY~x3,zM $ᷗ Mu, FSoþ'`CvD {V#c^wGIqw0(őxeq@:R^qgm掸5h쌁ZA{\5ZP˽DM5/rS?:iH0X(QpAg8@@[ ))7 qǔҿ) ؤ*y.!I*A$ͱ'#UE p-ۼzih>s|&rbv 6w*\Wfv80Bc('M,hgmo7bW)wRGeȵdMF$laF}ӌI"ێ^g u21TSڱMOɅ6'#ͯ}nr1Y>xjO&. =LKtw Ź*5yƛKq\6pkj!S*甌&@WRo&m]GW(YJTBg/&XMŖNCd/bkKI=tS0416zfXzCeQH0wBoaH!j z|]^G% jVȝ`xP,,nA*3LIe}O:!K̀q$= ȦG]u8Ĝ vlq(;?=8H*6 WU KH'.:bv[;HvUX߭35l$J1ͨaX\"}I'oAA/'UWF/j k_?t]x'QR(}]# -nw *lb GJqL)_c|Si<-oD6)2b \!-X ٓӶo`h endstream endobj 1176 0 obj <> endobj 1177 0 obj <> stream xڵct$ܺ-cWұm۶Umum۶ɗ~9pF(R"eZA;#3-#@FVЖV hbm`c``%%v:[ي:ycNXR84ydΆ*@F? ;'gZ#CO7H"lghaf3-JRVvnNVC[,@h Mv@UYTI $LIYX+DTD@5W'~3ʧo鲢** `,ldg? \nnntf.NtvftS1p9Z>q5 ca uMϤOIߚ 8\33 ` 4!@ @ov96 ]sg:^ކnyb.N߶ӿ*?6YA9I1QeZO}cKOz"2\6#' S&v66`'bɓk+[;7[njakby{zU[ E` `@wcsQ_3_' ^vSCk') pvtz{Oǿ`&ΟBKښ8eD߮?J9&v), (%bm-ghOJ3"#B+,,܁& "_vIgO ښY?qc2|4:9q?i TR4O `h)&VV㧦M(@Ogkwq9=MN-+Z nay)YCgG wmO]0~?I_Il!!;w/ZϽ2q2Y8Lk;M~2 ݁ư vA)!>Setg|RqSX"9;@f ; .]$" t;E]CY\DQl5:Հ %Nbc6iM]yNf^`-?kmR~T+P0BCeIB|1丗|k_}Fs_ɤGqs q ;ѠڋE?$˄Z@wGu|k!˝PkM O ʣdG8nQ kET هe lh`60i?j6|_Z4Y'$[r,!C;8 6eR}-ǶYH[M "#%.fy"cBJD!G3&"jە/>˾»c2#ezKú c=~b 4C$& Tx(&j6B"x؎d5L:^"9"SCt끣qgݒ'TB9zZl[! xoZO"bv3Da#IrVxl+ozߋ%hDv)!;1CU|‰40j\ߔoP mbF} }~G5=b,=s4$R[eIR0= y #()q͛ EJ6Ȫ$evgby f`%%XIދ^cQݢ3#!7hITڻA`qD6{Um_N݀J dJTZAoSCxv|&)]Q%|xPon0#||>`3)\p{YmT~J8 rG)hpFOt QRV].lc 7NS6pIK%mt;lGBjAWo׶K6/b;l΍鐑sf>0JxHY |ڶ!`$-g";oHfKE}z-ng0qߌﻵjy(rע_;G2v\=J,\o`-@ LuU~Gw'Jz.RsQ5]%.>-ԧ7QҿϙIw$ Ln )%TX)䄣瑻VeLJn9tT,SΤX+b( CK(2 *6_ӯm]t(ƶځͪm9/k,J_` MBB`u ̮Y-ZMMa"O৴\23衮ɠ먽<4eyE+Q.Qs16:p`YJ%r2&vg$̧͊c._IP.A:nx@]Ho  P/yzCY򰬜nBaܔQeo~p# c.ޤIHIO&݇BQ;{UWDИmd ,[4!)jw%7WDy*CIh6FxXVqf*grx ;cW{p5YZvAXP80&m%y)w]h Py,t)Q$E^={JE\d R$es'Ǘ\mH@C_JH@-ˀc8/;LlBpjwMҿ`D Y&U} |,.e{8ɛ< zT'vUZ#L{WuOga#Γ8UiM\+:~xHb<S>vdb"2jyKUbeZ<$[U~,c7 DXzG)vd-&jY~:l! aIt{"tdJzC|yeǁus@#=aQCR@ 4+8?Bd_po/:[JB{ZL)G109R )|8ٙk;iʵ|nGI RӠDXαko}-[9UhwE1gN#nF_`[: 0ܕvtf%a+-SwSѯ_1U$0 e٩! )F3]yHxғ^z4 =v= R(|̵Te;aF^S# ry)itDBs֚dСgcIymOsTFcGۓvʫDy6}ЎS4Dɛ-lrP a+Rq6L\DMHlqHm2|-6tD[*lFO+%b|k+\<NʸWK8&>[z ~4ur^+GANY9#mXF 3mXzث,m FT[*U1 IUB߇/(W*nM&Zؕ}|[$YB$6UN+W @chx~u7R-X^u`KizeMxey/M~%eSb<| _l1l)Rh,]bFV2JNQmer7)"̋3 &kދ?3x\8 F@:P7E_AmSEbxeT㞖jWʄמ3)#vْht`8Xa*[mjDYy3[>hBfGگ;ЋLQm=kb+P܋,[#: (}.N8=L}r_8Ān𢡊73/UB_"=kx@+cMO& }@킣LBym,Lnws]s|ݥZp by5,_lCz1A&Ka19 u [w=X%ONVʐZ.Π$LgdqI_g/t/fg7]͊I\Xm%*VσSKhZ6M f@ygكCE>ZҠ&$Hs9x*(f5: x͓"C"Sh*,P6ԈparDBuƞ>GoVop} m&56M#lAg9F}qwYJ%%SEP Q)G-W9 t't `cBqP<!Df oM7m qy[D-xM-z7rL}s n$6ZQza 3m 3_p&"|MSaB3cǜ/Vj^uX =^L9yYjm4PgER<8JjN!=dR|L _nJբ?4xTs!o_+!0 >aZH?q;Iw]tLn+uT i{[/$X &׏Zg"YFYR׏#) +3ZDlY޼42 ҫ2y}YX@e`Tƣ^Q^D]Bq{̊A_2s900aj+B;(@fq&V/GRn1sKfPTLMa[1&#~? ޜ{8LoUEl`GEwshw$8M 5kJDu|JާxHVҐڀP Wڸ ][@KpzY{uȚ\g~f-bDZ{5.ۇ$$LB \OC/r!xUMj}bg.곢5?g_{DwjǸAf QLlcmshFdWJes]Kkx&5K^pcW_SnEM 597TTI[FlE~.vƺKbѸsa҂y]i}orSۊkk6(T_1ݕOBgggqC؋U7S:c fA~bpkBwxlZ{7a2[K(m(EtRhFR< q1m[>Uۀ6p V/⡧7Br'|7(jy`aS/dDڇJcVZՎțdDuN^u^(iE:kec.+I-iT}ط]u.lBl oo!4&5e؏O &9#Tc2 ayKX>%xič#-.%LF{ޔ:hcNZa"͵Gj*4M{̈́]׭o5oVadCm.4Ɵ-_u~PxqAJ1p@?ٴ b[ޅ8+#d tMog)hRM-RAw$.'-\2l緩iׄ߉rD2(!N_`4E{b[T:ԝ^ɴT>L]/Ʋ 5CNeGy&R=z(PB;z@$unq Rd /cWxQ$ZlgN?'92/^ڳb)P*b@щ %4QӁNs~^CƓVC9? B.C\m[{BDTxOT{۞fjխB2>|$%fM]g|RWS.|BAWQ+axSC[nP֗ tm-Ij|YvI}FXYuźCEG %yFlW(JvmN㋝굙1r+K e8tv8f)xqwu<8i7 bM,ڛc# "4<}W@~fɀIP vkkQ[DyA';KaPeT'-(Dt_=% T߭/FfV Sw髼A1؜+\]LxLK(Eg#.'8KɁ/yX(O){M$?׸[8c6%k@WsOރ0 i+N|\aΪ;D1X Zް`8UGP,("MR!}ܑ tB a4/{fٛ7t<8x9 %u=B.7sQԂamY,R@.r~ηsXu4zN+2Y)@E ^iZ}(who?+ݤb$q-Lqs6HyY_A*vv^AVS5)&,x'=.>٨,ls.׋3لp Ԇٍb vGڄ<(AKu}qȑ1dbRۇ%79zT@jFHw )$a*s(ufڢ o<]Mjs9KF b+1F(_h߷5;) Yχ]&`-f,o1j;Yi&t~tp 0vse~aN OJlg|HKLhce=wC`J'tR? ( & 1'ISwbt7"l P[ޏ7Ev!9˸Ą`QkK.,[=OнifoT}TL{+ׇXUz`#ԛ]Od\uH70VܧٗwJrݐ*:vpr ^͛WXS^}Tfs2n1b&eۗ9/}7*1߄uc|d`(E3Ox;p*zd~BV5ļ:PUZMXlaɡXpuBDx©vغ}Sk9!λP_mdI!D=a,O"_ďQ;#`|?ԟC6ԯ)ħcjv?UpTKH+]V{}^Y5ik1CniY5I͊ro':Ylj^c[Y襂RBhW>Yh)Qԝ03xLF Aw;ܡFмKeYkHt~ fhXU;mgti8"5XR~l*i폨Za*Ғ"Z}~MJ;)_x(r57盆0=er,E+LvŅZbV<=i/+OA'2~E(DžrGF/\<͠_u[p*eDjGDLYՖÞ7: Tv xI}Yѝs^ f=B-yˆTTԂnL8gόR%֘o;CVٝN3s{mM+ %7 xK@֒a{|F`4U$H;PԞ~1q()J U -eRÐb 1kSꥱ;b[ƾߩp#eTvkNhݬf5tU\mY @F*ZQuGSs3U٢Aj3[W/ 67mKq܉4UAIEMRqiFqHCэAP25'+bP\;]MY&^0Ӫ.ﳃ9-o5rŜbc5uGycG:{XAR0@vM3OJ: $O# Ꭷ$KL#}k2<-}ݱN/3,PFɑOPE$,PQca{4q`VOUa:ӕ}uRt'I֔rze3Wz?&@,& + ^A[% UKәw1P-IJ?I5,-A!Viß|Pu[e5E.^b?0WxF"1{1~8m/x L2&8Lh)ɏW^MUL*q1-!-ɡH7#Z!PeA ?\B2.=1X=j{6bcj>|X{p6:8xVCP,_Tb'5If%CIEluF{oi%"f>8[dTAx=\k0Ĺq2fLY/7ĠtvⲖC;mŶz<\Z7;Я?3iŅt4[J=E YdDkjH-9g]h$V4Z*ČކtxnfIj%A:i-0Aeyk ,l#+2J~4?-P#'(E{7M::V% H-MG {A! ,Py9G?%4.`*r;0HGEU8_(9I0#nsL_p ;Y`::ST9'ZkHshWokvwJ{|)b]cE~v@$*DC c.SXOc]WkPLF =Gϱ=+N'se_p9&,ėܫo*ri| Yզ7C:i3;O"BGbU4U3z[v]%66~&*xD ^f8#03WwU(`d~LrnF gWx]סϼFBls56!n!Deef!@w0.;22ٲ$S,!CH6y;KIb[fA3ꆳx YlB4ha$!K /_<@;|z,@GXP;zO|ULG뮆,>y{3-j}* 4w6BwU ŏx2}Y\YKJg&pn~irʓ c@|<GA5h=Ȑw2I:1$*$: uy&>?A w5cº5HW J\5c y2jb1]ؠإ7Pw ZZ{͟Uf:JT/Qu/XbMӸoK9Y!::d5~.Zp]S8W3U*#jv(O@̝L@m0>|2aoHVn3 Ln l-h-L)j3 0z?yg*&=gl[sO\O9[@0L4gxח&)a%dx If~S!f`1 QLUh!^M#5*1y; 9jRO:]TIL C~hEP+Gð^Y4lNYp/Ȕ`0s-𿀧PܑLJ}1O2ņ 뛢E Tʌ%Cܻދ_Y?.^Hj].v\OqUcNC +fDo~,'S?ʜ!dV=| dzR { )=RJAPEl Q,s eN8daʁ *B3k~. G [ѱa"fpZqk?. ' l) \}A|^ɤdcxM$Ny|Y0NCs[}{6D) a<L&fy&OUYq8Jg؏#/ps!5\J &G}p׶Ub}F 2M̾Jf<0 W-F)qƋgm!4% hduht1;:~gC"bW5XhѶ;`ɮKЛ b-ݿel%B((Cb+o=+~Tq. ]p~m2{|LB][&zr0j Lw^;| hC"퇘cHy!JPG<goE9w=k웨2*%ɯ˩o<~[9cuGI>/Ϟu+LW@Hq]5N^fA˓HቘLӔ{6ERKɧ'QݨaIbE{5 F+\7%Qbs&pfCK*q[+GҬP߾lQ!RNF_}T{nE䱯5؄DvfRjHۘ, p0ә{irICB?f,dyql>3ZmruBN],^Boyd ezNE sGn Ovpp&h<&{&Q#|64Vne -Wl{_Io\Xqk69A?Ӓޖu{U ^>2,kr,-Tkw3Uq2ěܳP)w|aH\LMPpxʌy)uv:g_(^6}p\zZ j&ЃGoMy\. Uܪ^ JÙG$N\ӹ VnΰVILí;/oPʲHkOoPqa59Ь>f 3Q>mCb~PDnY bbdF0# afi7GN$V{ȒWMǣ52뗗9OmRjwCOKP]K̞uχf^Wh\I [pf, l%UU:> endobj 1137 0 obj <> endobj 1135 0 obj <> endobj 1117 0 obj <> endobj 1119 0 obj <> endobj 328 0 obj <> endobj 337 0 obj <> endobj 431 0 obj <> endobj 441 0 obj <> endobj 427 0 obj <> endobj 440 0 obj <> endobj 250 0 obj <> endobj 351 0 obj <> endobj 612 0 obj <> endobj 821 0 obj <> endobj 902 0 obj <> endobj 1105 0 obj <> endobj 1179 0 obj <> endobj 1180 0 obj <> endobj 202 0 obj <> endobj 198 0 obj <> endobj 194 0 obj <> endobj 190 0 obj <> endobj 186 0 obj <> endobj 182 0 obj <> endobj 178 0 obj <> endobj 174 0 obj <> endobj 170 0 obj <> endobj 166 0 obj <> endobj 162 0 obj <> endobj 158 0 obj <> endobj 154 0 obj <> endobj 150 0 obj <> endobj 146 0 obj <> endobj 142 0 obj <> endobj 138 0 obj <> endobj 134 0 obj <> endobj 130 0 obj <> endobj 126 0 obj <> endobj 122 0 obj <> endobj 118 0 obj <> endobj 114 0 obj <> endobj 110 0 obj <> endobj 106 0 obj <> endobj 102 0 obj <> endobj 98 0 obj <> endobj 94 0 obj <> endobj 90 0 obj <> endobj 86 0 obj <> endobj 82 0 obj <> endobj 78 0 obj <> endobj 74 0 obj <> endobj 70 0 obj <> endobj 66 0 obj <> endobj 62 0 obj <> endobj 58 0 obj <> endobj 54 0 obj <> endobj 50 0 obj <> endobj 46 0 obj <> endobj 42 0 obj <> endobj 38 0 obj <> endobj 34 0 obj <> endobj 30 0 obj <> endobj 26 0 obj <> endobj 22 0 obj <> endobj 18 0 obj <> endobj 14 0 obj <> endobj 10 0 obj <> endobj 6 0 obj <> endobj 1181 0 obj <> endobj 1182 0 obj <> endobj 1183 0 obj <> endobj 1184 0 obj <> endobj 1185 0 obj <> endobj 1186 0 obj <> endobj 1187 0 obj <> endobj 1188 0 obj <> endobj 1189 0 obj <> endobj 1190 0 obj <> endobj 1191 0 obj <> endobj 1192 0 obj <> endobj 1193 0 obj <> endobj 1194 0 obj <> endobj 1195 0 obj <> endobj 1196 0 obj <> endobj 1197 0 obj <> endobj 1198 0 obj <> endobj 1199 0 obj <> endobj 1200 0 obj <> endobj 1201 0 obj <> endobj 1202 0 obj <> endobj 1203 0 obj <> endobj 1204 0 obj << /Author(Philip Kime)/Title(biber)/Subject(A backend bibliography processor for biblatex)/Creator(LaTeX with hyperref package)/Producer(LuaTeX-0.80.0)/Keywords(biblatex, bibliography) /CreationDate (D:20160306193108+01'00')/ModDate (D:20160306193108+01'00')/Trapped/False/PTEX.Fullbanner (This is LuaTeX, Version beta-0.80.0 (TeX Live 2015) (rev 5238))>> endobj xref 0 1205 0000000000 65535 f 0000200506 00000 n 0000200526 00000 n 0000200546 00000 n 0000000015 00000 n 0000012853 00000 n 0000310089 00000 n 0000000056 00000 n 0000000092 00000 n 0000020097 00000 n 0000309974 00000 n 0000000133 00000 n 0000000165 00000 n 0000020141 00000 n 0000309905 00000 n 0000000212 00000 n 0000000237 00000 n 0000020186 00000 n 0000309824 00000 n 0000000284 00000 n 0000000316 00000 n 0000023050 00000 n 0000309743 00000 n 0000000363 00000 n 0000000403 00000 n 0000027555 00000 n 0000309662 00000 n 0000000450 00000 n 0000000477 00000 n 0000027600 00000 n 0000309581 00000 n 0000000524 00000 n 0000000551 00000 n 0000039372 00000 n 0000309500 00000 n 0000000598 00000 n 0000000629 00000 n 0000039416 00000 n 0000309431 00000 n 0000000676 00000 n 0000000712 00000 n 0000039460 00000 n 0000309311 00000 n 0000000754 00000 n 0000000777 00000 n 0000043007 00000 n 0000309208 00000 n 0000000824 00000 n 0000000867 00000 n 0000056444 00000 n 0000309139 00000 n 0000000919 00000 n 0000000963 00000 n 0000056489 00000 n 0000309058 00000 n 0000001015 00000 n 0000001055 00000 n 0000085287 00000 n 0000308977 00000 n 0000001107 00000 n 0000001149 00000 n 0000089959 00000 n 0000308896 00000 n 0000001201 00000 n 0000001238 00000 n 0000093671 00000 n 0000308815 00000 n 0000001290 00000 n 0000001328 00000 n 0000097660 00000 n 0000308734 00000 n 0000001380 00000 n 0000001428 00000 n 0000098024 00000 n 0000308653 00000 n 0000001480 00000 n 0000001518 00000 n 0000117697 00000 n 0000308572 00000 n 0000001570 00000 n 0000001607 00000 n 0000121947 00000 n 0000308503 00000 n 0000001659 00000 n 0000001705 00000 n 0000122222 00000 n 0000308422 00000 n 0000001752 00000 n 0000001779 00000 n 0000122267 00000 n 0000308306 00000 n 0000001826 00000 n 0000001873 00000 n 0000122312 00000 n 0000308237 00000 n 0000001925 00000 n 0000001957 00000 n 0000125111 00000 n 0000308168 00000 n 0000002009 00000 n 0000002041 00000 n 0000125156 00000 n 0000308083 00000 n 0000002089 00000 n 0000002117 00000 n 0000125202 00000 n 0000307961 00000 n 0000002165 00000 n 0000002212 00000 n 0000133133 00000 n 0000307900 00000 n 0000002265 00000 n 0000002294 00000 n 0000135822 00000 n 0000307778 00000 n 0000002342 00000 n 0000002380 00000 n 0000139884 00000 n 0000307704 00000 n 0000002433 00000 n 0000002474 00000 n 0000140252 00000 n 0000307617 00000 n 0000002527 00000 n 0000002568 00000 n 0000144402 00000 n 0000307543 00000 n 0000002621 00000 n 0000002650 00000 n 0000147721 00000 n 0000307457 00000 n 0000002698 00000 n 0000002743 00000 n 0000147767 00000 n 0000307371 00000 n 0000002791 00000 n 0000002830 00000 n 0000152118 00000 n 0000307285 00000 n 0000002878 00000 n 0000002932 00000 n 0000152164 00000 n 0000307199 00000 n 0000002981 00000 n 0000003026 00000 n 0000152210 00000 n 0000307113 00000 n 0000003075 00000 n 0000003118 00000 n 0000155235 00000 n 0000307004 00000 n 0000003167 00000 n 0000003197 00000 n 0000178837 00000 n 0000306930 00000 n 0000003251 00000 n 0000003316 00000 n 0000178884 00000 n 0000306856 00000 n 0000003370 00000 n 0000003420 00000 n 0000178931 00000 n 0000306733 00000 n 0000003463 00000 n 0000003492 00000 n 0000182120 00000 n 0000306659 00000 n 0000003540 00000 n 0000003574 00000 n 0000182167 00000 n 0000306572 00000 n 0000003622 00000 n 0000003663 00000 n 0000185908 00000 n 0000306449 00000 n 0000003711 00000 n 0000003742 00000 n 0000185955 00000 n 0000306375 00000 n 0000003795 00000 n 0000003819 00000 n 0000189280 00000 n 0000306288 00000 n 0000003872 00000 n 0000003900 00000 n 0000189327 00000 n 0000306214 00000 n 0000003953 00000 n 0000003984 00000 n 0000189374 00000 n 0000306104 00000 n 0000004032 00000 n 0000004061 00000 n 0000196716 00000 n 0000306043 00000 n 0000004114 00000 n 0000004157 00000 n 0000200274 00000 n 0000305932 00000 n 0000004201 00000 n 0000004230 00000 n 0000200321 00000 n 0000305871 00000 n 0000004278 00000 n 0000004343 00000 n 0000007121 00000 n 0000007546 00000 n 0000007727 00000 n 0000008114 00000 n 0000008253 00000 n 0000008393 00000 n 0000008538 00000 n 0000008683 00000 n 0000008828 00000 n 0000008973 00000 n 0000009118 00000 n 0000009263 00000 n 0000009408 00000 n 0000009547 00000 n 0000009690 00000 n 0000009834 00000 n 0000010123 00000 n 0000010268 00000 n 0000010412 00000 n 0000010555 00000 n 0000010699 00000 n 0000010844 00000 n 0000011133 00000 n 0000011278 00000 n 0000011424 00000 n 0000011570 00000 n 0000011710 00000 n 0000011854 00000 n 0000011998 00000 n 0000012142 00000 n 0000012284 00000 n 0000012425 00000 n 0000012897 00000 n 0000004389 00000 n 0000012715 00000 n 0000012761 00000 n 0000248645 00000 n 0000007921 00000 n 0000012807 00000 n 0000242078 00000 n 0000234371 00000 n 0000009978 00000 n 0000010989 00000 n 0000223301 00000 n 0000012570 00000 n 0000304886 00000 n 0000007247 00000 n 0000015774 00000 n 0000015924 00000 n 0000016120 00000 n 0000015613 00000 n 0000013046 00000 n 0000016074 00000 n 0000213243 00000 n 0000015739 00000 n 0000019626 00000 n 0000019770 00000 n 0000019912 00000 n 0000022173 00000 n 0000022595 00000 n 0000022315 00000 n 0000022767 00000 n 0000020277 00000 n 0000019457 00000 n 0000016269 00000 n 0000020051 00000 n 0000020231 00000 n 0000019583 00000 n 0000022457 00000 n 0000026737 00000 n 0000027306 00000 n 0000023187 00000 n 0000021988 00000 n 0000020426 00000 n 0000022958 00000 n 0000023004 00000 n 0000023095 00000 n 0000023141 00000 n 0000022114 00000 n 0000026879 00000 n 0000027021 00000 n 0000027160 00000 n 0000027783 00000 n 0000026552 00000 n 0000023324 00000 n 0000027509 00000 n 0000027645 00000 n 0000027691 00000 n 0000027737 00000 n 0000026678 00000 n 0000031191 00000 n 0000031340 00000 n 0000031479 00000 n 0000031621 00000 n 0000031763 00000 n 0000032130 00000 n 0000031006 00000 n 0000027920 00000 n 0000031900 00000 n 0000031946 00000 n 0000031992 00000 n 0000032038 00000 n 0000032084 00000 n 0000031132 00000 n 0000035864 00000 n 0000035910 00000 n 0000035707 00000 n 0000032255 00000 n 0000035818 00000 n 0000039505 00000 n 0000039123 00000 n 0000036035 00000 n 0000039234 00000 n 0000039280 00000 n 0000039326 00000 n 0000042404 00000 n 0000042545 00000 n 0000042684 00000 n 0000042823 00000 n 0000043098 00000 n 0000042227 00000 n 0000039654 00000 n 0000042961 00000 n 0000303914 00000 n 0000043052 00000 n 0000042353 00000 n 0000047724 00000 n 0000044468 00000 n 0000044514 00000 n 0000044311 00000 n 0000043247 00000 n 0000044422 00000 n 0000304068 00000 n 0000048184 00000 n 0000047567 00000 n 0000044640 00000 n 0000047678 00000 n 0000047770 00000 n 0000047816 00000 n 0000047862 00000 n 0000047908 00000 n 0000047954 00000 n 0000048000 00000 n 0000048046 00000 n 0000048092 00000 n 0000048138 00000 n 0000305030 00000 n 0000052050 00000 n 0000049735 00000 n 0000048321 00000 n 0000049846 00000 n 0000049892 00000 n 0000049938 00000 n 0000049984 00000 n 0000050030 00000 n 0000050076 00000 n 0000050122 00000 n 0000050168 00000 n 0000050214 00000 n 0000050260 00000 n 0000050306 00000 n 0000050352 00000 n 0000050398 00000 n 0000050444 00000 n 0000209055 00000 n 0000050490 00000 n 0000050536 00000 n 0000050581 00000 n 0000050627 00000 n 0000050672 00000 n 0000050718 00000 n 0000050763 00000 n 0000050809 00000 n 0000050855 00000 n 0000050901 00000 n 0000050947 00000 n 0000050993 00000 n 0000051039 00000 n 0000051085 00000 n 0000051131 00000 n 0000051177 00000 n 0000051223 00000 n 0000051269 00000 n 0000051315 00000 n 0000051361 00000 n 0000051407 00000 n 0000051453 00000 n 0000051499 00000 n 0000051545 00000 n 0000051591 00000 n 0000051637 00000 n 0000051683 00000 n 0000051729 00000 n 0000051775 00000 n 0000051821 00000 n 0000051867 00000 n 0000051913 00000 n 0000051959 00000 n 0000052004 00000 n 0000055479 00000 n 0000055629 00000 n 0000055774 00000 n 0000055919 00000 n 0000056069 00000 n 0000056534 00000 n 0000055294 00000 n 0000052188 00000 n 0000056214 00000 n 0000056260 00000 n 0000056306 00000 n 0000056352 00000 n 0000056398 00000 n 0000205027 00000 n 0000055420 00000 n 0000059329 00000 n 0000060161 00000 n 0000059176 00000 n 0000056684 00000 n 0000059474 00000 n 0000059520 00000 n 0000059566 00000 n 0000059612 00000 n 0000304562 00000 n 0000059658 00000 n 0000059704 00000 n 0000059749 00000 n 0000304224 00000 n 0000059795 00000 n 0000059840 00000 n 0000059886 00000 n 0000059931 00000 n 0000059977 00000 n 0000060023 00000 n 0000060069 00000 n 0000060115 00000 n 0000304724 00000 n 0000304393 00000 n 0000059302 00000 n 0000063830 00000 n 0000062480 00000 n 0000060359 00000 n 0000062591 00000 n 0000062637 00000 n 0000062683 00000 n 0000062729 00000 n 0000062775 00000 n 0000062821 00000 n 0000062867 00000 n 0000062913 00000 n 0000062959 00000 n 0000063005 00000 n 0000063051 00000 n 0000063097 00000 n 0000063143 00000 n 0000063189 00000 n 0000063235 00000 n 0000063281 00000 n 0000063327 00000 n 0000063373 00000 n 0000063419 00000 n 0000063465 00000 n 0000063510 00000 n 0000063556 00000 n 0000063601 00000 n 0000063647 00000 n 0000063692 00000 n 0000063738 00000 n 0000063784 00000 n 0000067663 00000 n 0000067506 00000 n 0000063955 00000 n 0000067617 00000 n 0000071537 00000 n 0000071012 00000 n 0000067788 00000 n 0000071123 00000 n 0000071169 00000 n 0000071215 00000 n 0000071261 00000 n 0000071307 00000 n 0000071353 00000 n 0000071399 00000 n 0000071445 00000 n 0000071491 00000 n 0000075142 00000 n 0000073606 00000 n 0000071675 00000 n 0000073717 00000 n 0000073763 00000 n 0000073809 00000 n 0000073855 00000 n 0000073901 00000 n 0000073947 00000 n 0000073993 00000 n 0000074039 00000 n 0000074085 00000 n 0000074131 00000 n 0000074177 00000 n 0000074223 00000 n 0000074269 00000 n 0000074315 00000 n 0000074361 00000 n 0000074407 00000 n 0000074453 00000 n 0000074499 00000 n 0000074544 00000 n 0000074590 00000 n 0000074636 00000 n 0000074682 00000 n 0000074728 00000 n 0000074774 00000 n 0000074820 00000 n 0000074866 00000 n 0000074912 00000 n 0000074958 00000 n 0000075004 00000 n 0000075050 00000 n 0000075096 00000 n 0000078496 00000 n 0000076963 00000 n 0000075280 00000 n 0000077074 00000 n 0000077120 00000 n 0000077166 00000 n 0000077212 00000 n 0000077258 00000 n 0000077304 00000 n 0000077350 00000 n 0000077396 00000 n 0000077442 00000 n 0000077488 00000 n 0000077534 00000 n 0000077580 00000 n 0000077626 00000 n 0000077672 00000 n 0000077718 00000 n 0000077764 00000 n 0000077810 00000 n 0000077856 00000 n 0000077902 00000 n 0000077948 00000 n 0000077994 00000 n 0000078040 00000 n 0000078086 00000 n 0000078132 00000 n 0000078177 00000 n 0000078222 00000 n 0000078268 00000 n 0000078312 00000 n 0000078358 00000 n 0000078404 00000 n 0000078450 00000 n 0000085095 00000 n 0000081990 00000 n 0000080594 00000 n 0000078634 00000 n 0000080705 00000 n 0000080751 00000 n 0000080797 00000 n 0000080843 00000 n 0000080889 00000 n 0000080935 00000 n 0000080981 00000 n 0000081027 00000 n 0000081073 00000 n 0000081119 00000 n 0000081165 00000 n 0000081211 00000 n 0000081257 00000 n 0000081303 00000 n 0000081349 00000 n 0000081395 00000 n 0000081440 00000 n 0000081486 00000 n 0000081532 00000 n 0000081578 00000 n 0000081624 00000 n 0000081670 00000 n 0000081715 00000 n 0000081761 00000 n 0000081807 00000 n 0000081853 00000 n 0000081899 00000 n 0000081945 00000 n 0000086206 00000 n 0000084942 00000 n 0000082127 00000 n 0000085241 00000 n 0000085332 00000 n 0000085378 00000 n 0000085424 00000 n 0000085470 00000 n 0000085516 00000 n 0000085562 00000 n 0000085608 00000 n 0000085654 00000 n 0000085700 00000 n 0000085746 00000 n 0000085792 00000 n 0000085838 00000 n 0000085884 00000 n 0000085930 00000 n 0000085976 00000 n 0000086022 00000 n 0000086068 00000 n 0000086114 00000 n 0000086160 00000 n 0000305174 00000 n 0000085068 00000 n 0000088850 00000 n 0000090004 00000 n 0000088697 00000 n 0000086369 00000 n 0000088996 00000 n 0000089042 00000 n 0000089088 00000 n 0000089134 00000 n 0000089180 00000 n 0000089226 00000 n 0000089272 00000 n 0000089318 00000 n 0000089364 00000 n 0000089410 00000 n 0000089456 00000 n 0000089502 00000 n 0000089548 00000 n 0000089594 00000 n 0000089640 00000 n 0000089685 00000 n 0000089731 00000 n 0000089776 00000 n 0000089822 00000 n 0000089867 00000 n 0000089913 00000 n 0000088823 00000 n 0000092981 00000 n 0000093124 00000 n 0000096970 00000 n 0000097256 00000 n 0000093992 00000 n 0000092820 00000 n 0000090154 00000 n 0000093303 00000 n 0000093349 00000 n 0000093395 00000 n 0000093441 00000 n 0000093487 00000 n 0000093533 00000 n 0000093579 00000 n 0000093625 00000 n 0000093716 00000 n 0000093762 00000 n 0000093808 00000 n 0000093854 00000 n 0000093900 00000 n 0000093946 00000 n 0000092946 00000 n 0000097113 00000 n 0000097435 00000 n 0000101356 00000 n 0000101502 00000 n 0000098160 00000 n 0000096793 00000 n 0000094155 00000 n 0000097614 00000 n 0000097705 00000 n 0000097751 00000 n 0000097796 00000 n 0000097842 00000 n 0000097887 00000 n 0000097933 00000 n 0000097978 00000 n 0000098068 00000 n 0000098114 00000 n 0000096919 00000 n 0000102710 00000 n 0000101195 00000 n 0000098310 00000 n 0000101652 00000 n 0000101698 00000 n 0000101744 00000 n 0000101790 00000 n 0000101836 00000 n 0000101882 00000 n 0000101928 00000 n 0000101974 00000 n 0000102020 00000 n 0000102066 00000 n 0000102112 00000 n 0000102158 00000 n 0000102204 00000 n 0000102250 00000 n 0000102296 00000 n 0000102342 00000 n 0000102388 00000 n 0000102434 00000 n 0000102480 00000 n 0000102526 00000 n 0000102572 00000 n 0000102618 00000 n 0000102664 00000 n 0000101321 00000 n 0000106485 00000 n 0000105685 00000 n 0000102848 00000 n 0000105796 00000 n 0000105842 00000 n 0000105888 00000 n 0000105934 00000 n 0000105980 00000 n 0000106026 00000 n 0000106072 00000 n 0000106118 00000 n 0000106164 00000 n 0000106209 00000 n 0000106255 00000 n 0000106301 00000 n 0000106347 00000 n 0000106393 00000 n 0000106439 00000 n 0000110371 00000 n 0000109846 00000 n 0000106610 00000 n 0000109957 00000 n 0000110003 00000 n 0000110049 00000 n 0000110095 00000 n 0000110141 00000 n 0000110187 00000 n 0000110233 00000 n 0000110279 00000 n 0000110325 00000 n 0000113885 00000 n 0000112170 00000 n 0000110496 00000 n 0000112281 00000 n 0000112327 00000 n 0000112373 00000 n 0000112419 00000 n 0000112465 00000 n 0000112511 00000 n 0000112557 00000 n 0000112603 00000 n 0000112649 00000 n 0000112695 00000 n 0000112737 00000 n 0000112783 00000 n 0000112829 00000 n 0000112875 00000 n 0000112921 00000 n 0000112967 00000 n 0000113013 00000 n 0000113059 00000 n 0000113105 00000 n 0000113151 00000 n 0000113197 00000 n 0000113243 00000 n 0000113289 00000 n 0000113335 00000 n 0000113381 00000 n 0000113427 00000 n 0000113473 00000 n 0000113519 00000 n 0000113565 00000 n 0000113611 00000 n 0000113657 00000 n 0000113703 00000 n 0000113749 00000 n 0000113794 00000 n 0000113840 00000 n 0000116915 00000 n 0000117053 00000 n 0000117196 00000 n 0000118105 00000 n 0000116746 00000 n 0000114023 00000 n 0000117375 00000 n 0000117421 00000 n 0000117467 00000 n 0000117513 00000 n 0000117559 00000 n 0000117605 00000 n 0000117651 00000 n 0000117742 00000 n 0000117788 00000 n 0000117834 00000 n 0000117880 00000 n 0000117926 00000 n 0000117971 00000 n 0000118017 00000 n 0000118059 00000 n 0000116872 00000 n 0000119166 00000 n 0000119212 00000 n 0000119009 00000 n 0000118268 00000 n 0000119120 00000 n 0000121252 00000 n 0000121388 00000 n 0000122357 00000 n 0000121091 00000 n 0000119337 00000 n 0000121533 00000 n 0000121579 00000 n 0000121625 00000 n 0000121671 00000 n 0000121717 00000 n 0000121763 00000 n 0000121809 00000 n 0000121855 00000 n 0000121901 00000 n 0000121992 00000 n 0000122038 00000 n 0000122084 00000 n 0000122130 00000 n 0000122176 00000 n 0000305318 00000 n 0000121217 00000 n 0000125248 00000 n 0000124954 00000 n 0000122531 00000 n 0000125065 00000 n 0000128410 00000 n 0000128554 00000 n 0000128744 00000 n 0000128249 00000 n 0000125409 00000 n 0000128698 00000 n 0000128375 00000 n 0000132527 00000 n 0000132670 00000 n 0000133224 00000 n 0000132358 00000 n 0000128881 00000 n 0000133087 00000 n 0000133179 00000 n 0000132878 00000 n 0000132484 00000 n 0000136052 00000 n 0000135665 00000 n 0000133373 00000 n 0000135776 00000 n 0000135868 00000 n 0000135914 00000 n 0000135960 00000 n 0000136006 00000 n 0000139539 00000 n 0000139688 00000 n 0000140297 00000 n 0000139378 00000 n 0000136201 00000 n 0000139838 00000 n 0000139930 00000 n 0000139976 00000 n 0000140022 00000 n 0000140068 00000 n 0000140114 00000 n 0000140160 00000 n 0000140206 00000 n 0000139504 00000 n 0000143713 00000 n 0000143856 00000 n 0000144493 00000 n 0000143544 00000 n 0000140434 00000 n 0000144356 00000 n 0000144447 00000 n 0000144106 00000 n 0000143670 00000 n 0000147485 00000 n 0000147813 00000 n 0000147332 00000 n 0000144630 00000 n 0000147675 00000 n 0000147458 00000 n 0000151619 00000 n 0000151905 00000 n 0000151762 00000 n 0000152348 00000 n 0000151450 00000 n 0000147950 00000 n 0000152072 00000 n 0000152256 00000 n 0000152302 00000 n 0000151576 00000 n 0000155005 00000 n 0000155281 00000 n 0000154852 00000 n 0000152498 00000 n 0000155143 00000 n 0000155189 00000 n 0000154978 00000 n 0000157365 00000 n 0000157162 00000 n 0000155418 00000 n 0000157273 00000 n 0000157319 00000 n 0000305462 00000 n 0000160675 00000 n 0000160013 00000 n 0000157490 00000 n 0000160124 00000 n 0000160170 00000 n 0000160216 00000 n 0000160261 00000 n 0000160307 00000 n 0000160353 00000 n 0000160399 00000 n 0000160445 00000 n 0000160491 00000 n 0000160537 00000 n 0000160583 00000 n 0000160629 00000 n 0000164111 00000 n 0000162396 00000 n 0000160800 00000 n 0000162507 00000 n 0000162553 00000 n 0000162599 00000 n 0000162645 00000 n 0000162691 00000 n 0000162737 00000 n 0000162783 00000 n 0000162829 00000 n 0000162874 00000 n 0000162920 00000 n 0000162965 00000 n 0000163011 00000 n 0000163057 00000 n 0000163103 00000 n 0000163149 00000 n 0000163195 00000 n 0000163241 00000 n 0000163287 00000 n 0000163332 00000 n 0000163378 00000 n 0000163423 00000 n 0000163469 00000 n 0000163514 00000 n 0000163560 00000 n 0000163605 00000 n 0000163651 00000 n 0000163697 00000 n 0000163743 00000 n 0000163789 00000 n 0000163835 00000 n 0000163881 00000 n 0000163927 00000 n 0000163973 00000 n 0000164019 00000 n 0000164065 00000 n 0000166769 00000 n 0000168017 00000 n 0000166616 00000 n 0000164236 00000 n 0000166913 00000 n 0000166959 00000 n 0000167005 00000 n 0000167051 00000 n 0000167097 00000 n 0000167143 00000 n 0000167189 00000 n 0000167235 00000 n 0000167281 00000 n 0000167327 00000 n 0000167373 00000 n 0000167419 00000 n 0000167465 00000 n 0000167511 00000 n 0000167557 00000 n 0000167603 00000 n 0000167649 00000 n 0000167695 00000 n 0000167741 00000 n 0000167787 00000 n 0000167833 00000 n 0000167879 00000 n 0000167925 00000 n 0000167971 00000 n 0000166742 00000 n 0000171443 00000 n 0000169374 00000 n 0000168142 00000 n 0000169485 00000 n 0000169531 00000 n 0000169577 00000 n 0000169623 00000 n 0000169669 00000 n 0000169715 00000 n 0000169761 00000 n 0000169807 00000 n 0000169853 00000 n 0000169899 00000 n 0000169945 00000 n 0000169991 00000 n 0000170037 00000 n 0000170084 00000 n 0000170131 00000 n 0000170178 00000 n 0000170224 00000 n 0000170271 00000 n 0000170318 00000 n 0000170365 00000 n 0000170412 00000 n 0000170459 00000 n 0000170506 00000 n 0000170553 00000 n 0000170600 00000 n 0000170647 00000 n 0000170694 00000 n 0000170740 00000 n 0000170787 00000 n 0000170833 00000 n 0000170880 00000 n 0000170926 00000 n 0000170973 00000 n 0000171020 00000 n 0000171067 00000 n 0000171114 00000 n 0000171161 00000 n 0000171208 00000 n 0000171255 00000 n 0000171302 00000 n 0000171349 00000 n 0000171396 00000 n 0000173814 00000 n 0000173958 00000 n 0000178336 00000 n 0000178487 00000 n 0000174768 00000 n 0000173646 00000 n 0000171568 00000 n 0000174096 00000 n 0000174144 00000 n 0000174192 00000 n 0000174240 00000 n 0000174288 00000 n 0000174336 00000 n 0000174384 00000 n 0000174432 00000 n 0000174480 00000 n 0000174528 00000 n 0000174576 00000 n 0000174624 00000 n 0000174672 00000 n 0000174720 00000 n 0000173776 00000 n 0000178638 00000 n 0000181926 00000 n 0000178978 00000 n 0000178159 00000 n 0000174919 00000 n 0000178789 00000 n 0000178289 00000 n 0000182214 00000 n 0000181767 00000 n 0000179116 00000 n 0000182072 00000 n 0000181897 00000 n 0000184807 00000 n 0000184951 00000 n 0000185094 00000 n 0000185237 00000 n 0000185381 00000 n 0000185525 00000 n 0000185668 00000 n 0000186098 00000 n 0000184594 00000 n 0000182364 00000 n 0000185860 00000 n 0000186002 00000 n 0000186050 00000 n 0000184724 00000 n 0000200698 00000 n 0000200665 00000 n 0000200632 00000 n 0000200599 00000 n 0000188694 00000 n 0000189088 00000 n 0000189469 00000 n 0000188517 00000 n 0000186236 00000 n 0000189232 00000 n 0000188891 00000 n 0000189421 00000 n 0000188647 00000 n 0000193060 00000 n 0000193346 00000 n 0000193202 00000 n 0000193524 00000 n 0000196301 00000 n 0000196445 00000 n 0000193935 00000 n 0000192873 00000 n 0000189607 00000 n 0000193696 00000 n 0000193744 00000 n 0000193792 00000 n 0000193839 00000 n 0000193887 00000 n 0000305611 00000 n 0000193004 00000 n 0000196811 00000 n 0000196132 00000 n 0000194061 00000 n 0000196668 00000 n 0000196763 00000 n 0000196263 00000 n 0000200368 00000 n 0000200111 00000 n 0000196949 00000 n 0000200226 00000 n 0000303801 00000 n 0000200731 00000 n 0000303857 00000 n 0000200757 00000 n 0000200783 00000 n 0000200809 00000 n 0000200835 00000 n 0000200980 00000 n 0000201078 00000 n 0000204309 00000 n 0000204533 00000 n 0000205173 00000 n 0000205365 00000 n 0000205496 00000 n 0000205591 00000 n 0000208344 00000 n 0000208573 00000 n 0000209204 00000 n 0000303691 00000 n 0000209399 00000 n 0000303628 00000 n 0000209745 00000 n 0000209771 00000 n 0000209885 00000 n 0000209980 00000 n 0000212539 00000 n 0000212764 00000 n 0000213386 00000 n 0000213575 00000 n 0000213993 00000 n 0000214101 00000 n 0000222579 00000 n 0000222806 00000 n 0000223450 00000 n 0000223645 00000 n 0000224101 00000 n 0000224226 00000 n 0000233581 00000 n 0000233802 00000 n 0000234513 00000 n 0000234701 00000 n 0000234977 00000 n 0000235080 00000 n 0000241352 00000 n 0000241577 00000 n 0000242223 00000 n 0000242414 00000 n 0000242685 00000 n 0000242794 00000 n 0000247858 00000 n 0000248079 00000 n 0000248786 00000 n 0000248973 00000 n 0000262642 00000 n 0000262908 00000 n 0000266013 00000 n 0000266234 00000 n 0000269270 00000 n 0000269492 00000 n 0000287754 00000 n 0000287973 00000 n 0000303409 00000 n 0000305702 00000 n 0000305801 00000 n 0000310157 00000 n 0000310935 00000 n 0000311720 00000 n 0000312596 00000 n 0000313499 00000 n 0000314400 00000 n 0000315308 00000 n 0000316233 00000 n 0000317130 00000 n 0000318048 00000 n 0000318964 00000 n 0000319879 00000 n 0000320778 00000 n 0000321679 00000 n 0000322604 00000 n 0000323553 00000 n 0000324486 00000 n 0000325230 00000 n 0000325869 00000 n 0000326665 00000 n 0000327467 00000 n 0000327706 00000 n 0000327744 00000 n 0000327869 00000 n trailer < <193CB707933C8FC2914FA502AB4DEB20>]>> startxref 328244 %%EOF biblatex-biber-2.4/doc/biber.tex000444000765000024 37353712667073765 17134 0ustar00philkimestaff000000000000% To make this maximally compatible with older PDF readers, it uses % PDF 1.4 \pdfminorversion=4 \documentclass{ltxdockit} \usepackage{btxdockit} \usepackage[british]{babel} \usepackage[strict=true,autostyle=true]{csquotes} \usepackage{ifthen} \usepackage{fontspec} \usepackage{tikz} \usepackage{graphicx} \usepackage{booktabs} \usepackage{fixfoot} \usepackage{color} \usepackage{listings} \usepackage{metalogo} \usepackage{colortbl} \usepackage[retainmissing]{MnSymbol} \setmainfont[Ligatures=TeX]{CMU Serif} \setsansfont[Ligatures=TeX]{CMU Sans Serif} \setmonofont{CMU Typewriter Text} \def\BibLaTeX{\textsc{Bib}\latex} \def\BibTeX{\textsc{Bib}\kern-.08em \TeX} \renewcommand{\labelitemii}{$\circ$} \newcommand*{\biber}{Biber\xspace} \newcommand*{\biblatex}{Biblatex\xspace} \MakeAutoQuote{«}{»} \gdef\biberversion{2.4} % BIBER VERSION \gdef\biblatexversion{3.3} % BIBLATEX VERSION % colour for tables \definecolor{Gray}{gray}{0.85} \newcolumntype{a}{>{\columncolor{Gray}}l} % Set up tikz things \usetikzlibrary{shapes.geometric} \usetikzlibrary{arrows} \usetikzlibrary{fit} \usetikzlibrary{calc} \tikzstyle{file} = [rectangle, black, very thick, draw=blue, fill=blue!20, minimum width=6em, minimum height=3em, align=center] \tikzstyle{funit} = [rectangle, rounded corners=1ex, black, very thick, shape border rotate=-90, draw=green, fill=green!20, minimum size=3em, align=center] % colours for the .dot examples \xdefinecolor{centry}{HTML}{A0D0FF} \xdefinecolor{ncentry}{HTML}{DEEFFF} \xdefinecolor{doentry}{HTML}{FDFFD9} \xdefinecolor{section}{HTML}{FCE3FA} \xdefinecolor{set}{HTML}{E3DADC} \xdefinecolor{related}{HTML}{AD1741} \xdefinecolor{clone}{HTML}{AD1741} \xdefinecolor{crossref}{HTML}{7D7879} \xdefinecolor{xref}{HTML}{7D7879} \xdefinecolor{xdata}{HTML}{2CA314} \DeclareFixedFootnote{\tpb}{Binary maintained by third party. See README in binary download directory for this platform for support/contact details. Usually, the binary maintainer is also the binary build provider for \TeX Live.} \titlepage{% title={biber}, subtitle={A backend bibliography processor for biblatex}, url={http://biblatex-biber.sourceforge.net}, author={Philip Kime, François Charette}, email={Philip@kime.org.uk, firmicus@ankabut.net}, revision={biber \biberversion\ (biblatex \biblatexversion)}, date={\today}} \hypersetup{% pdftitle={biber}, pdfsubject={A backend bibliography processor for biblatex}, pdfauthor={Philip Kime}, pdfkeywords={biblatex, bibliography}} % Control list spacing \usepackage{enumitem} \setdescription{noitemsep} \setenumerate{noitemsep} \setitemize{noitemsep} \def\biberex#1{\hbox{\hspace{-4em}\texttt{\small \detokenize{#1}}}} \begin{document} \definecolor{grey}{rgb}{0.7,0.7,0.7} \printtitlepage \tableofcontents \section{Important Changes}\label{special} Please see the \verb+Changes+ file which accompanies \biber\ for the details on changes in each version. This section is just for important things like incompatible changes which users should be aware of. \minisec{1.9} \biber no longer checks the environment for locales to use for sorting. This was always rather against the spirit of \tex since it means that the same document might look different when compiled by different people. However, \biblatex now passes Babel/Polyglossia language identifiers (or real locale identifiers if you prefer) in the \file{.bcf} and \biber can use these to set the sorting locale globally or on a per-sortscheme basis. This is better than using environment variables since Babel/Polyglossia are more \latex relevant language environments anyway. \minisec{1.8} Various option name changes. Old names are retained for backwards compatibility. See the output of the \opt{--help} option. \minisec{1.0} The \opt{--validate-structure} option is now called \opt{--validate-datamodel} \minisec{0.9.9} The output format option \opt{--graph} has been moved to a new option \opt{--output-format}. The option \opt{--graph} should now be specified as \opt{--output-format=dot} and the \linebreak\opt{--dot-include} option should be used to specify the elements to include in the DOT output. For example: \begin{verbatim} biber --graph=section,field \end{verbatim} \noindent is now: \begin{verbatim} biber --output-format=dot --dot-include=section,field \end{verbatim} \minisec{1.8} \textcolor{red}{Several option names have changed}. Several options have changed names to facilitate better semantic classification of options. The previous names are supported as legacy aliases. See the \verb+--help+ output of the \biber command. \minisec{0.9.8} \textcolor{red}{The \opt{sourcemap} option syntax has changed}.The syntax was too confusing. It is now simplified and more powerful. It is uses a sequential processing model to apply mappings to an entry. See section \ref{ref:map}. \minisec{0.9.7} \textcolor{red}{The user config file has a completely new format}.The reason for this is that the older \verb+Config::General+ format could not be extended to deal with more sophisticated features like per-datasource restrictions. An XML format is much better and in fact easier to understand. The old format of the \opt{map} option (now called \opt{sourcemap}) was rather confusing because of limitations in the old config file format. Please see section \ref{ref:map} and convert your config files to the new format. \minisec{0.9.6} \textcolor{red}{Matching of citation keys and datasource entry keys is now \emph{case-sensitive}}. This is to enforce consistency across the entire Bib\latex\ and \biber\ processing chain. All of the usual referencing mechanisms in \latex\ are case-sensitive and so is the matching in Bib\latex\ of citations to entries in the \texttt{.bbl} file generated by \biber. It is inconsistent and messy to enforce case-insensitivity in only \biber's matching of citations keys to datasource entry keys. If \biber\ detects what looks like a case mismatch between citation keys, it will warn you. \noindent \textcolor{red}{Summary of warnings/errors is now a new format}. When \biber\ finishes writing the \verb+.bbl+, it gives a summary count of errors/warnings. It used to do this in the same format as Bib\TeX, for compatibility. Now it uses a more consistent and easier to parse format which matches all other \biber\ messages. Please note if you need to support \biber\ in an external tool. I have updated the notes on AUC\TeX\ support below to reflect this. \section{Introduction}\label{int} \subsection{About} \biber\ is conceptually a \BibTeX\ replacement for \biblatex. It is written in Perl with the aim of providing a customised and sophisticated data preparation backend for \biblatex. You do \emph{not} need to install Perl to use \biber---binaries are provided for many operating systems via the main \TeX\ distributions (\TeX Live, Mac\TeX, MiK\TeX) and also via download from SourceForge. Functionally, \biber\ offers a superset of \BibTeX's capabilities but is tightly coupled with \biblatex\ and cannot be used as a stand-alone tool with standard \verb+.bst+ styles. \biber's primary role is to support \biblatex\ by performing the following tasks: \begin{itemize} \item Parsing data from datasources \item Processing cross-references, entry sets, related entries \item Generating data for name, name list and name/year disambiguation \item Structural validation according to \biblatex\ data model \item Sorting reference lists \item Outputting data to a \verb+.bbl+ for \biblatex\ to consume \end{itemize} \biber\ also has the ability to output different formats than \file{.bbl} and can, for example, output a new \bibtex\ file which contains only cited entries from the datasources (using the \opt{--output-format=bibtex} option). There is also a «,very thick] (mapp); \node[funit] (dyn) [below of=mapp,node distance=6em] {Instantiate dynamic sets and\\related entries} edge [<-,very thick] (mapp); \node[funit] (xdata) [below of=dyn,node distance=6em] {Process XDATA} edge [<-,very thick] (dyn); \node[funit] (crossrefs) [below of=xdata,node distance=6em] {Process cross-references and\\sets} edge [<-,very thick] (xdata); \node[funit] (validate) [below of=crossrefs,node distance=6em] {Validate data model} edge [<-,very thick] (crossrefs); \node[funit] (pre) [below of=validate,node distance=6em] {Resolve label* fields\\generate hashes\\enforce mincrossrefs} edge [<-,very thick] (validate); \node[funit] (unique) [right of=decode,node distance=16em] {Generate uniqueness data}; \draw[->,very thick] (pre.east) -- ($ (pre.east) + (2em,0) $) -- ($ (unique.west) - (2em,0) $) -- (unique.west); \node[funit] (visible) [below of=unique,node distance=6em] {Generate name visibility data} edge [<-,very thick] (unique); \node[funit] (post) [below of=visible,node distance=6em] {Generate more hashes and\\labels} edge [<-,very thick] (visible); \node[funit] (sort) [below of=post,node distance=6em] {Perform sorting} edge [<-,very thick] (post); \node[funit] (output) [below of=sort,node distance=6em] {Construct output objects} edge [<-,very thick] (sort); \node[funit] (encode) [below of=output,node distance=6em] {Encode to output encoding} edge [<-,very thick] (output); \node[file] (bbl) [below of=encode,node distance=8em] {output file} edge [<-,very thick] (encode); \end{tikzpicture} \caption{Overview of \biber's main functional units} \label{fig:overview} \end{figure} It may be useful to know something about the different routes a datasource entry can take as it passes through \biber. \begin{enumerate} \item\label{list:cited} All cited entries which are subsequently found in a datasource are instantiated in the internal \biber\ data model. \item Some uncited entries on which cited entries depend are instantiated in the internal \biber\ data model: \begin{itemize} \item Entries with entrytype \bibtype{XDATA} which are referenced from cited entries. \item Entries mentioned in the \bibfield{CROSSREF} or \bibfield{XREF} field of a cited entry (unless they are also cited themselves in which case they are already instantiated as per item \ref{list:cited} above). \item Clones of entries mentioned as a «related» entry of a cited entry. \item Members of sets, either explicit \bibtype{SET} entrytype entries or dynamic sets. \end{itemize} \item Some uncited but instantiated entries are promoted to cited status so that they make it into the output: \begin{itemize} \item Entries instantiated by being members of a set. \item Entries instantiated by being mentioned as a \bibfield{CROSSREF} are promoted to cited status if \bibfield{CROSSREF}'ed or \bibfield{XREF}'ed at least \opt{mincrosref} times. \item Clones of entries mentioned as a «related» entry of a cited entry. \end{itemize} \item Some of these auto-cited entries have the «dataonly» option set on them so that \biblatex\ will only use them for data and will not output them to the bibliography: \begin{itemize} \item Clones of entries mentioned as a «related» entry of a cited entry. \end{itemize} \end{enumerate} \subsection{Performance} \biber\ can't really be compared with \BibTeX\ in any meaningful way performance-wise. \biber\ is written in Perl and does a \emph{great} deal more than \BibTeX\ which is written in C. One of \biber's test cases is a 2150 entry, 15,000 line \verb+.bib+ file which references a 630 entry macros file with a resulting 160 or so page (A4) formatted bibliography. This takes \biber\ under 2 minutes to process on a reasonable computer. This is perfectly acceptable, especially for a batch program. \subsection{Acknowledgements} François Charette originally wrote a first modest version of \biber. Philip Kime joined in the development in 2009 and is largely responsible for making it what it is today. \section{Use} Firstly, please note that \biber\ will \emph{not} attempt to sanitise the content of \BibTeX\ datasources. That is, don't expect it to auto-escape any \TeX\ special characters like «\verb+&+» or «\verb+%+» which it finds in, for example, your \bibfield{TITLE} fields. It used to do this in earlier versions in some cases but as of version 0.9, it doesn't because it's fraught with problems and leads to inconsistent expectations and behaviour between different datasource types. In your \BibTeX\ data sources, please make sure your entries are legal \TeX\ code. Running \opt{biber --help} will display all options and a brief description of each. This is the most useful brief source of usage information. \biber\ returns an exit code of 0 on success or 1 if there was an error. Most \biber\ options can be specified in long or short format. When mentioning options below, they are referred to as «\opt{long form|short form}» when an option has both a long and short form. As usual with such options, when the option requires an argument, the long form is followed by an equals sign «\verb+=+» and then the argument, the short form is followed by a space and then the argument. For example, the \opt{--configfile|-g} option can be given in two ways: \begin{verbatim} biber --configfile=somefile.conf biber -g somefile.conf \end{verbatim} With the \opt{backend=biber} option, \biblatex\ switches its backend interface and passes all options and information relevant to \biber's operation in a control file with extension \verb+.bcf+\footnote{\biblatex\ Control File}. This is conceptually equivalent to the \verb+.aux+ file which \latex\ uses to pass information to \BibTeX. The \verb+.bcf+ file is XML and contains many options and settings which configure how \biber\ is to process the bibliography and generate the \verb+.bbl+ file. The usual way to call \biber\ is simply with the \verb+.bcf+ file as the only argument. \biblatex\ always writes the control file with a \verb+.bcf+ extension. Specifying the «\verb+.bcf+» extension to \biber\ is optional. Assuming a control file called \verb+test.bcf+, the following two commands are equivalent: \begin{verbatim} biber test.bcf biber test \end{verbatim} \noindent Figure \ref{fig:biber-mdf} is a graphical overview of the data flow for data model information. See Figure \ref{fig:overview} for a more complete overview of \biber's processing steps. \begin{figure}[!htpb] \centering\small \begin{tikzpicture} \node[file] (dsfile) {datasource}; \node[funit] (remap) [below of=dsfile, node distance=8em] {remap} edge [<-,dashed] (dsfile); \node[file] (docremap) [left of=dsfile, node distance=15em] {document data model mapping\\from \texttt{.bcf}} edge [->,dashed] (remap); \node[file] (defaultremap) [left of=remap, node distance=15em] {default data model mapping\\from \texttt{.bcf}} edge [->,dashed] (remap); \node[file] (conf) [below of=remap, node distance=7em] {data model mapping\\from \biber\ config file} edge [->,dashed] (remap); \node[funit] (parser) [right of=remap, node distance=8em] {parser} edge [<-,very thick] (remap); \node[funit] (validation) [right of=parser, node distance=8em] {validation} edge [<-,very thick] (parser); \node[file] (hard) [above of=validation, node distance=8em] {\biblatex\ data\\model from \texttt{.bcf}} edge [->,dashed] (parser) edge [->,dashed] (remap) edge [->,dashed] (validation); \node[file] (bbl) [below of=validation, node distance=8em] {output file} edge [<-,very thick] (validation); \end{tikzpicture} \caption{Model data flow in \biber} \label{fig:biber-mdf} \end{figure} \bigskip \subsection{Options and config file}\label{conffile} \biblatex\ options which \biber\ needs to know about are passed via the \verb+.bcf+ file. See Table \ref{tab:bltxopts} for the \biblatex\ options which \biber\ uses and also for the scopes which are supported for each option. \biber\ also has its own options which are set using the following resource chain, given in decreasing precedence order:\\[2ex] \begin{table} \begin{center} \small \begin{tabular}{lllll} \toprule \biblatex\ option & Global & Per-type & Per-entry\\ \midrule alphaothers & \checkmark & \checkmark & \\ dataonly & & \checkmark & \checkmark\\ inheritance & \checkmark & & \\ labelalpha & \checkmark & \checkmark & \\ labelalphatemplate & \checkmark & \checkmark & \\ labeldate & \checkmark & \checkmark & \\ labeldatespec & \checkmark & \checkmark & \\ labelnamespec & \checkmark & \checkmark & \\ labelnumber & \checkmark & \checkmark & \\ labeltitle & \checkmark & \checkmark & \\ labeltitleyear & \checkmark & \checkmark & \\ maxalphanames & \checkmark & \checkmark & \checkmark\\ maxbibnames & \checkmark & \checkmark & \checkmark\\ maxcitenames & \checkmark & \checkmark & \checkmark\\ maxitems & \checkmark & \checkmark & \checkmark\\ minalphanames & \checkmark & \checkmark & \checkmark\\ minbibnames & \checkmark & \checkmark & \checkmark\\ mincitenames & \checkmark & \checkmark & \checkmark\\ minitems & \checkmark & \checkmark & \checkmark\\ presort & \checkmark & \checkmark & \checkmark\\ singletitle & \checkmark & \checkmark & \\ skipbib & & \checkmark & \checkmark\\ skiplab & & \checkmark & \checkmark\\ skiplos & & \checkmark & \checkmark\\ sortalphaothers & \checkmark & \checkmark & \\ sortexclusion & & \checkmark & \\ sortfirstinits & \checkmark & & \\ sorting & \checkmark & & \\ uniquelist & \checkmark & \checkmark & \checkmark\\ uniquename & \checkmark & \checkmark & \checkmark\\ useauthor & \checkmark & \checkmark & \checkmark\\ useeditor & \checkmark & \checkmark & \checkmark\\ useprefix & \checkmark & \checkmark & \checkmark\\ usetranslator & \checkmark & \checkmark & \checkmark\\ \bottomrule \end{tabular} \end{center} \caption{\biblatex\ options which \biber\ uses} \label{tab:bltxopts} \end{table} \noindent command line options $\rightarrow$\\ \hspace*{1em}\verb+biber.conf+ file $\rightarrow$\\ \hspace*{2em}\verb+.bcf+ file$\rightarrow$\\ \hspace*{3em}\biber\ hard-coded defaults\\[2ex] \noindent Users do not need to care directly about the contents or format of the \verb+.bcf+ file as this is generated from the options which they specify via \biblatex. The config file is a place to set commonly used command-line options and also to set options which cannot be set on the command line. The configuration file is by default called \verb+biber.conf+ but this can be changed using the \opt{--configfile|-g} option. Unless \opt{--configfile|-g} is used, the config file is looked for in the following places, in decreasing order of preference:\\[2ex] \noindent \verb+biber.conf+ in the current directory $\rightarrow$\\ \hspace*{1em}\verb+$HOME/.biber.conf+ $\rightarrow$\\ \hspace*{2em}\verb+$XDG_CONFIG_HOME/biber/biber.conf+ $\rightarrow$\\ \hspace*{3em}\verb+$HOME/Library/biber/biber.conf+ (Mac OSX only)\\ \hspace*{3em}\verb+$APPDATA/biber.conf+ (Windows only) $\rightarrow$\\ \hspace*{4em}the output of «\verb+kpsewhich biber.conf+» (if available on the system)\\[2ex] \noindent The config file is XML. Here Below is an example config file which displays the \biber\ defaults: \begin{lstlisting}[language=xml] 0 1 0 base 0 0 0 UTF-8 and 0 and 0 0 0 0 others 0 UTF-8 upper bbl 2 0 0 base 0 true true false false 0 0 0 0 0 \s*,\s* \end{lstlisting} \noindent In practice, the most commonly used options will be set via \biblatex\ macros in your document and automatically passed to \biber\ via the \verb+.bcf+ file. Certain options apply only to \biber\ and can only be set in the config file, particularly the more complex options. Most options are simple tags. Exceptions are the \opt{nosort}, \opt{noinit} and \opt{collate-options} options which are slightly more complex and can have sub-options as shown. A much more complex option is the \opt{sourcemap} option which is not set by default and which is described in section \ref{ref:map}. \subsubsection{The \texttt{output-format} option}\label{ref:of} \biber\ is able to output formats other than \file{.bbl} files for \biblatex\ to consume. It is also able to output other formats such as \file{DOT} for visualisation of entry dependencies (see section \ref{ref:vis}), the experimental \verb+biblatexml+ XML format and also \bibtex\ \file{.bib} files. \file{.bib} output is possible in tool mode, when you are converting an entire datasource file independently of any particular document (see section \ref{ref:tool}). It is also useful when you want, instead of a \file{.bbl}, a new \file{.bib} file containing only the cited entries from a document so that you can, for example, send a minimally complete package for typesetting to someone. To do this, you would, after the first \latex run, call \biber like this: \begin{verbatim} biber --output-format=bibtex test.bcf \end{verbatim} \noindent This would result in a new \file{.bib} file called \file{test\_biber.bib} containing all cited entries in \file{test.tex}, in citation order, formatted according to the various \opt{ouput-*} options. You could of course also perform more processing like source mapping (see section \ref{ref:map}), reencoding (see section \ref{ref:enc}) etc. using more command line options or a config file. \subsubsection{The \texttt{sourcemap} option}\label{ref:map} The datasource drivers implement a mapping from datasource entrytypes and fields into the \biblatex\ data model. If you want to override or augment the driver mappings you can use the \opt{sourcemap} option which makes it possible to, for example, have a datasource with non-standard entrytypes or fields and to have these automatically mapped into other entrytypes/fields without modifying your datasource. Essentially, this alters the source data stream which \biber\ uses to build the internal \biblatex\ data model and is an automatic way of editing the datasource as it is read by \biber. Source mappings can be defined at different «levels» which are applied in a defined order. See the \biblatex\ manual regarding these macros:\\[2ex] \noindent \texttt{user}-level maps defined with \cmd{DeclareSourcemap}$\rightarrow$\\ \hspace*{1em}\texttt{user}-level maps defined in the \biber\ config file (described below)$\rightarrow$\\ \hspace*{2em}\texttt{style}-level maps defined with \cmd{DeclareStyleSourcemap}$\rightarrow$\\ \hspace*{3em}\texttt{driver}-level maps defined with \cmd{DeclareDriverSourcemap}\\[2ex] The \opt{sourcemap} option can only be set in the config file and not on the command line as it has a complex structure. This option allows you to perform various datasource mapping tasks which can be useful for pre-processing data which you do not generate yourself: \begin{itemize} \item Map datasource entrytypes to different entrytypes. \item Map datasource fields to different fields. \item Add new fields to an entry \item Remove fields from an entry \item Modify the contents of a field using standard Perl regular expression match and replace. \item Restrict any of the above operations to entries coming from particular datasources which you defined in \verb+\addresource{}+ macros. \item Restrict any of the above operations to entries only of a certain entrytype. \end{itemize} \noindent There is in fact, more flexibility than the above suggests, examples will show this below. The format of the \opt{sourcemap} option section in the config file is described below, followed by examples which will make things clearer. Items in \textcolor{red}{red} are not literal, they are descriptive meta-values which are explained in the accompanying text. Items in \textcolor{blue}{blue} are optional within their parent section or element. The general structure is: \lstset{showspaces=false} \lstset{showstringspaces=false} \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] ... $\vdots$ ... $\vdots$ ... $\vdots$ ... \end{lstlisting} \noindent Here, \textcolor{red}{\texttt{driver$_1$}}\ldots \textcolor{red}{\texttt{driver$_n$}} are the names of valid \biber\ data source drivers (see section \ref{dsd}). One thing to note here is the \opt{map\_overwrite} attribute. This boolean attribute determines whether, for this driver mapping section, you may overwrite existing fields when adding new fields or mapping them. This attribute can be overridden on a per-map basis, see below. A warning will be issued either way saying whether an existing field will or will not be overwritten. If omitted, it defaults to «0». The \opt{map} elements are processed in sequence and contain a number of \opt{map\_step}s which are also processed in sequence. Each \opt{map\_step} allows you to do a particular thing or combination of things: \begin{itemize} \item Change the entrytype of an entry \item Change the name of a field \item Add extra fields the entry \item Change the contents of a field \end{itemize} \noindent These facilities are explained in more detail below, with examples. A \opt{map} element looks like this: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] +\textcolor{blue}{\textcolor{red}{datasource}}+ +\textcolor{blue}{\textcolor{red}{entrytype}}+ +\textcolor{blue}{\textcolor{red}{entrytype}}+ \end{lstlisting}%| <- sometimes emacs highlighting needs this \begin{itemize} \item If there are any \textcolor{red}{\texttt{datasource}}s named in \textcolor{blue}{\texttt{per\_datasource}} elements, this mapping only applies to entries coming from the named \textcolor{red}{\texttt{datasource}}s. There can be multiple \textcolor{blue}{\texttt{per\_datasource}} elements each specifying one of the datasource names given in a \biblatex\ \verb+\addbibresource+ macro. \item If there are any \textcolor{red}{\texttt{entrytypes}}s named in \textcolor{blue}{\texttt{per\_type}} elements, this mapping only applies to entries of the named \textcolor{red}{\texttt{entrytypes}}s. \item If there are any \textcolor{red}{\texttt{entrytypes}}s named in \textcolor{blue}{\texttt{per\_nottype}} elements, this mapping only applies to entries not of the named \textcolor{red}{\texttt{entrytypes}}s. \item The \texttt{map\_overwrite} attribute can be used to override the value for this attribute set on the parent \opt{maps} element. If omitted, it defaults to the parent \opt{maps} attribute value. \item The \texttt{map\_foreach} attribute loops over all \cmd{step}s in this \cmd{map}, setting the special variable \verb+$MAPLOOP+ to each of the comma-separated values contained in the entry field \textcolor{red}{\texttt{loopfield}}. This allows the user to repeat a group of \opt{map\_step}s for each value of another CSV field. Using regexp maps, it is possible to create a CSV field for use with this functionality. The special variable \verb+$MAPUNIQ+ may also be used the \opt{map\_step}s to generate a random unique string. This can be useful when creating keys for new entries. \end{itemize} \noindent Each \opt{map\_step} is looked at in turn and compared with the datasource entry being processed. A \opt{map\_step} works like this: \begin{itemize} \item If \textcolor{blue}{\texttt{map\_entry\_new}} is set, a new entry is created with the entry key \textcolor{red}{\texttt{newentrykey}} and the entry type \textcolor{red}{\texttt{newentrykeytype}} given in the option \textcolor{blue}{\texttt{map\_entry\_newtype}}. This entry is only in-scope during the processing of the current entry and can be referenced by \textcolor{red}{\texttt{newentrykeytype}} given as the value to \textcolor{blue}{\texttt{map\_entrytarget}}. \item When a \textcolor{blue}{\texttt{map\_field\_set}} step has \textcolor{blue}{\texttt{map\_entrytarget}} set to the entrykey of an entry created by \textcolor{blue}{\texttt{map\_entry\_new}}, the target for the field set will be the \textcolor{blue}{\texttt{map\_entrytarget}} entry rather than the entry being currently processed. This allows users to create new entries and set fields in them. \item If \textcolor{blue}{\texttt{map\_entry\_null}} is set, processing of the \opt{map} immediately terminates and the current entry is not created. It is as if it did not exist in the datasource. Obviously, you should select the entries which you want to apply this to using prior mapping steps. \item If \textcolor{blue}{\texttt{map\_entry\_clone}} is set, a clone of the entry is created with an entry key prefixed by \textcolor{red}{\texttt{prefix}}. Obviously this may cause labelling problems in author/year styles etc. and should be used with care. It is mainly intended for numbering issues with numeric styles and multiple bibliographies where the same entries occur in more than one bibliography. \item Change the \textcolor{red}{\texttt{source-entrytype}} to \textcolor{red}{\texttt{target-entrytype}}, if defined. If \textcolor{blue}{\texttt{map\_final}} is set then if the entrytype of the entry is not \textcolor{red}{\texttt{source-entrytype}}, processing of this \opt{map} immediately terminates. \item Change the \textcolor{red}{\texttt{source-field}} to \textcolor{red}{\texttt{target-field}}, if defined. If \textcolor{blue}{\texttt{map\_final}} is set, then if there is no \textcolor{red}{\texttt{source-field}} field in the entry, processing of this \opt{map} immediately terminates. \item If \textcolor{blue}{\texttt{map\_match}} is defined but \textcolor{blue}{\texttt{map\_replace}} is not, only apply the step if the \textcolor{red}{\texttt{source-field}} matches \textcolor{blue}{\texttt{map\_match}}. You can use parentheses as usual to capture parts of the match and can then use these later when setting a \textcolor{blue}{\texttt{map\_field\_value}}. \item \textcolor{blue}{\texttt{map\_notmatch}} is the same as \textcolor{blue}{\texttt{map\_match}} but with the logic reversed. \item Perform a Perl regular expression match and replace on the value of \textcolor{red}{\texttt{source-field}} if \textcolor{blue}{\texttt{map\_match}} and \textcolor{blue}{\texttt{map\_replace}} are defined. You may use (and almost certainly will want to use) parentheses for back-references in \textcolor{blue}{\texttt{map\_replace}}. Do not quote the regular expressions in any special (i.e. non-Perly) way---it's not necessary. \item If \textcolor{blue}{\texttt{map\_field\_set}} is defined, then its value is \textcolor{red}{\texttt{set-field}} which will be set to a value specified by further attributes. If \textcolor{blue}{\texttt{map\_overwrite}} is false for this step and the field to set already exists then the map step is ignored. If \textcolor{blue}{\texttt{map\_final}} is also set on this step, then processing of the parent map stops at this point. If \textcolor{blue}{\texttt{map\_append}} is set, then the value to set is appended to the current value of \textcolor{red}{\texttt{set-field}}. The value to set is specified by a mandatory one and only one of the following attributes: \begin{itemize} \item \textcolor{blue}{\texttt{map\_field\_value}} --- The \textcolor{red}{\texttt{set-field}} is set to \textcolor{red}{\texttt{set-value}} \item \textcolor{blue}{\texttt{map\_null}} --- The field is ignored, as if it did not exist in the datasource \item \textcolor{blue}{\texttt{map\_origentrytype}} --- The \textcolor{red}{\texttt{set-field}} is set to the most recently mentioned \textcolor{red}{\texttt{source-entrytype}} name. \item \textcolor{blue}{\texttt{map\_origfield}} --- The \textcolor{red}{\texttt{set-field}} is set to the most recently mentioned \textcolor{red}{\texttt{source-field}} name \item \textcolor{blue}{\texttt{map\_origfieldval}} --- The \textcolor{red}{\texttt{set-field}} is set to the most recently mentioned \textcolor{red}{\texttt{source-field}} value \end{itemize} \end{itemize} \noindent With \bibtex\ and RIS datasources, you can specify the pseudo-field «entrykey» for \textcolor{red}{\texttt{source-field}} which is the citation key of the entry. Naturally, this «field» cannot be changed (used as \textcolor{red}{\texttt{set-field}}, \textcolor{red}{\texttt{target-field}} or changed using \textcolor{blue}{\texttt{map\_replace}}). Note that for XML datasources like BibLaTeXML, the names of fields and entrytypes are matched in a case sensitive manner. For all other datasource types (\BibTeX, RIS etc.) entrytype and field name matching is case insensitive. \noindent Here are some examples: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] example1.bib example2.bib \end{lstlisting} \noindent This would add a \bibfield{KEYWORDS} field with value «\verb+keyw1, keyw2+» and set the \bibfield{NOTE} field to citation key for the entry to all entries which are found in either the \verb+examples1.bib+ or \verb+examples2.bib+ files. This assumes that the \biblatex\ source contains \verb+\addresource{example1.bib}+ and \verb+\addresource{example2.bib}+. \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] \end{lstlisting} \noindent Copy the \bibfield{TITLE} field to the \bibfield{NOTE} field unless the \bibfield{NOTE} field already exists. \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent For any entry with an \bibfield{AUTHOR} field, try to set \bibfield{SORTNAME} to the same as \bibfield{AUTHOR}. If this fails because \bibfield{SORTNAME} already exists, stop, otherwise truncate \bibfield{SORTNAME} to just the first name in the name list. \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] \end{lstlisting} \noindent Any \bibtype{CHAT} entrytypes would become \bibtype{CUSTOMA} entrytypes and would automatically have a \bibfield{TYPE} field set to «CHAT» unless the \bibfield{TYPE} field already exists in the entry (because \opt{map\_overwrite} is false). This mapping applies only to entries of type \bibtype{CHAT} since the first step has \opt{map\_final} set and so if the \opt{map\_type\_source} does not match the entry, processing of this \opt{map} immediately terminates. \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] examples.bib ARTICLE BOOK \end{lstlisting} \noindent Any entries of entrytype \bibfield{ARTICLE} or \bibfield{BOOK} from the «examples.bib» datasource would have their \bibfield{ABSTRACT} fields removed and a \bibfield{NOTE} field added with value «Auto-created this field». \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent This removes \bibfield{ABSTRACT} fields from any entry, changes \bibfield{CONDUCTOR} fields to \bibfield{NAMEA} fields and changes \bibfield{GPS} fields to \bibfield{USERA} fields \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent Applies only to entries with \bibfield{PUBMED} fields and maps \bibfield{PUBMEDID} fields to \bibfield{EPRINT} fields, sets the \bibfield{EPRINTTYPE} field to «PUBMEDID» and also sets the \bibfield{USERD} field to the string «Some string of things». \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent Here, the contents of the \bibfield{SERIES} field have leading numbers stripped and the remainder of the contents lowercased. \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent Here, if for an entry, the \bibfield{TITLE} field matches a particular regular expression, we set a special keyword so we can, for example, make a references section just for certain items. \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent If an entry has a \bibfield{LISTA} field which matches regular expression «regexp», then it is removed. \begin{lstlisting}[language=xml,escapechar=:,mathescape=true] \end{lstlisting} \noindent Here, we use multiple match/replace for the same field to regularise some inconstant name variants. Bear in mind that match/replace processing within a \opt{map} element is sequential and the changes from a previous match/replace are already committed. \begin{lstlisting}[language=xml,escapechar=;,mathescape=true] \end{lstlisting} \noindent Only applies to entries with an \bibfield{AUTHOR} field matching «Doe,». First the \bibfield{AUTHOR} field is copied to both the \bibfield{SHORTAUTHOR} and \bibfield{SORTNAME} fields, overwriting them if they already exist. Then, these two new fields are modified to canonicalise a particular name, which presumably has some variants in the datasource. \begin{lstlisting}[language=xml,escapechar=;,mathescape=true] \end{lstlisting} \noindent Any entry with a \bibfield{TITLE} field matching «A Title» will be completely ignored. \bigskip \minisec{Other datasource types} For datasources other than \BibTeX, (e.g. \verb+ris+ and \verb+biblatexml+), the source entrytypes and fields are usually very differently modelled and named. For example, here, dropping the \bibfield{N2} field from \verb+RIS+ datasources, which are commonly used for abstracts: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] \end{lstlisting} \bigskip \subsubsection{The \texttt{inheritance} option}\label{inheritance} The \opt{inheritance} option defines the inheritance rules for data inheritance between entries using, for example, \bibtex's \bibfield{CROSSREF} field. The default setup for this is defined by \biblatex and is passed in the \file{.bcf} file. Defining inheritance rules in the \biber configuration file is rarely something you would want to do with one notably exceptional case being when using \biber in tool mode where you might want to «materialise» special inheritance rules (see section \ref{ref:tool}). Here we define the format of the config file inheritance section, should you need to understand or modify it. Items in \textcolor{red}{red} are not literal, they are descriptive meta-values which are explained in the accompanying text. Items in \textcolor{blue}{blue} are optional within their parent section or element. \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] $\vdots$ $\vdots$ $\vdots$ $\vdots$ \end{lstlisting} \begin{itemize} \item The \texttt{defaults} section specifies the default inheritance rules which are not otherwise covered by a specific \texttt{inherit} rule. \texttt{inherit\_all} specifies that by default a \textcolor{red}{\texttt{target}} inherits all fields from a \textcolor{red}{\texttt{source}}. \texttt{override\_target} specifies that by default an existing \textcolor{red}{\texttt{target}} field will be overwritten by a \textcolor{red}{\texttt{source}} field it already exists in the \textcolor{red}{\texttt{target}}. A \texttt{type\_pair} element specifies the defaults for a particular \textcolor{red}{\texttt{source}} and \textcolor{red}{\texttt{target}} entrytype combination. \textcolor{red}{\texttt{source}} or \textcolor{red}{\texttt{target}} can take the value «\texttt{*}» which is a wildcard representing all possible entrytypes. \item An \texttt{inherit} element specifies how one or more \textcolor{red}{\texttt{source}} fields are inherited by one more \textcolor{red}{\texttt{source}}/\textcolor{red}{\texttt{target}} pairs which are specified in one or more \texttt{type\_pair} elements within the same \texttt{inherit} element. \textcolor{blue}{\texttt{override\_target}} can be specified on a per-field basis as can the \textcolor{blue}{\texttt{skip}} attribute which indicates that a particular \texttt{field} is not to be inherited by the \textcolor{red}{\texttt{target}}. \end{itemize} % Here is an example: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] \end{lstlisting} % Here we can see that the default is to inherit all fields from the \textcolor{red}{\texttt{source}} and not to override existing \textcolor{red}{\texttt{target}} fields if they already exist. Then we see that for some combinations of \textcolor{red}{\texttt{source}}s and \textcolor{red}{\texttt{target}}s, the \bibfield{AUTHOR} field is inherited from the \textcolor{red}{\texttt{source}} and also the \bibfield{AUTHOR} field in the \textcolor{red}{\texttt{source}} is inherited as the \bibfield{BOOKAUTHOR} field in the \textcolor{red}{\texttt{target}}. The second \texttt{inherit} element says that \bibfield{INBOOK} and \bibfield{INCOLLECTION} entries never inherit the \bibfield{INTRODUCTION} field from any \textcolor{red}{\texttt{source}}. In general, it is probably best to copy the default \biblatex inheritance rules and modify them to your needs. See section \ref{ref:tool}. \bigskip \subsubsection{The \texttt{noinit} option}\label{noinit} The value of the \opt{noinit} option can only be set in the config file and not on the command line. This is because the values are Perl regular expressions and would need special quoting to set on the command line. This can get a bit tricky on some OSes (like Windows) so it's safer to set them in the config file. \opt{noinit} allows you to ignore parts of a name when generating initials. This is done using Perl regular expressions which specify what to ignore. You can specific multiple regular expressions and they will be removed from the name before it is passed to the initials generating system. For example, this option can be used to ignore diacritic marks and prefices in names which should not be considered when sorting. Given (the default): \begin{lstlisting}[language=xml] \end{lstlisting} \noindent and the \BibTeX\ datasource entry: \begin{verbatim} AUTHOR = {{al-Hasan}, ʿAlī}, \end{verbatim} \noindent the initials for the last name will be «H» and not «a-H». The initial for the first name will be «A» as the diacritic is also ignored. This is tricky in general as you cannot often determine the difference between a name with a prefix and a hyphenated name with only, say, two chars in the first part such as «Ho-Pun». You can adjust this option for your individual cases. By default, only lowercased prefices are looked for so as to avoid breaking things like «Ho-Pun» where you want the initials to be «H.-P.», for example. See the Perl regular expression manual page for details of the regular expression syntax\footnote{\url{http://perldoc.perl.org/perlre.html}}. \subsubsection{The \texttt{nolabel} option}\label{nolabel} The value of the \opt{nolabel} option can only be set in the config file and not on the command line. This is because the values are Perl regular expressions and would need special quoting to set on the command line. This can get a bit tricky on some OSes (like Windows) so it's safer to set them in the config file. \opt{nolabel} allows you to ignore elements of a field when generating labels. This is done using Perl regular expressions which specify what to ignore. You can specific multiple regular expressions and they will be removed from a field before it is passed to the label generating system. For example, this option can be used to ignore control, punctuation, symbol and separator characters when generation labels. Given (the default): \begin{lstlisting}[language=xml] \end{lstlisting} \noindent and the \BibTeX\ datasource entry with default label generation definition (see \biblatex\ documentation for \cmd{DeclareLabelalphaTemplate}): \begin{verbatim} AUTHOR = {O'Toole, Alexander}, \end{verbatim} \noindent Then the label for the name will be <> as the apostrophe is ignored by the label generation routine. See the Perl regular expression manual page for details of the regular expression syntax\footnote{\url{http://perldoc.perl.org/perlre.html}}. \subsubsection{The \texttt{nolabelwidthcount} option}\label{nolabelwidthcount} The value of the \opt{nolabelwidthcount} option can only be set in the config file and not on the command line. This is because the values are Perl regular expressions and would need special quoting to set on the command line. This can get a bit tricky on some OSes (like Windows) so it's safer to set them in the config file. \opt{nolabelwidthcount} allows you to ignore elements of a field when generating fixed-width substrings of labels. This is done using Perl regular expressions which specify what to ignore. You can specific multiple regular expressions and they will be removed from a field before it is passed to the label generating system. For example, this option can be used to ignore punctuation characters when generating substrings for labels. Note that in this example we reset \opt{nolabel} because by default this removes punctuation characters. Given: \begin{lstlisting}[language=xml] \end{lstlisting} \noindent and the \BibTeX\ datasource entry with default label generation definition (see \biblatex\ documentation for \cmd{DeclareLabelalphaTemplate}): \begin{verbatim} AUTHOR = {O'Toole, Alexander}, \end{verbatim} \noindent Then the label for the name will be <> as the apostrophe is ignored by the substring generation routine. See the Perl regular expression manual page for details of the regular expression syntax\footnote{\url{http://perldoc.perl.org/perlre.html}}. \bigskip \subsubsection{The \texttt{sorting} option}\label{sorting} The \opt{sorting} option defines the sorting rules for the bibliography lists. \biblatex allows multiple sorting specifications referenced by name as it can print bibliography information as many times as the user wishes with different filtering and sorting. This is normally handled by macros in \biblatex which write the XML sorting specification(s) to the \file{.bcf} file for \biber to read but there may be occasions (usually when using \biber in «tool» mode (see section\ref{ref:tool}) when you need to specify the global sorting specification directly in a \biber config file. This section documents the XML format of the sorting specification. Items in \textcolor{red}{red} are not literal, they are descriptive meta-values which are explained in the accompanying text. Items in \textcolor{blue}{blue} are optional within their parent section or element. See also the \texttt{nosort} option in section \ref{nosort}. \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] +\textcolor{red}{string}+ +\textcolor{blue}{}+ +\textcolor{blue}{\textcolor{red}{field}}+ $\vdots$ +\textcolor{blue}{}+ +\textcolor{red}{field|literal|citeorder}+ $\vdots$ $\vdots$ \end{lstlisting} Sorting in \biber is a sophisticated procedure of building up a sorting object for an entry based on a sorting scheme template, the general form of which is shown above. The sorting routine first traverses every entry in the bibliography list and generates a sorting object based on the sorting scheme. When this is done, it sorts the entries according to the sorting objects it has generated for each entry. A sorting specification is comprised of a number of \texttt{sort} elements. Sorting is essentially a process of comparing whatever information the \textcolor{red}{n}th \texttt{sort} element collected for every entry (otherwise known as «multi-field» sorting). Within a \texttt{sort} element, there can be any number of \texttt{sortitem} elements which describe what information to look for in the entry in order to construct this part of the sorting object; either a field, a literal string or the special «citeorder» pseudo-field. When generating the sorting information for an entry, within each \texttt{sort} element, the first \texttt{sortitem} to return a non-empty value for the bibliography entry is used and the rest of the \texttt{sortitem}s in the \texttt{sort} are skipped. A \texttt{sortitem} essentially looks for a piece of information in the entry and adds this to the sorting object. If it is looking for a \textcolor{red}{\texttt{field}}, then the field must exist in the entry. If it does not, the \texttt{sortitem} is skipped. If the \textcolor{red}{\texttt{field}} does exist, it is added to the sorting object for the entry after being modified by the attributes of the \texttt{sortitem}. Once a \texttt{sortitem} has returned the contents of a \textcolor{red}{\texttt{field}}, you can use the \textcolor{blue}{substring\_side} (default «left» if any other \textcolor{blue}{substring} attributes are set) and \textcolor{blue}{substring\_width} (default «4» if any other \textcolor{blue}{substring} attributes are set) attributes to truncate the contents of the \textcolor{red}{\texttt{field}} by reducing it to a substring taken from the left or right side of the string and of a number of (UTF-8) characters of your choice. You can also pad the \textcolor{red}{\texttt{field}} with repeated arbitrary characters on either side using the \textcolor{blue}{pad\_side} (default «left» if any other \textcolor{blue}{pad} attributes are set), \textcolor{blue}{pad\_width} (default «4» if any other \textcolor{blue}{pad} attributes are set) and \textcolor{blue}{pad\_char} (default «0»---the digit zero if any other \textcolor{blue}{pad} attributes are set) attributes. A \texttt{sortitem} which is neither a known bibliography sorting field nor the special «citeorder» string is treated as a literal string to add to the sorting object. Naturally, such a \texttt{sortitem} always «finds» something to add to the sorting object and so it should never have any other \texttt{sortitem}s after it within the \texttt{sort} section as they will never be considered. The «citeorder» \texttt{sortitem} value has a special meaning. It requests a sort based on the lexical order of the actual citations. For entries cited in \biblatex within the same citation command like: \begin{lstlisting}[style=latex]{} \cite{one,two} \end{lstlisting} % there is a distinction between the lexical order and the semantic order. Here «one» and «two» have the same semantic order but a unique lexical order. The semantic order only matters if you specify further sorting to disambiguate entries with the same semantic order. For example, this is the definition of the \biblatex \opt{none} sorting scheme: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] mm citeorder \end{lstlisting} % This sorts the bibliography purely lexically by the order of the keys in the citation commands. In the example above, it sorts entry «one» before «two». However, suppose that you consider «one» and «two» to have the same order (semantic order) since they are cited at the same time and want to further sort these by year. Suppose «two» has an earlier \bibfield{YEAR} than «one»: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] mm citeorder year \end{lstlisting} % This sorts «two» before «one», even though lexically, «one» would sort before «two». This is possible because the semantic order can be disambiguated by the further sorting on year. With the standard \biblatex \opt{none} sorting scheme, the lexical order and semantic order are identical because there is nothing further to disambiguate them. This means that you can use «citeorder» just like any other \texttt{sortitem} value, choosing how to further sort entries cited at the same time (in the same citation command). Both \texttt{sort} and \texttt{sortitem} elements have a mandatory \texttt{order} attribute which should start at «1» and increase for each further element. Order numbers for \texttt{sortitem} elements within a \texttt{sort} element always begin with «1» and don't increase between \texttt{sort} elements. Once a \texttt{sortitem} element has added something to the sorting object (or all \texttt{sortitem} elements within a \texttt{sort} have been processed, regardless of whether anything was added to the sort object for the entry), some attributes are applied to the information added and the next \texttt{sort} element is processed. These attributes on the \texttt{sort} element further determine how any sorting specification added by the \texttt{sortitem} elements will be used in the sorting. If the \texttt{sort} element has the \textcolor{blue}{\texttt{final}} attribute set to «1», then if any \texttt{sortitem} within the \texttt{sort} returned a non-empty string to add to the sorting object, the construction of the sorting object for the entry ceases at this point and no more \texttt{sort} elements are processed. This is used typically to make sure that master sorting keys such as those specified with the \bibfield{SORTKEY} field, if found, are the only thing used to construct the sorting object. The \texttt{sort} element may further specify that the information at \texttt{order} «\textcolor{red}{n}» should be sorted in ascending order or descending order (default «ascending»), whether case should be considered when sorting (default depends on the \biber\ \opt{sortcase} option which defaults to true) and whether uppercase characters should be sorted before lower (default depends on the \biber\ «sortupper» option which defaults to true). Finally, there are two special sorting section elements to consider. The \texttt{presort} element is mandatory and specifies a literal \textcolor{red}{string} to add to the very beginning of all sorting objects for all entries. This is useful when combined with the fact that you may specify an optional \textcolor{blue}{\texttt{type}} attribute which specifies a particular entry type for the presort \textcolor{red}{string} specified. Using this mechanism, you can sort, for example, all \bibfield{ARTICLE} entries before all \bibfield{BOOK} entries and then all other types of entry: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] aa bb mm $\vdots$ \end{lstlisting} % This makes it easy to divide a bibliography by type of entry. The optional \textcolor{blue}{\texttt{sortexclusion}} element allows you to exclude fields from consideration by \texttt{sortitem} on a per-type basis. For example, if you wanted to ignore the \bibfield{YEAR} field of any \bibfield{REPORT} entry types because they are not reliably populated with data representing a year, you could do: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] $\vdots$ year $\vdots$ \end{lstlisting} % It is much easier to see how intuitive this all is if you look at a standard sorting scheme definition. Below is the default \biblatex sorting scheme which appears in the \file{.bcf} when you run \biblatex with no \opt{sorting} option. This is fully documented and described in the \biblatex manual along with the \latex macros which generate this XML in the \file{.bcf}: \begin{lstlisting}[language=xml,escapechar=+,mathescape=true] mm presort sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 \end{lstlisting} \bigskip \subsubsection{The \texttt{nosort} option}\label{nosort} The value of the \opt{nosort} option can only be set in the config file and not on the command line. This is because the values are Perl regular expressions and would need special quoting to set on the command line. This can get a bit tricky on some OSes (like Windows) so it's safer to set them in the config file. In any case, it's unlikely you would want to set them for particular \biber\ runs; they would more likely be set as your personal default and thus they would naturally be set in the config file anyway. \opt{nosort} allows you to ignore parts of a field for sorting. This is done using Perl regular expressions which specify what to ignore in a field. You can specify as many patterns as you like for a specific field. Also available are some field type aliases so you can, for example, specify patterns for all name fields or all title fields. These field types all begin with the string «\verb+type_+», see Table \ref{tab:nst}. \begin{table} \begin{center} \small \begin{tabular}{ll} \toprule Alias & Fields\\ \midrule type\_name & author\\ & afterword\\ & annotator\\ & bookauthor\\ & commentator\\ & editor\\ & editora\\ & editorb\\ & editorc\\ & foreword\\ & holder\\ & introduction\\ & namea\\ & nameb\\ & namec\\ & shortauthor\\ & shorteditor\\ & translator\\ type\_title & booktitle\\ & eventtitle\\ & issuetitle\\ & journaltitle\\ & maintitle\\ & origtitle\\ & title\\ \bottomrule \end{tabular} \end{center} \caption{\texttt{nosort} option field type aliases} \label{tab:nst} \end{table} For example, this option can be used to ignore some diacritic marks and prefices in names which should not be considered when sorting. Given (the default): \begin{lstlisting}[language=xml] \end{lstlisting} \noindent and the \BibTeX\ datasource entry: \begin{verbatim} AUTHOR = {{al-Hasan}, ʿAlī}, \end{verbatim} \noindent the prefix «al-» and the diacritic «ʿ» will not be considered when sorting. See the Perl regular expression manual page for details of the regular expression syntax\footnote{\url{http://perldoc.perl.org/perlre.html}}. You may specify any number of \opt{option} elements. If a \opt{nosort} option is found for a specific field, it will override any option for a type which also covers that field. Here is another example. Suppose you wanted to ignore «The» at the beginning of a \bibfield{TITLE} field when sorting, you could add this to your \verb+biber.conf+: \begin{lstlisting}[language=xml] \end{lstlisting} \noindent If you wanted to do this for all title fields listed in Table \ref{tab:nst}, then you would do this: \begin{lstlisting}[language=xml] \end{lstlisting} \noindent \textbf{Note:} \opt{nosort} can be specified for most fields but not for things like dates and special fields as that wouldn't make much sense. \bigskip \subsubsection{The \texttt{collate-options} option} The \opt{collate-options} option has format similar to \opt{nosort}. See Section \ref{coll} for details about the option, here is an example of a config file setting: \begin{lstlisting}[language=xml] \end{lstlisting} \bigskip \subsection{Unicode} \biber uses NFD UTF-8 internally. All data is converted to NFD UTF-8 when read. If UTF-8 output is requested (to \file{.bbl} for example), the UTF-8 will always be NFC. \bigskip \subsection{Input/Output File Locations} \subsubsection{Control file}\label{loc:cf} The control file is normally passed as the only argument to \biber. It is searched for in the following locations, in decreasing order of priority:\\[2ex] \noindent Absolute filename $\rightarrow$\\ \hspace*{1em}In the \opt{--input-directory}, if specified$\rightarrow$\\ \hspace*{2em}In the \opt{--output-directory}, if specified$\rightarrow$\\ \hspace*{3em}Relative to current directory$\rightarrow$\\ \hspace*{4em}Using \verb+kpsewhich+, if available \subsubsection{Data sources} Local datasources of type «file» are searched for in the following locations, in decreasing order of priority:\\[2ex] \noindent Absolute filename $\rightarrow$\\ \hspace*{1em}In the \opt{--input-directory}, if specified$\rightarrow$\\ \hspace*{2em}In the \opt{--output-directory}, if specified$\rightarrow$\\ \hspace*{3em}Relative to current directory$\rightarrow$\\ \hspace*{4em}In the same directory as the control file$\rightarrow$\\ \hspace*{5em}Using \verb+kpsewhich+ for supported formats, if available\\[2ex] \noindent Remote file datasources (beginning with \verb+http://+ or \verb+ftp://+) are retrieved to a temp file and processed as normal. Users do not specify explicitly the bibliography database files; they are passed in the \verb+.bcf+ control file, which is constructed from the \biblatex\ «\verb+\addbibresource{}+» macros. \subsection{Logfile} By default, the logfile for \biber\ will be named \verb+\jobname.blg+, so, if you run \begin{verbatim} biber test.bcf \end{verbatim} \noindent then the logfile will be called «\verb+test.blg+». Like the \verb+.bbl+ output file, it will be created in the \opt{--output-directory|-c}, if this option is defined. You can override the logfile name by using the \opt{--logfile} option: \begin{verbatim} biber --logfile=lfname test.bcf \end{verbatim} \noindent results in a logfile called «\verb+lfname.blg+».\\ \noindent \textbf{Warning}: be careful if you are expecting \biber\ to write to directories which you don't have appropriate permissions to. This is more commonly an issue on non-Windows OSes. For example, if you rely on \verb+kpsewhich+ to find your database files which are in system \TeX\ directories, you may well not have write permission there so \biber\ will not be able to write the \verb+.bbl+. Use the \opt{--output-file|-O} option to specify the location to write the \verb+.bbl+ to in such cases. \subsection{Collation and Localisation}\label{coll} \biber\ takes care of collating the bibliography for \biblatex. It writes entries to the \verb+.bbl+ file sorted by a completely customisable set of rules which are passed in the \verb+.bcf+ file by \biblatex. \biber\ has two ways of performing collation:\\[2ex] \biberex{--collate|-C} \noindent The default. This option makes \biber\ use the Perl \verb+Unicode::Collate+ module for collation which implements the full UCA (Unicode Collation Algorithm). It also has CLDR (Common Locale Data Repository) tailoring to deal with cases which are not covered by the UCA. It is a little slower than \opt{--fastsort|-f} but the advantages are such that it's rarely worth using \opt{--fastsort|-f}\\[1ex] \biberex{--fastsort|-f} \noindent \biber\ will sort using the OS locale collation tables. The drawback for this method is that special collation tailoring for various languages are not implemented in the collation tables for many OSes. For example, few OSes correctly sort 'å' before 'ä' in the Swedish (\verb+sv_SE+) locale. If you are using a common latin alphabet, then this is probably not a problem for you.\\[2ex] \noindent The locale used for collating a particular field in the bibliography is determined by the following resource chain which is given in decreasing precedence order:\\[2ex] \noindent\opt{--collate-options|-c} (e.g. \opt{-c 'locale => "de\_DE"'}) $\rightarrow$\\ \hspace*{1em}\opt{--sortlocale|-l} $\rightarrow$\\ \hspace*{2em}\biblatex per-sortset \opt{locale} option $\rightarrow$\\ \hspace*{3em}\biblatex per-sortscheme \opt{locale} option$\rightarrow$\\ \hspace*{4em}\biblatex global sortlocale option\\ \noindent With the default \opt{--collate|-C} option, the locale will be used to look for a collation tailoring for that locale. It will generate an informational warning if it finds none. This is not a problem as most standard collation cases are covered by the standard UCA and many locales neither have nor need any special collation tailoring. \biblatex passes sortscheme-specific sorting locales and its global sorting locale in the \file{.bcf}. \biber uses these locales automatically to tailor sorting at various levels of granularity (see \biblatex docs for the \cmd{DeclareSortingScheme} macro). \biblatex can be configured to automatically pass as locale the language setting from Babel or Polyglossia in which case \biber tries to match this to a sensible locale. See the Appendix, section \ref{localemap} for the mapping. If you want to sort using a specific locale not listed in \ref{localemap}, specify this locale exactly in your \latex source as the \biblatex \opt{sortlocale} option, as the optional argument to \cmd{DeclareSortingScheme} macro or as an optional argument to the \biblatex \cmd{sort} macro according to the desired granularity. For example, if you want to use traditional Spanish for sorting a reference list, you need to specify \verb+es_ES_trad+ directly instead of using the «spanish» string because the Babel/Polyglossia «spanish» language identifier by default maps to the modern \verb+es_ES+ locale (which doesn't include sort tailoring for «ch» in Spanish). With the \opt{--fastsort|-f} option, the locale will be used to locate an OS locale definition to use for the collation. This may or may not be correctly tailored, depending on the locale and the OS. Collation is by default case sensitive. You can turn this off globally using the \biber\ option \opt{--sortcase=false} or from \biblatex\ using its option\linebreak[4]\opt{sortcase=false}. The option can also be defined per-field so you can sort some fields case sensitively and others case insensitively. See the \biblatex\ manual. \opt{--collate|-C} by default collates uppercase before lower. You can reverse this globally for all sorting using the \biber\ option \opt{--sortupper=false} or from\linebreak[4]\biblatex\ by using its option \opt{sortupper=false}. The option can also be defined per-field so you can sort some fields uppercase before lower and others lower before upper. See the \biblatex\ manual. Be aware though that some locales rightly enforce a particular setting for this (for example, Danish). You will be able to override it but \biber\ will warn you if you do. \opt{sortupper} has no effect when using \opt{--fastsort|-f}--you are at the mercy of what your OS locale does. There are in fact many options to \verb+Unicode::Collate+ which can tailor the collation in various ways in addition to the locale tailoring which is automatically performed. Users should see the the documentation to the module for the various options, most of which the vast majority of users will never need\footnote{For details on the various options, see \url{http://search.cpan.org/search?query=Unicode\%3A\%3ACollate&mode=all}}. Options are passed using the \opt{--collate-options|-c} option as a single quoted string, each option separated by comma, each key and value separated by «\verb+=>+». See examples. \textbf{Note:} \biber\ sets the Unicode collation option «variable» to «non-ignorable». Effectively, this means that punctuation is not ignored when sorting. The default setting is to ignore such «variable weight» elements. Sorting bibliographies is slightly more specialised than collating general text and punctuation often matters. In case you want the UCA default behaviour, see examples. Since \biber always normalises into NFD when reading data in, no normalisation is requested with Unicode collation («normalization» option is set to «prenormalized» by default) as this saves some time. \subsubsection{Examples} \biberex{biber} \noindent Call \biber\ using all settings from the \verb+.bcf+ generated from the \latex\ run. Case sensitive UCA sorting is performed taking the locale for tailoring from the \file{.bcf} if \biber's \opt{sortlocale} option is not used to override the \verb+.bcf+ \biberex{biber --sortlocale=de_DE_phonebook} \noindent Override any locale setting in the \verb+.bcf+ \biberex{biber --fastsort} \noindent Use slightly quicker internal sorting routine. This uses the OS locale files which may or may not be accurate. \biberex{biber --sortcase=false} \noindent Case insensitive sorting. \biberex{biber --sortupper=false --collate-options="backwards => 2"} \noindent Collate lowercase before upper and collate French accents in reverse order at UCA level 2. \biberex{biber --collate-options="variable => 'shifted'"} \noindent Use the UCA default setting for variable weight punctuation (which is to ignore it for sorting, effectively). \subsection{Encoding of files}\label{ref:enc} \biber\ takes care of re-encoding the datasource data as necessary. In normal use, \biblatex\ passes its \opt{bibencoding} option value to \biber\ via the \verb+.bcf+ file and this corresponds to the \biber \opt{--input-encoding|e} option. \biblatex also passes the value of its \opt{texencoding} option (which maps to \biber's \opt{--output-encoding|-E} option) the default value of which depends on which \TeX\ engine and encoding packages you are using (see \biblatex\ manual for details). \noindent \biber\ performs the following tasks: \begin{enumerate} \item Decodes the datasource into UTF-8 if it is not UTF-8 already \item Decodes \latex\ character macros in the datasource into UTF-8 \item Encodes the output so that the \verb+.bbl+ is in the encoding that \opt{--output-encoding|-E} specifies \item Warns if it is asked to output to the \verb+.bbl+ any UTF-8 decoded \latex\ character macros which are not in the \opt{--output-encoding|-E} encoding. Replaces with a suitable \latex\ macro \end{enumerate} \noindent Normally, you do not need to set the encoding options on the \biber\ command line as they are passed in the \verb+.bcf+ via the information in your \biblatex\ environment. However, you can override the \verb+.bcf+ settings with the command line. The resource chain for encoding settings is, in decreasing order of preference:\\[2ex] \noindent\opt{--input-encoding|-e} and \opt{--output-encoding|-E} $\rightarrow$\\ \hspace*{1em}\biber\ config file $\rightarrow$\\ \hspace*{2em}\verb+.bcf+ control file \subsubsection{\latex\ macro decoding}\label{ldecode} \noindent As mentioned above, \biber\ always converts as much as possible, including \latex\ character macros, into UTF-8. This is important for two main reasons. Firstly, this allows you to have, for example: \begin{lstlisting}[style=bibtex, columns=fixed]{} @BOOK{key1, Author = {\"{O}leg Smith} } @BOOK{key2, Author = {Öleg Smith} } \end{lstlisting} % Here, because \biber decodes the macros into UTF-8, it knows that both books are by the same author because it's clear that the names are now the same. Secondly, this allows \biber to output normalised latex macros when a user selects \opt{--output-encoding=ascii} etc. This means that the many \biblatex comparison macros used in styles can deal with comparisons of fields containing macros reliably. The macro to UTF-8 conversion uses the decoding set specified with the \opt{--decodecharsset}, see below. To disable all macro to UTF-8 conversion, you can specify the virtual «null» set as a value for \opt{--decodecharsset} or \opt{output-safecharsset}. This effectively turns off macro to UTF-8 decoding or encoding respectively. If you are using PDF\latex\ and \verb+\usepackage[utf8]{inputenc}+, it is possible that the UTF-8 characters resulting from \biber's internal \latex\ character macro decoding break \verb+inputenc+. This is because \verb+inputenc+ does not implement all of UTF-8, only a commonly used subset. An example--if you had \verb+\DJ+ in your \verb+.bib+ datasource, \biber\ decodes this correctly to «Đ» and this breaks \verb+inputenc+ because it doesn't understand that UTF-8 character. The real solution here is to switch to a \TeX\ engine with full UTF-8 support like \XeTeX\ or Lua\TeX\ as these don't use or need \verb+inputenc+. However, you can also try the \opt{--output-safechars} option which will try to convert any UTF-8 chars into \latex\ macros on output. For information on the \opt{--output-safechars} option, see section \ref{lencode}. \bigskip \subsubsection{\latex\ macro encoding}\label{lencode} The opposite of decoding; converting UTF-8 characters into \latex\ macros. You can force this with the \opt{--output-safechars} option which will do a generally good job of making your \verb+.bbl+ plain ASCII. It can be useful in certain edge cases where your bibliography introduces characters which can't be handled by your main document. See section \ref{ldecode} above for an example such case. A common use case for \latex\ macro encoding is when the bibliography datasource is not ASCII but the \verb+.tex+ file is and so this case is automated for you: if the \biblatex\ option «\opt{texencoding}» (which corresponds to the \biber\ option «\opt{--output-encoding|-E}») is set to an ASCII encoding («\verb+ascii+» or «\verb+x-ascii+») and «\opt{--input-encoding|-e}» is not ASCII, \biber\ will automatically set \opt{--output-safechars}. Since \biber always decodes into UTF-8 internally, if the \opt{--output-encoding|-E} option is not set to UTF-8, \biber will automatically replace any characters which will not encode in the output encoding with equivalent \tex macros. You will also receive a warning about this. See also the \opt{biber --help} output for the \opt{--output-safecharsset} and \linebreak[4]\opt{--decodecharsset} options which can customise the set of conversion rules to use. The builtin sets of characters and macros which \biber\ maps during encoding and decoding are documented\footnote{\url{https://sourceforge.net/projects/biblatex-biber/files/biblatex-biber/\biberversion/documentation/utf8-macro-map.html}}. It is possible to provide a customised encode/decode mapping file using the \opt{--recodedata} option. It must adhere to the format of the default data file for reencoding which is \file{recode\_data.xml} located in the same Perl install directory as \biber's \file{Recode.pm} module. Of course it is easier to find this in the \biber\ source tree. It is most likely that if you want to use a custom mapping file, you would copy the default file and edit it, removing some things and perhaps defining some custom recoding sets for use with \opt{--output-safecharsset} and \opt{--decodecharsset}. Be careful to classify the entries using the correct «type» attribute in the XML file as this determines how the macro is treated by the code that does the replacement. Just copy a similar type of macro from the default recoding data file if you are adding new entries, which is unlikely as the file is quite comprehensive. There is only one other thing to note. The «preferred» attribute tells \biber\ to use a specific \latex\ macro when mapping from UTF-8, just in case there are more than one mappings from UTF-8 for a particular character. It's unlikely you will need to use this. \bigskip \subsubsection{Examples} \biberex{biber} \noindent Set \opt{input-encoding} and \opt{output-encoding} from the config file or \verb+.bcf+ \biberex{biber --output-encoding=latin2} \noindent Encode the \verb+.bbl+ as latin2, overriding the \verb+.bcf+ \biberex{biber --output-safechars} \noindent Set \opt{input-encoding} and \opt{output-encoding} from the config file or \verb+.bcf+. Force encoding of UTF-8 chars to \latex\ macros using default conversion set \biberex{biber --output-encoding=ascii} \noindent Encode the \verb+.bbl+ as ascii, overriding the \verb+.bcf+. Automatically sets \opt{--output-safechars} to force UTF-8 to \latex\ macro conversion \biberex{biber --output-encoding=ascii --output-safecharsset=full} \noindent Encode the \verb+.bbl+ as ascii, overriding the \verb+.bcf+. Automatically sets \opt{--output-safechars} to force UTF-8 to \latex\ macro conversion using the full set of conversions \biberex{biber --decodecharsset=full} \noindent Set \opt{input-encoding} and \opt{output-encoding} from the config file or \verb+.bcf+. Use the full \latex\ macro to UTF-8 conversion set because you have some more obscure character macros in your \verb+.bib+ datasource which you want to sort correctly \biberex{biber --recodedata=/tmp/recode.xml --decodecharsset=special} \noindent Specify a user-defined reencoding data file which defines a new reencoding set «special» and use this set for decoding \latex\ macros to UTF-8. \biberex{biber -u} \noindent Shortcut alias for \opt{biber --input-encoding=UTF-8} \biberex{biber -U} \noindent Shortcut alias for \opt{biber --output-encoding=UTF-8} \subsection{List and Name Separators} With traditional \bibtex, the name and list field separator «and» is hard-coded. The \texttt{btparse} C library and therefore \biber\ allows the use of any fixed string, subject to the same rules as «and» (not at the beginning or end of the name/list, whitespace must surround the string etc.). This is settable using the options \opt{listsep} and \opt{namesep}, both of which default to the usual «and». You can also change the default final name in a list which implies «et al». In \bibtex, this is by default the English «others» which is the \biber\ default also. Don't try to put any whitespace in these strings, this is ignored by \texttt{btparse} anyway. Perhaps you prefer your \file{.bib} in more obvious German---set \opt{--namesep=und} and \opt{--others-string=andere} and then you can do: \begin{verbatim} @BOOK{key, AUTHOR = {Hans Harman und Barbara Blaupunkt und andere}, } \end{verbatim} \noindent Bear in mind that these are global settings and apply to all entries in the \bibtex\ data format read by \biber. Also bear in mind that this is very unportable as all \bibtex\ input/output programs rely on the hard-coded «and» and «others». Hopefully this will change as these two hard-coded English terms look really rather bad in the context of multilingual bibliographies. \bigskip \subsection{Editor Integration} Visit \url{http://tex.stackexchange.com/questions/154751/} for a comprehensive overview on \biber integration in most editors. \subsection{\BibTeX\ macros and the \texttt{MONTH} field} \BibTeX\ defines macros for month abbreviations like «\verb+jan+», «\verb+feb+» etc. \biber\ also does this, defining them as numbers since that is what \biblatex\ wants. In case you are also defining these yourself (although if you are only using \biblatex, there isn't much point), you will get macro redefinition warnings from the \verb+btparse+ library. You can turn off \biber's macro definitions to avoid this by using the option \opt{--nostdmacros}. \biber\ will look at any \bibfield{MONTH} field in a \BibTeX\ data source and if it's not a number as \biblatex\ expects (because it wasn't one of the macros as mentioned above or these macros were disabled by \opt{--nostdmacros}), it will try to turn it into the right number in the \verb+.bbl+. If you only use \biblatex\ with your \BibTeX\ datasource files, you should probably make any \bibfield{MONTH} fields be the numbers which \biblatex\ expects. \subsection{\biber\ datasource drivers}\label{dsd} \biber\ uses a modular datasource driver model to provide access to supported datasources. The drivers are responsible for mapping driver entrytypes and fields to the \biblatex\ data model according to a data model specification in the \biblatex\ file \file{blx-dm.def}. The data model can be changed using \biblatex\ macros in case you would like to, for example, use your own entrytype or field names or perhaps have \biber\ do some validation on your datasources (see the \biblatex\ manual). Data model mapping is an imprecise art and the drivers are the necessarily the most messy parts of \biber. Most datasource models are not designed with typesetting in mind and are usually not fine-grained enough to provide the sorts of information that \biblatex\ needs. \biber\ does its best to obtain as much meaningful information from a datasource as possible. Currently supported datasources drivers are: \begin{itemize} \item \BibTeX\ --- \BibTeX\ data files \item \verb+biblatexml+ --- Experimental \biblatex\ XML format \item \verb+ris+ --- Research Information Systems format \end{itemize} \subsection{Visualising the Output}\label{ref:vis} The option \opt{--output-format=dot} will cause \biber\ to write a GraphViz\footnote{\url{http://www.graphviz.org}} \verb+.dot+ file instead of a \verb+.bbl+. This file graphs the bibliographic data as it exists after all processing. You can transform this file using the \verb+dot+ program from GraphViz to generate a high quality graphical representation of the data in a format of your choice. A good output format choice with \verb+dot+ is SVG\footnote{Scalable Vector Graphics} which can be viewed in any modern web browser. This format has the advantage of tooltips and \biber\ uses these to give you more information on connections between entries: hover the cursor on an arrow in the output and it will tell you what it means. To output in SVG, use this command after installing GraphViz: \begin{verbatim} dot -Tsvg .dot -o .svg \end{verbatim} \noindent The \opt{--dot-include} option takes a comma delimited string as argument. The elements of this string define the information to include in the \verb+.dot+ output graph. The valid sub-options are shown in Table \ref{tab:graphopts}. If the \opt{--dot-include} option is not given then the default setting is implicitly used, which is: \begin{verbatim} --dot-include=crossref,section,xdata,xref \end{verbatim} \begin{table} \begin{center} \small \begin{tabular}{ll} \toprule Sub-option & Description\\ \midrule crossref & Show crossreference relationships\\ field & Show fields within entries\\ related & Show related entries and clones\\ section & Show sections\\ xdata & Show XDATA relationships\\ xref & Show XREF relationships\\ \bottomrule \end{tabular} \end{center} \caption{Valid sub-options for the \texttt{dot-include} option} \label{tab:graphopts} \end{table} \begin{figure}[!htpb] \centering\small \begin{tikzpicture} \node[rectangle, black, draw=black, fill=centry, align=center] (centry) { ()\\\\Cited entry}; \node[rectangle, black, draw=black, fill=ncentry, align=center] (ncentry) [right of=centry, node distance=11em] { ()\\\\Uncited entry}; \node[rectangle, black, draw=black, fill=doentry, align=center] (doentry) [right of=ncentry, node distance=11em] { ()\\\\dataonly entry}; \node[rectangle, black, draw=black, fill=section, align=center] (section) [below of=centry, node distance=5em] {Section \\\\Section}; \node[rectangle, black, draw=black, fill=set, align=center] (set) [right of=section, node distance=11em] { (SET)\\\\Entry set}; % CROSSREF \node[black] (cr1) [below of=section, node distance=6em] {A}; \node[black] (cr2) [right of=cr1, node distance=20em] {B}; \path (cr1) edge [->, color=crossref, very thick] node[auto, black] {B inherits by CROSSREF from A} (cr2); % XREF \node[black] (xr1) [below of=cr1, node distance=5em] {A}; \node[black] (xr2) [right of=xr1, node distance=20em] {B}; \path (xr1) edge [->, color=xref, style=dashed, very thick] node[auto, black] {B inherits by XREF from A} (xr2); % XDATA \node[black] (xd1) [below of=xr1, node distance=5em] {A}; \node[black] (xd2) [right of=xd1, node distance=20em] {B}; \path (xd1) edge [->, color=xdata, very thick] node[auto, black] {B inherits by XDATA from A} (xd2); % RELATED \node[black] (re1) [below of=xd1, node distance=5em] {A}; \node[black] (re2) [right of=re1, node distance=20em] {B}; \path (re1) edge [->, color=related, very thick] node[auto, black] {A is a related entry of B} (re2); % CLONE \node[black] (c1) [below of=re1, node distance=5em] {A}; \node[black] (c2) [right of=c1, node distance=20em] {B}; \path (c1) edge [->, color=clone, style=dashed, very thick] node[auto, black] {B is a clone of A} (c2); \end{tikzpicture} \caption{Key to \texttt{.dot} output format} \label{fig:graphkey} \end{figure} \bigskip \subsection{Tool Mode}\label{ref:tool} \biber\ can run in «tool» mode which is enabled with the \opt{--tool} command-line only option. In this mode, \biber is called: \opt{biber --tool }. Tool mode is a datasource rather than document oriented mode intended for transformations and modifications of datasources. It does not read a \file{.bcf} but instead, it reads all entries from the file «datasource», applies any changes specified in the command-line options and \biber\ config file and writes the resulting datasource out to a new file, defaulting to a \bibtex file called «\file{\_bibertool.bib}» if the options \opt{output-file} and \opt{output-format} are not specified. Tool mode is useful if you need to programatically change your datasource using the semantics provided by \biber or if you would like to convert your data to a different format. For example, you could choose to reencode your datasource by turning all UTF-8 characters into \latex\ macros: \begin{verbatim} biber --tool --output-encoding=ascii file.bib \end{verbatim} \noindent This would output a copy of \file{file.bib} called \file{file\_bibertool.bib} with all UTF-8 chars changed to \latex macros (because when the output is ASCII and the input encoding is not (it is by default UTF-8), then the \opt{--output-safechars} option is automatically enabled). If you utilise the \biber\ config file, you can set up a complex set of mappings to transform your datasource however you wish in a semantic manner much more robust than just textual search/replace. You can also use the \opt{--output-resolve} option which will process any \bibfield{XDATA} fields/entries, entry aliases and inheritance rules mentioned in the config file (see below). Sometimes, you might wish to output fields which are \bibtex macros, that is, you might want this: \begin{lstlisting}[style=bibtex, columns=fixed]{} @Entrytype{key, Field = something, } \end{lstlisting} % instead of this: \begin{lstlisting}[style=bibtex, columns=fixed]{} @Entrytype{key, Field = {something}, } \end{lstlisting} % That is, you might not want the output field in braces or quotes as this prevents \bibtex interpreting the field value as a macro. Use the \opt{--output-macro-fields} option to specify a comma-separated list of fields whose values you wish to output without any \bibtex quoting. You can have spaces between the items in the field list but then you must enclose the whole option value in quotes. For example, these two will do the same thing: \begin{verbatim} biber --tool --output-macro_fields=month,publisher biber --tool --output-macro_fields='month, publisher' \end{verbatim} Tool mode also allows some reformatting of the \file{.bib} file. The option \opt{--tool-fieldcase} can be used to force the entrytype and fieldnames to upper, lower or title case. The option \opt{--tool-indent} can be used to customise the indentation of fields. The option \opt{output-align} can be used to align all field values neatly. See the \biber\ \opt{--help} output for documentation and defaults. For example, the command: \begin{verbatim} biber --tool --output-fieldcase=title --output-indent=4 \ --output-align file.bib \end{verbatim} % results in \file{.bib} entries which look like this: \begin{lstlisting}[style=bibtex, columns=fixed]{} @Entrytype{key, Author = {...}, Title = {...}, Publisher = {...}, Year = {...}, } \end{lstlisting} % another example: \begin{verbatim} biber --tool --output-fieldcase=upper --output-indent=2 file.bib \end{verbatim} % results in entries like this: \begin{lstlisting}[style=bibtex]{} @ENTRYTYPE{key, AUTHOR = {...}, TITLE = {...}, PUBLISHER = {...}, YEAR = {...}, } \end{lstlisting} % Here is an example using the \biber config file to specify all options. This example uses tool mode to reformat the \file{.bib} and also to do some transformations using the source map functionality. Suppose \file{test.bib} contains the following: \begin{lstlisting}[style=bibtex]{} @book{book1, author = {Doe,J.P.}, title = {Ökologische Enterprises}, year = {2013} } \end{lstlisting} % Further suppose that the \file{biber-tool.conf} contains the following: \begin{lstlisting}[language=xml,escapechar=;,mathescape=true] title ascii 1 \end{lstlisting} % Now you can run \biber like this: \begin{verbatim} biber --tool --configfile=biber-tool.conf test.bib \end{verbatim} % The result will be in \file{test\_bibertool.bib} and will look like this: \begin{lstlisting}[style=bibtex, columns=fixed]{} @Book{book1, Author = {Doe, John Paul}, Title = {\"{O}kologische Enterprises}, Year = {2013}, } \end{lstlisting} % Tool mode is a versatile way of performing many different operations on a \file{.bib} file. By using the config file and tool mode, we have: \begin{itemize} \item Consistently indented and aligned the entry, normalising fields and entrytype to title case \item Normalised the \bibfield{AUTHOR} field name using regular expressions \item Converted UTF-8 characters to \latex macros, and made the output pure ASCII \end{itemize} If you do not specify any configuration file to use in tool mode, \biber will by default look for a config file in the usual way (see section \ref{conffile}) with the only difference that if no config file is found, it will use the default \file{biber-tool.conf} which is located in the \biber install tree in the same location as the \file{Config.pm} file. This default config file contains the default \biblatex source mappings for \bibtex datasources and also the default inheritance rules for \bibfield{CROSSREF} processing. This means that when you use the \opt{--tool-resolve} option, inheritance processing is performed on the entries and the results of this are «materialised» in the output. For example, consider a \file{test.bib} file: \begin{lstlisting}[style=bibtex, columns=fixed]{} @BOOK{xd1, AUTHOR = {Edward Ellington}, DATE = {2007}, XDATA = {macmillanalias} } @XDATA{macmillan, IDS = {macmillanalias}, XDATA = {macmillan:pubALIAS, macmillan:loc} } @XDATA{macmillan:pub, IDS = {macmillan:pubALIAS}, PUBLISHER = {Macmillan} } @XDATA{macmillan:loc, LOCATION = {New York and London}, NOTE = {A Note} } @BOOK{b1, TITLE = {Booktitle}, CROSSREF = {mvalias} } @MVBOOK{mv1, IDS = {mvalias}, TITLE = {Maintitle}, SUBTITLE = {Mainsubtitle}, TITLEADDON = {Maintitleaddon} } \end{lstlisting} % Running \biber as: \begin{verbatim} biber --tool --output-resolve test.bib \end{verbatim} % The result of this would be a file \file{test\_bibertool.bib} with contents: \begin{lstlisting}[style=bibtex, columns=fixed]{} @BOOK{xd1, AUTHOR = {Edward Ellington}, DATE = {2007}, LOCATION = {New York and London}, NOTE = {A Note}, PUBLISHER = {Macmillan}, } @XDATA{macmillan, LOCATION = {New York and London}, NOTE = {A Note}, PUBLISHER = {Macmillan}, } @XDATA{macmillan:pub, PUBLISHER = {Macmillan}, } @XDATA{macmillan:loc, LOCATION = {New York and London}, NOTE = {A Note}, } @BOOK{b1, MAINSUBTITLE = {Mainsubtitle}, MAINTITLE = {Maintitle}, MAINTITLEADDON = {Maintitleaddon}, TITLE = {Booktitle}, } @MVBOOK{mv1, SUBTITLE = {Mainsubtitle}, TITLE = {Maintitle}, TITLEADDON = {Maintitleaddon}, } \end{lstlisting} % Notice here that: \begin{itemize} \item \bibfield{XDATA} references have been resolved completely for entry \texttt{xd1} \item \bibfield{CROSSREF} inheritance has been resolved according to the default \biblatex inheritance rules for entry \texttt{b1} \item Entry key aliases have been resolved as required in order to perform these tasks \end{itemize} Tool mode can also be used to convert between datasource formats\footnote{This is currently rather experimental}. For example, if you wish to covert a \bibtex format data file to the experimental \texttt{biblatexml} XML format, you can do: \begin{verbatim} biber --tool --output-format=biblatexml file.bib \end{verbatim} \noindent This will output a file \file{file\_bibertool.bltxml} by default. The applicability of the various output options depends on the output format as shown in table \ref{tab:outopts} where dash means that the options has no relevance for the output format. \begin{table} \begin{center} \small \begin{tabular}{lllll} \toprule & \multicolumn{4}{c}{\emph{Output format}}\\ \emph{Option} & bibtex & biblatexml & bbl & dot\\ \midrule output-align & \checkmark & - & - & -\\ output-indent & \checkmark & \checkmark & - & -\\ output-fieldcase & \checkmark & - & - & -\\ output-macro-fields & \checkmark & - & - & -\\ output-resolve & \checkmark & \checkmark & - & -\\ \bottomrule \end{tabular} \end{center} \caption{Applicability of the output options} \label{tab:outopts} \end{table} \bigskip \subsubsection{Customising Tool Mode Inheritance Resolution} The default \file{biber-tool.conf} contains, as mentioned above, the default \biblatex \bibfield{CROSSREF} inheritance setup and \bibtex source mappings so that tool mode resolution works as expected. Of course it is possible to customise these. In \biblatex, this is accomplished by the \cmd{DeclareDataInheritance} macros which write appropriate XML into the \file{.bcf} file. Since no \file{.bcf} file is used in tool mode, the desired configuration must be put into a \biber config file. The source mapping XML specification is given in section \ref{ref:map}. The inheritance XML specification is given in section \ref{inheritance}. It is recommended to copy the default \file{biber-tool.conf} file, modify this and then use it as your own \file{biber.conf} file or pass it explicitly using the \opt{--configfile|-g} option. You can determine the location of the default tool mode config file by using the \opt{--tool-config} option which will show you the location of the config file and exit. \subsubsection{Customising Tool Mode Sorting} A global sorting scheme can be defined in the config file in order to sort the entries in tool mode output. See section \ref{sorting} for the format of the config file sorting specification. By default, in tool mode the sorting scheme is the same as the \biblatex \texttt{none} scheme, that is, no sorting is performed. The sorting locale in tool mode defaults to «\texttt{en\_US}» if you do not use \biber's \opt{sortlocale} option. \bigskip%|<- stop confusing emacs highlighting \section{Binaries}\label{binaries} \biber\ is a Perl application which relies heavily on quite a few modules. It is packaged as a stand-alone binary using the excellent \verb+PAR::Packer+ module which can pack an entire Perl tree plus dependencies into one file which acts as a stand-alone binary and is indistinguishable from such to the end user. You can also simply download the Perl source and run it as a normal Perl program which requires you to have a working Perl 5.16+ installation and the ability to install the pre-requisite modules. You would typically only do this if you wanted to keep up with all the bleeding-edge git commits before they had been packaged as a binary. Almost all users will not want to do this and should use the binaries from their \TeX\ distribution or downloaded directly from SourceForge in case they need to use a more recent binary than is included in their \TeX\ distribution. The binary distributions of \biber\ are made using the Perl \verb+PAR::Packer+ module. They can be used as a normal binary but have some behaviour which is worth noting: \begin{itemize} \item Don't be worried by the size of the binaries. \verb+PAR::Packer+ essentially constructs a self-extracting archive which unpacks the needed files first. \item On the first run of a new version (that is, with a specific hash), they actually unpack themselves to a temporary location which varies by operating system. This unpacking can take a little while and only happens on the first run of a new version. \textbf{Please don't kill the process if it seems to take some time to do anything on the first run of a new binary}. If you do, it will not unpack everything and it will almost certainly break \biber. You will then have to delete your binary cache (see section \ref{bc} below) and re-run the \biber\ executable again for the first time to allow it to unpack properly. \end{itemize} \subsection{Binary Caches}\label{bc} \verb+PAR::Packer+ works by unpacking the required files to a cache location. It only does this on the first run of a binary by computing a hash of the binary and comparing it with the cache directory name which contains the hash. So, if you run several versions of a binary, you will end up with several cached trees which are never used. This is particularly true if you are regularly testing new versions of the \biber\ binary. It is a good idea to delete the caches for older binaries as they are not needed and can take up a fair bit of space. The caches are located in a temporary location which varies from OS to OS. The cache name is:\\[1ex] \noindent\verb+par-/cache-+ (Linux/Unix/OSX)\\ \verb+par-\cache-+ (Windows)\\[1ex] \noindent The temp location is not always obvious but these are sensible places to look (where \verb+*+ can vary depending on username): \begin{itemize} \item \verb+/var/folders/*/*/*/+ (OSX, local GUI login shell) \item \verb+/var/tmp/+ (OSX (remote ssh login shell), Unix) \item \verb+/tmp/+ (Linux) \item \verb+C:\Documents and Settings\\Local Settings\Temp+ (Windows/Cygwin) \item \verb+C:\Windows\Temp+ (Windows) \end{itemize} \noindent To clean up, you can just remove the whole \verb+par-+ directory/folder and then run the current binary again. You can see the active cache by running biber with the \texttt{--cache} option which will print the current cache location and exit. \subsection{Binary Architectures} Binaries are available for many architectures, directly on SourceForge and also via \TeX Live: \begin{itemize} \item \verb+darwin_x86_64+ \item \verb+darwin_x86_i386+ \item \verb+linux_x86_32+ \item \verb+linux_x86_64+ \item \verb+MSWin32+ \item \verb+MSWin64+ \item \verb+cygwin32+\tpb \item \verb+freebsd_x86+\tpb \item \verb+freebsd_amd64+\tpb \item \verb+solaris_i386+\tpb \item \verb+solaris_x86_64+\tpb \end{itemize} \noindent If you want to run development versions, they are usually only regularly updated for the core architectures which are not flagged as third-party built above. If you want to regularly run the latest development version, you should probably git clone the relevant branch and run \biber\ as a pure Perl program directly. \subsection{Installing} These instructions only apply to manually downloaded binaries. If \biber\ came with your \TeX\ distribution just use it as normal. Download the binary appropriate to you OS/arch\footnote{\url{https://sourceforge.net/projects/biblatex-biber}}. Below I assume it's on your desktop. You have to move the binary to somewhere in you command-line or \TeX\ utility path so that it can be found. If you know how to do this, just ignore the rest of this section which contains some instructions for users who are not sure about this. \subsubsection{OSX} If you are using the \TeX Live Mac\TeX\ distribution: \begin{verbatim} sudo mv ~/Desktop/biber /usr/texbin/ sudo chmod +x /usr/texbin/biber \end{verbatim} \noindent If you are using the MacPorts \TeX Live distribution: \begin{verbatim} sudo mv ~/Desktop/biber /opt/local/bin/ sudo chmod +x /opt/local/bin/biber \end{verbatim} \noindent The «\verb+sudo+» commands will prompt you for your password. \subsubsection{Windows} The easiest way is to just move the executable into your \verb+C:\Windows+ directory since that is always in your path. A more elegant way is to put it somewhere in your \TeX\ distribution that is already in your path. For example if you are using MiK\TeX: \begin{verbatim} C:\Program Files\MiKTeX 2.9\miktex\bin\ \end{verbatim} \subsubsection{Unix/Linux} \begin{verbatim} sudo mv ~/Desktop/biber /usr/local/bin/biber sudo chmod +x /usr/local/bin/biber \end{verbatim} \noindent Make sure \verb+/usr/local/bin+ is in your PATH. Search Google for «set PATH linux» if unsure about this. There are many pages about this, for example: \url{http://www.cyberciti.biz/faq/unix-linux-adding-path/} \subsection{Building} Instructions for those who want/need to build an executable from the Perl version. For this, you will need to have Perl 5.16+ with the following modules: \begin{itemize} \item All \biber\ pre-requisites \item \verb+PAR::Packer+ and all dependencies \end{itemize} \noindent You should have the latest CPAN versions of all required modules as \biber\ is very specific in some cases about module versions and sometimes depends on recent fixes. You can see if you have the \biber\ Perl dependencies by the usual \begin{verbatim} perl ./Build.PL \end{verbatim} \noindent invocation in the \biber\ Perl distribution tree directory. Normally, the build procedure for the binaries is as follows\footnote{On Unix-like systems, you may need to specify a full path to the scripts e.g. \texttt{./Build}}: \begin{itemize} \item Get the \biber\ source tree from SF and put it on the architecture you are building for \item cd to the root of the source tree \item \verb+perl Build.PL+ (this will check your module dependencies) \item \verb+Build test+ \item \verb+Build install+ (may need to run this as sudo on Unix-like systems) \item \verb+cd dist/+ \item \verb+build.sh+ (\verb+build.bat+ on Windows) \end{itemize} \noindent This leaves a binary called «\verb+biber-+» (also with a «\verb+.exe+» extension on Windows/Cygwin) in your current directory. The tricky part is constructing the information for the build script. There are two things that need to be configured, both of which are required by the \verb+PAR::Packer+ module: \begin{enumerate} \item A list of modules/libraries to include in the binary which are not automatically detected by the \verb+PAR::Packer+ dependency scanner \item A list of extra files to include in the binary which are not automatically detected by the \verb+PAR::Packer+ dependency scanner \end{enumerate} \noindent To build \biber\ for a new architecture you need to define these two things as part of constructing new build scripts: \begin{itemize} \item Make a new sub-folder in the \verb+dist+ directory named after the architecture you are building for. \item Copy the \verb+biber.files+ file from an existing build architecture into this directory. \item For all of the files with absolute pathnames in there (that is, ones we are not pulling from the \biber\ tree itself), locate these files in your Perl installation tree and put the correct path in the file. \item Copy the build script from a similar architecture (i.e. Windows/non-Windows \ldots) to your new architecture directory. \item Change the \opt{--link} options to point to where the required libraries reside on your system. \item Change the \opt{--output} option to name the resulting binary for your architecture. \item Run the build script \end{itemize} \noindent The \opt{--link} options can be a little tricky sometimes. It is usually best to build without them once and then run \verb+ldd+ (or OS equivalent) on the binary to see which version/location of a library you should link to. You can also try just running the binary and it should complain about missing libraries and where it expected to find them. Put this path into the \opt{--link} option. The \opt{--module} options are the same for all architectures and do not need to be modified. On architectures which have or can have case-insensitive file systems, you should use the build script from either Windows or OSX as a reference as these include a step to copy the main \biber\ script to a new name before packing the binary. This is required as otherwise a spurious error is reported to the user on first run of the binary due to a name collision when it unpacks itself. See the \verb+PAR+ wiki page\footnote{\url{http://par.perl.org/wiki/Main_Page}} for FAQs and help on building with \verb+PAR::Packer+. Take special note of the FAQs on including libraries with the packed binary\footnote{\url{http://par.perl.org/wiki/FAQ}, section entitled «My PAR executable needs some dynamic libraries»}. \subsubsection{Testing a binary build} You can test a binary that you have created by copying it to a machine which preferably doesn't have \verb+perl+ at all on it. Running the binary with no arguments will unpack it in the background and display the help. To really test it without having \latex\ available, get the two quick test files from SourceForge\footnote{\url{https://sourceforge.net/projects/biblatex-biber/files/biblatex-biber/testfiles}}, put them in a directory and run \biber\ in that directory like this: \begin{verbatim} biber --validate-control --convert-control test \end{verbatim} \noindent This will run \biber\ normally on the test files plus it will also perform an XSLT transform on the \verb+.bcf+ and leave an HTML representation of it in the same directory thus testing the links to the XML and XSLT libraries as well as the \BibTeX\ parsing libraries. The output should look something like this (may be differences of \biber\ version and locale of course but there should be no errors or warnings). \begin{verbatim} INFO - This is Biber 2.4 INFO - Logfile is 'test.blg' INFO - BibLaTeX control file 'test.bcf' validates INFO - Converted BibLaTeX control file 'test.bcf' to 'test.bcf.html' INFO - Reading 'test.bcf' INFO - Found 1 citekeys in bib section 0 INFO - Processing bib section 0 INFO - Looking for BibTeX format file 'test.bib' for section 0 INFO - Found BibTeX data file 'test.bib' INFO - Decoding LaTeX character macros into UTF-8 INFO - Sorting list 'nyt/global' keys INFO - No sort tailoring available for locale 'en_GB.UTF-8' INFO - Sorting list 'shorthands/global' keys INFO - No sort tailoring available for locale 'en_GB.UTF-8' INFO - Writing 'test.bbl' with encoding 'UTF-8' INFO - Output to test.bbl \end{verbatim} \noindent There should now be these new files in the directory: \begin{verbatim} test.bcf.html test.blg test.bbl \end{verbatim} \appendix \section{Appendix} \subsection{Babel/Polyglossia language to Locale mapping}\label{localemap} \begin{center} \footnotesize \begin{tabular}{alalalal} \toprule Language & Locale & Language & Locale & Language & Locale & Language & Locale\\ \midrule acadian & \texttt{fr\_CA} & divehi & \texttt{dv\_MV} & latin & \texttt{sr\_Latn} & sanskrit & \texttt{sa\_IN}\\ american & \texttt{en\_US} & dutch & \texttt{nl\_NL} & latvian & \texttt{lv\_LV} & scottish & \texttt{gd\_GB}\\ australian & \texttt{en\_AU} & english & \texttt{en\_US} & lithuanian & \texttt{lt\_LT} & serbian & \texttt{sr\_Cyrl}\\ afrikaans & \texttt{af\_ZA} & esperanto & \texttt{eo\_001} & lowersorbian & \texttt{dsb\_DE} & serbianc & \texttt{sr\_Cyrl}\\ albanian & \texttt{sq\_AL} & estonian & \texttt{et\_EE} & lsorbian & \texttt{dsb\_DE} & slovak & \texttt{sk\_SK}\\ amharic & \texttt{am\_ET} & ethiopia & \texttt{am\_ET} & magyar & \texttt{hu\_HU} & slovene & \texttt{sl\_SI}\\ arabic & \texttt{ar\_001} & farsi & \texttt{fa\_IR} & malay & \texttt{id\_ID} & slovenian & \texttt{sl\_SI}\\ armenian & \texttt{hy\_AM} & finnish & \texttt{fi\_FI} & malayalam & \texttt{ml\_IN} & spanish & \texttt{es\_ES}\\ asturian & \texttt{ast\_ES} & francais & \texttt{fr\_FR} & marathi & \texttt{mr\_IN} & swedish & \texttt{sv\_SE}\\ austrian & \texttt{de\_AT} & french & \texttt{fr\_FR} & meyalu & \texttt{id\_ID} & syriac & \texttt{syc}\\ bahasa & \texttt{id\_ID} & frenchle & \texttt{fr\_FR} & mongolian & \texttt{mn\_Cyrl} & tamil & \texttt{ta\_IN}\\ bahasai & \texttt{id\_ID} & friulan & \texttt{fur\_IT} & naustrian & \texttt{de\_AT} & telugu & \texttt{te\_IN}\\ bahasam & \texttt{id\_ID} & galician & \texttt{gl\_ES} & newzealand & \texttt{en\_US} & thai & \texttt{th\_TH}\\ basque & \texttt{eu\_ES} & german & \texttt{de\_DE} & ngerman & \texttt{de\_DE} & thaicjk & \texttt{th\_TH}\\ bengali & \texttt{bn\_BD} & germanb & \texttt{de\_DE} & nko & \texttt{ha\_NG} & tibetan & \texttt{bo\_CN}\\ bgreek & \texttt{el\_GR} & greek & \texttt{el\_GR} & norsk & \texttt{nb\_NO} & turkish & \texttt{tr\_TR}\\ brazil & \texttt{pt\_BR} & hebrew & \texttt{he\_IL} & nynorsk & \texttt{nn\_NO} & turkmen & \texttt{tk\_TM}\\ brazilian & \texttt{pt\_BR} & hindi & \texttt{hi\_IN} & occitan & \texttt{oc\_FR} & ukrainian & \texttt{uk\_UA}\\ breton & \texttt{br\_FR} & ibygreek & \texttt{el\_CY} & piedmontese & \texttt{pms\_IT} & urdu & \texttt{ur\_IN}\\ british & \texttt{en\_GB} & icelandic & \texttt{is\_IS} & pinyin & \texttt{pny} & UKenglish & \texttt{en\_GB}\\ bulgarian & \texttt{bg\_BG} & indon & \texttt{id\_ID} & polish & \texttt{pl\_PL} & uppersorbian & \texttt{hsb\_DE}\\ canadian & \texttt{en\_US} & indonesia & \texttt{id\_ID} & polutonikogreek & \texttt{el\_GR} & USenglish & \texttt{en\_US}\\ canadien & \texttt{fr\_CA} & interlingua & \texttt{ia\_FR} & portuges & \texttt{pt\_PT} & usorbian & \texttt{hsb\_DE}\\ catalan & \texttt{ca\_ES} & irish & \texttt{ga\_IE} & portuguese & \texttt{pt\_PT} & vietnamese & \texttt{vi\_VN}\\ coptic & \texttt{cop} & italian & \texttt{it\_IT} & romanian & \texttt{ro\_RO} & welsh & \texttt{cy\_GB}\\ croatian & \texttt{hr\_HR} & japanese & \texttt{ja\_JP} & romansh & \texttt{rm\_CH}\\ czech & \texttt{cs\_CZ} & kannada & \texttt{kn\_IN} & russian & \texttt{ru\_RU}\\ danish & \texttt{da\_DK} & lao & \texttt{lo\_LA} & samin & \texttt{se\_NO}\\ \bottomrule \end{tabular} \end{center} \end{document} biblatex-biber-2.4/lib000755000765000024 012667073765 15111 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber.pm000444000765000024 37621012667073765 16700 0ustar00philkimestaff000000000000package Biber; use v5.16; use strict; use warnings; use parent qw(Class::Accessor Biber::Internals); use constant { EXIT_OK => 0, EXIT_ERROR => 2 }; use Carp; use Encode; use File::Copy; use File::Spec; use File::Temp; use IO::File; use POSIX qw( locale_h ); # for sorting with built-in "sort" use Biber::Config; use Biber::Constants; use List::AllUtils qw( first uniq max ); use Biber::DataModel; use Biber::Internals; use Biber::Entries; use Biber::Entry; use Biber::Entry::Names; use Biber::Entry::Name; use Biber::Sections; use Biber::Section; use Biber::LaTeX::Recode; use Biber::SortLists; use Biber::SortList; use Biber::Utils; use Log::Log4perl qw( :no_extra_logdie_message ); use Data::Dump; use Data::Compare; use Text::BibTeX qw(:macrosubs); use Unicode::Normalize; use POSIX qw( locale_h ); # for lc() =encoding utf-8 =head1 NAME Biber - main module for biber, a bibtex replacement for users of biblatex =cut my $logger = Log::Log4perl::get_logger('main'); =head1 SYNOPSIS use Biber; my $biber = Biber->new(); $biber->parse_ctrlfile("example.bcf"); $biber->prepare; =cut our $MASTER; # reference to biber object. Needed all over the place =head1 METHODS =head2 new Initialize the Biber object, optionally passing named options as arguments. =cut sub new { my ($class, %opts) = @_; my $self = bless {}, $class; Biber::Config->_initopts(\%opts); # Add a reference to a global temp dir we might use for various things $self->{TEMPDIR} = File::Temp->newdir(); # Initialise recoding schemes Biber::LaTeX::Recode->init_sets(Biber::Config->getoption('decodecharsset'), Biber::Config->getoption('output_safecharsset')); $MASTER = $self; # Validate if asked to # This has to be here, after config file is read and options # are parsed. It seems strange to validate the config file after it's been # read but there is no choice and it's useful anyway as this will catch some semantic # errors. Uses biber_error() and so $MASTER has to be defined before we call this if (Biber::Config->getoption('validate_config') and $opts{configfile}) { validate_biber_xml($opts{configfile}, 'config', ''); } return $self; } =head2 display_problems Output summary of warnings/errors before exit =cut sub display_problems { my $self = shift; if ($self->{warnings}) { $logger->info('WARNINGS: ' . $self->{warnings}); } if ($self->{errors}) { $logger->info('ERRORS: ' . $self->{errors}); exit EXIT_ERROR; } } =head2 biber_tempdir my $sections= $biber->biber_tempdir Returns a File::Temp directory object for use in various things =cut sub biber_tempdir { my $self = shift; return $self->{TEMPDIR}; } =head2 sections my $sections= $biber->sections Returns a Biber::Sections object describing the bibliography sections =cut sub sections { my $self = shift; return $self->{sections}; } =head2 add_sections Adds a Biber::Sections object. Used externally from, e.g. biber =cut sub add_sections { my ($self, $sections) = @_; $self->{sections} = $sections; return; } =head2 sortlists my $sortlists= $biber->sortlists Returns a Biber::SortLists object describing the bibliography sorting lists =cut sub sortlists { my $self = shift; return $self->{sortlists}; } =head2 set_output_obj Sets the object used to output final results Must be a subclass of Biber::Output::base =cut sub set_output_obj { my $self = shift; my $obj = shift; croak('Output object must be subclass of Biber::Output::base!') unless $obj->isa('Biber::Output::base'); $self->{output_obj} = $obj; return; } =head2 get_preamble Returns the current preamble as an array ref =cut sub get_preamble { my $self = shift; return $self->{preamble}; } =head2 get_output_obj Returns the object used to output final results =cut sub get_output_obj { my $self = shift; return $self->{output_obj}; } =head2 set_current_section Sets the current section number that we are working on to a section number =cut sub set_current_section { my $self = shift; my $secnum = shift; $self->{current_section} = $secnum; return; } =head2 get_current_section Gets the current section number that we are working on =cut sub get_current_section { my $self = shift; return $self->{current_section}; } =head2 tool_mode_setup Fakes parts of the control file for tool mode =cut sub tool_mode_setup { my $self = shift; my $bib_sections = new Biber::Sections; # There are no sections in tool mode so create a pseudo-section my $bib_section = new Biber::Section('number' => 99999); $bib_section->set_datasources([{type => 'file', name => $ARGV[0], datatype => Biber::Config->getoption('input_format')}]); $bib_section->set_allkeys(1); $bib_sections->add_section($bib_section); # Add the Biber::Sections object to the Biber object $self->add_sections($bib_sections); my $sortlists = new Biber::SortLists; my $seclist = Biber::SortList->new(section => 99999, sortschemename => Biber::Config->getblxoption('sortscheme'), sortnamekeyschemename => 'global', name => Biber::Config->getblxoption('sortscheme') . '/global'); $seclist->set_type('entry'); $seclist->set_sortscheme(Biber::Config->getblxoption('sorting')); # Locale just needs a default here - there is no biblatex option to take it from Biber::Config->setblxoption('sortlocale', 'en_US'); $logger->debug("Adding 'entry' list 'tool' for pseudo-section 99999"); $sortlists->add_list($seclist); $self->{sortlists} = $sortlists; # User maps are set in config file and need some massaging which normally # happens in parse_ctrlfile if (my $usms = Biber::Config->getoption('sourcemap')) { # Force "user" level for the maps @$usms = map {$_->{level} = 'user';$_} @$usms; } return; } =head2 parse_ctrlfile This method reads the control file generated by biblatex to work out the various biblatex options. See Constants.pm for defaults and example of the data structure being built here. =cut sub parse_ctrlfile { my ($self, $ctrl_file) = @_; my $ctrl_file_path = locate_biber_file($ctrl_file); Biber::Config->set_ctrlfile_path($ctrl_file_path); biber_error("Cannot find control file '$ctrl_file'! - did you pass the \"backend=biber\" option to BibLaTeX?") unless ($ctrl_file_path and -e $ctrl_file_path); # Early check to make sure .bcf is well-formed. If not, this means that the last biblatex run # exited prematurely while writing the .bcf. This results is problems for latexmk. So, if the # .bcf is broken, just stop here, remove the .bcf and exit with error so that we don't write # a bad .bbl my $checkbuf = File::Slurp::read_file($ctrl_file_path) or biber_error("Cannot open $ctrl_file_path: $!"); $checkbuf = NFD(decode('UTF-8', $checkbuf));# Unicode NFD boundary unless (eval "XML::LibXML->load_xml(string => \$checkbuf)") { my $output = $self->get_output_obj->get_output_target_file; unlink($output); biber_error("$ctrl_file_path is malformed, last biblatex run probably failed. Deleted $output"); } # Validate if asked to if (Biber::Config->getoption('validate_control')) { validate_biber_xml($ctrl_file_path, 'bcf', 'https://sourceforge.net/projects/biblatex'); } # Convert .bcf to .html using XSLT transform if asked to if (Biber::Config->getoption('convert_control')) { require XML::LibXSLT; require XML::LibXML; my $xslt = XML::LibXSLT->new(); my $CFstyle; # we assume that the schema files are in the same dir as Biber.pm: (my $vol, my $biber_path, undef) = File::Spec->splitpath( $INC{"Biber.pm"} ); # Deal with the strange world of PAR::Packer paths # We might be running inside a PAR executable and @INC is a bit odd in this case # Specifically, "Biber.pm" in @INC might resolve to an internal jumbled name # nowhere near to these files. You know what I mean if you've dealt with pp my $bcf_xsl; if ($biber_path =~ m|/par\-| and $biber_path !~ m|/inc|) { # a mangled PAR @INC path $bcf_xsl = File::Spec->catpath($vol, "$biber_path/inc/lib/Biber", 'bcf.xsl'); } else { $bcf_xsl = File::Spec->catpath($vol, "$biber_path/Biber", 'bcf.xsl'); } if (-e $bcf_xsl) { $CFstyle = XML::LibXML->load_xml( location => $bcf_xsl, no_cdata=>1 ) } else { biber_warn("Cannot find XML::LibXSLT stylesheet. Skipping conversion : $!"); goto LOADCF; } my $CF = XML::LibXML->load_xml(location => $ctrl_file_path); my $stylesheet = $xslt->parse_stylesheet($CFstyle); my $CFhtml = $stylesheet->transform($CF); $stylesheet->output_file($CFhtml, $ctrl_file_path . '.html'); $logger->info("Converted BibLaTeX control file '$ctrl_file_path' to '$ctrl_file_path.html'"); } # Open control file LOADCF: $logger->info("Reading '$ctrl_file_path'"); my $buf = File::Slurp::read_file($ctrl_file_path) or biber_error("Cannot open $ctrl_file_path: $!"); $buf = NFD(decode('UTF-8', $buf));# Unicode NFD boundary # Read control file require XML::LibXML::Simple; my $bcfxml = XML::LibXML::Simple::XMLin($buf, 'ForceContent' => 1, 'ForceArray' => [ qr/\Acitekey\z/, qr/\Aoption\z/, qr/\Aoptions\z/, qr/\Avalue\z/, qr/\Asortitem\z/, qr/\Abibdata\z/, qr/\Adatasource\z/, qr/\Aconstant\z/, qr/\Asection\z/, qr/\Asortexclusion\z/, qr/\Aexclusion\z/, qr/\Asort\z/, qr/\Amode\z/, qr/\Amaps\z/, qr/\Amap\z/, qr/\Amap_step\z/, qr/\Aper_type\z/, qr/\Aper_nottype\z/, qr/\Akeypart\z/, qr/\Apart\z/, qr/\Asortingnamekey\z/, qr/\Aper_datasource\z/, qr/\Anosort\z/, qr/\Anoinit\z/, qr/\Anolabel\z/, qr/\Anolabelwidthcount\z/, qr/\Apresort\z/, qr/\Atype_pair\z/, qr/\Ainherit\z/, qr/\Afieldor\z/, qr/\Afieldxor\z/, qr/\Afield\z/, qr/\Aalias\z/, qr/\Aalsoset\z/, qr/\Aconstraints\z/, qr/\Aconstraint\z/, qr/\Aentrytype\z/, qr/\Adatetype\z/, qr/\Asortlist\z/, qr/\Alabel(?:part|element|alphatemplate)\z/, qr/\Acondition\z/, qr/\Afilter(?:or)?\z/, qr/\Aoptionscope\z/, ], 'NsStrip' => 1, 'KeyAttr' => []); # use Data::Dump;dd($bcfxml);exit 0; my $controlversion = $bcfxml->{version}; Biber::Config->setblxoption('controlversion', $controlversion); unless ($controlversion eq $BCF_VERSION) { biber_warn("Warning: Found biblatex control file version $controlversion, expected version $BCF_VERSION"); } # Look at control file and populate our main data structure with its information # Option scope foreach my $bcfscopeopts (@{$bcfxml->{optionscope}}) { my $scope = $bcfscopeopts->{type}; foreach my $bcfscopeopt (@{$bcfscopeopts->{option}}) { my $opt = $bcfscopeopt->{content}; $CONFIG_OPTSCOPE_BIBLATEX{$opt}{$scope} = 1; $CONFIG_SCOPEOPT_BIBLATEX{$scope}{$opt} = 1; if (defined($CONFIG_OPTTYPE_BIBLATEX{$opt}) and lc($CONFIG_OPTTYPE_BIBLATEX{$opt}) ne lc($bcfscopeopt->{datatype})) { biber_warn("Warning: Datatype for biblatex option '$opt' has conflicting values, probably at different scopes. This is not supported."); } else { $CONFIG_OPTTYPE_BIBLATEX{$opt} = lc($bcfscopeopt->{datatype}); } } } # Now we have the per-namelist options, make the accessors for them in the Names package foreach my $nso (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAMELIST}}) { Biber::Entry::Names->follow_best_practice; Biber::Entry::Names->mk_accessors($nso); } # Now we have the per-name options, make the accessors for them in the Name package foreach my $no (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAME}}) { Biber::Entry::Name->follow_best_practice; Biber::Entry::Name->mk_accessors($no); } # OPTIONS foreach my $bcfopts (@{$bcfxml->{options}}) { # Biber options if ($bcfopts->{component} eq 'biber') { # Global options if ($bcfopts->{type} eq 'global') { foreach my $bcfopt (@{$bcfopts->{option}}) { # unless already explicitly set from cmdline/config file unless (Biber::Config->isexplicitoption($bcfopt->{key}{content})) { if ($bcfopt->{type} eq 'singlevalued') { Biber::Config->setoption($bcfopt->{key}{content}, $bcfopt->{value}[0]{content}); } elsif ($bcfopt->{type} eq 'multivalued') { Biber::Config->setoption($bcfopt->{key}{content}, [ map {$_->{content}} sort {$a->{order} <=> $b->{order}} @{$bcfopt->{value}} ]); } } } } } # BibLaTeX options if ($bcfopts->{component} eq 'biblatex') { # Global options if ($bcfopts->{type} eq 'global') { foreach my $bcfopt (@{$bcfopts->{option}}) { if ($bcfopt->{type} eq 'singlevalued') { Biber::Config->setblxoption($bcfopt->{key}{content}, $bcfopt->{value}[0]{content}); } elsif ($bcfopt->{type} eq 'multivalued') { # sort on order attribute and then remove it Biber::Config->setblxoption($bcfopt->{key}{content}, [ map {delete($_->{order}); $_} sort {$a->{order} <=> $b->{order}} @{$bcfopt->{value}} ]); } } } # Entrytype options else { my $entrytype = $bcfopts->{type}; foreach my $bcfopt (@{$bcfopts->{option}}) { if ($bcfopt->{type} eq 'singlevalued') { Biber::Config->setblxoption($bcfopt->{key}{content}, $bcfopt->{value}[0]{content}, 'ENTRYTYPE', $entrytype); } elsif ($bcfopt->{type} eq 'multivalued') { # sort on order attribute and then remove it Biber::Config->setblxoption($bcfopt->{key}{content}, [ map {delete($_->{order}); $_} sort {$a->{order} <=> $b->{order}} @{$bcfopt->{value}} ], 'ENTRYTYPE', $entrytype); } } } } } # DATASOURCE MAPPING # This is special as it's both a biblatex option and a biber option # We merge into the biber option # In biblatex you can set driver mappings but not in biber # Order of application of maps is decided by the level and within 'user' level, # which can come from two places (biber.conf and \DeclareSourcemap), order is # \DeclareSourcemap, then biber.conf if (exists($bcfxml->{sourcemap})) { # User maps are set in config file if (my $usms = Biber::Config->getoption('sourcemap')) { # Force "user" level for the maps @$usms = map {$_->{level} = 'user';$_} @$usms; # Merge any user maps from the document set by \DeclareSourcemap into user # maps set in the biber config file. These document user maps take precedence so go # at the front of any other user maps # Are there any doc maps to merge? if (my @docmaps = grep {$_->{level} eq 'user'} @{$bcfxml->{sourcemap}{maps}}) { # If so, get a reference to the maps in the config map and prepend all # of the doc maps to it. Must also deref the doc maps map element to make # sure that they collapse nicely my $configmaps = first {$_->{level} eq 'user'} @$usms; unshift(@{$configmaps->{map}}, map {@{$_->{map}}} @docmaps); } # Merge the driver/style maps with the user maps from the config file if (my @m = grep {$_->{level} eq 'driver' or $_->{level} eq 'style'} @{$bcfxml->{sourcemap}{maps}} ) { Biber::Config->setoption('sourcemap', [@$usms, @m]); } else { # no driver defaults, just override the config file user map settings Biber::Config->setoption('sourcemap', $bcfxml->{sourcemap}{maps}); } } else { # just write the option as there are no config file settings at all Biber::Config->setoption('sourcemap', $bcfxml->{sourcemap}{maps}); } } # LABELALPHA TEMPLATE foreach my $t (@{$bcfxml->{labelalphatemplate}}) { my $latype = $t->{type}; if ($latype eq 'global') { Biber::Config->setblxoption('labelalphatemplate', $t); } else { Biber::Config->setblxoption('labelalphatemplate', $t, 'ENTRYTYPE', $latype); } } # INHERITANCE schemes for crossreferences (always global) Biber::Config->setblxoption('inheritance', $bcfxml->{inheritance}); # NOINIT # Make the data structure look like the biber config file structure # "value" is forced to arrays for other elements so we extract # the first element here as they will always be only length=1 my $noinit; foreach my $ni (@{$bcfxml->{noinits}{noinit}}) { push @$noinit, { value => $ni->{value}[0]}; } # There is a default so don't set this option if nothing is in the .bcf Biber::Config->setoption('noinit', $noinit) if $noinit; # NOLABEL # Make the data structure look like the biber config file structure # "value" is forced to arrays for other elements so we extract # the first element here as they will always be only length=1 my $nolabel; foreach my $nl (@{$bcfxml->{nolabels}{nolabel}}) { push @$nolabel, { value => $nl->{value}[0]}; } # There is a default so don't set this option if nothing is in the .bcf Biber::Config->setoption('nolabel', $nolabel) if $nolabel; # NOLABELWIDTHCOUNT # Make the data structure look like the biber config file structure # "value" is forced to arrays for other elements so we extract # the first element here as they will always be only length=1 my $nolabelwidthcount; foreach my $nlwc (@{$bcfxml->{nolabelwidthcounts}{nolabelwidthcount}}) { push @$nolabelwidthcount, { value => $nlwc->{value}[0]}; } # There is a default so don't set this option if nothing is in the .bcf Biber::Config->setoption('nolabelwidthcount', $nolabelwidthcount) if $nolabelwidthcount; # NOSORT # Make the data structure look like the biber config file structure # "field" and "value" are forced to arrays for other elements so we extract # the first element here as they will always be only length=1 my $nosort; foreach my $ns (@{$bcfxml->{nosorts}{nosort}}) { push @$nosort, { name => $ns->{field}[0], value => $ns->{value}[0]}; } # There is a default so don't set this option if nothing is in the .bcf Biber::Config->setoption('nosort', $nosort) if $nosort; # SORTING NAME KEY # Use the order attributes to make sure things are in right order and create a data structure # we can use later my $snss; foreach my $sns (@{$bcfxml->{sortingnamekey}}) { my $snkps; foreach my $snkp (sort {$a->{order} <=> $b->{order}} @{$sns->{keypart}}) { my $snps; foreach my $snp (sort {$a->{order} <=> $b->{order}} @{$snkp->{part}}) { my $np; if ($snp->{type} eq 'namepart') { $np = { type => 'namepart', value => $snp->{content} }; if (exists($snp->{use})) { $np->{use} = $snp->{use}; } } elsif ($snp->{type} eq 'literal') { $np = { type => 'literal', value => $snp->{content} }; } push @$snps, $np; } push @$snkps, $snps; } $snss->{$sns->{keyscheme}} = $snkps; } Biber::Config->setblxoption('sortingnamekey', $snss); # SORTING # sorting excludes foreach my $sex (@{$bcfxml->{sorting}{sortexclusion}}) { my $excludes; foreach my $ex (@{$sex->{exclusion}}) { $excludes->{$ex->{content}} = 1; } Biber::Config->setblxoption('sortexclusion', $excludes, 'ENTRYTYPE', $sex->{type}); } # presort defaults foreach my $presort (@{$bcfxml->{sorting}{presort}}) { # Global presort default unless (exists($presort->{type})) { Biber::Config->setblxoption('presort', $presort->{content}); } # Per-type default else { Biber::Config->setblxoption('presort', $presort->{content}, 'ENTRYTYPE', $presort->{type}); } } my $sorting = _parse_sort($bcfxml->{sorting}); Biber::Config->setblxoption('sorting', $sorting); # DATAMODEL schema (always global) Biber::Config->setblxoption('datamodel', $bcfxml->{datamodel}); # SECTIONS # This is also where we set data files as these are associated with a bib section # Data sources my %bibdatasources = (); foreach my $data (@{$bcfxml->{bibdata}}) { foreach my $datasource (@{$data->{datasource}}) { unless (first {$_->{type} eq $datasource->{type} and $_->{datatype} eq $datasource->{datatype} and $_->{name} eq $datasource->{content}} @{$bibdatasources{$data->{section}[0]}}) { push @{$bibdatasources{$data->{section}[0]}}, { type => $datasource->{type}, name => $datasource->{content}, datatype => $datasource->{datatype} }; } } } # Be friendly to latexmk etc. unless (%bibdatasources) { biber_warn("No data sources defined!"); exit EXIT_OK; } my $key_flag = 0; my $bib_sections = new Biber::Sections; SECTION: foreach my $section (@{$bcfxml->{section}}) { my $bib_section; my $secnum = $section->{number}; # Can be multiple section 0 entries and so re-use that section object if it exists if (my $existing_section = $bib_sections->get_section($secnum)) { $bib_section = $existing_section; } else { $bib_section = new Biber::Section('number' => $secnum); } # Set the data files for the section unless we've already done so # (for example, for multiple section 0 entries) $bib_section->set_datasources($bibdatasources{$secnum}) unless $bib_section->get_datasources; my @keys = (); foreach my $keyc (@{$section->{citekey}}) { my $key = NFD($keyc->{content});# Key is already UTF-8 - it comes from UTF-8 XML # Stop reading citekeys if we encounter "*" as a citation as this means # "all keys" if ($key eq '*') { $bib_section->set_allkeys(1); $key_flag = 1; # There is at least one key, used for error reporting below } elsif (not Biber::Config->get_seenkey($key, $secnum)) { # Dynamic set definition # Save dynamic key -> member keys mapping for set entry auto creation later # We still need to find these even if allkeys is set if (exists($keyc->{type}) and $keyc->{type} eq 'set') { $bib_section->set_dynamic_set($key, split /\s*,\s*/, $keyc->{members}); push @keys, $key; $key_flag = 1; # There is at least one key, used for error reporting below } else { next if $bib_section->is_allkeys; # Skip if we have already encountered '*' # Set order information - there is no order on dynamic key defs above # as they are a definition, not a cite Biber::Config->set_keyorder($secnum, $key, $keyc->{order}); push @keys, $key; $key_flag = 1; # There is at least one key, used for error reporting below Biber::Config->incr_seenkey($key, $secnum); } } } if ($bib_section->is_allkeys) { # Normalise - when allkeys is true don't need citekeys - just in case someone # lists "*" and also some other citekeys $bib_section->del_citekeys; $logger->info("Using all citekeys in bib section " . $secnum); } else { $logger->info('Found ', $#keys+1 , " citekeys in bib section $secnum"); } if (Biber::Config->getoption('debug')) { unless ($bib_section->is_allkeys) { $logger->debug("The citekeys for section $secnum are: ", join(', ', sort @keys), "\n"); } } $bib_section->add_citekeys(@keys) unless $bib_section->is_allkeys; $bib_sections->add_section($bib_section); } # Add the Biber::Sections object to the Biber object $self->{sections} = $bib_sections; # Read sortlists my $sortlists = new Biber::SortLists; foreach my $list (@{$bcfxml->{sortlist}}) { my $ltype = $list->{type}; my $lssn = $list->{sortscheme}; my $lsnksn = $list->{sortnamekeyscheme}; my $lname = $list->{name}; my $lsection = $list->{section}[0]; # because "section" needs to be a list elsewhere in XML if ($sortlists->get_list($lsection, $lname, $ltype, $lssn, $lsnksn)) { $logger->debug("Section sortlist '$lname' of type '$ltype' with sortscheme '$lssn' and sortnamekeyscheme '$lsnksn' is repeated for section $lsection - ignoring"); next; } my $sortlist = Biber::SortList->new(section => $lsection, sortschemename => $lssn, sortnamekeyschemename => $lsnksn, name => $lname); $sortlist->set_type($ltype || 'entry'); # lists are entry lists by default $sortlist->set_name($lname || $lssn . "/$lsnksn"); # default to ss+snkss foreach my $filter (@{$list->{filter}}) { $sortlist->add_filter({'type' => $filter->{type}, 'value' => $filter->{content}}); } # disjunctive filters are an array ref of filter hashes foreach my $orfilter (@{$list->{filteror}}) { my $orfilts = []; foreach my $filter (@{$orfilter->{filter}}) { push @$orfilts, {'type' => $filter->{type}, 'value' => $filter->{content}}; } $sortlist->add_filter($orfilts) if $orfilts; } if (my $sorting = $list->{sorting}) { # can be undef for fallback to global sorting $sortlist->set_sortscheme(_parse_sort($sorting)); } else { $sortlist->set_sortscheme(Biber::Config->getblxoption('sorting')); } # Set sorting name key scheme name $sortlist->set_sortnamekeyschemename($lsnksn); $logger->debug("Adding sortlist of type '$ltype' with sortscheme '$lssn', sortnamekeyscheme '$lsnksn' and name '$lname' for section $lsection"); $sortlists->add_list($sortlist); } # Check to make sure that each section has an entry sortlist for global sorting # We have to make sure in case sortcites is used which uses the global order. foreach my $section (@{$bcfxml->{section}}) { my $globalss = Biber::Config->getblxoption('sortscheme'); my $secnum = $section->{number}; unless ($sortlists->get_list($secnum, "$globalss/global", 'entry', $globalss, 'global')) { my $sortlist = Biber::SortList->new(section => $secnum, type => 'entry', sortschemename => $globalss, sortnamekeyschemename => 'global', name => $globalss . '/global'); $sortlist->set_sortscheme(Biber::Config->getblxoption('sorting')); $sortlists->add_list($sortlist); } } # Add the Biber::SortLists object to the Biber object $self->{sortlists} = $sortlists; # Warn if there are no citations in any section unless ($key_flag) { biber_warn("The file '$ctrl_file_path' does not contain any citations!"); } # Normalise any UTF-8 encoding string immediately to exactly what we want # We want the strict perl utf8 "UTF-8" normalise_utf8(); # bibtex output when not in tool mode, is essentially entering tool mode but # without allkeys. We are not in tool mode if we are here. We fake tool mode # and then add a special section which contains all cited keys from all sections if (Biber::Config->getoption('output_format') eq 'bibtex') { Biber::Config->setoption('tool' ,1); Biber::Config->setoption('pseudo_tool' ,1); my $bib_section = new Biber::Section('number' => 99999); foreach my $section (@{$self->sections->get_sections}) { if ($section->is_allkeys) { $bib_section->set_allkeys(1); } else { $bib_section->add_citekeys($section->get_citekeys); } foreach my $ds (@{$section->get_datasources}) { $bib_section->add_datasource($ds); } } $self->sections->add_section($bib_section); # Global sorting in non tool mode bibtex output is citeorder so override the .bcf here Biber::Config->setblxoption('sortscheme', 'none'); # Global locale in non tool mode bibtex output is default Biber::Config->setblxoption('sortlocale', 'english'); my $sortlist = Biber::SortList->new(section => 99999, sortschemename => Biber::Config->getblxoption('sortscheme'), sortnamekeyschemename => 'global', name => Biber::Config->getblxoption('sortscheme') . '/global'); $sortlist->set_type('entry'); # bibtex output in non-tool mode is just citeorder $sortlist->set_sortscheme({locale => locale2bcp47(Biber::Config->getblxoption('sortlocale')), spec => [ [ {}, {'citeorder' => {}} ] ]}); $logger->debug("Adding 'entry' list 'none' for pseudo-section 99999"); $self->{sortlists}->add_list($sortlist); } return; } =head2 process_setup Place to put misc pre-processing things needed later =cut sub process_setup { my $self = shift; # Make sure there is a default entry list with global sorting for each refsection # Needed in case someone cites entries which are included in no # bibliography as this results in no entry list in the .bcf foreach my $section (@{$self->sections->get_sections}) { my $secnum = $section->number; unless ($self->sortlists->has_lists_of_type_for_section($secnum, 'entry')) { my $dlist = Biber::SortList->new(sortschemename => Biber::Config->getblxoption('sortscheme'), sortnamekeyschemename => 'global', name => Biber::Config->getblxoption('sortscheme') . '/global'); $dlist->set_sortscheme(Biber::Config->getblxoption('sorting')); $dlist->set_type('entry'); $dlist->set_section($secnum); $self->sortlists->add_list($dlist); } } # Break data model information up into more processing-friendly formats # for use in verification checks later # This has to be here as opposed to in parse_ctrlfile() so that it can pick # up user config dm settings Biber::Config->set_dm(Biber::DataModel->new(Biber::Config->getblxoption('datamodel'))); # Force output_safechars flag if output to ASCII and input_encoding is not ASCII if (Biber::Config->getoption('output_encoding') =~ /(?:x-)?ascii/xmsi and Biber::Config->getoption('input_encoding') !~ /(?:x-)?ascii/xmsi) { Biber::Config->setoption('output_safechars', 1); } } =head2 process_setup_tool Place to put misc pre-processing things needed later for tool mode =cut sub process_setup_tool { my $self = shift; Biber::Config->set_dm(Biber::DataModel->new(Biber::Config->getblxoption('datamodel'))); # Force output_safechars flag if output to ASCII and input_encoding is not ASCII if (Biber::Config->getoption('output_encoding') =~ /(?:x-)?ascii/xmsi and Biber::Config->getoption('input_encoding') !~ /(?:x-)?ascii/xmsi) { Biber::Config->setoption('output_safechars', 1); } } =head2 resolve_alias_refs Resolve aliases in xref/crossref/xdata which take keys as values to their real keys We use set_datafield as we are overriding the alias in the datasource =cut sub resolve_alias_refs { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); # XREF if (my $refkey = $be->get_field('xref')) { if (my $realkey = $section->get_citekey_alias($refkey)) { $be->set_datafield('xref', $realkey); } } # CROSSREF if (my $refkey = $be->get_field('crossref')) { if (my $realkey = $section->get_citekey_alias($refkey)) { $be->set_datafield('crossref', $realkey); } } # XDATA if (my $xdata = $be->get_field('xdata')) { my $resolved_keys; foreach my $refkey (@$xdata) { $refkey = $section->get_citekey_alias($refkey) // $refkey; push @$resolved_keys, $refkey; } $be->set_datafield('xdata', $resolved_keys); } } } =head2 process_citekey_aliases Remove citekey aliases from citekeys as they don't point to real entries. =cut sub process_citekey_aliases { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); foreach my $citekey ($section->get_citekeys) { if (my $a = $section->get_citekey_alias($citekey)) { $logger->debug("Pruning citekey alias '$citekey' from citekeys"); $section->del_citekey($citekey); } } } =head2 nullable_check Check entries for nullable fields =cut sub nullable_check { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $dm = Biber::Config->get_dm; foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); foreach my $f ($be->datafields) { if (is_null($be->get_datafield($f))) { unless ($dm->field_is_nullok($f)) { biber_warn("The field '$f' in entry '$citekey' cannot be null, deleting it"); $be->del_field($f); } } } } } =head2 instantiate_dynamic This instantiates any dynamic entries so that they are available for processing later on. This has to be done before most all other processing so that when we call $section->bibentry($key), as we do many times in the code, we don't die because there is a key but no Entry object. =cut sub instantiate_dynamic { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); $logger->debug("Creating dynamic entries (sets/related) for section $secnum"); # Instantiate any dynamic set entries before we do anything else foreach my $dset (@{$section->dynamic_set_keys}) { my @members = $section->get_dynamic_set($dset); # Resolve any aliases in the members my @realmems; foreach my $mem (@members) { push @realmems, $section->get_citekey_alias($mem) // $mem; } @members = @realmems; $section->set_dynamic_set($dset, @realmems); my $be = new Biber::Entry; $be->set_field('entrytype', 'set'); $be->set_field('entryset', [ @members ]); $be->set_field('citekey', $dset); $be->set_field('datatype', 'dynamic'); $section->bibentries->add_entry($dset, $be); $logger->debug("Created dynamic set entry '$dset' in section $secnum"); # Save graph information if requested if (Biber::Config->getoption('output_format') eq 'dot') { foreach my $m (@members) { Biber::Config->set_graph('set', $dset, $m); } } # Setting dataonly for members is handled by process_sets() } # Instantiate any related entry clones we need foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); $be->relclone; } return; } =head2 resolve_xdata Resolve xdata entries =cut sub resolve_xdata { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); $logger->debug("Resolving XDATA entries for section $secnum"); # We are not looping over citekeys here as XDATA entries are not cited. # They may have been added to the section as entries, however. foreach my $be ($section->bibentries->entries) { # Don't directly resolve XDATA entrytypes - this is done recursively in the Entry method # Otherwise, we will die on loops etc. for XDATA entries which are never referenced from # any cited entry next if $be->get_field('entrytype') eq 'xdata'; next unless my $xdata = $be->get_field('xdata'); $be->resolve_xdata($xdata); } } =head2 cite_setmembers Promotes set member to cited status =cut sub cite_setmembers { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); $logger->debug("Adding set members to citekeys for section $secnum"); foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); # promote indirectly cited inset set members to fully cited entries if ($be->get_field('entrytype') eq 'set' and $be->get_field('entryset')) { my $inset_keys = $be->get_field('entryset'); my $realmems; foreach my $mem (@$inset_keys) { push @$realmems, $section->get_citekey_alias($mem) // $mem; } $inset_keys = $realmems; $be->set_datafield('entryset', $inset_keys); foreach my $inset_key (@$inset_keys) { $logger->debug("Adding set member '$inset_key' to the citekeys (section $secnum)"); $section->add_citekeys($inset_key); # Save graph information if requested if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('set', $citekey, $inset_key); } } # automatically crossref for the first set member using plain set inheritance $be->set_inherit_from($section->bibentry($inset_keys->[0]), $section); # warning for the old pre-Biber way of doing things if ($be->get_field('crossref')) { biber_warn("Field 'crossref' is no longer needed in set entries in Biber - ignoring in entry '$citekey'", $be); $be->del_field('crossref'); } } } } =head2 process_interentry $biber->process_interentry This does several things: 1. Records the set information for use later 2. Ensures proper inheritance of data from cross-references. 3. Ensures that crossrefs/xrefs that are directly cited or cross-referenced at least mincrossrefs times are included in the bibliography. =cut sub process_interentry { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); $logger->debug("Processing explicit and implicit crossrefs for section $secnum"); foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); my $refkey; # Record set information # It's best to do this in the loop here as every entry needs the information # from all other entries in process_sets() if ($be->get_field('entrytype') eq 'set') { my $entrysetkeys = $be->get_field('entryset'); foreach my $member (@$entrysetkeys) { Biber::Config->set_set_pc($citekey, $member); Biber::Config->set_set_cp($member, $citekey); } } # Loop over cited keys and count the cross/xrefs # Can't do this when parsing entries as this would count them # for potentially uncited children if ($refkey = $be->get_field('xref') or $refkey = $be->get_field('crossref')) { $logger->debug("Incrementing cross/xrefkey count for entry '$refkey' via entry '$citekey'"); Biber::Config->incr_crossrefkey($refkey); } # Record xref inheritance for graphing if required if (Biber::Config->getoption('output_format') eq 'dot' and my $xref = $be->get_field('xref')) { Biber::Config->set_graph('xref', $citekey, $xref); } # Do crossref inheritance if (my $cr = $be->get_field('crossref')) { # Skip inheritance if we've already done it next if Biber::Config->get_inheritance('crossref', $cr, $be->get_field('citekey')); my $parent = $section->bibentry($cr); $logger->debug("Entry $citekey inheriting fields from parent $cr"); unless ($parent) { biber_warn("Cannot inherit from crossref key '$cr' - does it exist?", $be); } else { $be->inherit_from($parent); } } } # We make sure that crossrefs that are directly cited or cross-referenced # at least $mincrossrefs times are included in the bibliography. foreach my $k ( @{Biber::Config->get_crossrefkeys} ) { # If parent has been crossref'ed more than mincrossref times, upgrade it # to cited crossref status and add it to the citekeys list if (Biber::Config->get_crossrefkey($k) >= Biber::Config->getoption('mincrossrefs')) { $logger->debug("cross/xref key '$k' is cross/xref'ed >= mincrossrefs, adding to citekeys"); $section->add_citekeys($k); } } } =head2 validate_datamodel Validate bib data according to a datamodel Note that we are validating the internal Biber::Entries after they have been created from the datasources so this is datasource neutral, as it should be. It is here to enforce adherence to what biblatex expects. =cut sub validate_datamodel { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $dm = Biber::Config->get_dm; if (Biber::Config->getoption('validate_datamodel')) { my $dmwe = Biber::Config->getoption('dieondatamodel') ? \&biber_error : \&biber_warn; foreach my $citekey ($section->get_citekeys) { my $be = $section->bibentry($citekey); my $citekey = $be->get_field('citekey'); my $et = $be->get_field('entrytype'); my $ds = $section->get_keytods($citekey); # default entrytype to MISC type if not a known type unless ($dm->is_entrytype($et)) { &{$dmwe}("Datamodel: Entry '$citekey' ($ds): Invalid entry type '" . $be->get_field('entrytype') . "' - defaulting to 'misc'", $be); $be->set_field('entrytype', 'misc'); $et = 'misc'; # reset this too } # Are all fields valid fields? # Each field must be: # * Valid because it's allowed for "ALL" entrytypes OR # * Valid field for the specific entrytype OR # * Valid because entrytype allows "ALL" fields foreach my $ef ($be->datafields) { unless ($dm->is_field_for_entrytype($et, $ef)) { &{$dmwe}("Datamodel: Entry '$citekey' ($ds): Invalid field '$ef' for entrytype '$et'", $be); } } # Mandatory constraints foreach my $warning ($dm->check_mandatory_constraints($be)) { &{$dmwe}($warning, $be); } # Conditional constraints foreach my $warning ($dm->check_conditional_constraints($be)) { &{$dmwe}($warning, $be); } # Data constraints foreach my $warning ($dm->check_data_constraints($be)) { &{$dmwe}($warning, $be); } } } } =head2 process_entries_pre Main processing operations, to generate metadata and entry information This method is automatically called by C. Here we generate the "namehash" and the strings for "labelname", "labelyear", "labelalpha", "sortstrings", etc. Runs prior to uniqueness processing =cut sub process_entries_pre { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); foreach my $citekey ( $section->get_citekeys ) { $logger->debug("Postprocessing entry '$citekey' from section $secnum (before uniqueness)"); # process set entries $self->process_sets($citekey); # generate labelname name $self->process_labelname($citekey); # generate labeldate name $self->process_labeldate($citekey); # generate labeltitle name $self->process_labeltitle($citekey); # generate fullhash $self->process_fullhash($citekey); # push entry-specific presort fields into the presort state $self->process_presort($citekey); } $logger->debug("Finished processing entries in section $secnum (before uniqueness)"); return; } =head2 process_entries_post More processing operations, to generate things which require uniqueness information like namehash Runs after uniqueness processing =cut sub process_entries_post { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); foreach my $citekey ( $section->get_citekeys ) { $logger->debug("Postprocessing entry '$citekey' from section $secnum (after uniqueness)"); # generate labelalpha information $self->process_labelalpha($citekey); # generate information for tracking extraalpha $self->process_extraalpha($citekey); # generate information for tracking extrayear $self->process_extrayear($citekey); # generate information for tracking extratitle $self->process_extratitle($citekey); # generate information for tracking extratitleyear $self->process_extratitleyear($citekey); # generate information for tracking singletitle $self->process_singletitle($citekey); # generate namehash $self->process_namehash($citekey); # generate per-name hashes $self->process_pername_hashes($citekey); } $logger->debug("Finished processing entries in section $secnum (after uniqueness)"); return; } =head2 process_singletitle Track seen work combination for generation of singletitle =cut sub process_singletitle { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); $logger->trace("Creating singletitle information for '$citekey'"); # Use labelname to generate this, if there is one ... my $identifier; if (my $lni = $be->get_labelname_info) { $identifier = $self->_getnamehash_u($citekey, $be->get_field($lni)); } # ... otherwise use labeltitle elsif (my $lti = $be->get_labeltitle_info) { $identifier = $be->get_field($lti); } # Don't generate this information for entries with no labelname or labeltitle # as it would make no sense if ($identifier and Biber::Config->getblxoption('singletitle', $bee)) { Biber::Config->incr_seenwork($identifier); $logger->trace("Setting seenwork for '$citekey' to '$identifier'"); $be->set_field('seenwork', $identifier); } return; } =head2 process_extrayear Track labelname/year combination for generation of extrayear =cut sub process_extrayear { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); # Generate labelname/year combination for tracking extrayear # * If there is no labelname to use, use empty string # * If there is no labelyear to use: # * If there is no pubstate to use, use empty string otherwise use pubstate key # * Don't increment the seen_nameyear count if either name or year string is empty # (see code in incr_seen_nameyear method). # * Don't increment if skiplab is set if (Biber::Config->getblxoption('labeldate', $bee)) { if (Biber::Config->getblxoption('skiplab', $bee, $citekey)) { return; } $logger->trace("Creating extrayear information for '$citekey'"); my $name_string = ''; if (my $lni = $be->get_labelname_info) { $name_string = $self->_getnamehash_u($citekey, $be->get_field($lni)); } # extrayear takes into account the labelyear which can be a range my $year_string = $be->get_field('labelyear') || $be->get_field('year') || ''; my $nameyear_string = "$name_string,$year_string"; $logger->trace("Setting nameyear to '$nameyear_string' for entry '$citekey'"); $be->set_field('nameyear', $nameyear_string); $logger->trace("Incrementing nameyear for '$name_string'"); Biber::Config->incr_seen_nameyear($name_string, $year_string); } return; } =head2 process_extratitle Track labelname/labeltitle combination for generation of extratitle =cut sub process_extratitle { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); # Generate labelname/labeltitle combination for tracking extratitle # * If there is no labelname to use, use empty string # * If there is no labeltitle to use, use empty string # * Don't increment if skiplab is set # This is different from extrayear in that we do track the information # if the labelname is empty as titles are much more unique than years if (Biber::Config->getblxoption('labeltitle', $bee)) { if (Biber::Config->getblxoption('skiplab', $bee, $citekey)) { return; } $logger->trace("Creating extratitle information for '$citekey'"); my $name_string = ''; if (my $lni = $be->get_labelname_info) { $name_string = $self->_getnamehash_u($citekey, $be->get_field($lni)); } my $lti = $be->get_labeltitle_info; my $title_string = $be->get_field($lti) // ''; my $nametitle_string = "$name_string,$title_string"; $logger->trace("Setting nametitle to '$nametitle_string' for entry '$citekey'"); $be->set_field('nametitle', $nametitle_string); $logger->trace("Incrementing nametitle for '$name_string'"); Biber::Config->incr_seen_nametitle($name_string, $title_string); } return; } =head2 process_extratitleyear Track labeltitle/labelyear combination for generation of extratitleyear =cut sub process_extratitleyear { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); # Generate labeltitle/labelyear combination for tracking extratitleyear # * If there is no labeltitle to use, use empty string # * If there is no labelyear to use, use empty string # * Don't increment the seen_titleyear count if the labeltitle field is empty # (see code in incr_seen_titleyear method). # * Don't increment if skiplab is set if (Biber::Config->getblxoption('labeltitleyear', $bee)) { if (Biber::Config->getblxoption('skiplab', $bee, $citekey)) { return; } $logger->trace("Creating extratitleyear information for '$citekey'"); my $lti = $be->get_labeltitle_info; my $title_string = $be->get_field($lti) // ''; # Takes into account the labelyear which can be a range my $year_string = $be->get_field('labelyear') || $be->get_field('year') || ''; my $titleyear_string = "$title_string,$year_string"; $logger->trace("Setting titleyear to '$titleyear_string' for entry '$citekey'"); $be->set_field('titleyear', $titleyear_string); $logger->trace("Incrementing titleyear for '$title_string'"); Biber::Config->incr_seen_titleyear($title_string, $year_string); } return; } =head2 process_sets Postprocess set entries Checks for common set errors and enforces 'dataonly' for set members. It's not necessary to set skipbib, skipbiblist in the OPTIONS field for the set members as these are automatically set by biblatex due to the \inset =cut sub process_sets { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); if (my @entrysetkeys = Biber::Config->get_set_children($citekey)) { # Enforce Biber parts of virtual "dataonly" for set members # Also automatically create an "entryset" field for the members foreach my $member (@entrysetkeys) { my $me = $section->bibentry($member); process_entry_options($member, [ 'skiplab', 'skipbiblist', 'uniquename=0', 'uniquelist=0' ]); if ($me->get_field('entryset')) { biber_warn("Field 'entryset' is no longer needed in set member entries in Biber - ignoring in entry '$member'", $me); $me->del_field('entryset'); } # This ends up setting \inset{} in the bbl $me->set_field('entryset', [ $citekey ]); } unless (@entrysetkeys) { biber_warn("No entryset found for entry $citekey of type 'set'", $be); } } # Also set this here for any non-set keys which are in a set and which haven't # had skips set by being seen as a member of that set yet else { if (Biber::Config->get_set_parents($citekey)) { my $me = $section->bibentry($citekey); process_entry_options($citekey, [ 'skiplab', 'skipbiblist', 'uniquename=0', 'uniquelist=0' ]); } } } =head2 process_labelname Generate labelname information. =cut sub process_labelname { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $lnamespec = Biber::Config->getblxoption('labelnamespec', $bee); my $dm = Biber::Config->get_dm; # First we set the normal labelname name foreach my $h_ln ( @$lnamespec ) { my $lnameopt; my $ln = $h_ln->{content}; if ( $ln =~ /\Ashort(\X+)\z/xms ) { $lnameopt = $1; } else { $lnameopt = $ln; } unless (first {$ln eq $_} @{$dm->get_fields_of_type('list', 'name')}) { biber_warn("Labelname candidate '$ln' is not a name field - skipping"); next; } # If there is a biblatex option which controls the use of this labelname info, check it if ($CONFIG_OPTSCOPE_BIBLATEX{"use$lnameopt"} and not Biber::Config->getblxoption("use$lnameopt", $bee, $citekey)) { next; } if ($be->get_field($ln)) { $be->set_labelname_info($ln); last; } } # Then we loop again to set the labelname name for the fullhash generation code # This is because fullhash generation ignores SHORT* fields (section 4.2.4.1, BibLaTeX # manual) foreach my $h_ln ( @$lnamespec ) { my $ln = $h_ln->{content}; if ( $ln =~ /\Ashort(.+)\z/xms ) { next; } # We have already warned about this above unless (first {$ln eq $_} @{$dm->get_fields_of_type('list', 'name')}) { next; } # If there is a biblatex option which controls the use of this labelname info, check it if ($CONFIG_OPTSCOPE_BIBLATEX{"use$ln"} and not Biber::Config->getblxoption("use$ln", $bee, $citekey)) { next; } if ($be->get_field($ln)) { $be->set_labelnamefh_info($ln); last; } } unless ($be->get_labelname_info) { $logger->debug("Could not determine the labelname source of entry $citekey"); } } =head2 process_labeldate Generate labeldate information =cut sub process_labeldate { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $dm = Biber::Config->get_dm; if (Biber::Config->getblxoption('labeldate', $bee)) { if (Biber::Config->getblxoption('skiplab', $bee, $citekey)) { return; } my $pseudodate; my $ldatespec = Biber::Config->getblxoption('labeldatespec', $bee); foreach my $h_ly (@$ldatespec) { my $ly = $h_ly->{content}; if ($h_ly->{'type'} eq 'field') { # labeldate field my $ldy; my $ldm; my $ldd; my $datetype; if ($dm->field_is_datatype('date', $ly)) { # resolve dates $datetype = $ly =~ s/date\z//xmsr; $ldy = $datetype . 'year'; $ldm = $datetype . 'month'; $ldd = $datetype . 'day'; } else { $ldy = $ly; # labelyear can be a non-date field so make a pseudo-year $pseudodate = 1; } if ($be->get_field($ldy)) { # did we find a labeldate? # set source to field or date field prefix for a real date field $be->set_labeldate_info({'field' => { 'year' => $ldy, 'month' => $ldm, 'day' => $ldd, 'source' => $pseudodate ? $ldy : $datetype }}); last; } } elsif ($h_ly->{'type'} eq 'string') { # labelyear fallback string $be->set_labeldate_info({'string' => $ly}); last; } } # Construct labelyear, labelmonth, labelday # Might not have been set due to skiplab/dataonly if (my $ldi = $be->get_labeldate_info) { if (my $df = $ldi->{field}) { # set labelyear to a field value $be->set_field('labelyear', $be->get_field($df->{year})); $be->set_field('labelmonth', $be->get_field($df->{month})) if $df->{month}; $be->set_field('labelday', $be->get_field($df->{day})) if $df->{day}; $be->set_field('datelabelsource', $df->{source}); # ignore endyear if it's the same as year my ($ytype) = $df->{year} =~ /\A(\X*)year\z/xms; $ytype = $ytype // ''; # Avoid undef warnings since no match above can make it undef # endyear can be null which makes labelyear different to plain year if ($be->field_exists($ytype . 'endyear') and ($be->get_field($df->{year}) ne $be->get_field($ytype . 'endyear'))) { $be->set_field('labelyear', $be->get_field('labelyear') . '\bibdatedash ' . $be->get_field($ytype . 'endyear')); } # pseudodates (fields which are not really dates per se) are just years if (not $pseudodate and $be->get_field($ytype . 'endmonth') and ($be->get_field($df->{month}) ne $be->get_field($ytype . 'endmonth'))) { $be->set_field('labelmonth', $be->get_field('labelmonth') . '\bibdatedash ' . $be->get_field($ytype . 'endmonth')); } # pseudodates (fields which are not really dates per se) are just years if (not $pseudodate and $be->get_field($ytype . 'endday') and ($be->get_field($df->{day}) ne $be->get_field($ytype . 'endday'))) { $be->set_field('labelday', $be->get_field('labelday') . '\bibdatedash ' . $be->get_field($ytype . 'endday')); } } elsif (my $ys = $ldi->{string}) { # set labelyear to a fallback string $be->set_field('labelyear', $ys); } } else { $logger->debug("labeldate information of entry $citekey is unset"); } } } =head2 process_labeltitle Generate labeltitle Note that this is not conditionalised on the biblatex "labeltitle" as labeltitle should always be output since all standard styles need it. Only extratitle is conditionalised on the biblatex "labeltitle" option. =cut sub process_labeltitle { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $ltitlespec = Biber::Config->getblxoption('labeltitlespec', $bee); foreach my $h_ltn (@$ltitlespec) { my $ltn = $h_ltn->{content}; if (my $lt = $be->get_field($ltn)) { $be->set_labeltitle_info($ltn); $be->set_field('labeltitle', $lt); last; } $logger->debug("labeltitle information of entry $citekey is unset"); } } =head2 process_fullhash Generate fullhash =cut sub process_fullhash { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # fullhash is generated from the labelname but ignores SHORT* fields and # max/mincitenames settings if (my $lnfhi = $be->get_labelnamefh_info) { if (my $lnfh = $be->get_field($lnfhi)) { $be->set_field('fullhash', $self->_getfullhash($citekey, $lnfh)); } } return; } =head2 process_namehash Generate namehash =cut sub process_namehash { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # namehash is generated from the labelname if (my $lni = $be->get_labelname_info) { if (my $ln = $be->get_field($lni)) { $be->set_field('namehash', $self->_getnamehash($citekey, $ln)); } } return; } =head2 process_pername_hashes Generate per_name_hashes =cut sub process_pername_hashes { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $dm = Biber::Config->get_dm; foreach my $pn (@{$dm->get_fields_of_type('list', 'name')}) { next unless my $names = $be->get_field($pn); foreach my $n (@{$names->names}) { $n->set_hash($self->_genpnhash($citekey, $n)); } } return; } =head2 process_visible_names Generate the visible name information. This is used in various places and it is useful to have it generated in one place. =cut sub process_visible_names { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $dm = Biber::Config->get_dm; foreach my $citekey ( $section->get_citekeys ) { $logger->debug("Postprocessing visible names for key '$citekey'"); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $maxcn = Biber::Config->getblxoption('maxcitenames', $bee, $citekey); my $mincn = Biber::Config->getblxoption('mincitenames', $bee, $citekey); my $maxbn = Biber::Config->getblxoption('maxbibnames', $bee, $citekey); my $minbn = Biber::Config->getblxoption('minbibnames', $bee, $citekey); my $maxan = Biber::Config->getblxoption('maxalphanames', $bee, $citekey); my $minan = Biber::Config->getblxoption('minalphanames', $bee, $citekey); foreach my $n (@{$dm->get_fields_of_type('list', 'name')}) { next unless my $names = $be->get_field($n); my $count = $names->count_names; my $visible_names_cite; my $visible_names_bib; my $visible_names_alpha; # Cap min*names for this entry at $count. Why? Because imagine we have this: # # John Smith and Bill Jones # # and mincitenames=3. Then visibility will be set to 3 but there aren't 3 names to # get information from so looping over the visibility count would cause name methods # to operate on undef at index 3 and die my $l_mincn = $count < $mincn ? $count : $mincn; my $l_minbn = $count < $minbn ? $count : $minbn; my $l_minan = $count < $minan ? $count : $minan; # If name list was truncated in bib with "and others", this overrides maxcitenames my $morenames = $names->get_morenames ? 1 : 0; # max/minalphanames doesn't care about uniquelist - labels are just labels if ( $morenames or $count > $maxan ) { $visible_names_alpha = $l_minan; } else { $visible_names_alpha = $count; } # max/mincitenames if ( $morenames or $count > $maxcn ) { # Visibiliy to the uniquelist point if uniquelist is requested # We know at this stage that if uniquelist is set, there are more than maxcitenames # names. We also know that uniquelist > mincitenames because it is a further disambiguation # on top of mincitenames so can't be less as you can't disambiguate by losing information $visible_names_cite = $names->get_uniquelist // $l_mincn; } else { # visibility is simply the full list $visible_names_cite = $count; } # max/minbibnames if ( $morenames or $count > $maxbn ) { # Visibiliy to the uniquelist point if uniquelist is requested # We know at this stage that if uniquelist is set, there are more than maxbibnames # names. We also know that uniquelist > mincitenames because it is a further disambiguation # on top of mincitenames so can't be less as you can't disambiguate by losing information $visible_names_bib = $names->get_uniquelist // $l_minbn; } else { # visibility is simply the full list $visible_names_bib = $count; } $logger->trace("Setting visible names (cite) for key '$citekey' to '$visible_names_cite'"); $logger->trace("Setting visible names (bib) for key '$citekey' to '$visible_names_bib'"); $logger->trace("Setting visible names (alpha) for key '$citekey' to '$visible_names_alpha'"); # Need to set these on all name forms my $ns = $be->get_field($n); $ns->set_visible_cite($visible_names_cite); $ns->set_visible_bib($visible_names_bib); $ns->set_visible_alpha($visible_names_alpha); } } } =head2 process_labelalpha Generate the labelalpha and also the variant for sorting =cut sub process_labelalpha { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); # Don't add a label if skiplab is set for entry if (Biber::Config->getblxoption('skiplab', $bee, $citekey)) { return; } if ( my $la = Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype')) ) { my $label; my $sortlabel; ( $label, $sortlabel ) = @{ $self->_genlabel($citekey) }; $be->set_field('labelalpha', $label); $be->set_field('sortlabelalpha', $sortlabel); } } =head2 process_extraalpha Generate the extraalpha information =cut sub process_extraalpha { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); if (Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype'))) { if (my $la = $be->get_field('labelalpha')) { Biber::Config->incr_la_disambiguation($la); } } } =head2 process_presort Put presort fields for an entry into the main Biber bltx state so that it is all available in the same place since this can be set per-type and globally too. =cut sub process_presort { my $self = shift; my $citekey = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # We are treating presort as an option as it can be set per-type and globally too if (my $ps = $be->get_field('presort')) { Biber::Config->setblxoption('presort', $ps, 'ENTRY', $citekey); } } =head2 process_lists Sort and filter lists for a section =cut sub process_lists { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); foreach my $list (@{$self->sortlists->get_lists_for_section($secnum)}) { my $lssn = $list->get_sortschemename; my $lsnksn = $list->get_sortnamekeyschemename; my $ltype = $list->get_type; my $lname = $list->get_name; # Last-ditch fallback in case we still don't have a sorting spec $list->set_sortscheme(Biber::Config->getblxoption('sorting')) unless $list->get_sortscheme; $list->set_sortnamekeyschemename('global') unless $list->get_sortnamekeyschemename; $list->set_keys([ $section->get_citekeys ]); $logger->debug("Populated sortlist '$lname' of type '$ltype' with sortscheme '$lssn' and sorting name key scheme '$lsnksn' in section $secnum with keys: " . join(', ', $list->get_keys)); # Now we check the sorting cache to see if we already have results # for this scheme since sorting is computationally expensive. # We know the keys are the same as we just set them # to a copy of the section citekeys above. If the scheme is the same # as a previous sort then the results have to also be the same so inherit # the results which are normally set by sorting: # # * sorted keys # * sortinit data # * extra* data my $cache_flag = 0; $logger->debug("Checking sorting cache for scheme '$lssn' with sorting name key scheme '$lsnksn'"); foreach my $cacheitem (@{$section->get_sort_cache}) { # This conditional checks for identity of the data elements which constitute # a biblatex refcontext since a sortlist is conceptually part of a refcontext if (Compare($list->get_sortscheme, $cacheitem->[0]) and $list->get_sortnamekeyschemename eq $cacheitem->[1]) { $logger->debug("Found sorting cache entry for scheme '$lssn' with sorting name key scheme '$lsnksn'"); $logger->trace("Sorting list cache for scheme '$lssn' with sorting name key scheme '$lsnksn':\n-------------------\n" . Data::Dump::pp($list->get_sortscheme) . "\n-------------------\n"); $list->set_sortnamekeyschemename($cacheitem->[1]); $list->set_keys($cacheitem->[2]); $list->set_sortinitdata($cacheitem->[3]); $list->set_extrayeardata($cacheitem->[4]); $list->set_extraalphadata($cacheitem->[5]); $list->set_extratitledata($cacheitem->[6]); $list->set_extratitleyeardata($cacheitem->[7]); $cache_flag = 1; last; } } unless ($cache_flag) { $logger->debug("No sorting cache entry for scheme '$lssn' with sorting name key scheme '$lsnksn'"); # Sorting $self->generate_sortinfo($list); # generate the sort information $self->sort_list($list); # sort the list $self->generate_extra($list) unless Biber::Config->getoption('tool'); # generate the extra* fields # Cache the results $logger->debug("Adding sorting cache entry for scheme '$lssn' with sorting name key scheme '$lsnksn'"); $section->add_sort_cache($list->get_listdata); } # Filtering if (my $filters = $list->get_filters) { my $flist = []; KEYLOOP: foreach my $k ($list->get_keys) { $logger->debug("Checking key '$k' in list '$lname' against list filters"); my $be = $section->bibentry($k); foreach my $f (@$filters) { # Filter disjunction is ok if any of the checks are ok, hence the grep() if (ref $f eq 'ARRAY') { next KEYLOOP unless grep {check_list_filter($k, $_->{type}, $_->{value}, $be)} @$f; } else { next KEYLOOP unless check_list_filter($k, $f->{type}, $f->{value}, $be); } } push @$flist, $k; } $logger->debug("Keys after filtering list '$lname' in section $secnum: " . join(', ', @$flist)); $list->set_keys($flist); # Now save the sorted list in the list object } } return; } =head2 check_list_filter Run an entry through a list filter. Returns a boolean. =cut sub check_list_filter { my ($k, $t, $fs, $be) = @_; $logger->debug("Checking key '$k' against filter '$t=$fs'"); if ($t eq 'type') { if ($be->get_field('entrytype') eq lc($fs)) { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } else { return 0; } } elsif ($t eq 'nottype') { if ($be->get_field('entrytype') eq lc($fs)) { return 0; } else { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } } elsif ($t eq 'subtype') { if ($be->field_exists('entrysubtype') and $be->get_field('entrysubtype') eq lc($fs)) { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } else { return 0; } } elsif ($t eq 'notsubtype') { if ($be->field_exists('entrysubtype') and $be->get_field('entrysubtype') eq lc($fs)) { return 0; } else { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } } elsif ($t eq 'keyword') { if ($be->has_keyword($fs)) { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } else { return 0; } } elsif ($t eq 'notkeyword') { if ($be->has_keyword($fs)) { return 0; } else { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } } elsif ($t eq 'field') { if ($be->field_exists($fs)) { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } else { return 0; } } elsif ($t eq 'notfield') { if ($be->field_exists($fs)) { return 0; } else { $logger->trace("Key '$k' passes against filter '$t=$fs'"); } } return 1; } =head2 generate_sortinfo Generate information for sorting =cut sub generate_sortinfo { my ($self, $list) = @_; foreach my $key ($list->get_keys) { $self->_generatesortinfo($key, $list); } return; } =head2 uniqueness Generate the uniqueness information needed when creating .bbl =cut sub uniqueness { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); # Generate uniqueness information according to this algorithm: # 1. Generate uniquename if uniquename option is set # 2. if (uniquelist has never run before OR step 1 changed any uniquename values) { # goto step 3 # } else { return } # 3. Completely regenerate uniquelist if uniquelist option is set # 4. if (step 3 changed any uniquelist values) { # goto step 1 # } else { return } # uniquelist can never shorten to a list shorter than maxcitenames because: # * Shortening a list can't make it unique # * You can't lengthen it if the list is shorter than maxcitenames because there # is no more information to add that you don't already have. # uniquelist cannot be less than mincitenames as the list is either unambiguous # at mincitenames or it isn't and uniquelist needs more information by adding items # Set a flag for first uniquelist pass. This is a special case as we always want to run # at least one uniquelist pass if requested, regardless of unul_done global flag. my $first_ul_pass = 1; # Generate uniquename information, if requested while ('true') { unless (Biber::Config->get_unul_done) { Biber::Config->set_unul_changed(0); # reset state for global unul changed flag $self->create_uniquename_info; $self->generate_uniquename; } else { last; # uniquename/uniquelist disambiguation is finished as nothing changed } # Generate uniquelist information, if requested # Always run uniquelist at least once, if requested if ($first_ul_pass or not Biber::Config->get_unul_done) { Biber::Config->set_unul_changed(0); # reset state for global unul changed flag $first_ul_pass = 0; # Ignore special case when uniquelist has run once $self->create_uniquelist_info; $self->generate_uniquelist; } else { last; # uniquename/uniquelist disambiguation is finished as nothing changed } } return; } =head2 create_uniquename_info Gather the uniquename information as we look through the names What is happening in here is the following: We are registering the number of occurences of each name, name+init and fullname within a specific context. For example, the context is "global" with uniquename < 5 and "name list" for uniquename=5 or 6. The keys we store to count this are the most specific information for the context, so, for uniquename < 5, this is the full name and for uniquename=5 or 6, this is the complete list of full names. These keys have values in a hash which are ignored. They serve only to accumulate repeated occurences with the context and we don't care about this and so the values are a useful sinkhole for such repetition. For example, if we find in the global context a family name "Smith" in two different entries under the same form "Alan Smith", the data structure will look like: {Smith}->{global}->{Alan Smith} = 2 We don't care about the value as this means that there are 2 "Alan Smith"s in the global context which need disambiguating identically anyway. So, we just count the keys for the family name "Smith" in the global context to see how ambiguous the family name itself is. This would be "1" and so "Alan Smith" would get uniquename=0 because it's unambiguous as just "Smith". The same goes for "minimal" list context disambiguation for uniquename=5 or 6. For example, if we had the family name "Smith" to disambiguate in two entries with labelname "John Smith and Alan Jones", the data structure would look like: {Smith}->{Smith+Jones}->{John Smith+Alan Jones} = 2 Again, counting the keys of the context for the family name gives us "1" which means we have uniquename=0 for "John Smith" in both entries because it's the same list. This also works for repeated names in the same list "John Smith and Bert Smith". Disambiguating "Smith" in this: {Smith}->{Smith+Smith}->{John Smith+Bert Smith} = 2 So both "John Smith" and "Bert Smith" in this entry get uniquename=0 (of course, as long as there are no other "X Smith and Y Smith" entries where X != "John" or Y != "Bert"). =cut sub create_uniquename_info { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $bibentries = $section->bibentries; # Reset uniquename information as we have to generate it # again because uniquelist information might have changed Biber::Config->reset_uniquenamecount; foreach my $citekey ( $section->get_citekeys ) { my $be = $bibentries->entry($citekey); my $bee = $be->get_field('entrytype'); my $useprefix = Biber::Config->getblxoption('useprefix', $bee, $citekey); next unless my $un = Biber::Config->getblxoption('uniquename', $bee, $citekey); $logger->trace("Generating uniquename information for '$citekey'"); if (my $lni = $be->get_labelname_info) { # Set the index limit beyond which we don't look for disambiguating information my $ul = undef; # Not set if (defined($be->get_field($lni)->get_uniquelist)) { # If defined, $ul will always be >1, see comment in set_uniquelist() in Names.pm $ul = $be->get_field($lni)->get_uniquelist; } my $maxcn = Biber::Config->getblxoption('maxcitenames', $bee, $citekey); my $mincn = Biber::Config->getblxoption('mincitenames', $bee, $citekey); # Note that we don't determine if a name is unique here - # we can't, were still processing entries at this point. # Here we are just recording seen combinations of: # # family name and how many name context keys contain this (uniquename = 0) # familynames+initials and how many name context keys contain this (uniquename = 1) # Full name and how many name context keys contain this (uniquename = 2) # # A name context can be either a complete single name or a list of names # depending on whether uniquename=min* or not # # Anything which has more than one combination for both of these would # be uniquename = 2 unless even the full name doesn't disambiguate # and then it is left at uniquename = 0 my $nl = $be->get_field($lni); my $num_names = $nl->count_names; my $names = $nl->names; # If name list was truncated in bib with "and others", this overrides maxcitenames my $morenames = $nl->get_morenames ? 1 : 0; my @truncnames; my @familynames; my @fullnames; my @initnames; # Name list scope useprefix option if (defined($nl->get_useprefix)) { $useprefix = $nl->get_useprefix; } foreach my $name (@$names) { # We need to track two types of uniquename disambiguation here: # # 1. Information to disambiguate visible names from visible names # where "visibility" is governed by uniquelist/max/mincitenames. # This is the actual "uniquename" feature information. # 2. Information to disambiguate all names, regardless of visibility # This is needed for uniquelist because it needs to construct # hypothetical ambiguity information for every list position. # We want to record disambiguation information for visible names when: # uniquename = 3 (allinit) or 4 (allfull) # Uniquelist is set and a name appears before the uniquelist truncation # Uniquelist is not set and the entry has an explicit "and others" at the end # since this means that every name is less than maxcitenames by definition # Uniquelist is not set and a name list is shorter than the maxcitenames truncation # Uniquelist is not set, a name list is longer than the maxcitenames truncation # and the name appears before the mincitenames truncation if ($un == 3 or $un == 4 or ($ul and $name->get_index <= $ul) or $morenames or $num_names <= $maxcn or $name->get_index <= $mincn) { # implicitly, $num_names > $maxcn here push @truncnames, $name; if ($un == 5 or $un == 6) { push @familynames, $name->get_namepart('family'); push @fullnames, $name->get_namestring; push @initnames, $name->get_nameinitstring; } } } # Information for mininit ($un=5) or minfull ($un=6) my $familynames_string; my $fullnames_string; my $initnames_string; if ($un == 5) { $familynames_string = join("\x{10FFFD}", @familynames); $initnames_string = join("\x{10FFFD}", @initnames); if ($#familynames + 1 < $num_names or $morenames) { $familynames_string .= "\x{10FFFD}et al"; # if truncated, record this $initnames_string .= "\x{10FFFD}et al"; # if truncated, record this } } elsif ($un == 6) { $familynames_string = join("\x{10FFFD}", @familynames); $fullnames_string = join("\x{10FFFD}", @fullnames); if ($#familynames + 1 < $num_names or $morenames) { $familynames_string .= "\x{10FFFD}et al"; # if truncated, record this $fullnames_string .= "\x{10FFFD}et al"; # if truncated, record this } } foreach my $name (@$names) { # Name scope useprefix option if (defined($name->get_useprefix)) { $useprefix = $name->get_useprefix; } # we have to differentiate here between last names with and without # prefices otherwise we end up falsely trying to disambiguate # "X" and "von X" using initials/first names when there is no need. my $familyname = ($useprefix and $name->get_namepart('prefix') ? $name->get_namepart('prefix') : '') . $name->get_namepart('family'); my $nameinitstring = $name->get_nameinitstring; my $namestring = $name->get_namestring; my $namecontext; my $key; # Context and key depend on the uniquename setting if ($un == 1 or $un == 3) { $namecontext = 'global'; $key = $nameinitstring; } elsif ($un == 2 or $un == 4) { $namecontext = 'global'; $key = $namestring; } elsif ($un == 5) { $namecontext = $familynames_string; $key = $initnames_string; $name->set_minimal_info($familynames_string); } elsif ($un == 6) { $namecontext = $familynames_string; $key = $fullnames_string; $name->set_minimal_info($familynames_string); } if (first {Compare($_, $name)} @truncnames) { # Record a uniqueness information entry for the family name showing that # this family name has been seen in this name context Biber::Config->add_uniquenamecount($familyname, $namecontext, $key); # Record a uniqueness information entry for the family name+initials showing that # this familyname_initials has been seen in this name context Biber::Config->add_uniquenamecount($nameinitstring, $namecontext, $key); # Record a uniqueness information entry for the fullname # showing that this fullname has been seen in this name context Biber::Config->add_uniquenamecount($namestring, $namecontext, $key); } # As above but here we are collecting (separate) information for all # names, regardless of visibility (needed to track uniquelist) if (Biber::Config->getblxoption('uniquelist', $bee, $citekey)) { Biber::Config->add_uniquenamecount_all($familyname, $namecontext, $key); Biber::Config->add_uniquenamecount_all($nameinitstring, $namecontext, $key); Biber::Config->add_uniquenamecount_all($namestring, $namecontext, $key); } } } } return; } =head2 generate_uniquename Generate the per-name uniquename values using the information harvested by create_uniquename_info() =cut sub generate_uniquename { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $bibentries = $section->bibentries; # Now use the information to set the actual uniquename information foreach my $citekey ( $section->get_citekeys ) { my $be = $bibentries->entry($citekey); my $bee = $be->get_field('entrytype'); next unless my $un = Biber::Config->getblxoption('uniquename', $bee, $citekey); my $useprefix = Biber::Config->getblxoption('useprefix', $bee, $citekey); $logger->trace("Setting uniquename for '$citekey'"); if (my $lni = $be->get_labelname_info) { # Set the index limit beyond which we don't look for disambiguating information # If defined, $ul will always be >1, see comment in set_uniquelist() in Names.pm my $ul = $be->get_field($lni)->get_uniquelist; my $maxcn = Biber::Config->getblxoption('maxcitenames', $bee, $citekey); my $mincn = Biber::Config->getblxoption('mincitenames', $bee, $citekey); my $nl = $be->get_field($lni); my $num_names = $nl->count_names; my $names = $nl->names; # If name list was truncated in bib with "and others", this overrides maxcitenames my $morenames = ($nl->get_morenames) ? 1 : 0; my @truncnames; foreach my $name (@$names) { if ($un == 3 or $un == 4 or ($ul and $name->get_index <= $ul) or $morenames or $num_names <= $maxcn or $name->get_index <= $mincn) { # implicitly, $num_names > $maxcn here push @truncnames, $name; } else { # Set anything now not visible due to uniquelist back to 0 $name->reset_uniquename; } } # Name list scope useprefix option if (defined($nl->get_useprefix)) { $useprefix = $nl->get_useprefix; } foreach my $name (@$names) { # Name scope useprefix option if (defined($name->get_useprefix)) { $useprefix = $name->get_useprefix; } # we have to differentiate here between last names with and without # prefices otherwise we end up falsely trying to disambiguate # "X" and "von X" using initials/first names when there is no need. my $familyname = ($useprefix and $name->get_namepart('prefix') ? $name->get_namepart('prefix') : '') . $name->get_namepart('family'); my $nameinitstring = $name->get_nameinitstring; my $namestring = $name->get_namestring; my $namecontext = 'global'; # default if ($un == 5 or $un == 6) { $namecontext = $name->get_minimal_info; # $un=5 and 6 } if (first {Compare($_, $name)} @truncnames) { # If there is one key for the family name, then it's unique using just family name # because either: # * There are no other identical family names # * All identical family names have a family name+init ($un=5) or fullname ($un=6) # which is identical and therefore can't be disambiguated any further anyway if (Biber::Config->get_numofuniquenames($familyname, $namecontext) == 1) { $name->set_uniquename(0); } # Otherwise, if there is one key for the family name+inits, then it's unique # using initials because either: # * There are no other identical familyname+inits # * All identical family name+inits have a fullname ($un=6) which is identical # and therefore can't be disambiguated any further anyway elsif (Biber::Config->get_numofuniquenames($nameinitstring, $namecontext) == 1) { $name->set_uniquename(1); } # Otherwise if there is one key for the fullname, then it's unique using # the fullname because: # * There are no other identical full names # # But restrict to uniquename biblatex option maximum elsif (Biber::Config->get_numofuniquenames($namestring, $namecontext) == 1) { my $run; if ($un == 1) {$run = 1} # init elsif ($un == 2) {$run = 2} # full elsif ($un == 3) {$run = 1} # allinit elsif ($un == 4) {$run = 2} # allfull elsif ($un == 5) {$run = 1} # mininit elsif ($un == 6) {$run = 2} # minfull $name->set_uniquename($run) } # Otherwise, there must be more than one key for the full name, # so set to 0 since nothing will uniqueify this name and it's just # misleading to expand it else { $name->set_uniquename(0); } } # As above but not just for visible names (needed for uniquelist) if (Biber::Config->getblxoption('uniquelist', $bee, $citekey)) { if (Biber::Config->get_numofuniquenames_all($familyname, $namecontext) == 1) { $name->set_uniquename_all(0); } elsif (Biber::Config->get_numofuniquenames_all($nameinitstring, $namecontext) == 1) { $name->set_uniquename_all(1); } elsif (Biber::Config->get_numofuniquenames_all($namestring, $namecontext) == 1) { my $run; if ($un == 1) {$run = 1} # init elsif ($un == 2) {$run = 2} # full elsif ($un == 3) {$run = 1} # allinit elsif ($un == 4) {$run = 2} # allfull elsif ($un == 5) {$run = 1} # mininit elsif ($un == 6) {$run = 2} # minfull $name->set_uniquename_all($run) } else { $name->set_uniquename_all(0); } } } } } return; } =head2 create_uniquelist_info Gather the uniquelist information as we look through the names =cut sub create_uniquelist_info { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $bibentries = $section->bibentries; # Reset uniquelist information as we have to generate it again because uniquename # information might have changed Biber::Config->reset_uniquelistcount; foreach my $citekey ( $section->get_citekeys ) { my $be = $bibentries->entry($citekey); my $bee = $be->get_field('entrytype'); my $maxcn = Biber::Config->getblxoption('maxcitenames', $bee, $citekey); my $mincn = Biber::Config->getblxoption('mincitenames', $bee, $citekey); next unless my $ul = Biber::Config->getblxoption('uniquelist', $bee, $citekey); $logger->trace("Generating uniquelist information for '$citekey'"); if (my $lni = $be->get_labelname_info) { my $nl = $be->get_field($lni); my $num_names = $nl->count_names; my $namelist = []; my $ulminyear_namelist = []; foreach my $name (@{$nl->names}) { my $familyname = $name->get_namepart('family'); my $nameinitstring = $name->get_nameinitstring; my $namestring = $name->get_namestring; my $ulminyearflag = 0; # uniquelist = minyear if ($ul == 2) { # minyear uniquename, we set based on the max/mincitenames list if ($num_names > $maxcn and $name->get_index <= $mincn) { $ulminyearflag = 1; } } # uniquename is not set so generate uniquelist based on just family name if (not defined($name->get_uniquename_all)) { push @$namelist, $familyname; push @$ulminyear_namelist, $familyname if $ulminyearflag; } # uniquename indicates unique with just family name elsif ($name->get_uniquename_all == 0) { push @$namelist, $familyname; push @$ulminyear_namelist, $familyname if $ulminyearflag; } # uniquename indicates unique with family name with initials elsif ($name->get_uniquename_all == 1) { push @$namelist, $nameinitstring; push @$ulminyear_namelist, $nameinitstring if $ulminyearflag; } # uniquename indicates unique with full name elsif ($name->get_uniquename_all == 2) { push @$namelist, $namestring; push @$ulminyear_namelist, $namestring if $ulminyearflag; } Biber::Config->add_uniquelistcount($namelist); } # We need to know the list uniqueness counts for the whole list seperately otherwise # we will falsely "disambiguate" identical name lists from each other by setting # uniquelist to the full list because every part of each list will have more than # one count. We therefore need to distinguish counts which are of the final, complete # list of names. If there is more than one count for these, (meaning that there are # two or more identical name lists), we don't expand them at all as there is no point. Biber::Config->add_uniquelistcount_final($namelist); # Add count for uniquelist=minyear unless (Compare($ulminyear_namelist, [])) { Biber::Config->add_uniquelistcount_minyear($ulminyear_namelist, $be->get_field('labelyear'), $namelist); } } } return; } =head2 generate_uniquelist Generate the per-namelist uniquelist values using the information harvested by create_uniquelist_info() =cut sub generate_uniquelist { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $bibentries = $section->bibentries; LOOP: foreach my $citekey ( $section->get_citekeys ) { my $be = $bibentries->entry($citekey); my $bee = $be->get_field('entrytype'); my $maxcn = Biber::Config->getblxoption('maxcitenames', $bee, $citekey); my $mincn = Biber::Config->getblxoption('mincitenames', $bee, $citekey); next unless my $ul = Biber::Config->getblxoption('uniquelist', $bee, $citekey); $logger->trace("Creating uniquelist for '$citekey'"); if (my $lni = $be->get_labelname_info) { my $nl = $be->get_field($lni); my $namelist = []; my $num_names = $nl->count_names; foreach my $name (@{$nl->names}) { my $familyname = $name->get_namepart('family'); my $nameinitstring = $name->get_nameinitstring; my $namestring = $name->get_namestring; # uniquename is not set so generate uniquelist based on just family name if (not defined($name->get_uniquename_all)) { push @$namelist, $familyname; } # uniquename indicates unique with just family name elsif ($name->get_uniquename_all == 0) { push @$namelist, $familyname; } # uniquename indicates unique with family name with initials elsif ($name->get_uniquename_all == 1) { push @$namelist, $nameinitstring; } # uniquename indicates unique with full name elsif ($name->get_uniquename_all == 2) { push @$namelist, $namestring; } # With uniquelist=minyear, uniquelist should not be set at all if there are # no other entries with the same max/mincitenames visible list and different years # to disambiguate from if ($ul == 2 and $num_names > $maxcn and $name->get_index <= $mincn and Biber::Config->get_uniquelistcount_minyear($namelist, $be->get_field('labelyear')) == 1) { $logger->trace("Not setting uniquelist=minyear for '$citekey'"); next LOOP; } # list is unique after this many names so we set uniquelist to this point # Even if uniquelist=minyear, we record normal uniquelist information if # we didn't skip this key in the test above if (Biber::Config->get_uniquelistcount($namelist) == 1) { last; } } $logger->trace("Setting uniquelist for '$citekey' using " . join(',', @$namelist)); $logger->trace("Uniquelist count for '$citekey' is '" . Biber::Config->get_uniquelistcount_final($namelist) . "'"); $nl->set_uniquelist($namelist, $maxcn, $mincn); } } return; } =head2 generate_extra Generate information for: * extraalpha * extrayear * extratitle * extratitleyear =cut sub generate_extra { my $self = shift; my $list = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); Biber::Config->reset_seen_extra(); # Since this sub is per-list, have to reset the # extra* counters per list # This loop critically depends on the order of the citekeys which # is why we have to do sorting before this foreach my $key ($list->get_keys) { my $be = $section->bibentry($key); my $bee = $be->get_field('entrytype'); # Only generate extra* information if skiplab is not set. # Don't forget that skiplab is implied for set members unless (Biber::Config->getblxoption('skiplab', $bee, $key)) { # extrayear if (Biber::Config->getblxoption('labeldate', $bee)) { my $nameyear = $be->get_field('nameyear'); if (Biber::Config->get_seen_nameyear($nameyear) > 1) { $logger->trace("nameyear for '$nameyear': " . Biber::Config->get_seen_nameyear($nameyear)); my $v = Biber::Config->incr_seen_extrayear($nameyear); $list->set_extrayeardata_for_key($key, $v); } } # extratitle if (Biber::Config->getblxoption('labeltitle', $bee)) { my $nametitle = $be->get_field('nametitle'); if (Biber::Config->get_seen_nametitle($nametitle) > 1) { $logger->trace("nametitle for '$nametitle': " . Biber::Config->get_seen_nametitle($nametitle)); my $v = Biber::Config->incr_seen_extratitle($nametitle); $list->set_extratitledata_for_key($key, $v); } } # extratitleyear if (Biber::Config->getblxoption('labeltitleyear', $bee)) { my $titleyear = $be->get_field('titleyear'); if (Biber::Config->get_seen_titleyear($titleyear) > 1) { $logger->trace("titleyear for '$titleyear': " . Biber::Config->get_seen_titleyear($titleyear)); my $v = Biber::Config->incr_seen_extratitleyear($titleyear); $list->set_extratitleyeardata_for_key($key, $v); } } # extraalpha if (Biber::Config->getblxoption('labelalpha', $bee)) { my $la = $be->get_field('labelalpha'); if (Biber::Config->get_la_disambiguation($la) > 1) { $logger->trace("labelalpha disambiguation for '$la': " . Biber::Config->get_la_disambiguation($la)); my $v = Biber::Config->incr_seen_extraalpha($la); $list->set_extraalphadata_for_key($key, $v); } } } } return; } =head2 generate_singletitle Generate the singletitle field, if requested. The information for generating this is gathered in process_singletitle() =cut sub generate_singletitle { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $bibentries = $section->bibentries; foreach my $citekey ( $section->get_citekeys ) { my $be = $bibentries->entry($citekey); if (Biber::Config->getblxoption('singletitle', $be->get_field('entrytype'))) { if ($be->get_field('seenwork') and Biber::Config->get_seenwork($be->get_field('seenwork')) < 2 ) { $logger->trace("Setting singletitle for '$citekey'"); $be->set_field('singletitle', 1); } else { $logger->trace("Not setting singletitle for '$citekey'"); } } } return; } =head2 sort_list Sort a list using information in entries according to a certain sorting scheme. Use a flag to skip info messages on first pass =cut sub sort_list { my $self = shift; my $list = shift; my $sortscheme = $list->get_sortscheme; my @keys = $list->get_keys; my $lssn = $list->get_sortschemename; my $ltype = $list->get_type; my $lname = $list->get_name; my $llocale = locale2bcp47($sortscheme->{locale} || Biber::Config->getblxoption('sortlocale')); my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); if (Biber::Config->getoption('sortcase')) { $logger->debug("Sorting is by default case-SENSITIVE"); } else { $logger->debug("Sorting is by default case-INSENSITIVE"); } $logger->debug("Keys before sort:\n"); foreach my $k (@keys) { $logger->debug("$k => " . $list->get_sortdata($k)->[0]); } $logger->trace("Sorting sortlist '$lname' of type '$ltype' with sortscheme '$lssn'. Scheme is\n-------------------\n" . Data::Dump::pp($sortscheme) . "\n-------------------\n"); # Set up locale. Order of priority is: # 1. locale value passed to Unicode::Collate::Locale->new() (Unicode::Collate sorts only) # 2. Biber sortlocale option # 3. Sorting 'locale' option # 4. Global biblatex 'sortlocale' option my $thislocale = Biber::Config->getoption('sortlocale') || $llocale; $logger->debug("Locale for sorting is '$thislocale'"); if ( Biber::Config->getoption('fastsort') ) { use locale; $logger->info("Sorting list '$lname' of type '$ltype' with scheme '$lssn'"); $logger->debug("Sorting with fastsort (locale $thislocale)"); unless (setlocale(LC_ALL, $thislocale)) { biber_warn("Unavailable locale $thislocale"); } # Construct a multi-field Schwartzian Transform with the right number of # extractions into a string representing an array ref as we musn't eval this yet my $num_sorts = 0; my $data_extractor = '['; my $sorter; my $sort_extractor; # Global lowercase setting my $glc = Biber::Config->getoption('sortcase') ? '' : 'lc '; foreach my $sortset (@{$sortscheme->{spec}}) { $data_extractor .= '$list->get_sortdata($_)->[1][' . $num_sorts . '],'; $sorter .= ' || ' if $num_sorts; # don't add separator before first field my $lc = $glc; # Casing defaults to global default ... my $sc = $sortset->[0]{sortcase}; # but is overriden by field setting if it exists if (defined($sc) and $sc != Biber::Config->getoption('sortcase')) { unless ($sc) { $lc = 'lc '; } else { $lc = ''; } } my $sd = $sortset->[0]{sort_direction}; if (defined($sd) and $sd eq 'descending') { # descending field $sorter .= $lc . '$b->[' . $num_sorts . '] cmp ' . $lc . '$a->[' . $num_sorts . ']'; } else { # ascending field $sorter .= $lc . '$a->[' . $num_sorts . '] cmp ' . $lc . '$b->[' . $num_sorts . ']'; } $num_sorts++; } $data_extractor .= '$_]'; # Handily, $num_sorts is now one larger than the number of fields which is the # correct index for the actual data in the sort array $sort_extractor = '$_->[' . $num_sorts . ']'; $logger->trace("Sorting structure is: $sorter"); # Schwartzian transform multi-field sort @keys = map { eval $sort_extractor } sort { eval $sorter } map { eval $data_extractor } @keys; } else { require Biber::UCollate; my $collopts = Biber::Config->getoption('collate_options'); # UCA level 2 if case insensitive sorting is requested unless (Biber::Config->getoption('sortcase')) { $collopts->{level} = 2; } # Add upper_before_lower option $collopts->{upper_before_lower} = Biber::Config->getoption('sortupper'); # Create collation object my $Collator = Biber::UCollate->new($thislocale, %$collopts); my $UCAversion = $Collator->version(); $logger->info("Sorting list '$lname' of type '$ltype' with scheme '$lssn' and locale '$thislocale'"); $logger->debug("Sorting with Unicode::Collate (" . stringify_hash($collopts) . ", UCA version: $UCAversion, Locale: " . $Collator->getlocale . ")"); # Log if U::C::L currently has no tailoring for used locale if ($Collator->getlocale eq 'default') { $logger->info("No sort tailoring available for locale '$thislocale'"); } # Construct a multi-field Schwartzian Transform with the right number of # extractions into a string representing an array ref as we musn't eval this yet my $num_sorts = 0; my $data_extractor = '['; my $sorter; my $sort_extractor; foreach my $sortset (@{$sortscheme->{spec}}) { my $fc = ''; my @fc; # Re-instantiate collation object if a different locale is required for this sort item. # This can't be done in a ->change() method, has to be a new object. my $cobj; my $sl = locale2bcp47($sortset->[0]{locale}); if (defined($sl) and $sl ne $thislocale) { $cobj = 'Biber::UCollate->new(' . "'$sl'" . ",'" . join("','", %$collopts) . "')"; } else { $cobj = '$Collator'; } # If the case or upper option on a field is not the global default # set it locally on the $Collator by constructing a change() method call my $sc = $sortset->[0]{sortcase}; if (defined($sc) and $sc != Biber::Config->getoption('sortcase')) { push @fc, $sc ? 'level => 4' : 'level => 2'; } my $su = $sortset->[0]{sortupper}; if (defined($su) and $su != Biber::Config->getoption('sortupper')) { push @fc, $su ? 'upper_before_lower => 1' : 'upper_before_lower => 0'; } if (@fc) { # This field has custom collation options $fc = '->change(' . join(',', @fc) . ')'; } else { # Reset collation options to global defaults if there are no field options # We have to do this as ->change modifies the Collation object $fc = '->change(level => ' . $collopts->{level} . ' ,upper_before_lower => ' . $collopts->{upper_before_lower} . ')'; } $data_extractor .= '$list->get_sortdata($_)->[1][' . $num_sorts . '],'; $sorter .= ' || ' if $num_sorts; # don't add separator before first field my $sd = $sortset->[0]{sort_direction}; if (defined($sd) and $sd eq 'descending') { # descending field $sorter .= $cobj . $fc . '->cmp($b->[' . $num_sorts . '],$a->[' . $num_sorts . '])'; } else { # ascending field $sorter .= $cobj . $fc . '->cmp($a->[' . $num_sorts . '],$b->[' . $num_sorts . '])'; } $num_sorts++; } $data_extractor .= '$_]'; # Handily, $num_sorts is now one larger than the number of fields which is the # correct index for the actual data in the sort array $sort_extractor = '$_->[' . $num_sorts . ']'; $logger->trace("Sorting extractor is: $sort_extractor"); $logger->trace("Sorting structure is: $sorter"); $logger->trace("Data extractor is: $data_extractor"); # Schwartzian transform multi-field sort @keys = map { eval $sort_extractor } sort { eval $sorter } map { eval $data_extractor } @keys; } $logger->debug("Keys after sort:\n"); foreach my $k (@keys) { $logger->debug("$k => " . $list->get_sortdata($k)->[0]); } $list->set_keys([ @keys ]); return; } =head2 prepare Do the main work. Process and sort all entries before writing the output. =cut sub prepare { my $self = shift; my $out = $self->get_output_obj; # Biber::Output object # Place to put global pre-processing things $self->process_setup; foreach my $section (@{$self->sections->get_sections}) { # shortcut - skip sections that don't have any keys next unless $section->get_citekeys or $section->is_allkeys; my $secnum = $section->number; $logger->info("Processing section $secnum"); $section->reset_caches; # Reset the the section caches (sorting, label etc.) Biber::Config->_init; # (re)initialise Config object $self->set_current_section($secnum); # Set the section number we are working on $self->fetch_data; # Fetch cited key and dependent data from sources $self->process_citekey_aliases; # Remove citekey aliases from citekeys $self->instantiate_dynamic; # Instantiate any dynamic entries (sets, related) $self->resolve_alias_refs; # Resolve xref/crossref/xdata aliases to real keys $self->resolve_xdata; # Resolve xdata entries $self->cite_setmembers; # Cite set members $self->process_interentry; # Process crossrefs/sets etc. $self->nullable_check; # Check entries for nullable fields $self->validate_datamodel; # Check against data model $self->process_entries_pre; # Main entry processing loop, part 1 $self->uniqueness; # Here we generate uniqueness information $self->process_visible_names; # Generate visible names information for all entries $self->process_entries_post; # Main entry processing loop, part 2 $self->process_lists; # process the output lists (sort and filtering) $self->generate_singletitle; # Generate singletitle field if requested $out->create_output_section; # Generate and push the section output into the # output object ready for writing } $out->create_output_misc; # Generate and push the final misc bits of output # into the output object ready for writing return; } =head2 prepare_tool Do the main work for tool mode =cut sub prepare_tool { my $self = shift; my $out = $self->get_output_obj; # Biber::Output object # Place to put global pre-processing things $self->process_setup_tool; # tool mode only has a section '99999' my $secnum = 99999; my $section = $self->sections->get_section($secnum); $section->reset_caches; # Reset the the section caches (sorting, label etc.) Biber::Config->_init; # (re)initialise Config object $self->set_current_section($secnum); # Set the section number we are working on $self->fetch_data; # Fetch cited key and dependent data from sources $self->process_visible_names;# Generate visible names information for all entries if (Biber::Config->getoption('output_resolve')) { $self->resolve_alias_refs; # Resolve xref/crossref/xdata aliases to real keys $self->resolve_xdata; # Resolve xdata entries $self->process_interentry; # Process crossrefs/sets etc. } $self->validate_datamodel; # Check against data model $self->process_lists; # process the output lists (sort and filtering) $out->create_output_section; # Generate and push the section output into the # into the output object ready for writing return; } =head2 fetch_data Fetch citekey and dependents data from section datasources Expects to find datasource packages named: Biber::Input:::: and one defined subroutine called: Biber::Input::::::extract_entries which takes args: 1: Biber object 2: Datasource name 3: Reference to an array of cite keys to look for and returns an array of the cite keys it did not find in the datasource =cut sub fetch_data { my $self = shift; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $dm = Biber::Config->get_dm; # Only looking for static keys, dynamic key entries are not in any datasource ... my @citekeys = $section->get_static_citekeys; no strict 'refs'; # symbolic references below ... # Clear all T::B macro definitions between sections if asked as T::B never clears these if (Biber::Config->getoption('clrmacros')) { $logger->debug('Clearing Text::BibTeX macros definitions'); Text::BibTeX::delete_all_macros(); } # (Re-)define the old BibTeX month macros to what biblatex wants unless user stops this unless (Biber::Config->getoption('nostdmacros')) { my %months = ('jan' => '01', 'feb' => '02', 'mar' => '03', 'apr' => '04', 'may' => '05', 'jun' => '06', 'jul' => '07', 'aug' => '08', 'sep' => '09', 'oct' => '10', 'nov' => '11', 'dec' => '12'); foreach my $mon (keys %months) { Text::BibTeX::delete_macro($mon); Text::BibTeX::add_macro_text($mon, $months{$mon}); } } # First we look for the directly cited keys in each datasource my @remaining_keys = @citekeys; $logger->debug('Looking for directly cited keys: ' . join(', ', @remaining_keys)); foreach my $datasource (@{$section->get_datasources}) { # shortcut if we have found all the keys now last unless (@remaining_keys or $section->is_allkeys); my $type = $datasource->{type}; my $name = $datasource->{name}; my $datatype = $datasource->{datatype}; if ($datatype eq 'biblatexml') { my $outfile; if (Biber::Config->getoption('tool')) { my $exts = join('|', values %DS_EXTENSIONS); $outfile = Biber::Config->getoption('dsn') =~ s/\.(?:$exts)$/.rng/r; } else { $outfile = Biber::Config->getoption('bcf') =~ s/bcf$/rng/r; } unless (Biber::Config->getoption('no_bltxml_schema')) { $dm->generate_bltxml_schema($outfile); } if (Biber::Config->getoption('validate_bltxml')) { validate_biber_xml($name, 'bltx', 'http://biblatex-biber.sourceforge.net/biblatexml', $outfile); } } my $package = 'Biber::Input::' . $type . '::' . $datatype; eval "require $package" or biber_error("Error loading data source package '$package': $@"); # Slightly different message for tool mode if (Biber::Config->getoption('tool')) { $logger->info("Looking for $datatype format $type '$name'"); } else { $logger->info("Looking for $datatype format $type '$name' for section $secnum"); } @remaining_keys = &{"${package}::extract_entries"}($name, \@remaining_keys); } # error reporting $logger->debug("Directly cited keys not found for section '$secnum': " . join(',', @remaining_keys)); foreach my $citekey (@remaining_keys) { biber_warn("I didn't find a database entry for '$citekey' (section $secnum)"); $section->del_citekey($citekey); $section->add_undef_citekey($citekey); } # Don't need to do dependent detection if running in (real) tool mode since this is always # allkeys=1 and we don't care about missing dependents which get_dependents() might prune. # pseudo_tool mode is bibtex output when not in tool mode. Internally, it's essentially # the same but without allkeys. if (Biber::Config->getoption('tool') and not Biber::Config->getoption('pseudo_tool')) { return; } $logger->debug('Building dependents for keys: ' . join(',', $section->get_citekeys)); # dependent key list generation - has to be a sub as it's recursive to catch # nested crossrefs, xdata etc. get_dependents($self, [$section->get_citekeys]); $logger->debug("Citekeys for section '$secnum' after fetching data: " . join(', ', $section->get_citekeys)); return; } =head2 get_dependents Get dependents of the entries for a given list of citekeys. Is called recursively until there are no more dependents to look for. =cut sub get_dependents { my ($self, $keys) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $dep_map; # Flag to say an entry has some deps so we can shortcut deletions my $new_deps; no strict 'refs'; # symbolic references below ... foreach my $citekey (@$keys) { # aliases need resolving here and are treated as dependents if (my $real = $section->get_citekey_alias($citekey)) { $logger->debug("Alias '$citekey' requires real key '$real'"); push @$new_deps, $real; $dep_map->{$real} = 1; } # Dynamic sets don't exist yet but their members do elsif (my @dmems = $section->get_dynamic_set($citekey)) { # skip looking for dependent if it's already there foreach my $dm (@dmems) { unless ($section->bibentry($dm)) { push @$new_deps, $dm; $dep_map->{$citekey} = 1; } } $logger->debug("Dynamic set entry '$citekey' has members: " . join(', ', @dmems)); } else { # This must exist for all but dynamic sets my $be = $section->bibentry($citekey); # xdata if (my $xdata = $be->get_field('xdata')) { foreach my $xdatum (@$xdata) { # skip looking for dependent if it's already there (loop suppression) push @$new_deps, $xdatum unless $section->bibentry($xdatum); $logger->debug("Entry '$citekey' has xdata '$xdatum'"); $dep_map->{$citekey} = 1; } } # crossrefs/xrefs my $refkey; if ($refkey = $be->get_field('xref') or $refkey = $be->get_field('crossref')) { # skip looking for dependent if it's already there (loop suppression) push @$new_deps, $refkey unless $section->bibentry($refkey); $logger->debug("Entry '$citekey' has cross/xref '$refkey'"); $dep_map->{$citekey} = 1; } # static sets if ($be->get_field('entrytype') eq 'set') { my $smems = $be->get_field('entryset'); # skip looking for dependent if it's already there (loop suppression) foreach my $sm (@$smems) { unless ($section->has_citekey($sm)) { push @$new_deps, $sm; $dep_map->{$citekey} = 1; } } $logger->debug("Static set entry '$citekey' has members: " . join(', ', @$smems)); } # Related entries if (my $relkeys = $be->get_field('related')) { # skip looking for dependent if it's already there (loop suppression) foreach my $rm (@$relkeys) { unless ($section->has_citekey($rm) or $section->is_related($rm)) { # record that $rm is used as a related entry key $section->add_related($rm); push @$new_deps, $rm; $dep_map->{$citekey} = 1; } } $logger->debug("Entry '$citekey' has related entries: " . join(', ', @$relkeys)); } } } # Remove repeated keys which are dependents of more than one entry @$new_deps = uniq @$new_deps; my @missing; if (@$new_deps) { # Now look for the dependents of the directly cited keys $logger->debug('Looking for dependent keys: ' . join(', ', @$new_deps)); # No need to go back to the datasource if allkeys, just see if the keys # are in section if ($section->is_allkeys) { foreach my $dk (@$new_deps) { push @missing, $dk unless $section->has_citekey($dk); } } else { @missing = @$new_deps; foreach my $datasource (@{$section->get_datasources}) { # shortcut if we have found all the keys now last unless @missing; my $type = $datasource->{type}; my $name = $datasource->{name}; my $datatype = $datasource->{datatype}; my $package = 'Biber::Input::' . $type . '::' . $datatype; eval "require $package" or biber_error("Error loading data source package '$package': $@"); @missing = &{"${package}::extract_entries"}($name, \@missing); } } # error reporting $logger->debug("Dependent keys not found for section '$secnum': " . join(', ', @missing)); foreach my $citekey ($section->get_citekeys) { next unless $dep_map->{$citekey}; # only if we have some missing deps to delete foreach my $missing_key (@missing) { $self->remove_undef_dependent($citekey, $missing_key); # Remove the missing key from the list to recurse with @$new_deps = grep { $_ ne $missing_key } @$new_deps; } } } $logger->trace('Recursing in get_dependents with: ' . join(', ', @$new_deps)); get_dependents($self, $new_deps) if @$new_deps; # recurse if there are more things to find return; # bottom of recursion } =head2 remove_undef_dependent Remove undefined dependent keys from an entry using a map of dependent keys to entries =cut sub remove_undef_dependent { my $self = shift; my ($citekey, $missing_key) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); # remove from any dynamic keys if (my @dmems = $section->get_dynamic_set($citekey)){ if (first {$missing_key eq $_} @dmems) { $section->set_dynamic_set($citekey, grep {$_ ne $missing_key} @dmems); } else { biber_warn("I didn't find a database entry for dynamic set member '$missing_key' - ignoring (section $secnum)"); } } else { my $be = $section->bibentry($citekey); # remove any xrefs if ($be->get_field('xref') and ($be->get_field('xref') eq $missing_key)) { $be->del_field('xref'); biber_warn("I didn't find a database entry for xref '$missing_key' in entry '$citekey' - ignoring (section $secnum)"); } # remove any crossrefs if ($be->get_field('crossref') and ($be->get_field('crossref') eq $missing_key)) { $be->del_field('crossref'); biber_warn("I didn't find a database entry for crossref '$missing_key' in entry '$citekey' - ignoring (section $secnum)"); } # remove xdata if (my $xdata = $be->get_field('xdata')) { if (first {$missing_key eq $_} @$xdata) { $be->set_datafield('xdata', [ grep {$_ ne $missing_key} @$xdata ]) ; biber_warn("I didn't find a database entry for xdata entry '$missing_key' in entry '$citekey' - ignoring (section $secnum)"); } } # remove static sets if ($be->get_field('entrytype') eq 'set') { my $smems = $be->get_field('entryset'); if (first {$missing_key eq $_} @$smems) { $be->set_datafield('entryset', [ grep {$_ ne $missing_key} @$smems ]); biber_warn("I didn't find a database entry for static set member '$missing_key' in entry '$citekey' - ignoring (section $secnum)"); } } # remove related entries if (my $relkeys = $be->get_field('related')) { if (first {$missing_key eq $_} @$relkeys) { $be->set_datafield('related', [ grep {$_ ne $missing_key} @$relkeys ]); # If no more related entries, remove the other related fields unless ($be->get_field('related')) { $be->del_field('relatedtype'); $be->del_field('relatedstring'); } biber_warn("I didn't find a database entry for related entry '$missing_key' in entry '$citekey' - ignoring (section $secnum)"); } } } return; } =head2 _parse_sort Convenience sub to parse a .bcf sorting section and return nice sorting object =cut sub _parse_sort { my $root_obj = shift; my $sorting; foreach my $sort (sort {$a->{order} <=> $b->{order}} @{$root_obj->{sort}}) { my $sortingitems; # Generate sorting pass structures foreach my $sortitem (sort {$a->{order} <=> $b->{order}} @{$sort->{sortitem}}) { my $sortitemattributes = {}; if (defined($sortitem->{substring_side})) { # Found sorting substring side attribute $sortitemattributes->{substring_side} = $sortitem->{substring_side}; } if (defined($sortitem->{substring_width})) { # Found sorting substring length attribute $sortitemattributes->{substring_width} = $sortitem->{substring_width}; } if (defined($sortitem->{pad_width})) { # Found sorting pad length attribute $sortitemattributes->{pad_width} = $sortitem->{pad_width}; } if (defined($sortitem->{pad_char})) { # Found sorting pad char attribute $sortitemattributes->{pad_char} = $sortitem->{pad_char}; } if (defined($sortitem->{pad_side})) { # Found sorting pad side attribute $sortitemattributes->{pad_side} = $sortitem->{pad_side}; } push @{$sortingitems}, {$sortitem->{content} => $sortitemattributes}; } # Only push a sortitem if defined. # Also, we only push the sort attributes if there are any sortitems otherwise # we end up with a blank sort my $sopts; $sopts->{final} = $sort->{final} if defined($sort->{final}); $sopts->{sort_direction} = $sort->{sort_direction} if defined($sort->{sort_direction}); $sopts->{sortcase} = $sort->{sortcase} if defined($sort->{sortcase}); $sopts->{sortupper} = $sort->{sortupper} if defined($sort->{sortupper}); $sopts->{locale} = $sort->{locale} if defined($sort->{locale}); if (defined($sortingitems)) { unshift @{$sortingitems}, $sopts; push @{$sorting}, $sortingitems; } } return {locale => locale2bcp47($root_obj->{locale} || Biber::Config->getblxoption('sortlocale')), spec => $sorting}; } =head2 _filedump and _stringdump Dump the biber object with Data::Dump for debugging =cut sub _filedump { my ($self, $file) = @_; my $fh = IO::File->new($file, '>') or croak "Can't open file $file for writing"; print $fh Data::Dump::pp($self); close $fh; return } sub _stringdump { my $self = shift ; return Data::Dump::pp($self); } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber000755000765000024 012667073765 16134 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/Config.pm000444000765000024 13557512667073765 20114 0ustar00philkimestaff000000000000package Biber::Config; use v5.16; use Biber; use Biber::Constants; use Biber::Utils; use IPC::Cmd qw( can_run ); use IPC::Run3; # This works with PAR::Packer and Windows. IPC::Run doesn't use Cwd qw( abs_path ); use Data::Compare; use Data::Dump; use Encode; use File::Slurp; use File::Spec; use Carp; use List::AllUtils qw(first max); use Log::Log4perl qw( :no_extra_logdie_message ); # To keep PAR::Packer happy, explicitly load these use Log::Log4perl::Appender::Screen; use Log::Log4perl::Appender::File; use Log::Log4perl::Layout::SimpleLayout; use Log::Log4perl::Layout::PatternLayout; use Unicode::Normalize; use parent qw(Class::Accessor); __PACKAGE__->follow_best_practice; our $VERSION = '2.4'; our $BETA_VERSION = 0; # Is this a beta version? our $logger = Log::Log4perl::get_logger('main'); our $screen = Log::Log4perl::get_logger('screen'); our $logfile = Log::Log4perl::get_logger('logfile'); =encoding utf-8 =head1 NAME Biber::Config - Configuration items which need to be saved across the lifetime of a Biber object This class contains a static object and static methods to access configuration and state data. There are several classes of data in here which have separate accessors: * Biber options * Biblatex options * State information used by Biber as it processes entries * displaymode date =cut # Static (class) data our $CONFIG; $CONFIG->{state}{crossrefkeys} = {}; $CONFIG->{state}{seenwork} = {}; # Set tracking, parent->child and child->parent $CONFIG->{state}{set}{pc} = {}; $CONFIG->{state}{set}{cp} = {}; # Citekeys which refer to the same entry $CONFIG->{state}{citkey_aliases} = {}; # Disambiguation data for labelalpha. Used for labelalphatemplate autoinc method $CONFIG->{state}{ladisambiguation} = {}; # Record of which entries have inherited from other fields. Used for loop detection. $CONFIG->{state}{crossref} = []; $CONFIG->{state}{xdata} = []; # Record of which entries have inherited what from whom, with the fields inherited. # Used for generating inheritance trees $CONFIG->{state}{graph} = {}; # For the uniquelist feature. Records the number of times a name list occurs in all entries $CONFIG->{state}{uniquelistcount} = {}; # Boolean to say whether uniquename/uniquelist information has changed # Default is true so that uniquename/uniquelist processing starts $CONFIG->{state}{unulchanged} = 1; # uniquenamecount holds a hash of familynames and familyname/initials $CONFIG->{state}{uniquenamecount} = {}; # Same as uniquenamecount but for all names, regardless of visibility. Needed to track # uniquelist $CONFIG->{state}{uniquenamecount_all} = {}; # Counter for tracking name/year combinations for extrayear $CONFIG->{state}{seen_nameyear} = {}; # Counter for the actual extrayear value $CONFIG->{state}{seen_extrayear} = {}; # Counter for tracking name/title combinations for extratitle $CONFIG->{state}{seen_nametitle} = {}; # Counter for the actual extratitle value $CONFIG->{state}{seen_extratitle} = {}; # Counter for tracking title/year combinations for extratitleyear $CONFIG->{state}{seen_titleyear} = {}; # Counter for the actual extratitleyear value $CONFIG->{state}{seen_extratitleyear} = {}; # Counter for the actual extraalpha value $CONFIG->{state}{seen_extraalpha} = {}; $CONFIG->{state}{seenkeys} = {}; # Track the order of keys as cited. Keys cited in the same \cite*{} get the same order # Used for sorting schemes which use \citeorder $CONFIG->{state}{keyorder} = {}; # Location of the control file $CONFIG->{state}{control_file_location} = ''; # Data files per section being used by biber $CONFIG->{state}{datafiles} = []; =head2 _init Reset internal hashes to defaults. =cut sub _init { $CONFIG->{options}{biblatex}{ENTRY} = {}; $CONFIG->{state}{unulchanged} = 1; $CONFIG->{state}{control_file_location} = ''; $CONFIG->{state}{seenwork} = {}; $CONFIG->{state}{crossrefkeys} = {}; $CONFIG->{state}{ladisambiguation} = {}; $CONFIG->{state}{uniquenamecount} = {}; $CONFIG->{state}{uniquenamecount_all} = {}; $CONFIG->{state}{uniquelistcount} = {}; $CONFIG->{state}{seen_nameyear} = {}; $CONFIG->{state}{seen_extrayear} = {}; $CONFIG->{state}{seen_nametitle} = {}; $CONFIG->{state}{seen_extratitle} = {}; $CONFIG->{state}{seen_titleyear} = {}; $CONFIG->{state}{seen_extratitleyear} = {}; $CONFIG->{state}{seen_extrayearalpha} = {}; $CONFIG->{state}{seenkeys} = {}; $CONFIG->{state}{datafiles} = []; $CONFIG->{state}{crossref} = []; $CONFIG->{state}{xdata} = []; $CONFIG->{state}{set}{pc} = {}; $CONFIG->{state}{set}{cp} = {}; return; } =head2 _initopts Initialise default options, optionally with config file as argument =cut sub _initopts { shift; # class method so don't care about class name my $opts = shift; my $userconf; # For testing, need to be able to force ignore of conf file in case user # already has one which interferes with test settings. unless (defined($opts->{noconf})) { # if a config file was given as cmd-line arg, it overrides all other # config file locations unless ( defined($opts->{configfile}) and -f $opts->{configfile} ) { $opts->{configfile} = config_file(); } } # Set hard-coded biber option defaults while (my ($k, $v) = each %$CONFIG_DEFAULT_BIBER) { if (exists($v->{content})) { # simple option Biber::Config->setoption($k, $v->{content}); } # mildly complex options elsif (lc($k) eq 'dot_include' or lc($k) eq 'collate_options' or lc($k) eq 'nosort' or lc($k) eq 'nolabel' or lc($k) eq 'nolabelwidthcount' or lc($k) eq 'noinit' ) { Biber::Config->setoption($k, $v->{option}); } } # There is a special default config file for tool mode # Referring to as yet unprocessed cmd-line tool option as it isn't processed until below if ($opts->{tool}) { (my $vol, my $dir, undef) = File::Spec->splitpath( $INC{"Biber/Config.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' _config_file_set(File::Spec->catpath($vol, "$dir", 'biber-tool.conf')); } # Normal user config file - overrides tool mode defaults, if any _config_file_set($opts->{configfile}); # Set hard-coded biblatex option defaults # This has to go after _config_file_set() as this is what defines option scope # in tool mode (from the .conf file) foreach (keys %CONFIG_DEFAULT_BIBLATEX) { Biber::Config->setblxoption($_, $CONFIG_DEFAULT_BIBLATEX{$_}); } # Command-line overrides everything else foreach my $copt (keys %$opts) { # This is a tricky option as we need to keep non-overriden defaults # If we don't we can get errors when contructing the sorting call to eval() later if (lc($copt) eq 'collate_options') { my $collopts = Biber::Config->getoption('collate_options'); my $copt_h = eval "{ $opts->{$copt} }" or croak('Bad command-line collation options'); # Override defaults with any cmdline settings foreach my $co (keys %$copt_h) { $collopts->{$co} = $copt_h->{$co}; } Biber::Config->setconfigfileoption('collate_options', $collopts); } else { Biber::Config->setcmdlineoption($copt, $opts->{$copt}); } } # Record the $ARGV[0] name for future use if (Biber::Config->getoption('tool')) { # Set datasource file name. In a conditional as @ARGV might not be set in tests if (my $dsn = $ARGV[0]) { # ARGV is ok even in a module Biber::Config->setoption('dsn', $dsn); } } else { # Set control file name. In a conditional as @ARGV might not be set in tests if (my $bcf = $ARGV[0]) { # ARGV is ok even in a module $bcf .= '.bcf' unless $bcf =~ m/\.bcf$/; Biber::Config->setoption('bcf', $bcf); } } # Set log file name my $biberlog; if (my $log = Biber::Config->getoption('logfile')) { # user specified logfile name # Sanitise user-specified log name $log =~ s/\.blg\z//xms; $biberlog = $log . '.blg'; } elsif (not @ARGV) { # default if no .bcf file specified - mainly in tests Biber::Config->setoption('nolog', 1); } else { # set log to \jobname.blg my $bcf = $ARGV[0]; # ARGV is ok even in a module # Sanitise control file name $bcf =~ s/\.bcf\z//xms; $biberlog = $bcf . '.blg'; } # prepend output directory for log, if specified if (my $outdir = Biber::Config->getoption('output_directory')) { $biberlog = File::Spec->catfile($outdir, $biberlog); } # Setting up Log::Log4perl my $LOGLEVEL; if (Biber::Config->getoption('trace')) { $LOGLEVEL = 'TRACE' } elsif (Biber::Config->getoption('debug')) { $LOGLEVEL = 'DEBUG' } elsif (Biber::Config->getoption('quiet') == 1) { $LOGLEVEL = 'ERROR' } elsif (Biber::Config->getoption('quiet') > 1) { $LOGLEVEL = 'FATAL' } else { $LOGLEVEL = 'INFO' } my $LOGLEVEL_F; my $LOG_MAIN; if (Biber::Config->getoption('nolog')) { $LOG_MAIN = 'Screen'; $LOGLEVEL_F = 'OFF' } else { $LOG_MAIN = 'Logfile, Screen'; $LOGLEVEL_F = $LOGLEVEL } my $LOGLEVEL_S; if (Biber::Config->getoption('onlylog')) { $LOGLEVEL_S = 'OFF' } else { # Max screen loglevel is INFO if (Biber::Config->getoption('quiet') == 1) { $LOGLEVEL_S = 'ERROR'; } elsif (Biber::Config->getoption('quiet') > 1) { $LOGLEVEL_S = 'FATAL' } else { $LOGLEVEL_S = 'INFO'; } } # configuration "file" for Log::Log4perl my $l4pconf = qq| log4perl.category.main = $LOGLEVEL, $LOG_MAIN log4perl.category.screen = $LOGLEVEL_S, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LOGLEVEL_S log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; # Only want a logfile appender if --nolog isn't set if ($LOGLEVEL_F ne 'OFF') { $l4pconf .= qq| log4perl.category.logfile = $LOGLEVEL_F, Logfile log4perl.appender.Logfile = Log::Log4perl::Appender::File log4perl.appender.Logfile.utf8 = 1 log4perl.appender.Logfile.Threshold = $LOGLEVEL_F log4perl.appender.Logfile.filename = $biberlog log4perl.appender.Logfile.mode = clobber log4perl.appender.Logfile.layout = Log::Log4perl::Layout::PatternLayout log4perl.appender.Logfile.layout.ConversionPattern = [%r] %F{1}:%L> %p - %m%n |; } Log::Log4perl->init(\$l4pconf); my $vn = $VERSION; $vn .= ' (beta)' if $BETA_VERSION; my $tool = ' running in TOOL mode' if Biber::Config->getoption('tool'); $logger->info("This is Biber $vn$tool") unless Biber::Config->getoption('nolog'); $logger->info("Config file is '" . $opts->{configfile} . "'") if $opts->{configfile}; $logger->info("Logfile is '$biberlog'") unless Biber::Config->getoption('nolog'); if (Biber::Config->getoption('debug')) { $screen->info("DEBUG mode: all messages are logged to '$biberlog'") } return; } # read a config file and set options from it sub _config_file_set { my $conf = shift; my $userconf; # Can't use logcroak here because logging isn't initialised yet if (defined($conf)) { require XML::LibXML::Simple; my $buf = File::Slurp::read_file($conf); $buf = NFD(decode('UTF-8', $buf));# Unicode NFD boundary $userconf = XML::LibXML::Simple::XMLin($buf, 'ForceContent' => 1, 'ForceArray' => [ qr/\Aoption\z/, qr/\Amaps\z/, qr/\Amap\z/, qr/\Amap_step\z/, qr/\Aper_type\z/, qr/\Aper_datasource\z/, qr/\Atype_pair\z/, qr/\Ainherit\z/, qr/\Afieldor\z/, qr/\Afieldxor\z/, qr/\Afield\z/, qr/\Aalias\z/, qr/\Aalsoset\z/, qr/\Aconstraints\z/, qr/\Aconstraint\z/, qr/\Aentrytype\z/, qr/\Adatetype\z/, qr/\Acondition\z/, qr/\A(?:or)?filter\z/, qr/\Asortexclusion\z/, qr/\Aexclusion\z/, qr/\Asort\z/, qr/\Asortitem\z/, qr/\Apresort\z/, qr/\Aoptionscope\z/, ], 'NsStrip' => 1, 'KeyAttr' => []) or croak("Failed to read biber config file '$conf'\n $@"); } # Option scope has to be set first foreach my $bcfscopeopts (@{$userconf->{optionscope}}) { my $scope = $bcfscopeopts->{type}; foreach my $bcfscopeopt (@{$bcfscopeopts->{option}}) { my $opt = $bcfscopeopt->{content}; $CONFIG_OPTSCOPE_BIBLATEX{$opt}{$scope} = 1; $CONFIG_SCOPEOPT_BIBLATEX{$scope}{$opt} = 1; } } # Now we have the per-namelist options, make the accessors for them in the Names package foreach my $nso (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAMELIST}}) { Biber::Entry::Names->follow_best_practice; Biber::Entry::Names->mk_accessors($nso); } # Now we have the per-name options, make the accessors for them in the Name package foreach my $no (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAME}}) { Biber::Entry::Name->follow_best_practice; Biber::Entry::Name->mk_accessors($no); } delete $userconf->{optionscope}; # Set options from config file while (my ($k, $v) = each %$userconf) { if (exists($v->{content})) { # simple option Biber::Config->setconfigfileoption($k, $v->{content}); } # mildly complex options - nosort/collate_options elsif (lc($k) eq 'nosort' or lc($k) eq 'noinit' or lc($k) eq 'nolabel' ) { Biber::Config->setconfigfileoption($k, $v->{option}); } # rather complex options elsif (lc($k) eq 'collate_options') { my $collopts = Biber::Config->getoption('collate_options'); # Override defaults with any user settings foreach my $co (@{$v->{option}}) { $collopts->{$co->{name}} = $co->{value}; } Biber::Config->setconfigfileoption($k, $collopts); } elsif (lc($k) eq 'sourcemap') { my $sms; foreach my $sm (@{$v->{maps}}) { if (defined($sm->{level}) and $sm->{level} eq 'driver') { carp("You can't set driver level sourcemaps via biber - use \\DeclareDriverSourcemap in biblatex. Ignoring map."); } elsif (defined($sm->{level}) and $sm->{level} eq 'style') { carp("You can't set style level sourcemaps via biber - use \\DeclareStyleSourcemap in biblatex. Ignoring map."); } else { push @$sms, $sm; } } Biber::Config->setconfigfileoption($k, $sms); } elsif (lc($k) eq 'inheritance') {# This is a biblatex option Biber::Config->setblxoption($k, $v); } elsif (lc($k) eq 'sorting') {# This is a biblatex option # sorting excludes foreach my $sex (@{$v->{sortexclusion}}) { my $excludes; foreach my $ex (@{$sex->{exclusion}}) { $excludes->{$ex->{content}} = 1; } Biber::Config->setblxoption('sortexclusion', $excludes, 'ENTRYTYPE', $sex->{type}); } # presort defaults foreach my $presort (@{$v->{presort}}) { # Global presort default unless (exists($presort->{type})) { Biber::Config->setblxoption('presort', $presort->{content}); } # Per-type default else { Biber::Config->setblxoption('presort', $presort->{content}, 'ENTRYTYPE', $presort->{type}); } } Biber::Config->setblxoption('sorting', Biber::_parse_sort($v)); } elsif (lc($k) eq 'datamodel') {# This is a biblatex option Biber::Config->setblxoption('datamodel', $v); } } } =head2 config_file Returns the full path of the B configuration file. If returns the first file found among: =over 4 =item * C in the current directory =item * C<$HOME/.biber.conf> =item * C<$ENV{XDG_CONFIG_HOME}/biber/biber.conf> =item * C<$HOME/Library/biber/biber.conf> (Mac OSX only) =item * C<$ENV{APPDATA}/biber.conf> (Windows only) =item * the output of C (if available on the system). =back If no file is found, it returns C. =cut sub config_file { my $biberconf; if ( -f $BIBER_CONF_NAME ) { $biberconf = abs_path($BIBER_CONF_NAME); } elsif ( -f File::Spec->catfile($ENV{HOME}, ".$BIBER_CONF_NAME" ) ) { $biberconf = File::Spec->catfile($ENV{HOME}, ".$BIBER_CONF_NAME" ); } elsif ( defined $ENV{XDG_CONFIG_HOME} and -f File::Spec->catfile($ENV{XDG_CONFIG_HOME}, "biber", $BIBER_CONF_NAME) ) { $biberconf = File::Spec->catfile($ENV{XDG_CONFIG_HOME}, "biber", $BIBER_CONF_NAME); } elsif ( $^O =~ /(?:Mac|darwin)/ and -f File::Spec->catfile($ENV{HOME}, "Library", "biber", $BIBER_CONF_NAME) ) { $biberconf = File::Spec->catfile($ENV{HOME}, "Library", "biber", $BIBER_CONF_NAME); } elsif ( $^O =~ /Win/ and defined $ENV{APPDATA} and -f File::Spec->catfile($ENV{APPDATA}, "biber", $BIBER_CONF_NAME) ) { $biberconf = File::Spec->catfile($ENV{APPDATA}, "biber", $BIBER_CONF_NAME); } elsif ( can_run('kpsewhich') ) { my $err; run3 [ 'kpsewhich', $BIBER_CONF_NAME ], \undef, \$biberconf, \$err, { return_if_system_error => 1}; if ($? == -1) { biber_error("Error running kpsewhich to look for config file: $err"); } chomp $biberconf; $biberconf =~ s/\cM\z//xms; # kpsewhich in cygwin sometimes returns ^M at the end $biberconf = undef unless $biberconf; # sanitise just in case it's an empty string } else { $biberconf = undef; } return $biberconf; } ############################## # Biber options static methods ############################## =head2 get_unul_done Return a boolean saying whether uniquenename+uniquelist processing is finished =cut sub get_unul_done { shift; # class method so don't care about class name return $CONFIG->{state}{unulchanged} ? 0 : 1; } =head2 set_unul_changed Set a boolean saying whether uniquename+uniquelist has changed =cut sub set_unul_changed { shift; # class method so don't care about class name my $val = shift; $CONFIG->{state}{unulchanged} = $val; return; } =head2 postprocess_biber_opts Place to postprocess biber options when they have been gathered from all the possible places that set them =cut sub postprocess_biber_opts { shift; # class method so don't care about class name # Turn sortcase, sortupper, sortgiveninits into booleans if they are not already # They are not booleans on the command-line/config file so that they # mirror biblatex option syntax for users, for example foreach my $opt ('sortgiveninits', 'sortcase', 'sortupper') { if (exists($CONFIG->{options}{biber}{$opt})) { if ($CONFIG->{options}{biber}{$opt} eq 'true') { $CONFIG->{options}{biber}{$opt} = 1; } elsif ($CONFIG->{options}{biber}{$opt} eq 'false') { $CONFIG->{options}{biber}{$opt} = 0; } unless ($CONFIG->{options}{biber}{$opt} eq '1' or $CONFIG->{options}{biber}{$opt} eq '0') { Biber::Utils::biber_error("Invalid value for option '$opt'"); } } } } =head2 set_dm Sets the data model information object =cut sub set_dm { shift; my $obj = shift; $CONFIG->{dm} = $obj; return; } =head2 get_dm Gets the data model information object =cut sub get_dm { shift; return $CONFIG->{dm}; } =head2 set_ctrlfile_path Stores the path to the control file =cut sub set_ctrlfile_path { shift; $CONFIG->{control_file_location} = shift; return; } =head2 get_ctrlfile_path Retrieved the path to the control file =cut sub get_ctrlfile_path { shift; return $CONFIG->{control_file_location}; } =head2 setoption Store a Biber config option =cut sub setoption { shift; # class method so don't care about class name my ($opt, $val) = @_; $CONFIG->{options}{biber}{$opt} = $val; return; } =head2 getoption Get a Biber option =cut sub getoption { shift; # class method so don't care about class name my $opt = shift; return $CONFIG->{options}{biber}{$opt}; } =head2 setcmdlineoption Store a Biber command-line option =cut sub setcmdlineoption { shift; # class method so don't care about class name my ($opt, $val) = @_; # Command line options are also options ... $CONFIG->{options}{biber}{$opt} = $CONFIG->{cmdlineoptions}{$opt} = $val; return; } =head2 setconfigfileoption Store a Biber config-file option =cut sub setconfigfileoption { shift; # class method so don't care about class name my ($opt, $val) = @_; # Config file options are also options ... $CONFIG->{options}{biber}{$opt} = $CONFIG->{configfileoptions}{$opt} = $val; # Config file options can also be global biblatex options if ($CONFIG_OPTSCOPE_BIBLATEX{$opt}) { $CONFIG->{options}{biblatex}{GLOBAL}{$opt} = $val; } return; } =head2 iscmdlineoption Check if an option is explicitly set by user on the command line =cut sub iscmdlineoption { shift; # class method so don't care about class name my $opt = shift; return 1 if defined($CONFIG->{cmdlineoptions}{$opt}); return 0; } =head2 isconfigfileoption Check if an option is explicitly set by user in their config file =cut sub isconfigfileoption { shift; # class method so don't care about class name my $opt = shift; return 1 if defined($CONFIG->{configfileoptions}{$opt}); return 0; } =head2 isexplicitoption Check if an option is explicitly set by user on the command line or in the config file =cut sub isexplicitoption { my $self = shift; my $opt = shift; return 1 if ($self->iscmdlineoption($opt) || $self->isconfigfileoption($opt)); return 0; } ################################# # BibLaTeX options static methods ################################# =head2 setblxoption Set a biblatex option on the appropriate scope =cut sub setblxoption { shift; # class method so don't care about class name my ($opt, $val, $scope, $scopeval) = @_; if (not defined($scope)) { # global is the default if ($CONFIG_OPTSCOPE_BIBLATEX{$opt}->{GLOBAL}) { $CONFIG->{options}{biblatex}{GLOBAL}{$opt} = $val; } } else { # Per-type/entry options need to specify type/entry too if ($CONFIG_OPTSCOPE_BIBLATEX{$opt}->{$scope}) { $CONFIG->{options}{biblatex}{$scope}{$scopeval}{$opt} = $val; } } return; } =head2 getblxoption Get a biblatex option from the global, per-type or per entry scope getblxoption('option', ['entrytype'], ['citekey']) Returns the value of option. In order of decreasing preference, returns: 1. Biblatex option defined for entry 2. Biblatex option defined for entry type 3. Biblatex option defined globally =cut sub getblxoption { no autovivification; shift; # class method so don't care about class name my ($opt, $entrytype, $citekey) = @_; if ( defined($citekey) and $CONFIG_OPTSCOPE_BIBLATEX{$opt}->{ENTRY} and defined $CONFIG->{options}{biblatex}{ENTRY}{$citekey}{$opt}) { return $CONFIG->{options}{biblatex}{ENTRY}{$citekey}{$opt}; } elsif (defined($entrytype) and $CONFIG_OPTSCOPE_BIBLATEX{$opt}->{ENTRYTYPE} and defined $CONFIG->{options}{biblatex}{ENTRYTYPE}{lc($entrytype)}{$opt}) { return $CONFIG->{options}{biblatex}{ENTRYTYPE}{lc($entrytype)}{$opt}; } elsif ($CONFIG_OPTSCOPE_BIBLATEX{$opt}->{GLOBAL}) { return $CONFIG->{options}{biblatex}{GLOBAL}{$opt}; } } ############################## # Inheritance state methods ############################## =head2 set_graph Record node and arc connection types for .dot output =cut sub set_graph { shift; # class method so don't care about class name my $type = shift; if ($type eq 'set') { my ($source_key, $target_key) = @_; $logger->debug("Saving DOT graph information type 'set' with SOURCEKEY=$source_key, TARGETKEY=$target_key"); $CONFIG->{state}{graph}{$type}{settomem}{$source_key}{$target_key} = 1; $CONFIG->{state}{graph}{$type}{memtoset}{$target_key} = $source_key; } elsif ($type eq 'xref') { my ($source_key, $target_key) = @_; $logger->debug("Saving DOT graph information type 'xref' with SOURCEKEY=$source_key, TARGETKEY=$target_key"); $CONFIG->{state}{graph}{$type}{$source_key} = $target_key; } elsif ($type eq 'related') { my ($clone_key, $related_key, $target_key) = @_; $logger->debug("Saving DOT graph information type 'related' with CLONEKEY=$clone_key, RELATEDKEY=$related_key, TARGETKEY=$target_key"); $CONFIG->{state}{graph}{$type}{reltoclone}{$related_key}{$clone_key} = 1; $CONFIG->{state}{graph}{$type}{clonetotarget}{$clone_key}{$target_key} = 1; } else { my ($source_key, $target_key, $source_field, $target_field) = @_; $logger->debug("Saving DOT graph information type '$type' with SOURCEKEY=$source_key, TARGETKEY=$target_key, SOURCEFIELD=$source_field, TARGETFIELD=$target_field"); $CONFIG->{state}{graph}{$type}{$source_key}{$source_field}{$target_key} = $target_field; } return; } =head2 get_graph Return an inheritance graph data structure for an inheritance type =cut sub get_graph { shift; # class method so don't care about class name my $type = shift; return $CONFIG->{state}{graph}{$type}; } =head2 set_set_pc Record a parent->child set relationship =cut sub set_set_pc { shift; # class method so don't care about class name my ($parent, $child) = @_; $CONFIG->{state}{set}{pc}{$parent}{$child} = 1; return; } =head2 set_set_cp Record a child->parent set relationship =cut sub set_set_cp { shift; # class method so don't care about class name my ($child, $parent) = @_; $CONFIG->{state}{set}{cp}{$child}{$parent} = 1; return; } =head2 get_set_pc Return a boolean saying if there is a parent->child set relationship =cut sub get_set_pc { shift; # class method so don't care about class name my ($parent, $child) = @_; return exists($CONFIG->{state}{set}{pc}{$parent}{$child}) ? 1 : 0; } =head2 get_set_cp Return a boolean saying if there is a child->parent set relationship =cut sub get_set_cp { shift; # class method so don't care about class name my ($child, $parent) = @_; return exists($CONFIG->{state}{set}{cp}{$child}{$parent}) ? 1 : 0; } =head2 get_set_children Return a list of children for a parent set =cut sub get_set_children { shift; # class method so don't care about class name my $parent = shift; if (exists($CONFIG->{state}{set}{pc}{$parent})) { return (keys %{$CONFIG->{state}{set}{pc}{$parent}}); } else { return (); } } =head2 get_set_parents Return a list of parents for a child of a set =cut sub get_set_parents { shift; # class method so don't care about class name my $child = shift; if (exists($CONFIG->{state}{set}{cp}{$child})) { return (keys %{$CONFIG->{state}{set}{cp}{$child}}); } else { return (); } } =head2 set_inheritance Record that $target inherited information from $source Can be used for crossrefs and xdata. This just records that an entry inherited from another entry, for loop detection. =cut sub set_inheritance { shift; # class method so don't care about class name my ($type, $source, $target) = @_; push @{$CONFIG->{state}{$type}}, {s => $source, t => $target}; return; } =head2 get_inheritance Check if $target directly inherited information from $source Can be used for crossrefs and xdata =cut sub get_inheritance { shift; # class method so don't care about class name my ($type, $source, $target) = @_; return first {$_->{s} eq $source and $_->{t} eq $target} @{$CONFIG->{state}{$type}}; } =head2 is_inheritance_path Checks for an inheritance path from entry $e1 to $e2 Can be used for crossrefs and xdata [ {s => 'A', t => 'B'}, {s => 'A', t => 'E'}, {s => 'B', t => 'C'}, {s => 'C', t => 'D'} ]; =cut sub is_inheritance_path { my ($self, $type, $e1, $e2) = @_; foreach my $dps (grep {$_->{s} eq $e1} @{$CONFIG->{state}{$type}}) { return 1 if $dps->{t} eq $e2; return 1 if is_inheritance_path($self, $type, $dps->{t}, $e2); } return 0; } =head1 labelalpha disambiguation =head2 incr_la_disambiguation Increment a counter to say we have seen this labelalpha =cut sub incr_la_disambiguation { shift; # class method so don't care about class name my $la = shift; $CONFIG->{state}{ladisambiguation}{$la}++; return; } =head2 get_la_disambiguation Get the disambiguation counter for this labelalpha. Return a 0 for undefs to avoid spurious errors. =cut sub get_la_disambiguation { shift; # class method so don't care about class name my $la = shift; return $CONFIG->{state}{ladisambiguation}{$la} // 0; } =head1 keyorder =head2 set_keyorder Set some key order information =cut sub set_keyorder { shift; # class method so don't care about class name my ($section, $key, $keyorder) = @_; $CONFIG->{state}{keyorder}{$section}{$key} = $keyorder; return; } =head2 get_keyorder Get some key order information =cut sub get_keyorder { shift; # class method so don't care about class name my ($section, $key) = @_; return $CONFIG->{state}{keyorder}{$section}{$key}; } =head2 get_keyorder_max Get maximum key order number for a section =cut sub get_keyorder_max { shift; # class method so don't care about class name my $section = shift; return (max values %{$CONFIG->{state}{keyorder}{$section}}) || 0; } =head2 reset_keyorder Reset keyorder - for use in tests where we switch to allkeys =cut sub reset_keyorder { shift; # class method so don't care about class name my $section = shift; delete $CONFIG->{state}{keyorder}{$section}; return; } =head1 seenkey =head2 get_seenkey Get the count of a key =cut sub get_seenkey { shift; # class method so don't care about class name my $key = shift; my $section = shift; # If passed, return count for just this section if (defined($section)) { return $CONFIG->{state}{seenkeys}{$section}{$key}; } else { my $count; foreach my $section (keys %{$CONFIG->{state}{seenkeys}}) { $count += $CONFIG->{state}{seenkeys}{$section}{$key}; } return $count; } } =head2 incr_seenkey Increment the seen count of a key =cut sub incr_seenkey { shift; # class method so don't care about class name my $key = shift; my $section = shift; $CONFIG->{state}{seenkeys}{$section}{$key}++; return; } =head2 get_seenwork Get the count of occurences of a labelname or labeltitle =cut sub get_seenwork { shift; # class method so don't care about class name my $identifier = shift; return $CONFIG->{state}{seenwork}{$identifier}; } =head2 incr_seenwork Increment the count of occurences of a labelname or labeltitle =cut sub incr_seenwork { shift; # class method so don't care about class name my $identifier = shift; $CONFIG->{state}{seenwork}{$identifier}++; return; } =head2 reset_seen_extra Reset the counters for extra* =cut sub reset_seen_extra { shift; # class method so don't care about class name my $ay = shift; $CONFIG->{state}{seen_extrayear} = {}; $CONFIG->{state}{seen_extratitle} = {}; $CONFIG->{state}{seen_extratitleyear} = {}; $CONFIG->{state}{seen_extraalpha} = {}; return; } =head2 incr_seen_extrayear Increment and return the counter for extrayear =cut sub incr_seen_extrayear { shift; # class method so don't care about class name my $ey = shift; return ++$CONFIG->{state}{seen_extrayear}{$ey}; } =head2 incr_seen_extratitle Increment and return the counter for extratitle =cut sub incr_seen_extratitle { shift; # class method so don't care about class name my $et = shift; return ++$CONFIG->{state}{seen_extratitle}{$et}; } =head2 incr_seen_extratitleyear Increment and return the counter for extratitleyear =cut sub incr_seen_extratitleyear { shift; # class method so don't care about class name my $ety = shift; return ++$CONFIG->{state}{seen_extratitleyear}{$ety}; } =head2 incr_seen_extraalpha Increment and return the counter for extraalpha =cut sub incr_seen_extraalpha { shift; # class method so don't care about class name my $ea = shift; return ++$CONFIG->{state}{seen_extraalpha}{$ea}; } =head2 get_seen_nameyear Get the count of an labelname/labelyear combination for tracking extrayear. It uses labelyear plus name as we need to disambiguate entries with different labelyear (like differentiating 1984--1986 from just 1984) =cut sub get_seen_nameyear { shift; # class method so don't care about class name my $ny = shift; return $CONFIG->{state}{seen_nameyear}{$ny}; } =head2 incr_seen_nameyear Increment the count of an labelname/labelyear combination for extrayear We pass in the name and year strings seperately as we have to be careful and only increment this counter beyond 1 if there is a name component. Otherwise, extrayear gets defined for all entries with no name but the same year etc. =cut sub incr_seen_nameyear { shift; # class method so don't care about class name my ($ns, $ys) = @_; my $tmp = "$ns,$ys"; # We can always increment this to 1 unless ($CONFIG->{state}{seen_nameyear}{$tmp}) { $CONFIG->{state}{seen_nameyear}{$tmp}++; } # But beyond that only if we have a labelname in the entry since # this counter is used to create extrayear which doesn't mean anything for # entries with no name # We allow empty year so that we generate extrayear for the same name with no year # so we can do things like "n.d.-a", "n.d.-b" etc. else { if ($ns) { $CONFIG->{state}{seen_nameyear}{$tmp}++; } } return; } =head2 get_seen_nametitle Get the count of an labelname/labeltitle combination for tracking extratitle. =cut sub get_seen_nametitle { shift; # class method so don't care about class name my $nt = shift; return $CONFIG->{state}{seen_nametitle}{$nt}; } =head2 incr_seen_nametitle Increment the count of an labelname/labeltitle combination for extratitle We pass in the name and year strings seperately as we have to be careful and only increment this counter beyond 1 if there is a title component. Otherwise, extratitle gets defined for all entries with no title. =cut sub incr_seen_nametitle { shift; # class method so don't care about class name my ($ns, $ts) = @_; my $tmp = "$ns,$ts"; # We can always increment this to 1 unless ($CONFIG->{state}{seen_nametitle}{$tmp}) { $CONFIG->{state}{seen_nametitle}{$tmp}++; } # But beyond that only if we have a labeltitle in the entry since # this counter is used to create extratitle which doesn't mean anything for # entries with no title else { if ($ts) { $CONFIG->{state}{seen_nametitle}{$tmp}++; } } return; } =head2 get_seen_titleyear Get the count of an labeltitle/labelyear combination for tracking extratitleyear =cut sub get_seen_titleyear { shift; # class method so don't care about class name my $ty = shift; return $CONFIG->{state}{seen_titleyear}{$ty}; } =head2 incr_seen_titleyear Increment the count of an labeltitle/labelyear combination for extratitleyear We pass in the title and year strings seperately as we have to be careful and only increment this counter beyond 1 if there is a title component. Otherwise, extratitleyear gets defined for all entries with no title. =cut sub incr_seen_titleyear { shift; # class method so don't care about class name my ($ts, $ys) = @_; my $tmp = "$ts,$ys"; # We can always increment this to 1 unless ($CONFIG->{state}{seen_titleyear}{$tmp}) { $CONFIG->{state}{seen_titleyear}{$tmp}++; } # But beyond that only if we have a labeltitle in the entry since # this counter is used to create extratitleyear which doesn't mean anything for # entries with no title else { if ($ts) { $CONFIG->{state}{seen_titleyear}{$tmp}++; } } return; } =head1 uniquelistcount =head2 get_uniquelistcount Get the number of uniquelist entries for a (possibly partial) list =cut sub get_uniquelistcount { shift; # class method so don't care about class name my $namelist = shift; return $CONFIG->{state}{uniquelistcount}{global}{join("\x{10FFFD}", @$namelist)}; } =head2 add_uniquelistcount Incremenent the count for a list part to the data for a name =cut sub add_uniquelistcount { shift; # class method so don't care about class name my $namelist = shift; $CONFIG->{state}{uniquelistcount}{global}{join("\x{10FFFD}", @$namelist)}++; return; } =head2 add_uniquelistcount_final Incremenent the count for a complete list to the data for a name =cut sub add_uniquelistcount_final { shift; # class method so don't care about class name my $namelist = shift; $CONFIG->{state}{uniquelistcount}{global}{final}{join("\x{10FFFD}", @$namelist)}++; return; } =head2 add_uniquelistcount_minyear Incremenent the count for a list and year to the data for a name Used to track uniquelist = minyear =cut sub add_uniquelistcount_minyear { shift; # class method so don't care about class name my ($minyearnamelist, $year, $namelist) = @_; # Allow year a default in case labelname is undef $CONFIG->{state}{uniquelistcount}{minyear}{join("\x{10FFFD}", @$minyearnamelist)}{$year // '0'}{join("\x{10FFFD}", @$namelist)}++; return; } =head2 get_uniquelistcount_minyear Get the count for a list and year to the data for a name Used to track uniquelist = minyear =cut sub get_uniquelistcount_minyear { shift; # class method so don't care about class name my ($minyearnamelist, $year) = @_; return scalar keys %{$CONFIG->{state}{uniquelistcount}{minyear}{join("\x{10FFFD}", @$minyearnamelist)}{$year}}; } =head2 get_uniquelistcount_final Get the number of uniquelist entries for a full list =cut sub get_uniquelistcount_final { shift; # class method so don't care about class name my $namelist = shift; my $c = $CONFIG->{state}{uniquelistcount}{global}{final}{join("\x{10FFFD}", @$namelist)}; return $c // 0; } =head2 reset_uniquelistcount Reset the count for list parts and complete lists =cut sub reset_uniquelistcount { shift; # class method so don't care about class name $CONFIG->{state}{uniquelistcount} = {}; return; } =head2 list_differs_nth Returns true if some other list differs at passed nth place and is at least as long list_differs_nth([a, b, c, d, e], 3) = 1 if there is another list like any of these: [a, b, d, e, f] [a, b, e, z, z, y] =cut sub list_differs_nth { shift; # class method so don't care about class name my ($list, $n) = @_; my @list_one = @$list; # Loop over all final lists, looking for ones which match: # * up to n - 1 # * differ at $n # * are at least as long foreach my $l_s (keys %{$CONFIG->{state}{uniquelistcount}{global}{final}}) { my @l = split("\x{10FFFD}", $l_s); # If list is shorter than the list we are checking, it's irrelevant next unless $#l >= $#$list; # If list matches at $n, it's irrelevant; next if ($list_one[$n-1] eq $l[$n-1]); # If list doesn't match up to $n - 1, it's irrelevant next unless Compare([@list_one[0 .. $n-2]], [@l[0 .. $n-2]]); $logger->trace("list_differs_nth() returning true: " . join(',', @list_one) . " vs " . join(',', @l)); return 1; } return 0; } =head2 list_differs_last Returns true if some list differs from passed list in its last place list_differs_last([a, b, c]) = 1 if there is another list like any of these: [a, b, d] [a, b, d, e] =cut sub list_differs_last { shift; # class method so don't care about class name my $list = shift; my @list_one = @$list; my $list_last = pop @list_one; # Loop over all final lists, looking for ones which match up to # length of list to check minus 1 but which differ in the last place of the # list to check. foreach my $l_s (keys %{$CONFIG->{state}{uniquelistcount}{global}{final}}) { my @l = split("\x{10FFFD}", $l_s); # If list is shorter than the list we are checking, it's irrelevant next unless $#l >= $#$list; # get the list elements up to length of the list we are checking my @ln = @l[0 .. $#$list]; # pop off the last element which is the potential point of difference my $ln_last = pop @ln; if (Compare(\@list_one, \@ln) and ($list_last ne $ln_last)) { $logger->trace("list_differs_last() returning true: (" . join(',', @list_one) . " vs " . join(',', @ln) . " -> $list_last vs $ln_last)"); return 1; } } return 0; } =head2 list_differs_superset Returns true if some list differs from passed list by being identical to the list up to the end of the list but also by having extra elements after this list_differs_superset([a, b, c]) = 1 if there is another list like any of these: [a, b, c, d] [a, b, c, d, e] =cut sub list_differs_superset { shift; # class method so don't care about class name my $list = shift; # Loop over all final lists, looking for ones which match up to # length of list to check but which differ after this length foreach my $l_s (keys %{$CONFIG->{state}{uniquelistcount}{global}{final}}) { my @l = split("\x{10FFFD}", $l_s); # If list is not longer than the list we are checking, it's irrelevant next unless $#l > $#$list; # get the list elements up to length of the list we are checking my @ln = @l[0 .. $#$list]; if (Compare($list, \@ln)) { $logger->trace("list_differs_superset() returning true: (" . join(',', @$list) . " vs " . join(',', @l) . ")"); return 1; } } return 0; } =head1 uniquenamecount =head2 get_numofuniquenames Get the number of uniquenames entries for a visible name =cut sub get_numofuniquenames { shift; # class method so don't care about class name my ($name, $namecontext) = @_; my $return = scalar keys %{$CONFIG->{state}{uniquenamecount}{$name}{$namecontext}}; $logger->trace("get_numofuniquenames() returning $return for NAME='$name' and NAMECONTEXT='$namecontext'"); return $return; } =head2 get_numofuniquenames_all Get the number of uniquenames entries for a name =cut sub get_numofuniquenames_all { shift; # class method so don't care about class name my ($name, $namecontext) = @_; my $return = scalar keys %{$CONFIG->{state}{uniquenamecount_all}{$name}{$namecontext}}; $logger->trace("get_numofuniquenames_all() returning $return for NAME='$name' and NAMECONTEXT='$namecontext'"); return $return; } =head2 add_uniquenamecount Add a name to the list of name contexts which have the name in it (only called for visible names) =cut sub add_uniquenamecount { shift; # class method so don't care about class name my ($name, $namecontext, $key) = @_; $CONFIG->{state}{uniquenamecount}{$name}{$namecontext}{$key}++; return; } =head2 add_uniquenamecount_all Add a name to the list of name contexts which have the name in it (called for all names) =cut sub add_uniquenamecount_all { shift; # class method so don't care about class name my ($name, $namecontext, $key) = @_; $CONFIG->{state}{uniquenamecount_all}{$name}{$namecontext}{$key}++; return; } =head2 reset_uniquenamecount Reset the list of names which have the name part in it =cut sub reset_uniquenamecount { shift; # class method so don't care about class name $CONFIG->{state}{uniquenamecount} = {}; $CONFIG->{state}{uniquenamecount_all} = {}; return; } =head2 _get_uniquename Get the list of name contexts which contain a name Mainly for use in tests =cut sub _get_uniquename { shift; # class method so don't care about class name my ($name, $namecontext) = @_; my @list = sort keys %{$CONFIG->{state}{uniquenamecount}{$name}{$namecontext}}; return \@list; } =head1 crossrefkeys =head2 get_crossrefkeys Return ref to array of keys which are crossref targets =cut sub get_crossrefkeys { shift; # class method so don't care about class name return [ keys %{$CONFIG->{state}{crossrefkeys}} ]; } =head2 get_crossrefkey Return an integer representing the number of times a crossref target key has been ref'ed =cut sub get_crossrefkey { shift; # class method so don't care about class name my $k = shift; return $CONFIG->{state}{crossrefkeys}{$k}; } =head2 del_crossrefkey Remove a crossref target key from the crossrefkeys state =cut sub del_crossrefkey { shift; # class method so don't care about class name my $k = shift; if (exists($CONFIG->{state}{crossrefkeys}{$k})) { delete $CONFIG->{state}{crossrefkeys}{$k}; } return; } =head2 incr_crossrefkey Increment the crossreferences count for a target crossref key =cut sub incr_crossrefkey { shift; # class method so don't care about class name my $k = shift; $CONFIG->{state}{crossrefkeys}{$k}++; return; } =head2 dump Dump config information (for debugging) =cut sub dump { shift; # class method so don't care about class name dd($CONFIG); } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Constants.pm000444000765000024 5715312667073765 20636 0ustar00philkimestaff000000000000package Biber::Constants; use v5.16; use strict; use warnings; use Encode::Alias; use parent qw(Exporter); our @EXPORT = qw{ $CONFIG_DEFAULT_BIBER %CONFIG_DEFAULT_BIBLATEX %CONFIG_OPTSCOPE_BIBLATEX %CONFIG_SCOPEOPT_BIBLATEX %CONFIG_OPTTYPE_BIBLATEX %CONFIG_BIBLATEX_ENTRY_OPTIONS %NOSORT_TYPES %DM_DATATYPES %LOCALE_MAP %LOCALE_MAP_R %REMOTE_MAP %DS_EXTENSIONS $BIBER_CONF_NAME $BCF_VERSION $BBL_VERSION $BIBER_SORT_FINAL $BIBER_SORT_NULL $LABEL_FINAL }; # Version of biblatex control file which this release expects. Matched against version # passed in control file. Used when checking the .bcf our $BCF_VERSION = '3.0'; # Format version of the .bbl. Used when writing the .bbl our $BBL_VERSION = '2.6'; # Global flags needed for sorting our $BIBER_SORT_FINAL = 0; our $BIBER_SORT_NULL = 0; # the name of the Biber configuration file, which should be # either returned by kpsewhich or located at "$HOME/.$BIBER_CONF_NAME" our $BIBER_CONF_NAME = 'biber.conf'; ## Biber CONFIGURATION DEFAULTS # Locale - if nothing, set a default my $locale; unless ($locale) { if ( $^O =~ /Win/) { $locale = 'English_United States.1252'; } else { $locale = 'en_US.UTF-8'; } } # nosort type category shortcuts our %NOSORT_TYPES = ( type_name => { author => 1, afterword => 1, annotator => 1, bookauthor => 1, commentator => 1, editor => 1, editora => 1, editorb => 1, editorc => 1, foreword => 1, holder => 1, introduction => 1, namea => 1, nameb => 1, namec => 1, shortauthor => 1, shorteditor => 1, translator => 1 }, type_title => { booktitle => 1, eventtitle => 1, issuetitle => 1, journaltitle => 1, maintitle => 1, origtitle => 1, title => 1 } ); # datatypes for data model validation our %DM_DATATYPES = ( integer => qr/\A\d+\z/xms, datepart => qr/\A\d+\z/xms ); # Mapping of data source types to extensions our %DS_EXTENSIONS = ( bibtex => 'bib', biblatexml => 'bltxml', ris => 'ris' ); # Biber option defaults. Mostly not needed outside of tool mode since they are passed by .bcf our $CONFIG_DEFAULT_BIBER = { clrmacros => { content => 0 }, collate => { content => 1 }, collate_options => { option => {level => 4, variable => 'non-ignorable', normalization => 'prenormalized' }}, graph => { content => 0 }, debug => { content => 0 }, dieondatamodel => { content => 0 }, decodecharsset => { content => 'base' }, dot_include => { option => {section => 1, xdata => 1, crossref => 1, xref => 1 }}, fastsort => { content => 0 }, fixinits => { content => 0 }, input_encoding => { content => 'UTF-8' }, input_format => { content => 'bibtex' }, isbn10 => { content => 0 }, isbn13 => { content => 0 }, isbn_normalise => { content => 0 }, listsep => { content => 'and' }, mincrossrefs => { content => 2 }, namesep => { content => 'and' }, no_bltxml_schema => { content => 0 }, nodieonerror => { content => 0 }, noinit => { option => [ {value => q/\b\p{Ll}{2}\p{Pd}/}, {value => q/[\x{2bf}\x{2018}]/} ] }, nolabel => { option => [ {value => q/[\p{P}\p{S}\p{C}]+/} ] }, nolabelwidthcount => { option => [ {value => q//} ] }, nolog => { content => 0 }, nostdmacros => { content => 0 }, nosort => { option => [ { name => 'type_name', value => q/\A\p{L}{2}\p{Pd}/ }, { name => 'type_name', value => q/[\x{2bf}\x{2018}]/ } ] }, onlylog => { content => 0 }, others_string => { content => 'others' }, output_align => { content => 0 }, output_encoding => { content => 'UTF-8' }, output_format => { content => 'bbl' }, output_indent => { content => '2' }, output_fieldcase => { content => 'upper' }, output_resolve => { content => 0 }, output_safechars => { content => 0 }, output_safecharsset => { content => 'base' }, quiet => { content => 0 }, noskipduplicates => { content => 0 }, sortcase => { content => 1 }, sortgiveninits => { content => 0 }, sortupper => { content => 1 }, strip_comments => { content => 0 }, tool => { content => 0 }, trace => { content => 0 }, validate_config => { content => 0 }, validate_control => { content => 0 }, validate_bltxml => { content => 0 }, validate_datamodel => { content => 0 }, wraplines => { content => 0 }, xsvsep => { content => q/\s*,\s*/ }, }; # default global options for biblatex # Used to set: # * Some tool-mode defaults (as there is no .bcf and some biblatex options # cannot be set in a biber config file) our %CONFIG_DEFAULT_BIBLATEX = ( sortscheme => 'none', useauthor => 1, useeditor => 1, usetranslator => 1, maxbibnames => 100, maxitems => 100, minbibnames => 100, maxalphanames => 100, maxcitenames => 100, minalphanames => 100, mincitenames => 100, minitems => 100, useprefix => 0 ); # Set up some encoding aliases to map \inputen{c,x} encoding names to Encode # It seems that inputen{c,x} has a different idea of nextstep than Encode # so we push it to MacRoman define_alias('ansinew' => 'cp1252'); # inputenc alias for cp1252 define_alias('applemac' => 'MacRoman'); define_alias('applemacce' => 'MacCentralEurRoman'); define_alias('next' => 'MacRoman'); define_alias('x-mac-roman' => 'MacRoman'); define_alias('x-mac-centeuro' => 'MacCentralEurRoman'); define_alias('x-mac-cyrillic' => 'MacCyrillic'); define_alias('x-nextstep' => 'MacRoman'); define_alias('x-ascii' => 'ascii'); # Encode doesn't resolve this one by default define_alias('lutf8' => 'UTF-8'); # Luatex define_alias('utf8x' => 'UTF-8'); # UCS (old) # maps between bcp47 lang/locales and babel/polyglossia language names our %LOCALE_MAP = ( 'acadian' => 'fr-CA', 'american' => 'en-US', 'australian' => 'en-AU', 'afrikaans' => 'af-ZA', 'albanian' => 'sq-AL', 'amharic' => 'am-ET', 'arabic' => 'ar-001', 'armenian' => 'hy-AM', 'asturian' => 'ast-ES', 'austrian' => 'de-AT', 'bahasa' => 'id-ID', 'bahasai' => 'id-ID', 'bahasam' => 'id-ID', 'basque' => 'eu-ES', 'bengali' => 'bn-BD', 'bgreek' => 'el-GR', 'brazil' => 'pt-BR', 'brazilian' => 'pt-BR', 'breton' => 'br-FR', 'british' => 'en-GB', 'bulgarian' => 'bg-BG', 'canadian' => 'en-CA', 'canadien' => 'fr-CA', 'catalan' => 'ca-AD', 'coptic' => 'cop', 'croatian' => 'hr-HR', 'czech' => 'cs-CZ', 'danish' => 'da-DK', 'divehi' => 'dv-MV', 'dutch' => 'nl-NL', 'english' => 'en-US', 'esperanto' => 'eo-001', 'estonian' => 'et-EE', 'ethiopia' => 'am-ET', 'farsi' => 'fa-IR', 'finnish' => 'fi-FI', 'francais' => 'fr-FR', 'french' => 'fr-FR', 'frenchle' => 'fr-FR', 'friulan' => 'fur-IT', 'galician' => 'gl-ES', 'german' => 'de-DE', 'germanb' => 'de-DE', 'greek' => 'el-GR', 'hebrew' => 'he-IL', 'hindi' => 'hi-IN', 'ibygreek' => 'el-CY', 'icelandic' => 'is-IS', 'indon' => 'id-ID', 'indonesia' => 'id-ID', 'interlingua' => 'ia-FR', 'irish' => 'ga-IE', 'italian' => 'it-IT', 'japanese' => 'ja-JP', 'kannada' => 'kn-IN', 'lao' => 'lo-LA', 'latin' => 'sr-Latn', 'latvian' => 'lv-LV', 'lithuanian' => 'lt-LT', 'lowersorbian' => 'dsb-DE', 'lsorbian' => 'dsb-DE', 'magyar' => 'hu-HU', 'malay' => 'id-ID', 'malayalam' => 'ml-IN', 'marathi' => 'mr-IN', 'meyalu' => 'id-ID', 'mongolian' => 'mn-Cyrl', 'naustrian' => 'de-AT', 'newzealand' => 'en-NZ', 'ngerman' => 'de-DE', 'nko' => 'ha-NG', 'norsk' => 'nb-NO', 'norwegian' => 'nn-NO', 'nynorsk' => 'nn-NO', 'occitan' => 'oc-FR', 'piedmontese' => 'pms-IT', 'pinyin' => 'pny', 'polish' => 'pl-PL', 'polutonikogreek' => 'el-GR', 'portuges' => 'pt-PT', 'portuguese' => 'pt-PT', 'romanian' => 'ro-RO', 'romansh' => 'rm-CH', 'russian' => 'ru-RU', 'samin' => 'se-NO', 'sanskrit' => 'sa-IN', 'scottish' => 'gd-GB', 'serbian' => 'sr-Cyrl', 'serbianc' => 'sr-Cyrl', 'slovak' => 'sk-SK', 'slovene' => 'sl-SI', 'slovenian' => 'sl-SI', 'spanish' => 'es-ES', 'swedish' => 'sv-SE', 'swiss' => 'de-CH', 'swissgerman' => 'de-CH', 'nswissgerman' => 'de-CH', 'syriac' => 'syc', 'tamil' => 'ta-IN', 'telugu' => 'te-IN', 'thai' => 'th-TH', 'thaicjk' => 'th-TH', 'tibetan' => 'bo-CN', 'turkish' => 'tr-TR', 'turkmen' => 'tk-TM', 'ukrainian' => 'uk-UA', 'urdu' => 'ur-IN', 'UKenglish' => 'en-UK', 'uppersorbian' => 'hsb-DE', 'USenglish' => 'en-US', 'usorbian' => 'hsb-DE', 'vietnamese' => 'vi-VN', 'welsh' => 'cy-GB', ); our %LOCALE_MAP_R = ( 'af' => 'afrikaans', 'af-ZA' => 'afrikaans', 'am' => 'ethiopia', 'am-ET' => 'amharic', 'ar' => 'arabic', 'ar-001' => 'arabic', 'ast' => 'asturian', 'ast-ES' => 'asturian', 'bg' => 'bulgarian', 'bg-BG' => 'bulgarian', 'bn' => 'bengali', 'bn-BD' => 'bengali', 'bo' => 'tibetan', 'bo-CN' => 'tibetan', 'br' => 'breton', 'br-FR' => 'breton', 'ca' => 'catalan', 'ca-AD' => 'catalan', 'ca-ES' => 'catalan', 'cop' => 'coptic', 'cs' => 'czech', 'cs-CZ' => 'czech', 'cy' => 'welsh', 'cy-GB' => 'welsh', 'da' => 'danish', 'da-DK' => 'danish', 'de-1996' => 'ngerman', 'de-AT' => 'austrian', 'de-AT-1996' => 'naustrian', 'de-CH' => 'swissgerman', 'de-CH-1996' => 'nswissgerman', 'de-DE' => 'german', 'de-DE-1996' => 'ngerman', 'dsb' => 'lowersorbian', 'dsb-DE' => 'lowersorbian', 'dv' => 'divehi', 'dv-MV' => 'divehi', 'el' => 'greek', 'el-CY' => 'ibygreek', 'el-GR' => 'greek', 'en' => 'english', 'en-AU' => 'australian', 'en-CA' => 'canadian', 'en-UK' => 'UKenglish', 'en-GB' => 'british', 'en-NZ' => 'newzealand', 'en-US' => 'USenglish', 'en-US' => 'american', 'en-US' => 'english', 'eo' => 'esperanto', 'eo-001' => 'esperanto', 'es' => 'spanish', 'es-ES' => 'spanish', 'et' => 'estonian', 'et-EE' => 'estonian', 'eu' => 'basque', 'eu-ES' => 'basque', 'fa' => 'farsi', 'fa-IR' => 'farsi', 'fi' => 'finnish', 'fi-FI' => 'finnish', 'fr' => 'french', 'fr-CA' => 'acadian', 'fr-CA' => 'canadien', 'fr-FR' => 'french', 'fur' => 'friulan', 'fur-IT' => 'friulan', 'ga' => 'irish', 'ga-IE' => 'irish', 'gd' => 'scottish', 'gd-GB' => 'scottish', 'gl' => 'galician', 'gl-ES' => 'galician', 'ha' => 'nko', 'ha-NG' => 'nko', 'he' => 'hebrew', 'he-IL' => 'hebrew', 'hi' => 'hindi', 'hi-IN' => 'hindi', 'hr' => 'croatian', 'hr-HR' => 'croatian', 'hsb' => 'uppersorbian', 'hsb-DE' => 'uppersorbian', 'hu' => 'magyar', 'hu-HU' => 'magyar', 'hy' => 'armenian', 'hy-AM' => 'armenian', 'ia' => 'interlingua', 'ia-FR' => 'interlingua', 'id' => 'indonesia', 'is' => 'icelandic', 'is-IS' => 'icelandic', 'it' => 'italian', 'it-IT' => 'italian', 'ja' => 'japanese', 'ja-JP' => 'japanese', 'kn' => 'kannada', 'kn-IN' => 'kannada', 'lo' => 'lao', 'lo-LA' => 'lao', 'lt' => 'lithuanian', 'lt-LT' => 'lithuanian', 'lv' => 'latvian', 'lv-LV' => 'latvian', 'ml' => 'malayalam', 'ml-IN' => 'malayalam', 'mn' => 'mongolian', 'mn-Cyrl' => 'mongolian', 'mr' => 'marathi', 'mr-IN' => 'marathi', 'nb' => 'norsk', 'nb-NO' => 'norsk', 'nl' => 'dutch', 'nl-NL' => 'dutch', 'nn' => 'nynorsk', 'nn-NO' => 'nynorsk', 'oc' => 'occitan', 'oc-FR' => 'occitan', 'pl' => 'polish', 'pl-PL' => 'polish', 'pms' => 'piedmontese', 'pms-IT' => 'piedmontese', 'pny' => 'pinyin', 'pt' => 'portuguese', 'pt-BR' => 'brazilian', 'pt-PT' => 'portuguese', 'rm' => 'romansh', 'rm-CH' => 'romansh', 'ro' => 'romanian', 'ro-RO' => 'romanian', 'ru' => 'russian', 'ru-RU' => 'russian', 'sa' => 'sanskrit', 'sa-IN' => 'sanskrit', 'se' => 'samin', 'se-NO' => 'samin', 'sk' => 'slovak', 'sk-SK' => 'slovak', 'sl' => 'slovenian', 'sl-SI' => 'slovenian', 'sq' => 'albanian', 'sq-AL' => 'albanian', 'sr' => 'serbian', 'sr-Cyrl' => 'serbian', 'sr-Latn' => 'latin', 'sv' => 'swedish', 'sv-SE' => 'swedish', 'syc' => 'syriac', 'ta' => 'tamil', 'ta-IN' => 'tamil', 'te' => 'telugu', 'te-IN' => 'telugu', 'th' => 'thai', 'th-TH' => 'thai', 'tk' => 'turkmen', 'tk-TM' => 'turkmen', 'tr' => 'turkish', 'tr-TR' => 'turkish', 'uk' => 'ukrainian', 'uk-UA' => 'ukrainian', 'ur' => 'urdu', 'ur-IN' => 'urdu', 'vi' => 'vietnamese', 'vi-VN' => 'vietnamese', ); # Holds the scope of each of the BibLaTeX configuration options from the .bcf our %CONFIG_OPTSCOPE_BIBLATEX; # Holds the options in a particular scope our %CONFIG_SCOPEOPT_BIBLATEX; # Holds the datatype of an option at a particular scope our %CONFIG_OPTTYPE_BIBLATEX; # For per-entry options, what should be set when we find them and # what should be output to the .bbl for biblatex. # Basically, here we have to emulate relevant parts of biblatex's options processing # for local entry-specific options, note therefore the presence here of some # options like max/mincitenames which are not passed in the .bcf our %CONFIG_BIBLATEX_ENTRY_OPTIONS = ( dataonly => {OUTPUT => 1, INPUT => {skiplab => 1, skipbiblist => 1, uniquename => 0, uniquelist => 0} }, maxitems => {OUTPUT => 1}, minitems => {OUTPUT => 1}, maxbibnames => {OUTPUT => 1}, minbibnames => {OUTPUT => 1}, maxcitenames => {OUTPUT => 1}, mincitenames => {OUTPUT => 1}, maxalphanames => {OUTPUT => 0}, minalphanames => {OUTPUT => 0}, maxnames => {OUTPUT => ['maxcitenames', 'maxbibnames'], INPUT => ['maxcitenames', 'maxbibnames']}, minnames => {OUTPUT => ['mincitenames', 'minbibnames'], INPUT => ['mincitenames', 'minbibnames']}, presort => {OUTPUT => 0}, skipbib => {OUTPUT => 1}, skipbiblist => {OUTPUT => 1}, skiplab => {OUTPUT => 1}, sortnamekeyscheme => {OUTPUT => 1}, uniquelist => {OUTPUT => 0}, useauthor => {OUTPUT => 1}, useeditor => {OUTPUT => 1}, useprefix => {OUTPUT => 1}, usetranslator => {OUTPUT => 1}, ); 1; __END__ =pod =encoding utf-8 =head1 NAME Biber::Constants - global constants for biber =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/DataModel.pm000444000765000024 11342412667073765 20526 0ustar00philkimestaff000000000000package Biber::DataModel; use v5.16; use strict; use warnings; no autovivification; use List::Util qw( first ); use Biber::Utils; use Biber::Constants; use Data::Dump qw( pp ); use Date::Simple; =encoding utf-8 =head1 NAME Biber::DataModel =cut my $logger = Log::Log4perl::get_logger('main'); =head2 new Initialize a Biber::DataModel object =cut sub new { my $class = shift; my $dm = shift; my $self; $self = bless {}, $class; # Pull out legal entrytypes, fields and constraints and make lookup hash # for quick tests later foreach my $f (@{$dm->{fields}{field}}) { # In case of conflicts, we need to remove the previous definitions since # later overrides earlier if (my $previous = $self->{fieldsbyname}{$f->{content}}) { if ($f->{format}) { @{$self->{fieldsbytype}{$previous->{fieldtype}}{$previous->{datatype}}{$previous->{format}}} = grep {$_ ne $f->{content}} @{$self->{fieldsbytype}{$previous->{fieldtype}}{$previous->{datatype}}{$previous->{format}}}; } @{$self->{fieldsbytype}{$previous->{fieldtype}}{$previous->{datatype}}{'*'}} = grep {$_ ne $f->{content}} @{$self->{fieldsbytype}{$previous->{fieldtype}}{$previous->{datatype}}{'*'}}; @{$self->{fieldsbyfieldtype}{$previous->{fieldtype}}} = grep {$_ ne $f->{content}} @{$self->{fieldsbyfieldtype}{$previous->{fieldtype}}}; @{$self->{fieldsbydatatype}{$previous->{datatype}}} = grep {$_ ne $f->{content}} @{$self->{fieldsbydatatype}{$previous->{datatype}}}; @{$self->{fieldsbyformat}{$previous->{'format'}}} = grep {$_ ne $f->{content}} @{$self->{fieldsbyformat}{$previous->{format}}}; delete $self->{fieldsbyname}{$f->{content}}; } $self->{fieldsbyname}{$f->{content}} = {'fieldtype' => $f->{fieldtype}, 'datatype' => $f->{datatype}, 'format' => $f->{format} || 'default'}; if ($f->{format}) { push @{$self->{fieldsbytype}{$f->{fieldtype}}{$f->{datatype}}{$f->{format}}}, $f->{content}; } push @{$self->{fieldsbytype}{$f->{fieldtype}}{$f->{datatype}}{'*'}}, $f->{content}; push @{$self->{fieldsbyfieldtype}{$f->{fieldtype}}}, $f->{content}; push @{$self->{fieldsbydatatype}{$f->{datatype}}}, $f->{content}; push @{$self->{fieldsbyformat}{$f->{format} || 'default'}}, $f->{content}; # check null_ok if ($f->{nullok}) { $self->{fieldsbyname}{$f->{content}}{nullok} = 1; } # check skips - fields we don't want to output to BBL if ($f->{skip_output}) { $self->{fieldsbyname}{$f->{content}}{skipout} = 1; } } my $constants; foreach my $constant (@{$dm->{constants}{constant}}) { $self->{constants}{$constant->{name}}{type} = $constant->{type}; $self->{constants}{$constant->{name}}{value} = $constant->{content}; } my $leg_ents; foreach my $et (@{$dm->{entrytypes}{entrytype}}) { my $es = $et->{content}; # Skip output flag for certain entrytypes if ($et->{skip_output}) { $leg_ents->{$es}{skipout} = 1; } # fields for entrytypes my $lfs; foreach my $ef (@{$dm->{entryfields}}) { # Found a section describing legal fields for entrytype if (not exists($ef->{entrytype}) or grep {$_->{content} eq $es} @{$ef->{entrytype}}) { foreach my $f (@{$ef->{field}}) { $lfs->{$f->{content}} = 1; } } } # constraints my $constraints; foreach my $cd (@{$dm->{constraints}}) { # Found a section describing constraints for entrytype if (not exists($cd->{entrytype}) or grep {$_->{content} eq $es} @{$cd->{entrytype}}) { foreach my $c (@{$cd->{constraint}}) { if ($c->{type} eq 'mandatory') { # field foreach my $f (@{$c->{field}}) { push @{$constraints->{mandatory}}, $f->{content}; } # xor set of fields # [ XOR, field1, field2, ... , fieldn ] foreach my $fxor (@{$c->{fieldxor}}) { my $xorset; foreach my $f (@{$fxor->{field}}) { push @$xorset, $f->{content}; } unshift @$xorset, 'XOR'; push @{$constraints->{mandatory}}, $xorset; } # or set of fields # [ OR, field1, field2, ... , fieldn ] foreach my $for (@{$c->{fieldor}}) { my $orset; foreach my $f (@{$for->{field}}) { push @$orset, $f->{content}; } unshift @$orset, 'OR'; push @{$constraints->{mandatory}}, $orset; } } # Conditional constraints # [ ANTECEDENT_QUANTIFIER # [ ANTECEDENT LIST ] # CONSEQUENT_QUANTIFIER # [ CONSEQUENT LIST ] # ] elsif ($c->{type} eq 'conditional') { my $cond; $cond->[0] = $c->{antecedent}{quant}; $cond->[1] = [ map { $_->{content} } @{$c->{antecedent}{field}} ]; $cond->[2] = $c->{consequent}{quant}; $cond->[3] = [ map { $_->{content} } @{$c->{consequent}{field}} ]; push @{$constraints->{conditional}}, $cond; } # data constraints elsif ($c->{type} eq 'data') { my $data; $data->{fields} = [ map { $_->{content} } @{$c->{field}} ]; $data->{datatype} = $c->{datatype}; $data->{rangemin} = $c->{rangemin}; $data->{rangemax} = $c->{rangemax}; $data->{pattern} = $c->{pattern}; push @{$constraints->{data}}, $data; } } } } $leg_ents->{$es}{legal_fields} = $lfs; $leg_ents->{$es}{constraints} = $constraints; } $self->{entrytypesbyname} = $leg_ents; # use Data::Dump;dd($self);exit 0; return $self; } =head2 constants Returns array ref of constant names =cut sub constants { my $self = shift; return [ keys %{$self->{constants}} ]; } =head2 get_constant_type Returns a constant type =cut sub get_constant_type { my ($self, $name) = @_; return $self->{constants}{$name}{type}; } =head2 get_constant_value Returns a constant value =cut sub get_constant_value { my ($self, $name) = @_; if ($self->{constants}{$name}{type} eq 'list') { return split(/\s*,\s*/, $self->{constants}{$name}{value}); } elsif ($self->{constants}{$name}{type} eq 'string') { return $self->{constants}{$name}{value}; } } =head2 fieldtypes Returns array ref of legal fieldtypes =cut sub fieldtypes { my $self = shift; return [ keys %{$self->{fieldsbyfieldtype}} ]; } =head2 datatypes Returns array ref of legal datatypes =cut sub datatypes { my $self = shift; return [ keys %{$self->{fieldsbydatatype}} ]; } =head2 is_field Returns boolean to say if a field is a legal field Allows intermediate temp custom fields which are used when a driver source field doesn't have an obvious 1:1 mapping to a datamodel field. Such intermediates are defined in the target field mapping of a sourcemap. Also allows for fields with script form and optional lang suffix =cut sub is_field { my $self = shift; my $field = shift; if ($field =~ m/^BIBERCUSTOM/o) { return 1; } else { return $self->{fieldsbyname}{$field} ? 1 : 0; } } =head2 entrytypes Returns array ref of legal entrytypes =cut sub entrytypes { my $self = shift; return [ keys %{$self->{entrytypesbyname}} ]; } =head2 is_entrytype Returns boolean to say if an entrytype is a legal entrytype =cut sub is_entrytype { my $self = shift; my $type = shift; return $self->{entrytypesbyname}{$type} ? 1 : 0; } =head2 is_field_for_entrytype Returns boolean to say if a field is legal for an entrytype =cut sub is_field_for_entrytype { my $self = shift; my ($type, $field) = @_; if ($self->{entrytypesbyname}{$type}{legal_fields}{$field}) { return 1; } else { return 0; } } =head2 entrytype_is_skipout Returns boolean depending on whether an entrytype is to be skipped on output =cut sub entrytype_is_skipout { my ($self, $type) = @_; return $self->{entrytypesbyname}{$type}{skipout} // 0; } =head2 get_fields_of_fieldtype Retrieve fields of a certain biblatex fieldtype from data model Return in sorted order so that bbl order doesn't change when changing .bcf. This really messes up tests otherwise. =cut sub get_fields_of_fieldtype { my ($self, $fieldtype) = @_; my $f = $self->{fieldsbyfieldtype}{$fieldtype}; return $f ? [ sort @$f ] : []; } =head2 get_fields_of_fieldformat Retrieve fields of a certain format from data model Return in sorted order so that bbl order doesn't change when changing .bcf. This really messes up tests otherwise. =cut sub get_fields_of_fieldformat { my ($self, $format) = @_; my $f = $self->{fieldsbyformat}{$format}; return $f ? [ sort @$f ] : []; } =head2 get_fields_of_datatype Retrieve fields of a certain biblatex datatype from data model Return in sorted order so that bbl order doesn't change when changing .bcf. This really messes up tests otherwise. =cut sub get_fields_of_datatype { my ($self, $datatype) = @_; my $f = $self->{fieldsbydatatype}{$datatype}; return $f ? [ sort @$f ] : []; } =head2 get_fields_of_type Retrieve fields of a certain biblatex type from data model Return in sorted order so that bbl order doesn't change when changing .bcf. This really messes up tests otherwise. =cut sub get_fields_of_type { my ($self, $fieldtype, $datatype, $format) = @_; my $f; if ($format) { $f = $self->{fieldsbytype}{$fieldtype}{$datatype}{$format}; } else { $f = $self->{fieldsbytype}{$fieldtype}{$datatype}{'*'}; } return $f ? [ sort @$f ] : []; } =head2 is_fields_of_type Returns boolean to say if the given fieldtype/datatype/format is a valid combination =cut sub is_fields_of_type { my ($self, $fieldtype, $datatype, $format) = @_; my $f; if ($format) { return exists($self->{fieldsbytype}{$fieldtype}{$datatype}{$format}) ? 1 : 0; } else { return exists($self->{fieldsbytype}{$fieldtype}{$datatype}) ? 1 : 0; } } =head2 get_fieldtype Returns the fieldtype of a field =cut sub get_fieldtype { my ($self, $field) = @_; return $self->{fieldsbyname}{$field}{fieldtype}; } =head2 get_datatype Returns the datatype of a field =cut sub get_datatype { my ($self, $field) = @_; return $self->{fieldsbyname}{$field}{datatype}; } =head2 get_fieldformat Returns the format of a field =cut sub get_fieldformat { my ($self, $field) = @_; return $self->{fieldsbyname}{$field}{format}; } =head2 get_dm_for_field Returns the fieldtype, datatype and format of a field =cut sub get_dm_for_field { my ($self, $field) = @_; return {'fieldtype' => $self->{fieldsbyname}{$field}{fieldtype}, 'datatype' => $self->{fieldsbyname}{$field}{datatype}, 'format' => $self->{fieldsbyname}{$field}{format}}; } =head2 field_is_fieldtype Returns boolean depending on whether a field is a certain biblatex fieldtype =cut sub field_is_fieldtype { my ($self, $fieldtype, $field) = @_; return $self->{fieldsbyname}{$field}{fieldtype} eq $fieldtype ? 1 : 0; } =head2 field_is_datatype Returns boolean depending on whether a field is a certain biblatex datatype =cut sub field_is_datatype { my ($self, $datatype, $field) = @_; return $self->{fieldsbyname}{$field}{datatype} eq $datatype ? 1 : 0; } =head2 field_is_nullok Returns boolean depending on whether a field is ok to be null =cut sub field_is_nullok { my ($self, $field) = @_; return $self->{fieldsbyname}{$field}{nullok} // 0; } =head2 field_is_skipout Returns boolean depending on whether a field is to be skipped on output =cut sub field_is_skipout { my ($self, $field) = @_; return $self->{fieldsbyname}{$field}{skipout} // 0; } =head2 check_mandatory_constraints Checks constraints of type "mandatory" on entry and returns an arry of warnings, if any =cut sub check_mandatory_constraints { my $self = shift; my $be = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my @warnings; my $et = $be->get_field('entrytype'); my $key = $be->get_field('citekey'); my $ds = $section->get_keytods($key); foreach my $c (@{$self->{entrytypesbyname}{$et}{constraints}{mandatory}}) { if (ref($c) eq 'ARRAY') { # Exactly one of a set is mandatory if ($c->[0] eq 'XOR') { my @fs = @$c[1,-1]; # Lose the first element which is the 'XOR' my $flag = 0; my $xorflag = 0; foreach my $of (@fs) { if ($be->field_exists($of) and # ignore date field if it has been split into parts not ($of eq 'date' and $be->get_field('datesplit'))) { if ($xorflag) { push @warnings, "Datamodel: Entry '$key' ($ds): Mandatory fields - only one of '" . join(', ', @fs) . "' must be defined - ignoring field '$of'"; $be->del_field($of); } $flag = 1; $xorflag = 1; } } unless ($flag) { push @warnings, "Datamodel: Entry '$key' ($ds): Missing mandatory field - one of '" . join(', ', @fs) . "' must be defined"; } } # One or more of a set is mandatory elsif ($c->[0] eq 'OR') { my @fs = @$c[1,-1]; # Lose the first element which is the 'OR' my $flag = 0; foreach my $of (@fs) { if ($be->field_exists($of)) { $flag = 1; last; } } unless ($flag) { push @warnings, "Datamodel: Entry '$key' ($ds): Missing mandatory field - one of '" . join(', ', @fs) . "' must be defined"; } } } # Simple mandatory field else { unless ($be->field_exists($c)) { push @warnings, "Datamodel: Entry '$key' ($ds): Missing mandatory field '$c'"; } } } return @warnings; } =head2 check_conditional_constraints Checks constraints of type "conditional" on entry and returns an arry of warnings, if any =cut sub check_conditional_constraints { my $self = shift; my $be = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my @warnings; my $et = $be->get_field('entrytype'); my $key = $be->get_field('citekey'); my $ds = $section->get_keytods($key); foreach my $c (@{$self->{entrytypesbyname}{$et}{constraints}{conditional}}) { my $aq = $c->[0]; # Antecedent quantifier my $afs = $c->[1]; # Antecedent fields my $cq = $c->[2]; # Consequent quantifier my $cfs = $c->[3]; # Consequent fields my @actual_afs = (grep {$be->field_exists($_)} @$afs); # antecedent fields in entry # check antecedent if ($aq eq 'all') { next unless $#$afs == $#actual_afs; # ALL -> ? not satisfied } elsif ($aq eq 'none') { next if @actual_afs; # NONE -> ? not satisfied } elsif ($aq eq 'one') { next unless @actual_afs; # ONE -> ? not satisfied } # check consequent my @actual_cfs = (grep {$be->field_exists($_)} @$cfs); if ($cq eq 'all') { unless ($#$cfs == $#actual_cfs) { # ? -> ALL not satisfied push @warnings, "Datamodel: Entry '$key' ($ds): Constraint violation - $cq of fields (" . join(', ', @$cfs) . ") must exist when $aq of fields (" . join(', ', @$afs). ") exist"; } } elsif ($cq eq 'none') { if (@actual_cfs) { # ? -> NONE not satisfied push @warnings, "Datamodel: Entry '$key' ($ds): Constraint violation - $cq of fields (" . join(', ', @actual_cfs) . ") must exist when $aq of fields (" . join(', ', @$afs). ") exist. Ignoring them."; # delete the offending fields foreach my $f (@actual_cfs) { $be->del_field($f); } } } elsif ($cq eq 'one') { unless (@actual_cfs) { # ? -> ONE not satisfied push @warnings, "Datamodel: Entry '$key' ($ds): Constraint violation - $cq of fields (" . join(', ', @$cfs) . ") must exist when $aq of fields (" . join(', ', @$afs). ") exist"; } } } return @warnings; } =head2 check_data_constraints Checks constraints of type "data" on entry and returns an array of warnings, if any =cut sub check_data_constraints { my $self = shift; my $be = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my @warnings; my $et = $be->get_field('entrytype'); my $key = $be->get_field('citekey'); my $ds = $section->get_keytods($key); foreach my $c (@{$self->{entrytypesbyname}{$et}{constraints}{data}}) { # This is the datatype of the constraint, not the field! if ($c->{datatype} eq 'isbn') { foreach my $f (@{$c->{fields}}) { if (my $fv = $be->get_field($f)) { require Business::ISBN; my ($vol, $dir, undef) = File::Spec->splitpath( $INC{"Business/ISBN.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' # Just in case it is already set. We also need to fake this in tests or it will # look for it in the blib dir unless (exists($ENV{ISBN_RANGE_MESSAGE})) { $ENV{ISBN_RANGE_MESSAGE} = File::Spec->catpath($vol, "$dir/ISBN/", 'RangeMessage.xml'); } # Treat as a list field just in case someone has made it so in a custom datamodel unless ($self->get_fieldtype($f) eq 'list') { $fv = [$fv]; } foreach (@$fv) { my $isbn = Business::ISBN->new($_); if (not $isbn) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid ISBN in value of field '$f'"; } # Business::ISBN has an error() method so we might get more information elsif (not $isbn->is_valid) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid ISBN in value of field '$f' (" . $isbn->error. ')'; } } } } } elsif ($c->{datatype} eq 'issn') { foreach my $f (@{$c->{fields}}) { if (my $fv = $be->get_field($f)) { require Business::ISSN; # Treat as a list field just in case someone has made it so in a custom datamodel unless ($self->get_fieldtype($f) eq 'list') { $fv = [$fv]; } foreach (@$fv) { my $issn = Business::ISSN->new($_); unless ($issn and $issn->is_valid) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid ISSN in value of field '$f'"; } } } } } elsif ($c->{datatype} eq 'ismn') { foreach my $f (@{$c->{fields}}) { if (my $fv = $be->get_field($f)) { require Business::ISMN; # Treat as a list field just in case someone has made it so in a custom datamodel unless ($self->get_fieldtype($f) eq 'list') { $fv = [$fv]; } foreach (@$fv) { my $ismn = Business::ISMN->new($_); unless ($ismn and $ismn->is_valid) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid ISMN in value of field '$f'"; } } } } } elsif ($c->{datatype} eq 'integer' or $c->{datatype} eq 'datepart') { my $dt = $DM_DATATYPES{$c->{datatype}}; foreach my $f (@{$c->{fields}}) { if (my $fv = $be->get_field($f)) { unless ( $fv =~ /$dt/ ) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid format (" . $c->{datatype}. ") of field '$f' - ignoring field"; $be->del_field($f); next; } if (my $fmin = $c->{rangemin}) { unless ($fv >= $fmin) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid value of field '$f' must be '>=$fmin' - ignoring field"; $be->del_field($f); next; } } if (my $fmax = $c->{rangemax}) { unless ($fv <= $fmax) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid value of field '$f' must be '<=$fmax' - ignoring field"; $be->del_field($f); next; } } } } } elsif ($c->{datatype} eq 'date') { # Perform content validation checks on date components by trying to # instantiate a Date::Simple object. foreach my $f (@{$self->get_fields_of_type('field', 'date')}) { my $d = $f =~ s/date\z//xmsr; # Don't bother unless this type of date is defined (has a year) next unless $be->get_datafield($d . 'year'); # When checking date components not split from date fields, have ignore the value # of an explicit YEAR field as it is allowed to be an arbitrary string # so we just set it to any valid value for the test my $byc; my $byc_d; # Display value for errors so as not to confuse people if ($d eq '' and not $be->get_field('datesplit')) { $byc = '1900'; # Any valid value is fine $byc_d = 'YYYY'; } else { $byc = $be->get_datafield($d . 'year') } # Begin date if ($byc) { my $bm = $be->get_datafield($d . 'month') || 'MM'; my $bmc = $bm eq 'MM' ? '01' : $bm; my $bd = $be->get_datafield($d . 'day') || 'DD'; my $bdc = $bd eq 'DD' ? '01' : $bd; $logger->debug("Checking '${d}date' date value '$byc/$bmc/$bdc' for key '$key'"); unless (Date::Simple->new("$byc$bmc$bdc")) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid date value '" . ($byc_d || $byc) . "/$bm/$bd' - ignoring its components"; $be->del_datafield($d . 'year'); $be->del_datafield($d . 'month'); $be->del_datafield($d . 'day'); next; } } # End date # defined and some value - end*year can be empty but defined in which case, # we don't need to validate if (my $eyc = $be->get_datafield($d . 'endyear')) { my $em = $be->get_datafield($d . 'endmonth') || 'MM'; my $emc = $em eq 'MM' ? '01' : $em; my $ed = $be->get_datafield($d . 'endday') || 'DD'; my $edc = $ed eq 'DD' ? '01' : $ed; $logger->debug("Checking '${d}date' date value '$eyc/$emc/$edc' for key '$key'"); unless (Date::Simple->new("$eyc$emc$edc")) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid date value '$eyc/$em/$ed' - ignoring its components"; $be->del_datafield($d . 'endyear'); $be->del_datafield($d . 'endmonth'); $be->del_datafield($d . 'endday'); next; } } } } elsif ($c->{datatype} eq 'pattern') { my $patt; unless ($patt = $c->{pattern}) { push @warnings, "Datamodel: Pattern constraint has no pattern!"; } foreach my $f (@{$c->{fields}}) { if (my $fv = $be->get_field($f)) { unless (imatch($fv, $patt)) { push @warnings, "Datamodel: Entry '$key' ($ds): Invalid value (pattern match fails) for field '$f'"; } } } } } return @warnings; } =head2 dump Dump Biber::DataModel object =cut sub dump { my $self = shift; return pp($self); } =head2 generate_bltxml_schema Generate a RelaxNG XML schema from the datamodel for BibLaTeXML datasources =cut sub generate_bltxml_schema { my ($dm, $outfile) = @_; return if $dm->{bltxml_schema_gen_done}; my $rng = IO::File->new($outfile, '>:encoding(UTF-8)'); $rng->autoflush;# Needed for running tests to string refs $logger->info("Writing BibLaTeXML RNG schema '$outfile' for datamodel"); require XML::Writer; my $bltx_ns = 'http://biblatex-biber.sourceforge.net/biblatexml'; my $bltx = 'bltx'; my $default_ns = 'http://relaxng.org/ns/structure/1.0'; my $writer = new XML::Writer(NAMESPACES => 1, ENCODING => 'UTF-8', DATA_MODE => 1, DATA_INDENT => 2, OUTPUT => $rng, PREFIX_MAP => {$bltx_ns => $bltx, $default_ns => ''}); $writer->xmlDecl(); $writer->comment('Auto-generated from .bcf Datamodel'); $writer->forceNSDecl($default_ns); $writer->forceNSDecl($bltx_ns); $writer->startTag('grammar', 'datatypeLibrary' => 'http://www.w3.org/2001/XMLSchema-datatypes'); $writer->startTag('start'); $writer->startTag('element', 'name' => "$bltx:entries"); $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:entry"); $writer->emptyTag('attribute', 'name' => 'id'); $writer->startTag('attribute', 'name' => 'entrytype'); $writer->startTag('choice'); foreach my $entrytype (@{$dm->entrytypes}) { $writer->dataElement('value', $entrytype); } $writer->endTag();# choice $writer->endTag();# attribute $writer->startTag('interleave'); foreach my $ft (@{$dm->fieldtypes()}) { foreach my $dt (@{$dm->datatypes()}) { if ($dm->is_fields_of_type($ft, $dt)) { next if $dt eq 'datepart'; # not legal in input, only output $writer->comment("$dt ${ft}s"); $writer->emptyTag('ref', 'name' => "$dt$ft"); } } } $writer->endTag();# interleave $writer->endTag();# entry element $writer->endTag();# oneOrMore $writer->endTag();# entries element $writer->endTag();# start foreach my $ft (@{$dm->fieldtypes()}) { foreach my $dt (@{$dm->datatypes()}) { if ($dm->is_fields_of_type($ft, $dt)) { next if $dt eq 'datepart'; # not legal in input, only output $writer->comment("$dt ${ft}s definition"); $writer->startTag('define', 'name' => "$dt$ft"); # Name lists element definition # ============================= if ($ft eq 'list' and $dt eq 'name') { $writer->startTag('optional'); $writer->startTag('element', 'name' => "$bltx:names"); # useprefix attribute $writer->comment('useprefix option'); $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'useprefix'); $writer->emptyTag('data', 'type' => 'boolean'); $writer->endTag(); # attribute $writer->endTag(); # optional # sortnamekeyscheme attribute $writer->comment('sortnamekeyscheme option'); $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'sortnamekeyscheme'); $writer->emptyTag('data', 'type' => 'string'); $writer->endTag(); # attribute $writer->endTag(); # optional # type attribute $writer->comment('types of names elements'); $writer->startTag('attribute', 'name' => 'type'); $writer->startTag('choice'); foreach my $name (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->dataElement('value', $name); } $writer->endTag(); # choice $writer->endTag(); # attribute # morenames attribute $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'morenames'); $writer->emptyTag('data', 'type' => 'boolean'); $writer->endTag(); # attribute $writer->endTag(); # optional $writer->startTag('oneOrMore'); # Individual name element $writer->startTag('element', 'name' => "$bltx:name"); # useprefix attribute $writer->comment('useprefix option'); $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'useprefix'); $writer->emptyTag('data', 'type' => 'boolean'); $writer->endTag(); # attribute $writer->endTag(); # optional # sortnamekeyscheme attribute $writer->comment('sortnamekeyscheme option'); $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'sortnamekeyscheme'); $writer->emptyTag('data', 'type' => 'string'); $writer->endTag(); # attribute $writer->endTag(); # optional # gender attribute ref $writer->emptyTag('ref', 'name' => 'gender'); # namepart element $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:namepart"); $writer->startTag('attribute', 'name' => 'type'); $writer->startTag('choice'); foreach my $np ($dm->get_constant_value('nameparts')) {# list type so returns list $writer->dataElement('value', $np); } $writer->endTag(); # choice $writer->endTag(); # attribute $writer->startTag('optional'); $writer->emptyTag('attribute', 'name' => 'initial'); $writer->endTag(); # optional $writer->startTag('choice'); $writer->emptyTag('text');# text $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:namepart"); $writer->startTag('optional'); $writer->emptyTag('attribute', 'name' => 'initial'); $writer->endTag(); # optional $writer->emptyTag('text');# text $writer->endTag(); # (sub)namepart element $writer->endTag(); # oneOrMore $writer->endTag(); # choice $writer->endTag(); # namepart element $writer->endTag(); # oneOrMore $writer->endTag(); # name element $writer->endTag(); # oneOrMore $writer->endTag(); # names element $writer->endTag();# optional # ======================== } elsif ($ft eq 'list') { # lists element definition # ======================== $writer->startTag('interleave'); foreach my $list (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->startTag('optional'); $writer->startTag('element', 'name' => "$bltx:$list"); $writer->startTag('choice'); $writer->emptyTag('text');# text $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:item"); $writer->emptyTag('text');# text $writer->endTag(); # item element $writer->endTag(); # oneOrMore element $writer->endTag(); # choice $writer->endTag(); # $list element $writer->endTag(); # optional } $writer->endTag();# interleave # ======================== } elsif ($ft eq 'field' and $dt eq 'uri') { # uri field element definition # ============================ $writer->startTag('interleave'); foreach my $field (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->startTag('optional'); $writer->startTag('element', 'name' => "$bltx:$field"); $writer->emptyTag('data', 'type' => 'anyURI'); $writer->endTag(); # $field element $writer->endTag();# optional } $writer->endTag();# interleave # ============================ } elsif ($ft eq 'field' and $dt eq 'range') { # range field element definition # ============================== $writer->startTag('interleave'); foreach my $field (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->startTag('optional'); $writer->startTag('element', 'name' => "$bltx:$field"); $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:item"); $writer->startTag('element', 'name' => "$bltx:start"); $writer->emptyTag('text'); $writer->endTag(); # start element $writer->startTag('element', 'name' => "$bltx:end"); $writer->startTag('choice'); $writer->emptyTag('text'); $writer->emptyTag('empty'); $writer->endTag(); # choice $writer->endTag(); # end element $writer->endTag(); # item element $writer->endTag(); # oneOrMore element $writer->endTag(); # $field element $writer->endTag();# optional } $writer->endTag();# interleave # ============================== } elsif ($ft eq 'field' and $dt eq 'entrykey') { # entrykey field element definition # ================================= $writer->startTag('interleave'); foreach my $field (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->startTag('optional'); # related field is special if ($field eq 'related') { $writer->startTag('element', 'name' => "$bltx:$field"); $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:item"); $writer->emptyTag('attribute', 'name' => 'type'); $writer->emptyTag('attribute', 'name' => 'ids'); $writer->startTag('optional'); $writer->emptyTag('attribute', 'name' => 'options'); $writer->endTag(); # optional $writer->startTag('optional'); $writer->emptyTag('attribute', 'name' => 'string'); $writer->endTag(); # optional $writer->endTag(); # item element $writer->endTag(); # oneOrMore $writer->endTag(); # $field element } else { $writer->startTag('element', 'name' => "$bltx:$field"); $writer->startTag('choice'); $writer->startTag('list'); $writer->startTag('oneOrMore'); $writer->emptyTag('data', 'type' => 'string'); $writer->endTag(); # oneOrMore $writer->endTag(); # list $writer->startTag('oneOrMore'); $writer->startTag('element', 'name' => "$bltx:key"); $writer->emptyTag('text');# text $writer->endTag(); # key element $writer->endTag(); # oneOrMore $writer->endTag(); # choice $writer->endTag(); # $field element } $writer->endTag(); # optional } $writer->endTag();# interleave } elsif ($ft eq 'field' and $dt eq 'date') { # date field element definition # ============================= my @types = map { s/date$//r } @{$dm->get_fields_of_type($ft, $dt)}; $writer->startTag('zeroOrMore'); $writer->startTag('element', 'name' => "$bltx:date"); $writer->startTag('optional'); $writer->startTag('attribute', 'name' => 'type'); $writer->startTag('choice'); foreach my $datetype(@types) { next unless $datetype; $writer->dataElement('value', $datetype); } $writer->endTag(); # choice $writer->endTag(); # attribute $writer->endTag(); # optional $writer->startTag('choice'); $writer->emptyTag('data', 'type' => 'date'); $writer->emptyTag('data', 'type' => 'gYear'); $writer->startTag('group'); $writer->startTag('element', 'name' => "$bltx:start"); $writer->emptyTag('data', 'type' => 'date'); $writer->endTag(); # start element $writer->startTag('element', 'name' => "$bltx:end"); $writer->startTag('choice'); $writer->emptyTag('data', 'type' => 'date'); $writer->emptyTag('empty'); $writer->endTag(); # choice $writer->endTag(); # end element $writer->endTag(); # group $writer->endTag(); # choice $writer->endTag(); # $field element $writer->endTag(); # zeroOrMore # ============================= } elsif ($ft eq 'field') { # field element definition # ======================== $writer->startTag('interleave'); foreach my $field (@{$dm->get_fields_of_type($ft, $dt)}) { $writer->startTag('optional'); $writer->startTag('element', 'name' => "$bltx:$field"); $writer->emptyTag('text');# text $writer->endTag(); # $field element $writer->endTag();# optional } $writer->endTag();# interleave # ======================== } $writer->endTag(); # define } } } # gender attribute definition # =========================== $writer->comment('gender attribute definition'); $writer->startTag('define', 'name' => 'gender'); $writer->startTag('zeroOrMore'); $writer->startTag('attribute', 'name' => 'gender'); $writer->startTag('choice'); foreach my $gender ($dm->get_constant_value('gender')) {# list type so returns list $writer->dataElement('value', $gender); } $writer->endTag();# choice $writer->endTag();# attribute $writer->endTag();# zeroOrMore $writer->endTag();# define # =========================== $writer->endTag();# grammar $writer->end(); $rng->close(); # So we only do this one for potentially multiple .bltxml datasources $dm->{bltxml_schema_gen_done} = 1; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Entries.pm000444000765000024 415012667073765 20240 0ustar00philkimestaff000000000000package Biber::Entries; use v5.16; use strict; use warnings; =encoding utf-8 =head1 NAME Biber::Entries =head2 new Initialize a Biber::Entries object =cut sub new { my ($class) = @_; my $self = bless {}, $class; return $self; } =head2 notnull Test for an empty object =cut sub notnull { my $self = shift; my @arr = keys %$self; return $#arr > -1 ? 1 : 0; } =head2 entry_exists Boolean values sub to tell if there is an entry for the passed citation key. =cut sub entry_exists { my ($self, $citekey) = @_; return defined($self->{$citekey}) ? 1 : 0; } =head2 entry Returns a Biber::Entry object for a given citekey =cut sub entry { my ($self, $citekey) = @_; return $self->{$citekey}; } =head2 entries Returns an array of all Biber::Entry objects =cut sub entries { my $self = shift; return values %$self; } =head2 del_entries Deletes all Biber::Entry objects =cut sub del_entries { my $self = shift; foreach my $e (keys %$self) { delete($self->{$e}); } return; } =head2 add_entry Adds a Biber::Entry to the Biber::Entries object =cut sub add_entry { my $self = shift; my ($key, $entry) = @_; $self->{$key} = $entry; return; } =head2 del_entry Deletes a Biber::Entry object for a given citekey. Only used in tests in order to reset data before regeneration with different options. =cut sub del_entry { my ($self, $citekey) = @_; delete($self->{$citekey}); return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Entry.pm000444000765000024 5144512667073765 17761 0ustar00philkimestaff000000000000package Biber::Entry; use v5.16; use strict; use warnings; use Biber::Utils; use Biber::Internals; use Biber::Constants; use Data::Dump qw( pp ); use Digest::MD5 qw( md5_hex ); use Log::Log4perl qw( :no_extra_logdie_message ); use List::Util qw( first ); my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Entry =head2 new Initialize a Biber::Entry object There are three types of field possible in an entry: * raw - These are direct copies of input fields with no processing performed on them. Such fields are used for tool mode where we don't want to alter the fields as they need to go back into the output as they are * data - These are fields which derive directly from or are themselves fields in the data souce. Things like YEAR, MONTH, DAY etc. are such fields which are derived from, for example, the DATE field (which is itself a "raw" field). They are part of the original data implicitly, derived from a "raw" field. * other - These are fields, often meta-information like labelname, labelalpha etc. which are more removed from the data fields. The reason for this division is largely the entry cloning required for the related entry and inheritance features. When we clone an entry or copy some fields from one entry to another we generally don't want the "other" category as such derived meta-fields will often need to be re-created or ignored so we need to know which are the actual "data" fields to copy/clone. "raw" fields are important when we are writing bibtex format output (in tool mode for example) since in such cases, we don't want to derive implicit fields like YEAR/MONTH from DATE. =cut sub new { my $class = shift; my $obj = shift; my $self; if (defined($obj) and ref($obj) eq 'HASH') { $self = bless $obj, $class; } else { $self = bless {}, $class; } return $self; } =head2 relclone Recursively create related entry clones starting with an entry =cut sub relclone { my $self = shift; my $citekey = $self->get_field('citekey'); my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); if (my $relkeys = $self->get_field('related')) { $logger->debug("Found RELATED field in '$citekey' with contents " . join(',', @$relkeys)); my @clonekeys; foreach my $relkey (@$relkeys) { # Resolve any alias my $nrelkey = $section->get_citekey_alias($relkey) // $relkey; $logger->debug("Resolved RELATED key alias '$relkey' to '$nrelkey'") if $relkey ne $nrelkey; $relkey = $nrelkey; $logger->debug("Looking at RELATED key '$relkey'"); # Loop avoidance, in case we are back in an entry again in the guise of a clone # We can record the related clone but don't create it again if (my $ck = $section->get_keytorelclone($relkey)) { $logger->debug("Found RELATED key '$relkey' already has clone '$ck'"); push @clonekeys, $ck; # Save graph information if requested if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('related', $ck, $relkey, $citekey); } } else { my $relentry = $section->bibentry($relkey); my $clonekey = md5_hex($relkey); push @clonekeys, $clonekey; my $relclone = $relentry->clone($clonekey); $logger->debug("Created new related clone for '$relkey' with clone key '$clonekey'"); # Set related clone options if (my $relopts = $self->get_field('relatedoptions')) { process_entry_options($clonekey, $relopts); $relclone->set_datafield('options', $relopts); } else { process_entry_options($clonekey, [ 'skiplab', 'skipbiblist', 'uniquename=0', 'uniquelist=0' ]); $relclone->set_datafield('options', [ 'dataonly' ]); } $section->bibentries->add_entry($clonekey, $relclone); $section->keytorelclone($relkey, $clonekey); # Save graph information if requested if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('related', $clonekey, $relkey, $citekey); } # recurse so we can do cascading related entries $logger->debug("Recursing into RELATED entry '$clonekey'"); $relclone->relclone; } } # point to clone keys and add to citekeys # We have to add the citekeys as we need these clones in the .bbl # but the dataonly will cause biblatex not to print them in the bib $section->add_citekeys(@clonekeys); $self->set_datafield('related', [ @clonekeys ]); } } =head2 clone Clone a Biber::Entry object and return a copy Accepts optionally a key for the copy =cut sub clone { my $self = shift; my $newkey = shift; my $new = new Biber::Entry; while (my ($k, $v) = each(%{$self->{datafields}})) { $new->{datafields}{$k} = $v; } while (my ($k, $v) = each(%{$self->{rawfields}})) { $new->{rawfields}{$k} = $v; } while (my ($k, $v) = each(%{$self->{origfields}})) { $new->{origfields}{$k} = $v; } # Need to add entrytype and datatype $new->{derivedfields}{entrytype} = $self->{derivedfields}{entrytype}; $new->{derivedfields}{datatype} = $self->{derivedfields}{datatype}; # put in key if specified if ($newkey) { $new->{derivedfields}{citekey} = $newkey; } # Record the key of the source of the clone in the clone. Useful for loop detection etc. # in biblatex $new->{derivedfields}{clonesourcekey} = $self->get_field('citekey'); return $new; } =head2 notnull Test for an empty object =cut sub notnull { my $self = shift; my @arr = keys %$self; return $#arr > -1 ? 1 : 0; } =head2 set_labelname_info Record the labelname information. This is special meta-information so we have a seperate method for this Takes a hash ref with the information. =cut sub set_labelname_info { my $self = shift; my $data = shift; $self->{labelnameinfo} = $data; return; } =head2 get_labelname_info Retrieve the labelname information. This is special meta-information so we have a seperate method for this Returns a hash ref with the information. =cut sub get_labelname_info { my $self = shift; return $self->{labelnameinfo}; } =head2 set_labelnamefh_info Record the fullhash labelname information. This is special meta-information so we have a seperate method for this Takes a hash ref with the information. =cut sub set_labelnamefh_info { my $self = shift; my $data = shift; $self->{labelnamefhinfo} = $data; return; } =head2 get_labelnamefh_info Retrieve the fullhash labelname information. This is special meta-information so we have a seperate method for this Returns a hash ref with the information. =cut sub get_labelnamefh_info { my $self = shift; return $self->{labelnamefhinfo}; } =head2 set_labeltitle_info Record the labeltitle information. This is special meta-information so we have a seperate method for this Takes a hash ref with the information. =cut sub set_labeltitle_info { my $self = shift; my $data = shift; $self->{labeltitleinfo} = $data; return; } =head2 get_labeltitle_info Retrieve the labeltitle information. This is special meta-information so we have a seperate method for this Returns a hash ref with the information. =cut sub get_labeltitle_info { my $self = shift; return $self->{labeltitleinfo}; } =head2 set_labeldate_info Record the labeldate information. This is special meta-information so we have a seperate method for this Takes a hash ref with the information. =cut sub set_labeldate_info { my $self = shift; my $data = shift; $self->{labeldateinfo} = $data; return; } =head2 get_labeldate_info Retrieve the labeldate information. This is special meta-information so we have a seperate method for this Returns a hash ref with the information. =cut sub get_labeldate_info { my $self = shift; return $self->{labeldateinfo}; } =head2 set_field Set a derived field for a Biber::Entry object, that is, a field which was not an actual bibliography field =cut sub set_field { my $self = shift; my ($key, $val) = @_; # All derived fields can be null $self->{derivedfields}{$key} = $val; return; } =head2 get_field Get a field for a Biber::Entry object Uses // as fields can be null (end dates etc). =cut sub get_field { my $self = shift; my $key = shift; return undef unless $key; return $self->{datafields}{$key} // $self->{derivedfields}{$key} // $self->{rawfields}{$key}; } =head2 set_datafield Set a field which is in the .bib data file =cut sub set_datafield { my $self = shift; my ($key, $val) = @_; $self->{datafields}{$key} = $val; return; } =head2 set_rawfield Save a copy of the raw field from the datasource =cut sub set_rawfield { my $self = shift; my ($key, $val) = @_; $self->{rawfields}{$key} = $val; return; } =head2 get_rawfield Get a raw field =cut sub get_rawfield { my $self = shift; my $key = shift; return $self->{rawfields}{$key}; } =head2 get_datafield Get a field that was in the original data file =cut sub get_datafield { my $self = shift; my $key = shift; return $self->{datafields}{$key}; } =head2 del_field Delete a field in a Biber::Entry object =cut sub del_field { my $self = shift; my $key = shift; delete $self->{datafields}{$key}; delete $self->{derivedfields}{$key}; delete $self->{rawfields}{$key}; return; } =head2 del_datafield Delete an original data source data field in a Biber::Entry object =cut sub del_datafield { my $self = shift; my $key = shift; delete $self->{datafields}{$key}; return; } =head2 field_exists Check whether a field exists (even if null) =cut sub field_exists { my $self = shift; my $key = shift; return (exists($self->{datafields}{$key}) || exists($self->{derivedfields}{$key}) || exists($self->{rawfields}{$key})) ? 1 : 0; } =head2 datafields Returns a sorted array of the fields which came from the data source =cut sub datafields { my $self = shift; use locale; return sort keys %{$self->{datafields}}; } =head2 rawfields Returns a sorted array of the raw fields and contents =cut sub rawfields { my $self = shift; use locale; return sort keys %{$self->{rawfields}}; } =head2 count_datafields Returns the number of datafields =cut sub count_datafields { my $self = shift; return keys %{$self->{datafields}}; } =head2 fields Returns a sorted array of all field names, including ones added during processing which are not necessarily fields which came from the data file =cut sub fields { my $self = shift; use locale; my %keys = (%{$self->{derivedfields}}, %{$self->{datafields}}); return sort keys %keys; } =head2 count_fields Returns the number of fields =cut sub count_fields { my $self = shift; my %keys = (%{$self->{derivedfields}}, %{$self->{datafields}}); return keys %keys; } =head2 has_keyword Check if a Biber::Entry object has a particular keyword in in the KEYWORDS field. =cut sub has_keyword { no autovivification; my $self = shift; my $keyword = shift; if (my $keywords = $self->{datafields}{keywords}) { return (first {$_ eq $keyword} @$keywords) ? 1 : 0; } else { return 0; } return undef; # shouldn't get here } =head2 add_warning Append a warning to a Biber::Entry object =cut sub add_warning { my $self = shift; my $warning = shift; push @{$self->{derivedfields}{warnings}}, $warning; return; } =head2 set_inherit_from Inherit fields from parent entry $entry->set_inherit_from($parententry); Takes a second Biber::Entry object as argument Tailored for set inheritance which is a straight 1:1 inheritance, excluding certain fields for backwards compatibility =cut sub set_inherit_from { my $self = shift; my $parent = shift; # Data source fields foreach my $field ($parent->datafields) { next if $self->field_exists($field); # Don't overwrite existing fields $self->set_datafield($field, $parent->get_field($field)); } # Datesplit is a special non datafield and needs to be inherited for any # validation checks which may occur later if (my $ds = $parent->get_field('datesplit')) { $self->set_field('datesplit', $ds); } return; } =head2 resolve_xdata Recursively resolve XDATA fields in an entry $entry->resolve_xdata($xdata_entry); =cut sub resolve_xdata { my ($self, $xdata) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $entry_key = $self->get_field('citekey'); foreach my $xdatum (@$xdata) { unless (my $xdatum_entry = $section->bibentry($xdatum)) { biber_warn("Entry '$entry_key' references XDATA entry '$xdatum' which does not exist in section $secnum"); next; } else { # Skip xdata inheritance if we've already done it # This will only ever be between two XDATA entrytypes since we # always start at a non-XDATA entrytype, which we'll not look at again # and recursion is always between XDATA entrytypes. next if Biber::Config->get_inheritance('xdata', $xdatum, $entry_key); # record the XDATA resolve between these entries to prevent loops Biber::Config->set_inheritance('xdata', $xdatum, $entry_key); # Detect XDATA loops unless (Biber::Config->is_inheritance_path('xdata', $entry_key, $xdatum)) { if (my $recurse_xdata = $xdatum_entry->get_field('xdata')) { # recurse $xdatum_entry->resolve_xdata($recurse_xdata); } # For tool mode with bibtex output we need to copy the raw fields if (Biber::Config->getoption('tool') and Biber::Config->getoption('output_format') eq 'bibtex') { foreach my $field ($xdatum_entry->rawfields()) { # set raw fields next if $field eq 'ids'; # Never inherit aliases $self->set_rawfield($field, $xdatum_entry->get_rawfield($field)); $logger->debug("Setting field '$field' in entry '$entry_key' via XDATA"); } } else { foreach my $field ($xdatum_entry->datafields()) { # set fields next if $field eq 'ids'; # Never inherit aliases $self->set_datafield($field, $xdatum_entry->get_field($field)); # Record graphing information if required if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('xdata', $xdatum_entry->get_field('citekey'), $entry_key, $field, $field); } $logger->debug("Setting field '$field' in entry '$entry_key' via XDATA"); } } } else { biber_error("Circular XDATA inheritance between '$xdatum'<->'$entry_key'"); } } } } =head2 inherit_from Inherit fields from parent entry (as indicated by the crossref field) $entry->inherit_from($parententry); Takes a second Biber::Entry object as argument Uses the crossref inheritance specifications from the .bcf =cut sub inherit_from { my ($self, $parent) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $target_key = $self->get_field('citekey'); # target/child key my $source_key = $parent->get_field('citekey'); # source/parent key # record the inheritance between these entries to prevent loops and repeats. Biber::Config->set_inheritance('crossref', $source_key, $target_key); # Detect crossref loops unless (Biber::Config->is_inheritance_path('crossref', $target_key, $source_key)) { # cascading crossrefs if (my $ppkey = $parent->get_field('crossref')) { $parent->inherit_from($section->bibentry($ppkey)); } } else { biber_error("Circular inheritance between '$source_key'<->'$target_key'"); } my $type = $self->get_field('entrytype'); my $parenttype = $parent->get_field('entrytype'); my $inheritance = Biber::Config->getblxoption('inheritance'); my %processed; # get defaults my $defaults = $inheritance->{defaults}; # global defaults ... my $inherit_all = $defaults->{inherit_all}; my $override_target = $defaults->{override_target}; # override with type_pair specific defaults if they exist ... foreach my $type_pair (@{$defaults->{type_pair}}) { if (($type_pair->{source} eq '*' or $type_pair->{source} eq $parenttype) and ($type_pair->{target} eq '*' or $type_pair->{target} eq $type)) { $inherit_all = $type_pair->{inherit_all} if $type_pair->{inherit_all}; $override_target = $type_pair->{override_target} if $type_pair->{override_target}; } } # First process any fields that have special treatment foreach my $inherit (@{$inheritance->{inherit}}) { # Match for this combination of entry and crossref parent? foreach my $type_pair (@{$inherit->{type_pair}}) { if (($type_pair->{source} eq '*' or $type_pair->{source} eq $parenttype) and ($type_pair->{target} eq '*' or $type_pair->{target} eq $type)) { foreach my $field (@{$inherit->{field}}) { next unless $parent->field_exists($field->{source}); $processed{$field->{source}} = 1; # localise defaults according to field, if specified my $field_override_target = $field->{override_target} // 'false'; # Skip this field if requested if ($field->{skip}) { $processed{$field->{source}} = 1; } # Set the field if it doesn't exist or override is requested elsif (not $self->field_exists($field->{target}) or $field_override_target eq 'true') { $logger->debug("Entry '$target_key' is inheriting field '" . $field->{source}. "' as '" . $field->{target} . "' from entry '$source_key'"); # For tool mode with bibtex output we need to copy the raw fields if (Biber::Config->getoption('tool') and Biber::Config->getoption('output_format') eq 'bibtex') { $self->set_rawfield($field->{target}, $parent->get_rawfield($field->{source})); } else { $self->set_datafield($field->{target}, $parent->get_field($field->{source})); } # Record graphing information if required if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('crossref', $source_key, $target_key, $field->{source}, $field->{target}); } } } } } } # Now process the rest of the (original data only) fields, if necessary if ($inherit_all eq 'true') { my @fields; if (Biber::Config->getoption('tool')) { @fields = $parent->rawfields; } else { @fields = $parent->datafields; } foreach my $field (@fields) { next if $processed{$field}; # Skip if we have already dealt with this field above # Set the field if it doesn't exist or override is requested if (not $self->field_exists($field) or $override_target eq 'true') { $logger->debug("Entry '$target_key' is inheriting field '$field' from entry '$source_key'"); # For tool mode with bibtex output we need to copy the raw fields if (Biber::Config->getoption('tool') and Biber::Config->getoption('output_format') eq 'bibtex') { $self->set_rawfield($field, $parent->get_rawfield($field)); } else { $self->set_datafield($field, $parent->get_field($field)); } # Record graphing information if required if (Biber::Config->getoption('output_format') eq 'dot') { Biber::Config->set_graph('crossref', $source_key, $target_key, $field, $field); } } } } # Datesplit is a special non datafield and needs to be inherited for any # validation checks which may occur later if (my $ds = $parent->get_field('datesplit')) { $self->set_field('datesplit', $ds); } return; } =head2 dump Dump Biber::Entry object =cut sub dump { my $self = shift; return pp($self); } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Internals.pm000444000765000024 14751312667073765 20641 0ustar00philkimestaff000000000000package Biber::Internals; use v5.16; use strict; use warnings; use Carp; use Biber::Constants; use Biber::Utils; use Biber::DataModel; use Data::Compare; use List::AllUtils qw( :all ); use Log::Log4perl qw(:no_extra_logdie_message); use Digest::MD5 qw( md5_hex ); use POSIX qw( locale_h ); # for lc() use Unicode::GCString; use Unicode::Collate::Locale; use Unicode::Normalize; use Encode; =encoding utf-8 =head1 NAME Biber::Internals - Internal methods for processing the bibliographic data =head1 METHODS =cut my $logger = Log::Log4perl::get_logger('main'); # Hashes should not care about use* or sorting name key scheme etc. We want to generat hashes # unique to a name, not a particular representation of a name. So, always statically concatenate # nameparts from the data model list of valid nameparts sub _getnamehash { my ($self, $citekey, $names) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $hashkey = ''; my $count = $names->count_names; my $visible = $names->get_visible_cite; my $dm = Biber::Config->get_dm; # namehash obeys list truncations but not uniquename foreach my $n (@{$names->first_n_names($visible)}) { foreach my $nt ($dm->get_constant_value('nameparts')) {# list type so returns list if (my $np = $n->get_namepart($nt)) { $hashkey .= $np; } } } # name list was truncated if ($visible < $count or $names->get_morenames) { $hashkey .= '+'; } $logger->trace("Creating MD5 namehash using '$hashkey'"); # Digest::MD5 can't deal with straight UTF8 so encode it first (via NFC as this is "output") return md5_hex(encode_utf8(NFC($hashkey))); } # Same as _getnamehash but takes account of uniquename setting for firstname # It's used for extra* tracking only sub _getnamehash_u { my ($self, $citekey, $names) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $hashkey = ''; my $count = $names->count_names; my $visible = $names->get_visible_cite; my $dm = Biber::Config->get_dm; # namehash obeys list truncations foreach my $n (@{$names->first_n_names($visible)}) { foreach my $nt ($dm->get_constant_value('nameparts')) {# list type so returns list if (my $np = $n->get_namepart($nt)) { if ($nt eq 'given') { if (defined($n->get_uniquename)) { if ($n->get_uniquename eq '2') { $hashkey .= $np; } elsif ($n->get_uniquename eq '1') { $hashkey .= join('', @{$n->get_namepart_initial('given')}); } } } else { $hashkey .= $np; } } } } # name list was truncated if ($visible < $count or $names->get_morenames) { $hashkey .= '+'; } $logger->trace("Creating MD5 namehash_u using '$hashkey'"); # Digest::MD5 can't deal with straight UTF8 so encode it first (via NFC as this is "output") return md5_hex(encode_utf8(NFC($hashkey))); } sub _getfullhash { my ($self, $citekey, $names) = @_; my $hashkey = ''; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $dm = Biber::Config->get_dm; foreach my $n (@{$names->names}) { foreach my $nt ($dm->get_constant_value('nameparts')) {# list type so returns list if (my $np = $n->get_namepart($nt)) { $hashkey .= $np; } } } # If we had an "and others" if ($names->get_morenames) { $hashkey .= '+' } $logger->trace("Creating MD5 fullhash using '$hashkey'"); # Digest::MD5 can't deal with straight UTF8 so encode it first (via NFC as this is "output") return md5_hex(encode_utf8(NFC($hashkey))); } # Special hash to track per-name information sub _genpnhash { my ($self, $citekey, $n) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $hashkey = ''; my $dm = Biber::Config->get_dm; foreach my $nt ($dm->get_constant_value('nameparts')) {# list type so returns list if (my $np = $n->get_namepart($nt)) { $hashkey .= $np; } } $logger->trace("Creating MD5 pnhash using '$hashkey'"); # Digest::MD5 can't deal with straight UTF8 so encode it first (via NFC as this is "output") return md5_hex(encode_utf8(NFC($hashkey))); } ################## # label generation ################## # special label routines - either not part of the dm but special fields for biblatex # or dm fields which need special treatment. Technically users could remove such fields # from the dm but it would be very strange. my %internal_dispatch_label = ( 'label' => [\&_label_basic, ['label', 'nostrip']], 'shorthand' => [\&_label_basic, ['shorthand', 'nostrip']], 'sortkey' => [\&_label_basic, ['sortkey', 'nostrip']], 'citekey' => [\&_label_citekey, []], 'labelname' => [\&_label_name, ['labelname']], 'labeltitle' => [\&_label_basic, ['labeltitle']], 'labelmonth' => [\&_label_basic, ['labelmonth']], 'labelday' => [\&_label_basic, ['labelday']], 'labelyear' => [\&_label_basic, ['labelyear']]); sub _dispatch_table_label { my ($field, $dm) = @_; # internal fields not part of the data model if (my $id = $internal_dispatch_label{$field}) { return $id; } # Label elements which aren't fields unless ($dm->is_field($field)) { return undef; } # Fields which are part of the datamodel my $dmf = $dm->get_dm_for_field($field); if ($dmf->{fieldtype} eq 'list' and $dmf->{datatype} eq 'name') { return [\&_label_name, [$field]]; } else { return [\&_label_basic, [$field]]; } } # Main label loop sub _genlabel { my ($self, $citekey) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $labelalphatemplate = Biber::Config->getblxoption('labelalphatemplate', $be->get_field('entrytype')); my $label; my $slabel; $LABEL_FINAL = 0; # reset final shortcut foreach my $labelpart (sort {$a->{order} <=> $b->{order}} @{$labelalphatemplate->{labelelement}}) { my $ret = _labelpart($self, $labelpart->{labelpart}, $citekey); $label .= $ret->[0] || ''; $slabel .= $ret->[1] || ''; last if $LABEL_FINAL; } return [ $label, $slabel ]; } # Disjunctive set of label parts sub _labelpart { my ($self, $labelpart, $citekey) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $dm = Biber::Config->get_dm; my $maxan = Biber::Config->getblxoption('maxalphanames', $bee, $citekey); my $minan = Biber::Config->getblxoption('minalphanames', $bee, $citekey); my $lp; my $slp; foreach my $part (@$labelpart) { # Implement defaults not set by biblatex itself unless (exists($part->{substring_fixed_threshold})) { $part->{substring_fixed_threshold} = 1; } # Deal with various tests # ifnamecount only uses this label template part if the list it is applied to is a certain # length if (my $ic = $part->{ifnamecount}) { my $f = $part->{content}; # resolve labelname if ($f eq 'labelname') { $f = ($be->get_labelname_info || ''); } if ( first {$f eq $_} @{$dm->get_fields_of_type('list', 'name')}) { my $name = $be->get_field($f) || next; # just in case there is no labelname etc. my $total_names = $name->count_names; my $visible_names; if ($total_names > $maxan) { $visible_names = $minan; } else { $visible_names = $total_names; } next unless $visible_names == $ic; } } my $ret = _dispatch_label($self, $part, $citekey); $lp .= $ret->[0]; $slp .= $ret->[1]; # We use the first one to return something if ($ret->[0]) { $LABEL_FINAL = 1 if $part->{final}; last; } } return [ $lp, $slp ]; } # Main label dispatch method sub _dispatch_label { my ($self, $part, $citekey) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $code_ref; my $code_args_ref; my $lp; my $slp; my $dm = Biber::Config->get_dm; # if the field is not found in the dispatch table, assume it's a literal string unless (_dispatch_table_label($part->{content}, $dm)) { $code_ref = \&_label_literal; $code_args_ref = [$part->{content}]; } else { # real label field $code_ref = ${_dispatch_table_label($part->{content}, $dm)}[0]; $code_args_ref = ${_dispatch_table_label($part->{content}, $dm)}[1]; } return &{$code_ref}($self, $citekey, $code_args_ref, $part); } ######################### # Label dispatch routines ######################### sub _label_citekey { my ($self, $citekey, $args, $labelattrs) = @_; my $k = _process_label_attributes($self, $citekey, $citekey, $labelattrs, $args->[0]); return [$k, unescape_label($k)]; } sub _label_basic { my ($self, $citekey, $args, $labelattrs) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $e = $args->[0]; my $f; if ($args->[1] and $args->[1] eq 'nostrip') { $f = $be->get_field($e); } else { $f = normalise_string_label($be->get_field($e)); } if ($f) { my $b = _process_label_attributes($self, $citekey, $f, $labelattrs, $e); return [$b, unescape_label($b)]; } else { return ['', '']; } } # literal string - don't post-process this, there is no point sub _label_literal { my ($self, $citekey, $args, $labelattrs) = @_; my $string = $args->[0]; return [escape_label(unescape_label($string)), unescape_label($string)]; } # names sub _label_name { my ($self, $citekey, $args, $labelattrs) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $useprefix = Biber::Config->getblxoption('useprefix', $be->get_field('entrytype'), $citekey); my $alphaothers = Biber::Config->getblxoption('alphaothers', $be->get_field('entrytype')); my $sortalphaothers = Biber::Config->getblxoption('sortalphaothers', $be->get_field('entrytype')); # Shortcut - if there is no labelname, don't do anything return ['',''] unless defined($be->get_labelname_info); my $namename = $args->[0]; my $acc = '';# Must initialise to empty string as we need to return a string # This contains sortalphaothers instead of alphaothers, if defined # This is needed in cases where alphaothers is something like # '\textasteriskcentered' which would mess up sorting. my $sortacc; # Careful to extract the information we need about the real name behind labelname # as we need this to set the use* options below. my $realname; if ($namename eq 'labelname') { $realname = $be->get_labelname_info; } else { $realname = $namename; } my $names = $be->get_field($realname); # Account for labelname set to short* when testing use* options my $lnameopt; if ( $realname =~ /\Ashort(\X+)\z/xms ) { $lnameopt = $1; } else { $lnameopt = $realname; } if (Biber::Config->getblxoption("use$lnameopt", $be->get_field('entrytype'), $citekey) and $names) { if (defined($names->get_useprefix)) { $useprefix = $names->get_useprefix; } my $numnames = $names->count_names; my $visibility = $names->get_visible_alpha; my @familynames = map { normalise_string_label($_->get_namepart('family'), $realname) } @{$names->names}; my @prefices = map { $_->get_namepart('prefix') } @{$names->names}; my @useprefices = map { if (defined($_->get_useprefix)) {$_->get_useprefix} else {$useprefix} } @{$names->names}; # Use name range override, if any my $nr_start; my $nr_end; if (exists($labelattrs->{namerange})) { my $nr = parse_range($labelattrs->{namerange}); $nr_start = $nr->[0]; $nr_end = $nr->[1]; if (defined($nr_end) and $nr_end eq '+') {# minalphanames cap marker $nr_end = $visibility; } elsif (not defined($nr_end) or $nr_end > $numnames) { # cap at numnames, of course $nr_end = $numnames; } } else { $nr_start = 1; $nr_end = $visibility; # Else use bib visibility } $logger->trace("$realname/numnames=$numnames/visibility=$visibility/nr_start=$nr_start/nr_end=$nr_end"); for (my $i = $nr_start-1; $i < $nr_end; $i++) { # Deal with prefix options if ($useprefices[$i] and $prefices[$i]) { my $w = $labelattrs->{substring_pwidth} // 1; if ($labelattrs->{substring_pcompound}) { my $tmpstring; # Splitting on tilde too as libbtparse inserts these into compound prefices foreach my $part (split(/[\s\p{Dash}~]+/, $prefices[$i])) { $tmpstring .= Unicode::GCString->new($part)->substr(0, $w)->as_string; } $acc .= $tmpstring; } else { $acc .= Unicode::GCString->new($prefices[$i])->substr(0, $w)->as_string; } } $acc .= _process_label_attributes($self, $citekey, $familynames[$i], $labelattrs, $realname, 'family', $i); } $sortacc = $acc; # Add alphaothers if name list is truncated unless noalphaothers is specified unless ($labelattrs->{noalphaothers}) { if ($numnames > $nr_end or $names->get_morenames) { $acc .= $alphaothers // ''; # alphaothers can be undef $sortacc .= $sortalphaothers // ''; # sortalphaothers can be undef } } return [$acc, unescape_label($sortacc)]; } else { return ['', '']; } } # Label generation utilities # Modify label string according to some attributes # We use different caches for the "v" and "l" schemes because they have a different format # internally and interfere with each other between resets in prepare() otherwise sub _process_label_attributes { my ($self, $citekey, $field_string, $labelattrs, $field, $namepart, $index) = @_; return $field_string unless $labelattrs; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my @citekeys = $section->get_citekeys; my $nindex = first_index {$_ eq $citekey} @citekeys; if (defined($labelattrs->{substring_width})) { # dynamically disambiguated width (individual name disambiguation) if ($labelattrs->{substring_width} =~ /v/ and $field) { # Use the cache if there is one if (my $lcache = $section->get_labelcache_v($field)) { $logger->debug("Using label disambiguation cache (name) for '$field' in section $secnum"); # Use the global index override if set (substring_width =~ /f/) $field_string = ${$lcache->{$field_string}{data}}[$lcache->{globalindices}{$field_string} || $lcache->{$field_string}{index}]; } else { # This contains a mapping of strings to substrings of increasing lengths my %substr_cache = (); my $lcache = {}; # Get the indices of each field (or namepart) we are dealing with my %indices; foreach my $key (@citekeys) { if (my $f = $section->bibentry($key)->get_field($field)) { if ($namepart) { foreach my $n (@{$f->first_n_names($f->get_visible_alpha)}) { # Do strip/nosort here as that's what we also do to the field contents # we will use to look up in this hash later $indices{normalise_string_sort($n->get_namepart($namepart), $field)} = $n->get_index; } } else { $indices{$f} = 0; } } } # This ends up as a flat list due to array interpolation my @strings = uniq keys %indices; # Look to the index of the longest string or the explicit max width if set my $maxlen = $labelattrs->{substring_width_max} || max map {Unicode::GCString->new($_)->length} @strings; for (my $i = 1; $i <= $maxlen; $i++) { foreach my $map (map { my $s = Unicode::GCString->new($_)->substr(0, $i)->as_string; $substr_cache{$s}++; [$_, $s] } @strings) { # We construct a list of all substrings, up to the length of the longest string # or substring_width_max. Then we save the index of the list element which is # the minimal disambiguation if it's not yet defined push @{$lcache->{$map->[0]}{data}}, $map->[1]; $lcache->{$map->[0]}{nameindex} = $indices{$map->[0]}; if (not exists($lcache->{$map->[0]}{index}) and ($substr_cache{$map->[1]} == 1 or $i == $maxlen)) { # -1 to make it into a clean array index $lcache->{$map->[0]}{index} = Unicode::GCString->new($map->[1])->length - 1; } } } # We want to use a string width for all strings equal to the longest one needed # to disambiguate this list. We do this by saving an override for the minimal # disambiguation length per index if ($labelattrs->{substring_width} =~ /f/) { # Get the uniqueness indices of all of the strings and strip out those # which don't occur at least substring_fixed_threshold times my $is; foreach my $v (values %$lcache) { $is->{$v->{nameindex}}{$v->{index}}++; } # Now set a new global index for the name part index which is the maximum of those # occuring above a certain threshold foreach my $s (keys %$lcache) { foreach my $ind (keys %$is) { next unless $indices{$s} == $ind; $lcache->{globalindices}{$s} = max grep {$is->{$ind}{$_} >= $labelattrs->{substring_fixed_threshold} } keys %{$is->{$ind}}; } } } # Use the global index override if set (substring_width =~ /f/) $field_string = ${$lcache->{$field_string}{data}}[$lcache->{globalindices}{$field_string} || $lcache->{$field_string}{index}]; $logger->debug("Creating label disambiguation cache for '$field' " . ($namepart ? "($namepart) " : '') . "in section $secnum"); $logger->trace("Label disambiguation cache for '$field' " . ($namepart ? "($namepart) " : '') . "in section $secnum:\n " . Data::Dump::pp($lcache)); $section->set_labelcache_v($field, $lcache); } } # dynamically disambiguated width (list disambiguation) elsif ($labelattrs->{substring_width} =~ /l/ and $field) { # Use the cache if there is one if (my $lcache = $section->get_labelcache_l($field)) { $logger->debug("Using label disambiguation cache (list) for '$field' in section $secnum"); $field_string = $lcache->{data}[$nindex][$index]; } else { # This retains the structure of the entries for the "l" list disambiguation # Have to be careful if field "$f" is not set for all entries my $strings = [map {my $f = $section->bibentry($_)->get_field($field); $f ? ($namepart ? [map {$_->get_namepart($namepart)} @{$f->first_n_names($f->get_visible_alpha)}] : [$f]) : [''] } @citekeys]; my $lcache = _label_listdisambiguation($strings); $field_string = $lcache->{data}[$nindex][$index]; $logger->debug("Creating label disambiguation (list) cache for '$field' " . ($namepart ? "($namepart) " : '') . "in section $secnum"); $logger->trace("Label disambiguation (list) cache for '$field' " . ($namepart ? "($namepart) " : '') . "in section $secnum:\n " . Data::Dump::pp($lcache)); $section->set_labelcache_l($field, $lcache); } } # static substring width else { my $subs_offset = 0; my $default_substring_width = 1; my $default_substring_side = 'left'; my $subs_width = ($labelattrs->{substring_width} or $default_substring_width); my $subs_side = ($labelattrs->{substring_side} or $default_substring_side); my $padchar = $labelattrs->{pad_char}; if ($subs_side eq 'right') { $subs_offset = 0 - $subs_width; } # Get map of regexps to not count against stringth width and record their place in the string my $nolabelwcs = Biber::Config->getoption('nolabelwidthcount'); my $nolabelwcis = match_indices([map {$_->{value}} @$nolabelwcs], $field_string); $logger->trace('Saved indices for nolabelwidthcount: ' . Data::Dump::pp($nolabelwcis)); # Then remove the nolabelwidthcount chars for now foreach my $nolabelwc (@$nolabelwcs) { my $nlwcopt = $nolabelwc->{value}; my $re = qr/$nlwcopt/; $field_string =~ s/$re//gxms; # remove nolabelwidthcount items } # If desired, do the substring on all parts of compound strings # (strings with internal spaces or hyphens) if ($labelattrs->{substring_compound}) { my $tmpstring; foreach my $part (split(/[\s\p{Dash}]+/, $field_string)) { $tmpstring .= Unicode::GCString->new($part)->substr($subs_offset, $subs_width)->as_string; } $field_string = $tmpstring; } else { $field_string = Unicode::GCString->new($field_string)->substr($subs_offset, $subs_width)->as_string; } # Padding if ($padchar) { $padchar = unescape_label($padchar); my $pad_side = ($labelattrs->{pad_side} or 'right'); my $paddiff = $subs_width - Unicode::GCString->new($field_string)->length; if ($paddiff > 0) { if ($pad_side eq 'right') { $field_string .= $padchar x $paddiff; } elsif ($pad_side eq 'left') { $field_string = $padchar x $paddiff . $field_string; } } $field_string = escape_label($field_string); } # Now reinstate any nolabelwidthcount regexps # Unicode::GCString->substr() with 3 args doesn't seem to work my $subslength = Unicode::GCString->new($field_string)->length; my @gca = Unicode::GCString->new($field_string)->as_array; my $splicelen = 0; foreach my $nolabelwci (@$nolabelwcis) { if (($nolabelwci->[1] + 1) <= $subslength) { splice(@gca, $nolabelwci->[1] + $splicelen, 0, $nolabelwci->[0]); # - 1 here as we are using a length as a 0-based index calculation later on $splicelen += (Unicode::GCString->new($nolabelwci->[0])->length - 1); } } $field_string = join('', @gca); } } # Case changes if ($labelattrs->{uppercase} and $labelattrs->{lowercase}) { # do nothing if both are set, for sanity } elsif ($labelattrs->{uppercase}) { $field_string = uc($field_string); } elsif ($labelattrs->{lowercase}) { $field_string = lc($field_string); } return $field_string; } # This turns a list of label strings: # [ # ['Agassi', 'Chang', 'Laver', 'bob'], # ['Agassi', 'Chang', 'Laver'], # ['Agassi', 'Chang', 'Laver'], # ['Agassi', 'Connors', 'Lendl'], # ['Agassi', 'Courier', 'Laver'], # ['Borg', 'Connors', 'Edberg'], # ['Borg', 'Connors', 'Emerson'], # ['Becker', 'Connors', 'Emerson'], # ['Becker'] # ['Zoo', 'Xaa'], # ['Zoo', 'Xaa'], # ['Zaa'], # ['Abc', 'Abc', 'Abc'], # ['Abc', 'Abc', 'Abc'], # ['Abc', 'Abc', 'Abc'] # ] # # # into a disambiguated list of substrings: # # { data => [ # ['A', 'C', 'L', 'b'], # ['A', 'Ch', 'L' ], # ['A', 'Ch', 'L' ], # ['A', 'Co', 'L' ], # ['A', 'C', 'L' ], # ['B', 'C', 'Ed' ], # ['Bo', 'C', 'E' ], # ['B', 'C', 'E' ], # ['B' ] # ['Z' 'X' ] # ['Z' 'X' ] # ['Z' ] # ['A', 'A', 'A' ] # ['A', 'A', 'A' ] # ['A', 'A', 'A' ] # ], # } # sub _label_listdisambiguation { my $strings = shift; # Cache map says which index are we substr'ing to for each name. # Starting default is first char from each my $cache->{substr_map} = [map {[map {1} @$_]} @$strings]; my $lcache->{data} = [map {undef} @$strings]; # First flag any duplicates so we can shortcut setting these later my @dups; for (my $i = 0; $i <= $#$strings; $i++) { $dups[$i] = join('', @{$strings->[$i]}); } _do_substr($lcache, $cache, $strings); # loop until the entire disambiguation cache is filled. while (grep { !defined } @{$lcache->{data}}) { _check_counts($lcache, $cache); foreach my $ambiguous_indices (@{$cache->{ambiguity}}) { my $ambiguous_strings = [@$strings[@$ambiguous_indices]]; # slice # We work on the first in an ambiguous set # We have to find the first name which is not the same as another name in the # same position as we can't disambiguate on the basis of an identical name. For example: # [ # [ 'Smith', 'Jones' ] # [ 'Smith', 'Janes' ] # ] # # Here there is no point trying more characters in "Smith" as it won't help # Special case: If all lists in an ambiguity set are identical, like # # [ # [ 'Smith, 'Jones' ], # [ 'Smith, 'Jones' ], # ] # # Then we can shortcut and take a 1-char substring only # if all name lists in the ambiguous list are in fact the same if (all {Compare($ambiguous_strings->[0], $_)} @$ambiguous_strings) { $lcache->{data}[$ambiguous_indices->[0]] = [map {Unicode::GCString->new($_)->substr(0,1)->as_string} @{$ambiguous_strings->[0]}]; } else { # Get disambiguating list position information _gen_first_disambiguating_name_map($cache, $ambiguous_strings, $ambiguous_indices); # Then increment appropriate substr map $cache->{substr_map}[$ambiguous_indices->[0]][$cache->{name_map}[$ambiguous_indices->[0]]]++; } # Rebuild the cache and loop _do_substr($lcache, $cache, $strings); } } return $lcache; } # Take substrings of name lists according to a map and save the results sub _do_substr { my ($lcache, $cache, $strings) = @_; delete($cache->{keys}); for (my $i = 0; $i <= $#$strings; $i++) { next if defined($lcache->{data}[$i]); # ignore names already disambiguated my $row = $strings->[$i]; my @s; for (my $j = 0; $j <= $#$row; $j++) { push @s, Unicode::GCString->new($row->[$j])->substr(0 ,$cache->{substr_map}[$i][$j])->as_string; } my $js = join('', @s); $cache->{keys}{$js}{index} = $i; # index of the last seen $js key - useless for count >1 push @{$cache->{keys}{$js}{indices}}, $i; $cache->{keys}{$js}{count}++; $cache->{keys}{$js}{strings} = \@s; } } # Push finished disambiguation into results and save still ambiguous labels for loop sub _check_counts { my ($lcache, $cache) = @_; delete($cache->{ambiguity}); foreach my $key (keys %{$cache->{keys}}) { if ($cache->{keys}{$key}{count} > 1) { push @{$cache->{ambiguity}}, $cache->{keys}{$key}{indices}; } else { $lcache->{data}[$cache->{keys}{$key}{index}] = $cache->{keys}{$key}{strings}; } } } # Find the index of the first name in $array->[0] which doesn't # occur in any other of $array in the same position. This must be the name # which disambiguates. # [ # ['Agassi', 'Chang', 'Laver'], # ['Agassi', 'Chang', 'Laver'], # ['Agassi', 'Connors', 'Lendl'], # ['Agassi', 'Courier', 'Laver'], # ['Agassi', 'Courier', 'Lendl'], # ] # results in # $cache->{name_map} = [ 1, 1, 1, 1, 2 ] sub _gen_first_disambiguating_name_map { my ($cache, $array, $indices) = @_; for (my $i = 0; $i <= $#$array; $i++) { my @check_array = @$array; splice(@check_array, $i, 1); # Remove duplicates from the check array otherwise the duplicate makes generating the # name disambiguation index fail because there is a same name in every position @check_array = grep {not Compare($array->[$i], $_)} @check_array; # all ambiguous must be same length (otherwise they wouldn't be ambiguous) my $len = $#{$array->[0]}; for (my $j = 0; $j <= $len; $j++) { # if no other name equal to this one in same place, this is the index of the name # to use for disambiguation unless (grep {$array->[$i][$j] eq $_} map {$_->[$j]} @check_array) { $cache->{name_map}[$indices->[$i]] = $j; last; } } } } ######### # Sorting ######### # None of these can be used to generate sorting information otherwise there # would be a circular dependency: # sortinit # sortinithash # extrayear # extratitle # extratitleyear # extraalpha my $sorting_sep = ','; # special sorting routines - not part of the dm but special fields for biblatex my %internal_dispatch_sorting = ( 'editoratype' => [\&_sort_editort, ['editoratype']], 'editorbtype' => [\&_sort_editort, ['editorbtype']], 'editorctype' => [\&_sort_editort, ['editorctype']], 'citeorder' => [\&_sort_citeorder, []], 'labelalpha' => [\&_sort_labelalpha, []], 'labelname' => [\&_sort_labelname, []], 'labeltitle' => [\&_sort_labeltitle, []], 'labelyear' => [\&_sort_labeldate, ['year']], 'labelmonth' => [\&_sort_labeldate, ['month']], 'labelday' => [\&_sort_labeldate, ['day']], 'presort' => [\&_sort_presort, []], 'sortname' => [\&_sort_sortname, []], 'entrykey' => [\&_sort_entrykey, []]); # The value is an array pointer, first element is a code pointer, second is # a pointer to extra arguments to the code. This is to make code re-use possible # so the sorting can share code for similar things. sub _dispatch_table_sorting { my ($field, $dm) = @_; # internal fields not part of the data model if (my $id = $internal_dispatch_sorting{$field}) { return $id; } # Sorting elements which aren't fields unless ($dm->is_field($field)) { return undef; } # Fields which are part of the datamodel my $dmf = $dm->get_dm_for_field($field); if ($dmf->{fieldtype} eq 'list' and $dmf->{datatype} eq 'name') { return [\&_sort_name, [$field]]; } elsif ($dmf->{fieldtype} eq 'field' and $dmf->{datatype} eq 'literal') { return [\&_sort_literal, [$field]]; } elsif ($dmf->{fieldtype} eq 'field' and ($dmf->{datatype} eq 'integer' or $dmf->{datatype} eq 'datepart')) { return [\&_sort_integer, [$field]]; } elsif ($dmf->{fieldtype} eq 'list' and ($dmf->{datatype} eq 'literal' or $dmf->{datatype} eq 'key')) { return [\&_sort_list, [$field]]; } elsif ($dmf->{fieldtype} eq 'field' and $dmf->{datatype} eq 'key') { return [\&_sort_literal, [$field]]; } } # Main sorting dispatch method sub _dispatch_sorting { my ($self, $sortfield, $citekey, $sortlist, $sortelementattributes) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $code_ref; my $code_args_ref; my $dm = Biber::Config->get_dm; # If this field is excluded from sorting for this entrytype, then skip it and return if (my $se = Biber::Config->getblxoption('sortexclusion', $be->get_field('entrytype'))) { if ($se->{$sortfield}) { return ''; } } # if the field is not found in the dispatch table, assume it's a literal string unless (_dispatch_table_sorting($sortfield, $dm)) { $code_ref = \&_sort_string; $code_args_ref = [$sortfield]; } else { # real sorting field $code_ref = ${_dispatch_table_sorting($sortfield, $dm)}[0]; $code_args_ref = ${_dispatch_table_sorting($sortfield, $dm)}[1]; } return &{$code_ref}($self, $citekey, $sortlist, $sortelementattributes, $code_args_ref); } # Conjunctive set of sorting sets sub _generatesortinfo { my ($self, $citekey, $sortlist) = @_; my $sortscheme = $sortlist->get_sortscheme; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $sortobj; $BIBER_SORT_FINAL = 0; $BIBER_SORT_FINAL = ''; foreach my $sortset (@{$sortscheme->{spec}}) { my $s = $self->_sortset($sortset, $citekey, $sortlist); # We have already found a "final" item so if this item returns null, # copy in the "final" item string as it's the master key for this entry now if ($BIBER_SORT_FINAL and not $BIBER_SORT_NULL) { push @$sortobj, $BIBER_SORT_FINAL; } else { push @$sortobj, $s; } } # Record the information needed for sorting later # sortstring isn't actually used to sort, it's used to generate sortinit and # for debugging purposes my $ss = join($sorting_sep, @$sortobj); $sortlist->set_sortdata($citekey, [$ss, $sortobj]); $logger->debug("Sorting object for key '$citekey' -> " . Data::Dump::pp($sortobj)); # Generate sortinit. Skip if there is no sortstring, which is possible in tests if ($ss) { # This must ignore the presort characters, naturally my $pre = Biber::Config->getblxoption('presort', $be->get_field('entrytype'), $citekey); # Strip off the prefix $ss =~ s/\A$pre$sorting_sep+//; my $init = Unicode::GCString->new(normalise_string($ss))->substr(0, 1)->as_string; # Collator for determining primary weight hash for sortinit # Using the global sort locale because we only want the sortinit of the first sorting field # and if this was locally different to the global sorting, something would be very strange. my $Collator = Unicode::Collate::Locale->new(locale => Biber::Config->getoption('sortlocale'), level => 1); my $inithash = md5_hex($Collator->viewSortKey($init)); $sortlist->set_sortinitdata_for_key($citekey, $init, $inithash); } return; } # Process sorting set sub _sortset { my ($self, $sortset, $citekey, $sortlist) = @_; foreach my $sortelement (@$sortset[1..$#$sortset]) { my ($sortelementname, $sortelementattributes) = %$sortelement; $BIBER_SORT_NULL = 0; # reset this per sortset my $string = $self->_dispatch_sorting($sortelementname, $citekey, $sortlist, $sortelementattributes); if ($string) { # sort returns something for this key if ($sortset->[0]{final}) { # If we encounter a "final" element, we return an empty sort # string and save the string so it can be copied into all further # fields as this is now the master sort key. We use an empty string # where we found it in order to preserve sort field order and so # that we sort correctly against all other entries without a value # for this "final" field $BIBER_SORT_FINAL = $string; last; } return $string; } } $BIBER_SORT_NULL = 1; # set null flag - need this to deal with some cases return ''; } ############################################## # Sort dispatch routines ############################################## sub _sort_citeorder { my ($self, $citekey, $sortlist, $sortelementattributes) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); # Pad the numbers so that they sort with "cmp" properly. Assume here max of # a million bib entries. Probably enough ... # Allkeys and sorting=none means use bib order which is in orig_order_citekeys # However, someone might do: # \cite{b,a} # \nocite{*} # in the same section which means we need to use the order attribute for those # keys which have one (the \cited keys) and then an orig_order_citekey index based index # for the nocite ones. my $ko = Biber::Config->get_keyorder($secnum, $citekey);# only for \cited keys if ($section->is_allkeys) { return sprintf('%.7d', $ko || (Biber::Config->get_keyorder_max($secnum) + (first_index {$_ eq $citekey} $section->get_orig_order_citekeys) + 1)); } # otherwise, we need to take account of citations with simulataneous order like # \cite{key1, key2} so this tied sorting order can be further sorted with other fields # Note the fallback of "0" - this is for auto-generated entries which are not cited # and so never have a keyorder entry else { return sprintf('%.7d', $ko || 0); } } sub _sort_integer { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $dmtype = $args->[0]; # get day/month field type my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); if (my $field = $be->get_field($dmtype)) { return _process_sort_attributes($field, $sortelementattributes); } else { return ''; } } sub _sort_editort { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $edtypeclass = $args->[0]; # get editor type/class field my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); if (Biber::Config->getblxoption('useeditor', $be->get_field('entrytype'), $citekey) and $be->get_field($edtypeclass)) { my $string = $be->get_field($edtypeclass); return _process_sort_attributes($string, $sortelementattributes); } else { return ''; } } sub _sort_entrykey { my ($self, $citekey, $sortlist, $sortelementattributes) = @_; return _process_sort_attributes($citekey, $sortelementattributes); } sub _sort_labelalpha { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $string = $be->get_field('sortlabelalpha') // ''; return _process_sort_attributes($string, $sortelementattributes); } sub _sort_labelname { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # re-direct to the right sorting routine for the labelname if (my $lni = $be->get_labelname_info) { # Don't process attributes as they will be processed in the real sub return $self->_dispatch_sorting($lni, $citekey, $sortlist, $sortelementattributes); } else { return ''; } } sub _sort_labeltitle { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # re-direct to the right sorting routine for the labeltitle if (my $lti = $be->get_labeltitle_info) { # Don't process attributes as they will be processed in the real sub return $self->_dispatch_sorting($lti, $citekey, $sortlist, $sortelementattributes); } else { return ''; } } sub _sort_labeldate { no autovivification; my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $ldc = $args->[0]; # labeldate component my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # re-direct to the right sorting routine for the labeldate component if (my $ldi = $be->get_labeldate_info) { if (my $ldf = $ldi->{field}{$ldc}) { # Don't process attributes as they will be processed in the real sub return $self->_dispatch_sorting($ldf, $citekey, $sortlist, $sortelementattributes); } elsif (exists($ldi->{string})) { # labelyear fallback string return ''; } } else { return ''; } } # This is a meta-sub which uses the optional arguments to the dispatch code # It's done to avoid having many repetitions of almost identical sorting code sub _sort_list { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $list = $args->[0]; # get list field my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); if ($be->get_field($list)) { my $string = $self->_liststring($citekey, $list); return _process_sort_attributes($string, $sortelementattributes); } else { return ''; } } # This is a meta-sub which uses the optional arguments to the dispatch code # It's done to avoid having many repetitions of almost identical sorting code # for literal strings which need normalising sub _sort_literal { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $literal = $args->[0]; # get actual field my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); if (my $field = $be->get_field($literal)) { my $string = normalise_string_sort($field, $literal); return _process_sort_attributes($string, $sortelementattributes); } else { return ''; } } # This is a meta-sub which uses the optional arguments to the dispatch code # It's done to avoid having many repetitions of almost identical sorting code # for the editor roles sub _sort_name { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $name = $args->[0]; # get name field name my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); # If there is a biblatex option which controls the use of this name, check it if ($CONFIG_OPTSCOPE_BIBLATEX{"use$name"} and not Biber::Config->getblxoption("use$name", $be->get_field('entrytype'), $citekey)) { return ''; } if ($be->get_field($name)) { my $string = $self->_namestring($citekey, $name, $sortlist); return _process_sort_attributes($string, $sortelementattributes); } else { return ''; } } sub _sort_presort { my ($self, $citekey, $sortlist, $sortelementattributes) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $string = Biber::Config->getblxoption('presort', $be->get_field('entrytype'), $citekey); return _process_sort_attributes($string, $sortelementattributes); } sub _sort_sortname { my ($self, $citekey, $sortlist, $sortelementattributes) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $dm = Biber::Config->get_dm; # sortname is ignored if no use option is defined - see biblatex manual if ($be->get_field('sortname') and grep {Biber::Config->getblxoption("use$_", $be->get_field('entrytype'), $citekey)} @{$dm->get_fields_of_type('list', 'name')}) { my $string = $self->_namestring($citekey, 'sortname', $sortlist); return _process_sort_attributes($string, $sortelementattributes); } else { return ''; } } sub _sort_string { my ($self, $citekey, $sortlist, $sortelementattributes, $args) = @_; my $string = $args->[0]; # get literal string return _process_sort_attributes($string, $sortelementattributes); } #======================================================== # Utility subs used elsewhere but relying on sorting code #======================================================== sub _process_sort_attributes { my ($field_string, $sortelementattributes) = @_; return $field_string unless $sortelementattributes; return $field_string unless $field_string; # process substring if ($sortelementattributes->{substring_width} or $sortelementattributes->{substring_side}) { my $subs_offset = 0; my $default_substring_width = 4; my $default_substring_side = 'left'; my $subs_width = ($sortelementattributes->{substring_width} or $default_substring_width); my $subs_side = ($sortelementattributes->{substring_side} or $default_substring_side); if ($subs_side eq 'right') { $subs_offset = 0 - $subs_width; } $field_string = Unicode::GCString->new($field_string)->substr($subs_offset, $subs_width)->as_string; } # Process padding if ($sortelementattributes->{pad_side} or $sortelementattributes->{pad_width} or $sortelementattributes->{pad_char}) { my $default_pad_width = 4; my $default_pad_side = 'left'; my $default_pad_char = '0'; my $pad_width = ($sortelementattributes->{pad_width} or $default_pad_width); my $pad_side = ($sortelementattributes->{pad_side} or $default_pad_side); my $pad_char = ($sortelementattributes->{pad_char} or $default_pad_char); my $pad_length = $pad_width - Unicode::GCString->new($field_string)->length; if ($pad_length > 0) { if ($pad_side eq 'left') { $field_string = ($pad_char x $pad_length) . $field_string; } elsif ($pad_side eq 'right') { $field_string = $field_string . ($pad_char x $pad_length); } } } return $field_string; } # This is used to generate sorting string for names sub _namestring { my $self = shift; my ($citekey, $field, $sortlist) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $names = $be->get_field($field); my $str = ''; my $count = $names->count_names; my $visible = $names->get_visible_bib; # get visibility for bib - can be different to cite my $useprefix = Biber::Config->getblxoption('useprefix', $bee, $citekey); # Get the sorting name key scheme for this list context my $snkname = $sortlist->get_sortnamekeyschemename; # Override with any entry-specific sorting name key scheme option $snkname = Biber::Config->getblxoption('sortnamekeyscheme', undef, $citekey) // $snkname; # Override with any namelist scope sorting name key scheme option $snkname = $names->get_sortnamekeyscheme // $snkname; # Name list scope useprefix option if (defined($names->get_useprefix)) { $useprefix = $names->get_useprefix; } # These should be symbols which can't appear in names and which sort before all alphanum # so that "Alan Smith" sorts after "Al Smith". This means, symbols which normalise_string_sort() # strips out. Unfortuately, this means using punctuation and these are by default variable # weight and ignorable in DUCET so we have to set U::C to variable=>'non-ignorable' as # sorting default so that they are non-ignorable my $nsi = '!'; # name separator, internal my $nse = '#'; # name separator, external # Guaranteed to sort after everything else as it's the last legal Unicode code point my $trunc = "\x{10FFFD}"; # sort string for "et al" truncated name # We strip nosort first otherwise normalise_string_sort damages diacritics # We strip each individual component instead of the whole thing so we can use # as name separators things which would otherwise be stripped. This way we # guarantee that the separators are never in names foreach my $n (@{$names->first_n_names($visible)}) { # Name scope useprefix option if (defined($n->get_useprefix)) { $useprefix = $n->get_useprefix; } # Override with any name scope sorting name key scheme option $snkname = $n->get_sortnamekeyscheme // $snkname; # Now get the actual sorting name key scheme my $snk = Biber::Config->getblxoption('sortingnamekey')->{$snkname}; # Get the sorting name key specification and use it to construct a sorting key for each name foreach my $kp (@$snk) { my $kps; foreach my $np (@$kp) { if ($np->{type} eq 'namepart') { my $namepart = $np->{value}; my $useopt = exists($np->{use}) ? "use$namepart" : undef; my $useoptval = Biber::Config->getblxoption($useopt, $bee, $citekey); # useprefix can be name list or name local if ($useopt and $useopt eq 'useprefix') { $useoptval = $useprefix; } if (my $npstring = $n->get_namepart($namepart)) { # No use attribute conditionals or the attribute is specified and matches the option if (not $useopt or ($useopt and $useoptval == $np->{use})) { # Given name part can be modified by sortgiveninits option if ($namepart eq 'given' and Biber::Config->getoption('sortgiveninits')) { my $npistring = $n->get_namepart_initial($namepart); $kps .= normalise_string_sort(join('', @{$npistring}), $field); } else { $kps .= normalise_string_sort($npstring, $field); } } } } elsif ($np->{type} eq 'literal') { $kps .= $np->{value}; } } # Now append the key part string plus internal name sep if the string is not empty $str .= $kps . $nsi if $kps; } $str =~ s/\Q$nsi\E\z//xms; # Remove any trailing internal separator $str .= $nse; # Add separator in between names } $str =~ s/\s+\Q$nse\E/$nse/gxms; # Remove any whitespace before external separator $str =~ s/\Q$nse\E\z//xms; # strip final external separator as we have finished $str .= $trunc if $visible < $count; # name list was truncated return $str; } sub _liststring { my ($self, $citekey, $field) = @_; my $secnum = $self->get_current_section; my $section = $self->sections->get_section($secnum); my $be = $section->bibentry($citekey); my $bee = $be->get_field('entrytype'); my $f = $be->get_field($field); # _liststring is used in tests so there has to be return '' unless defined($f); # more error checking which will never be needed in normal use my @items = @$f; my $str = ''; my $truncated = 0; # These should be symbols which can't appear in lists and which sort before all alphanum # so that "Alan Smith" sorts after "Al Smth". This means, symbols which normalise_string_sort() # strips out. Unfortuately, this means using punctuation and these are by default variable # weight and ignorable in DUCET so we have to redefine these these symbols after loading DUCET # when sorting so that they are non-ignorable (see Biber.pm) my $lsi = '!'; # list separator, internal # Guaranteed to sort after everything else as it's the last legal Unicode code point my $trunc = "\x{10FFFD}"; # sort string for truncated list # perform truncation according to options minitems, maxitems if ( $#items + 1 > Biber::Config->getblxoption('maxitems', $bee, $citekey) ) { $truncated = 1; @items = splice(@items, 0, Biber::Config->getblxoption('minitems', $bee, $citekey) ); } # separate the items by a string to give some structure $str = join($lsi, map { normalise_string_sort($_, $field)} @items); $str =~ s/\s+\z//xms; $str .= $trunc if $truncated; return $str; } 1; __END__ =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Section.pm000444000765000024 3041512667073765 20256 0ustar00philkimestaff000000000000package Biber::Section; use v5.16; use strict; use warnings; use Biber::Entries; use Biber::Utils; use List::Util qw( first ); =encoding utf-8 =head1 NAME Biber::Section =head2 new Initialize a Biber::Section object =cut sub new { my ($class, %params) = @_; my $self = bless {%params}, $class; $self->{bibentries} = new Biber::Entries; $self->{keytorelclone} = {}; $self->{relclonetokey} = {}; $self->{relkeys} = {}; $self->{allkeys} = 0; $self->{citekeys} = []; $self->{citekeys_h} = {}; # For faster hash-based lookup of individual keys $self->{labelcache_l} = {}; $self->{everykey} = {}; $self->{everykey_lc} = {}; $self->{bcfkeycache} = {}; $self->{labelcache_v} = {}; $self->{sortcache} = []; $self->{dkeys} = {}; $self->{keytods} = {}; $self->{orig_order_citekeys} = []; $self->{undef_citekeys} = []; $self->{citekey_alias} = {}; return $self; } =head2 reset_caches Reset section caches which need it =cut sub reset_caches { my $self = shift; $self->{sortcache} = []; $self->{labelcache_l} = {}; $self->{labelcache_v} = {}; $self->{bcfkeycache} = {}; return; } =head2 set_keytods Save information about citekey->datasource name mapping. Used for error reporting. =cut sub set_keytods { my ($self, $key, $ds) = @_; $self->{keytods}{$key} = $ds; return; } =head2 get_keytods Get information about citekey->datasource name mapping. Used for error reporting. =cut sub get_keytods { my ($self, $key) = @_; return $self->{keytods}{$key}; } =head2 has_badcasekey Returns a value to say if we've seen a key differing only in case before - we've seen a differently cased variant of this key so we can warn about this undef - Not seen this key at all in any case variant before =cut sub has_badcasekey { my ($self, $key) = @_; my $ckey = $self->{everykey_lc}{lc($key)}; return undef unless $ckey; return $ckey ne $key ? $ckey : undef; } =head2 add_related Record that a key is used as a related entry =cut sub add_related { my ($self, $key) = @_; $self->{relkeys}{$key} = 1; return; } =head2 is_related Check if a key is used as a related entry key =cut sub is_related { my ($self, $key) = @_; return $self->{relkeys}{$key}; } =head2 keytorelclone Record a key<->clone key mapping. =cut sub keytorelclone { my ($self, $key, $clonekey) = @_; $self->{keytorelclone}{$key} = $clonekey; $self->{relclonetokey}{$clonekey} = $key; return; } =head2 get_keytorelclone Fetch a related entry clone key, given a cite key =cut sub get_keytorelclone { my ($self, $key) = @_; return $self->{keytorelclone}{$key}; } =head2 get_relclonetokey Fetch a related entry key, given a clone key =cut sub get_relclonetokey { my ($self, $key) = @_; return $self->{relclonetokey}{$key}; } =head2 has_keytorelclone Return boolean saying if a cite key has a related entry clone in the current section =cut sub has_keytorelclone { my ($self, $key) = @_; return defined($self->{keytorelclone}{$key}) ? 1 : 0; } =head2 has_relclonetokey Return boolean saying if a related clone key has a citekey in the current section =cut sub has_relclonetokey { my ($self, $key) = @_; return defined($self->{relclonetokey}{$key}) ? 1 : 0; } =head2 add_everykey Adds a datasource key to the section list of all datasource keys =cut sub add_everykey { my ($self, $key) = @_; $self->{everykey}{$key} = 1; $self->{everykey_lc}{lc($key)} = $key; return; } =head2 del_everykeys Delete everykey cache. For use in tests. =cut sub del_everykeys { my $self = shift; $self->{everykey} = undef $self->{everykey_lc} = undef; return; } =head2 has_everykey Returns a boolean to say if we've seen a key in any datasource for this section. This used to be an array ref which was checked using first() and it was twenty times slower. =cut sub has_everykey { my ($self, $key) = @_; return $self->{everykey}{$key} ? 1 : 0; } =head2 set_allkeys Sets flag to say citekey '*' occurred in citekeys We allow setting it to false too because it's useful in tests =cut sub set_allkeys { my ($self, $val) = @_; $self->{allkeys} = $val; return; } =head2 is_allkeys Checks flag which says citekey '*' occurred in citekeys =cut sub is_allkeys { my $self = shift; return $self->{allkeys}; } =head2 bibentry Returns a Biber::Entry object for the given citation key Understands citekey aliases =cut sub bibentry { my ($self, $key) = @_; if (my $realkey = $self->get_citekey_alias($key)) { return $self->bibentries->entry($realkey); } else { return $self->bibentries->entry($key); } } =head2 bibentries Return Biber::Entries object for this section =cut sub bibentries { my $self = shift; return $self->{bibentries}; } =head2 del_bibentries Delete all Biber::Entry objects from the Biber::Section object =cut sub del_bibentries { my $self = shift; $self->{bibentries} = new Biber::Entries; return; } =head2 set_citekeys Sets the citekeys in a Biber::Section object =cut sub set_citekeys { my $self = shift; my $keys = shift; map { $self->{citekeys_h}{$_} = 1} @$keys; $self->{citekeys} = $keys; return; } =head2 set_orig_order_citekeys Sets the original order of citekeys in a Biber::Section object =cut sub set_orig_order_citekeys { my $self = shift; my $keys = shift; $self->{orig_order_citekeys} = $keys; return; } =head2 get_citekeys Gets the citekeys of a Biber::Section object Returns a normal array =cut sub get_citekeys { my $self = shift; return @{$self->{citekeys}}; } =head2 get_static_citekeys Gets the citekeys of a Biber::Section object excluding dynamic set entry keys Returns a normal array =cut sub get_static_citekeys { my $self = shift; return reduce_array($self->{citekeys}, $self->dynamic_set_keys); } =head2 add_undef_citekey Adds a citekey to the Biber::Section object as an undefined key. This allows us to output this information to the .bbl and so biblatex can do better reporting to external utils like latexmk =cut sub add_undef_citekey { my $self = shift; my $key = shift; push @{$self->{undef_citekeys}}, $key; return; } =head2 get_undef_citekeys Gets the list of undefined citekeys of a Biber::Section object Returns a normal array =cut sub get_undef_citekeys { my $self = shift; return @{$self->{undef_citekeys}}; } =head2 get_orig_order_citekeys Gets the citekeys of a Biber::Section object in their original order This is just to ensure we have a method that will return this, just in case we mess about with the order at some point. This is needed by citeorder sorting. =cut sub get_orig_order_citekeys { my $self = shift; return @{$self->{orig_order_citekeys}}; } =head2 has_citekey Returns true when $key is in the Biber::Section object Understands key alaises =cut sub has_citekey { my $self = shift; my $key = shift; return $self->{citekeys_h}{$self->get_citekey_alias($key) || $key} ? 1 : 0; } =head2 del_citekey Deletes a citekey from a Biber::Section object =cut sub del_citekey { my $self = shift; my $key = shift; return unless $self->has_citekey($key); $self->{citekeys} = [ grep {$_ ne $key} @{$self->{citekeys}} ]; $self->{orig_order_citekeys} = [ grep {$_ ne $key} @{$self->{orig_order_citekeys}} ]; delete $self->{citekeys_h}{$key}; return; } =head2 del_citekeys Deletes all citekeys from a Biber::Section object =cut sub del_citekeys { my $self = shift; $self->{citekeys} = []; $self->{citekeys_h} = {}; $self->{orig_order_citekeys} = []; return; } =head2 add_citekeys Adds citekeys to the Biber::Section object =cut sub add_citekeys { my $self = shift; my @keys = @_; foreach my $key (@keys) { next if $self->has_citekey($key); $self->{citekeys_h}{$key} = 1; push @{$self->{citekeys}}, $key; push @{$self->{orig_order_citekeys}}, $key; } return; } =head2 set_citekey_alias Set citekey alias information =cut sub set_citekey_alias { my $self = shift; my ($alias, $key) = @_; $self->{citekey_alias}{$alias} = $key; return; } =head2 get_citekey_alias Get citekey alias information =cut sub get_citekey_alias { my $self = shift; my $alias = shift; return $self->{citekey_alias}{$alias}; } =head2 del_citekey_alias Delete citekey alias =cut sub del_citekey_alias { my $self = shift; my $alias = shift; delete($self->{citekey_alias}{$alias}); return; } =head2 get_citekey_aliases Get a list of all citekey aliases for the section =cut sub get_citekey_aliases { my $self = shift; return ( keys %{$self->{citekey_alias}} ); } =head2 set_labelcache_v Sets the variable label disambiguation cache for a field =cut sub set_labelcache_v { my ($self, $field, $cache) = @_; $self->{labelcache_v}{$field} = $cache; return; } =head2 get_labelcache_v Gets the variable label disambiguation cache for a field =cut sub get_labelcache_v { my ($self, $field) = @_; return $self->{labelcache_v}{$field}; } =head2 set_labelcache_l Sets the list label disambiguation cache for a field =cut sub set_labelcache_l { my ($self, $field, $cache) = @_; $self->{labelcache_l}{$field} = $cache; return; } =head2 get_labelcache_l Gets the list label disambiguation cache for a field =cut sub get_labelcache_l { my ($self, $field) = @_; return $self->{labelcache_l}{$field}; } =head2 is_dynamic_set Test if a key is a dynamic set =cut sub is_dynamic_set { my $self = shift; my $dkey = shift; return defined($self->{dkeys}{$dkey}) ? 1 : 0; } =head2 set_dynamic_set Record a mapping of dynamic key to member keys =cut sub set_dynamic_set { my $self = shift; my $dkey = shift; my @members = @_; $self->{dkeys}{$dkey} = \@members; return; } =head2 get_dynamic_set Retrieve member keys for a dynamic set key Check that reference returning anything to stop spurious warnings about empty dereference in return. =cut sub get_dynamic_set { my $self = shift; my $dkey = shift; if (my $set_members = $self->{dkeys}{$dkey}) { return @$set_members; } else { return (); } } =head2 dynamic_set_keys Retrieve all dynamic set keys =cut sub dynamic_set_keys { my $self = shift; return [keys %{$self->{dkeys}}]; } =head2 has_dynamic_sets Returns true of false depending on whether the section has any dynamic set keys =cut sub has_dynamic_sets { my $self = shift; return defined($self->{dkeys}) ? 1 : 0; } =head2 add_datasource Adds a data source to a section =cut sub add_datasource { my $self = shift; my $source = shift; push @{$self->{datasources}}, $source; return; } =head2 set_datasources Sets the data sources for a section =cut sub set_datasources { my $self = shift; my $sources = shift; $self->{datasources} = $sources; return; } =head2 get_datasources Gets an array of data sources for this section =cut sub get_datasources { my $self = shift; if (exists($self->{datasources})) { return $self->{datasources}; } else { return undef; } } =head2 add_sort_cache Adds a scheme/keys pair to the sort cache: [$scheme, $keys, $sortinitdata, $extraalphadata, $extrayeardata ] =cut sub add_sort_cache { my $self = shift; my $cacheitem = shift; push @{$self->{sortcache}}, $cacheitem; return; } =head2 get_sort_cache Retrieves the sort cache =cut sub get_sort_cache { my $self = shift; return $self->{sortcache}; } =head2 number Gets the section number of a Biber::Section object =cut sub number { my $self = shift; return $self->{number}; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Sections.pm000444000765000024 355012667073765 20421 0ustar00philkimestaff000000000000package Biber::Sections; use v5.16; use strict; use warnings; =encoding utf-8 =head1 NAME Biber::Sections =head2 new Initialize a Biber::Sections object =cut sub new { my ($class) = @_; my $self = bless {}, $class; return $self; } =head2 get_num_sections Gets the number of Biber::Section objects =cut sub get_num_sections { my $self = shift; my @keys = keys %$self; return $#keys + 1; } =head2 get_section Gets a Biber::Section by number from the Biber::Sections object =cut sub get_section { my $self = shift; my $number = shift; return $self->{$number}; } =head2 get_sections Gets an sorted array ref of all Biber::Section objects =cut sub get_sections { my $self = shift; return [ sort {$a->number <=> $b->number} values %$self ]; } =head2 add_section Adds a Biber::Section to the Biber::Sections object =cut sub add_section { my $self = shift; my $section = shift; my $number = $section->number; $self->{$number} = $section; return; } =head2 delete_section Deletes a section Mainly used in test scripts =cut sub delete_section { my $self = shift; my $section = shift; my $number = $section->number; delete $self->{$number}; return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/SortList.pm000444000765000024 2313712667073765 20440 0ustar00philkimestaff000000000000package Biber::SortList; use v5.16; use strict; use warnings; use Biber::Utils; use Biber::Constants; use List::Util qw( first ); =encoding utf-8 =head1 NAME Biber::SortList =head2 new Initialize a Biber::SortList object =cut sub new { my ($class, %params) = @_; my $self = bless {%params}, $class; return $self; } =head2 set_section Sets the section of a sort list =cut sub set_section { my $self = shift; my $section = shift; $self->{section} = lc($section); return; } =head2 get_section Gets the section of a sort list =cut sub get_section { my $self = shift; return $self->{section}; } =head2 set_sortschemename Sets the sortscheme name of a sort list =cut sub set_sortschemename { my $self = shift; my $ssn = shift; $self->{sortschemename} = lc($ssn); return; } =head2 get_sortschemename Gets the sortschemename of a sort list =cut sub get_sortschemename { my $self = shift; return $self->{sortschemename}; } =head2 set_sortnamekeyschemename Sets the sortnamekeyscheme name of a sort list =cut sub set_sortnamekeyschemename { my $self = shift; my $snksn = shift; $self->{sortnamekeyschemename} = lc($snksn); return; } =head2 get_sortnamekeyschemename Gets the sortnamekeyschemename of a sort list =cut sub get_sortnamekeyschemename { my $self = shift; return $self->{sortnamekeyschemename}; } =head2 set_name Sets the name of a sort list =cut sub set_name { my $self = shift; my $name = shift; $self->{name} = lc($name); return; } =head2 get_name Gets the name of a sort list =cut sub get_name { my $self = shift; return $self->{name}; } =head2 set_type Sets the type of a sort list =cut sub set_type { my $self = shift; my $type = shift; $self->{type} = lc($type); return; } =head2 get_type Gets the type of a section list =cut sub get_type { my $self = shift; return $self->{type}; } =head2 set_keys Sets the keys for the list =cut sub set_keys { my ($self, $keys) = @_; $self->{keys} = $keys; return; } =head2 get_keys Gets the keys for the list =cut sub get_keys { my $self = shift; return @{$self->{keys}}; } =head2 count_keys Count the keys for the list =cut sub count_keys { my $self = shift; return $#{$self->{keys}} + 1; } =head2 get_listdata Gets all of the list metadata =cut sub get_listdata { my $self = shift; return [ $self->{sortscheme}, $self->{sortnamekeyschemename}, $self->{keys}, $self->{sortinitdata}, $self->{extrayeardata}, $self->{extraalphadata}, $self->{extratitledata}, $self->{extratitleyeardata} ]; } =head2 set_extrayeardata_for_key Saves extrayear field data for a key =cut sub set_extrayeardata_for_key { my ($self, $key, $ed) = @_; return unless defined($key); $self->{extrayeardata}{$key} = $ed; return; } =head2 set_extrayeardata Saves extrayear field data for all keys =cut sub set_extrayeardata { my ($self, $ed) = @_; $self->{extrayeardata} = $ed; return; } =head2 get_extrayeardata Gets the extrayear field data for a key =cut sub get_extrayeardata { my ($self, $key) = @_; return unless defined($key); return $self->{extrayeardata}{$key}; } =head2 set_extratitledata_for_key Saves extratitle field data for a key =cut sub set_extratitledata_for_key { my ($self, $key, $ed) = @_; return unless defined($key); $self->{extratitledata}{$key} = $ed; return; } =head2 set_extratitledata Saves extratitle field data for all keys =cut sub set_extratitledata { my ($self, $ed) = @_; $self->{extratitledata} = $ed; return; } =head2 get_extratitledata Gets the extratitle field data for a key =cut sub get_extratitledata { my ($self, $key) = @_; return unless defined($key); return $self->{extratitledata}{$key}; } =head2 set_extratitleyeardata_for_key Saves extratitleyear field data for a key =cut sub set_extratitleyeardata_for_key { my ($self, $key, $ed) = @_; return unless defined($key); $self->{extratitleyeardata}{$key} = $ed; return; } =head2 set_extratitleyeardata Saves extratitleyear field data for all keys =cut sub set_extratitleyeardata { my ($self, $ed) = @_; $self->{extratitleyeardata} = $ed; return; } =head2 get_extratitleyeardata Gets the extratitleyear field data for a key =cut sub get_extratitleyeardata { my ($self, $key) = @_; return unless defined($key); return $self->{extratitleyeardata}{$key}; } =head2 set_extraalphadata_for_key Saves extraalpha field data for a key =cut sub set_extraalphadata_for_key { my ($self, $key, $ed) = @_; return unless defined($key); $self->{extraalphadata}{$key} = $ed; return; } =head2 set_extraalphadata Saves extraalpha field data for all keys =cut sub set_extraalphadata { my ($self, $ed) = @_; $self->{extraalphadata} = $ed; return; } =head2 get_extraalphadata Gets the extraalpha field data for a key =cut sub get_extraalphadata { my ($self, $key) = @_; return unless defined($key); return $self->{extraalphadata}{$key}; } =head2 set_sortdata Saves sorting data in a list for a key =cut sub set_sortdata { my ($self, $key, $sd) = @_; return unless defined($key); $self->{sortdata}{$key} = $sd; return; } =head2 get_sortdata Gets the sorting data in a list for a key =cut sub get_sortdata { my ($self, $key) = @_; return unless defined($key); return $self->{sortdata}{$key}; } =head2 set_sortinitdata_for_key Saves sortinit data for a specific key =cut sub set_sortinitdata_for_key { my ($self, $key, $init, $inithash) = @_; return unless defined($key); $self->{sortinitdata}{$key} = {init => $init, inithash => $inithash}; return; } =head2 set_sortinitdata Saves sortinit data for all keys =cut sub set_sortinitdata { my ($self, $sid) = @_; $self->{sortinitdata} = $sid; return; } =head2 get_sortinit_for_key Gets the sortinit in a list for a key =cut sub get_sortinit_for_key { my ($self, $key) = @_; return unless defined($key); return $self->{sortinitdata}{$key}{init}; } =head2 get_sortinithash_for_key Gets the sortinit hash in a list for a key =cut sub get_sortinithash_for_key { my ($self, $key) = @_; return unless defined($key); return $self->{sortinitdata}{$key}{inithash}; } =head2 set_sortscheme Sets the sortscheme of a list =cut sub set_sortscheme { my $self = shift; my $sortscheme = shift; $self->{sortscheme} = $sortscheme; return; } =head2 get_sortscheme Gets the sortscheme of a list =cut sub get_sortscheme { my $self = shift; return $self->{sortscheme}; } =head2 add_filter Adds a filter to a list object =cut sub add_filter { my $self = shift; my ($filter) = @_; push @{$self->{filters}}, $filter; return; } =head2 get_filters Gets all filters for a list object =cut sub get_filters { my $self = shift; return $self->{filters}; } =head2 instantiate_entry Do any dynamic information replacement for information which varies in an entry between lists. This is information which needs to be output to the .bbl for an entry but which is a property of the sorting list and not the entry per se so it cannot be stored statically in the entry and must be pulled from the specific list when outputting the entry. Currently this means: * sortinit * sortinithash * extrayear * extraalpha * extratitle * extratitleyear =cut sub instantiate_entry { my $self = shift; my $entry = shift; my $key = shift; return '' unless $entry; my $entry_string = $$entry; # sortinit my $sinit = $self->get_sortinit_for_key($key); if (defined($sinit)) { my $str = "\\field{sortinit}{$sinit}"; $entry_string =~ s|SORTINIT|$str|gxms; } else {# might not be defined if sortscheme returns nothing at all $entry_string =~ s|SORTINIT||gxms; } # sortinithash my $sinithash = $self->get_sortinithash_for_key($key); if (defined($sinithash)) { my $str = "\\field{sortinithash}{$sinithash}"; $entry_string =~ s|SORTINITHASH|$str|gxms; } else {# might not be defined if sortscheme returns nothing at all $entry_string =~ s|SORTINITHASH||gxms; } # extrayear if (my $e = $self->get_extrayeardata($key)) { my $eys = " \\field{extrayear}{$e}\n"; $entry_string =~ s|^\s*EXTRAYEAR\n|$eys|gxms; } # extratitle if (my $e = $self->get_extratitledata($key)) { my $ets = " \\field{extratitle}{$e}\n"; $entry_string =~ s|^\s*EXTRATITLE\n|$ets|gxms; } # extratitle if (my $e = $self->get_extratitleyeardata($key)) { my $etys = " \\field{extratitleyear}{$e}\n"; $entry_string =~ s|^\s*EXTRATITLEYEAR\n|$etys|gxms; } # extraalpha if (my $e = $self->get_extraalphadata($key)) { my $eas = " \\field{extraalpha}{$e}\n"; $entry_string =~ s|^\s*EXTRAALPHA\n|$eas|gxms; } return $entry_string; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/SortLists.pm000444000765000024 471112667073765 20600 0ustar00philkimestaff000000000000package Biber::SortLists; use v5.16; use strict; use warnings; =encoding utf-8 =head1 NAME Biber::SortLists =head2 new Initialize a Biber::SortLists object =cut sub new { my ($class) = @_; my $self = bless {}, $class; return $self; } =head2 add_list Adds a section list to this section =cut sub add_list { my $self = shift; my $list = shift; push @{$self->{lists}}, $list; return; } =head2 get_lists Returns an array ref of all sort lists =cut sub get_lists { my $self = shift; return $self->{lists}; } =head2 get_lists_for_section Returns an array ref of all sort lists for a given section Using numeric equals as section identifiers are numbers =cut sub get_lists_for_section { my $self = shift; my $section = shift; my $lists = []; my $glist; foreach my $list (@{$self->{lists}}) { if ($list->get_section == $section) { push @$lists, $list; } } return $lists; } =head2 get_list Returns a specific list by section, name, type, sortscheme, sortnamekeyscheme =cut sub get_list { my ($self, $section, $name, $type, $ssn, $snksn) = @_; foreach my $list (@{$self->{lists}}) { return $list if ($list->get_name eq $name and $list->get_sortschemename eq $ssn and $list->get_sortnamekeyschemename eq $snksn and $list->get_type eq $type and $list->get_section == $section); } return undef; } =head2 has_lists_of_type_for_section Returns boolean saying whether there is a sort list for a section of a specified type =cut sub has_lists_of_type_for_section { my ($self, $section, $type) = @_; foreach my $list (@{$self->{lists}}) { if ($list->get_type eq $type and $list->get_section == $section) { return 1; } } return 0; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/UCollate.pm000444000765000024 605312667073765 20343 0ustar00philkimestaff000000000000package Biber::UCollate; use v5.16; use strict; use Carp; use Data::Dump; use parent qw(Unicode::Collate::Locale); my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::UCollate =head2 new Instantiate new Unicode::Collate::Locale object with some extra reporting checks. We need this also so that we can chain some things during sorting object construction. Without an object, we would need to call a regular subroutine but due to the special semantics of Schwartzian transforms, we need to chain all sorting elements so that they return a boolean value (see Biber.pm). This is much tidier with Foo->new()->change()->cmp than with something messy like "my $uc = create_uc_object; $uc->change()->cmp()" etc. =cut sub new { my $class = shift; my ($thislocale, %collopts) = @_; # Add tailoring locale for Unicode::Collate if ($thislocale and not $collopts{locale}) { $collopts{locale} = $thislocale; if ($collopts{table}) { my $t = delete $collopts{table}; $logger->info("Ignoring collation table '$t' as locale is set ($thislocale)"); } } # Remove locale from options as we need this to make the object my $coll_locale = delete $collopts{locale}; # Now create the collator object my $Collator = $class->SUPER::new(locale => $coll_locale) or $logger->logcarp("Problem creating Unicode::Collate::Locale object: $@"); # Fix the old "alternate" alias otherwise we have problems as U::C->change() always # returns the new "variable" option and we get confused. if (my $alt = delete $collopts{alternate}) { $collopts{variable} = $alt; } # Show the collation options when debugging $logger->debug('Collation options: ' . Data::Dump::pp(%collopts)); # Tailor the collation object and report differences from defaults for locale # Have to do this in ->change method as ->new can croak with conflicting tailoring # for locales which enforce certain tailorings my %coll_changed = $Collator->change( %collopts ); while (my ($k, $v) = each %coll_changed) { # If we are changing something that has no override tailoring in the locale, it # is undef in this hash and we don't care about such things next unless defined($coll_changed{$k}); if ($coll_changed{$k} ne $collopts{$k}) { $logger->info("Overriding locale '$coll_locale' defaults '$k = $v' with '$k = " . $collopts{$k} . "'"); } } return $Collator; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Utils.pm000444000765000024 6664312667073765 17766 0ustar00philkimestaff000000000000package Biber::Utils; use v5.16; use strict; use warnings; use re 'eval'; use parent qw(Exporter); use constant { EXIT_OK => 0, EXIT_ERROR => 2 }; use Carp; use Encode; use File::Find; use File::Spec; use IPC::Cmd qw( can_run ); use IPC::Run3; # This works with PAR::Packer and Windows. IPC::Run doesn't use Biber::Constants; use Biber::LaTeX::Recode; use Biber::Entry::Name; use Regexp::Common qw( balanced ); use Log::Log4perl qw(:no_extra_logdie_message); use Scalar::Util qw(looks_like_number); use Text::Roman qw(isroman roman2int); use Unicode::Normalize; use Unicode::GCString; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Utils - Various utility subs used in Biber =cut =head1 EXPORT All functions are exported by default. =cut our @EXPORT = qw{ locate_biber_file makenamesid makenameid stringify_hash normalise_string normalise_string_hash normalise_string_underscore normalise_string_sort normalise_string_label reduce_array remove_outer add_outer ucinit strip_nosort strip_noinit is_def is_undef is_def_and_notnull is_def_and_null is_undef_or_null is_notnull is_null normalise_utf8 inits join_name latex_recode_output filter_entry_options biber_error biber_warn ireplace imatch validate_biber_xml process_entry_options escape_label unescape_label biber_decode_utf8 out parse_date locale2bcp47 bcp472locale rangelen match_indices process_comment map_boolean parse_range maploop }; =head1 FUNCTIONS =head2 locate_biber_file Searches for a file by The exact path if the filename is absolute In the input_directory, if defined In the output_directory, if defined Relative to the current directory In the same directory as the control file Using kpsewhich, if available =cut sub locate_biber_file { my $filename = shift; my $filenamepath = $filename; # default if nothing else below applies my $foundfile; # If input_directory is set, perhaps the file can be found there so # construct a path to test later if (my $indir = Biber::Config->getoption('input_directory')) { $foundfile = File::Spec->catfile($indir, $filename); } # If output_directory is set, perhaps the file can be found there so # construct a path to test later elsif (my $outdir = Biber::Config->getoption('output_directory')) { $foundfile = File::Spec->catfile($outdir, $filename); } # Filename is absolute if (File::Spec->file_name_is_absolute($filename) and -e $filename) { return $filename; } # File is input_directory or output_directory if (defined($foundfile) and -e $foundfile) { return $foundfile; } # File is relative to cwd if (-e $filename) { return $filename; } # File is where control file lives if (my $cfp = Biber::Config->get_ctrlfile_path) { my ($ctlvolume, $ctldir, undef) = File::Spec->splitpath($cfp); if ($ctlvolume) { # add vol sep for windows if volume is set and there isn't one $ctlvolume .= ':' unless $ctlvolume =~ /:\z/; } if ($ctldir) { # add path sep if there isn't one $ctldir .= '/' unless $ctldir =~ /\/\z/; } my $path = "$ctlvolume$ctldir$filename"; return $path if -e $path; } # File is in kpse path if (can_run('kpsewhich')) { $logger->debug("Looking for file '$filename' via kpsewhich"); my $found; my $err; run3 [ 'kpsewhich', $filename ], \undef, \$found, \$err, { return_if_system_error => 1}; if ($?) { $logger->debug("kpsewhich returned error: $err ($!)"); } $logger->trace("kpsewhich returned '$found'"); if ($found) { $logger->debug("Found '$filename' via kpsewhich"); chomp $found; $found =~ s/\cM\z//xms; # kpsewhich in cygwin sometimes returns ^M at the end # filename can be UTF-8 and run3() isn't clever with UTF-8 return decode_utf8($found); } else { $logger->debug("Could not find '$filename' via kpsewhich"); } } return undef; } =head2 biber_warn Wrapper around various warnings bits and pieces Logs a warning, add warning to the list of .bbl warnings and optionally increments warning count in Biber object, if present =cut sub biber_warn { my ($warning, $entry) = @_; $logger->warn($warning); $entry->add_warning($warning) if $entry; $Biber::MASTER->{warnings}++; return; } =head2 biber_error Wrapper around error logging Forces an exit. =cut sub biber_error { my $error = shift; $logger->error($error); $Biber::MASTER->{errors}++; # exit unless user requested not to for errors unless (Biber::Config->getoption('nodieonerror')) { $Biber::MASTER->display_problems; exit EXIT_ERROR; } } =head2 makenamesid Given a Biber::Names object, return an underscore normalised concatenation of all of the full name strings. =cut sub makenamesid { my $names = shift; my @namestrings; foreach my $name (@{$names->names}) { push @namestrings, $name->get_namestring; } my $tmp = join ' ', @namestrings; return normalise_string_underscore($tmp); } =head2 makenameid Given a Biber::Name object, return an underscore normalised concatenation of the full name strings. =cut sub makenameid { my $name = shift; return normalise_string_underscore($name->get_namestring); } =head2 latex_recode_output Tries to convert UTF-8 to TeX macros in passed string =cut sub latex_recode_output { my $string = shift; return Biber::LaTeX::Recode::latex_encode($string); }; =head2 strip_noinit Removes elements which are not to be considered during initials generation in names =cut sub strip_noinit { my $string = shift; return '' unless $string; # Sanitise missing data return $string unless my $noinit = Biber::Config->getoption('noinit'); foreach my $opt (@$noinit) { my $re = $opt->{value}; $re = qr/$re/; $string =~ s/$re//gxms; } return $string; } =head2 strip_nosort Removes elements which are not to be used in sorting a name from a string =cut sub strip_nosort { my $string = shift; my $fieldname = shift; return '' unless $string; # Sanitise missing data return $string unless my $nosort = Biber::Config->getoption('nosort'); # Strip user-defined REs from string my $restrings; foreach my $nsopt (@$nosort) { # Specific fieldnames override types if (fc($nsopt->{name}) eq fc($fieldname)) { push @$restrings, $nsopt->{value}; } } unless ($restrings) { foreach my $nsopt (@$nosort) { next unless $nsopt->{name} =~ /\Atype_/xms; if ($NOSORT_TYPES{lc($nsopt->{name})}{lc($fieldname)}) { push @$restrings, $nsopt->{value}; } } } # If no nosort to do, just return string return $string unless $restrings; foreach my $re (@$restrings) { $re = qr/$re/; $string =~ s/$re//gxms; } return $string; } =head2 normalise_string_label Remove some things from a string for label generation. =cut sub normalise_string_label { my $str = shift; return '' unless $str; # Sanitise missing data my $nolabels = Biber::Config->getoption('nolabel'); $str =~ s/\\[A-Za-z]+//g; # remove latex macros (assuming they have only ASCII letters) # Replace ties with spaces or they will be lost $str =~ s/([^\\])~/$1 /g; # Foo~Bar -> Foo Bar foreach my $nolabel (@$nolabels) { my $nlopt = $nolabel->{value}; my $re = qr/$nlopt/; $str =~ s/$re//gxms; # remove nolabel items } $str =~ s/^\s+//; # Remove leading spaces $str =~ s/\s+$//; # Remove trailing spaces $str =~ s/\s+/ /g; # collapse spaces return $str; } =head2 normalise_string_sort Removes LaTeX macros, and all punctuation, symbols, separators and control characters, as well as leading and trailing whitespace for sorting strings. It also decodes LaTeX character macros into Unicode as this is always safe when normalising strings for sorting since they don't appear in the output. =cut sub normalise_string_sort { my $str = shift; my $fieldname = shift; return '' unless $str; # Sanitise missing data # First strip nosort REs $str = strip_nosort($str, $fieldname); # Then replace ties with spaces or they will be lost $str =~ s/([^\\])~/$1 /g; # Foo~Bar -> Foo Bar return normalise_string_common($str); } =head2 normalise_string Removes LaTeX macros, and all punctuation, symbols, separators and control characters, as well as leading and trailing whitespace for sorting strings. Only decodes LaTeX character macros into Unicode if output is UTF-8 =cut sub normalise_string { my $str = shift; return '' unless $str; # Sanitise missing data # First replace ties with spaces or they will be lost $str =~ s/([^\\])~/$1 /g; # Foo~Bar -> Foo Bar return normalise_string_common($str); } =head2 normalise_string_common Common bit for normalisation =cut sub normalise_string_common { my $str = shift; $str =~ s/\\[A-Za-z]+//g; # remove latex macros (assuming they have only ASCII letters) $str =~ s/[\p{P}\p{S}\p{C}]+//g; # remove punctuation, symbols, separator and control $str =~ s/^\s+//; # Remove leading spaces $str =~ s/\s+$//; # Remove trailing spaces $str =~ s/\s+/ /g; # collapse spaces return $str; } =head2 normalise_string_hash Normalise strings used for hashes. We collapse LaTeX macros into a vestige so that hashes are unique between things like: Smith {\v S}mith we replace macros like this to preserve their vestiges: \v S -> v: \" -> 34: =cut sub normalise_string_hash { my $str = shift; return '' unless $str; # Sanitise missing data $str =~ s/\\(\p{L}+)\s*/$1:/g; # remove tex macros $str =~ s/\\([^\p{L}])\s*/ord($1).':'/ge; # remove accent macros like \"a $str =~ s/[{}~\.\s]+//g; # Remove brackes, ties, dots, spaces return $str; } =head2 normalise_string_underscore Like normalise_string, but also substitutes ~ and whitespace with underscore. =cut sub normalise_string_underscore { my $str = shift; return '' unless $str; # Sanitise missing data $str =~ s/([^\\])~/$1 /g; # Foo~Bar -> Foo Bar $str = normalise_string($str); $str =~ s/\s+/_/g; return $str; } =head2 escape_label Escapes a few special character which might be used in labels =cut sub escape_label { my $str = shift; return '' unless $str; # Sanitise missing data $str =~ s/([_\^\$\#\%\&])/\\$1/g; $str =~ s/~/{\\textasciitilde}/g; $str =~ s/>/{\\textgreater}/g; $str =~ s//g; $str =~ s/\{\\textless\}/ 'string' but not '{string} {string}' -> 'string} {string' =cut sub remove_outer { my $str = shift; return $str if $str =~ m/}\s*{/; $str =~ s/^{(\X+)}$/$1/; return $str; } =head2 add_outer Add surrounding curly brackets: 'string' -> '{string}' =cut sub add_outer { my $str = shift; return '{' . $str . '}'; } =head2 ucinit upper case of initial letters in a string =cut sub ucinit { my $str = shift; $str = lc($str); $str =~ s/\b(\p{Ll})/\u$1/g; return $str; } =head2 is_undef Checks for undefness of arbitrary things, including composite method chain calls which don't reliably work with defined() (see perldoc for defined()) This works because we are just testing the value passed to this sub. So, for example, this is randomly unreliable even if the resulting value of the arg to defined() is "undef": defined($thing->method($arg)->method) wheras: is_undef($thing->method($arg)->method) works since we only test the return value of all the methods with defined() =cut sub is_undef { my $val = shift; return defined($val) ? 0 : 1; } =head2 is_def Checks for definedness in the same way as is_undef() =cut sub is_def { my $val = shift; return defined($val) ? 1 : 0; } =head2 is_undef_or_null Checks for undef or nullness (see is_undef() above) =cut sub is_undef_or_null { my $val = shift; return 1 if is_undef($val); return $val ? 0 : 1; } =head2 is_def_and_notnull Checks for def and unnullness (see is_undef() above) =cut sub is_def_and_notnull { my $arg = shift; if (defined($arg) and is_notnull($arg)) { return 1; } else { return 0; } } =head2 is_def_and_null Checks for def and nullness (see is_undef() above) =cut sub is_def_and_null { my $arg = shift; if (defined($arg) and is_null($arg)) { return 1; } else { return 0; } } =head2 is_null Checks for nullness =cut sub is_null { my $arg = shift; return is_notnull($arg) ? 0 : 1; } =head2 is_notnull Checks for notnullness =cut sub is_notnull { my $arg = shift; return undef unless defined($arg); my $st = is_notnull_scalar($arg); if (defined($st) and $st) { return 1; } my $at = is_notnull_array($arg); if (defined($at) and $at) { return 1; } my $ht = is_notnull_hash($arg); if (defined($ht) and $ht) { return 1; } my $ot = is_notnull_object($arg); if (defined($ot) and $ot) { return 1; } return 0; } =head2 is_notnull_scalar Checks for notnullness of a scalar =cut sub is_notnull_scalar { my $arg = shift; unless (ref \$arg eq 'SCALAR') { return undef; } return $arg ne '' ? 1 : 0; } =head2 is_notnull_array Checks for notnullness of an array (passed by ref) =cut sub is_notnull_array { my $arg = shift; unless (ref $arg eq 'ARRAY') { return undef; } my @arr = @$arg; return $#arr > -1 ? 1 : 0; } =head2 is_notnull_hash Checks for notnullness of an hash (passed by ref) =cut sub is_notnull_hash { my $arg = shift; unless (ref $arg eq 'HASH') { return undef; } my @arr = keys %$arg; return $#arr > -1 ? 1 : 0; } =head2 is_notnull_object Checks for notnullness of an object (passed by ref) =cut sub is_notnull_object { my $arg = shift; unless (ref($arg) =~ m/\ABiber::/xms) { return undef; } return $arg->notnull ? 1 : 0; } =head2 stringify_hash Turns a hash into a string of keys and values =cut sub stringify_hash { my $hashref = shift; my $string; while (my ($k,$v) = each %$hashref) { $string .= "$k => $v, "; } # Take off the trailing comma and space chop $string; chop $string; return $string; } =head2 normalise_utf8 Normalise any UTF-8 encoding string immediately to exactly what we want We want the strict perl utf8 "UTF-8" =cut sub normalise_utf8 { if (defined(Biber::Config->getoption('input_encoding')) and Biber::Config->getoption('input_encoding') =~ m/\Autf-?8\z/xmsi) { Biber::Config->setoption('input_encoding', 'UTF-8'); } if (defined(Biber::Config->getoption('output_encoding')) and Biber::Config->getoption('output_encoding') =~ m/\Autf-?8\z/xmsi) { Biber::Config->setoption('output_encoding', 'UTF-8'); } } =head2 inits We turn the initials into an array so we can be flexible with them later The tie here is used only so we know what to split on. We don't want to make any typesetting decisions in Biber, like what to use to join initials so on output to the .bbl, we only use BibLaTeX macros. =cut sub inits { my $istring = shift; return [ split(/(?{$map}; } } } return $roptions; } =head2 imatch Do an interpolating (neg)match using a match RE and a string passed in as variables Using /g on matches so that $1,$2 etc. can be populated from repeated matches of same capture group as well as different groups =cut sub imatch { my ($value, $val_match, $negmatch) = @_; return 0 unless $val_match; $val_match = qr/$val_match/; if ($negmatch) {# "!~" doesn't work here as we need an array returned return $value =~ m/$val_match/xmsg ? () : (1); } else { return $value =~ m/$val_match/xmsg; } } =head2 ireplace Do an interpolating match/replace using a match RE, replacement RE and string passed in as variables =cut sub ireplace { my ($value, $val_match, $val_replace) = @_; return $value unless $val_match; $val_match = qr/$val_match/; # Tricky quoting because of later evals $val_replace = '"' . $val_replace . '"'; $value =~ s/$val_match/$val_replace/eegxms; return $value; } =head2 validate_biber_xml Validate a biber/biblatex XML metadata file against an RNG XML schema =cut sub validate_biber_xml { my ($file, $type, $prefix, $schema) = @_; require XML::LibXML; # Set up XML parser my $xmlparser = XML::LibXML->new(); $xmlparser->line_numbers(1); # line numbers for more informative errors # Set up schema my $xmlschema; # Deal with the strange world of Par::Packer paths # We might be running inside a PAR executable and @INC is a bit odd in this case # Specifically, "Biber.pm" in @INC might resolve to an internal jumbled name # nowhere near to these files. You know what I mean if you've dealt with pp unless ($schema) { # we assume that unspecified schema files are in the same dir as Biber.pm: (my $vol, my $biber_path, undef) = File::Spec->splitpath( $INC{"Biber.pm"} ); $biber_path =~ s/\/$//; # splitpath sometimes leaves a trailing '/' if ($biber_path =~ m|/par\-| and $biber_path !~ m|/inc|) { # a mangled PAR @INC path $schema = File::Spec->catpath($vol, "$biber_path/inc/lib/Biber", "${type}.rng"); } else { $schema = File::Spec->catpath($vol, "$biber_path/Biber", "${type}.rng"); } } if (-e $schema) { $xmlschema = XML::LibXML::RelaxNG->new( location => $schema ) } else { biber_warn("Cannot find XML::LibXML::RelaxNG schema '$schema'. Skipping validation : $!"); return; } # Parse file my $doc = $xmlparser->load_xml(location => $file); # XPath context if ($prefix) { my $xpc = XML::LibXML::XPathContext->new($doc); $xpc->registerNs($type, $prefix); } # Validate against schema. Dies if it fails. eval { $xmlschema->validate($doc) }; if (ref($@)) { $logger->debug( $@->dump() ); biber_error("'$file' failed to validate against schema '$schema'"); } elsif ($@) { biber_error("'$file' failed to validate against schema '$schema'\n$@"); } else { $logger->info("'$file' validates against schema '$schema'"); } undef $xmlparser; } =head2 map_boolean Convert booleans between strings and numbers. Because standard XML "boolean" datatype considers "true" and "1" the same etc. =cut sub map_boolean { my $b = lc(shift); my $dir = shift; my %map = (true => 1, false => 0, ); if ($dir eq 'tonum') { return $b if looks_like_number($b); return $map{$b}; } elsif ($dir eq 'tostring') { return $b if not looks_like_number($b); %map = reverse %map; return $map{$b}; } } =head2 process_entry_options Set per-entry options =cut sub process_entry_options { my $citekey = shift; my $options = shift; return unless $options; # Just in case it's null foreach (@$options) { s/\s+=\s+/=/g; # get rid of spaces around any "=" m/^([^=]+)(=?)(.+)?$/; if ($2) { if ($CONFIG_OPTTYPE_BIBLATEX{lc($1)} and $CONFIG_OPTTYPE_BIBLATEX{lc($1)} eq 'boolean') { _expand_option($1, map_boolean($3, 'tonum'), $citekey); } else { _expand_option($1, $3, $citekey); } } else { _expand_option($1, 1, $citekey); } } return; } sub _expand_option { my ($opt, $val, $citekey) = @_; my $cfopt = $CONFIG_BIBLATEX_ENTRY_OPTIONS{lc($opt)}{INPUT}; # Standard option if (not defined($cfopt)) { Biber::Config->setblxoption($opt, $val, 'ENTRY', $citekey); } # Set all split options to same value as parent elsif (ref($cfopt) eq 'ARRAY') { foreach my $k (@$cfopt) { Biber::Config->setblxoption($k, $val, 'ENTRY', $citekey); } } # Specify values per all splits elsif (ref($cfopt) eq 'HASH') { foreach my $k (keys %$cfopt) { Biber::Config->setblxoption($k, $cfopt->{$k}, 'ENTRY', $citekey); } } return; } =head2 parse_date Simple parse of ISO8601 dates because not decent module exists for this that doesn't default the missing components =cut sub parse_date { my $date = shift; # We are not validating dates here, just syntax parsing my $date_re = qr/(\d{4}) # year (?:-(\d{2}))? # month (?:-(\d{2}))? # day /xms; return $date =~ m|\A$date_re(/)?(?:$date_re)?\z|xms; } =head2 biber_decode_utf8 Perform NFD form conversion as well as UTF-8 conversion. Used to normalize bibtex input as the T::B interface doesn't allow a neat whole file slurping. =cut sub biber_decode_utf8 { return NFD(decode_utf8(shift));# Unicode NFD boundary } =head2 out Output to target. Outputs NFC UTF-8 if output is UTF-8 =cut sub out { my ($fh, $string) = @_; print $fh NFC($string);# Unicode NFC boundary } =head2 process_comment Fix up some problems with comments after being processed by btparse =cut sub process_comment { my $comment = shift; # Fix up structured Jabref comments by re-instating line breaks. Hack. if ($comment =~ m/jabref-meta:/) { $comment =~ s/([:;])\s(\d)/$1\n$2/xmsg; $comment =~ s/\z/\n/xms; } return $comment; } =head2 locale2bcp47 Map babel/polyglossia language options to a sensible CLDR (bcp47) locale default Return input string if there is no mapping =cut sub locale2bcp47 { my $localestr = shift; return $localestr unless $localestr; return $LOCALE_MAP{$localestr} || $localestr; } =head2 bcp472locale Map CLDR (bcp47) locale to a babel/polyglossia locale Return input string if there is no mapping =cut sub bcp472locale { my $localestr = shift; return $localestr unless $localestr; return $LOCALE_MAP_R{$localestr} || $localestr; } =head2 rangelen Calculate the length of a range field Range fields are an array ref of two-element array refs [range_start, range_end] range_end can be be empty for open-ended range or undef Deals with Unicode and ASCII roman numerals via the magic of Unicode NFKD form m-n -> [m, n] m -> [m, undef] m- -> [m, ''] -n -> ['', n] - -> ['', undef] =cut sub rangelen { my $rf = shift; my $rl = 0; foreach my $f (@$rf) { my $m = $f->[0]; my $n = $f->[1]; # m is something that's just numerals (decimal Unicode roman or ASCII roman) if ($m and $m =~ /^[\p{Nd}\p{Nl}iIvVxXlLcCdDmM]+$/) { # This magically decomposes Unicode roman chars into ASCII compat $m = NFKD($m); # n is something that's just numerals (decimal Unicode roman or ASCII roman) if ($n and $n =~ /^[\p{Nd}\p{Nl}iIvVxXlLcCdDmM]+$/) { # This magically decomposes Unicode roman chars into ASCII compat $n = NFKD($n); $m = isroman($m) ? roman2int($m) : $m; $n = isroman($n) ? roman2int($n) : $n; # If still not an int at this point, it's probably some non-int page number that # isn't a roman numeral so give up unless (looks_like_number($n) and looks_like_number($m)) { return -1; } # Deal with not so explicit ranges like 22-4 or 135-38 # Done by turning numbers into string arrays, reversing and then filling in blanks if ($n < $m) { my @m = reverse split(//,$m); my @n = reverse split(//,$n); for (my $i=0;$i<=$#m;$i++) { next if $n[$i]; $n[$i] = $m[$i]; } $n = join('', reverse @n); } $rl += (($n - $m) + 1); } # n is '' elsif (defined($n)) { # open-ended range can't be calculated, just return -1 return -1; } # n is undef, single item else { $rl += 1; } } else { # open-ended range can't be calculated, just return -1 return -1; } } return $rl; } =head2 match_indices Return array ref of array refs of matches and start indices of matches for provided array of compiled regexps into string =cut sub match_indices { my ($regexes, $string) = @_; my $ret; my $relen = 0; foreach my $regex (@$regexes) { my $len = 0; while ($string =~ /$regex/g) { my $gcs = Unicode::GCString->new($string)->substr($-[0], $+[0]-$-[0]); push @$ret, [ $gcs->as_string, $-[0] - $relen ]; $len = $gcs->length; } $relen += $len; } return $ret } =head2 parse_range Parses a range of values into a two-value array ref. Ranges with no starting value default to "1" Ranges can be open-ended and it's up to surrounding code to interpret this Ranges can be single figures which is shorthand for 1-x =cut sub parse_range { my $rs = shift; $rs =~ m/\A\s*(\P{Pd}+)?\s*(\p{Pd})*\s*(\P{Pd}+)?\s*\z/xms; if ($2) { return [$1 // 1, $3]; } else { return [1, $1]; } } =head2 maploop Replace loop markers with values. =cut sub maploop { my ($string, $maploop, $mapuniq) = @_; return $string if not defined($string); return $string unless ($maploop or $mapuniq); $string =~ s/\$MAPLOOP/$maploop/ge if $maploop; $string =~ s/\$MAPUNIQ/$mapuniq/ge if $mapuniq; return $string; } 1; __END__ =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Entry000755000765000024 012667073765 17235 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/Entry/Name.pm000444000765000024 2163112667073765 20633 0ustar00philkimestaff000000000000package Biber::Entry::Name; use v5.16; use strict; use warnings; use parent qw(Class::Accessor); __PACKAGE__->follow_best_practice; use Regexp::Common qw( balanced ); use Biber::Config; use Biber::Constants; use Biber::Utils; use Data::Dump qw( pp ); use Log::Log4perl qw( :no_extra_logdie_message ); use List::Util qw( first ); use Unicode::Normalize; no autovivification; my $logger = Log::Log4perl::get_logger('main'); # Names of simple package accessor attributes __PACKAGE__->mk_accessors(qw ( hash index namestring nameinitstring )); =encoding utf-8 =head1 NAME Biber::Entry::Name =head2 new Initialise a Biber::Entry::Name object, optionally with key=>value arguments. =cut sub new { my ($class, %params) = @_; my $dm = Biber::Config->get_dm; if (%params) { my $name = {}; foreach my $attr (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAME}}, 'namestring', 'nameinitstring', 'strip', $dm->get_constant_value('nameparts')) { if (exists $params{$attr}) { $name->{$attr} = $params{$attr}; } } return bless $name, $class; } else { return bless {}, $class; } } =head2 TO_JSON Serialiser for JSON::XS::encode =cut sub TO_JSON { my $self = shift; my $json; while (my ($k, $v) = each(%{$self})) { $json->{$k} = $v; } return $json; } =head2 notnull Test for an empty object =cut sub notnull { my $self = shift; my @arr = keys %$self; return $#arr > -1 ? 1 : 0; } =head2 was_stripped Return boolean to tell if the passed field had braces stripped from the original =cut sub was_stripped { my ($self, $part) = @_; return exists($self->{strip}) ? $self->{strip}{$part} : undef; } =head2 set_uniquename Set uniquename for a visible Biber::Entry::Name object Sets global flag to say that some uniquename value has changed =cut sub set_uniquename { my ($self, $uniquename) = @_; my $currval = $self->{uniquename}; # Set modified flag to positive if we change something if (not defined($currval) or $currval != $uniquename) { Biber::Config->set_unul_changed(1); } $logger->trace('Setting uniquename for "' . $self->get_namestring . '" to ' . $uniquename); $self->{uniquename} = $uniquename; return; } =head2 set_uniquename_all Set uniquename for a Biber::Entry::Name object =cut sub set_uniquename_all { my ($self, $uniquename) = @_; $logger->trace('Setting uniquename_all for "' . $self->get_namestring . '" to ' . $uniquename); $self->{uniquename_all} = $uniquename; return; } =head2 get_uniquename Get uniquename for a visible Biber::Entry::Name object =cut sub get_uniquename { my $self = shift; return $self->{uniquename}; } =head2 get_uniquename_all Get uniquename for a Biber::Entry::Name object =cut sub get_uniquename_all { my $self = shift; return $self->{uniquename_all}; } =head2 reset_uniquename Reset uniquename for a Biber::Entry::Name object =cut sub reset_uniquename { my $self = shift; $self->{uniquename} = 0; return; } =head2 set_minimal_info Set the string of family names and string of fullnames Used to track uniquename=5 or 6 =cut sub set_minimal_info { my ($self, $lns) = @_; $self->{familynames_string} = $lns; return; } =head2 get_minimal_info Get the name context used to track uniquename=5 or 6 =cut sub get_minimal_info { my $self = shift; return $self->{familynames_string}; } =head2 get_namepart Get a namepart by passed name =cut sub get_namepart { my ($self, $namepart) = @_; return $self->{$namepart}{string}; } =head2 set_namepart Set a namepart by passed name =cut sub set_namepart { my ($self, $namepart, $val) = @_; $self->{$namepart}{string} = $val; return; } =head2 get_namepart_initial Get a namepart initial by passed name =cut sub get_namepart_initial { my ($self, $namepart) = @_; return $self->{$namepart}{initial}; } =head2 set_namepart_initial Set a namepart initial by passed name =cut sub set_namepart_initial { my ($self, $namepart, $val) = @_; $self->{$namepart}{initial} = $val; return; } =head2 name_to_biblatexml { Create biblatexml data for a name =cut sub name_to_biblatexml { my $self = shift; my $xml = shift; my $out = shift; my $xml_prefix = $out->{xml_prefix}; my @attrs; # Add per-name options foreach my $pnoname (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAME}}) { if (defined($self->${\"get_$pnoname"})) { my $pno = $self->${\"get_$pnoname"}; if ($CONFIG_OPTTYPE_BIBLATEX{lc($pnoname)} and $CONFIG_OPTTYPE_BIBLATEX{lc($pnoname)} eq 'boolean') { push @attrs, ($pnoname => Biber::Utils::map_boolean($pno, 'tostring')); } else { push @attrs, ($pnoname => $pno); } } } $xml->startTag([$xml_prefix, 'name'], @attrs); # family name $self->name_part_to_bltxml($xml, $xml_prefix, 'family'); # given name $self->name_part_to_bltxml($xml, $xml_prefix, 'given'); # prefix $self->name_part_to_bltxml($xml, $xml_prefix, 'prefix'); # suffix $self->name_part_to_bltxml($xml, $xml_prefix, 'suffix'); $xml->endTag(); # Name } =head2 name_part_to_bltxml Return BibLaTeXML data for a name =cut sub name_part_to_bltxml { my ($self, $xml, $xml_prefix, $npn) = @_; my $np = $self->get_namepart($npn); my $nip = $self->get_namepart_initial($npn); if ($np) { my $parts = [split(/[\s~]/, $np)]; # Compound name part if ($#$parts > 0) { $xml->startTag([$xml_prefix, 'namepart'], type => $npn); for (my $i=0;$i <= $#$parts;$i++) { if (my $init = $nip->[$i]) { $xml->startTag([$xml_prefix, 'namepart'], initial => $init); } else { $xml->startTag([$xml_prefix, 'namepart']); } $xml->characters(NFC($parts->[$i])); $xml->endTag(); # namepart } $xml->endTag(); # namepart } else { # simple name part if (my $init = $nip->[0]) { $xml->startTag([$xml_prefix, 'namepart'], type => $npn, initial => $init); } else { $xml->startTag([$xml_prefix, 'namepart']); } $xml->characters(NFC($parts->[0])); $xml->endTag(); # namepart } } } =head2 name_to_bbl Return bbl data for a name =cut sub name_to_bbl { my $self = shift; my $dm = Biber::Config->get_dm; my @pno; # per-name options my $pno; # per-name options final string my $namestring; my @namestrings; foreach my $np ($dm->get_constant_value('nameparts')) {# list type so returns list my $npc; my $npci; if ($npc = $self->get_namepart($np)) { $npc = Biber::Utils::join_name($npc); if ($self->was_stripped($np)) { $npc = Biber::Utils::add_outer($npc); } $npci = join('\bibinitperiod\bibinitdelim ', @{$self->get_namepart_initial($np)}) . '\bibinitperiod'; $npci =~ s/\p{Pd}/\\bibinithyphendelim /gxms; } # Some of the subs above can result in these being undef so make sure there is an empty # string instead of undef so that interpolation below doesn't produce warnings $npc //= ''; $npci //= ''; if ($npc) { push @namestrings, " $np={$npc}", " ${np}_i={$npci}"; } } # Generate uniquename if uniquename is requested if (defined($self->get_uniquename)) { push @pno, 'uniquename=' . $self->get_uniquename; } # Add per-name options foreach my $pnoname (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAME}}) { if (defined($self->${\"get_$pnoname"})) { my $pno = $self->${\"get_$pnoname"}; if ($CONFIG_OPTTYPE_BIBLATEX{lc($pnoname)} and $CONFIG_OPTTYPE_BIBLATEX{lc($pnoname)} eq 'boolean') { push @pno, "$pnoname=" . Biber::Utils::map_boolean($pno, 'tostring'); } else { push @pno, "$pnoname=$pno"; } } } # Add the name hash to the options push @pno, 'hash=' . $self->get_hash; $pno = join(',', @pno); $namestring = " {{$pno}{\%\n"; $namestring .= join(",\n", @namestrings); $namestring .= "}}%\n"; return $namestring; } =head2 dump Dump Biber::Entry::Name object =cut sub dump { my $self = shift; return pp($self); } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Entry/Names.pm000444000765000024 1625012667073765 21017 0ustar00philkimestaff000000000000package Biber::Entry::Names; use v5.16; use strict; use warnings; use parent qw(Class::Accessor); __PACKAGE__->follow_best_practice; no autovivification; use Data::Dump; use Biber::Config; use Log::Log4perl qw( :no_extra_logdie_message ); my $logger = Log::Log4perl::get_logger('main'); # Names of simple package accessor attributes __PACKAGE__->mk_accessors(qw ( visible_alpha visible_cite visible_bib )); =encoding utf-8 =head1 NAME Biber::Entry::Names =head2 new Initialize a Biber::Entry::Names object =cut sub new { my $class = shift; return bless {namelist => []}, $class; } =head2 TO_JSON Serialiser for JSON::XS::encode =cut # sub TO_JSON { # my $self = shift; # foreach my $n (@$self){ # $json->{$k} = $v; # } # return [ map {$_} @$self ]; # } =head2 notnull Test for an empty object =cut sub notnull { my $self = shift; my @arr = @{$self->{namelist}}; return $#arr > -1 ? 1 : 0; } =head2 names Return ref to array of all Biber::Entry::Name objects in object =cut sub names { my $self = shift; return $self->{namelist}; } =head2 reset_uniquelist Reset uniquelist to undef for a Biber::Entry::Name object =cut sub reset_uniquelist { my $self = shift; delete $self->{uniquelist}; return; } =head2 set_uniquelist Add a uniquelist count to the Biber::Entry::Names object Sets global flag to say that some uniquelist value has changed =cut sub set_uniquelist { my $self = shift; my ($namelist, $maxcn, $mincn) = @_; my $uniquelist = $self->count_uniquelist($namelist); my $num_names = $self->count_names; my $currval = $self->{uniquelist}; # Set modified flag to positive if we changed something if (not defined($currval) or $currval != $uniquelist) { Biber::Config->set_unul_changed(1); } # Special case $uniquelist <=1 is meaningless return if $uniquelist <= 1; # Don't set uniquelist unless the list is longer than maxcitenames as it was therefore # never truncated to mincitenames in the first place and uniquelist is a "local mincitenames" return unless $self->count_names > $maxcn; # No disambiguation needed if uniquelist is <= mincitenames as this makes no sense # since it implies that disambiguation beyond mincitenames was needed. # This doesn't apply when the list length is mincitenames as maxmanes therefore # (since it can't be less than mincitenames) could also be the same as the list length # and this is a special case where we need to preserve uniquelist (see comments in # create_uniquelist_info()) # $uniquelist cannot be undef or 0 either since every list occurs at least once. # This guarantees that uniquelist, when set, is >1 because mincitenames cannot # be <1 return if $uniquelist <= $mincn and not $mincn == $self->count_names; # Special case. # No point disambiguating with uniquelist lists which have the same count # for the complete list as this means they are the same list. So, if this # is the case, don't set uniquelist at all. BUT, only do this if there is nothing # else which these identical lists need disambiguating from: # # * Assume last index of list is x # * Must not be any other list identical apart from position x # * Must not be any other list identical up to position x but also longer return if ( # if final count > 1 (identical lists) Biber::Config->get_uniquelistcount_final($namelist) > 1 and # nothing differs from $namelist in last place not Biber::Config->list_differs_last($namelist) and # nothing else is the same to last position but is longer not Biber::Config->list_differs_superset($namelist) ); # If there are more names than uniquelist, reduce it by one unless # there is another list which differs at uniquelist and is at least as long # so we get: # # AAA and BBB and CCC # AAA and BBB and CCC et al # # instead of # # AAA and BBB and CCC # AAA and BBB and CCC and DDD et al # # BUT, we also want # # AAA and BBB and CCC # AAA and BBB and CCC and DDD et al # AAA and BBB and CCC and EEE et al if ($num_names > $uniquelist and not Biber::Config->list_differs_nth($namelist, $uniquelist)) { $uniquelist--; } $self->{uniquelist} = $uniquelist; return; } =head2 get_uniquelist Get the uniquelist count from the Biber::Entry::Names object =cut sub get_uniquelist { my $self = shift; return $self->{uniquelist}; } =head2 count_uniquelist Count the names in a string used to determine uniquelist. =cut sub count_uniquelist { my $self = shift; my $namelist = shift; return $#$namelist + 1; } =head2 add_name Add a Biber::Entry::Name object to the Biber::Entry::Names object =cut sub add_name { my $self = shift; my $name_obj = shift; push @{$self->{namelist}}, $name_obj; $name_obj->set_index($#{$self->{namelist}} + 1); return; } =head2 set_morenames Sets a flag to say that we had a "and others" in the data =cut sub set_morenames { my $self = shift; $self->{morenames} = 1; return; } =head2 get_morenames Gets the morenames flag =cut sub get_morenames { my $self = shift; return $self->{morenames} ? 1 : 0; } =head2 count_names Returns the number of Biber::Entry::Name objects in the object =cut sub count_names { my $self = shift; return scalar @{$self->{namelist}}; } =head2 nth_name Returns the nth Biber::Entry::Name object in the object or the last one if n > total names =cut sub nth_name { my $self = shift; my $n = shift; my $size = @{$self->{namelist}}; return $self->{namelist}[$n > $size ? $size-1 : $n-1]; } =head2 first_n_names Returns an array ref of Biber::Entry::Name objects containing only the first n Biber::Entry::Name objects or all names if n > total names =cut sub first_n_names { my $self = shift; my $n = shift; my $size = @{$self->{namelist}}; return [ @{$self->{namelist}}[0 .. ($n > $size ? $size-1 : $n-1)] ]; } =head2 del_last_name Deletes the last Biber::Entry::Name object in the object =cut sub del_last_name { my $self = shift; pop(@{$self->{namelist}}); # Don't want the return value of this! return; } =head2 last_name Returns the last Biber::Entry::Name object in the object =cut sub last_name { my $self = shift; return $self->{namelist}[-1]; } =head2 dump Dump a Biber::Entry::Names object for debugging purposes =cut sub dump { my $self = shift; dd($self); return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Input000755000765000024 012667073765 17233 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/Input/file000755000765000024 012667073765 20152 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/Input/file/biblatexml.pm000444000765000024 13616512667073765 23044 0ustar00philkimestaff000000000000package Biber::Input::file::biblatexml; use v5.16; use strict; use warnings; use Carp; use Biber::Constants; use Biber::DataModel; use Biber::Entries; use Biber::Entry; use Biber::Entry::Names; use Biber::Entry::Name; use Biber::Sections; use Biber::Section; use Biber::Utils; use Biber::Config; use Data::Uniqid qw ( suniqid ); use Encode; use File::Spec; use File::Slurp; use File::Temp; use Log::Log4perl qw(:no_extra_logdie_message); use List::AllUtils qw( uniq first ); use XML::LibXML; use XML::LibXML::Simple; use Data::Dump qw(dump); use Unicode::Normalize; use Unicode::GCString; use URI; my $logger = Log::Log4perl::get_logger('main'); my $orig_key_order = {}; my $BIBLATEXML_NAMESPACE_URI = 'http://biblatex-biber.sourceforge.net/biblatexml'; my $NS = 'bltx'; # Determine handlers from data model my $dm = Biber::Config->get_dm; my $handlers = { 'CUSTOM' => {'related' => \&_related}, 'field' => { 'default' => { 'code' => \&_literal, 'date' => \&_date, 'entrykey' => \&_literal, 'integer' => \&_literal, 'key' => \&_literal, 'literal' => \&_literal, 'range' => \&_range, 'verbatim' => \&_literal, 'uri' => \&_uri }, 'xsv' => { 'entrykey' => \&_xsv, 'keyword' => \&_xsv, 'option' => \&_xsv, } }, 'list' => { 'default' => { 'entrykey' => \&_list, 'key' => \&_list, 'literal' => \&_list, 'name' => \&_name } } }; =head2 extract_entries Main data extraction routine. Accepts a data source identifier (filename in this case), preprocesses the file and then looks for the passed keys, creating entries when it finds them and passes out an array of keys it didn't find. =cut sub extract_entries { my ($source, $keys) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $bibentries = $section->bibentries; my $filename; my @rkeys = @$keys; my $tf; # Up here so that the temp file has enough scope to survive until we've # used it $logger->trace("Entering extract_entries() in driver 'biblatexml'"); # Get a reference to the correct sourcemap sections, if they exist my $smaps = []; # Maps are applied in order USER->STYLE->DRIVER if (defined(Biber::Config->getoption('sourcemap'))) { # User maps if (my $m = first {$_->{datatype} eq 'biblatexml' and $_->{level} eq 'user' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Style maps if (my $m = first {$_->{datatype} eq 'biblatexml' and $_->{level} eq 'style' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Driver default maps if (my $m = first {$_->{datatype} eq 'biblatexml' and $_->{level} eq 'driver'} @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } } # If it's a remote data file, fetch it first if ($source =~ m/\A(?:http|ftp)(s?):\/\//xms) { $logger->info("Data source '$source' is a remote .xml - fetching ..."); if (my $cf = $REMOTE_MAP{$source}) { $logger->info("Found '$source' in remote source cache"); $filename = $cf; } else { if ($1) { # HTTPS # use IO::Socket::SSL qw(debug99); # useful for debugging SSL issues # We have to explicitly set the cert path because otherwise the https module # can't find the .pem when PAR::Packer'ed # Have to explicitly try to require Mozilla::CA here to get it into %INC below # It may, however, have been removed by some biber unpacked dists if (not exists($ENV{PERL_LWP_SSL_CA_FILE}) and not exists($ENV{PERL_LWP_SSL_CA_PATH}) and not defined(Biber::Config->getoption('ssl-nointernalca')) and eval {require Mozilla::CA}) { # we assume that the default CA file is in .../Mozilla/CA/cacert.pem (my $vol, my $dir, undef) = File::Spec->splitpath( $INC{"Mozilla/CA.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' $ENV{PERL_LWP_SSL_CA_FILE} = File::Spec->catpath($vol, "$dir/CA", 'cacert.pem'); } # fallbacks for, e.g., linux unless (exists($ENV{PERL_LWP_SSL_CA_FILE})) { foreach my $ca_bundle (qw{ /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem }) { next if ! -e $ca_bundle; $ENV{PERL_LWP_SSL_CA_FILE} = $ca_bundle; last; } foreach my $ca_path (qw{ /etc/ssl/certs/ /etc/pki/tls/ }) { next if ! -d $ca_path; $ENV{PERL_LWP_SSL_CA_PATH} = $ca_path; last; } } if (defined(Biber::Config->getoption('ssl-noverify-host'))) { $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; } require LWP::Protocol::https; } require LWP::Simple; $tf = File::Temp->new(TEMPLATE => 'biber_remote_data_source_XXXXX', DIR => $Biber::MASTER->biber_tempdir, SUFFIX => '.xml'); unless (LWP::Simple::is_success(LWP::Simple::getstore($filename, $tf->filename))) { biber_error("Could not fetch file '$filename'"); } $filename = $tf->filename; # cache any remote so it persists and so we don't fetch it again $REMOTE_MAP{$source} = $filename; } } else { # Need to get the filename so we increment # the filename count for preambles at the bottom of this sub my $trying_filename = $source; unless ($filename = locate_biber_file($source)) { biber_error("Cannot find file '$source'!") } } # Log that we found a data file $logger->info("Found BibLaTeXML data file '$filename'"); # Set up XML parser and namespace my $xml = File::Slurp::read_file($filename) or biber_error("Can't read file $filename"); $xml = NFD(decode('UTF-8', $xml));# Unicode NFD boundary my $bltxml = XML::LibXML->load_xml(string => $xml); my $xpc = XML::LibXML::XPathContext->new($bltxml); $xpc->registerNs($NS, $BIBLATEXML_NAMESPACE_URI); if ($section->is_allkeys) { $logger->debug("All citekeys will be used for section '$secnum'"); # Loop over all entries, creating objects foreach my $entry ($xpc->findnodes("/$NS:entries/$NS:entry")) { $logger->debug('Parsing BibLaTeXML entry object ' . $entry->nodePath); # If an entry has no key, ignore it and warn unless ($entry->hasAttribute('id')) { biber_warn("Invalid or undefined BibLaTeXML entry key in file '$filename', skipping ..."); next; } my $key = $entry->getAttribute('id'); # Check if this key has already been registered as a citekey alias, if # so, the key takes priority and we delete the alias if ($section->get_citekey_alias($key)) { biber_warn("Citekey alias '$key' is also a real entry key, skipping ..."); $section->get_citekey_alias($key); } # Any secondary keys? # We can't do this with a driver entry for the IDS field as this needs # an entry object creating first and the whole point of aliases is that # there is no entry object foreach my $id ($entry->findnodes("./$NS:ids/$NS:key")) { my $idstr = $id->textContent(); # Skip aliases which are also real entry keys if ($section->has_everykey($idstr)) { biber_warn("Citekey alias '$idstr' is also a real entry key, skipping ..."); next; } # Warn on conflicting aliases if (my $otherid = $section->get_citekey_alias($idstr)) { if ($otherid ne $key) { biber_warn("Citekey alias '$idstr' already has an alias '$otherid', skipping ..."); } } else { # Since this is allkeys, we are guaranteed that the real entry for the alias # will be available $section->set_citekey_alias($idstr, $key); $logger->debug("Citekey '$idstr' is an alias for citekey '$key'"); } } # If we've already seen a case variant, warn if (my $okey = $section->has_badcasekey($key)) { biber_warn("Possible typo (case mismatch): '$key' and '$okey' in file '$filename', skipping '$key' ..."); } # If we've already seen this key, ignore it and warn if ($section->has_everykey($key)) { biber_warn("Duplicate entry key: '$key' in file '$filename', skipping ..."); next; } else { $section->add_everykey($key); } # Record a key->datasource name mapping for error reporting $section->set_keytods($key, $filename); create_entry($key, $entry, $source, $smaps, \@rkeys); # We do this as otherwise we have no way of determining the origing .bib entry order # We need this in order to do sorting=none + allkeys because in this case, there is no # "citeorder" because nothing is explicitly cited and so "citeorder" means .bib order push @{$orig_key_order->{$filename}}, $key; } # if allkeys, push all bibdata keys into citekeys (if they are not already there) # We are using the special "orig_key_order" array which is used to deal with the # situation when sorting=none and allkeys is set. We need an array rather than the # keys from the bibentries hash because we need to preserver the original order of # the .bib as in this case the sorting sub "citeorder" means "bib order" as there are # no explicitly cited keys $section->add_citekeys(@{$orig_key_order->{$filename}}); $logger->debug("Added all citekeys to section '$secnum': " . join(', ', $section->get_citekeys)); } else { # loop over all keys we're looking for and create objects $logger->debug('Wanted keys: ' . join(', ', @$keys)); foreach my $wanted_key (@$keys) { $logger->debug("Looking for key '$wanted_key' in BibLaTeXML file '$filename'"); if (my @entries = $xpc->findnodes("/$NS:entries/$NS:entry[\@id='$wanted_key']")) { # Check to see if there is more than one entry with this key and warn if so if ($#entries > 0) { biber_warn("Found more than one entry for key '$wanted_key' in '$filename': " . join(',', map {$_->getAttribute('id')} @entries) . ' - skipping duplicates ...'); } my $entry = $entries[0]; $logger->debug("Found key '$wanted_key' in BibLaTeXML file '$filename'"); $logger->debug('Parsing BibLaTeXML entry object ' . $entry->nodePath); # See comment above about the importance of the case of the key # passed to create_entry() # Skip creation if it's already been done, for example, via a citekey alias unless ($section->bibentries->entry_exists($wanted_key)) { # Record a key->datasource name mapping for error reporting $section->set_keytods($wanted_key, $filename); create_entry($wanted_key, $entry, $source, $smaps, \@rkeys); } # found a key, remove it from the list of keys we want @rkeys = grep {$wanted_key ne $_} @rkeys; } elsif ($xpc->findnodes("/$NS:entries/$NS:entry/$NS:id[text()='$wanted_key']")) { my $key = $xpc->findnodes("/$NS:entries/$NS:entry/\@id"); $logger->debug("Citekey '$wanted_key' is an alias for citekey '$key'"); $section->set_citekey_alias($wanted_key, $key); # Make sure there is a real, cited entry for the citekey alias # just in case only the alias is cited unless ($section->bibentries->entry_exists($key)) { my $entry = $xpc->findnodes("/$NS:entries/$NS:entry/[\@id='$key']"); # Record a key->datasource name mapping for error reporting $section->set_keytods($key, $filename); create_entry($key, $entry, $source, $smaps, \@rkeys); $section->add_citekeys($key); } # found a key, remove it from the list of keys we want @rkeys = grep {$wanted_key ne $_} @rkeys; } $logger->debug('Wanted keys now: ' . join(', ', @rkeys)); } } return @rkeys; } =head2 create_entry Create a Biber::Entry object from an entry found in a biblatexml data source =cut sub create_entry { my ($key, $entry, $datasource, $smaps, $rkeys) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $dm = Biber::Config->get_dm; my $bibentries = $section->bibentries; my %newentries; # In case we create a new entry in a map # Datasource mapping applied in $smap order (USER->STYLE->DRIVER) foreach my $smap (@$smaps) { $smap->{map_overwrite} = $smap->{map_overwrite} // 0; # default my $level = $smap->{level}; MAP: foreach my $map (@{$smap->{map}}) { # defaults to the entrytype unless changed below my $last_type = $entry->getAttribute('entrytype'); my $last_field = undef; my $last_fieldval = undef; my $cnerror; my @imatches; # For persisting parenthetical matches over several steps # Check pertype restrictions # Logic is "-(-P v Q)" which is equivalent to "P & -Q" but -Q is an array check so # messier to write than Q unless (not exists($map->{per_type}) or first {lc($_->{content}) eq $entry->type} @{$map->{per_type}}) { next; } # Check negated pertype restrictions if (exists($map->{per_nottype}) and first {lc($_->{content}) eq $entry->getAttribute('entrytype')} @{$map->{per_nottype}}) { next; } # Check per_datasource restrictions # Don't compare case insensitively - this might not be correct # Logic is "-(-P v Q)" which is equivalent to "P & -Q" but -Q is an array check so # messier to write than Q unless (not exists($map->{per_datasource}) or first {$_->{content} eq $datasource} @{$map->{per_datasource}}) { next; } # Set up any mapping foreach loop my @maploop = (''); if (my $foreach = $map->{map_foreach}) { # just a field name, make it XPATH if ($foreach !~ m|/|) { $foreach = "./bltx:$foreach"; } if (my $felist = $entry->findnodes($foreach)) { @maploop = split(/\s*,\s*/, $felist); } } foreach my $maploop (@maploop) { my $maploopuniq = suniqid; # loop over mapping steps foreach my $step (@{$map->{map_step}}) { # entry deletion. Really only useful with allkeys or tool mode if ($step->{map_entry_null}) { $logger->debug("Source mapping (type=$level, key=$key): Ignoring entry completely"); return 0; # don't create an entry at all } # new entry if (my $newkey = maploop($step->{map_entry_new}, $maploop, $maploopuniq)) { my $newentrytype; unless ($newentrytype = maploop($step->{map_entry_newtype}, $maploop, $maploopuniq)) { biber_warn("Source mapping (type=$level, key=$key): Missing type for new entry '$newkey', skipping step ..."); next; } $logger->debug("Source mapping (type=$level, key=$key): Creating new entry with key '$newkey'"); my $newentry = XML::LibXML::Element->new("$NS:entry"); $newentry->setAttribute('id', NFC($newkey)); $newentry->setAttribute('entrytype', NFC($newentrytype)); # found a new entry key, remove it from the list of keys we want since we # have "found" it by creating it @$rkeys = grep {$newkey ne $_} @$rkeys; # for allkeys sections initially if ($section->is_allkeys) { $section->add_citekeys($newkey); } $newentries{$newkey} = $newentry; } # entry clone if (my $prefix = maploop($step->{map_entry_clone}, $maploop, $maploopuniq)) { $logger->debug("Source mapping (type=$level, key=$key): cloning entry with prefix '$prefix'"); # Create entry with no sourcemapping to avoid recursion create_entry("$prefix$key", $entry); # found a prefix clone key, remove it from the list of keys we want since we # have "found" it by creating it along with its clone parent @$rkeys = grep {"$prefix$key" ne $_} @$rkeys; # Need to add the clone key to the section if allkeys is set since all keys are cleared # for allkeys sections initially if ($section->is_allkeys) { $section->add_citekeys("$prefix$key"); } } # An entry created by map_entry_new previously can be the target for field setting # options # A newly created entry as target of operations doesn't make sense in all situations # so it's limited to being the target for field sets my $etarget; my $etargetkey; if ($etargetkey = maploop($step->{map_entrytarget}, $maploop, $maploopuniq)) { unless ($etarget = $newentries{$etargetkey}) { biber_warn("Source mapping (type=$level, key=$key): Dynamically created entry target '$etargetkey' does not exist skipping step ..."); next; } } else { # default is that we operate on the same entry $etarget = $entry; $etargetkey = $key; } # Entrytype map if (my $typesource = maploop($step->{map_type_source}, $maploop, $maploopuniq)) { $typesource = lc($typesource); unless ($entry->getAttribute('entrytype') eq $typesource) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->getAttribute('entrytype') . "' but map wants '$typesource' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->getAttribute('entrytype') . "' but map wants '$typesource', skipping step ..."); next; } } # Change entrytype if requested $last_type = $entry->getAttribute('entrytype'); my $t = lc(maploop($step->{map_type_target}, $maploop, $maploopuniq)); $logger->debug("Source mapping (type=$level, key=$key): Changing entry type from '$last_type' to $t"); $entry->setAttribute('entrytype', NFC($t)); } # Field map if (my $xp_fieldsource_s = _getpath(maploop($step->{map_field_source}, $maploop, $maploopuniq))) { my $xp_fieldsource = XML::LibXML::XPathExpression->new($xp_fieldsource_s); # key is a pseudo-field. It's guaranteed to exist so # just check if that's what's being asked for unless ($entry->exists($xp_fieldsource)) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): No field xpath '$xp_fieldsource_s' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): No field xpath '$xp_fieldsource_s', skipping step ..."); next; } } $last_field = $entry->findnodes($xp_fieldsource)->get_node(1)->nodeName; $last_fieldval = $entry->findvalue($xp_fieldsource); my $negmatch = 0; # Negated matches are a normal match with a special flag if (my $nm = $step->{map_notmatch}) { $step->{map_match} = $nm; $negmatch = 1; } # map fields to targets if (my $m = maploop($step->{map_match}, $maploop, $maploopuniq)) { if (defined($step->{map_replace})) { # replace can be null # Can't modify entrykey if (lc($xp_fieldsource_s) eq './@id') { $logger->debug("Source mapping (type=$level, key=$key): Field xpath '$xp_fieldsource_s' is entrykey- cannot remap the value of this field, skipping ..."); next; } my $r = maploop($step->{map_replace}, $maploop, $maploopuniq); $logger->debug("Source mapping (type=$level, key=$key): Doing match/replace '$m' -> '$r' on field xpath '$xp_fieldsource_s'"); unless (_changenode($entry, $xp_fieldsource_s, ireplace($last_fieldval, $m, $r)), \$cnerror) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } } else { # Now re-instate any unescaped $1 .. $9 to get round these being # dynamically scoped and being null when we get here from any # previous map_match # Be aware that imatch() uses m//g so @imatches can have multiple paren group # captures which might be useful $m =~ s/(?{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Field xpath '$xp_fieldsource_s' does not match '$m' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Field xpath '$xp_fieldsource_s' does not match '$m', skipping step ..."); next; } } } } # Set to a different target if there is one if (my $xp_target_s = _getpath(maploop($step->{map_field_target}, $maploop, $maploopuniq))) { my $xp_target = XML::LibXML::XPathExpression->new($xp_target_s); # Can't remap entry key pseudo-field if (lc($xp_target_s) eq './@id') { $logger->debug("Source mapping (type=$level, key=$etargetkey): Field xpath '$xp_fieldsource_s' is entrykey - cannot map this to a new field as you must have an entrykey, skipping ..."); next; } if ($etarget->exists($xp_target)) { if ($map->{map_overwrite} // $smap->{map_overwrite}) { $logger->debug("Source mapping (type=$level, key=$etargetkey): Overwriting existing field xpath '$xp_target_s'"); } else { $logger->debug("Source mapping (type=$level, key=$etargetkey): Field xpath '$xp_fieldsource_s' is mapped to field xpath '$xp_target_s' but both are defined, skipping ..."); next; } } unless (_changenode($etarget, $xp_target_s, $xp_fieldsource_s, \$cnerror)) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } $etarget->findnodes($xp_fieldsource)->get_node(1)->unbindNode(); } } # field changes if (my $xp_node_s = _getpath(maploop($step->{map_field_set}, $maploop, $maploopuniq))) { my $xp_node = XML::LibXML::XPathExpression->new($xp_node_s); # Deal with special tokens if ($step->{map_null}) { $logger->debug("Source mapping (type=$level, key=$key): Deleting field xpath '$xp_node_s'"); $entry->findnodes($xp_node)->get_node(1)->unbindNode(); } else { if ($etarget->exists($xp_node)) { unless ($map->{map_overwrite} // $smap->{map_overwrite}) { if ($step->{map_final}) { # map_final is set, ignore and skip rest of step $logger->debug("Source mapping (type=$level, key=$etargetkey): Field xpath '$xp_node_s' exists, overwrite is not set and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$etargetkey): Field xpath '$xp_node_s' exists and overwrite is not set, skipping step ..."); next; } } } # If append is set, keep the original value and append the new my $orig = $step->{map_append} ? $etarget->findvalue($xp_node) : ''; if ($step->{map_origentrytype}) { next unless $last_type; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting xpath '$xp_node_s' to '${orig}${last_type}'"); unless (_changenode($etarget, $xp_node_s, $orig . $last_type, \$cnerror)) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } } elsif ($step->{map_origfieldval}) { next unless $last_fieldval; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting field xpath '$xp_node_s' to '${orig}${last_fieldval}'"); unless (_changenode($etarget, $xp_node_s, $orig . $last_fieldval, \$cnerror)) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } } elsif ($step->{map_origfield}) { next unless $last_field; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting field xpath '$xp_node_s' to '${orig}${last_field}'"); unless (_changenode($etarget, $xp_node_s, $orig . $last_field, \$cnerror)) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } } else { my $fv = maploop($step->{map_field_value}, $maploop, $maploopuniq); # Now re-instate any unescaped $1 .. $9 to get round these being # dynamically scoped and being null when we get here from any # previous map_match $fv =~ s/(?debug("Source mapping (type=$level, key=$etargetkey): Setting field xpath '$xp_node_s' to '${orig}${fv}'"); unless (_changenode($etarget, $xp_node_s, $orig . $fv, \$cnerror)) { biber_warn("Source mapping (type=$level, key=$key): $cnerror"); } } } } } } } } # Need to also instantiate fields in any new entries created by map foreach my $e ($entry, values %newentries) { next unless $e; # newentry might be undef my $bibentry = new Biber::Entry; my $k = $e->getAttribute('id'); $bibentry->set_field('citekey', $k); $logger->debug("Creating entry with key '$k'"); # We put all the fields we find modulo field aliases into the object. # Validation happens later and is not datasource dependent foreach my $f (uniq map { if (_norm($_->nodeName) eq 'names') { $_->getAttribute('type') } else { $_->nodeName()} } $e->findnodes('*')) { # We have to process local options as early as possible in order # to make them available for things that need them like name parsing if (_norm($f) eq 'options') { if (my $node = $entry->findnodes("./$NS:options")->get_node(1)) { process_entry_options($k, [ split(/\s*,\s*/, $node->textContent()) ]); # Save the raw options in case we are to output another input format like # biblatexml $bibentry->set_field('rawoptions', $node->textContent()); } } # Now run any defined handler if ($dm->is_field(_norm($f))) { my $handler = _get_handler($f); &$handler($bibentry, $e, $f, $k); } } $bibentry->set_field('entrytype', $e->getAttribute('entrytype')); $bibentry->set_field('datatype', 'biblatexml'); $bibentries->add_entry($k, $bibentry); } return; } # Related entries sub _related { my ($bibentry, $entry, $f, $key) = @_; my $Srx = Biber::Config->getoption('xsvsep'); my $S = qr/$Srx/; my $node = $entry->findnodes("./$f")->get_node(1); foreach my $item ($node->findnodes("./$NS:item")) { $bibentry->set_datafield('related', [ split(/$S/, $item->getAttribute('ids')) ]); $bibentry->set_datafield('relatedtype', $item->getAttribute('type')); if (my $string = $item->getAttribute('string')) { $bibentry->set_datafield('relatedstring', $string); } if (my $string = $item->getAttribute('options')) { $bibentry->set_datafield('relatedoptions', [ split(/$S/, $item->getAttribute('relatedoptions')) ]); } } return; } # literal fields sub _literal { my ($bibentry, $entry, $f, $key) = @_; foreach my $node ($entry->findnodes("./$f")) { # eprint is special case if ($f eq "$NS:eprint") { $bibentry->set_datafield('eprinttype', $node->getAttribute('type')); if (my $ec = $node->getAttribute('class')) { $bibentry->set_datafield('eprintclass', $ec); } } else { $bibentry->set_datafield(_norm($f), $node->textContent()); } } return; } # xSV field sub _xsv { my ($bibentry, $entry, $f) = @_; foreach my $node ($entry->findnodes("./$f")) { $bibentry->set_datafield(_norm($f), _split_list($node)); } return; } # uri fields sub _uri { my ($bibentry, $entry, $f, $key) = @_; my $node = $entry->findnodes("./$f")->get_node(1); my $value = $node->textContent(); # URL escape if it doesn't look like it already is # This is useful if we are generating URLs automatically with maps which may # contain UTF-8 from other fields unless ($value =~ /\%/) { $value = URI->new($value)->as_string; } $bibentry->set_datafield(_norm($f), $value); return; } # List fields sub _list { my ($bibentry, $entry, $f, $key) = @_; foreach my $node ($entry->findnodes("./$f")) { $bibentry->set_datafield(_norm($f), _split_list($node)); } return; } # Range fields sub _range { my ($bibentry, $entry, $f, $key) = @_; foreach my $node ($entry->findnodes("./$f")) { # List of ranges/values if (my @rangelist = $node->findnodes("./$NS:item")) { my $rl; foreach my $range (@rangelist) { push @$rl, _parse_range_list($range); } $bibentry->set_datafield(_norm($f), $rl); } } return; } # Date fields sub _date { my ($bibentry, $entry, $f, $key) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $ds = $section->get_keytods($key); foreach my $node ($entry->findnodes("./$f")) { my $datetype = $node->getAttribute('type') // ''; # We are not validating dates here, just syntax parsing my $date_re = qr/(\d{4}) # year (?:-(\d{2}))? # month (?:-(\d{2}))? # day /xms; if (my $start = $node->findnodes("./$NS:start")) { # Date range my $end = $node->findnodes("./$NS:end"); # Start of range if (my ($byear, $bmonth, $bday) = $start->get_node(1)->textContent() =~ m|\A$date_re\z|xms) { $bibentry->set_datafield($datetype . 'year', $byear) if $byear; $bibentry->set_datafield($datetype . 'month', $bmonth) if $bmonth; $bibentry->set_datafield($datetype . 'day', $bday) if $bday; } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid format '" . $start->get_node(1)->textContent() . "' of date field '$f' range start - ignoring", $bibentry); } # End of range if (my ($eyear, $emonth, $eday) = $end->get_node(1)->textContent() =~ m|\A(?:$date_re)?\z|xms) { $bibentry->set_datafield($datetype . 'endmonth', $emonth) if $emonth; $bibentry->set_datafield($datetype . 'endday', $eday) if $eday; if ($eyear) { # normal range $bibentry->set_datafield($datetype . 'endyear', $eyear); } else { # open ended range - endyear is defined but empty $bibentry->set_datafield($datetype . 'endyear', ''); } } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid format '" . $end->get_node(1)->textContent() . "' of date field '$f' range end - ignoring", $bibentry); } } else { # Simple date if (my ($byear, $bmonth, $bday) = $node->textContent() =~ m|\A$date_re\z|xms) { # did this entry get its year/month fields from splitting an ISO8601 date field? # We only need to know this for date, year/month as year/month can also # be explicitly set. It makes a difference on how we do any potential future # date validation $bibentry->set_field('datesplit', 1) if $datetype eq ''; $bibentry->set_datafield($datetype . 'year', $byear) if $byear; $bibentry->set_datafield($datetype . 'month', $bmonth) if $bmonth; $bibentry->set_datafield($datetype . 'day', $bday) if $bday; } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid format '" . $node->textContent() . "' of date field '$f' - ignoring", $bibentry); } } } return; } # Name fields sub _name { my ($bibentry, $entry, $f, $key) = @_; foreach my $node ($entry->findnodes("./$NS:names[\@type='$f']")) { my $names = new Biber::Entry::Names; # Save useprefix attribute if ($node->hasAttribute('useprefix')) { $names->set_useprefix(map_boolean($node->getAttribute('useprefix'), 'tonum')); } # Save sortnamekeyscheme attribute if ($node->hasAttribute('sortnamekeyscheme')) { $names->set_sortnamekeyscheme($node->getAttribute('sortnamekeyscheme')); } foreach my $namenode ($node->findnodes("./$NS:name")) { my $useprefix; # Name list and higher scope useprefix option. We have to pass this into parsename # as the actual current scope value is needed to generate name objects if (defined($names->get_useprefix)) { $useprefix = $names->get_useprefix; } else { $useprefix = Biber::Config->getblxoption('useprefix', $bibentry->get_field('entrytype'), $key); } $names->add_name(parsename($namenode,$f, {useprefix => $useprefix})); } # Deal with explicit "moreenames" in data source if ($node->getAttribute('morenames')) { $names->set_morenames; } $bibentry->set_datafield(_norm($f), $names); } return; } =head2 parsename Given a name node, this function returns a Biber::Entry::Name object Returns an object which internally looks a bit like this: { given => {string => 'John', initial => ['J']}, family => {string => 'Doe', initial => ['D']}, middle => {string => 'Fred', initial => ['F']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, namestring => 'Doe, John Fred', nameinitstring => 'Doe_JF', gender => sm, useprefix => 1, sortnamekeyscheme => 'scheme' } } =cut sub parsename { my ($node, $fieldname, $opts) = @_; $logger->debug('Parsing BibLaTeXML name object ' . $node->nodePath); # We have to pass this in from higher scopes as we need to actually use the scoped # value in this sub as well as set the name local value in the object my $useprefix = $opts->{useprefix}; my $namescope_useprefix; # Set name-scope useprefix attribute if it exists if ($node->hasAttribute('useprefix')) { $useprefix = $namescope_useprefix = map_boolean($node->getAttribute('useprefix'), 'tonum'); } my %namec; foreach my $n ($dm->get_constant_value('nameparts')) { # list type so returns list # If there is a name component node for this component ... if (my $nc_node = $node->findnodes("./$NS:namepart[\@type='$n']")->get_node(1)) { # name component with parts if (my @parts = map {$_->textContent()} $nc_node->findnodes("./$NS:namepart")) { $namec{$n} = _join_name_parts(\@parts); $logger->debug("Found name component '$n': " . $namec{$n}); if (my $ni = $node->getAttribute('initial')) { $namec{"${n}_i"} = [$ni]; } else { $namec{"${n}_i"} = [_gen_initials(@parts)]; } } # with no parts elsif (my $t = $nc_node->textContent()) { $namec{$n} = $t; $logger->debug("Found name component '$n': $t"); if (my $ni = $node->getAttribute('initial')) { $namec{"${n}_i"} = [$ni]; } else { $namec{"${n}_i"} = [_gen_initials($t)]; } } } } my $namestring = ''; # Don't add suffix to namestring or nameinitstring as these are used for uniquename disambiguation # which should only care about family name + any prefix (if useprefix=1). See biblatex github # tracker #306. # prefix if (my $p = $namec{prefix}) { $namestring .= "$p "; } # family name if (my $l = $namec{family}) { $namestring .= "$l, "; } # given name if (my $f = $namec{given}) { $namestring .= "$f"; } # Remove any trailing comma and space if, e.g. missing given name $namestring =~ s/,\s+\z//xms; # Construct $nameinitstring my $nameinitstr = ''; $nameinitstr .= join('', @{$namec{prefix_i}}) . '_' if ( $useprefix and exists($namec{prefix}) ); $nameinitstr .= $namec{family} if exists($namec{family}); $nameinitstr .= '_' . join('', @{$namec{given_i}}) if exists($namec{given}); $nameinitstr =~ s/\s+/_/g; my %nps; foreach my $n ($dm->get_constant_value('nameparts')) { # list type so returns list $nps{$n} = {string => $namec{$n} // undef, initial => exists($namec{$n}) ? $namec{"${n}_i"} : undef}; } my $newname = Biber::Entry::Name->new( %nps, namestring => $namestring, nameinitstring => $nameinitstr, gender => $node->getAttribute('gender') ); # Set name-scope sortnamekeyscheme attribute if it exists if ($node->hasAttribute('sortnamekeyscheme')) { $newname->set_sortnamekeyscheme($node->getAttribute('sortnamekeyscheme')); } # Set name-scope useprefix if it is defined if (defined($namescope_useprefix)) { $newname->set_useprefix($namescope_useprefix); } return $newname; } # Joins name parts using BibTeX tie algorithm. Ties are added: # # 1. After the first part if it is less than three characters long # 2. Before the family part sub _join_name_parts { my $parts = shift; # special case - 1 part if ($#{$parts} == 0) { return $parts->[0]; } # special case - 2 parts if ($#{$parts} == 1) { return $parts->[0] . '~' . $parts->[1]; } my $namestring = $parts->[0]; $namestring .= Unicode::GCString->new($parts->[0])->length < 3 ? '~' : ' '; $namestring .= join(' ', @$parts[1 .. ($#{$parts} - 1)]); $namestring .= '~' . $parts->[$#{$parts}]; return $namestring; } # Passed an array ref of strings, returns an array ref of initials sub _gen_initials { my @strings = @_; my @strings_out; foreach my $str (@strings) { # Deal with hyphenated name parts and normalise to a '-' character for easy # replacement with macro later if ($str =~ m/\p{Dash}/) { push @strings_out, join('-', _gen_initials(split(/\p{Dash}/, $str))); } else { my $chr = Unicode::GCString->new($str)->substr(0, 1)->as_string; # Keep diacritics with their following characters if ($chr =~ m/\p{Dia}/) { push @strings_out, Unicode::GCString->new($str)->substr(0, 2)->as_string; } else { push @strings_out, $chr; } } } return @strings_out; } # parses a range and returns a ref to an array of start and end values sub _parse_range_list { my $rangenode = shift; my $start = ''; my $end = ''; if (my $s = $rangenode->findnodes("./$NS:start")) { $start = $s->get_node(1)->textContent(); } if (my $e = $rangenode->findnodes("./$NS:end")) { $end = $e->get_node(1)->textContent(); } return [$start, $end]; } # Splits a list field into an array ref sub _split_list { my $node = shift; if (my @list = $node->findnodes("./$NS:item")) { return [ map {$_->textContent()} @list ]; } else { return [ $node->textContent() ]; } } # normalise a node name as they have a namsespace and might not be lowercase sub _norm { my $name = lc(shift); $name =~ s/\A$NS://xms; return $name; } sub _get_handler { my $field = shift; if (my $h = $handlers->{CUSTOM}{_norm($field)}) { return $h; } else { return $handlers->{$dm->get_fieldtype(_norm($field))}{$dm->get_fieldformat(_norm($field)) || 'default'}{$dm->get_datatype(_norm($field))}; } } # Changes node $xp_target_s (XPATH 1.0) to $value in the biblatexml entry $e, puts errors # into $error. Quite complicated because of the various node types that can be changed and # also due to the requirements of creating new targets when then don't exist. sub _changenode { my ($e, $xp_target_s, $value, $error) = @_; # names are special and can be specified by just the string if ($dm->is_field($value)) { my $dmv = $dm->get_dm_for_field($value); if ($dmv->{fieldtype} eq 'list' and $dmv->{datatype} eq 'name') { $value = _getpath($value); } } # $value can be an XPATH or just a string. my $nodeval = 0; if ($value =~ m|/|) { $value = $e->findnodes($value)->get_node(1)->cloneNode(1); $nodeval = 1; } # target already exists if (my $n = $e->findnodes($xp_target_s)->get_node(1)) { # set attribute value if ($n->nodeType == XML_ATTRIBUTE_NODE) { if ($nodeval) { $$error = "Tried to replace '$xp_target_s' Atribute node with complex data"; return 0; } $n->setValue(NFC($value)); } # Set element elsif ($n->nodeType == XML_ELEMENT_NODE) { # if value is a node, remove target child nodes and replace with value child nodes if ($nodeval) { $n->removeChildNodes(); foreach my $cn ($value->childNodes) { $n->appendChild($cn); } } # value is just a string, replace target text content with value string else { $n->findnodes('./text()')->get_node(1)->setData(NFC($value)); } } # target is a text node, just replace string elsif ($n->nodeType == XML_TEXT_NODE) { if ($nodeval) { $$error = "Tried to replace '$xp_target_s' Text node with complex data"; return 0; } $n->setData(NFC($value)); } } else { my @nodes = split(m|/|, $xp_target_s =~ s|^\./||r); my $nodepath = '.'; my $nodeparent = '.'; for (my $i = 0; $i <= $#nodes; $i++) { my $node = $nodes[$i]; $nodepath .= "/$node"; unless ($e->findnodes($nodepath)) { my $parent = $e->findnodes($nodeparent)->get_node(1); # Element my $f; if (my ($np) = $node =~ m|^bltx:([^/]+)|) { # names are special $f = $np; if ($np =~ /names\[\@type\s*=\s*'(.+)'\]/) { $f = $1; } if ($dm->field_is_fieldtype('list', $f) and $dm->field_is_datatype('name', $f)) { my $newnode = $parent->appendChild(XML::LibXML::Element->new('names')); $newnode->setNamespace($BIBLATEXML_NAMESPACE_URI, 'bltx'); $newnode->setAttribute('type', $f); if ($i == $#nodes) { # terminal node if ($nodeval) { foreach my $cn ($value->childNodes) { $newnode->appendChild($cn); } } else { $$error = "Tried to map to complex target '$xp_target_s' with string value"; return 0; } } } else { my $newnode = $parent->appendChild(XML::LibXML::Element->new($node =~ s|^bltx:||r)); $newnode->setNamespace($BIBLATEXML_NAMESPACE_URI, 'bltx'); if ($i == $#nodes) { # terminal node $newnode->appendTextNode(NFC($value)); } } } # Attribute elsif ($node =~ m/^@/) { if ($i == $#nodes) { $parent->setAttribute($node =~ s|^@||r, NFC($value)); } } # Text elsif ($node =~ m/text\(\)$/) { if ($i == $#nodes) { $parent->appendTextNode(NFC($value)); } } } $nodeparent .= "/$node"; } } return 1; } sub _getpath { my $string = shift; return undef unless $string; my $dm = Biber::Config->get_dm; if ($string =~ m|/|) { return $string; # presumably already XPath } else { if ($dm->is_field($string)) { my $dms = $dm->get_dm_for_field($string); if ($dms->{fieldtype} eq 'list' and $dms->{datatype} eq 'name') { return "./bltx:names[\@type='$string']"; } else { return "./bltx:$string"; } } else { return $string; # not a field, presumably just a string value } } } 1; __END__ =pod =encoding utf-8 =head1 NAME Biber::Input::file::biblatexml - look in a BibLaTeXML file for an entry and create it if found =head1 DESCRIPTION Provides the extract_entries() method to get entries from a biblatexml data source and instantiate Biber::Entry objects for what it finds =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Input/file/bibtex.pm000444000765000024 15406712667073765 22177 0ustar00philkimestaff000000000000package Biber::Input::file::bibtex; use v5.16; use strict; use warnings; use sigtrap qw(handler TBSIG SEGV); use Carp; use Text::BibTeX qw(:nameparts :joinmethods :metatypes); use Text::BibTeX::Name; use Text::BibTeX::NameFormat; use Biber::Constants; use Biber::DataModel; use Biber::Entries; use Biber::Entry; use Biber::Entry::Names; use Biber::Entry::Name; use Biber::Sections; use Biber::Section; use Biber::Utils; use Biber::Config; use Data::Uniqid qw ( suniqid ); use Encode; use File::Spec; use File::Slurp; use File::Temp; use Log::Log4perl qw(:no_extra_logdie_message); use List::AllUtils qw( :all ); use URI; use Unicode::Normalize; use Unicode::GCString; use XML::LibXML::Simple; my $logger = Log::Log4perl::get_logger('main'); state $cache; # state variable so it's persistent across calls to extract_entries() use vars qw($cache); =head2 init_cache Invalidate the T::B object cache. Used only in tests when e.g. we change the encoding settings and therefore must force a re-read of the data =cut sub init_cache { $cache = {}; } # Determine handlers from data model my $dm = Biber::Config->get_dm; my $handlers = { 'field' => { 'default' => { 'code' => \&_literal, 'date' => \&_date, 'datepart' => \&_literal, 'entrykey' => \&_literal, 'integer' => \&_literal, 'key' => \&_literal, 'literal' => \&_literal, 'range' => \&_range, 'verbatim' => \&_verbatim, 'uri' => \&_uri }, 'xsv' => { 'entrykey' => \&_xsv, 'keyword' => \&_xsv, 'option' => \&_xsv, } }, 'list' => { 'default' => { 'key' => \&_list, 'literal' => \&_list, 'name' => \&_name, 'verbatim' => \&_list, 'uri' => \&_urilist } } }; =head2 TBSIG Signal handler to catch fatal Text::BibTex SEGFAULTS. It has bugs and we want to say at least something if it coredumps =cut sub TBSIG { my $sig = shift; $logger->logdie("Caught signal: $sig\nLikely your .bib has a very bad entry which causes libbtparse to crash: $!"); } =head2 extract_entries Main data extraction routine. Accepts a data source identifier, preprocesses the file and then looks for the passed keys, creating entries when it finds them and passes out an array of keys it didn't find. =cut sub extract_entries { my ($source, $keys) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $filename; my @rkeys = @$keys; my $tf; # Up here so that the temp file has enough scope to survive until we've used it $logger->trace("Entering extract_entries() in driver 'bibtex'"); # Get a reference to the correct sourcemap sections, if they exist my $smaps = []; # Maps are applied in order USER->STYLE->DRIVER if (defined(Biber::Config->getoption('sourcemap'))) { # User maps if (my $m = first {$_->{datatype} eq 'bibtex' and $_->{level} eq 'user' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Style maps if (my $m = first {$_->{datatype} eq 'bibtex' and $_->{level} eq 'style' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Driver default maps if (my $m = first {$_->{datatype} eq 'bibtex' and $_->{level} eq 'driver'} @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } } # If it's a remote data file, fetch it first if ($source =~ m/\A(?:http|ftp)(s?):\/\//xms) { $logger->info("Data source '$source' is a remote BibTeX data source - fetching ..."); if (my $cf = $REMOTE_MAP{$source}) { $logger->info("Found '$source' in remote source cache"); $filename = $cf; } else { if ($1) { # HTTPS # use IO::Socket::SSL qw(debug99); # useful for debugging SSL issues # We have to explicitly set the cert path because otherwise the https module # can't find the .pem when PAR::Packer'ed # Have to explicitly try to require Mozilla::CA here to get it into %INC below # It may, however, have been removed by some biber unpacked dists if (not exists($ENV{PERL_LWP_SSL_CA_FILE}) and not exists($ENV{PERL_LWP_SSL_CA_PATH}) and not defined(Biber::Config->getoption('ssl-nointernalca')) and eval {require Mozilla::CA}) { # we assume that the default CA file is in .../Mozilla/CA/cacert.pem (my $vol, my $dir, undef) = File::Spec->splitpath( $INC{"Mozilla/CA.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' $ENV{PERL_LWP_SSL_CA_FILE} = File::Spec->catpath($vol, "$dir/CA", 'cacert.pem'); } # fallbacks for, e.g., linux unless (exists($ENV{PERL_LWP_SSL_CA_FILE})) { foreach my $ca_bundle (qw{ /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem }) { next if ! -e $ca_bundle; $ENV{PERL_LWP_SSL_CA_FILE} = $ca_bundle; last; } foreach my $ca_path (qw{ /etc/ssl/certs/ /etc/pki/tls/ }) { next if ! -d $ca_path; $ENV{PERL_LWP_SSL_CA_PATH} = $ca_path; last; } } if (defined(Biber::Config->getoption('ssl-noverify-host'))) { $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; } require LWP::Protocol::https; } require LWP::Simple; $tf = File::Temp->new(TEMPLATE => 'biber_remote_data_source_XXXXX', DIR => $Biber::MASTER->biber_tempdir, SUFFIX => '.bib'); unless (LWP::Simple::is_success(LWP::Simple::getstore($source, $tf->filename))) { biber_error("Could not fetch '$source'"); } $filename = $tf->filename; # cache any remote so it persists and so we don't fetch it again $REMOTE_MAP{$source} = $filename; } } else { # Need to get the filename even if using cache so we increment # the filename count for preambles at the bottom of this sub unless ($filename = locate_biber_file($source)) { biber_error("Cannot find '$source'!") } } # Text::BibTeX can't be controlled by Log4perl so we have to do something clumsy # We can't redirect STDERR to a variable as libbtparse doesnt' use PerlIO, just stdio # so it doesn't understand this. It does understand normal file redirection though as # that's standard stdio. # The Log4Perl setup outputs only to STDOUT so redirecting all STDERR like this is # ok since only libbtparse will be writing there my $tberr = File::Temp->new(TEMPLATE => 'biber_Text_BibTeX_STDERR_XXXXX', DIR => $Biber::MASTER->biber_tempdir); my $tberr_name = $tberr->filename; open OLDERR, '>&', \*STDERR; open STDERR, '>', $tberr_name; # Increment the number of times each datafile has been referenced # For example, a datafile might be referenced in more than one section. # Some things find this information useful, for example, setting preambles is global # and so we need to know if we've already saved the preamble for a datafile. $cache->{counts}{$filename}++; # Don't read the file again if it's already cached unless ($cache->{data}{$filename}) { $logger->debug("Caching data for BibTeX format file '$filename' for section $secnum"); cache_data($filename); } else { $logger->debug("Using cached data for BibTeX format file '$filename' for section $secnum"); } if ($section->is_allkeys) { $logger->debug("All cached citekeys will be used for section '$secnum'"); # Loop over all entries, creating objects while (my ($key, $entry) = each %{$cache->{data}{$filename}}) { # Record a key->datasource name mapping for error reporting $section->set_keytods($key, $filename); unless (create_entry($key, $entry, $source, $smaps, \@rkeys)) { # if create entry returns false, remove the key from the cache @{$cache->{orig_key_order}{$filename}} = grep {$key ne $_} @{$cache->{orig_key_order}{$filename}}; } } # Loop over all aliases, creating data in section object # Since this is allkeys, we are guaranteed that the real entry for the alias # will be available while (my ($alias, $key) = each %{$cache->{data}{citekey_aliases}}) { $section->set_citekey_alias($alias, $key); } # If allkeys, push all bibdata keys into citekeys (if they are not already there). # We are using the special "orig_key_order" array which is used to deal with the # situation when sorting=none and allkeys is set. We need an array rather than the # keys from the bibentries hash because we need to preserve the original order of # the .bib as in this case the sorting sub "citeorder" means "bib order" as there are # no explicitly cited keys $section->add_citekeys(@{$cache->{orig_key_order}{$filename}}); $logger->debug("Added all citekeys to section '$secnum': " . join(', ', $section->get_citekeys)); # Special case when allkeys but also some dynamic set entries. These keys must also be # in the section or they will be missed on output. if ($section->has_dynamic_sets) { $section->add_citekeys(@{$section->dynamic_set_keys}); $logger->debug("Added dynamic sets to section '$secnum': " . join(', ', @{$section->dynamic_set_keys})); } } else { # loop over all keys we're looking for and create objects $logger->debug('Text::BibTeX cache keys: ' . join(', ', keys %{$cache->{data}{$filename}})); $logger->debug('Wanted keys: ' . join(', ', @$keys)); foreach my $wanted_key (@$keys) { $logger->debug("Looking for key '$wanted_key' in Text::BibTeX cache"); # Record a key->datasource name mapping for error reporting $section->set_keytods($wanted_key, $filename); if (my $entry = $cache->{data}{$filename}{$wanted_key}) { $logger->debug("Found key '$wanted_key' in Text::BibTeX cache"); # Skip creation if it's already been done, for example, via a citekey alias unless ($section->bibentries->entry_exists($wanted_key)) { create_entry($wanted_key, $entry, $source, $smaps, \@rkeys); } # found a key, remove it from the list of keys we want @rkeys = grep {$wanted_key ne $_} @rkeys; } elsif (my $rk = $cache->{data}{citekey_aliases}{$wanted_key}) { $section->set_citekey_alias($wanted_key, $rk); # Make sure there is a real, cited entry for the citekey alias # just in case only the alias is cited unless ($section->bibentries->entry_exists($rk)) { if (my $entry = $cache->{data}{GLOBALDS}{$rk}) {# Look in cache of all datasource keys create_entry($rk, $entry, $source, $smaps, \@rkeys); $section->add_citekeys($rk); } } # found an alias key, remove it from the list of keys we want @rkeys = grep {$wanted_key ne $_} @rkeys; } elsif (my $okey = $section->has_badcasekey($wanted_key)) { biber_warn("Possible typo (case mismatch) between citation and datasource keys: '$wanted_key' and '$okey' in file '$filename'"); } $logger->debug('Wanted keys now: ' . join(', ', @rkeys)); } } open STDERR, '>&', \*OLDERR; close OLDERR; # Put any Text::BibTeX errors into the biber warnings/errors collections # We are parsing the libbtparse library error/warning strings a little here # This is not so bad as they have a clean structure (see error.c in libbtparse) open my $tbe, '<', $tberr_name; while (<$tbe>) { if (/error:/) { chomp; biber_error("BibTeX subsystem: $_"); } elsif (/warning:/) { chomp; biber_warn("BibTeX subsystem: $_"); } } close($tbe); # Only push the preambles from the file if we haven't seen this data file before # and there are some preambles to push if ($cache->{counts}{$filename} < 2 and @{$cache->{preamble}{$filename}}) { push @{$Biber::MASTER->{preamble}}, @{$cache->{preamble}{$filename}}; } # Save comments if in tool mode if (Biber::Config->getoption('tool')) { if ($cache->{comments}{$filename}) { $Biber::MASTER->{comments} = $cache->{comments}{$filename}; } } return @rkeys; } =head2 create_entry Create a Biber::Entry object from a Text::BibTeX object Be careful in here, all T::B set methods are UTF-8/NFC boundaries so be careful to encode(NFC()) on calls. Windows won't handle UTF-8 in T::B btparse gracefully and will die. =cut sub create_entry { # We have to pass in $rkeys so that the new/clone operations can remove the new/clone # key from the list of wanted keys because new/cloned entries will never appear to the normal # key search loop my ($key, $entry, $datasource, $smaps, $rkeys) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $bibentries = $section->bibentries; my $ds = $section->get_keytods($key); if ( $entry->metatype == BTE_REGULAR ) { my %newentries; # In case we create a new entry in a map # Datasource mapping applied in $smap order (USER->STYLE->DRIVER) foreach my $smap (@$smaps) { $smap->{map_overwrite} = $smap->{map_overwrite} // 0; # default my $level = $smap->{level}; MAP: foreach my $map (@{$smap->{map}}) { my $last_type = $entry->type; # defaults to the entrytype unless changed below my $last_field = undef; my $last_fieldval = undef; my @imatches; # For persisting parenthetical matches over several steps # Check pertype restrictions # Logic is "-(-P v Q)" which is equivalent to "P & -Q" but -Q is an array check so # messier to write than Q unless (not exists($map->{per_type}) or first {lc($_->{content}) eq $entry->type} @{$map->{per_type}}) { next; } # Check negated pertype restrictions if (exists($map->{per_nottype}) and first {lc($_->{content}) eq $entry->type} @{$map->{per_nottype}}) { next; } # Check per_datasource restrictions # Don't compare case insensitively - this might not be correct # Logic is "-(-P v Q)" which is equivalent to "P & -Q" but -Q is an array check so # messier to write than Q unless (not exists($map->{per_datasource}) or first {$_->{content} eq $datasource} @{$map->{per_datasource}}) { next; } # Set up any mapping foreach loop my @maploop = (''); if (my $foreachfield = $map->{map_foreach}) { if (my $felist = $entry->get(lc($foreachfield))) { @maploop = split(/\s*,\s*/, $felist); } } foreach my $maploop (@maploop) { my $maploopuniq = suniqid; # loop over mapping steps foreach my $step (@{$map->{map_step}}) { # entry deletion. Really only useful with allkeys or tool mode if ($step->{map_entry_null}) { $logger->debug("Source mapping (type=$level, key=$key): Ignoring entry completely"); return 0; # don't create an entry at all } # new entry if (my $newkey = maploop($step->{map_entry_new}, $maploop, $maploopuniq)) { my $newentrytype; unless ($newentrytype = maploop($step->{map_entry_newtype}, $maploop, $maploopuniq)) { biber_warn("Source mapping (type=$level, key=$key): Missing type for new entry '$newkey', skipping step ..."); next; } $logger->debug("Source mapping (type=$level, key=$key): Creating new entry with key '$newkey'"); my $newentry = new Text::BibTeX::Entry; $newentry->set_metatype(BTE_REGULAR); $newentry->set_key(encode('UTF-8', NFC($newkey))); $newentry->set_type(encode('UTF-8', NFC($newentrytype))); # found a new entry key, remove it from the list of keys we want since we # have "found" it by creating it @$rkeys = grep {$newkey ne $_} @$rkeys; # for allkeys sections initially if ($section->is_allkeys) { $section->add_citekeys($newkey); } $newentries{$newkey} = $newentry; } # entry clone if (my $prefix = maploop($step->{map_entry_clone}, $maploop, $maploopuniq)) { $logger->debug("Source mapping (type=$level, key=$key): cloning entry with prefix '$prefix'"); # Create entry with no sourcemapping to avoid recursion create_entry("$prefix$key", $entry); # found a prefix clone key, remove it from the list of keys we want since we # have "found" it by creating it along with its clone parent @$rkeys = grep {"$prefix$key" ne $_} @$rkeys; # Need to add the clone key to the section if allkeys is set since all keys are cleared # for allkeys sections initially if ($section->is_allkeys) { $section->add_citekeys("$prefix$key"); } } # An entry created by map_entry_new previously can be the target for field setting # options # A newly created entry as target of operations doesn't make sense in all situations # so it's limited to being the target for field sets my $etarget; my $etargetkey; if ($etargetkey = maploop($step->{map_entrytarget}, $maploop, $maploopuniq)) { unless ($etarget = $newentries{$etargetkey}) { biber_warn("Source mapping (type=$level, key=$key): Dynamically created entry target '$etargetkey' does not exist skipping step ..."); next; } } else { # default is that we operate on the same entry $etarget = $entry; $etargetkey = $key; } # Entrytype map if (my $typesource = maploop($step->{map_type_source}, $maploop, $maploopuniq)) { $typesource = lc($typesource); unless ($entry->type eq $typesource) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->type . "' but map wants '$typesource' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->type . "' but map wants '$typesource', skipping step ..."); next; } } # Change entrytype if requested $last_type = $entry->type; my $t = lc(maploop($step->{map_type_target}, $maploop, $maploopuniq)); $logger->debug("Source mapping (type=$level, key=$key): Changing entry type from '$last_type' to $t"); $entry->set_type(encode('UTF-8', NFC($t))); } # Field map if (my $fieldsource = maploop($step->{map_field_source}, $maploop, $maploopuniq)) { $fieldsource = lc($fieldsource); # key is a pseudo-field. It's guaranteed to exist so # just check if that's what's being asked for unless ($fieldsource eq 'entrykey' or $entry->exists($fieldsource)) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): No field '$fieldsource' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): No field '$fieldsource', skipping step ..."); next; } } $last_field = $fieldsource; $last_fieldval = $fieldsource eq 'entrykey' ? biber_decode_utf8($entry->key) : biber_decode_utf8($entry->get($fieldsource)); my $negmatch = 0; # Negated matches are a normal match with a special flag if (my $nm = $step->{map_notmatch}) { $step->{map_match} = $nm; $negmatch = 1; } # map fields to targets if (my $m = maploop($step->{map_match}, $maploop, $maploopuniq)) { if (defined($step->{map_replace})) { # replace can be null # Can't modify entrykey if ($fieldsource eq 'entrykey') { $logger->debug("Source mapping (type=$level, key=$key): Field '$fieldsource' is 'entrykey'- cannot remap the value of this field, skipping ..."); next; } my $r = maploop($step->{map_replace}, $maploop, $maploopuniq); $logger->debug("Source mapping (type=$level, key=$key): Doing match/replace '$m' -> '$r' on field '$fieldsource'"); $entry->set($fieldsource, encode('UTF-8', NFC(ireplace($last_fieldval, $m, $r)))); } else { # Now re-instate any unescaped $1 .. $9 to get round these being # dynamically scoped and being null when we get here from any # previous map_match # Be aware that imatch() uses m//g so @imatches can have multiple paren group # captures which might be useful $m =~ s/(?{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Field '$fieldsource' does not match '$m' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Field '$fieldsource' does not match '$m', skipping step ..."); next; } } } } # Set to a different target if there is one if (my $target = maploop($step->{map_field_target}, $maploop, $maploopuniq)) { $target = lc($target); # Can't remap entry key pseudo-field if ($fieldsource eq 'entrykey') { $logger->debug("Source mapping (type=$level, key=$etargetkey): Field '$fieldsource' is 'entrykey'- cannot map this to a new field as you must have an entrykey, skipping ..."); next; } if ($etarget->exists($target)) { if ($map->{map_overwrite} // $smap->{map_overwrite}) { $logger->debug("Source mapping (type=$level, key=$etargetkey): Overwriting existing field '$target'"); } else { $logger->debug("Source mapping (type=$level, key=$etargetkey): Field '$fieldsource' is mapped to field '$target' but both are defined, skipping ..."); next; } } $etarget->set($target, encode('UTF-8', NFC(biber_decode_utf8($entry->get($fieldsource))))); $etarget->delete($fieldsource); } } # field changes if (my $field = maploop($step->{map_field_set}, $maploop, $maploopuniq)) { $field = lc($field); # Deal with special tokens if ($step->{map_null}) { $logger->debug("Source mapping (type=$level, key=$key): Deleting field '$field'"); $entry->delete($field); } else { if ($etarget->exists($field)) { unless ($map->{map_overwrite} // $smap->{map_overwrite}) { if ($step->{map_final}) { # map_final is set, ignore and skip rest of step $logger->debug("Source mapping (type=$level, key=$etargetkey): Field '$field' exists, overwrite is not set and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$etargetkey): Field '$field' exists and overwrite is not set, skipping step ..."); next; } } } # If append is set, keep the original value and append the new my $orig = $step->{map_append} ? biber_decode_utf8($etarget->get($field)) : ''; if ($step->{map_origentrytype}) { next unless $last_type; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting field '$field' to '${orig}${last_type}'"); $etarget->set($field, encode('UTF-8', NFC($orig . $last_type))); } elsif ($step->{map_origfieldval}) { next unless $last_fieldval; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting field '$field' to '${orig}${last_fieldval}'"); $etarget->set($field, encode('UTF-8', NFC($orig . $last_fieldval))); } elsif ($step->{map_origfield}) { next unless $last_field; $logger->debug("Source mapping (type=$level, key=$etargetkey): Setting field '$field' to '${orig}${last_field}'"); $etarget->set($field, encode('UTF-8', NFC($orig . $last_field))); } else { my $fv = maploop($step->{map_field_value}, $maploop, $maploopuniq); # Now re-instate any unescaped $1 .. $9 to get round these being # dynamically scoped and being null when we get here from any # previous map_match $fv =~ s/(?debug("Source mapping (type=$level, key=$etargetkey): Setting field '$field' to '${orig}${fv}'"); $etarget->set($field, encode('UTF-8', NFC($orig . $fv))); } } } } } } } # Need to also instantiate fields in any new entries created by map foreach my $e ($entry, values %newentries) { next unless $e; # newentry might be undef my $bibentry = new Biber::Entry; my $k = biber_decode_utf8($e->key); $bibentry->set_field('citekey', $k); $logger->debug("Creating entry with key '$k'"); # Save pre-mapping data. Might be useful somewhere $bibentry->set_field('rawdata', biber_decode_utf8($e->print_s)); my $entrytype = biber_decode_utf8($e->type); # We put all the fields we find modulo field aliases into the object # validation happens later and is not datasource dependent foreach my $f ($e->fieldlist) { # In tool mode, keep the raw data fields if (Biber::Config->getoption('tool')) { $bibentry->set_rawfield($f, biber_decode_utf8($e->get($f))); } # We have to process local options as early as possible in order # to make them available for things that need them like parsename() if ($f eq 'options') { my $value = biber_decode_utf8($e->get($f)); my $Srx = Biber::Config->getoption('xsvsep'); my $S = qr/$Srx/; process_entry_options($k, [ split(/$S/, $value) ]); # Save the raw options in case we are to output another input format like # biblatexml $bibentry->set_field('rawoptions', $value); } # Now run any defined handler if ($dm->is_field($f)) { my $handler = _get_handler($f); &$handler($bibentry, $e, $f, $k); } elsif (Biber::Config->getoption('validate_datamodel')) { biber_warn("Datamodel: Entry '$k' ($ds): Field '$f' invalid in data model - ignoring", $bibentry); } } $bibentry->set_field('entrytype', $entrytype); $bibentry->set_field('datatype', 'bibtex'); $bibentries->add_entry($k, $bibentry); } } return 1; } # HANDLERS # ======== # Literal fields sub _literal { my ($bibentry, $entry, $field, $key) = @_; my $value = biber_decode_utf8($entry->get($field)); # If we have already split some date fields into literal fields # like date -> year/month/day, don't overwrite them with explicit # year/month return if ($field eq 'year' and $bibentry->get_datafield('year')); return if ($field eq 'month' and $bibentry->get_datafield('month')); # Deal with ISBN options if ($field eq 'isbn') { require Business::ISBN; my ($vol, $dir, undef) = File::Spec->splitpath( $INC{"Business/ISBN.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' # Just in case it is already set. We also need to fake this in tests or it will # look for it in the blib dir unless (exists($ENV{ISBN_RANGE_MESSAGE})) { $ENV{ISBN_RANGE_MESSAGE} = File::Spec->catpath($vol, "$dir/ISBN/", 'RangeMessage.xml'); } my $isbn = Business::ISBN->new($value); # Ignore invalid ISBNs if (not $isbn or not $isbn->is_valid) { biber_warn("ISBN '$value' in entry '$key' is invalid - run biber with '--validate_datamodel' for details."); $bibentry->set_datafield($field, $value); return; } # Force to a specified format if (Biber::Config->getoption('isbn13')) { $isbn = $isbn->as_isbn13; $value = $isbn->isbn; } elsif (Biber::Config->getoption('isbn10')) { $isbn = $isbn->as_isbn10; $value = $isbn->isbn; } # Normalise if requested if (Biber::Config->getoption('isbn_normalise')) { $value = $isbn->as_string; } } # Try to sanitise months to biblatex requirements if ($field eq 'month') { $bibentry->set_datafield($field, _hack_month($value)); } # Rationalise any bcp47 style langids into babel/polyglossia names # biblatex will convert these back again when loading .lbx files # We need this until babel/polyglossia support proper bcp47 language/locales elsif ($field eq 'langid' and my $map = $LOCALE_MAP_R{$value}) { $bibentry->set_datafield($field, $map); } else { $bibentry->set_datafield($field, $value); } return; } # URI fields sub _uri { my ($bibentry, $entry, $field) = @_; my $value = NFC(decode_utf8($entry->get($field)));# Unicode NFC boundary (before hex encoding) $bibentry->set_datafield($field, URI->new($value)->as_string); # Performs url encoding return; } # xSV field form sub _xsv { my $Srx = Biber::Config->getoption('xsvsep'); my $S = qr/$Srx/; my ($bibentry, $entry, $field) = @_; $bibentry->set_datafield($field, [ split(/$S/, biber_decode_utf8($entry->get($field))) ]); return; } # Verbatim fields sub _verbatim { my ($bibentry, $entry, $field) = @_; my $value = biber_decode_utf8($entry->get($field)); $bibentry->set_datafield($field, $value); return; } # Range fields # m-n -> [m, n] # m -> [m, undef] # m- -> [m, ''] # -n -> ['', n] # - -> ['', undef] sub _range { my ($bibentry, $entry, $field, $key) = @_; my $values_ref; my $value = biber_decode_utf8($entry->get($field)); my @values = split(/\s*[;,]\s*/, $value); # If there is a range sep, then we set the end of the range even if it's null # If no range sep, then the end of the range is undef foreach my $value (@values) { $value =~ m/\A\s*(\P{Pd}+)\s*\z/xms ||# Simple value without range $value =~ m/\A\s*(\{[^\}]+\}|[^\p{Pd} ]+)\s*(\p{Pd}+)\s*(\{[^\}]+\}|\P{Pd}*)\s*\z/xms || $value =~ m/\A\s*(.+)(\p{Pd}{2,})(.+)\s*\z/xms;# M-1--M-4 my $start = $1; my $end; if ($2) { $end = $3; } else { $end = undef; } $start =~ s/\A\{([^\}]+)\}\z/$1/; $end =~ s/\A\{([^\}]+)\}\z/$1/; biber_warn("Range field '$field' in entry '$key' is malformed, skipping", $bibentry) unless $start; push @$values_ref, [$start || '', $end]; } $bibentry->set_datafield($field, $values_ref); return; } # Names sub _name { my ($bibentry, $entry, $field, $key) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $value = biber_decode_utf8($entry->get($field)); # @tmp is bytes again now my @tmp = Text::BibTeX::split_list($value, Biber::Config->getoption('namesep')); my $useprefix = Biber::Config->getblxoption('useprefix', $bibentry->get_field('entrytype'), $key); my $names = new Biber::Entry::Names; foreach my $name (@tmp) { # Consecutive "and" causes Text::BibTeX::Name to segfault unless ($name) { biber_warn("Name in key '$key' is empty (probably consecutive 'and'): skipping name", $bibentry); $section->del_citekey($key); next; } $name = biber_decode_utf8($name); # Check for malformed names in names which aren't completely escaped # Too many commas unless ($name =~ m/\A\{\X+\}\z/xms) { # Ignore these tests for escaped names my @commas = $name =~ m/,/g; if ($#commas > 1) { biber_warn("Name \"$name\" has too many commas: skipping name", $bibentry); $section->del_citekey($key); next; } # Consecutive commas cause Text::BibTeX::Name to segfault if ($name =~ /,,/) { biber_warn("Name \"$name\" is malformed (consecutive commas): skipping name", $bibentry); $section->del_citekey($key); next; } } # Skip names that don't parse for some reason (like no family found - see parsename()) next unless my $no = parsename($name, $field, {useprefix => $useprefix}); # Deal with implied "et al" in data source if (lc($no->get_namestring) eq Biber::Config->getoption('others_string')) { $names->set_morenames; } else { $names->add_name($no); } } $bibentry->set_datafield($field, $names); return; } # Dates sub _date { my ($bibentry, $entry, $field, $key) = @_; my $datetype = $field =~ s/date\z//xmsr; my $date = biber_decode_utf8($entry->get($field)); my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $ds = $section->get_keytods($key); if (my ($byear, $bmonth, $bday, $r, $eyear, $emonth, $eday) = parse_date($date)) { # Did this entry get its year/month fields from splitting an ISO8601 date field? # We only need to know this for date, year/month as year/month can also # be explicitly set. This is useful to know in various places. $bibentry->set_field('datesplit', 1) if $datetype eq ''; # Some warnings for overwriting YEAR and MONTH from DATE if ($byear and ($datetype . 'year' eq 'year') and $entry->get('year')) { biber_warn("Overwriting field 'year' with year value from field 'date' for entry '$key'", $bibentry); } if ($bmonth and ($datetype . 'month' eq 'month') and $entry->get('month')) { biber_warn("Overwriting field 'month' with month value from field 'date' for entry '$key'", $bibentry); } $bibentry->set_datafield($datetype . 'year', $byear) if $byear; $bibentry->set_datafield($datetype . 'month', $bmonth) if $bmonth; $bibentry->set_datafield($datetype . 'day', $bday) if $bday; $bibentry->set_datafield($datetype . 'endmonth', $emonth) if $emonth; $bibentry->set_datafield($datetype . 'endday', $eday) if $eday; if ($r and $eyear) { # normal range $bibentry->set_datafield($datetype . 'endyear', $eyear); } elsif ($r and not $eyear) { # open ended range - endyear is defined but empty $bibentry->set_datafield($datetype . 'endyear', ''); } } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid format '$date' of date field '$field' - ignoring", $bibentry); } return; } # Bibtex list fields with listsep separator sub _list { my ($bibentry, $entry, $field) = @_; my $value = biber_decode_utf8($entry->get($field)); my @tmp = Text::BibTeX::split_list($value, Biber::Config->getoption('listsep')); @tmp = map { biber_decode_utf8($_) } @tmp; @tmp = map { remove_outer($_) } @tmp; $bibentry->set_datafield($field, [ @tmp ]); return; } # Bibtex uri lists sub _urilist { my ($bibentry, $entry, $field) = @_; my $value = NFC(decode_utf8($entry->get($field)));# Unicode NFC boundary (before hex encoding) my @tmp = Text::BibTeX::split_list($value, Biber::Config->getoption('listsep')); @tmp = map { # If there are some escapes in the URI, unescape them if ($_ =~ /\%/) { $_ =~ s/\\%/%/g; # just in case someone BibTeX escaped the "%" # This is what uri_unescape() does but it's faster $_ =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; } $_; } @tmp; @tmp = map { URI->new($_)->as_string } @tmp; $bibentry->set_datafield($field, [ @tmp ]); return; } =head2 cache_data Caches file data into T::B objects indexed by the original datasource key, decoded into UTF8 =cut sub cache_data { my $filename = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); # Initialise this $cache->{preamble}{$filename} = []; # Convert/decode file my $pfilename = preprocess_file($filename); my $bib = Text::BibTeX::File->new( $pfilename, '<' ) or biber_error("Cannot create Text::BibTeX::File object from $pfilename: $!"); # Log that we found a data file $logger->info("Found BibTeX data source '$filename'"); while ( my $entry = new Text::BibTeX::Entry $bib ) { if ( $entry->metatype == BTE_PREAMBLE ) { push @{$cache->{preamble}{$filename}}, biber_decode_utf8($entry->value); next; } # Save comments for output in tool mode unless comment strippig is requested if ( $entry->metatype == BTE_COMMENT ) { if (Biber::Config->getoption('tool') and not Biber::Config->getoption('strip_comments') ) { push @{$cache->{comments}{$filename}}, process_comment(biber_decode_utf8($entry->value)); } next; } # Ignore misc BibTeX entry types we don't care about next if ( $entry->metatype == BTE_MACRODEF or $entry->metatype == BTE_UNKNOWN ); # If an entry has no key, ignore it and warn unless ($entry->key) { biber_warn("Invalid or undefined BibTeX entry key in file '$pfilename', skipping ..."); next; } # Text::BibTeX >= 0.46 passes through all citekey bits, thus allowing utf8 keys my $key = biber_decode_utf8($entry->key); # Check if this key has already been registered as a citekey alias, if # so, the key takes priority and we delete the alias if (exists($cache->{data}{citekey_aliases}{$key})) { biber_warn("Citekey alias '$key' is also a real entry key, skipping ..."); delete($cache->{data}{citekey_aliases}{$key}); } # Any secondary keys? # We can't do this with a driver entry for the IDS field as this needs # an entry object creating first and the whole point of aliases is that # there is no entry object if (my $ids = biber_decode_utf8($entry->get('ids'))) { my $Srx = Biber::Config->getoption('xsvsep'); my $S = qr/$Srx/; foreach my $id (split(/$S/, $ids)) { # Skip aliases which are also real entry keys if ($section->has_everykey($id)) { biber_warn("Citekey alias '$id' is also a real entry key, skipping ..."); next; } # Warn on conflicting aliases if (exists($cache->{data}{citekey_aliases}{$id})) { my $otherid = $cache->{data}{citekey_aliases}{$id}; if ($otherid ne $key) { biber_warn("Citekey alias '$id' already has an alias '$otherid', skipping ..."); } } else { $cache->{data}{citekey_aliases}{$id} = $key; $logger->debug("Citekey '$id' is an alias for citekey '$key'"); } } } # If we've already seen a case variant, warn # This is case mismatch test of datasource entries with other datasource entries if (my $okey = $section->has_badcasekey($key)) { biber_warn("Possible typo (case mismatch) between datasource keys: '$key' and '$okey' in file '$filename'"); } # If we've already seen this key in a datasource, ignore it and warn unless user wants # duplicates if ($section->has_everykey($key) and not Biber::Config->getoption('noskipduplicates')) { biber_warn("Duplicate entry key: '$key' in file '$filename', skipping ..."); next; } else { if ($section->has_everykey($key)) { biber_warn("Duplicate entry key: '$key' in file '$filename'"); } $section->add_everykey($key); } # Bad entry unless ($entry->parse_ok) { biber_warn("Entry $key does not parse correctly"); next; } # Cache the entry so we don't have to read the file again on next pass. # Two reasons - So we avoid T::B macro redef warnings and speed # Create a global "all datasources" cache too as this is useful in places $cache->{data}{GLOBALDS}{$key} = $cache->{data}{$filename}{$key} = $entry; # We do this as otherwise we have no way of determining the origing .bib entry order # We need this in order to do sorting=none + allkeys because in this case, there is no # "citeorder" because nothing is explicitly cited and so "citeorder" means .bib order push @{$cache->{orig_key_order}{$filename}}, $key; $logger->debug("Cached Text::BibTeX entry for key '$key' from BibTeX file '$filename'"); } $bib->close; # If we don't do this, we can't unlink the temp file on Windows return; } =head2 preprocess_file Convert file to UTF-8 and potentially decode LaTeX macros to UTF-8 =cut sub preprocess_file { my $filename = shift; # Put the utf8 encoded file into the global biber tempdir # We have to do this in case we can't write to the location of the # .bib file my $td = $Biber::MASTER->biber_tempdir; (undef, undef, my $fn) = File::Spec->splitpath($filename); my $ufilename = File::Spec->catfile($td->dirname, "${fn}_$$.utf8"); # We read the file in the bib encoding and then output to UTF-8, even if it was already UTF-8, # just in case there was a BOM so we can delete it as it makes T::B complain # Don't use File::Slurp binmode option - it's completely broken - see module RT queue my $buf = File::Slurp::read_file($filename) or biber_error("Can't read $filename"); $buf = NFD(decode(Biber::Config->getoption('input_encoding'), $buf));# Unicode NFD boundary # strip UTF-8 BOM if it exists - this just makes T::B complain about junk characters $buf =~ s/\A\x{feff}//; File::Slurp::write_file($ufilename, encode('UTF-8', NFC($buf))) or biber_error("Can't write $ufilename");# Unicode NFC boundary # Always decode LaTeX to UTF8 my $lbuf = File::Slurp::read_file($ufilename) or biber_error("Can't read $ufilename"); $lbuf = NFD(decode('UTF-8', $lbuf));# Unicode NFD boundary $logger->info('Decoding LaTeX character macros into UTF-8'); $logger->trace("Buffer before decoding -> '$lbuf'"); $lbuf = Biber::LaTeX::Recode::latex_decode($lbuf); $logger->trace("Buffer after decoding -> '$lbuf'"); File::Slurp::write_file($ufilename, encode('UTF-8', NFC($lbuf))) or biber_error("Can't write $ufilename");# Unicode NFC boundary return $ufilename; } =head2 parsename Given a name string, this function returns a Biber::Entry::Name object with all parts of the name resolved according to the BibTeX conventions. parsename('John Doe') returns an object which internally looks a bit like this: { given => {string => 'John', initial => ['J']}, family => {string => 'Doe', initial => ['D']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, namestring => 'Doe, John', nameinitstring => 'Doe_J', strip => {'given' => 0, 'family' => 0, 'prefix' => 0, 'suffix' => 0} } =cut sub parsename { my ($namestr, $fieldname, $opts, $testing) = @_; $logger->debug("Parsing namestring '$namestr'"); my $usepre = $opts->{useprefix}; # First sanitise the namestring due to Text::BibTeX::Name limitations on whitespace $namestr =~ s/\A\s*//xms; # leading whitespace $namestr =~ s/\s*\z//xms; # trailing whitespace $namestr =~ s/\s+/ /g; # Collapse internal whitespace $namestr =~ s/\\\s/ /g; # Remove escaped spaces like in "Christina A. L.\ Thiele" $namestr =~ s/\A\{\{+([^{}]+)\}+\}\z/{$1}/xms; # Allow only one enveloping set of braces # If requested, try to correct broken initials with no space between them. # This can slightly mess up some other names like {{U.K. Government}} etc. # btparse can't do this so we do it before name parsing $namestr =~ s/(\w)\.(\w)/$1. $2/g if Biber::Config->getoption('fixinits'); # We use NFC here as we are "outputting" to an external module my $name = new Text::BibTeX::Name(NFC($namestr)); # Formats so we can get BibTeX compatible nbsp inserted my $l_f = new Text::BibTeX::NameFormat('l', 0); my $f_f = new Text::BibTeX::NameFormat('f', 0); my $p_f = new Text::BibTeX::NameFormat('v', 0); my $s_f = new Text::BibTeX::NameFormat('j', 0); $l_f->set_options(BTN_LAST, 0, BTJ_MAYTIE, BTJ_NOTHING); $f_f->set_options(BTN_FIRST, 0, BTJ_MAYTIE, BTJ_NOTHING); $p_f->set_options(BTN_VON, 0, BTJ_MAYTIE, BTJ_NOTHING); $s_f->set_options(BTN_JR, 0, BTJ_MAYTIE, BTJ_NOTHING); # Generate name parts my $family = biber_decode_utf8($name->format($l_f)); my $given = biber_decode_utf8($name->format($f_f)); my $prefix = biber_decode_utf8($name->format($p_f)); my $suffix = biber_decode_utf8($name->format($s_f)); # Variables to hold the Text::BibTeX::NameFormat generated initials string my $gen_family_i; my $gen_given_i; my $gen_prefix_i; my $gen_suffix_i; # Use a copy of $name so that when we generate the # initials, we do so without certain things. This is easier than trying # hack robust initials code into btparse ... my $nd_namestr = strip_noinit($namestr); # Make initials with ties in between work. btparse doesn't understand this so replace with # spaces - this is fine as we are just generating initials $nd_namestr =~ s/\.~\s*/. /g; # We use NFC here as we are "outputting" to an external module my $nd_name = new Text::BibTeX::Name(NFC($nd_namestr), $fieldname); # Initials formats my $li_f = new Text::BibTeX::NameFormat('l', 1); my $fi_f = new Text::BibTeX::NameFormat('f', 1); my $pi_f = new Text::BibTeX::NameFormat('v', 1); my $si_f = new Text::BibTeX::NameFormat('j', 1); # Initials generated with forced tie so we can make an array $li_f->set_text(BTN_LAST, undef, undef, undef, ''); $fi_f->set_text(BTN_FIRST, undef, undef, undef, ''); $pi_f->set_text(BTN_VON, undef, undef, undef, ''); $si_f->set_text(BTN_JR, undef, undef, undef, ''); $li_f->set_options(BTN_LAST, 1, BTJ_FORCETIE, BTJ_NOTHING); $fi_f->set_options(BTN_FIRST, 1, BTJ_FORCETIE, BTJ_NOTHING); $pi_f->set_options(BTN_VON, 1, BTJ_FORCETIE, BTJ_NOTHING); $si_f->set_options(BTN_JR, 1, BTJ_FORCETIE, BTJ_NOTHING); $gen_family_i = inits(biber_decode_utf8($nd_name->format($li_f))); $gen_given_i = inits(biber_decode_utf8($nd_name->format($fi_f))); $gen_prefix_i = inits(biber_decode_utf8($nd_name->format($pi_f))); $gen_suffix_i = inits(biber_decode_utf8($nd_name->format($si_f))); my $namestring = ''; # Don't add suffix to namestring or nameinitstring as these are used for uniquename disambiguation # which should only care about family + any prefix (if useprefix=true). See biblatex github # tracker #306. # prefix my $ps; my $prefix_stripped; my $prefix_i; if ($prefix) { $prefix_i = $gen_prefix_i; $prefix_stripped = remove_outer($prefix); $ps = $prefix ne $prefix_stripped ? 1 : 0; $namestring .= "$prefix_stripped "; } # family name my $fs; my $family_stripped; my $family_i; if ($family) { $family_i = $gen_family_i; $family_stripped = remove_outer($family); $fs = $family ne $family_stripped ? 1 : 0; $namestring .= "$family_stripped, "; } # suffix my $ss; my $suffix_stripped; my $suffix_i; if ($suffix) { $suffix_i = $gen_suffix_i; $suffix_stripped = remove_outer($suffix); $ss = $suffix ne $suffix_stripped ? 1 : 0; } # given name my $gs; my $given_stripped; my $given_i; if ($given) { $given_i = $gen_given_i; $given_stripped = remove_outer($given); $gs = $given ne $given_stripped ? 1 : 0; $namestring .= "$given_stripped"; } # Remove any trailing comma and space if, e.g. missing given # Replace any nbspes $namestring =~ s/,\s+\z//xms; $namestring =~ s/\s*~\s*/ /gxms; # Construct $nameinitstring my $nameinitstr = ''; $nameinitstr .= join('', @$prefix_i) . '_' if ( $usepre and $prefix ); $nameinitstr .= $family if $family; $nameinitstr .= '_' . join('', @$given_i) if $given; $nameinitstr =~ s/\s+/_/g; $nameinitstr =~ s/~/_/g; # output is always NFC and so when testing the output of this routine, need NFC if ($testing) { if ($given) { $given_stripped = NFC($given_stripped); $given_i = [ map {NFC($_)} @$given_i ]; } if ($family) { $family_stripped = NFC($family_stripped); $family_i = [ map {NFC($_)} @$family_i ]; } if ($prefix) { $prefix_stripped = NFC($prefix_stripped); $prefix_i = [ map {NFC($_)} @$prefix_i ]; } if ($suffix) { $suffix_stripped = NFC($suffix_stripped); $suffix_i = [ map {NFC($_)} @$suffix_i ]; } if ($namestring) { $namestring = NFC($namestring); } if ($nameinitstr) { $nameinitstr = NFC($nameinitstr); } } # The "strip" entry tells us which of the name parts had outer braces # stripped during processing so we can add them back when printing the # .bbl so as to maintain maximum BibTeX compatibility return Biber::Entry::Name->new( given => {string => $given eq '' ? undef : $given_stripped, initial => $given eq '' ? undef : $given_i}, family => {string => $family eq '' ? undef : $family_stripped, initial => $family eq '' ? undef : $family_i}, prefix => {string => $prefix eq '' ? undef : $prefix_stripped, initial => $prefix eq '' ? undef : $prefix_i}, suffix => {string => $suffix eq '' ? undef : $suffix_stripped, initial => $suffix eq '' ? undef : $suffix_i}, namestring => $namestring, nameinitstring => $nameinitstr, strip => {'given' => $gs, 'family' => $fs, 'prefix' => $ps, 'suffix' => $ss} ); } # Routine to try to hack month into the right biblatex format # Especially since we support remote .bibs which we potentially have no control over my %months = ( 'jan' => '01', 'feb' => '02', 'mar' => '03', 'apr' => '04', 'may' => '05', 'jun' => '06', 'jul' => '07', 'aug' => '08', 'sep' => '09', 'oct' => '10', 'nov' => '11', 'dec' => '12' ); sub _hack_month { my $in_month = shift; if (my ($m) = $in_month =~ m/\A\s*((?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec).*)\s*\z/i) { return $months{lc(Unicode::GCString->new($m)->substr(0,3)->as_string)}; } else { return $in_month; } } sub _get_handler { my $field = shift; if (my $h = $handlers->{CUSTOM}{$field}) { return $h; } else { return $handlers->{$dm->get_fieldtype($field)}{$dm->get_fieldformat($field) || 'default'}{$dm->get_datatype($field)}; } } 1; __END__ =pod =encoding utf-8 =head1 NAME Biber::Input::file::bibtex - look in a BibTeX file for an entry and create it if found =head1 DESCRIPTION Provides the extract_entries() method to get entries from a BibTeX data source and instantiate Biber::Entry objects for what it finds =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Input/file/ris.pm000444000765000024 6542112667073765 21472 0ustar00philkimestaff000000000000package Biber::Input::file::ris; use v5.16; use strict; use warnings; use Carp; use Biber::Constants; use Biber::DataModel; use Biber::Entries; use Biber::Entry; use Biber::Entry::Names; use Biber::Entry::Name; use Biber::Sections; use Biber::Section; use Biber::Utils; use Biber::Config; use Encode; use File::Spec; use File::Temp; use Log::Log4perl qw(:no_extra_logdie_message); use List::AllUtils qw( :all ); use XML::LibXML::Simple; use Data::Dump qw(dump); use Unicode::Normalize; use Unicode::GCString; use URI; my $logger = Log::Log4perl::get_logger('main'); my $orig_key_order = {}; # Determine handlers from data model my $dm = Biber::Config->get_dm; my $handlers = { 'field' => { 'default' => { 'code' => \&_literal, 'date' => \&_date, 'datepart' => \&_verbatim, 'entrykey' => \&_verbatim, 'integer' => \&_verbatim, 'key' => \&_verbatim, 'literal' => \&_verbatim, 'range' => \&_range, 'verbatim' => \&_verbatim, 'uri' => \&_uri }, 'xsv' => { 'entrykey' => \&_xsv, 'keyword' => \&_xsv, 'option' => \&_xsv, } }, 'list' => { 'default' => { 'entrykey' => \&_list, 'key' => \&_list, 'literal' => \&_list, 'name' => \&_name, } } }; =head2 extract_entries Main data extraction routine. Accepts a data source identifier (filename in this case), preprocesses the file and then looks for the passed keys, creating entries when it finds them and passes out an array of keys it didn't find. =cut sub extract_entries { my ($source, $keys) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $filename; my @rkeys = @$keys; my $tf; $logger->trace("Entering extract_entries() in driver 'ris'"); # Get a reference to the correct sourcemap sections, if they exist my $smaps = []; # Maps are applied in order USER->STYLE->DRIVER if (defined(Biber::Config->getoption('sourcemap'))) { # User maps if (my $m = first {$_->{datatype} eq 'ris' and $_->{level} eq 'user' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Style maps if (my $m = first {$_->{datatype} eq 'ris' and $_->{level} eq 'style' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } # Driver default maps if (my $m = first {$_->{datatype} eq 'ris' and $_->{level} eq 'driver' } @{Biber::Config->getoption('sourcemap')} ) { push @$smaps, $m; } } # If it's a remote data file, fetch it first if ($source =~ m/\A(?:http|ftp)(s?):\/\//xms) { $logger->info("Data source '$source' is a remote RIS data source - fetching ..."); if (my $cf = $REMOTE_MAP{$source}) { $logger->info("Found '$source' in remote source cache"); $filename = $cf; } else { if ($1) { # HTTPS # use IO::Socket::SSL qw(debug99); # useful for debugging SSL issues # We have to explicitly set the cert path because otherwise the https module # can't find the .pem when PAR::Packer'ed # Have to explicitly try to require Mozilla::CA here to get it into %INC below # It may, however, have been removed by some biber unpacked dists if (not exists($ENV{PERL_LWP_SSL_CA_FILE}) and not exists($ENV{PERL_LWP_SSL_CA_PATH}) and not defined(Biber::Config->getoption('ssl-nointernalca')) and eval {require Mozilla::CA}) { # we assume that the default CA file is in .../Mozilla/CA/cacert.pem (my $vol, my $dir, undef) = File::Spec->splitpath( $INC{"Mozilla/CA.pm"} ); $dir =~ s/\/$//; # splitpath sometimes leaves a trailing '/' $ENV{PERL_LWP_SSL_CA_FILE} = File::Spec->catpath($vol, "$dir/CA", 'cacert.pem'); } # fallbacks for, e.g., linux unless (exists($ENV{PERL_LWP_SSL_CA_FILE})) { foreach my $ca_bundle (qw{ /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem }) { next if ! -e $ca_bundle; $ENV{PERL_LWP_SSL_CA_FILE} = $ca_bundle; last; } foreach my $ca_path (qw{ /etc/ssl/certs/ /etc/pki/tls/ }) { next if ! -d $ca_path; $ENV{PERL_LWP_SSL_CA_PATH} = $ca_path; last; } } if (defined(Biber::Config->getoption('ssl-noverify-host'))) { $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; } require LWP::Protocol::https; } require LWP::Simple; $tf = File::Temp->new(TEMPLATE => 'biber_remote_data_source_XXXXX', DIR => $Biber::MASTER->biber_tempdir, SUFFIX => '.ris'); unless (LWP::Simple::is_success(LWP::Simple::getstore($source, $tf->filename))) { biber_error("Could not fetch '$source'"); } $filename = $tf->filename; # cache any remote so it persists and so we don't fetch it again $REMOTE_MAP{$source} = $filename; } } else { unless ($filename = locate_biber_file($source)) { biber_error("Cannot find '$source'!") } } # Log that we found a data file $logger->info("Found RIS data source '$filename'"); # pre-process into something a little more sensible, dealing with the multi-line # fields in RIS require IO::File; my $ris = new IO::File; $ris->open("< $filename"); my $e; my @ris_entries; my $last_tag; while(<$ris>) { if (Biber::Config->getoption('input_encoding') eq 'UTF-8') { $_ = NFD($_);# Unicode NFD boundary } if (m/\A([A-Z][A-Z0-9])\s\s\-\s*(.+)?\n\z/xms) { $last_tag = $1; if ($1 eq 'TY') { $e = {'TY' => $2} } elsif ($1 eq 'KW') { push @{$e->{KW}}, $2 } # amalgamate keywords elsif ($1 eq 'SP') { $e->{SPEP}{SP} = $2 } # amalgamate page range elsif ($1 eq 'EP') { $e->{SPEP}{EP} = $2 } # amalgamate page range elsif ($1 eq 'A1') { push @{$e->{A1}}, $2 } # amalgamate names elsif ($1 eq 'A2') { push @{$e->{A2}}, $2 } # amalgamate names elsif ($1 eq 'A3') { push @{$e->{A3}}, $2 } # amalgamate names elsif ($1 eq 'AU') { push @{$e->{AU}}, $2 } # amalgamate names elsif ($1 eq 'ED') { push @{$e->{ED}}, $2 } # amalgamate names elsif ($1 eq 'ER') { if (exists($e->{KW})) {$e->{KW} = join(',', @{$e->{KW}})} push @ris_entries, $e } else { $e->{$1} = $2 } } elsif (m/\A(.+)\n\z/xms) { # Deal with stupid line continuations $e->{$last_tag} .= " $1"; } } $ris->close; undef $ris; if ($section->is_allkeys) { $logger->debug("All citekeys will be used for section '$secnum'"); # Loop over all entries, creating objects foreach my $entry (@ris_entries) { $logger->debug('Parsing RIS entry object ' . $entry->{ID}); # If an entry has no key, ignore it and warn unless ($entry->{ID}) { biber_warn("RIS entry has no ID key in file '$filename', skipping ..."); next; } my $ek = $entry->{ID}; # If we've already seen a case variant, warn if (my $okey = $section->has_badcasekey($ek)) { biber_warn("Possible typo (case mismatch): '$ek' and '$okey' in file '$filename', skipping '$ek' ..."); } # If we've already seen this key, ignore it and warn if ($section->has_everykey($ek)) { biber_warn("Duplicate entry key: '$ek' in file '$filename', skipping ..."); next; } else { $section->add_everykey($ek); } # We do this as otherwise we have no way of determining the origing .bib entry order # We need this in order to do sorting=none + allkeys because in this case, there is no # "citeorder" because nothing is explicitly cited and so "citeorder" means .bib order push @{$orig_key_order->{$filename}}, $ek; # Record a key->datasource name mapping for error reporting $section->set_keytods($ek, $filename); create_entry($ek, $entry, $source, $smaps); } # if allkeys, push all bibdata keys into citekeys (if they are not already there) # We are using the special "orig_key_order" array which is used to deal with the # situation when sorting=non and allkeys is set. We need an array rather than the # keys from the bibentries hash because we need to preserver the original order of # the .bib as in this case the sorting sub "citeorder" means "bib order" as there are # no explicitly cited keys $section->add_citekeys(@{$orig_key_order->{$filename}}); $logger->debug("Added all citekeys to section '$secnum': " . join(', ', $section->get_citekeys)); } else { # loop over all keys we're looking for and create objects $logger->debug('Wanted keys: ' . join(', ', @$keys)); foreach my $wanted_key (@$keys) { $logger->debug("Looking for key '$wanted_key' in RIS file '$filename'"); if (my @entries = grep { $wanted_key eq $_->{ID} } @ris_entries) { if ($#entries > 0) { biber_warn("Found more than one entry for key '$wanted_key' in '$filename': " . join(',', map {$_->{ID}} @entries) . ' - skipping duplicates ...'); } my $entry = $entries[0]; $logger->debug("Found key '$wanted_key' in RIS file '$filename'"); $logger->debug('Parsing RIS entry object ' . $entry->{ID}); # Record a key->datasource name mapping for error reporting $section->set_keytods($wanted_key, $filename); # See comment above about the importance of the case of the key # passed to create_entry() create_entry($wanted_key, $entry, $source, $smaps); # found a key, remove it from the list of keys we want @rkeys = grep {$wanted_key ne $_} @rkeys; } $logger->debug('Wanted keys now: ' . join(', ', @rkeys)); } } return @rkeys; } =head2 create_entry Create a Biber::Entry object from an entry found in a RIS data source =cut sub create_entry { my ($key, $entry, $source, $smaps) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $dm = Biber::Config->get_dm; my $bibentries = $section->bibentries; my $bibentry = new Biber::Entry; $bibentry->set_field('citekey', $key); # Datasource mapping applied in $smap order (USER->STYLE->DRIVER) foreach my $smap (@$smaps) { my $level = $smap->{level}; MAP: foreach my $map (@{$smap->{map}}) { my $last_type = $entry->{TY}; # defaults to the entrytype unless changed below my $last_field = undef; my $last_fieldval = undef; my @imatches; # For persising parenthetical matches over several steps # Check pertype restrictions unless (not exists($map->{per_type}) or first {$_->{content} eq $entry->{TY}} @{$map->{per_type}}) { next; } # Check per_datasource restrictions # Don't compare case insensitively - this might not be correct unless (not exists($map->{per_datasource}) or first {$_->{content} eq $source} @{$map->{per_datasource}}) { next; } # loop over mapping steps foreach my $step (@{$map->{map_step}}) { # Entrytype map if (my $source = $step->{map_type_source}) { unless ($entry->{TY} eq $source) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->{TY} . "' but map wants '$source' and step has 'final' set ... skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Entry type is '" . $entry->{TY} . "' but map wants '$source' ... skipping step ..."); next; } } # Change entrytype if requested $last_type = $entry->{TY}; $logger->debug("Source mapping (type=$level, key=$key): Changing entry type from '$last_type' to " . $step->{map_type_target}); $entry->{TY} = $step->{map_type_target}; } # Field map if (my $source = $step->{map_field_source}) { # key is a psudo-field. It's guaranteed to exist so # just check if that's what's being asked for unless (lc($source) eq 'entrykey' or exists($entry->{$source})) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): No field '$source' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): No field '$source', skipping step ..."); next; } } $last_field = $source; $last_fieldval = lc($source) eq 'entrykey' ? $entry->{ID} : $entry->{$source}; # map fields to targets if (my $m = $step->{map_match}) { if (defined($step->{map_replace})) { # replace can be null # Can't modify entrykey if (lc($source) eq 'entrykey') { $logger->debug("Source mapping (type=$level, key=$key): Field '$source' is 'entrykey'- cannot remap the value of this field, skipping ..."); next; } my $r = $step->{map_replace}; $logger->debug("Source mapping (type=$level, key=$key): Doing match/replace '$m' -> '$r' on field '$source'"); $entry->{$source} = ireplace($last_fieldval, $m, $r); } else { unless (@imatches = imatch($last_fieldval, $m)) { # Skip the rest of the map if this step doesn't match and match is final if ($step->{map_final}) { $logger->debug("Source mapping (type=$level, key=$key): Field '$source' does not match '$m' and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Field '$source' does not match '$m', skipping step ..."); next; } } } } # Set to a different target if there is one if (my $target = $step->{map_field_target}) { # Can't remap entry key pseudo-field if (lc($source) eq 'entrykey') { $logger->debug("Source mapping (type=$level, key=$key): Field '$source' is 'entrykey'- cannot map this to a new field as you must have an entrykey, skipping ..."); next; } if (exists($entry->{$target})) { if ($map->{map_overwrite} // $smap->{map_overwrite}) { $logger->debug("Source mapping (type=$level, key=$key): Overwriting existing field '$target'"); } else { $logger->debug("Source mapping (type=$level, key=$key): Field '$source' is aliased to field '$target' but both are defined, skipping ..."); next; } } $entry->{$target} = $entry->{$source}; delete($entry->{$source}); } } # field creation if (my $field = $step->{map_field_set}) { # Deal with special tokens if ($step->{map_null}) { $logger->debug("Source mapping (type=$level, key=$key): Deleting field '$field'"); delete($entry->{$field}); } else { if (exists($entry->{$field})) { unless ($map->{map_overwrite} // $smap->{map_overwrite}) { if ($step->{map_final}) { # map_final is set, ignore and skip rest of step $logger->debug("Source mapping (type=$level, key=$key): Field '$field' exists, overwrite is not set and step has 'final' set, skipping rest of map ..."); next MAP; } else { # just ignore this step $logger->debug("Source mapping (type=$level, key=$key): Field '$field' exists and overwrite is not set, skipping step ..."); next; } } } # If append is set, keep the original value and append the new my $orig = $step->{map_append} ? $entry->{$field} : ''; if ($step->{map_origentrytype}) { next unless $last_type; $logger->debug("Source mapping (type=$level, key=$key): Setting field '$field' to '${orig}${last_type}'"); $entry->{$field} = $orig . $last_type; } elsif ($step->{map_origfieldval}) { next unless $last_fieldval; $logger->debug("Source mapping (type=$level, key=$key): Setting field '$field' to '${orig}${last_fieldval}'"); $entry->{$field} = $orig . $last_fieldval; } elsif ($step->{map_origfield}) { next unless $last_field; $logger->debug("Source mapping (type=$level, key=$key): Setting field '$field' to '${orig}${last_field}'"); $entry->{$field} = $orig . $last_field; } else { my $fv = $step->{map_field_value}; # Now re-instate any unescaped $1 .. $9 to get round these being # dynamically scoped and being null when we get here from any # previous map_match $fv =~ s/(?debug("Source mapping (type=$level, key=$key): Setting field '$field' to '${orig}${fv}'"); $entry->{$field} = $orig . $fv; } } } } } } foreach my $f (keys %$entry) { # Now run any defined handler if ($dm->is_field($f)) { my $handler = _get_handler($f); &$handler($bibentry, $entry, $f); } } $bibentry->set_field('entrytype', $entry->{TY}); $bibentry->set_field('datatype', 'ris'); $bibentries->add_entry($key, $bibentry); return; } # HANDLERS # ======== # List fields sub _list { my ($bibentry, $entry, $f) = @_; $bibentry->set_datafield($f, [ $entry->{$f} ]); return; } # Verbatim fields sub _verbatim { my ($bibentry, $entry, $f) = @_; $bibentry->set_datafield($f, $entry->{$f}); return; } # xSV field forms sub _xsv { my $Srx = Biber::Config->getoption('xsvsep'); my $S = qr/$Srx/; my ($bibentry, $entry, $f) = @_; $bibentry->set_datafield($f, [ split(/$S/, $entry->{$f}) ]); return; } # URI fields sub _uri { my ($bibentry, $entry, $f) = @_; my $value = $entry->{$f}; # URL escape if it doesn't look like it already is # This is useful if we are generating URLs automatically with maps which may # contain UTF-8 from other fields unless ($value =~ /\%/) { $value = URI->new($value)->as_string; } $bibentry->set_datafield($f, $value); return; } # Range fields sub _range { my ($bibentry, $entry, $f) = @_; if (my $r = _parse_range_list($entry->{$f})) { $bibentry->set_datafield($f, $r); } return; } # Date fields sub _date { my ($bibentry, $entry, $f) = @_; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $key = $bibentry->get_field('citekey'); my $ds = $section->get_keytods($key); my $date = $entry->{$f}; if ($date =~ m|\A([0-9]{4})/([0-9]{2})/([0-9]{2})\s*\z|xms) { $bibentry->set_datafield('year', $1); $bibentry->set_datafield('month', $2); $bibentry->set_datafield('day', $3); } elsif ($date =~ m|\A([0-9]+)\s*\z|xms) { $bibentry->set_datafield('year', $1); } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid RIS date format: '$date' - ignoring"); } return; } # Name fields sub _name { my ($bibentry, $entry, $f) = @_; my $names = $entry->{$f}; my $names_obj = new Biber::Entry::Names; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); my $key = $bibentry->get_field('citekey'); my $ds = $section->get_keytods($bibentry->get_field('citekey')); foreach my $name (@$names) { $logger->debug('Parsing RIS name'); if ($name =~ m|\A([^,]+)\s*,?\s*([^,]+)?\s*,?\s*([^,]+)?\z|xms) { my $familyname = _join_name_parts(split(/\s+/, $1)) if $1; my $givenname = _join_name_parts(split(/\s+/, $2)) if $2; my $suffix = _join_name_parts(split(/\s+/, $3)) if $3; $logger->debug("Found name component 'family': $familyname") if $familyname; $logger->debug("Found name component 'given': $givenname") if $givenname; $logger->debug("Found name component 'suffix': $suffix") if $suffix; my @lni = _gen_initials(split(/\s/, $1)) if $familyname; my @fni = _gen_initials(split(/\s/, $2)) if $givenname; my @si = _gen_initials(split(/\s/, $3)) if $suffix; my $namestring = ''; # Don't add suffix to namestring or nameinitstring as these are used # for uniquename disambiguation which should only care about family name # + any prefix (if useprefix=true). See biblatex github tracker #306. # family name $namestring .= "$familyname, "; # given name $namestring .= $givenname if $givenname; # Remove any trailing comma and space if, e.g. missing given name # Replace any nbspes $namestring =~ s/,\s+\z//xms; $namestring =~ s/~/ /gxms; # Construct $nameinitstring my $nameinitstr = ''; $nameinitstr .= $familyname if $familyname; $nameinitstr .= '_' . join('', @fni) if $givenname; $nameinitstr =~ s/\s+/_/g; $nameinitstr =~ s/~/_/g; my $name_obj = Biber::Entry::Name->new( given => {string => $givenname || undef, initial => $givenname ? \@fni : undef}, family => {string => $familyname, initial => \@lni}, suffix => {string => $suffix || undef, initial => $suffix ? \@si : undef}, namestring => $namestring, nameinitstring => $nameinitstr ); $names_obj->add_name($name_obj); $bibentry->set_datafield($f, $names_obj); # Special case if ($f eq 'A3') { $bibentry->set_datafield('editortype', 'series'); } } else { biber_warn("Datamodel: Entry '$key' ($ds): Invalid RIS name format: '$name' - ignoring"); } } return; } # Joins name parts using BibTeX tie algorithm. Ties are added: # # 1. After the first part if it is less than three characters long # 2. Before the last part sub _join_name_parts { my @parts = @_; # special case - 1 part if ($#parts == 0) { return $parts[0]; } # special case - 2 parts if ($#parts == 1) { return $parts[0] . '~' . $parts[1]; } my $namestring = $parts[0]; $namestring .= Unicode::GCString->new($parts[0])->length < 3 ? '~' : ' '; $namestring .= join(' ', @parts[1 .. ($#parts - 1)]); $namestring .= '~' . $parts[$#parts]; return $namestring; } # Passed an array of strings, returns an array of initials for the strings sub _gen_initials { my @strings = @_; my @strings_out; foreach my $str (@strings) { # Deal with hyphenated name parts and normalise to a '-' character for easy # replacement with macro later if ($str =~ m/\p{Dash}/) { push @strings_out, join('-', _gen_initials(split(/\p{Dash}/, $str))); } elsif ($str =~ m/\s/) { # name parts with spaces push @strings_out, _gen_initials(split(/\s+/, $str)); } else { my $chr = Unicode::GCString->new($str)->substr(0, 1)->as_string; # Keep diacritics with their following characters if ($chr =~ m/\p{Dia}/) { push @strings_out, Unicode::GCString->new($str)->substr(0, 2)->as_string; } else { push @strings_out, $chr; } } } return @strings_out; } # parses a range and returns a ref to an array of start and end values # Don't return anything if the range is invalid. Deals with RIS files which # have empty SP or EP fields sub _parse_range_list { my $range = shift; my $start = $range->{SP} || ''; my $end = $range->{EP} || ''; if ($start) { return [[$start, $end]]; } else { return undef; } } sub _get_handler { my $field = shift; if (my $h = $handlers->{CUSTOM}{$field}) { return $h; } else { return $handlers->{$dm->get_fieldtype($field)}{$dm->get_fieldformat($field)}{$dm->get_datatype($field)}; } } 1; __END__ =pod =encoding utf-8 =head1 NAME Biber::Input::file::ris - look in a RIS file for an entry and create it if found =head1 DESCRIPTION Provides the extract_entries() method to get entries from a RIS data source and instantiate Biber::Entry objects for what it finds =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/LaTeX000755000765000024 012667073765 17111 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/LaTeX/Recode.pm000444000765000024 3356612667073765 21042 0ustar00philkimestaff000000000000package Biber::LaTeX::Recode; use v5.16; use strict; use warnings; use parent qw(Exporter); use Biber::Config; use Encode; use File::Slurp; use File::Spec; use IPC::Cmd qw( can_run ); use IPC::Run3; # This works with PAR::Packer and Windows. IPC::Run doesn't use Unicode::Normalize; use List::AllUtils qw (first); use Log::Log4perl qw(:no_extra_logdie_message); use XML::LibXML::Simple; use Carp; use utf8; our @EXPORT = qw(latex_encode latex_decode); my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::LaTeX::Recode - Encode/Decode chars to/from UTF-8/lacros in LaTeX =head1 SYNOPSIS use Biber::LaTeX:Recode my $string = 'Muḥammad ibn Mūsā al-Khwārizmī'; my $latex_string = latex_encode($string); # => 'Mu\d{h}ammad ibn M\=us\=a al-Khw\=arizm\={\i}' my $string = 'Mu\d{h}ammad ibn M\=us\=a al-Khw\=arizm\={\i}'; my $utf8_string = latex_decode($string); # => 'Muḥammad ibn Mūsā al-Khwārizmī' =head1 DESCRIPTION Allows conversion between Unicode chars and LaTeX macros. =head1 GLOBAL OPTIONS Possible values for the encoding/decoding set to use are 'null', 'base' and 'full'; default value is 'base'. null => No conversion base => Most common macros and diacritics (sufficient for Western languages and common symbols) full => Also converts punctuation, larger range of diacritics and macros (e.g. for IPA, Latin Extended Additional, etc.), symbols, Greek letters, dingbats, negated symbols, and superscript characters and symbols ... =cut use vars qw( $remap_d $remap_e $remap_e_raw $set_d $set_e ); =head2 init_sets(, ) Initialise recoding sets. We can't do this on loading the module as we don't have the config information to do this yet =cut sub init_sets { shift; # class method ($set_d, $set_e) = @_; no autovivification; # Reset these, mostly for tests which call init_sets more than once $remap_d = {}; $remap_e = {}; $remap_e_raw = {}; my $mapdata; # User-defined recode data file if (my $rdata = Biber::Config->getoption('recodedata')) { my $err; if ( can_run('kpsewhich') ) { run3 [ 'kpsewhich', $rdata ], \undef, \$mapdata, \$err, { return_if_system_error => 1}; if ($? == -1) { biber_error("Error running kpsewhich to look for output_safechars data file: $err"); } chomp $mapdata; $mapdata =~ s/\cM\z//xms; # kpsewhich in cygwin sometimes returns ^M at the end $mapdata = undef unless $mapdata; # sanitise just in case it's an empty string } else { biber_error("Can't run kpsewhich to look for output_safechars data file: $err"); } $logger->info("Using user-defined recode data file '$mapdata'"); } else { # we assume that the data file is in the same dir as the module (my $vol, my $data_path, undef) = File::Spec->splitpath( $INC{'Biber/LaTeX/Recode.pm'} ); # Deal with the strange world of Par::Packer paths, see similar code in Biber.pm if ($data_path =~ m|/par\-| and $data_path !~ m|/inc|) { # a mangled PAR @INC path $mapdata = File::Spec->catpath($vol, "$data_path/inc/lib/Biber/LaTeX/recode_data.xml"); } else { $mapdata = File::Spec->catpath($vol, $data_path, 'recode_data.xml'); } } # Read driver config file my $xml = File::Slurp::read_file($mapdata) or biber_error("Can't read file $mapdata"); my $doc = XML::LibXML->load_xml(string => decode('UTF-8', $xml)); my $xpc = XML::LibXML::XPathContext->new($doc); my @types = qw(letters diacritics punctuation symbols negatedsymbols superscripts cmdsuperscripts dings greek); # Have to have separate loops for decode/recode or you can't have independent decode/recode # sets # Construct decode set foreach my $type (@types) { foreach my $maps ($xpc->findnodes("/texmap/maps[\@type='$type']")) { my @set = split(/\s*,\s*/, $maps->getAttribute('set')); next unless first {$set_d eq $_} @set; foreach my $map ($maps->findnodes('map')) { my $from = $map->findnodes('from')->shift(); my $to = $map->findnodes('to')->shift(); $remap_d->{$type}{map}{NFD($from->textContent())} = NFD($to->textContent()); } } # Things we don't want to change when decoding as this breaks some things foreach my $d ($xpc->findnodes('/texmap/decode_exclude/char')) { delete($remap_d->{$type}{map}{NFD($d->textContent())}); } } # Construct encode set foreach my $type (@types) { foreach my $maps ($xpc->findnodes("/texmap/maps[\@type='$type']")) { my @set = split(/\s*,\s*/, $maps->getAttribute('set')); next unless first {$set_e eq $_} @set; foreach my $map ($maps->findnodes('map')) { my $from = $map->findnodes('from')->shift(); my $to = $map->findnodes('to')->shift(); $remap_e->{$type}{map}{NFD($to->textContent())} = NFD($from->textContent()); } # There are some duplicates in the data to handle preferred encodings. foreach my $map ($maps->findnodes('map[from[@preferred]]')) { my $from = $map->findnodes('from')->shift(); my $to = $map->findnodes('to')->shift(); $remap_e->{$type}{map}{NFD($to->textContent())} = NFD($from->textContent()); } # Some things might need to be inserted as is rather than wrapped in some macro/braces foreach my $map ($maps->findnodes('map[from[@raw]]')) { my $from = $map->findnodes('from')->shift(); my $to = $map->findnodes('to')->shift(); $remap_e_raw->{NFD($to->textContent())} = 1; } } # Things we don't want to change when encoding as this would break LaTeX foreach my $e ($xpc->findnodes('/texmap/encode_exclude/char')) { delete($remap_e->{$type}{map}{NFD($e->textContent())}); } } # Populate the decode regexps # sort by descending length of macro name to avoid shorter macros which are substrings # of longer ones damaging the longer ones foreach my $type (@types) { next unless exists $remap_d->{$type}; $remap_d->{$type}{re} = join('|', map { /[\.\^\|\+\-\)\(]/ ? '\\' . $_ : $_ } sort {length($b) <=> length($a)} keys %{$remap_d->{$type}{map}}); $remap_d->{$type}{re} = qr|$remap_d->{$type}{re}|; } # Populate the encode regexps foreach my $type (@types) { next unless exists $remap_e->{$type}; $remap_e->{$type}{re} = join('|', map { /[\.\^\|\+\-\)\(]/ ? '\\' . $_ : $_ } sort keys %{$remap_e->{$type}{map}}); $remap_e->{$type}{re} = qr|$remap_e->{$type}{re}|; } } =head2 latex_decode($text, @options) Converts LaTeX macros in the $text to Unicode characters. The function accepts a number of options: * normalize => $bool (default 1) whether the output string should be normalized with Unicode::Normalize * normalization => (default 'NFD') and if yes, the normalization form to use (see the Unicode::Normalize documentation) =cut sub latex_decode { my $text = shift; # Optimisation - if there are no macros, no point doing anything return $text unless $text =~ m/\\/; # Optimisation - if virtual null set was specified, do nothing return $text if $set_d eq 'null'; $logger->trace("String before latex_decode() -> '$text'"); my %opts = @_; my $norm = exists $opts{normalize} ? $opts{normalize} : 1; my $norm_form = exists $opts{normalization} ? $opts{normalization} : 'NFD'; # Deal with raw TeX \char macros. $text =~ s/\\char"(\p{ASCII_Hex_Digit}+)/"chr(0x$1)"/gee; # hex chars $text =~ s/\\char'(\d+)/"chr(0$1)"/gee; # octal chars $text =~ s/\\char(\d+)/"chr($1)"/gee; # decimal chars $text =~ s/(\\[a-zA-Z]+)\\(\s+)/$1\{\}$2/g; # \foo\ bar -> \foo{} bar $text =~ s/([^{]\\\w)([;,.:%])/$1\{\}$2/g; #} Aaaa\o, -> Aaaa\o{}, foreach my $type ('greek', 'dings', 'punctuation', 'symbols', 'negatedsymbols', 'superscripts', 'cmdsuperscripts', 'letters', 'diacritics') { my $map = $remap_d->{$type}{map}; my $re = $remap_d->{$type}{re}; next unless $re; # Might not be present depending on set if ($type eq 'negatedsymbols') { $text =~ s/\\not\\($re)/$map->{$1}/ge; } elsif ($type eq 'superscripts') { $text =~ s/\\textsuperscript\{($re)\}/$map->{$1}/ge; } elsif ($type eq 'cmdsuperscripts') { $text =~ s/\\textsuperscript\{\\($re)\}/$map->{$1}/ge; } elsif ($type eq 'dings') { $text =~ s/\\ding\{([2-9AF][0-9A-F])\}/$map->{$1}/ge; } elsif ($type eq 'letters') { $text =~ s/\\($re)(?:\{\}|\s+|\b)/$map->{$1}/ge; } elsif (first {$type eq $_} ('punctuation', 'symbols', 'greek')) { $text =~ s/\\($re)(?: \{\}|\s+|\b)/$map->{$1}/ge; } elsif ($type eq 'diacritics') { $text =~ s/\\($re)\s*\{(\pL\pM*)\}/$2 . $map->{$1}/ge; # Conditional regexp with code-block condition # non letter macros for diacritics (e.g. \=) can be followed by any letter # but letter diacritic macros (e.g \c) can't (\cS) horribly Broken # # If the RE for the macro doesn't end with a basic LaTeX macro letter (\=), then # next char can be any letter (\=d) # Else if it did end with a normal LaTeX macro letter (\c), then # If this was followed by a space (\c ) # Any letter is allowed after the space (\c S) # Else # Only a non basic LaTeX letter is allowed (\c-) $text =~ s/\\# slash ($re)# the diacritic (\s*)# optional space (# capture paren (?(?{$1 !~ m:[A-Za-z]$:})# code block condition (is not a letter?) \pL # yes pattern | # no pattern (?(?{$2}) # code block condition (space matched earlier after diacritic?) \pL # yes pattern | # no pattern [^A-Za-z] ) # close conditional ) # close conditional \pM* # optional marks ) # capture paren /$3 . $map->{$1}/gxe; } } # Now remove braces around single letters with diacritics (which the replace above # can result in). Things like '{á}'. Such things can break kerning. We can't do this in # the RE above as we can't determine if the braces are wrapping a phrase because this # match is on an entire file string. So we can't in one step tell the difference between: # # author = {Andr\'e} # and # author = {Andr\'{e}} # # when this is part of a (much) larger string # # We don't want to do this if it would result in a broken macro name like with # \textupper{é} # # Workaround perl's lack of variable-width negative look-behind - # Reverse string (and therefore some of the Re) and use variable width negative look-ahead $text = reverse $text; $text =~ s/}(\pM+\pL){(?!\pL+\\)/$1/g; $text = reverse $text; $logger->trace("String in latex_decode() now -> '$text'"); if ($norm) { return Unicode::Normalize::normalize( $norm_form, $text ); } else { return $text; } } =head2 latex_encode($text, @options) Converts UTF-8 to LaTeX =cut sub latex_encode { my $text = shift; # Optimisation - if virtual null set was specified, do nothing return $text if $set_e eq 'null'; foreach my $type ('greek', 'dings', 'negatedsymbols', 'superscripts', 'cmdsuperscripts', 'diacritics', 'letters', 'punctuation', 'symbols') { my $map = $remap_e->{$type}{map}; my $re = $remap_e->{$type}{re}; next unless $re; # Might not be present depending on set if ($type eq 'negatedsymbols') { $text =~ s/($re)/"{\$\\not\\" . $map->{$1} . '$}'/ge; } elsif ($type eq 'superscripts') { $text =~ s/($re)/'\textsuperscript{' . $map->{$1} . '}'/ge; } elsif ($type eq 'cmdsuperscripts') { $text =~ s/($re)/"\\textsuperscript{\\" . $map->{$1} . "}"/ge; } elsif ($type eq 'dings') { $text =~ s/($re)/'\ding{' . $map->{$1} . '}'/ge; } elsif ($type eq 'letters') { # General macros (excluding special encoding excludes) $text =~ s/($re)/($remap_e_raw->{$1} ? '' : "\\") . $map->{$1} . ($remap_e_raw->{$1} ? '' : '{}')/ge; } elsif (first {$type eq $_} ('punctuation', 'symbols', 'greek')) { # Math mode macros (excluding special encoding excludes) $text =~ s/($re)/($remap_e_raw->{$1} ? '' : "{\$\\") . $map->{$1} . ($remap_e_raw->{$1} ? '' : '$}')/ge; } elsif ($type eq 'diacritics') { # special case such as "i\x{304}" -> '\={\i}' -> "i" needs the dot removing for accents $text =~ s/i($re)/"\\" . $map->{$1} . '\i{}'/ge; $text =~ s/\{(\pL\pM*)\}($re)/"\\" . $map->{$2} . "{$1}"/ge; $text =~ s/(\pL\pM*)($re)/"\\" . $map->{$2} . "{$1}"/ge; $text =~ s{ (\PM)($re)($re)($re) }{ "\\" . $map->{$4} . "{\\" . $map->{$3} . "{\\" . $map->{$2} . "{$1}" . '}}' }gex; $text =~ s{ (\PM)($re)($re) }{ "\\" . $map->{$3} . "{\\" . $map->{$2} . "{$1}" . '}' }gex; $text =~ s{ (\PM)($re) }{ "\\" . $map->{$2} . "{$1}" }gex; } } return $text; } 1; __END__ =head1 AUTHOR François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/LaTeX/recode_data.xml000444000765000024 16662612667073765 22303 0ustar00philkimestaff000000000000 AA Å AE Æ DH Ð O Ø Thorn Þ TH Þ ss ß aa å ae æ dh ð o ø textthorn þ textthornvari þ textthornvarii þ textthornvariii þ textthornvariv þ th þ DJ Đ dj đ textcrd đ textHbar Ħ textcrh ħ texthbar ħ i ı j ȷ IJ IJ ij ij textkra ĸ L Ł textbarl ł l ł NG Ŋ ng ŋ OE Œ oe œ textTbar Ŧ textTstroke Ŧ texttbar ŧ texttstroke ŧ textcrb ƀ textBhook Ɓ textOopen Ɔ textChook Ƈ textchook ƈ texthtc ƈ textDafrican Ɖ textDhook Ɗ textEreversed Ǝ textEopen Ɛ textFhook Ƒ textflorin ƒ textGammaafrican Ɣ texthvlig ƕ hv ƕ textIotaafrican Ɩ textKhook Ƙ textkhook ƙ texthtk ƙ textcrlambda ƛ textNhookleft Ɲ OHORN Ơ ohorn ơ textPhook Ƥ textphook ƥ texthtp ƥ textEsh Ʃ ESH Ʃ textlooptoprevesh ƪ textpalhookbelow ƫ textThook Ƭ textthook ƭ texthtt ƭ textTretroflexhook Ʈ UHORN Ư uhorn ư textVhook Ʋ textYhook Ƴ textyhook ƴ textEzh Ʒ texteturned ǝ textturna ɐ textscripta ɑ textturnscripta ɒ textbhook ɓ texthtb ɓ textoopen ɔ textopeno ɔ textctc ɕ textdtail ɖ textrtaild ɖ textdhook ɗ texthtd ɗ textreve ɘ textschwa ə textrhookschwa ɚ texteopen ɛ textepsilon ɛ textrevepsilon ɜ textrhookrevepsilon ɝ textcloserevepsilon ɞ textbardotlessj ɟ texthtg ɠ textscriptg ɡ textscg ɢ textgammalatinsmall ɣ textgamma ɣ textramshorns ɤ textturnh ɥ texthth ɦ texththeng ɧ textbari ɨ textiotalatin ɩ textiota ɩ textsci ɪ textltilde ɫ textbeltl ɬ textrtaill ɭ textlyoghlig ɮ textturnm ɯ textturnmrleg ɰ textltailm ɱ textltailn ɲ textnhookleft ɲ textrtailn ɳ textscn ɴ textbaro ɵ textscoelig ɶ textcloseomega ɷ textphi ɸ textturnr ɹ textturnlonglegr ɺ textturnrrtail ɻ textlonglegr ɼ textrtailr ɽ textfishhookr ɾ textlhti ɿ textscr ʀ textinvscr ʁ textrtails ʂ textesh ʃ texthtbardotlessj ʄ textraisevibyi ʅ textctesh ʆ textturnt ʇ textrtailt ʈ texttretroflexhook ʈ textbaru ʉ textupsilon ʊ textscriptv ʋ textvhook ʋ textturnv ʌ textturnw ʍ textturny ʎ textscy ʏ textrtailz ʐ textctz ʑ textezh ʒ textyogh ʒ textctyogh ʓ textglotstop ʔ textrevglotstop ʕ textinvglotstop ʖ textstretchc ʗ textbullseye ʘ textscb ʙ textcloseepsilon ʚ texthtscg ʛ textsch ʜ textctj ʝ textturnk ʞ textscl ʟ texthtq ʠ textbarglotstop ʡ textbarrevglotstop ʢ textdzlig ʣ textdyoghlig ʤ textdctzlig ʥ texttslig ʦ textteshlig ʧ texttesh ʧ texttctclig ʨ hamza ʾ ain ʿ ayn ʿ textprimstress ˈ textlengthmark ː ` ̀ ' ́ ^ ̂ ~ ̃ = ̄ u ̆ . ̇ " ̈ h ̉ r ̊ H ̋ v ̌ | ̍ U ̎ G ̏ M ̢ d ̣ c ̧ k ̨ b ̱ B ̵ t ̑ textvbaraccent ̍ textdoublevbaraccent ̎ textdotbreve ̐ textturncommaabove ̒ textcommaabove ̓ textrevcommaabove ̔ textcommaabover ̕ textsubgrave ̖ textsubacute ̗ textadvancing ̘ textretracting ̙ textlangleabove ̚ textrighthorn ̛ textsublhalfring ̜ textraising ̝ textlowering ̞ textsubplus ̟ textsubbar ̠ textsubminus ̠ textpalhookbelow ̡ textsubumlaut ̤ textsubring ̥ textcommabelow ̦ textsyllabic ̩ textsubbridge ̪ textsubw ̫ textsubwedge ̬ textsubcircnum ̭ textsubbreve ̮ textundertie ̮ textsubarch ̯ textsubtilde ̰ subdoublebar ̳ textsuperimposetilde ̴ textlstrokethru ̶ textsstrikethru ̷ textlstrikethru ̸ textsubrhalfring ̹ textinvsubbridge ̺ textsubsquare ̻ textseagull ̼ textovercross ̽ overbridge ͆ subdoublebar ͇ subdoublevert ͈ subcorner ͉ crtilde ͊ textoverw ͊ dottedtilde ͋ doubletilde ͌ spreadlips ͍ whistle ͎ textrightarrowhead ͐ textlefthalfring ͑ sublptr ͔ subrptr ͕ textrightuparrowhead ͖ textrighthalfring ͗ textdoublebreve ͝ textdoublemacron ͞ textdoublemacronbelow ͟ textdoubletilde ͠ texttoptiebar ͡ sliding ͢ - - textendash -- textendash -- textemdash --- textquoteleft textquoteright quotesinglbase textquotedblleft textquotedblright quotedblbase dag ddag textbullet dots textperthousand textpertenthousand guilsinglleft guilsinglright textreferencemark textinterrobang textoverline langle rangle textquotedbl " textdollar $ textpercent % textampersand & textquotesingle ' textasteriskcentered * textless < textequals = textgreater > textbackslash \ textasciicircum ^ textunderscore _ textasciigrave ` textbraceleft { textbar | textbraceright } textasciitilde ~ nobreakspace   textexclamdown ¡ textcent ¢ textsterling £ pounds £ textcurrency ¤ textyen ¥ textbrokenbar ¦ textsection § S § textasciidieresis ¨ textcopyright © copyright © textordfeminine ª guillemotleft « textminus textregistered ® textasciimacron ¯ textdegree ° texttwosuperior ² textthreesuperior ³ textasciiacute ´ textparagraph P textcentereddot · textperiodcentered · textasciicedilla ¸ textonesuperior ¹ textordmasculine º guillemotright » textonequarter ¼ textonehalf ½ textthreequarters ¾ textquestiondown ¿ textg g textdiv ÷ div ÷ texttimes × times × textmu µ mu µ textpm ± pm ± textlogicalnot ¬ lnot ¬ textcolonmonetary textlira textnaira textwon textdong euro texteuro textnumero texttrademark leftarrow uparrow rightarrow downarrow leftrightarrow updownarrow leadsto rightleftharpoons Rightarrow Leftrightarrow forall complement partial exists nexists set Delta nabla in notin ni prod coprod sum mp dotplus setminus ast circ bullet surd propto infty angle measuredangle sphericalangle mid nmid parallel nparallel wedge vee cap cup int iint iiint oint therefore because sim backsim wr nsim simeq cong ncong approx approxeq asymp Bumpeq bumpeq doteq doteqdot fallingdotseq risingdotseq eqcirc circeq triangleq neq equiv leq geq leqq geqq lneqq gneqq ll gg between nless ngtr nleq ngeq lesssim gtrsim lessgtr gtrless prec succ preccurlyeq succcurlyeq precsim succsim nprec nsucc subset supset subseteq supseteq nsubseteq nsupseteq subsetneq supsetneq uplus sqsubset sqsupset sqsubseteq sqsupseteq sqcap sqcup oplus ominus otimes oslash odot circledcirc circledast circleddash boxplus boxminus boxtimes boxdot vdash dashv top bot Vdash Vvdash nVdash lhd rhd unlhd unrhd multimap intercal veebar barwedge bigwedge bigvee bigcap bigcup diamond cdot star divideontimes bowtie ltimes rtimes leftthreetimes rightthreetimes backsimeq curlyvee curlywedge Subset Supset Cap Cup pitchfork lessdot gtrdot lll ggg lesseqgtr gtreqless curlyeqprec curlyeqsucc lnsim gnsim precnsim succnsim ntriangleleft ntriangleright ntrianglelefteq ntrianglerighteq vdots cdots ddots lceil rceil lfloor rfloor Box spadesuit heartsuit diamondsuit clubsuit flat natural sharp tone5 ˥ tone4 ˦ tone3 ˧ tone2 ˨ tone1 ˩ asymp lesssim gtrsim subset supset ni simeq approx equiv preccurlyeq succcurlyeq sqsubseteq sqsupseteq 0 i 4 5 6 7 8 9 + - = ( ) n SM h ʰ j ʲ r ʳ w ʷ y ʸ texthth ʱ textturnr ʴ textturnrrtail ʵ textinvscr ʶ 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E A1 A2 A3 A4 A5 A6 A7 A9 AA AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE alpha α beta β gamma γ delta δ varepsilon ε zeta ζ eta η vartheta θ iota ι kappa κ lambda λ mu μ nu ν xi ξ omicron ο pi π varrho ρ varsigma ς sigma σ tau τ upsilon υ varphi φ chi χ psi ψ omega ω Alpha Α Beta Β Gamma Γ Delta Δ Epsilon Ε Zeta Ζ Eta Η Theta Θ Iota Ι Kappa Κ Lambda Λ Mu Μ Nu Ν Xi Ξ Omicron Ο Pi Π Rho Ρ Sigma Σ Tau Τ Upsilon Υ Phi Φ Chi Χ Psi Ψ Omega Ω - | textbraceleft textbraceright " # $ % & ' * < = > [ ] \ ^ _ ` g { | } ~   £ ± biblatex-biber-2.4/lib/Biber/Output000755000765000024 012667073765 17434 5ustar00philkimestaff000000000000biblatex-biber-2.4/lib/Biber/Output/base.pm000444000765000024 2326512667073765 21071 0ustar00philkimestaff000000000000package Biber::Output::base; use v5.16; use strict; use warnings; use Biber::Entry; use Biber::Utils; use Encode; use IO::File; use Text::Wrap; $Text::Wrap::columns = 80; use Log::Log4perl qw( :no_extra_logdie_message ); use Unicode::Normalize; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Output::base - base class for Biber output modules. =cut =head2 new Initialize a Biber::Output::base object =cut sub new { my $class = shift; my $obj = shift; my $self; if (defined($obj) and ref($obj) eq 'HASH') { $self = bless $obj, $class; } else { $self = bless {}, $class; } $self->{output_data}{HEAD} = ''; $self->{output_data}{TAIL} = ''; return $self; } =head2 set_output_target_file Set the output target file of a Biber::Output::base object A convenience around set_output_target so we can keep track of the filename =cut sub set_output_target_file { my $self = shift; my $file = shift; $self->{output_target_file} = $file; my $enc_out; if (Biber::Config->getoption('output_encoding')) { $enc_out = ':encoding(' . Biber::Config->getoption('output_encoding') . ')'; } my $TARGET = IO::File->new($file, ">$enc_out"); $self->set_output_target($TARGET); } =head2 get_output_target_file Get the output target file name =cut sub get_output_target_file { my $self = shift; return $self->{output_target_file}; } =head2 set_output_target Set the output target of a Biber::Output::base object =cut sub set_output_target { my $self = shift; my $target = shift; $self->{output_target} = $target; return; } =head2 set_output_head Set the output head of a Biber::Output::base object $data could be anything - the caller is expected to know. =cut sub set_output_head { my $self = shift; my $data = shift; $self->{output_data}{HEAD} = $data; return; } =head2 set_output_tail Set the output tail of a Biber::Output::base object $data could be anything - the caller is expected to know. =cut sub set_output_tail { my $self = shift; my $data = shift; $self->{output_data}{TAIL} = $data; return; } =head2 get_output_head Get the output head of a Biber::Output object $data could be anything - the caller is expected to know. Mainly used in debugging =cut sub get_output_head { my $self = shift; return $self->{output_data}{HEAD}; } =head2 get_output_tail Get the output tail of a Biber::Output object $data could be anything - the caller is expected to know. Mainly used in debugging =cut sub get_output_tail { my $self = shift; return $self->{output_data}{TAIL}; } =head2 add_output_head Add to the head output data of a Biber::Output::base object The base class method just does a string append =cut sub add_output_head { my $self = shift; my $data = shift; $self->{output_data}{HEAD} .= $data; return; } =head2 add_output_tail Add to the tail output data of a Biber::Output::base object The base class method just does a string append =cut sub add_output_tail { my $self = shift; my $data = shift; $self->{output_data}{TAIL} .= $data; return; } =head2 set_output_section Records the section object in the output object We need some information from this when writing the .bbl =cut sub set_output_section { my $self = shift; my $secnum = shift; my $section = shift; $self->{section}{$secnum} = $section; return; } =head2 get_output_section Retrieve the output section object =cut sub get_output_section { my $self = shift; my $secnum = shift; return $self->{section}{$secnum}; } =head2 get_output_entries Get the sorted order output data for all entries in a list as array ref =cut sub get_output_entries { my $self = shift; my $section = shift; my $list = shift; return [ map {$self->{output_data}{ENTRIES}{$section}{index}{$_} || $self->{output_data}{MISSING_ENTRIES}{$section}{index}{$_} || $self->{output_data}{ALIAS_ENTRIES}{$section}{index}{$_}} @{$list->get_keys}]; } =head2 get_output_comments Get the output comments for tool mode tests =cut sub get_output_comments { my $self = shift; return $self->{output_data}{COMMENTS}; } =head2 get_output_entry Get the output data for a specific entry. Used really only in tests as it instantiates list dynamic information so we can see it in tests. As a result, we have to NFC() the result to mimic real output since UTF-8 output is assumed in most tests. =cut sub get_output_entry { my $self = shift; my $key = shift; my $list = shift; # might not be set for, for example, tool mode tests my $section = shift; # defaults - mainly for tests if (not defined($section)) { if (Biber::Config->getoption('tool') or Biber::Config->getoption('output_format') eq 'bibtex') { $section = 99999; } else { $section = 0; } } # Force a return of undef if there is no output for this key to avoid # dereferencing errors in tests my $out = $self->{output_data}{ENTRIES}{$section}{index}{$key} || $self->{output_data}{MISSING_ENTRIES}{$section}{index}{$key} || $self->{output_data}{ALIAS_ENTRIES}{$section}{index}{$key}; my $out_string = $list ? $list->instantiate_entry($out, $key) : $out; # If requested to convert UTF-8 to macros ... if (Biber::Config->getoption('output_safechars')) { $out_string = latex_recode_output($out_string); } else { # ... or, check for encoding problems and force macros my $outenc = Biber::Config->getoption('output_encoding'); if ($outenc ne 'UTF-8') { # Can this entry be represented in the output encoding? if (encode($outenc, NFC($out_string)) =~ /\?/) { # Malformed data encoding char # So convert to macro $out_string = latex_recode_output($out_string); biber_warn("The entry '$key' has characters which cannot be encoded in '$outenc'. Recoding problematic characters into macros."); } } } # Sometimes $out_string might still be a scalar ref (tool mode, for example which doesn't use # sort lists) return $out ? (ref($out_string) eq 'SCALAR' ? NFC($$out_string) : NFC($out_string)) : undef; } =head2 set_output_entry Add an entry output to a Biber::Output::base object The base class method just does a dump =cut sub set_output_entry { my $self = shift; my $entry = shift; my $section = shift; my $struc = shift; $self->{output_data}{ENTRIES}{$section}{index}{$entry->get_field('citekey')} = $entry->dump; return; } =head2 create_output_misc Create the output for misc bits and pieces like preamble and closing macro call and add to output object. =cut sub create_output_misc { return; } =head2 create_output_section Create the output from the sections data and push it into the output object. =cut sub create_output_section { my $self = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); # We rely on the order of this array for the order of the .bbl foreach my $k ($section->get_citekeys) { # Regular entry my $be = $section->bibentry($k) or biber_error("Cannot find entry with key '$k' to output"); $self->set_output_entry($be, $section, Biber::Config->get_dm); } # Make sure the output object knows about the output section $self->set_output_section($secnum, $section); # undef citekeys are global to a section # Missing citekeys foreach my $k ($section->get_undef_citekeys) { $self->set_output_undefkey($k, $section); } # alias citekeys are global to a section foreach my $k ($section->get_citekey_aliases) { my $realkey = $section->get_citekey_alias($k); $self->set_output_keyalias($k, $realkey, $section) } return; } =head2 set_output_keyalias Set the output for a key which is an alias to another key =cut sub set_output_keyalias { return; } =head2 set_output_undefkey Set the output for an undefined key =cut sub set_output_undefkey { return; } =head2 output Generic base output method =cut sub output { my $self = shift; my $data = $self->{output_data}; my $target = $self->{output_target}; my $target_string = "Target"; # Default if ($self->{output_target_file}) { $target_string = $self->{output_target_file}; } $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...'); $logger->info("Writing '$target_string' with encoding '" . Biber::Config->getoption('output_encoding') . "'"); out($target, $data->{HEAD}); foreach my $secnum (sort keys %{$data->{ENTRIES}}) { out($target, "SECTION: $secnum\n\n"); my $section = $self->get_output_section($secnum); foreach my $list (@{$section->get_lists}) { my $listlabel = $list->get_label; my $listtype = $list->get_type; out($target, " LIST: $listlabel\n\n"); foreach my $k ($list->get_keys) { my $entry_string = $data->{ENTRIES}{$secnum}{index}{$k}; out($target, $entry_string); } } } out($target, $data->{TAIL}); $logger->info("Output to $target_string"); close $target; return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Output/bbl.pm000444000765000024 4764312667073765 20724 0ustar00philkimestaff000000000000package Biber::Output::bbl; use v5.16; use strict; use warnings; use parent qw(Biber::Output::base); use Biber::Config; use Biber::Constants; use Biber::Entry; use Biber::Utils; use Encode; use List::AllUtils qw( :all ); use IO::File; use Log::Log4perl qw( :no_extra_logdie_message ); use Text::Wrap; use Unicode::Normalize; $Text::Wrap::columns = 80; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Output::bbl - class for Biber output of .bbl =cut =head2 new Initialize a Biber::Output::bbl object =cut sub new { my $class = shift; my $obj = shift; my $self = $class->SUPER::new($obj); $self->{output_data}{HEAD} = <get_preamble) { $pa = join("%\n", @$pa); # If requested to convert UTF-8 to macros ... if (Biber::Config->getoption('output_safechars')) { $pa = latex_recode_output($pa); } else { # ... or, check for encoding problems and force macros my $outenc = Biber::Config->getoption('output_encoding'); if ($outenc ne 'UTF-8') { # Can this entry be represented in the output encoding? if (encode($outenc, NFC($pa), sub {"\0"}) =~ /\0/) { # Malformed data encoding char # So convert to macro $pa = latex_recode_output($pa); } } } $self->{output_data}{HEAD} .= "\\preamble{%\n$pa%\n}\n\n"; } $self->{output_data}{TAIL} .= "\\endinput\n\n"; return; } =head2 set_output_target_file Set the output target file of a Biber::Output::bbl object A convenience around set_output_target so we can keep track of the filename =cut sub set_output_target_file { my $self = shift; my $bblfile = shift; $self->{output_target_file} = $bblfile; my $enc_out; if (my $enc = Biber::Config->getoption('output_encoding')) { $enc_out = ":encoding($enc)"; } my $BBLFILE = IO::File->new($bblfile, ">$enc_out"); $self->set_output_target($BBLFILE); } =head2 _printfield Add the .bbl for a text field to the output accumulator. =cut sub _printfield { my ($be, $field, $str) = @_; my $field_type = 'field'; # crossref and xref are of type 'strng' in the .bbl if (lc($field) eq 'crossref' or lc($field) eq 'xref') { $field_type = 'strng'; } # auto-escape TeX special chars if: # * The entry is not a BibTeX entry (no auto-escaping for BibTeX data) # * It's not a string field if ($field_type ne 'strng' and $be->get_field('datatype') ne 'bibtex') { $str =~ s/(?getoption('wraplines')) { ## 16 is the length of ' \field{}{}' or ' \strng{}{}' if ( 16 + Unicode::GCString->new($field)->length + Unicode::GCString->new($str)->length > 2*$Text::Wrap::columns ) { return " \\${field_type}{$field}{%\n" . wrap(' ', ' ', $str) . "%\n }\n"; } elsif ( 16 + Unicode::GCString->new($field)->length + Unicode::GCString->new($str)->length > $Text::Wrap::columns ) { return wrap(' ', ' ', "\\${field_type}{$field}{$str}" ) . "\n"; } else { return " \\${field_type}{$field}{$str}\n"; } } else { return " \\${field_type}{$field}{$str}\n"; } return; } =head2 set_output_keyalias Set the output for a key which is an alias to another key =cut sub set_output_keyalias { my $self = shift; my $alias = shift; my $key = shift; my $section = shift; my $secnum = $section->number; my $acc = " \\keyalias{$alias}{$key}\n"; # Create an index by keyname for easy retrieval $self->{output_data}{ALIAS_ENTRIES}{$secnum}{index}{$alias} = \$acc; return; } =head2 set_output_undefkey Set the .bbl output for an undefined key =cut sub set_output_undefkey { my $self = shift; my $key = shift; # undefined key my $section = shift; # Section object the entry occurs in my $secnum = $section->number; my $acc = " \\missing{$key}\n"; # Create an index by keyname for easy retrieval $self->{output_data}{MISSING_ENTRIES}{$secnum}{index}{$key} = \$acc; return; } =head2 set_output_entry Set the .bbl output for an entry. This is the meat of the .bbl output =cut sub set_output_entry { my $self = shift; my $be = shift; # Biber::Entry object my $bee = $be->get_field('entrytype'); my $section = shift; # Section object the entry occurs in my $dm = shift; # Data Model object my $acc = ''; my $secnum = $section->number; my $key = $be->get_field('citekey'); # Skip entrytypes we don't want to output according to datamodel return if $dm->entrytype_is_skipout($bee); $acc .= " \\entry{$key}{$bee}{" . join(',', @{filter_entry_options($be->get_field('options'))}) . "}\n"; # Generate set information if ( $bee eq 'set' ) { # Set parents get \set entry ... $acc .= " \\set{" . join(',', @{$be->get_field('entryset')}) . "}\n"; } else { # Everything else that isn't a set parent ... if (my $es = $be->get_field('entryset')) { # ... gets a \inset if it's a set member $acc .= " \\inset{" . join(',', @$es) . "}\n"; } } # Output name fields foreach my $namefield (@{$dm->get_fields_of_type('list', 'name')}) { next if $dm->field_is_skipout($namefield); if ( my $nf = $be->get_field($namefield) ) { my $plo = ''; # Did we have "and others" in the data? if ( $nf->get_morenames ) { $acc .= " \\true{more$namefield}\n"; } my $total = $nf->count_names; my $lni = $be->get_labelname_info; if (defined($lni) and $lni eq $namefield) { my @plo; # Add uniquelist, if defined if (my $ul = $nf->get_uniquelist){ push @plo, "uniquelist=$ul"; } # Add per-namelist options foreach my $ploname (keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAMELIST}}) { if (defined($nf->${\"get_$ploname"})) { my $plo = $nf->${\"get_$ploname"}; if ($CONFIG_OPTTYPE_BIBLATEX{lc($ploname)} and $CONFIG_OPTTYPE_BIBLATEX{lc($ploname)} eq 'boolean') { push @plo, "$ploname=" . map_boolean($plo, 'tostring'); } else { push @plo, "$ploname=$plo"; } } } $plo = join(',', @plo); } $acc .= " \\name{$namefield}{$total}{$plo}{%\n"; foreach my $n (@{$nf->names}) { $acc .= $n->name_to_bbl; } $acc .= " }\n"; } } # Output list fields foreach my $listfield (@{$dm->get_fields_of_fieldtype('list')}) { next if $dm->field_is_datatype('name', $listfield); # name is a special list next if $dm->field_is_datatype('verbatim', $listfield); # special lists next if $dm->field_is_datatype('uri', $listfield); # special lists next if $dm->field_is_skipout($listfield); if (my $lf = $be->get_field($listfield)) { if ( lc($lf->[-1]) eq Biber::Config->getoption('others_string') ) { $acc .= " \\true{more$listfield}\n"; pop @$lf; # remove the last element in the array } my $total = $#$lf + 1; $acc .= " \\list{$listfield}{$total}{%\n"; foreach my $f (@$lf) { $acc .= " {$f}%\n"; } $acc .= " }\n"; } } my $namehash = $be->get_field('namehash'); $acc .= " \\strng{namehash}{$namehash}\n" if $namehash; my $fullhash = $be->get_field('fullhash'); $acc .= " \\strng{fullhash}{$fullhash}\n" if $fullhash; if ( Biber::Config->getblxoption('labelalpha', $bee) ) { # Might not have been set due to skiplab/dataonly if (my $label = $be->get_field('labelalpha')) { $acc .= " \\field{labelalpha}{$label}\n"; } } # This is special, we have to put a marker for sortinit{hash} and then replace this string # on output as it can vary between lists $acc .= " SORTINIT\n"; $acc .= " SORTINITHASH\n"; # The labeldate option determines whether "extrayear" is output if ( Biber::Config->getblxoption('labeldate', $bee)) { # Might not have been set due to skiplab/dataonly if (my $nameyear = $be->get_field('nameyear')) { if ( Biber::Config->get_seen_nameyear($nameyear) > 1) { $acc .= " EXTRAYEAR\n"; } } if (my $ly = $be->get_field('labelyear')) { $acc .= " \\field{labelyear}{$ly}\n"; } if (my $lm = $be->get_field('labelmonth')) { $acc .= " \\field{labelmonth}{$lm}\n"; } if (my $ld = $be->get_field('labelday')) { $acc .= " \\field{labelday}{$ld}\n"; } if ($be->field_exists('datelabelsource')) { $acc .= " \\field{datelabelsource}{" . $be->get_field('datelabelsource') . "}\n"; } } # The labeltitle option determines whether "extratitle" is output if ( Biber::Config->getblxoption('labeltitle', $bee)) { # Might not have been set due to skiplab/dataonly if (my $nametitle = $be->get_field('nametitle')) { if ( Biber::Config->get_seen_nametitle($nametitle) > 1) { $acc .= " EXTRATITLE\n"; } } } # The labeltitleyear option determines whether "extratitleyear" is output if ( Biber::Config->getblxoption('labeltitleyear', $bee)) { # Might not have been set due to skiplab/dataonly if (my $titleyear = $be->get_field('titleyear')) { if ( Biber::Config->get_seen_titleyear($titleyear) > 1) { $acc .= " EXTRATITLEYEAR\n"; } } } # The labelalpha option determines whether "extraalpha" is output if ( Biber::Config->getblxoption('labelalpha', $bee)) { # Might not have been set due to skiplab/dataonly if (my $la = $be->get_field('labelalpha')) { if (Biber::Config->get_la_disambiguation($la) > 1) { $acc .= " EXTRAALPHA\n"; } } } if ( Biber::Config->getblxoption('labelnumber', $bee) ) { if (my $sh = $be->get_field('shorthand')) { $acc .= " \\field{labelnumber}{$sh}\n"; } elsif (my $lnum = $be->get_field('labelnumber')) { $acc .= " \\field{labelnumber}{$lnum}\n"; } } if (defined($be->get_field('singletitle'))) { $acc .= " \\true{singletitle}\n"; } # The source field for labelname if (my $lni = $be->get_labelname_info) { $acc .= " \\field{labelnamesource}{$lni}\n"; } # The source field for labeltitle if (my $lti = $be->get_labeltitle_info) { $acc .= " \\field{labeltitlesource}{$lti}\n"; } if (my $ck = $be->get_field('clonesourcekey')) { $acc .= " \\field{clonesourcekey}{$ck}\n"; } foreach my $field (sort @{$dm->get_fields_of_type('field', 'entrykey')}, @{$dm->get_fields_of_type('field', 'key')}, @{$dm->get_fields_of_type('field', 'integer')}, @{$dm->get_fields_of_type('field', 'datepart')}, @{$dm->get_fields_of_type('field', 'literal')}, @{$dm->get_fields_of_type('field', 'code')}) { next if $dm->field_is_skipout($field); next if $dm->get_fieldformat($field) eq 'xsv'; if ( ($dm->field_is_nullok($field) and $be->field_exists($field)) or $be->get_field($field) ) { # we skip outputting the crossref or xref when the parent is not cited # (biblatex manual, section 2.2.3) # sets are a special case so always output crossref/xref for them since their # children will always be in the .bbl otherwise they make no sense. unless ($bee eq 'set') { next if ($field eq 'crossref' and not $section->has_citekey($be->get_field('crossref'))); next if ($field eq 'xref' and not $section->has_citekey($be->get_field('xref'))); } $acc .= _printfield($be, $field, $be->get_field($field) ); } } foreach my $field (sort @{$dm->get_fields_of_fieldformat('xsv')}) { next if $dm->field_is_skipout($field); next if $dm->get_datatype($field) eq 'keyword';# This is special in .bbl if (my $f = $be->get_field($field)) { $acc .= _printfield($be, $field, join(',', @$f) ); } } foreach my $rfield (@{$dm->get_fields_of_datatype('range')}) { next if $dm->field_is_skipout($rfield); if ( my $rf = $be->get_field($rfield) ) { # range fields are an array ref of two-element array refs [range_start, range_end] # range_end can be be empty for open-ended range or undef my @pr; foreach my $f (@$rf) { if (defined($f->[1])) { push @pr, $f->[0] . '\bibrangedash' . ($f->[1] ? ' ' . $f->[1] : ''); } else { push @pr, $f->[0]; } } my $bbl_rf = join('\bibrangessep ', @pr); $acc .= " \\field{$rfield}{$bbl_rf}\n"; $acc .= " \\range{$rfield}{" . rangelen($rf) . "}\n"; } } # verbatim fields foreach my $vfield ((@{$dm->get_fields_of_type('field', 'verbatim')}, @{$dm->get_fields_of_type('field', 'uri')})) { next if $dm->field_is_skipout($vfield); if ( my $vf = $be->get_field($vfield) ) { $acc .= " \\verb{$vfield}\n"; $acc .= " \\verb $vf\n \\endverb\n"; } } # verbatim lists foreach my $vlist ((@{$dm->get_fields_of_type('list', 'verbatim')}, @{$dm->get_fields_of_type('list', 'uri')})) { next if $dm->field_is_skipout($vlist); if ( my $vlf = $be->get_field($vlist) ) { if ( lc($vlf->[-1]) eq Biber::Config->getoption('others_string') ) { $acc .= " \\true{more$vlist}\n"; pop @$vlf; # remove the last element in the array } my $total = $#$vlf + 1; $acc .= " \\lverb{$vlist}{$total}\n"; foreach my $f (@$vlf) { $acc .= " \\lverb $f\n"; } $acc .= " \\endlverb\n"; } } if ( my $k = $be->get_field('keywords') ) { $k = join(',', @$k); $acc .= " \\keyw{$k}\n"; } # Append any warnings to the entry, if any if (my $w = $be->get_field('warnings')) { foreach my $warning (@$w) { $acc .= " \\warn{\\item $warning}\n"; } } $acc .= " \\endentry\n"; # Create an index by keyname for easy retrieval $self->{output_data}{ENTRIES}{$secnum}{index}{$key} = \$acc; return; } =head2 output BBL output method - this takes care to output entries in the explicit order derived from the virtual order of the citekeys after sortkey sorting. =cut sub output { my $self = shift; my $data = $self->{output_data}; my $target = $self->{output_target}; my $target_string = "Target"; # Default if ($self->{output_target_file}) { $target_string = $self->{output_target_file}; } # for debugging mainly unless ($target) { $target = new IO::File '>-'; } $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...'); $logger->info("Writing '$target_string' with encoding '" . Biber::Config->getoption('output_encoding') . "'"); $logger->info('Converting UTF-8 to TeX macros on output to .bbl') if Biber::Config->getoption('output_safechars'); out($target, $data->{HEAD}); foreach my $secnum (sort keys %{$data->{ENTRIES}}) { $logger->debug("Writing entries for section $secnum"); out($target, "\n\\refsection{$secnum}\n"); my $section = $self->get_output_section($secnum); my @lists; # Need to reshuffle list to put global sort order list at end, see below # This sort is cosmetic, just to order the lists in a predictable way in the .bbl # but omit the global context list so that we can add this last foreach my $list (sort {$a->get_sortschemename cmp $b->get_sortschemename} @{$Biber::MASTER->sortlists->get_lists_for_section($secnum)}) { if ($list->get_sortschemename eq Biber::Config->getblxoption('sortscheme') and $list->get_sortnamekeyschemename eq 'global' and $list->get_type eq 'entry') { next; } push @lists, $list; } # biblatex requires the last list in the .bbl to be the global sort list # due to its sequential reading of the .bbl as the final list overrides the # previously read ones and the global list determines the order of labelnumber # and sortcites etc. when not using defernumbers push @lists, $Biber::MASTER->sortlists->get_list($secnum, Biber::Config->getblxoption('sortscheme') . '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global'); foreach my $list (@lists) { next unless $list->count_keys; # skip empty lists my $listssn = $list->get_sortschemename; my $listsnksn = $list->get_sortnamekeyschemename; my $listtype = $list->get_type; my $listname = $list->get_name; $logger->debug("Writing entries in '$listname' list of type '$listtype' with sortscheme '$listssn' and sort name key scheme '$listsnksn'"); if ($listtype eq 'entry') { out($target, " \\sortlist[entry]{$listname}\n"); } elsif ($listtype eq 'list') { out($target, " \\sortlist[list]{$listname}\n"); } # The order of this array is the sorted order foreach my $k ($list->get_keys) { $logger->debug("Writing entry for key '$k'"); my $entry = $data->{ENTRIES}{$secnum}{index}{$k}; # Instantiate any dynamic, list specific entry information my $entry_string = $list->instantiate_entry($entry, $k); # If requested to convert UTF-8 to macros ... if (Biber::Config->getoption('output_safechars')) { $entry_string = latex_recode_output($entry_string); } else { # ... or, check for encoding problems and force macros my $outenc = Biber::Config->getoption('output_encoding'); if ($outenc ne 'UTF-8') { # Can this entry be represented in the output encoding? # We must have an ASCII-safe replacement string for encode which is unlikely to be # in the string. Default is "?" which could easily be in URLS so we choose ASCII null if (encode($outenc, NFC($entry_string), sub {"\0"}) =~ /\0/) { # Malformed data encoding char # So convert to macro $entry_string = latex_recode_output($entry_string); biber_warn("The entry '$k' has characters which cannot be encoded in '$outenc'. Recoding problematic characters into macros."); } } } # Now output out($target, $entry_string); } out($target, " \\endsortlist\n"); } # Aliases foreach my $ks (values %{$data->{ALIAS_ENTRIES}{$secnum}{index}}) { out($target, $$ks); } # Missing keys foreach my $ks (values %{$data->{MISSING_ENTRIES}{$secnum}{index}}) { out($target, $$ks); } out($target, "\\endrefsection\n"); } out($target, $data->{TAIL}); $logger->info("Output to $target_string"); close $target; return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Output/biblatexml.pm000444000765000024 2664312667073765 22305 0ustar00philkimestaff000000000000package Biber::Output::biblatexml; use v5.16; use strict; use warnings; use parent qw(Biber::Output::base); use Biber; use Biber::Config; use Biber::Constants; use Biber::Utils; use List::AllUtils qw( :all ); use Encode; use IO::File; use Log::Log4perl qw( :no_extra_logdie_message ); use Text::Wrap; use XML::Writer; use Unicode::Normalize; $Text::Wrap::columns = 80; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Output::biblatexml - class for biblatexml output of tool mode =cut =head2 new Initialize a Biber::Output::biblatexml object =cut sub new { my $class = shift; my $obj = shift; my $self; if (defined($obj) and ref($obj) eq 'HASH') { $self = bless $obj, $class; } else { $self = bless {}, $class; } return $self; } =head2 set_output_target_file Set the output target file of a Biber::Output::biblatexml object A convenience around set_output_target so we can keep track of the filename =cut sub set_output_target_file { my $self = shift; my $toolfile = shift; # biblatexml output is only in tool mode and so we are looking at a data source name in # $ARGV[0] my $exts = join('|', values %DS_EXTENSIONS); my $schemafile = Biber::Config->getoption('dsn') =~ s/\.(?:$exts)$/.rng/r; $self->{output_target_file} = $toolfile; my $bltxml = 'http://biblatex-biber.sourceforge.net/biblatexml'; $self->{xml_prefix} = $bltxml; my $of = IO::File->new($toolfile, '>:encoding(UTF-8)'); $of->autoflush;# Needed for running tests to string refs my $xml = XML::Writer->new(OUTPUT => $of, ENCODING => 'UTF-8', DATA_MODE => 1, DATA_INDENT => Biber::Config->getoption('output_indent'), NAMESPACES => 1, PREFIX_MAP => {$bltxml => 'bltx'}); $xml->xmlDecl(); $xml->pi('xml-model', "href=\"$schemafile\" type=\"application/xml\" schematypens=\"http://relaxng.org/ns/structure/1.0\""); $xml->comment("Auto-generated by Biber::Output::biblatexml"); $xml->startTag([$self->{xml_prefix}, 'entries']); $self->set_output_target($xml); } =head2 set_output_entry Set the output for an entry =cut sub set_output_entry { my $self = shift; my $be = shift; # Biber::Entry object my $bee = $be->get_field('entrytype'); my $section = shift; # Section object the entry occurs in my $dm = shift; # Data Model object my $secnum = $section->number; my $key = $be->get_field('citekey'); my $xml = $self->{output_target}; my $xml_prefix = $self->{xml_prefix}; $xml->startTag([$xml_prefix, 'entry'], id => NFC($key), entrytype => NFC($bee)); # Filter aliases which point to this key an insert them if (my @ids = sort grep {$section->get_citekey_alias($_) eq $key} $section->get_citekey_aliases) { $xml->startTag([$xml_prefix, 'ids']); foreach my $id (@ids) { $xml->dataElement([$xml_prefix, 'key'], NFC($id)); } $xml->endTag; } # If CROSSREF and XDATA have been resolved, don't output them # We can't use the usual skipout test for fields not to be output # as this only refers to .bbl output and not to biblatexml output since this # latter is not really a "processed" output, it is supposed to be something # which could be again used as input and so we don't want to resolve/skip # fields like DATE etc. unless (Biber::Config->getoption('output_resolve')) { if (my $xdata = $be->get_field('xdata')) { $xml->startTag([$xml_prefix, 'xdata']); foreach my $xd (@$xdata) { $xml->dataElement([$xml_prefix, 'item'], NFC($xd)); } $xml->endTag(); } if (my $crossref = $be->get_field('crossref')) { $xml->dataElement([$xml_prefix, 'crossref'], NFC($crossref)); } } if (my $opts = $be->get_field('options')) { $xml->dataElement([$xml_prefix, 'options'], NFC(join(',', @{filter_entry_options($be->get_field('options'))}))); } # Output name fields foreach my $namefield (@{$dm->get_fields_of_type('list', 'name')}) { # Name loop if (my $nf = $be->get_field($namefield)) { my @attrs = ('type' => $namefield); # Did we have "and others" in the data? if ( $nf->get_morenames ) { push @attrs, (morenames => 1); } # Add per-namelist options foreach my $ploname (sort keys %{$CONFIG_SCOPEOPT_BIBLATEX{NAMELIST}}) { if (defined($nf->${\"get_$ploname"})) { my $plo = $nf->${\"get_$ploname"}; if ($CONFIG_OPTTYPE_BIBLATEX{lc($ploname)} and $CONFIG_OPTTYPE_BIBLATEX{lc($ploname)} eq 'boolean') { push @attrs, ($ploname => map_boolean($plo, 'tostring')); } else { push @attrs, ($ploname => $plo); } } } $xml->startTag([$xml_prefix, 'names'], @attrs); foreach my $n (@{$nf->names}) { $n->name_to_biblatexml($xml, $self); } $xml->endTag(); # Names } } # Output list fields foreach my $listfield (sort @{$dm->get_fields_of_fieldtype('list')}) { next if $dm->field_is_datatype('name', $listfield); # name is a special list # List loop if (my $lf = $be->get_field($listfield)) { my @attrs; # Did we have a "more" list? if (lc($lf->[-1]) eq Biber::Config->getoption('others_string') ) { push @attrs, (morelist => 1); pop @$lf; # remove the last element in the array } $xml->startTag([$xml_prefix, $listfield], @attrs); # List loop foreach my $f (@$lf) { $xml->dataElement([$xml_prefix, 'item'], NFC($f)); } $xml->endTag(); # List } } # Standard fields foreach my $field (sort @{$dm->get_fields_of_type('field', 'entrykey')}, @{$dm->get_fields_of_type('field', 'key')}, @{$dm->get_fields_of_type('field', 'literal')}, @{$dm->get_fields_of_type('field', 'code')}, @{$dm->get_fields_of_type('field', 'integer')}, @{$dm->get_fields_of_type('field', 'verbatim')}, @{$dm->get_fields_of_type('field', 'uri')}) { next if $dm->get_fieldformat($field) eq 'xsv'; if ( ($dm->field_is_nullok($field) and $be->field_exists($field)) or $be->get_field($field) ) { if (my $f = $be->get_field($field)) { my @attrs; $xml->dataElement([$xml_prefix, $field], NFC($f), @attrs); } } } # xsv fields foreach my $xsvf (@{$dm->get_fields_of_type('field', 'xsv')}) { next if $xsvf eq 'ids'; # IDS is special next if $xsvf eq 'xdata'; # XDATA is special if (my $f = $be->get_field($xsvf)) { $xml->dataElement([$xml_prefix, $xsvf], NFC(join(',',@$f))); } } # Range fields foreach my $rfield (sort @{$dm->get_fields_of_datatype('range')}) { if ( my $rf = $be->get_field($rfield) ) { # range fields are an array ref of two-element array refs [range_start, range_end] # range_end can be be empty for open-ended range or undef $xml->startTag([$xml_prefix, $rfield]); $xml->startTag([$xml_prefix, 'list']); foreach my $f (@$rf) { $xml->startTag([$xml_prefix, 'item']); if (defined($f->[1])) { $xml->dataElement([$xml_prefix, 'start'], NFC($f->[0])); $xml->dataElement([$xml_prefix, 'end'], NFC($f->[1])); } else { $xml->characters(NFC($f->[0])); } $xml->endTag();# item } $xml->endTag();# list $xml->endTag();# range } } # Date fields my %dinfo; foreach my $dfield (@{$dm->get_fields_of_datatype('datepart')}) { if ( my $df = $be->get_field($dfield) ) { # There are some assumptions here about field names which is not nice but # they are part of the default biblatex data model which is unlikely to be # changed by users if ($dfield =~ /^(url|orig|event)?(end)?(.+)$/) { my $dt = $1 || 'MAIN'; # Normal data has no qualifier prefix like "url" etc. if ($2) { $dinfo{$dt}{end}{$3} = $df; } else { $dinfo{$dt}{begin}{$3} = $df; # beginning of ranges have no qualifier like "end" } } } } foreach my $dp (sort keys %dinfo) { if ($dp eq 'MAIN') { $xml->startTag([$xml_prefix, 'date']); } else { $xml->startTag([$xml_prefix, 'date'], type => $dp); } my @s; my @e; push @s, $dinfo{$dp}{begin}{year} if exists($dinfo{$dp}{begin}{year}); push @s, $dinfo{$dp}{begin}{month} if exists($dinfo{$dp}{begin}{month}); push @s, $dinfo{$dp}{begin}{day} if exists($dinfo{$dp}{begin}{day}); push @e, $dinfo{$dp}{end}{year} if exists($dinfo{$dp}{end}{year}); push @e, $dinfo{$dp}{end}{month} if exists($dinfo{$dp}{end}{month}); push @e, $dinfo{$dp}{end}{day} if exists($dinfo{$dp}{end}{day}); my $end = join('-', @e); # date range if ($end or $dm->field_is_nullok("${dp}enddate")) { $xml->dataElement([$xml_prefix, 'start'], NFC(join('-', @s))); $xml->dataElement([$xml_prefix, 'end'], NFC(join('-', @e))); } else { # simple date $xml->characters(NFC(join('-', @s))); } $xml->endTag();# date } $xml->endTag(); return; } =head2 output Tool output method =cut sub output { my $self = shift; my $data = $self->{output_data}; my $xml = $self->{output_target}; my $target_string = "Target"; # Default my $dm = Biber::Config->get_dm; if ($self->{output_target_file}) { $target_string = $self->{output_target_file}; } $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...'); $logger->debug("Writing entries in tool mode"); $xml->endTag(); $xml->end(); $logger->info("Output to $target_string"); my $exts = join('|', values %DS_EXTENSIONS); my $schemafile = Biber::Config->getoption('dsn') =~ s/\.(?:$exts)$/.rng/r; unless (Biber::Config->getoption('no_bltxml_schema')) { $dm->generate_bltxml_schema($schemafile); } if (Biber::Config->getoption('validate_bltxml')) { validate_biber_xml($target_string, 'bltx', 'http://biblatex-biber.sourceforge.net/biblatexml', $schemafile); } return; } =head2 create_output_section Create the output from the sections data and push it into the output object. =cut sub create_output_section { my $self = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); # We rely on the order of this array for the order of the .bbl foreach my $k ($section->get_citekeys) { # Regular entry my $be = $section->bibentry($k) or biber_error("Cannot find entry with key '$k' to output"); $self->set_output_entry($be, $section, Biber::Config->get_dm); } # Make sure the output object knows about the output section $self->set_output_section($secnum, $section); return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Output/bibtex.pm000444000765000024 1652112667073765 21431 0ustar00philkimestaff000000000000package Biber::Output::bibtex; use v5.16; use strict; use warnings; use parent qw(Biber::Output::base); use Biber; use Biber::Config; use Biber::Constants; use Biber::Utils; use List::AllUtils qw( :all ); use Encode; use IO::File; use Log::Log4perl qw( :no_extra_logdie_message ); use Text::Wrap; $Text::Wrap::columns = 80; use Unicode::Normalize; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Output::bibtex - class for bibtex output =cut =head2 set_output_target_file Set the output target file of a Biber::Output::bibtex object A convenience around set_output_target so we can keep track of the filename =cut sub set_output_target_file { my $self = shift; my $outfile = shift; $self->{output_target_file} = $outfile; } =head2 set_output_comment Set the output for a comment =cut sub set_output_comment { my $self = shift; my $comment = shift; my $acc = ''; # Make the right casing function my $casing; if (Biber::Config->getoption('output_fieldcase') eq 'upper') { $casing = sub {uc(shift)}; } elsif (Biber::Config->getoption('output_fieldcase') eq 'lower') { $casing = sub {lc(shift)}; } elsif (Biber::Config->getoption('output_fieldcase') eq 'title') { $casing = sub {ucfirst(shift)}; } $acc .= '@'; $acc .= $casing->('comment'); $acc .= "{$comment}\n"; push @{$self->{output_data}{COMMENTS}}, $acc; return; } =head2 set_output_entry Set the output for an entry =cut sub set_output_entry { my $self = shift; my $be = shift; # Biber::Entry object my $bee = $be->get_field('entrytype'); my $section = shift; # Section object the entry occurs in my $dm = shift; # Data Model object my $acc = ''; my $secnum = $section->number; my $key = $be->get_field('citekey'); # Make the right casing function my $casing; if (Biber::Config->getoption('output_fieldcase') eq 'upper') { $casing = sub {uc(shift)}; } elsif (Biber::Config->getoption('output_fieldcase') eq 'lower') { $casing = sub {lc(shift)}; } elsif (Biber::Config->getoption('output_fieldcase') eq 'title') { $casing = sub {ucfirst(shift)}; } $acc .= '@'; $acc .= $casing->($bee); $acc .= "\{$key,\n"; my $max_field_len; if (Biber::Config->getoption('output_align')) { $max_field_len = max map {Unicode::GCString->new($_)->length} $be->rawfields; } foreach my $f ($be->rawfields) { # If CROSSREF and XDATA have been resolved, don't output them # We can't use the usual skipout test for fields not to be output # as this only refers to .bbl output and not to bibtex output since this # latter is not really a "processed" output, it is supposed to be something # which could be again used as input and so we don't want to resolve/skip # fields like DATE etc. if (Biber::Config->getoption('output_resolve')) { next if first {lc($f) eq $_} ('xdata', 'crossref'); } my $value = $be->get_rawfield($f); $acc .= ' ' x Biber::Config->getoption('output_indent'); $acc .= $casing->($f); $acc .= ' ' x ($max_field_len - Unicode::GCString->new($f)->length) if Biber::Config->getoption('output_align'); $acc .= ' = '; # Don't wrap field which should be macros in braces my $mfs = Biber::Config->getoption('output_macro_fields'); if (defined($mfs) and first {lc($f) eq $_} map {lc($_)} split(/\s*,\s*/, $mfs) ) { $acc .= "$value,\n"; } else { $acc .= "\{$value\},\n"; } } $acc .= "}\n\n"; # If requested to convert UTF-8 to macros ... if (Biber::Config->getoption('output_safechars')) { $acc = latex_recode_output($acc); } else { # ... or, check for encoding problems and force macros my $outenc = Biber::Config->getoption('output_encoding'); if ($outenc ne 'UTF-8') { # Can this entry be represented in the output encoding? if (encode($outenc, NFC($acc)) =~ /\?/) { # Malformed data encoding char # So convert to macro $acc = latex_recode_output($acc); biber_warn("The entry '$key' has characters which cannot be encoded in '$outenc'. Recoding problematic characters into macros."); } } } # Create an index by keyname for easy retrieval $self->{output_data}{ENTRIES}{$secnum}{index}{$key} = \$acc; return; } =head2 output Tool output method =cut sub output { my $self = shift; my $data = $self->{output_data}; my $target_string = "Target"; # Default if ($self->{output_target_file}) { $target_string = $self->{output_target_file}; } # Instantiate output file now that input is read in case we want to do in-place # output for tool mode my $enc_out; if (Biber::Config->getoption('output_encoding')) { $enc_out = ':encoding(' . Biber::Config->getoption('output_encoding') . ')'; } my $target = IO::File->new($target_string, ">$enc_out"); # for debugging mainly unless ($target) { $target = new IO::File '>-'; } $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...'); $logger->info("Writing '$target_string' with encoding '" . Biber::Config->getoption('output_encoding') . "'"); $logger->info('Converting UTF-8 to TeX macros on output') if Biber::Config->getoption('output_safechars'); out($target, $data->{HEAD}); $logger->debug("Writing entries in bibtex format"); # Bibtex output uses just one special section, always sorted by global sorting spec foreach my $key ($Biber::MASTER->sortlists->get_list(99999, Biber::Config->getblxoption('sortscheme') . '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global')->get_keys) { out($target, ${$data->{ENTRIES}{99999}{index}{$key}}); } # Output any comments when in tool mode if (Biber::Config->getoption('tool')) { foreach my $comment (@{$data->{COMMENTS}}) { out($target, $comment); } } out($target, $data->{TAIL}); $logger->info("Output to $target_string"); close $target; return; } =head2 create_output_section Create the output from the sections data and push it into the output object. =cut sub create_output_section { my $self = shift; my $secnum = $Biber::MASTER->get_current_section; my $section = $Biber::MASTER->sections->get_section($secnum); # We rely on the order of this array for the order of the .bib foreach my $k ($section->get_citekeys) { # Regular entry my $be = $section->bibentry($k) or biber_error("Cannot find entry with key '$k' to output"); $self->set_output_entry($be, $section, Biber::Config->get_dm); } # Output all comments at the end foreach my $comment (@{$Biber::MASTER->{comments}}) { $self->set_output_comment($comment); } # Make sure the output object knows about the output section $self->set_output_section($secnum, $section); return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Output/dot.pm000444000765000024 2775512667073765 20755 0ustar00philkimestaff000000000000package Biber::Output::dot; use v5.16; use strict; use warnings; use parent qw(Biber::Output::base); use Biber::Config; use Biber::Constants; use Biber::Entry; use Biber::Utils; use List::AllUtils qw( :all ); use IO::File; use Log::Log4perl qw( :no_extra_logdie_message ); use Unicode::Normalize; my $logger = Log::Log4perl::get_logger('main'); =encoding utf-8 =head1 NAME Biber::Output::dot - class for Biber output of GraphViz .dot files =cut =head2 new Initialize a Biber::Output::dot object =cut my $graph; # accumulator for .dot string my $graph_edges = ''; # accumulator for .dot string. Initialise as can be empty my $state; # some state information for building output my $in; # indentation string my $i; # indentation level my $gopts = Biber::Config->getoption('dot_include'); my $linknode; # node to use to do cluster links sub new { my $class = shift; my $obj = shift; my $self = $class->SUPER::new($obj); $self->{output_data}{HEAD} = <{output_target_file} = $dotfile; $self->set_output_target(IO::File->new($dotfile, '>:encoding(UTF-8)')); } =head2 set_output_entry We don't use this, we output everything in one go at the end =cut sub set_output_entry { return; } =head2 create_output_section We don't use this, we output everything in one go at the end =cut sub create_output_section { return; } =head2 output Create a graph of the required things and save to .dot format =cut sub output { my $self = shift; my $biber = $Biber::MASTER; my $data = $self->{output_data}; my $target = $self->{output_target}; my $target_string = "Target"; # Default if ($self->{output_target_file}) { $target_string = $self->{output_target_file}; } # for debugging mainly unless ($target) { $target = new IO::File '>-'; } $logger->debug('Preparing final output using class ' . __PACKAGE__ . '...'); $logger->info("Writing '$target_string' with encoding 'UTF-8'"); out($target, $data->{HEAD}); $in = 2; # indentation $i = ' '; # starting indentation # Loop over sections. foreach my $section (@{$biber->sections->get_sections}) { my $secnum = $section->number; if ($gopts->{section}) { $graph .= $i x $in . "subgraph \"cluster_section${secnum}\" {\n"; $in += 2; $graph .= $i x $in . "label=\"Section $secnum\";\n"; $graph .= $i x $in . "tooltip=\"Section $secnum\";\n"; $graph .= $i x $in . "fontsize=\"10\";\n"; $graph .= $i x $in . "fontname=serif;\n"; $graph .= $i x $in . "fillcolor=\"#fce3fa\";\n"; $graph .= "\n"; } # First create nodes/groups for entries foreach my $be ($section->bibentries->entries) { my $citekey = $be->get_field('citekey'); $state->{$secnum}{"${secnum}/${citekey}"} = 1; my $et = uc($be->get_field('entrytype')); # colour depends on whether cited, uncited, dataonly or key alias my $c = $section->has_citekey($citekey) ? '#a0d0ff' : '#deefff'; if (my $options = $be->get_field('options')) { $c = '#fdffd9' if $options =~ m/dataonly/o; } $c = '#a1edec' if $section->get_citekey_alias($citekey); # make a set subgraph if a set member # This will make identically named subgraph sections for # every element in a set but dot is clever enough to merge them by # ID. if (my $sets = Biber::Config->get_graph('set')) { if (my $set = $sets->{memtoset}{$citekey}) { # entry is a set member $graph .= $i x $in . "subgraph \"cluster_${secnum}/set_${set}\" {\n"; $in += 2; $graph .= $i x $in . "label=\"$set (SET)\";\n"; $graph .= $i x $in . "tooltip=\"$set (SET)\";\n"; $graph .= $i x $in . "fontsize=\"10\";\n"; $graph .= $i x $in . "fontname=serif;\n"; $graph .= $i x $in . "fillcolor=\"#e3dadc\";\n"; $graph .= "\n"; } next if $sets->{settomem}{$citekey}; # Don't make normal nodes for sets } # Citekey aliases my $aliases = ''; foreach my $alias ($section->get_citekey_aliases) { my $realkey = $section->get_citekey_alias($alias); if ($realkey eq $citekey) { $aliases .= "\\n$alias (alias)"; } } if ($gopts->{field}) { # If granularity is at the level of fields $graph .= $i x $in . "subgraph \"cluster_section${secnum}/${citekey}\" {\n"; $in += 2; $graph .= $i x $in . "fontsize=\"10\";\n"; $graph .= $i x $in . "label=\"$citekey ($et)$aliases\";\n"; $graph .= $i x $in . "tooltip=\"$citekey ($et)\";\n"; $graph .= $i x $in . "fillcolor=\"$c\";\n"; $graph .= "\n"; foreach my $field ($be->datafields) { $graph .= $i x $in . "\"section${secnum}/${citekey}/${field}\" [ label=\"" . uc($field) . "\" ]\n"; } $in -= 2; $graph .= $i x $in . "}\n\n"; # link node for cluster->cluster links my $middle = int($be->count_datafields / 2); $state->{$secnum}{$citekey}{linknode} = ($be->datafields)[$middle]; } else { # Granularity is at the level of entries $graph .= $i x $in . "\"section${secnum}/${citekey}\" [ label=\"$citekey ($et)$aliases\", fillcolor=\"$c\", tooltip=\"$citekey ($et)\" ]\n"; } # Close set subgraph if necessary if (my $sets = Biber::Config->get_graph('set')) { if ($sets->{memtoset}{$citekey}) { # entry is a set member $graph .= $i x $in . "}\n\n"; $in -= 2; } } } # Then add the requested links # crossrefs _graph_inheritance('crossref', $secnum) if $gopts->{crossref}; # xdata _graph_inheritance('xdata', $secnum) if $gopts->{xdata}; # xref _graph_xref($secnum) if $gopts->{xref}; # related _graph_related($secnum) if $gopts->{related}; # Close the section, if any if ($gopts->{section}) { $graph .= $i x $in . "}\n\n"; $in -= 2; } } $graph .= "\n\n${graph_edges}"; $graph .= "\n}\n"; out($target, $graph); $logger->info("Output to $target_string"); close $target; return; } # Graph related entries sub _graph_related { my $secnum = shift; if (my $gr = Biber::Config->get_graph('related')) { # related links while (my ($f_entry, $m) = each %{$gr->{clonetotarget}}) { foreach my $t_entry (keys %$m) { next unless $state->{$secnum}{"${secnum}/${f_entry}"}; next unless $state->{$secnum}{"${secnum}/${t_entry}"}; if ($gopts->{field}) { # links between clusters my $f_linknode = $state->{$secnum}{$f_entry}{linknode}; my $t_linknode = $state->{$secnum}{$t_entry}{linknode}; $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}/${f_linknode}\" -> \"section${secnum}/${t_entry}/${t_linknode}\" [ penwidth=\"2.0\", color=\"#ad1741\", ltail=\"cluster_section${secnum}/${f_entry}\", lhead=\"cluster_section${secnum}/${t_entry}\", tooltip=\"${f_entry} is a related entry of ${t_entry}\" ]\n"; } else { # links between nodes $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}\" -> \"section${secnum}/${t_entry}\" [ penwidth=\"2.0\", color=\"#ad1741\", tooltip=\"${f_entry} is a related entry of ${t_entry}\" ]\n"; } } } # clone links while (my ($f_entry, $m) = each %{$gr->{reltoclone}}) { foreach my $t_entry (keys %$m) { next unless $state->{$secnum}{"${secnum}/${f_entry}"}; next unless $state->{$secnum}{"${secnum}/${t_entry}"}; if ($gopts->{field}) { # links between clusters my $f_linknode = $state->{$secnum}{$f_entry}{linknode}; my $t_linknode = $state->{$secnum}{$t_entry}{linknode}; $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}/${f_linknode}\" -> \"section${secnum}/${t_entry}/${t_linknode}\" [ style=\"dashed\", penwidth=\"2.0\", color=\"#ad1741\", ltail=\"cluster_section${secnum}/${f_entry}\", lhead=\"cluster_section${secnum}/${t_entry}\", tooltip=\"${t_entry} is a clone of ${f_entry}\" ]\n"; } else { # links between nodes $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}\" -> \"section${secnum}/${t_entry}\" [ style=\"dashed\", penwidth=\"2.0\", color=\"#ad1741\", tooltip=\"${t_entry} is a clone of ${f_entry}\" ]\n"; } } } } } # Graph xrefs sub _graph_xref { my $secnum = shift; if (my $gr = Biber::Config->get_graph('xref')) { while (my ($f_entry, $t_entry) = each %$gr) { next unless $state->{$secnum}{"${secnum}/${f_entry}"}; next unless $state->{$secnum}{"${secnum}/${t_entry}"}; if ($gopts->{field}) { # links between clusters my $f_linknode = $state->{$secnum}{$f_entry}{linknode}; my $t_linknode = $state->{$secnum}{$t_entry}{linknode}; $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}/${f_linknode}\" -> \"section${secnum}/${t_entry}/${t_linknode}\" [ penwidth=\"2.0\", style=\"dashed\", color=\"#7d7879\", ltail=\"cluster_section${secnum}/${f_entry}\", lhead=\"cluster_section${secnum}/${t_entry}\", tooltip=\"${f_entry} XREFS ${t_entry}\" ]\n"; } else { # links between nodes $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}\" -> \"section${secnum}/${t_entry}\" [ penwidth=\"2.0\", style=\"dashed\", color=\"#7d7879\", tooltip=\"${f_entry} XREFS ${t_entry}\" ]\n"; } } } } # Graph crossrefs and xdata sub _graph_inheritance { my ($type, $secnum) = @_; my $edgecolor; if ($type eq 'crossref') { $edgecolor = '#7d7879'; } elsif ($type eq 'xdata') { $edgecolor = '#2ca314'; } if (my $gr = Biber::Config->get_graph($type)) { # Show fields if ($gopts->{field}) { while (my ($f_entry, $v) = each %$gr) { while (my ($f_field, $w) = each %$v) { while (my ($t_entry, $t_field) = each %$w) { next unless $state->{$secnum}{"${secnum}/${f_entry}"}; next unless $state->{$secnum}{"${secnum}/${t_entry}"}; $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}/${f_field}\" -> \"section${secnum}/${t_entry}/${t_field}\" [ penwidth=\"2.0\", color=\"${edgecolor}\", tooltip=\"${t_entry}/" . uc($t_field) . " inherited via " . uc($type) . " from ${f_entry}/" . uc($f_field) . "\" ]\n"; } } } } # Just show the entries, no fields else { while (my ($f_entry, $v) = each %$gr) { while (my (undef, $w) = each %$v) { while (my ($t_entry, undef) = each %$w) { next unless $state->{$secnum}{"${secnum}/${f_entry}"}; next unless $state->{$secnum}{"${secnum}/${t_entry}"}; next if $state->{edges}{"section${secnum}/${f_entry}"}{"section${secnum}/${t_entry}"}; $graph_edges .= $i x $in . "\"section${secnum}/${f_entry}\" -> \"section${secnum}/${t_entry}\" [ penwidth=\"2.0\", color=\"${edgecolor}\", tooltip=\"${t_entry} inherits via $type from ${f_entry}\" ]\n"; $state->{edges}{"section${secnum}/${f_entry}"}{"section${secnum}/${t_entry}"} = 1; } } } } } } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/lib/Biber/Output/test.pm000444000765000024 3151412667073765 21132 0ustar00philkimestaff000000000000package Biber::Output::test; use v5.16; use strict; use warnings; use parent qw(Biber::Output::base); use Biber::Config; use Biber::Constants; use Biber::Entry; use Biber::Utils; use IO::File; use Log::Log4perl qw( :no_extra_logdie_message ); my $logger = Log::Log4perl::get_logger('main'); use Unicode::Normalize; =encoding utf-8 =head1 NAME Biber::Output::test - Output class for loopback testing Essentially, this outputs to a string so we can look at it internally in tests =cut =head2 _printfield Add the .bbl for a text field to the output accumulator. =cut sub _printfield { my ($be, $field, $str) = @_; my $field_type = 'field'; # crossref and xref are of type 'strng' in the .bbl if (lc($field) eq 'crossref' or lc($field) eq 'xref') { $field_type = 'strng'; } # auto-escase TeX special chars if: # * The entry is not a bibtex entry (no auto-escaping for bibtex data) # * It's not a strng field if ($field_type ne 'strng' and $be->get_field('datatype') ne 'bibtex') { $str =~ s/(?getoption('wraplines')) { ## 16 is the length of ' \field{}{}' if ( 16 + Unicode::GCString->new($field)->length + Unicode::GCString->new($str)->length > 2*$Text::Wrap::columns ) { return " \\${field_type}{$field}{%\n" . wrap(' ', ' ', $str) . "%\n }\n"; } elsif ( 16 + Unicode::GCString->new($field)->length + Unicode::GCString->new($str)->length > $Text::Wrap::columns ) { return wrap(' ', ' ', "\\${field_type}{$field}{$str}" ) . "\n"; } else { return " \\${field_type}{$field}{$str}\n"; } } else { return " \\${field_type}{$field}{$str}\n"; } return; } =head2 set_output_entry Set the .bbl output for an entry. This is the meat of the .bbl output =cut sub set_output_entry { my $self = shift; my $be = shift; # Biber::Entry object my $bee = $be->get_field('entrytype'); my $section = shift; # Section the entry occurs in my $dm = shift; # Structure object my $acc = ''; my $secnum = $section->number; my $key = $be->get_field('citekey'); $acc .= "% sortstring = " . $be->get_field('sortstring') . "\n" if (Biber::Config->getoption('debug') || Biber::Config->getblxoption('debug')); $acc .= " \\entry{$key}{$bee}{" . join(',', @{filter_entry_options($be->get_field('options'))}) . "}\n"; # Generate set information if ( $be->get_field('entrytype') eq 'set' ) { # Set parents get \set entry ... $acc .= " \\set{" . join(',', @{$be->get_field('entryset')}) . "}\n"; } else { # Everything else that isn't a set parent ... if (my $es = $be->get_field('entryset')) { # ... gets a \inset if it's a set member $acc .= " \\inset{" . join(',', @$es) . "}\n"; } } # Output name fields foreach my $namefield (@{$dm->get_fields_of_type('list', 'name')}) { next if $dm->field_is_skipout($namefield); if ( my $nf = $be->get_field($namefield) ) { my $plo = ''; # Did we have "and others" in the data? if ( $nf->get_morenames ) { $acc .= " \\true{more$namefield}\n"; } my $total = $nf->count_names; # Add per-list options, if any my $lni = $be->get_labelname_info; if (defined($lni) and $lni eq $namefield) { # Add uniquelist, if defined my @plo; if (my $ul = $nf->get_uniquelist){ push @plo, "uniquelist=$ul"; } $plo = join(',', @plo); } $acc .= " \\name{$namefield}{$total}{$plo}{%\n"; foreach my $n (@{$nf->names}) { $acc .= $n->name_to_bbl; } $acc .= " }\n"; } } foreach my $listfield (@{$dm->get_fields_of_fieldtype('list')}) { next if $dm->field_is_datatype('name', $listfield); # name is a special list if ( my $lf = $be->get_field($listfield) ) { if ( lc($be->get_field($listfield)->[-1]) eq Biber::Config->getoption('others_string') ) { $acc .= " \\true{more$listfield}\n"; pop @$lf; # remove the last element in the array }; my $total = $#$lf + 1; $acc .= " \\list{$listfield}{$total}{%\n"; foreach my $f (@$lf) { $acc .= " {$f}%\n"; } $acc .= " }\n"; } } my $namehash = $be->get_field('namehash'); $acc .= " \\strng{namehash}{$namehash}\n" if $namehash; my $fullhash = $be->get_field('fullhash'); $acc .= " \\strng{fullhash}{$fullhash}\n" if $fullhash; if ( Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype')) ) { # Might not have been set due to skiplab/dataonly if (my $label = $be->get_field('labelalpha')) { $acc .= " \\field{labelalpha}{$label}\n"; } } # This is special, we have to put a marker for sortinit{hash} and then replace this string # on output as it can vary between lists $acc .= " SORTINIT\n"; $acc .= " SORTINITHASH\n"; # The labeldate option determines whether "extrayear" is output # Skip generating extrayear for entries with "skiplab" set if ( Biber::Config->getblxoption('labeldate', $be->get_field('entrytype'))) { # Might not have been set due to skiplab/dataonly if (my $ey = $be->get_field('extrayear')) { my $nameyear_extra = $be->get_field('nameyear_extra'); if ( Biber::Config->get_seen_nameyear_extra($nameyear_extra) > 1) { $acc .= " EXTRAYEAR\n"; } } if (my $ly = $be->get_field('labelyear')) { $acc .= " \\field{labelyear}{$ly}\n"; } if (my $lm = $be->get_field('labelmonth')) { $acc .= " \\field{labelmonth}{$lm}\n"; } if (my $ld = $be->get_field('labelday')) { $acc .= " \\field{labelday}{$ld}\n"; } if ($be->field_exists('datelabelsource')) { $acc .= " \\field{datelabelsource}{" . $be->get_field('datelabelsource') . "}\n"; } } # The labeltitle option determines whether "extratitle" is output if ( Biber::Config->getblxoption('labeltitle', $bee)) { # Might not have been set due to skiplab/dataonly if (my $nametitle = $be->get_field('nametitle')) { if ( Biber::Config->get_seen_nametitle($nametitle) > 1) { $acc .= " EXTRATITLE\n"; } } } # The labeltitleyear option determines whether "extratitleyear" is output if ( Biber::Config->getblxoption('labeltitleyear', $bee)) { # Might not have been set due to skiplab/dataonly if (my $titleyear = $be->get_field('titleyear')) { if ( Biber::Config->get_seen_titleyear($titleyear) > 1) { $acc .= " EXTRATITLEYEAR\n"; } } } # The labelalpha option determines whether "extraalpha" is output # Skip generating extraalpha for entries with "skiplab" set if ( Biber::Config->getblxoption('labelalpha', $be->get_field('entrytype'))) { # Might not have been set due to skiplab/dataonly if (my $ea = $be->get_field('extraalpha')) { my $nameyear_extra = $be->get_field('nameyear_extra'); if ( Biber::Config->get_seen_nameyear_extra($nameyear_extra) > 1) { $acc .= " EXTRAALPHA\n"; } } } if ( Biber::Config->getblxoption('labelnumber', $be->get_field('entrytype')) ) { if (my $sh = $be->get_field('shorthand')) { $acc .= " \\field{labelnumber}{$sh}\n"; } elsif (my $ln = $be->get_field('labelnumber')) { $acc .= " \\field{labelnumber}{$ln}\n"; } } if (defined($be->get_field('singletitle'))) { $acc .= " \\true{singletitle}\n"; } # The source field for labelname if (my $lni = $be->get_labelname_info) { $acc .= " \\field{labelnamesource}{$lni}\n"; } # The source field for labeltitle if (my $lti = $be->get_labeltitle_info) { $acc .= " \\field{labeltitlesource}{$lti}\n"; } foreach my $field (sort @{$dm->get_fields_of_type('field', 'entrykey')}, @{$dm->get_fields_of_type('field', 'key')}, @{$dm->get_fields_of_type('field', 'integer')}, @{$dm->get_fields_of_type('field', 'datepart')}, @{$dm->get_fields_of_type('field', 'literal')}, @{$dm->get_fields_of_type('field', 'code')}) { next if $dm->field_is_skipout($field); next if $dm->get_fieldformat($field) eq 'xsv'; if ( ($dm->field_is_nullok($field) and $be->field_exists($field)) or $be->get_field($field) ) { # we skip outputting the crossref or xref when the parent is not cited # (biblatex manual, section 2.2.3) # sets are a special case so always output crossref/xref for them since their # children will always be in the .bbl otherwise they make no sense. unless ( $be->get_field('entrytype') eq 'set') { next if ($field eq 'crossref' and not $section->has_citekey($be->get_field('crossref'))); next if ($field eq 'xref' and not $section->has_citekey($be->get_field('xref'))); } $acc .= _printfield($be, $field, $be->get_field($field) ); } } foreach my $field (sort @{$dm->get_fields_of_fieldformat('xsv')}) { next if $dm->field_is_skipout($field); next if $dm->get_datatype($field) eq 'keyword';# This is special in .bbl if (my $f = $be->get_field($field)) { $acc .= _printfield($be, $field, join(',', @$f) ); } } foreach my $rfield (@{$dm->get_fields_of_datatype('range')}) { if ( my $rf = $be->get_field($rfield)) { $rf =~ s/[-–]+/\\bibrangedash /g; $acc .= " \\field{$rfield}{$rf}\n"; $acc .= " \\range{$rfield}{" . rangelen($rf) . "}\n"; } } foreach my $vfield ((@{$dm->get_fields_of_datatype('verbatim')}, @{$dm->get_fields_of_datatype('uri')})) { if ( my $rf = $be->get_field($vfield) ) { $acc .= " \\verb{$vfield}\n"; $acc .= " \\verb $rf\n \\endverb\n"; } } if ( my $k = $be->get_field('keywords') ) { $acc .= " \\keyw{$k}\n"; } # Append any warnings to the entry, if any if (my $w = $be->get_field('warnings')) { foreach my $warning (@$w) { $acc .= " \\warn{\\item $warning}\n"; } } $acc .= " \\endentry\n"; # Create an index by keyname for easy retrieval $self->{output_data}{ENTRIES}{$secnum}{index}{$key} = \$acc; return; } =head2 create_output_misc Create the output for misc bits and pieces like preamble and closing macro call and add to output object. =cut sub create_output_misc { my $self = shift; if (my $pa = $Biber::MASTER->get_preamble) { $pa = join("%\n", @$pa); # Decode UTF-8 -> LaTeX macros if asked to if (Biber::Config->getoption('output_safechars')) { $pa = Biber::LaTeX::Recode::latex_encode($pa); } $self->{output_data}{HEAD} .= "\\preamble{%\n$pa%\n}\n\n"; } $self->{output_data}{TAIL} .= "\\endinput\n\n"; return; } =head2 output BBL output method - this takes care to output entries in the explicit order derived from the virtual order of the auxcitekeys after sortkey sorting. =cut sub output { my $self = shift; my $data = $self->{output_data}; my $target = $self->{output_target}; $logger->info("Writing output with encoding '" . Biber::Config->getoption('output_encoding') . "'"); $logger->info('Converting UTF-8 to TeX macros on output to .bbl') if Biber::Config->getoption('output_safechars'); foreach my $secnum (sort keys %{$data->{ENTRIES}}) { my $section = $self->get_output_section($secnum); foreach my $list (sort {$a->get_sortschemename cmp $b->get_sortschemename} @{$Biber::MASTER->sortlists->get_lists_for_section($secnum)}) { next unless $list->count_keys; # skip empty lists my $listtype = $list->get_type; foreach my $k ($list->get_keys) { my $entry = $data->{ENTRIES}{$secnum}{index}{$k}; # Instantiate any dynamic, list specific entry information my $entry_string = $list->instantiate_entry($entry, $k); # If requested to convert UTF-8 to macros ... if (Biber::Config->getoption('output_safechars')) { $entry_string = latex_recode_output($entry_string); } out($target, $entry_string); } } } close $target; return; } 1; __END__ =head1 AUTHORS François Charette, C<< >> Philip Kime C<< >> =head1 BUGS Please report any bugs or feature requests on our Github tracker at L. =head1 COPYRIGHT & LICENSE Copyright 2009-2016 François Charette and Philip Kime, all rights reserved. This module is free software. You can redistribute it and/or modify it under the terms of the Artistic License 2.0. This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. =cut biblatex-biber-2.4/t000755000765000024 012667073765 14606 5ustar00philkimestaff000000000000biblatex-biber-2.4/t/basic-misc.t000555000765000024 7020712667073765 17173 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 60; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(configfile => 'biber-test.conf'); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); # WARNING - the .bcf has special defs for URLS to test verbatim lists $biber->parse_ctrlfile('basic-misc.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('maxalphanames', 3); Biber::Config->setblxoption('minalphanames', 1); Biber::Config->setblxoption('maxbibnames', 10); Biber::Config->setblxoption('minbibnames', 7); Biber::Config->setoption('isbn_normalise', 1); Biber::Config->setoption('isbn13', 1); # THERE IS A CONFIG FILE BEING READ TO TEST USER MAPS TOO! # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my @keys = sort $section->get_citekeys; my @citedkeys = sort qw{ alias1 alias2 alias5 anon1 anon2 murray t1 kant:ku kant:kpv t2 shore u1 u2 us1 list1 isbn1 isbn2}; # entry "loh" is missing as the biber.conf map removes it with map_entry_null my @allkeys = sort map {lc()} qw{ anon1 anon2 stdmodel aristotle:poetics vazques-de-parga t1 gonzalez averroes/bland laufenberg westfahl:frontier knuth:ct:a kastenholz averroes/hannes iliad luzzatto malinowski sorace knuth:ct:d britannica nietzsche:historie stdmodel:weinberg knuth:ct:b baez/article knuth:ct:e itzhaki jaffe padhye cicero stdmodel:salam reese averroes/hercz murray shore aristotle:physics massa aristotle:anima gillies set kowalik gaonkar springer geer hammond wormanx westfahl:space worman set:herrmann augustine gerhardt piccato hasan hyman stdmodel:glashow stdmodel:ps_sc kant:kpv companion almendro sigfridsson ctan baez/online aristotle:rhetoric pimentel00 pines knuth:ct:c moraux cms angenendt angenendtsk markey cotton vangennepx kant:ku nussbaum nietzsche:ksa1 vangennep knuth:ct angenendtsa spiegelberg bertram brandt set:aksin chiu nietzsche:ksa set:yoon maron coleridge tvonb t2 u1 u2 i1 i2 tmn1 tmn2 tmn3 tmn4 lne1 alias1 alias2 alias5 url1 ol1 pages1 pages2 pages3 pages4 pages5 pages6 pages7 pages8 us1 labelstest list1 sn1 pages9 isbn1 isbn2 snk1 newtestkey } ; my $u1 = q| \entry{u1}{misc}{} \name{author}{4}{uniquelist=4}{% {{uniquename=0,hash=e1faffb3e614e6c2fba74296962386b7}{% family={AAA}, family_i={A\bibinitperiod}}}% {{uniquename=0,hash=2bb225f0ba9a58930757a868ed57d9a3}{% family={BBB}, family_i={B\bibinitperiod}}}% {{uniquename=0,hash=defb99e69a9f1f6e06f15006b1f166ae}{% family={CCC}, family_i={C\bibinitperiod}}}% {{uniquename=0,hash=45054f47ac3305a2a33e9bcceadff712}{% family={DDD}, family_i={D\bibinitperiod}}}% } \strng{namehash}{b78abdc838d79b6576f2ed0021642766} \strng{fullhash}{b78abdc838d79b6576f2ed0021642766} \field{labelalpha}{AAA\textbf{+}00} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{A title} \field{year}{2000} \endentry |; eq_or_diff( $out->get_output_entry('u1', $main), $u1, 'uniquelist 1' ) ; is_deeply( \@keys, \@citedkeys, 'citekeys 1') ; is_deeply( [ $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global')->get_keys ], [ 'kant:kpv', 'kant:ku' ], 'shorthands' ) ; # reset some options and re-generate information # Have to do a citekey deletion as we are not re-reading the .bcf which would do it for us # Otherwise, we have citekeys and allkeys which confuses fetch_data() $section->del_citekeys; $section->set_allkeys(1); $section->bibentries->del_entries; $section->del_everykeys; Biber::Input::file::bibtex->init_cache; $biber->prepare; $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; $out = $biber->get_output_obj; # Strip out loopkeys because they contain a variable key @keys = sort grep {$_ !~ m/^loopkey/} map {lc()} $section->get_citekeys; is_deeply( \@keys, \@allkeys, 'citekeys 2') ; my $murray1 = q| \entry{murray}{article}{} \name{author}{14}{}{% {{uniquename=0,hash=f1bafaf959660d1c3ca82d486ce5a651}{% family={Hostetler}, family_i={H\bibinitperiod}, given={Michael\bibnamedelima J.}, given_i={M\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=de9f774c929dc661b4180b07f5eb62f3}{% family={Wingate}, family_i={W\bibinitperiod}, given={Julia\bibnamedelima E.}, given_i={J\bibinitperiod\bibinitdelim E\bibinitperiod}}}% {{uniquename=0,hash=76100791c221471771c6bf1dbbc0975d}{% family={Zhong}, family_i={Z\bibinitperiod}, given={Chuan-Jian}, given_i={C\bibinithyphendelim J\bibinitperiod}}}% {{uniquename=0,hash=34c410f87490dd022093780c69640413}{% family={Harris}, family_i={H\bibinitperiod}, given={Jay\bibnamedelima E.}, given_i={J\bibinitperiod\bibinitdelim E\bibinitperiod}}}% {{uniquename=0,hash=a803710eddd16b95e91f420c0081985c}{% family={Vachet}, family_i={V\bibinitperiod}, given={Richard\bibnamedelima W.}, given_i={R\bibinitperiod\bibinitdelim W\bibinitperiod}}}% {{uniquename=0,hash=38d1db37321ac524d14a116e74123685}{% family={Clark}, family_i={C\bibinitperiod}, given={Michael\bibnamedelima R.}, given_i={M\bibinitperiod\bibinitdelim R\bibinitperiod}}}% {{uniquename=0,hash=969c673c8b05314f89a822ecfbead6af}{% family={Londono}, family_i={L\bibinitperiod}, given={J.\bibnamedelimi David}, given_i={J\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=fc6cda30bdeb421b5b57ef2d1ce6f92b}{% family={Green}, family_i={G\bibinitperiod}, given={Stephen\bibnamedelima J.}, given_i={S\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=69dcde2965d0ce8a53fae463355f36f5}{% family={Stokes}, family_i={S\bibinitperiod}, given={Jennifer\bibnamedelima J.}, given_i={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=8cfed260a429843a4846ad8d83f9a09f}{% family={Wignall}, family_i={W\bibinitperiod}, given={George\bibnamedelima D.}, given_i={G\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=71a4aee3f5124c9c94825634735417be}{% family={Glish}, family_i={G\bibinitperiod}, given={Gary\bibnamedelima L.}, given_i={G\bibinitperiod\bibinitdelim L\bibinitperiod}}}% {{uniquename=0,hash=9406f7f2b15056febb90692ae05e8620}{% family={Porter}, family_i={P\bibinitperiod}, given={Marc\bibnamedelima D.}, given_i={M\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=f8d80918767d0ce7f535453dc016c327}{% family={Evans}, family_i={E\bibinitperiod}, given={Neal\bibnamedelima D.}, given_i={N\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=98688e58f25c10d275f9d15d31ba3396}{% family={Murray}, family_i={M\bibinitperiod}, given={Royce\bibnamedelima W.}, given_i={R\bibinitperiod\bibinitdelim W\bibinitperiod}}}% } \strng{namehash}{7ba00ed438c44a2270c14ba95a7fc011} \strng{fullhash}{61836f4684b2615842b68c26479f6ec2} \field{labelalpha}{Hos\textbf{+}98} \field{sortinit}{H} \field{sortinithash}{82012198d5dfa657b8c4a168793268a6} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{shorttitle} \field{annotation}{An \texttt{article} entry with \arabic{author} authors. By default, long author and editor lists are automatically truncated. This is configurable} \field{indextitle}{Alkanethiolate gold cluster molecules} \field{journaltitle}{Langmuir} \field{langid}{english} \field{langidopts}{variant=american} \field{number}{1} \field{shorttitle}{Alkanethiolate gold cluster molecules} \field{subtitle}{Core and monolayer properties as a function of core size} \field{title}{Alkanethiolate gold cluster molecules with core diameters from 1.5 to 5.2~nm} \field{volume}{14} \field{year}{1998} \field{pages}{17\bibrangedash 30} \range{pages}{14} \keyw{keyw1,keyw2} \endentry |; my $murray2 = q| \entry{murray}{article}{} \name{author}{14}{}{% {{uniquename=0,hash=f1bafaf959660d1c3ca82d486ce5a651}{% family={Hostetler}, family_i={H\bibinitperiod}, given={Michael\bibnamedelima J.}, given_i={M\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=de9f774c929dc661b4180b07f5eb62f3}{% family={Wingate}, family_i={W\bibinitperiod}, given={Julia\bibnamedelima E.}, given_i={J\bibinitperiod\bibinitdelim E\bibinitperiod}}}% {{uniquename=0,hash=76100791c221471771c6bf1dbbc0975d}{% family={Zhong}, family_i={Z\bibinitperiod}, given={Chuan-Jian}, given_i={C\bibinithyphendelim J\bibinitperiod}}}% {{uniquename=0,hash=34c410f87490dd022093780c69640413}{% family={Harris}, family_i={H\bibinitperiod}, given={Jay\bibnamedelima E.}, given_i={J\bibinitperiod\bibinitdelim E\bibinitperiod}}}% {{uniquename=0,hash=a803710eddd16b95e91f420c0081985c}{% family={Vachet}, family_i={V\bibinitperiod}, given={Richard\bibnamedelima W.}, given_i={R\bibinitperiod\bibinitdelim W\bibinitperiod}}}% {{uniquename=0,hash=38d1db37321ac524d14a116e74123685}{% family={Clark}, family_i={C\bibinitperiod}, given={Michael\bibnamedelima R.}, given_i={M\bibinitperiod\bibinitdelim R\bibinitperiod}}}% {{uniquename=0,hash=969c673c8b05314f89a822ecfbead6af}{% family={Londono}, family_i={L\bibinitperiod}, given={J.\bibnamedelimi David}, given_i={J\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=fc6cda30bdeb421b5b57ef2d1ce6f92b}{% family={Green}, family_i={G\bibinitperiod}, given={Stephen\bibnamedelima J.}, given_i={S\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=69dcde2965d0ce8a53fae463355f36f5}{% family={Stokes}, family_i={S\bibinitperiod}, given={Jennifer\bibnamedelima J.}, given_i={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}% {{uniquename=0,hash=8cfed260a429843a4846ad8d83f9a09f}{% family={Wignall}, family_i={W\bibinitperiod}, given={George\bibnamedelima D.}, given_i={G\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=71a4aee3f5124c9c94825634735417be}{% family={Glish}, family_i={G\bibinitperiod}, given={Gary\bibnamedelima L.}, given_i={G\bibinitperiod\bibinitdelim L\bibinitperiod}}}% {{uniquename=0,hash=9406f7f2b15056febb90692ae05e8620}{% family={Porter}, family_i={P\bibinitperiod}, given={Marc\bibnamedelima D.}, given_i={M\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=f8d80918767d0ce7f535453dc016c327}{% family={Evans}, family_i={E\bibinitperiod}, given={Neal\bibnamedelima D.}, given_i={N\bibinitperiod\bibinitdelim D\bibinitperiod}}}% {{uniquename=0,hash=98688e58f25c10d275f9d15d31ba3396}{% family={Murray}, family_i={M\bibinitperiod}, given={Royce\bibnamedelima W.}, given_i={R\bibinitperiod\bibinitdelim W\bibinitperiod}}}% } \strng{namehash}{7ba00ed438c44a2270c14ba95a7fc011} \strng{fullhash}{61836f4684b2615842b68c26479f6ec2} \field{labelalpha}{Hos98} \field{sortinit}{H} \field{sortinithash}{82012198d5dfa657b8c4a168793268a6} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{shorttitle} \field{annotation}{An \texttt{article} entry with \arabic{author} authors. By default, long author and editor lists are automatically truncated. This is configurable} \field{indextitle}{Alkanethiolate gold cluster molecules} \field{journaltitle}{Langmuir} \field{langid}{english} \field{langidopts}{variant=american} \field{number}{1} \field{shorttitle}{Alkanethiolate gold cluster molecules} \field{subtitle}{Core and monolayer properties as a function of core size} \field{title}{Alkanethiolate gold cluster molecules with core diameters from 1.5 to 5.2~nm} \field{volume}{14} \field{year}{1998} \field{pages}{17\bibrangedash 30} \range{pages}{14} \keyw{keyw1,keyw2} \endentry |; # This example wouldn't compile - it's just to test escaping my $t1 = q+ \entry{t1}{misc}{} \name{author}{1}{}{% {{uniquename=0,hash=858fcf9483ec29b7707a7dda2dde7a6f}{% family={Brown}, family_i={B\bibinitperiod}, given={Bill}, given_i={B\bibinitperiod}}}% } \strng{namehash}{858fcf9483ec29b7707a7dda2dde7a6f} \strng{fullhash}{858fcf9483ec29b7707a7dda2dde7a6f} \field{labelalpha}{Bro92} \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{10\% of [100] and 90% of $Normal_2$ | \& # things {$^{3}$}} \field{year}{1992} \field{pages}{100\bibrangedash} \range{pages}{-1} \keyw{primary,something,somethingelse} \endentry +; my $t2 = q| \entry{t2}{misc}{} \name{author}{1}{}{% {{uniquename=0,hash=858fcf9483ec29b7707a7dda2dde7a6f}{% family={Brown}, family_i={B\bibinitperiod}, given={Bill}, given_i={B\bibinitperiod}}}% } \strng{namehash}{858fcf9483ec29b7707a7dda2dde7a6f} \strng{fullhash}{858fcf9483ec29b7707a7dda2dde7a6f} \field{labelalpha}{Bro94} \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Signs of W$\frac{o}{a}$nder} \field{year}{1994} \field{pages}{100\bibrangedash 108} \range{pages}{9} \endentry |; my $anon1 = q| \entry{anon1}{unpublished}{} \name{author}{1}{}{% {{hash=a66f357fe2fd356fe49959173522a651}{% family={AnonymousX}, family_i={A\bibinitperiod}}}% } \name{shortauthor}{1}{}{% {{uniquename=0,hash=9873a6cc65c553faa2b21aaad626fe4b}{% family={XAnony}, family_i={X\bibinitperiod}}}% } \strng{namehash}{9873a6cc65c553faa2b21aaad626fe4b} \strng{fullhash}{a66f357fe2fd356fe49959173522a651} \field{labelalpha}{XAn35} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \true{singletitle} \field{labelnamesource}{shortauthor} \field{labeltitlesource}{shorttitle} \field{langid}{english} \field{langidopts}{variant=american} \field{note}{anon1} \field{shorttitle}{Shorttitle} \field{title}{Title1} \field{year}{1835} \field{pages}{111\bibrangedash 118} \range{pages}{8} \keyw{arc} \endentry |; my $anon2 = q| \entry{anon2}{unpublished}{} \name{author}{1}{}{% {{hash=a0bccee4041bc840e14c06e5ba7f083c}{% family={AnonymousY}, family_i={A\bibinitperiod}}}% } \name{shortauthor}{1}{}{% {{uniquename=0,hash=f64c29e89ea49402b997956610b58ef6}{% family={YAnony}, family_i={Y\bibinitperiod}}}% } \strng{namehash}{f64c29e89ea49402b997956610b58ef6} \strng{fullhash}{a0bccee4041bc840e14c06e5ba7f083c} \field{labelalpha}{YAn39} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \true{singletitle} \field{labelnamesource}{shortauthor} \field{labeltitlesource}{shorttitle} \field{langid}{english} \field{langidopts}{variant=american} \field{note}{anon2} \field{shorttitle}{Shorttitle} \field{title}{Title2} \field{year}{1839} \field{pages}{1176\bibrangedash 1276} \range{pages}{101} \keyw{arc} \endentry |; my $url1 = q| \entry{url1}{misc}{} \name{author}{1}{}{% {{uniquename=0,hash=b2106a3dda6c5a4879a0cab37e9cca55}{% family={Alias}, family_i={A\bibinitperiod}, given={Alan}, given_i={A\bibinitperiod}}}% } \strng{namehash}{b2106a3dda6c5a4879a0cab37e9cca55} \strng{fullhash}{b2106a3dda6c5a4879a0cab37e9cca55} \field{labelalpha}{Ali05} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{extraalpha}{4} \field{labelnamesource}{author} \field{year}{2005} \verb{url} \verb http://www.something.com/q=%C3%A1%C3%A9%C3%A1%C5%A0 \endverb \lverb{urls}{2} \lverb http://www.something.com/q=%C3%A1%C3%A9%C3%A1%C5%A0 \lverb http://www.sun.com \endlverb \endentry |; my $list1 = q| \entry{list1}{book}{} \true{morelocation} \list{location}{2}{% {AAA}% {BBB}% } \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \endentry |; my $Worman_N = [ 'Worman_N' ] ; my $Gennep = [ 'v_Gennep_A', 'v_Gennep_J' ] ; eq_or_diff( $out->get_output_entry('t1', $main), $t1, 'bbl entry with maths in title 1' ); eq_or_diff( $bibentries->entry('shore')->get_field('month'), '03', 'default bib month macros' ); ok( $bibentries->entry('t1')->has_keyword('primary'), 'Keywords test - 1' ); ok( $bibentries->entry('t1')->has_keyword('something'), 'Keywords test - 2' ); ok( $bibentries->entry('t1')->has_keyword('somethingelse'), 'Keywords test - 3' ); eq_or_diff( $out->get_output_entry('t2', $main), $t2, 'bbl entry with maths in title 2' ); is_deeply( Biber::Config->_get_uniquename('Worman_N', 'global'), $Worman_N, 'uniquename count 1'); is_deeply( Biber::Config->_get_uniquename('vanGennep', 'global'), $Gennep, 'uniquename count 2'); eq_or_diff( $out->get_output_entry('murray', $main), $murray1, 'bbl with > maxcitenames' ); eq_or_diff( $out->get_output_entry('missing1', $main), " \\missing{missing1}\n", 'missing citekey 1' ); eq_or_diff( $out->get_output_entry('missing2', $main), " \\missing{missing2}\n", 'missing citekey 2' ); Biber::Config->setblxoption('alphaothers', ''); Biber::Config->setblxoption('sortalphaothers', ''); # Have to do a citekey deletion as we are not re-reading the .bcf which would do it for us # Otherwise, we have citekeys and allkeys which confuses fetch_data() $section->del_citekeys; $section->bibentries->del_entries; $section->del_everykeys; Biber::Input::file::bibtex->init_cache; $biber->prepare ; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $out = $biber->get_output_obj; eq_or_diff($out->get_output_entry('murray', $main), $murray2, 'bbl with > maxcitenames, empty alphaothers'); # Make sure namehash and fullhash are seperately generated eq_or_diff( $out->get_output_entry('anon1', $main), $anon1, 'namehash/fullhash 1' ) ; eq_or_diff( $out->get_output_entry('anon2', $main), $anon2, 'namehash/fullhash 2' ) ; # Testing of user field map ignores ok(is_undef($bibentries->entry('i1')->get_field('abstract')), 'map 1' ); eq_or_diff($bibentries->entry('i1')->get_field('userd'), 'test', 'map 2' ); ok(is_undef($bibentries->entry('i2')->get_field('userb')), 'map 3' ); eq_or_diff(NFC($bibentries->entry('i2')->get_field('usere')), 'a Štring', 'map 4' ); # Testing ot UTF8 match/replace eq_or_diff($biber->_liststring('i1', 'listd'), 'abc', 'map 5' ); # Testing of user field map match/replace eq_or_diff($biber->_liststring('i1', 'listb'), 'REPlacedte!early', 'map 6'); eq_or_diff($biber->_liststring('i1', 'institution'), 'REPlaCEDte!early', 'map 7'); # Testing of pseudo-field "entrykey" handling eq_or_diff($bibentries->entry('i1')->get_field('note'), 'i1', 'map 8' ); # Checking deletion of alsosets with value BMAP_NULL ok(is_undef($bibentries->entry('i2')->get_field('userf')), 'map 9' ); # Checking that the "misc" type-specific mapping to null takes precedence over global userb->userc ok(is_undef($bibentries->entry('i2')->get_field('userc')), 'map 10' ); # Make sure visibility doesn't exceed number of names. eq_or_diff($bibentries->entry('i2')->get_field($bibentries->entry('i2')->get_labelname_info)->get_visible_bib, '3', 'bib visibility - 1'); # Testing per_type and per_entry max/min* so reset globals to defaults Biber::Config->setblxoption('uniquelist', 0); Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('maxitems', 3); Biber::Config->setblxoption('minitems', 1); Biber::Config->setblxoption('maxbibnames', 3); Biber::Config->setblxoption('minbibnames', 1); Biber::Config->setblxoption('maxalphanames', 3); Biber::Config->setblxoption('minalphanames', 1); Biber::Config->setblxoption('maxcitenames', 1, 'ENTRYTYPE', 'misc'); Biber::Config->setblxoption('maxbibnames', 2, 'ENTRYTYPE', 'unpublished'); Biber::Config->setblxoption('minbibnames', 2, 'ENTRYTYPE', 'unpublished'); # maxalphanames is set on tmn2 entry Biber::Config->setblxoption('minalphanames', 2, 'ENTRYTYPE', 'book'); # minitems is set on tmn3 entry Biber::Config->setblxoption('maxitems', 2, 'ENTRYTYPE', 'unpublished'); # Have to do a citekey deletion as we are not re-reading the .bcf which would do it for us # Otherwise, we have citekeys and allkeys which confuses fetch_data() $section->del_citekeys; $section->bibentries->del_entries; $section->del_everykeys; Biber::Input::file::bibtex->init_cache; $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($bibentries->entry('tmn1')->get_field($bibentries->entry('tmn1')->get_labelname_info)->get_visible_cite, '1', 'per_type maxcitenames - 1'); eq_or_diff($bibentries->entry('tmn2')->get_field($bibentries->entry('tmn2')->get_labelname_info)->get_visible_cite, '3', 'per_type maxcitenames - 2'); eq_or_diff($bibentries->entry('tmn3')->get_field($bibentries->entry('tmn3')->get_labelname_info)->get_visible_bib, '2', 'per_type bibnames - 3'); eq_or_diff($bibentries->entry('tmn4')->get_field($bibentries->entry('tmn4')->get_labelname_info)->get_visible_bib, '3', 'per_type bibnames - 4'); eq_or_diff($bibentries->entry('tmn1')->get_field($bibentries->entry('tmn1')->get_labelname_info)->get_visible_alpha, '3', 'per_type/entry alphanames - 1'); eq_or_diff($bibentries->entry('tmn2')->get_field($bibentries->entry('tmn2')->get_labelname_info)->get_visible_alpha, '2', 'per_type/entry alphanames - 2'); eq_or_diff($biber->_liststring('tmn1', 'institution'), 'A!B!C', 'per_type/entry items - 1'); eq_or_diff($biber->_liststring('tmn3', 'institution'), "A!B\x{10FFFD}", 'per_type/entry items - 2'); # Citekey alias testing eq_or_diff($section->get_citekey_alias('alias3'), 'alias1', 'Citekey aliases - 1'); ok(is_undef($section->get_citekey_alias('alias2')), 'Citekey aliases - 2'); eq_or_diff($section->get_citekey_alias('alias4'), 'alias2', 'Citekey aliases - 3'); # primary key 'alias5' is not cited but should be added anyway as cited alias 'alias6' needs it eq_or_diff($section->get_citekey_alias('alias6'), 'alias5', 'Citekey aliases - 4'); ok($bibentries->entry('alias5'), 'Citekey aliases - 5'); # URL encoding testing eq_or_diff($bibentries->entry('url1')->get_field('url'), 'http://www.something.com/q=%C3%A1%C3%A9%C3%A1%C5%A0', 'URL encoding - 1'); eq_or_diff($out->get_output_entry('url1', $main), $url1, 'URL encoding - 2' ) ; # map_final testing with map_field_set eq_or_diff($bibentries->entry('ol1')->get_field('note'), 'A note', 'map_final - 1'); eq_or_diff($bibentries->entry('ol1')->get_field('title'), 'Online1', 'map_final - 2'); # Test for tricky pages field is_deeply($bibentries->entry('pages1')->get_field('pages'),[[23, 24]], 'pages - 1'); is_deeply($bibentries->entry('pages2')->get_field('pages'),[[23, undef]], 'pages - 2'); is_deeply($bibentries->entry('pages3')->get_field('pages'), [['I-II', 'III-IV']], 'pages - 3'); is_deeply($bibentries->entry('pages4')->get_field('pages'), [[3,5]], 'pages - 4'); is_deeply($bibentries->entry('pages5')->get_field('pages'), [[42, '']], 'pages - 5'); is_deeply($bibentries->entry('pages6')->get_field('pages'), [['\bibstring{number} 42', undef]], 'pages - 6'); is_deeply($bibentries->entry('pages7')->get_field('pages'), [['\bibstring{number} 42', undef], [3,6], ['I-II',5 ]], 'pages - 7'); is_deeply($bibentries->entry('pages8')->get_field('pages'), [[10,15],['ⅥⅠ', 'ⅻ']], 'pages - 8'); is_deeply($bibentries->entry('pages9')->get_field('pages'), [['M-1','M-4']], 'pages - 9'); # Test for map levels, the user map makes this CUSTOMC and then style map makes it CUSTOMA eq_or_diff($bibentries->entry('us1')->get_field('entrytype'), 'customa', 'Map levels - 1'); # Test for "others" in lists eq_or_diff( $out->get_output_entry('list1', $main), $list1, 'Entry with others list' ) ; my $isbn1 = q| \entry{isbn1}{misc}{} \name{author}{1}{}{% {{uniquename=0,hash=f6595ccb9db5f634e7bb242a3f78e5f9}{% family={Flummox}, family_i={F\bibinitperiod}, given={Fred}, given_i={F\bibinitperiod}}}% } \strng{namehash}{f6595ccb9db5f634e7bb242a3f78e5f9} \strng{fullhash}{f6595ccb9db5f634e7bb242a3f78e5f9} \field{labelalpha}{Flu} \field{sortinit}{F} \field{sortinithash}{c6a7d9913bbd7b20ea954441c0460b78} \field{extraalpha}{1} \field{labelnamesource}{author} \field{isbn}{978-0-8165-2066-4} \endentry |; my $isbn2 = q| \entry{isbn2}{misc}{} \name{author}{1}{}{% {{uniquename=0,hash=f6595ccb9db5f634e7bb242a3f78e5f9}{% family={Flummox}, family_i={F\bibinitperiod}, given={Fred}, given_i={F\bibinitperiod}}}% } \strng{namehash}{f6595ccb9db5f634e7bb242a3f78e5f9} \strng{fullhash}{f6595ccb9db5f634e7bb242a3f78e5f9} \field{labelalpha}{Flu} \field{sortinit}{F} \field{sortinithash}{c6a7d9913bbd7b20ea954441c0460b78} \field{extraalpha}{2} \field{labelnamesource}{author} \field{isbn}{978-0-8165-2066-4} \endentry |; # ISBN options tests eq_or_diff($out->get_output_entry('isbn1', $main), $isbn1, 'ISBN options - 1'); eq_or_diff($out->get_output_entry('isbn2', $main), $isbn2, 'ISBN options - 2'); my $new1 = q| \entry{newtestkey}{book}{} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{note}{note} \field{usera}{RC-6947} \field{userb}{RC} \endentry |; # New entry map test eq_or_diff($out->get_output_entry('newtestkey', $main), $new1, 'New key mapping - 1'); biblatex-biber-2.4/t/bcfvalidation.t000555000765000024 132512667073765 17741 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 41; use XML::LibXML; use Biber; chdir('t'); # Validate all .bcfs used in tests # Set up schema my $CFxmlschema = XML::LibXML::RelaxNG->new(location => '../data/schemata/bcf.rng'); foreach my $bcf () { # Set up XML parser my $CFxmlparser = XML::LibXML->new(); # basic parse and XInclude processing my $CFxp = $CFxmlparser->parse_file($bcf); # XPath context my $CFxpc = XML::LibXML::XPathContext->new($CFxp); $CFxpc->registerNs('bcf', 'https://sourceforge.net/projects/biblatex'); # Validate against schema. Dies if it fails. $CFxmlschema->validate($CFxp); is($@, '', "Validation of $bcf"); } biblatex-biber-2.4/t/biblatexml.t000555000765000024 1270012667073765 17276 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Text::Diff::Config; $Text::Diff::Config::Output_Unicode = 1; use Test::More tests => 5; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; use Encode; chdir("t/tdata"); # Set up Biber object # THERE ARE MAPS IN THE BCF my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('biblatexml.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('bcf', 'biblatexml.bcf'); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $l1 = q| \entry{bltx1}{misc}{useprefix=false} \true{moreauthor} \name{author}{3}{useprefix=true}{% {{hash=d16c52bc219d448d5f07dc865d5c4f54}{% prefix={von}, prefix_i={v\\bibinitperiod}, family={Булгаков}, family_i={Б\\bibinitperiod}, given={Павел\\bibnamedelima Георгиевич}, given_i={П\\bibinitperiod\\bibinitdelim Г\\bibinitperiod}}}% {{useprefix=false,hash=a3dd54ba13bec8a96a9d9b9804fc7927}{% prefix={von}, prefix_i={v\\bibinitperiod}, family={РРозенфельд}, family_i={Р\\bibinitperiod}, given={Борис-ZZ\\bibnamedelima Aбрамович}, given_i={Б\\bibinithyphendelim Z\\bibinitperiod\\bibinitdelim A\\bibinitperiod}}}% {{hash=e708d5a31534e937578abf161c867a25}{% family={Aхмедов}, family_i={A\\bibinitperiod}, given={Ашраф\\bibnamedelima Ахмедович}, given_i={А\\bibinitperiod\\bibinitdelim А\\bibinitperiod}}}% } \name{foreword}{1}{}{% {{hash=0ee59e598dae22fac8e6d9d2df7e79ec}{% family={Brown}, family_i={B\\bibinitperiod}, given={John\\bibnamedelimb }, given_i={J\\bibinitperiod}}}% } \name{translator}{1}{}{% {{hash=b44eba830fe9817fbe8e53c82f1cbe04}{% family={Smith}, family_i={S\\bibinitperiod}, given={Paul}, given_i={P\\bibinitperiod}}}% } \list{language}{1}{% {russian}% } \list{location}{1}{% {Москва}% } \list{publisher}{1}{% {Наука}% } \strng{namehash}{b5cf3ab49063f1ac8cf913eb3527f38e} \strng{fullhash}{676e5835f2422c4d02b9107e530be190} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelyear}{1983} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{addendum}{userc} \field{eventday}{16} \field{eventendday}{17} \field{eventendmonth}{05} \field{eventendyear}{1990} \field{eventmonth}{05} \field{eventyear}{1990} \field{origday}{02} \field{origmonth}{04} \field{origyear}{1985} \field{pagetotal}{240} \field{relatedstring}{Somestring} \field{relatedtype}{reprint} \field{series}{Научно-биографическая литература} \field{title}{Мухаммад ибн муса ал-Хорезми. Около 783 – около 850} \field{urlday}{01} \field{urlendyear}{} \field{urlmonth}{07} \field{urlyear}{1991} \field{userb}{usera} \field{userd}{userc} \field{usere}{a} \field{year}{1983} \field{pages}{1\\bibrangedash 10\\bibrangessep 30\\bibrangedash 34} \range{pages}{15} \endentry |; my $l2 = q| \entry{loopkey:a}{book}{} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \endentry |; my $bltx1 = 'mm,,,von!Булгаков!Павел Георгиевич#РРозенфельд!БорисZZ Aбрамович!von#Aхмедов!Ашраф Ахмедович,1983,0000,Мухаммад ибн муса алХорезми Около 783 около 850'; # Test::Differences doesn't like utf8 unless it's encoded here eq_or_diff(encode_utf8($out->get_output_entry('bltx1', $main)), encode_utf8($l1), 'BibLaTeXML - 1'); eq_or_diff($section->get_citekey_alias('bltx1a1'), 'bltx1', 'Citekey aliases - 1'); eq_or_diff($section->get_citekey_alias('bltx1a2'), 'bltx1', 'Citekey aliases - 2'); eq_or_diff(encode_utf8($main->get_sortdata('bltx1')->[0]), encode_utf8($bltx1), 'useprefix at name list and name scope - 1' ); eq_or_diff(encode_utf8($out->get_output_entry('loopkey:a', $main)), encode_utf8($l2), 'BibLaTeXML automapcreate - 1'); biblatex-biber-2.4/t/bibtex-aliases.t000555000765000024 1112712667073765 20051 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 24; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; # Set up Biber object my $biber = Biber->new( noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('bibtex-aliases.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('validate_datamodel', 1); # THERE IS A MAPPING SECTION IN THE .bcf BEING USED TO TEST USER MAPS TOO! # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; my $w1 = ["Datamodel: Entry 'alias2' (bibtex-aliases.bib): Field 'school' invalid in data model - ignoring", "Datamodel: Entry 'alias2' (bibtex-aliases.bib): Invalid entry type 'thing' - defaulting to 'misc'", "Datamodel: Entry 'alias2' (bibtex-aliases.bib): Invalid field 'institution' for entrytype 'misc'", ]; my $w2 = ["Datamodel: Entry 'alias4' (bibtex-aliases.bib): Invalid field 'author' for entrytype 'customa'", "Datamodel: Entry 'alias4' (bibtex-aliases.bib): Invalid field 'eprint' for entrytype 'customa'", "Datamodel: Entry 'alias4' (bibtex-aliases.bib): Invalid field 'eprinttype' for entrytype 'customa'", "Datamodel: Entry 'alias4' (bibtex-aliases.bib): Invalid field 'namea' for entrytype 'customa'", "Datamodel: Entry 'alias4' (bibtex-aliases.bib): Invalid field 'title' for entrytype 'customa'", ]; eq_or_diff($bibentries->entry('alias1')->get_field('entrytype'), 'thesis', 'Alias - 1' ); eq_or_diff($bibentries->entry('alias1')->get_field('type'), 'phdthesis', 'Alias - 2' ); is_deeply($bibentries->entry('alias1')->get_field('location'), ['Ivory Towers'], 'Alias - 3' ); eq_or_diff($bibentries->entry('alias1')->get_field('address'), undef, 'Alias - 4' ); eq_or_diff($bibentries->entry('alias2')->get_field('entrytype'), 'misc', 'Alias - 5' ); is_deeply($bibentries->entry('alias2')->get_field('warnings'), $w1, 'Alias - 6' ) ; eq_or_diff($bibentries->entry('alias2')->get_field('school'), undef, 'Alias - 7' ); eq_or_diff($bibentries->entry('alias3')->get_field('entrytype'), 'customb', 'Alias - 8' ); eq_or_diff($bibentries->entry('alias4')->get_field('entrytype'), 'customa', 'Alias - 9' ); eq_or_diff($bibentries->entry('alias4')->get_field('verba'), 'conversation', 'Alias - 10' ); eq_or_diff($bibentries->entry('alias4')->get_field('verbb'), 'somevalue', 'Alias - 11' ); eq_or_diff($bibentries->entry('alias4')->get_field('eprint'), 'anid', 'Alias - 12' ); eq_or_diff($bibentries->entry('alias4')->get_field('eprinttype'), 'pubmedid', 'Alias - 13' ); eq_or_diff($bibentries->entry('alias4')->get_field('userd'), 'Some string of things', 'Alias - 14' ); eq_or_diff($bibentries->entry('alias4')->get_field('pubmedid'), undef, 'Alias - 15' ); eq_or_diff($bibentries->entry('alias4')->get_field('namea')->nth_name(1)->get_namepart('given'), 'Sam', 'Alias - 16' ); is_deeply($bibentries->entry('alias4')->get_field('warnings'), $w2, 'Alias - 17' ) ; # Testing of .bcf field map match/replace ok(is_undef($bibentries->entry('alias5')->get_field('abstract')), 'Alias - 18' ); eq_or_diff($biber->_liststring('alias5', 'listb'), 'REPlaCEDte!early', 'Alias - 19'); eq_or_diff($biber->_liststring('alias5', 'institution'), 'REPlaCEDte!early', 'Alias - 20'); # Testing of no target but just field additions is_deeply($bibentries->entry('alias6')->get_field('keywords'), ['keyw1', 'keyw2'], 'Alias - 21' ); # Testing of no regexp match for field value is_deeply($bibentries->entry('alias7')->get_field('lista'), ['listaval'], 'Alias - 22' ); # Testing append overwrites eq_or_diff($bibentries->entry('alias7')->get_field('verbb'), 'val2val1', 'Alias - 23' ); eq_or_diff($bibentries->entry('alias7')->get_field('verbc'), 'val3val2val1', 'Alias - 24' ); biblatex-biber-2.4/t/bibtex-output.t000555000765000024 656212667073765 17757 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use Test::More tests => 5; use Test::Differences; unified_diff; use Encode; use Biber; use Biber::Utils; use Biber::Output::bibtex; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); no warnings 'utf8'; use utf8; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('output_resolve', 1); Biber::Config->setoption('output_format', 'bibtex'); Biber::Config->setoption('output_align', '1'); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); $biber->parse_ctrlfile('bibtex-output.bcf'); $biber->set_output_obj(Biber::Output::bibtex->new()); # Now generate the information $biber->prepare_tool; my $main = $biber->sortlists->get_list(99999, Biber::Config->getblxoption('sortscheme') . '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global'); my $out = $biber->get_output_obj; my $b1 = q|@ARTICLE{murray, ANNOTATION = {An \texttt{article} entry with \arabic{author} authors. By default, long author and editor lists are automatically truncated. This is configurable}, AUTHOR = {Hostetler, Michael J. and Wingate, Julia E. and Zhong, Chuan-Jian and Harris, Jay E. and Vachet, Richard W. and Clark, Michael R. and Londono, J. David and Green, Stephen J. and Stokes, Jennifer J. and Wignall, George D. and Glish, Gary L. and Porter, Marc D. and Evans, Neal D. and Murray, Royce W.}, INDEXTITLE = {Alkanethiolate gold cluster molecules}, JOURNALTITLE = {Langmuir}, LANGID = {english}, LANGIDOPTS = {variant=american}, NUMBER = {1}, PAGES = {17--30}, SHORTTITLE = {Alkanethiolate gold cluster molecules}, SUBTITLE = {Core and monolayer properties as a function of core size}, TITLE = {Alkanethiolate gold cluster molecules with core diameters from 1.5 to 5.2~nm}, VOLUME = {14}, YEAR = {1998}, } |; my $b2 = q|@BOOK{b1, MAINSUBTITLE = {Mainsubtitle}, MAINTITLE = {Maintitle}, MAINTITLEADDON = {Maintitleaddon}, TITLE = {Booktitle}, YEAR = {1999}, } |; my $b3 = q|@BOOK{xd1, AUTHOR = {Edward Paul Ellington}, LOCATION = {New York and London}, NOTE = {A Note}, PUBLISHER = {Macmillan}, YEAR = {2001}, } |; # NFD here because we are testing internals here and all internals expect NFD eq_or_diff($out->get_output_entry('murray',), $b1, 'bibtex output 1'); eq_or_diff($out->get_output_entry('b1',), $b2, 'bibtex output 2'); eq_or_diff($out->get_output_entry('xd1',), $b3, 'bibtex output 3'); ok(is_undef($out->get_output_entry('reese')), 'bibtex output 4'); is_deeply([$main->get_keys], ['murray', 'kant:ku', 'b1', 'xd1', 'mv1', 'macmillan', 'macmillan:pub'], 'bibtex output sorting'); biblatex-biber-2.4/t/configfile.t000555000765000024 3715712667073765 17275 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; use Test::More tests => 9; use Test::Differences; unified_diff; use Biber; use Cwd qw(getcwd); use File::Spec; use Log::Log4perl; use Unicode::Normalize; my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); chdir('t/tdata'); my $collopts = { level => 3, variable => 'non-ignorable', normalization => 'prenormalized', table => '/home/user/data/otherkeys.txt' }; my $noinit = [ {value => q/\b\p{Ll}{2}\p{Pd}/}, {value => q/[\x{2bf}\x{2018}]/} ]; my $nosort = [ { name => 'author', value => q/\A\p{L}{2}\p{Pd}/ }, { name => 'author', value => q/[\x{2bf}\x{2018}]/ }, { name => 'translator', value => q/[\x{2bf}\x{2018}]/ } ]; my $sourcemap = [ { datatype => "bibtex", level => "user", map => [ { map_step => [ { map_field_source => "TITLE", map_match => "High-Resolution Micromachined Interferometric Accelerometer", map_final => 1, }, { map_entry_null => 1 }, ], }, { map_step => [ { map_type_source => "ARTICLE", map_type_target => "CUSTOMB" }, ], per_datasource => [{ content => "doesnotexist.bib" }], }, { map_overwrite => 0, map_step => [ { map_field_set => "KEYWORDS", map_field_value => "keyw1, keyw2" }, { map_field_set => "TITLE", map_field_value => "Blah" }, ], per_datasource => [ { content => "examples.bib" }, { content => "doesnotexist.bib" }, ], per_type => [{ content => "ARTICLE" }, { content => "UNPUBLISHED" }], }, { map_step => [ { map_final => 1, map_type_source => "CONVERSATION", map_type_target => "CUSTOMC", }, { map_field_set => "VERBA", map_origentrytype => 1 }, { map_field_set => "VERBB", map_field_value => "somevalue" }, { map_field_set => "VERBC", map_field_value => "somevalue" }, ], }, { map_step => [{ map_type_source => "CHAT", map_type_target => "CUSTOMB" }], }, { map_step => [ { map_field_source => "USERB", map_final => 1 }, { map_field_set => "USERB", map_null => 1 }, { map_field_set => "USERE", map_field_value => NFD("a \x{160}tring") }, { map_field_set => "USERF", map_null => 1 }, ], per_datasource => [{ content => "examples.bib" }], per_type => [{ content => "MISC" }], }, { map_step => [ { map_field_set => "ABSTRACT", map_null => 1 }, { map_field_source => "CONDUCTOR", map_field_target => "NAMEA" }, { map_field_source => "GPS", map_field_target => "USERA" }, { map_field_source => "PARTICIPANT", map_field_target => "NAMEA" }, { map_field_source => "USERB", map_field_target => "USERD" }, ], per_datasource => [{ content => "examples.bib" }], }, { map_step => [ { map_field_source => "PUBMEDID", map_field_target => "EPRINT", map_final => 1, }, { map_field_set => "EPRINTTYPE", map_origfield => 1 }, { map_field_set => "USERD", map_field_value => "Some string of things", }, ], }, { map_step => [ { map_field_source => "LISTB", map_match => "\\A(\\S{2})", map_replace => "REP\$1CED", }, { map_field_source => "LISTB", map_match => "CED", map_replace => "ced" }, ], per_datasource => [{ content => "examples.bib" }], }, { map_step => [ { map_field_source => "TYPE", map_match => "resreport", map_final => "1" }, { map_field_set => "USERA", map_field_value => "a, b,c" } ], }, { map_step => [ { map_field_source => "TYPE", map_match => "resreport", map_final => "1" }, { map_entry_new => "loopkey:\$MAPLOOP:\$MAPUNIQ", map_entry_newtype => "book" }, ], map_foreach => "USERA", }, { map_step => [{ map_field_source => "TYPE", map_match => "resreport", map_final => "1" }, { map_entry_new => "newtestkey", map_entry_newtype => "book" }, { map_entrytarget => "newtestkey", map_field_set => "NOTE", map_field_value => "note" }, { map_field_source => "NUMBER", map_match => "([A-Z]+)" }, { map_entrytarget => "newtestkey", map_field_set => "USERA", map_origfieldval => "1" }, { map_entrytarget => "newtestkey", map_field_set => "USERB", map_field_value => "\$1" }, { map_field_set => "LISTA", map_null => 1 }], per_type => [{ content => "REPORT" }], }, { map_step => [ { map_field_source => "LISTC", map_field_target => "INSTITUTION", map_match => "\\A(\\S{2})", map_replace => "REP\$1CED", }, { map_field_source => "LISTD", map_match => NFD("æøå"), map_replace => "abc", }, { map_field_set => "entrykey", map_null => 1 }, { map_field_source => "entrykey", map_field_target => "NOTE" }, { map_field_set => "NOTE", map_origfieldval => 1 }, ], per_type => [{ content => "UNPUBLISHED" }], }, { map_overwrite => 0, map_step => [{ map_field_set => "NOTE", map_field_value => "Overwrite note", map_final => 1}, { map_field_set => "TITLE", map_null => 1 }], per_type => [{ content => "ONLINE" }], }, ], map_overwrite => 1, }, { datatype => "ris", level => "user", map => [ { map_step => [{ map_type_source => "JOUR", map_type_target => "RPRT" }], per_datasource => [{ content => "ris1.ris" }], }, { map_overwrite => 1, map_step => [ { map_final => 1, map_type_source => "BOOK", map_type_target => "CHAP" }, { map_field_set => "KW", map_field_value => "somevalue" }, ], }, { map_step => [{ map_field_set => "N2", map_null => 1 }], per_datasource => [{ content => "ris1.ris" }], }, { map_step => [ { map_field_source => "JO", map_match => "Neurosurg\\.", map_replace => "Neurosurgery", }, ], per_datasource => [{ content => "ris1.ris" }], per_type => [{ content => "RPRT" }], }, ], }, { datatype => "bibtex", level => "driver", map => [ { map_step => [ { map_final => 1, map_type_source => "conference", map_type_target => "inproceedings", }, { map_final => 1, map_type_source => "electronic", map_type_target => "online", }, { map_final => 1, map_type_source => "www", map_type_target => "online" }, ], }, { map_step => [ { map_final => 1, map_type_source => "mastersthesis", map_type_target => "thesis", }, { map_field_set => "type", map_field_value => "mathesis" }, ], }, { map_step => [ { map_final => 1, map_type_source => "phdthesis", map_type_target => "thesis", }, { map_field_set => "type", map_field_value => "phdthesis" }, ], }, { map_step => [ { map_final => 1, map_type_source => "techreport", map_type_target => "report", }, { map_field_set => "type", map_field_value => "techreport" }, ], }, { map_step => [ { map_field_source => "hyphenation", map_field_target => "langid" }, { map_field_source => "address", map_field_target => "location" }, { map_field_source => "school", map_field_target => "institution" }, { map_field_source => "annote", map_field_target => "annotation" }, { map_field_source => "archiveprefix", map_field_target => "eprinttype", }, { map_field_source => "journal", map_field_target => "journaltitle" }, { map_field_source => "primaryclass", map_field_target => "eprintclass", }, { map_field_source => "key", map_field_target => "sortkey" }, { map_field_source => "pdf", map_field_target => "file" }, ], }, ], }, { datatype => "ris", level => "driver", map => [ { map_step => [ { map_final => 1, map_type_source => "ART", map_type_target => "artwork" }, { map_final => 1, map_type_source => "BILL", map_type_target => "jurisdiction", }, { map_final => 1, map_type_source => "BOOK", map_type_target => "book" }, { map_final => 1, map_type_source => "CHAP", map_type_target => "inbook" }, { map_final => 1, map_type_source => "COMP", map_type_target => "software", }, { map_final => 1, map_type_source => "CONF", map_type_target => "proceedings", }, { map_final => 1, map_type_source => "GEN", map_type_target => "misc" }, { map_final => 1, map_type_source => "JFULL", map_type_target => "article", }, { map_final => 1, map_type_source => "JOUR", map_type_target => "article" }, { map_final => 1, map_type_source => "MGZN", map_type_target => "misc" }, { map_final => 1, map_type_source => "MPCT", map_type_target => "movie" }, { map_final => 1, map_type_source => "NEWS", map_type_target => "misc" }, { map_final => 1, map_type_source => "PAMP", map_type_target => "misc" }, { map_final => 1, map_type_source => "PAT", map_type_target => "patent" }, { map_final => 1, map_type_source => "PCOMM", map_type_target => "misc" }, { map_final => 1, map_type_source => "RPRT", map_type_target => "report" }, { map_final => 1, map_type_source => "SER", map_type_target => "misc" }, { map_final => 1, map_type_source => "SLIDE", map_type_target => "misc" }, { map_final => 1, map_type_source => "SOUND", map_type_target => "audio" }, { map_final => 1, map_type_source => "STAT", map_type_target => "legal" }, { map_final => 1, map_type_source => "THES", map_type_target => "thesis" }, { map_final => 1, map_type_source => "UNBILL", map_type_target => "jurisdiction", }, { map_final => 1, map_type_source => "UNPB", map_type_target => "unpublished", }, ], }, { map_step => [ { map_field_source => "Y1", map_field_target => "date" }, { map_field_source => "PY", map_field_target => "date" }, { map_field_source => "Y2", map_field_target => "eventdate" }, { map_field_source => "A1", map_field_target => "author" }, { map_field_source => "AU", map_field_target => "author" }, { map_field_source => "A2", map_field_target => "editor" }, { map_field_source => "A3", map_field_target => "editor" }, { map_field_source => "ED", map_field_target => "editor" }, { map_field_source => "SPEP", map_field_target => "pages" }, { map_field_source => "N1", map_field_target => "note" }, { map_field_source => "N2", map_field_target => "abstract" }, { map_field_source => "AB", map_field_target => "abstract" }, { map_field_source => "JO", map_field_target => "journaltitle" }, { map_field_source => "JF", map_field_target => "journaltitle" }, { map_field_source => "JA", map_field_target => "shortjournal" }, { map_field_source => "VL", map_field_target => "volume" }, { map_field_source => "IS", map_field_target => "issue" }, { map_field_source => "CP", map_field_target => "issue" }, { map_field_source => "CY", map_field_target => "location" }, { map_field_source => "SN", map_field_target => "isbn" }, { map_field_source => "PB", map_field_target => "publisher" }, { map_field_source => "KW", map_field_target => "keywords" }, { map_field_source => "TI", map_field_target => "title" }, { map_field_source => "U1", map_field_target => "usera" }, { map_field_source => "U2", map_field_target => "userb" }, { map_field_source => "U3", map_field_target => "userc" }, { map_field_source => "U4", map_field_target => "userd" }, { map_field_source => "U5", map_field_target => "usere" }, { map_field_source => "UR", map_field_target => "url" }, { map_field_source => "L1", map_field_target => "file" }, ], }, ], }, ]; # Set up Biber object my $biber = Biber->new( configfile => 'biber-test.conf', mincrossrefs => 7 ); $biber->parse_ctrlfile('general.bcf'); eq_or_diff(Biber::Config->getoption('mincrossrefs'), 7, 'Options 1 - from cmdline'); eq_or_diff(Biber::Config->getoption('configfile'), File::Spec->catfile('biber-test.conf'), 'Options 2 - from cmdline'); eq_or_diff(Biber::Config->getoption('sortlocale'), 'testlocale', 'Options 3 - from config file'); is_deeply(Biber::Config->getoption('collate_options'), $collopts, 'Options 4 - from config file'); is_deeply(Biber::Config->getoption('nosort'), $nosort, 'Options 5 - from config file'); is_deeply(Biber::Config->getoption('noinit'), $noinit, 'Options 6 - from config file'); is_deeply(Biber::Config->getoption('sortcase'), 0, 'Options 7 - from .bcf'); eq_or_diff(Biber::Config->getoption('decodecharsset'), 'base', 'Options 8 - from defaults'); # Here the result is a merge of the biblatex option from the .bcf and the option from # the biber config file as sourcemap is a special case is_deeply(Biber::Config->getoption('sourcemap'), $sourcemap, 'Options 9 - from config file'); biblatex-biber-2.4/t/crossrefs.t000555000765000024 5067112667073765 17175 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 31; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; use Capture::Tiny qw(capture); use Biber::Utils; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); # Note stderr is output here so we can capture it and do a cyclic crossref test my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 1 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('crossrefs.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('nodieonerror', 1); # because there is a failing cyclic crossref check # Now generate the information my (undef, $stderr) = capture { $biber->prepare }; my $section0 = $biber->sections->get_section(0); my $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $section1 = $biber->sections->get_section(1); my $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); my $out = $biber->get_output_obj; # crossref field is included as the parent is included by being crossrefed >= mincrossrefs times my $cr1 = q| \entry{cr1}{inbook}{} \name{author}{1}{}{% {{hash=121b6dc164b5b619c81c670fbd823f12}{% family={Gullam}, family_i={G\bibinitperiod}, given={Graham}, given_i={G\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=c129df5593fdaa7475548811bfbb227d}{% family={Erbriss}, family_i={E\bibinitperiod}, given={Edgar}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {Grimble}% } \strng{namehash}{121b6dc164b5b619c81c670fbd823f12} \strng{fullhash}{121b6dc164b5b619c81c670fbd823f12} \field{sortinit}{G} \field{sortinithash}{1c854ef9177a91bf894e66485bdbd3ed} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Graphs of the Continent} \strng{crossref}{cr_m} \field{eprintclass}{SOMECLASS} \field{eprinttype}{SomEPrFiX} \field{origyear}{1955} \field{title}{Great and Good Graphs} \field{year}{1974} \endentry |; # crossref field is included as the parent is included by being crossrefed >= mincrossrefs times my $cr2 = q| \entry{cr2}{inbook}{} \name{author}{1}{}{% {{hash=2d51a96bc0a6804995b3a9ff350c3384}{% family={Fumble}, family_i={F\bibinitperiod}, given={Frederick}, given_i={F\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=c129df5593fdaa7475548811bfbb227d}{% family={Erbriss}, family_i={E\bibinitperiod}, given={Edgar}, given_i={E\bibinitperiod}}}% } \list{institution}{1}{% {Institution}% } \list{publisher}{1}{% {Grimble}% } \strng{namehash}{2d51a96bc0a6804995b3a9ff350c3384} \strng{fullhash}{2d51a96bc0a6804995b3a9ff350c3384} \field{sortinit}{F} \field{sortinithash}{c6a7d9913bbd7b20ea954441c0460b78} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Graphs of the Continent} \strng{crossref}{cr_m} \field{origyear}{1943} \field{title}{Fabulous Fourier Forms} \field{year}{1974} \endentry |; # This is included as it is crossrefed >= mincrossrefs times # Notice lack of labelname and hashes because the only name is EDITOR and useeditor is false my $cr_m = q| \entry{cr_m}{book}{} \name{editor}{1}{}{% {{hash=c129df5593fdaa7475548811bfbb227d}{% family={Erbriss}, family_i={E\bibinitperiod}, given={Edgar}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {Grimble}% } \field{sortinit}{G} \field{sortinithash}{1c854ef9177a91bf894e66485bdbd3ed} \field{labeltitlesource}{title} \field{title}{Graphs of the Continent} \field{year}{1974} \endentry |; # crossref field is included as the parent is cited my $cr3 = q| \entry{cr3}{inbook}{} \name{author}{1}{}{% {{hash=2baf676a220704f6914223aefccaaa88}{% family={Aptitude}, family_i={A\bibinitperiod}, given={Arthur}, given_i={A\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=a1f5c22413396d599ec766725b226735}{% family={Monkley}, family_i={M\bibinitperiod}, given={Mark}, given_i={M\bibinitperiod}}}% } \list{publisher}{1}{% {Rancour}% } \strng{namehash}{2baf676a220704f6914223aefccaaa88} \strng{fullhash}{2baf676a220704f6914223aefccaaa88} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Beasts of the Burbling Burns} \strng{crossref}{crt} \field{eprinttype}{sometype} \field{origyear}{1934} \field{title}{Arrangements of All Articles} \field{year}{1996} \endentry |; # cited as normal my $crt = q| \entry{crt}{book}{} \name{editor}{1}{}{% {{hash=a1f5c22413396d599ec766725b226735}{% family={Monkley}, family_i={M\bibinitperiod}, given={Mark}, given_i={M\bibinitperiod}}}% } \list{publisher}{1}{% {Rancour}% } \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labeltitlesource}{title} \field{title}{Beasts of the Burbling Burns} \field{year}{1996} \endentry |; # various event fields inherited correctly my $cr6 = q| \entry{cr6}{inproceedings}{} \name{author}{1}{}{% {{hash=8ab39ee68c55046dc1f05d657fcefed9}{% family={Author}, family_i={A\bibinitperiod}, given={Firstname}, given_i={F\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=344a7f427fb765610ef96eb7bce95257}{% family={Editor}, family_i={E\bibinitperiod}}}% } \list{location}{1}{% {Address}% } \strng{namehash}{8ab39ee68c55046dc1f05d657fcefed9} \strng{fullhash}{8ab39ee68c55046dc1f05d657fcefed9} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Manual booktitle} \field{eventday}{21} \field{eventendday}{24} \field{eventendmonth}{08} \field{eventendyear}{2009} \field{eventmonth}{08} \field{eventtitle}{Title of the event} \field{eventyear}{2009} \field{title}{Title of inproceeding} \field{venue}{Location of event} \field{year}{2009} \field{pages}{123\bibrangedash} \range{pages}{-1} \endentry |; # Special fields inherited correctly my $cr7 = q| \entry{cr7}{inbook}{} \name{author}{1}{}{% {{hash=8ab39ee68c55046dc1f05d657fcefed9}{% family={Author}, family_i={A\bibinitperiod}, given={Firstname}, given_i={F\bibinitperiod}}}% } \name{bookauthor}{1}{}{% {{hash=91a1dd4aeed3c4ec29ca74c4e778be5f}{% family={Bookauthor}, family_i={B\bibinitperiod}, given={Brian}, given_i={B\bibinitperiod}}}% } \list{publisher}{1}{% {Publisher of proceeding}% } \strng{namehash}{8ab39ee68c55046dc1f05d657fcefed9} \strng{fullhash}{8ab39ee68c55046dc1f05d657fcefed9} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booksubtitle}{Book Subtitle} \field{booktitle}{Book Title} \field{booktitleaddon}{Book Titleaddon} \field{title}{Title of Book bit} \field{year}{2010} \field{pages}{123\bibrangedash 126} \range{pages}{4} \verb{verbb} \verb String \endverb \endentry |; # Default inheritance supressed except for specified my $cr8 = q| \entry{cr8}{incollection}{} \name{author}{1}{}{% {{hash=3d449e56eb3ca1ae80dc99a18d689795}{% family={Smith}, family_i={S\bibinitperiod}, given={Firstname}, given_i={F\bibinitperiod}}}% } \strng{namehash}{3d449e56eb3ca1ae80dc99a18d689795} \strng{fullhash}{3d449e56eb3ca1ae80dc99a18d689795} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Book Title} \field{title}{Title of Collection bit} \field{year}{2010} \field{pages}{1\bibrangedash 12} \range{pages}{12} \endentry |; # xref field is included as the parent is included by being crossrefed >= mincrossrefs times my $xr1 = q| \entry{xr1}{inbook}{} \name{author}{1}{}{% {{hash=e0ecc4fc668ee499d1afba44e1ac064d}{% family={Zentrum}, family_i={Z\bibinitperiod}, given={Zoe}, given_i={Z\bibinitperiod}}}% } \strng{namehash}{e0ecc4fc668ee499d1afba44e1ac064d} \strng{fullhash}{e0ecc4fc668ee499d1afba44e1ac064d} \field{sortinit}{Z} \field{sortinithash}{fdda4caaa6b5fa63e0c081dcb159543a} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1921} \field{title}{Moods Mildly Modified} \strng{xref}{xrm} \endentry |; # xref field is included as the parent is included by being crossrefed >= mincrossrefs times my $xr2 = q| \entry{xr2}{inbook}{} \name{author}{1}{}{% {{hash=6afa09374ecfd6b394ce714d2d9709c7}{% family={Instant}, family_i={I\bibinitperiod}, given={Ian}, given_i={I\bibinitperiod}}}% } \strng{namehash}{6afa09374ecfd6b394ce714d2d9709c7} \strng{fullhash}{6afa09374ecfd6b394ce714d2d9709c7} \field{sortinit}{I} \field{sortinithash}{25e99d37ba90f7c4fb20baf4e310faf3} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1926} \field{title}{Migraines Multiplying Madly} \strng{xref}{xrm} \endentry |; # This is included as it is crossrefed >= mincrossrefs times # Notice lack of labelname and hashes because the only name is EDITOR and useeditor is false my $xrm = q| \entry{xrm}{book}{} \name{editor}{1}{}{% {{hash=809950f9b59ae207092b909a19dcb27b}{% family={Prendergast}, family_i={P\bibinitperiod}, given={Peter}, given_i={P\bibinitperiod}}}% } \list{publisher}{1}{% {Mainstream}% } \field{sortinit}{C} \field{sortinithash}{59f25d509f3381b07695554a9f35ecb2} \field{labeltitlesource}{title} \field{title}{Calligraphy, Calisthenics, Culture} \field{year}{1970} \endentry |; # xref field is included as the parent is cited my $xr3 = q| \entry{xr3}{inbook}{} \name{author}{1}{}{% {{hash=9788055665b9bb4b37c776c3f6b74f16}{% family={Normal}, family_i={N\bibinitperiod}, given={Norman}, given_i={N\bibinitperiod}}}% } \strng{namehash}{9788055665b9bb4b37c776c3f6b74f16} \strng{fullhash}{9788055665b9bb4b37c776c3f6b74f16} \field{sortinit}{N} \field{sortinithash}{925374ca63e7594de7fafdb83e64d41d} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1923} \field{title}{Russian Regalia Revisited} \strng{xref}{xrt} \endentry |; # cited as normal my $xrt = q| \entry{xrt}{book}{} \name{editor}{1}{}{% {{hash=bf7d6b02f3e073913e5bfe5059508dd5}{% family={Lunders}, family_i={L\bibinitperiod}, given={Lucy}, given_i={L\bibinitperiod}}}% } \list{publisher}{1}{% {Middling}% } \field{sortinit}{K} \field{sortinithash}{a7d5b3aec5a0890aae7baf85a209abfc} \field{labeltitlesource}{title} \field{title}{Kings, Cork and Calculation} \field{year}{1977} \endentry |; # No crossref field as parent is not cited (mincrossrefs < 2) my $cr4 = q| \entry{cr4}{inbook}{} \name{author}{1}{}{% {{hash=50ef7fd3a1be33bccc5de2768b013836}{% family={Mumble}, family_i={M\bibinitperiod}, given={Morris}, given_i={M\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=6ea89bd4958743a20b70fe17647d6af5}{% family={Jermain}, family_i={J\bibinitperiod}, given={Jeremy}, given_i={J\bibinitperiod}}}% } \list{publisher}{1}{% {Pillsbury}% } \strng{namehash}{50ef7fd3a1be33bccc5de2768b013836} \strng{fullhash}{50ef7fd3a1be33bccc5de2768b013836} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Vanquished, Victor, Vandal} \field{origyear}{1911} \field{title}{Enterprising Entities} \field{year}{1945} \endentry |; # No crossref field as parent is not cited (mincrossrefs < 2) my $xr4 = q| \entry{xr4}{inbook}{} \name{author}{1}{}{% {{hash=7804ffef086c0c4686c235807f5cb502}{% family={Mistrel}, family_i={M\bibinitperiod}, given={Megan}, given_i={M\bibinitperiod}}}% } \strng{namehash}{7804ffef086c0c4686c235807f5cb502} \strng{fullhash}{7804ffef086c0c4686c235807f5cb502} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1933} \field{title}{Lumbering Lunatics} \endentry |; # Missing keys in xref/crossref should be deleted during datasource parse # So these two should have no xref/crossref data in them my $mxr = q| \entry{mxr}{inbook}{} \name{author}{1}{}{% {{hash=7804ffef086c0c4686c235807f5cb502}{% family={Mistrel}, family_i={M\bibinitperiod}, given={Megan}, given_i={M\bibinitperiod}}}% } \strng{namehash}{7804ffef086c0c4686c235807f5cb502} \strng{fullhash}{7804ffef086c0c4686c235807f5cb502} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1933} \field{title}{Lumbering Lunatics} \endentry |; my $mcr = q| \entry{mcr}{inbook}{} \name{author}{1}{}{% {{hash=7804ffef086c0c4686c235807f5cb502}{% family={Mistrel}, family_i={M\bibinitperiod}, given={Megan}, given_i={M\bibinitperiod}}}% } \strng{namehash}{7804ffef086c0c4686c235807f5cb502} \strng{fullhash}{7804ffef086c0c4686c235807f5cb502} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{origyear}{1933} \field{title}{Lumbering Lunatics} \endentry |; my $ccr1 = q| \entry{ccr2}{book}{} \name{author}{1}{}{% {{hash=6268941b408d3263bddb208a54899ea9}{% family={Various}, family_i={V\bibinitperiod}, given={Vince}, given_i={V\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=cfee758a1c82df2e26af1985e061bb0a}{% family={Editor}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \strng{namehash}{6268941b408d3263bddb208a54899ea9} \strng{fullhash}{6268941b408d3263bddb208a54899ea9} \field{sortinit}{V} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \field{labeltitlesource}{title} \strng{crossref}{ccr1} \field{title}{Misc etc.} \field{year}{1923} \endentry |; my $ccr2 = q| \entry{ccr3}{inbook}{} \name{bookauthor}{1}{}{% {{hash=6268941b408d3263bddb208a54899ea9}{% family={Various}, family_i={V\bibinitperiod}, given={Vince}, given_i={V\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=cfee758a1c82df2e26af1985e061bb0a}{% family={Editor}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \field{sortinit}{P} \field{sortinithash}{c0a4896d0e424f9ca4d7f14f2b3428e7} \field{labeltitlesource}{title} \field{booktitle}{Misc etc.} \strng{crossref}{ccr2} \field{title}{Perhaps, Perchance, Possibilities?} \field{year}{1911} \endentry |; # This is strange in what it gets from where but it shows information being inherited from two # sources my $ccr3 = q| \entry{ccr4}{inbook}{} \name{bookauthor}{1}{}{% {{hash=6268941b408d3263bddb208a54899ea9}{Various}{V\bibinitperiod}{Vince}{V\bibinitperiod}{}{}{}{}}% } \name{editor}{1}{}{% {{hash=cfee758a1c82df2e26af1985e061bb0a}{Editor}{E\bibinitperiod}{Edward}{E\bibinitperiod}{}{}{}{}}% } \field{sortinit}{V} \field{sortinithash}{4125bb4c3a0eb3eaee3ea6da32eb70c8} \field{labeltitlesource}{title} \field{booktitle}{Misc etc.} \field{title}{Stuff Concerning Varia} \field{year}{1911} \endentry |; eq_or_diff($out->get_output_entry('cr1', $main0), $cr1, 'crossref test 1'); eq_or_diff($out->get_output_entry('cr2', $main0), $cr2, 'crossref test 2'); eq_or_diff($out->get_output_entry('cr_m', $main0), $cr_m, 'crossref test 3'); eq_or_diff($out->get_output_entry('cr3', $main0), $cr3, 'crossref test 4'); eq_or_diff($out->get_output_entry('crt', $main0), $crt, 'crossref test 5'); eq_or_diff($out->get_output_entry('cr4', $main0), $cr4, 'crossref test 6'); eq_or_diff($section0->has_citekey('crn'), 0,'crossref test 7'); eq_or_diff($out->get_output_entry('cr6', $main0), $cr6, 'crossref test (inheritance) 8'); eq_or_diff($out->get_output_entry('cr7', $main0), $cr7, 'crossref test (inheritance) 9'); eq_or_diff($out->get_output_entry('cr8', $main0), $cr8, 'crossref test (inheritance) 10'); eq_or_diff($out->get_output_entry('xr1', $main0), $xr1, 'xref test 1'); eq_or_diff($out->get_output_entry('xr2', $main0), $xr2, 'xref test 2'); eq_or_diff($out->get_output_entry('xrm', $main0), $xrm, 'xref test 3'); eq_or_diff($out->get_output_entry('xr3', $main0), $xr3, 'xref test 4'); eq_or_diff($out->get_output_entry('xrt', $main0), $xrt, 'xref test 5'); eq_or_diff($out->get_output_entry('xr4', $main0), $xr4, 'xref test 6'); eq_or_diff($section0->has_citekey('xrn'), 0,'xref test 7'); eq_or_diff($out->get_output_entry('mxr', $main0), $mxr, 'missing xref test'); eq_or_diff($out->get_output_entry('mcr', $main0), $mcr, 'missing crossef test'); eq_or_diff($section1->has_citekey('crn'), 0,'mincrossrefs reset between sections'); eq_or_diff($out->get_output_entry('ccr2', $main0), $ccr1, 'cascading crossref test 1'); eq_or_diff($out->get_output_entry('ccr3', $main0), $ccr2, 'cascading crossref test 2'); chomp $stderr; eq_or_diff($stderr, "ERROR - Circular inheritance between 'circ1'<->'circ2'", 'Cyclic crossref error check'); eq_or_diff($section0->has_citekey('r1'), 1,'Recursive crossref test 1'); ok(defined($section0->bibentry('r1')),'Recursive crossref test 2'); eq_or_diff($section0->has_citekey('r2'), 0,'Recursive crossref test 3'); ok(defined($section0->bibentry('r2')),'Recursive crossref test 4'); eq_or_diff($section0->has_citekey('r3'), 0,'Recursive crossref test 5'); ok(defined($section0->bibentry('r3')),'Recursive crossref test 6'); eq_or_diff($section0->has_citekey('r4'), 0,'Recursive crossref test 7'); ok(defined($section0->bibentry('r4')),'Recursive crossref test 8'); biblatex-biber-2.4/t/dm-constraints.t000555000765000024 1420612667073765 20123 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 16; use Biber; use Biber::Output::bbl; use Biber::Utils; use Log::Log4perl; chdir("t/tdata"); use IPC::Run3; use File::Spec; use File::Which; my $perl = which('perl'); my $stdout; # This test will complain on the test linux servers as /usr/local/perl/bin/perl will not be # returned by "which perl" and so the following workaround will fail to find the ISBN messaged file. # Doesn't matter much but just in case when running "Build test" on the current test VMs, worth # remembering. # This is needed so that this env var is set to the runtime location of the message file and not # the test runtime as this is altered by Module::Build which sets up $INC{} differently run3 [ $perl, '-MBusiness::ISBN', '-e', 'print $INC{"Business/ISBN.pm"}' ], \undef, \$stdout, \undef; my ($vol, $dir, undef) = File::Spec->splitpath($stdout); $ENV{ISBN_RANGE_MESSAGE} = File::Spec->catpath($vol, "$dir/ISBN/", 'RangeMessage.xml'); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('dm-constraints.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('validate_datamodel', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; my $c1 = [ "Datamodel: Entry 'c1' (dm-constraints.bib): Invalid entry type 'badtype' - defaulting to 'misc'" ]; my $c2 = [ "Datamodel: Entry 'c2' (dm-constraints.bib): Field 'badfield' invalid in data model - ignoring", "Datamodel: Entry 'c2' (dm-constraints.bib): Invalid field 'journaltitle' for entrytype 'eta'", "Datamodel: Entry 'c2' (dm-constraints.bib): Missing mandatory field 'author'" ]; my $c3 = [ "Datamodel: Entry 'c3' (dm-constraints.bib): Invalid format (integer) of field 'month' - ignoring field", "Datamodel: Entry 'c3' (dm-constraints.bib): Invalid value (pattern match fails) for field 'gender'" ]; my $c4 = [ "Datamodel: Entry 'c4' (dm-constraints.bib): Invalid value of field 'month' must be '<=12' - ignoring field", "Datamodel: Entry 'c4' (dm-constraints.bib): Invalid value of field 'field1' must be '>=5' - ignoring field" ]; # There would also have been a date+year constraint violation in the next test if # it weren't for the fact that the date processing in bibtex.pm already deals with this # and removed the year field my $c5 = [ "Overwriting field 'year' with year value from field 'date' for entry 'c5'", "Datamodel: Entry 'c5' (dm-constraints.bib): Constraint violation - none of fields (field5, field6) must exist when all of fields (field2, field3, field4) exist. Ignoring them." ]; my $c6 = [ "Datamodel: Entry 'c6' (dm-constraints.bib): Constraint violation - one of fields (field7, field8) must exist when all of fields (field1, field2) exist", "Datamodel: Entry 'c6' (dm-constraints.bib): Constraint violation - all of fields (field9, field10) must exist when all of fields (field5, field6) exist" ]; my $c7 = [ "Datamodel: Entry 'c7' (dm-constraints.bib): Missing mandatory field - one of 'fielda, fieldb' must be defined", "Datamodel: Entry 'c7' (dm-constraints.bib): Constraint violation - none of fields (field7) must exist when one of fields (field5, field6) exist. Ignoring them."]; my $c8 = [ "Datamodel: Entry 'c8' (dm-constraints.bib): Constraint violation - none of fields (field4) must exist when none of fields (field2, field3) exist. Ignoring them.", "Datamodel: Entry 'c8' (dm-constraints.bib): Constraint violation - one of fields (field10, field11) must exist when none of fields (field8, field9) exist", "Datamodel: Entry 'c8' (dm-constraints.bib): Constraint violation - all of fields (field12, field13) must exist when none of fields (field6) exist" ]; my $c10 = [ "Datamodel: Entry 'c10' (dm-constraints.bib): Invalid ISBN in value of field 'isbn'", "Datamodel: Entry 'c10' (dm-constraints.bib): Invalid ISSN in value of field 'issn'" ]; is_deeply($bibentries->entry('c1')->get_field('warnings'), $c1, 'Constraints test 1' ); is_deeply($bibentries->entry('c2')->get_field('warnings'), $c2, 'Constraints test 2' ); is_deeply($bibentries->entry('c3')->get_field('warnings'), $c3, 'Constraints test 3a' ); ok(is_undef($bibentries->entry('c3')->get_field('month')), 'Constraints test 3b' ); is_deeply($bibentries->entry('c4')->get_field('warnings'), $c4, 'Constraints test 4a' ); ok(is_undef($bibentries->entry('c4')->get_field('month')), 'Constraints test 4b' ); is_deeply($bibentries->entry('c5')->get_field('warnings'), $c5, 'Constraints test 5a' ); ok(is_undef($bibentries->entry('c5')->get_field('field5')), 'Constraints test 5b' ); ok(is_undef($bibentries->entry('c5')->get_field('field6')), 'Constraints test 5c' ); is_deeply($bibentries->entry('c6')->get_field('warnings'), $c6, 'Constraints test 6' ); is_deeply($bibentries->entry('c7')->get_field('warnings'), $c7, 'Constraints test 7a' ); ok(is_undef($bibentries->entry('c7')->get_field('field7')), 'Constraints test 7b' ); is_deeply($bibentries->entry('c8')->get_field('warnings'), $c8, 'Constraints test 8a' ); ok(is_undef($bibentries->entry('c8')->get_field('field4')), 'Constraints test 8b' ); ok(is_undef($bibentries->entry('c9')->get_field('warnings')), 'Constraints test 9' ); is_deeply($bibentries->entry('c10')->get_field('warnings'), $c10, 'Constraints test 10' ); biblatex-biber-2.4/t/dm-dateformats.t000555000765000024 4167212667073765 20074 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 33; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Biber::Utils; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('dm-dateformats.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('validate_datamodel', 1); # Biblatex options Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $l1 = [ "Datamodel: Entry 'L1' (dm-dateformats.bib): Invalid format '1985-1030' of date field 'origdate' - ignoring", "Datamodel: Entry 'L1' (dm-dateformats.bib): Invalid format '1.5.1998' of date field 'urldate' - ignoring", "Datamodel: Entry 'L1' (dm-dateformats.bib): Invalid date value 'YYYY/14/DD' - ignoring its components" ]; my $l2 = [ "Datamodel: Entry 'L2' (dm-dateformats.bib): Invalid format '1995-1230' of date field 'origdate' - ignoring" ]; my $l3 = [ "Datamodel: Entry 'L3' (dm-dateformats.bib): Invalid format '1.5.1988' of date field 'urldate' - ignoring" ]; my $l4 = [ "Datamodel: Entry 'L4' (dm-dateformats.bib): Invalid format '1995-1-04' of date field 'date' - ignoring", "Datamodel: Entry 'L4' (dm-dateformats.bib): Missing mandatory field - one of 'date, year' must be defined" ]; my $l5 = [ "Datamodel: Entry 'L5' (dm-dateformats.bib): Invalid format '1995-10-4' of date field 'date' - ignoring", "Datamodel: Entry 'L5' (dm-dateformats.bib): Missing mandatory field - one of 'date, year' must be defined" ]; my $l6 = [ "Datamodel: Entry 'L6' (dm-dateformats.bib): Invalid date value '1996/13/03' - ignoring its components" ]; my $l7 = [ "Datamodel: Entry 'L7' (dm-dateformats.bib): Invalid date value '1996/10/35' - ignoring its components" ]; my $l11 = [ "Overwriting field 'year' with year value from field 'date' for entry 'L11'"]; my $l12 = [ "Overwriting field 'month' with month value from field 'date' for entry 'L12'" ]; my $l13c = q| \entry{L13}{book}{} \name{author}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelyear}{1996\bibdatedash } \field{labelmonth}{01} \field{labelday}{01} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{01} \field{endyear}{} \field{month}{01} \field{title}{Title 2} \field{year}{1996} \endentry |; my $l14 = q| \entry{L14}{book}{} \name{author}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{3} \field{labelyear}{1996} \field{labelmonth}{12} \field{labelday}{10\bibdatedash 12} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{10} \field{endday}{12} \field{endmonth}{12} \field{endyear}{1996} \field{month}{12} \field{title}{Title 2} \field{year}{1996} \endentry |; my $l15 = q| \entry{L15}{book}{} \name{author}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{4} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Title 2} \warn{\item Datamodel: Entry 'L15' (dm-dateformats.bib): Missing mandatory field - one of 'date, year' must be defined} \endentry |; my $l16 = q| \entry{L16}{proceedings}{} \name{editor}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{5} \field{labelyear}{1996} \field{labelmonth}{01} \field{labelday}{01} \field{datelabelsource}{event} \field{labelnamesource}{editor} \field{labeltitlesource}{title} \field{eventday}{01} \field{eventmonth}{01} \field{eventyear}{1996} \field{title}{Title 2} \warn{\item Datamodel: Entry 'L16' (dm-dateformats.bib): Missing mandatory field - one of 'date, year' must be defined} \endentry |; my $l17 = q| \entry{L17}{proceedings}{} \name{editor}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{4} \field{labelyear}{1996} \field{labelmonth}{12} \field{labelday}{10\bibdatedash 12} \field{datelabelsource}{} \field{labelnamesource}{editor} \field{labeltitlesource}{title} \field{day}{10} \field{endday}{12} \field{endmonth}{12} \field{endyear}{1996} \field{eventday}{10} \field{eventendday}{12} \field{eventendmonth}{12} \field{eventendyear}{2004} \field{eventmonth}{12} \field{eventyear}{1998} \field{month}{12} \field{origday}{10} \field{origendday}{12} \field{origendmonth}{12} \field{origendyear}{1998} \field{origmonth}{12} \field{origyear}{1998} \field{pubstate}{inpress} \field{title}{Title 2} \field{year}{1996} \endentry |; my $l17c = q| \entry{L17}{proceedings}{} \name{editor}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelyear}{1998} \field{labelmonth}{12} \field{labelday}{10\bibdatedash 12} \field{datelabelsource}{orig} \field{labelnamesource}{editor} \field{labeltitlesource}{title} \field{day}{10} \field{endday}{12} \field{endmonth}{12} \field{endyear}{1996} \field{eventday}{10} \field{eventendday}{12} \field{eventendmonth}{12} \field{eventendyear}{2004} \field{eventmonth}{12} \field{eventyear}{1998} \field{month}{12} \field{origday}{10} \field{origendday}{12} \field{origendmonth}{12} \field{origendyear}{1998} \field{origmonth}{12} \field{origyear}{1998} \field{pubstate}{inpress} \field{title}{Title 2} \field{year}{1996} \endentry |; my $l17e = q| \entry{L17}{proceedings}{} \name{editor}{2}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% {{hash=df9bf04cd41245e6d23ad7543e7fd90d}{% family={Abrahams}, family_i={A\bibinitperiod}, given={Albert}, given_i={A\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{8c77336299b25bdada7bf8038f46722f} \strng{fullhash}{8c77336299b25bdada7bf8038f46722f} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelyear}{1998\bibdatedash 2004} \field{labelmonth}{12} \field{labelday}{10\bibdatedash 12} \field{datelabelsource}{event} \field{labelnamesource}{editor} \field{labeltitlesource}{title} \field{day}{10} \field{endday}{12} \field{endmonth}{12} \field{endyear}{1996} \field{eventday}{10} \field{eventendday}{12} \field{eventendmonth}{12} \field{eventendyear}{2004} \field{eventmonth}{12} \field{eventyear}{1998} \field{month}{12} \field{origday}{10} \field{origendday}{12} \field{origendmonth}{12} \field{origendyear}{1998} \field{origmonth}{12} \field{origyear}{1998} \field{pubstate}{inpress} \field{title}{Title 2} \field{year}{1996} \endentry |; is_deeply($bibentries->entry('L1')->get_field('warnings'), $l1, 'Date values test 1' ) ; ok(is_undef($bibentries->entry('L1')->get_field('origyear')), 'Date values test 1a - ORIGYEAR undef since ORIGDATE is bad' ) ; ok(is_undef($bibentries->entry('L1')->get_field('urlyear')), 'Date values test 1b - URLYEAR undef since URLDATE is bad' ) ; ok(is_undef($bibentries->entry('L1')->get_field('month')), 'Date values test 1c - MONTH undef since not integer' ) ; is_deeply($bibentries->entry('L2')->get_field('warnings'), $l2, 'Date values test 2' ) ; is_deeply($bibentries->entry('L3')->get_field('warnings'), $l3, 'Date values test 3' ) ; is_deeply($bibentries->entry('L4')->get_field('warnings'), $l4, 'Date values test 4' ) ; is_deeply($bibentries->entry('L5')->get_field('warnings'), $l5, 'Date values test 5' ) ; is_deeply($bibentries->entry('L6')->get_field('warnings'), $l6, 'Date values test 6' ) ; is_deeply($bibentries->entry('L7')->get_field('warnings'), $l7, 'Date values test 7' ) ; eq_or_diff($bibentries->entry('L8')->get_field('month'), '01', 'Date values test 8b - MONTH hacked to integer' ) ; ok(is_undef($bibentries->entry('L9')->get_field('warnings')), 'Date values test 9' ) ; ok(is_undef($bibentries->entry('L10')->get_field('warnings')), 'Date values test 10' ) ; is_deeply($bibentries->entry('L11')->get_field('warnings'), $l11, 'Date values test 11' ); eq_or_diff($bibentries->entry('L11')->get_field('year'), '1996', 'Date values test 11a - DATE overrides YEAR' ) ; is_deeply($bibentries->entry('L12')->get_field('warnings'), $l12, 'Date values test 12' ); eq_or_diff($bibentries->entry('L12')->get_field('month'), '01', 'Date values test 12a - DATE overrides MONTH' ) ; # it means something if endyear is defined but null ("1935-") ok(is_def_and_null($bibentries->entry('L13')->get_field('endyear')), 'Date values test 13 - range with no end' ) ; ok(is_undef($bibentries->entry('L13')->get_field('endmonth')), 'Date values test 13a - ENDMONTH undef for open-ended range' ) ; ok(is_undef($bibentries->entry('L13')->get_field('endday')), 'Date values test 13b - ENDDAY undef for open-ended range' ) ; eq_or_diff( $out->get_output_entry('L13', $main), $l13c, 'Date values test 13c - labelyear open-ended range' ) ; eq_or_diff( $out->get_output_entry('L14', $main), $l14, 'Date values test 14 - labelyear same as YEAR when ENDYEAR == YEAR') ; eq_or_diff( $out->get_output_entry('L15', $main), $l15, 'Date values test 15 - labelyear should be undef, no DATE or YEAR') ; # reset options and regenerate information Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'}, {content => 'eventdate', type => 'field'}, {content => 'origdate', type => 'field'} ]); $bibentries->del_entry('L17'); $bibentries->del_entry('L16'); $biber->prepare; $out = $biber->get_output_obj; eq_or_diff($bibentries->entry('L16')->get_labeldate_info->{field}{year}, 'eventyear', 'Date values test 16 - labelyear = EVENTYEAR when YEAR is (mistakenly) missing' ) ; eq_or_diff($out->get_output_entry('L16', $main), $l16, 'Date values test 16a - labelyear = EVENTYEAR value when YEAR is (mistakenly) missing' ); eq_or_diff($bibentries->entry('L17')->get_labeldate_info->{field}{year}, 'year', 'Date values test 17 - labelyear = YEAR' ) ; eq_or_diff($out->get_output_entry('L17', $main), $l17, 'Date values test 17a - labelyear = YEAR value when ENDYEAR is the same and ORIGYEAR is also present' ) ; # reset options and regenerate information Biber::Config->setblxoption('labeldatespec', [ {content => 'origdate', type => 'field'}, {content => 'date', type => 'field'}, {content => 'eventdate', type => 'field'} ]); $bibentries->del_entry('L17'); $biber->prepare; $out = $biber->get_output_obj; eq_or_diff($bibentries->entry('L17')->get_labeldate_info->{field}{year}, 'origyear', 'Date values test 17b - labelyear = ORIGYEAR' ) ; eq_or_diff($out->get_output_entry('L17', $main), $l17c, 'Date values test 17c - labelyear = ORIGYEAR value when ENDORIGYEAR is the same and YEAR is also present' ) ; # reset options and regenerate information Biber::Config->setblxoption('labeldatespec', [ {content => 'eventdate', type => 'field'}, {content => 'date', type => 'field'}, {content => 'origdate', type => 'field'} ], 'ENTRYTYPE', 'proceedings'); $bibentries->del_entry('L17'); $biber->prepare; $out = $biber->get_output_obj; eq_or_diff($bibentries->entry('L17')->get_labeldate_info->{field}{year}, 'eventyear', 'Date values test 17d - labelyear = EVENTYEAR' ) ; eq_or_diff($bibentries->entry('L17')->get_labeldate_info->{field}{source}, 'event', 'Date values test 17d - source = event' ) ; eq_or_diff($out->get_output_entry('L17', $main), $l17e, 'Date values test 17e - labelyear = ORIGYEAR-ORIGENDYEAR' ) ; # reset options and regenerate information Biber::Config->setblxoption('labeldatespec', [ {content => 'pubstate', type => 'field'} ], 'ENTRYTYPE', 'proceedings'); $bibentries->del_entry('L17'); $biber->prepare; $out = $biber->get_output_obj; eq_or_diff($bibentries->entry('L17')->get_labeldate_info->{field}{source}, 'pubstate', 'Source is non-date field' ); biblatex-biber-2.4/t/encoding.t000555000765000024 2752112667073765 16750 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 10; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::test; use Encode; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); my $encode1 = q| \entry{testŠ}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Šome title} \field{year}{1999} \endentry |; my $encode2 = q| \entry{test1}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Söme title} \field{year}{1999} \endentry |; my $encode3 = q| \entry{test1}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Żome title} \field{year}{1999} \endentry |; my $encode5 = q| \entry{test}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{à titlé} \field{year}{1999} \endentry |; my $encode6 = q| \entry{test}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{↑\`{a} titl\'{e}} \field{year}{1999} \endentry |; my $encode7 = q| \entry{test}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=06a47edae2e847800cfd78323a0e6be8}{% family={Encalcer}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{06a47edae2e847800cfd78323a0e6be8} \strng{fullhash}{06a47edae2e847800cfd78323a0e6be8} \field{labelalpha}{Enc99} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1999} \field{datelabelsource}{} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{{$\uparrow$}\`{a} titl\'{e}} \field{year}{1999} \endentry |; my $outvar; my $output; # Latin9 .bib -> UTF-8 .bbl $biber->parse_ctrlfile('encoding1.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'latin9'); Biber::Config->setoption('output_encoding', 'UTF-8'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode1), 'latin9 .bib -> UTF-8 .bbl'); # UTF-8 .bib -> UTF-8 .bbl $biber->parse_ctrlfile('encoding2.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'UTF-8'); Biber::Config->setoption('output_encoding', 'UTF-8'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode1), 'UTF-8 .bib -> UTF-8 .bbl'); # UTF-8 .bib -> latin1 .bbl $biber->parse_ctrlfile('encoding5.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'UTF-8'); Biber::Config->setoption('output_encoding', 'latin1'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode5), 'UTF-8 .bib -> latin1 .bbl'); # UTF-8 .bib -> UTF-8 with --output_safechars $biber->parse_ctrlfile('encoding6.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'UTF-8'); Biber::Config->setoption('output_encoding', 'UTF-8'); Biber::Config->setoption('output_safechars', 1); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode6), 'UTF-8 .bib -> UTF-8 .bbl, safechars'); # UTF-8 .bib -> UTF-8 with --output_safechars and --bblcharsset=full $biber->parse_ctrlfile('encoding6.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'UTF-8'); Biber::Config->setoption('output_encoding', 'UTF-8'); Biber::Config->setoption('output_safechars', 1); Biber::LaTeX::Recode->init_sets('full', 'full'); # Need to do this to reset # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode7), 'UTF-8 .bib -> UTF-8 .bbl, output_safecharsset=full'); # UTF-8 .bib -> Latin9 .bbl $biber->parse_ctrlfile('encoding2.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('output_safechars', 0); Biber::Config->setoption('input_encoding', 'UTF-8'); Biber::Config->setoption('output_encoding', 'latin9'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode1), 'UTF-8 .bib -> latin9 .bbl'); # latin1 .bib -> cp1252 .bbl $biber->parse_ctrlfile('encoding3.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'latin1'); Biber::Config->setoption('output_encoding', 'cp1252'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode2), 'latin1 .bib -> CP1252 .bbl'); # latin2 .bib -> latin3 .bbl $biber->parse_ctrlfile('encoding4.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'latin2'); Biber::Config->setoption('output_encoding', 'latin3'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode3), 'latin2 .bib -> latin3 .bbl'); # latin2 .bib -> latin1 .bbl - should fail $biber->parse_ctrlfile('encoding4.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'latin2'); Biber::Config->setoption('output_encoding', 'latin1'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target # This test will generate encoding errors so redirect STDERR until it's done open OLDERR, '>&', \*STDERR; open STDERR, '>', '/dev/null'; $output->output; open STDERR, '>&', \*OLDERR; isnt($outvar, encode(Biber::Config->getoption('output_encoding'), $encode3), 'latin2 .bib -> latin1 .bbl failure'); # Custom encoding alias # latin1 .bib -> applemacce (MacRoman) .bbl $biber->parse_ctrlfile('encoding3.bcf'); $biber->set_output_obj(Biber::Output::test->new()); # Biber options Biber::Config->setoption('input_encoding', 'latin1'); Biber::Config->setoption('output_encoding', 'applemacce'); # Now generate the information $biber->prepare; # Get reference to output object $output = $biber->get_output_obj; $output->set_output_target_file(\$outvar); # Write the output to the target $output->output; eq_or_diff($outvar, encode(Biber::Config->getoption('output_encoding'), $encode2), 'latin1 .bib -> applemacce (custom alias) .bbl'); biblatex-biber-2.4/t/extratitle.t000555000765000024 537012667073765 17325 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 14; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('extratitle.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('maxbibnames', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; # Don't forget that the extratitle data is inserted after sorting eq_or_diff($main->get_extratitledata('L1'), '1', 'Same name, same title - 1'); eq_or_diff($main->get_extratitledata('L2'), '2', 'Same name, same title - 2'); eq_or_diff($main->get_extratitledata('L3'), '1', 'No name, same title - 1'); eq_or_diff($main->get_extratitledata('L4'), '2', 'No name, same title - 2'); ok(is_undef($main->get_extratitledata('L5')), 'No name, same title as with name - 1'); eq_or_diff($main->get_extratitledata('L6'), '1', 'No name, same shorttitle/title - 1'); eq_or_diff($main->get_extratitledata('L7'), '2', 'No name, same shorttitle/title - 2'); ok(is_undef($bibentries->entry('L8')->get_field('singletitle')), 'Singletitle test - 1'); ok(is_undef($bibentries->entry('L9')->get_field('singletitle')), 'Singletitle test - 2'); eq_or_diff($bibentries->entry('L10')->get_field('singletitle'), '1', 'Singletitle test - 3'); eq_or_diff($bibentries->entry('L11')->get_field('singletitle'), '1', 'Singletitle test - 4'); ok(is_undef($bibentries->entry('L12')->get_field('singletitle')), 'Singletitle test - 5'); ok(is_undef($bibentries->entry('L1')->get_field('singletitle')), 'Singletitle test - 6'); eq_or_diff($bibentries->entry('L5')->get_field('singletitle'), '1', 'Singletitle test - 7'); biblatex-biber-2.4/t/extratitleyear.t000555000765000024 416212667073765 20204 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 8; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('extratitleyear.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; # Don't forget that the extratitleyear data is inserted after sorting eq_or_diff($main->get_extratitleyeardata('L1'), '1', 'Same title, same year'); eq_or_diff($main->get_extratitleyeardata('L2'), '2', 'Same title, same year'); ok(is_undef($main->get_extratitledata('L3')), 'No title, same year'); ok(is_undef($main->get_extratitleyeardata('L4')), 'Same title, different year'); ok(is_undef($main->get_extratitleyeardata('L5')), 'Different labeltitle, same year'); ok(is_undef($main->get_extratitleyeardata('LY1')), 'Different years due to range ends - 1'); ok(is_undef($main->get_extratitleyeardata('LY2')), 'Different years due to range ends - 1'); ok(is_undef($main->get_extratitleyeardata('LY3')), 'Different years due to range ends - 1'); biblatex-biber-2.4/t/extrayear.t000555000765000024 713012667073765 17140 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 22; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('extrayear.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('maxbibnames', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; eq_or_diff($main->get_extrayeardata('L1'), '1', 'Entry L1 - one name, first in 1995'); eq_or_diff($main->get_extrayeardata('L2'), '2', 'Entry L2 - one name, second in 1995'); eq_or_diff($main->get_extrayeardata('L3'), '3', 'Entry L3 - one name, third in 1995'); eq_or_diff($main->get_extrayeardata('L4'), '1', 'Entry L4 - two names, first in 1995'); eq_or_diff($main->get_extrayeardata('L5'), '2', 'Entry L5 - two names, second in 1995'); eq_or_diff($main->get_extrayeardata('L6'), '1', 'Entry L6 - two names, first in 1996'); eq_or_diff($main->get_extrayeardata('L7'), '2', 'Entry L7 - two names, second in 1996'); eq_or_diff($main->get_extrayeardata('nodate1'), '1', 'Same name, no year 1'); eq_or_diff($main->get_extrayeardata('nodate2'), '2', 'Same name, no year 2'); ok(is_undef($main->get_extrayeardata('L8')), 'Entry L8 - one name, only in year'); ok(is_undef($main->get_extrayeardata('L9')), 'Entry L9 - No name, same year as another with no name'); ok(is_undef($main->get_extrayeardata('L10')), 'Entry L10 - No name, same year as another with no name'); eq_or_diff($main->get_extrayeardata('companion1'), '1', 'Entry companion1 - names truncated to same as another entry in same year'); eq_or_diff($main->get_extrayeardata('companion2'), '2', 'Entry companion2 - names truncated to same as another entry in same year'); ok(is_undef($main->get_extrayeardata('companion3')), 'Entry companion3 - one name, same year as truncated names'); eq_or_diff($main->get_extrayeardata('vangennep'), '2', 'Entry vangennep - useprefix does makes it different'); eq_or_diff($main->get_extrayeardata('gennep'), '1', 'Entry gennep - different from prefix name'); ok(is_undef($main->get_extrayeardata('LY1')), 'Date range means no extrayear - 1'); ok(is_undef($main->get_extrayeardata('LY2')), 'Date range means no extrayear - 2'); ok(is_undef($main->get_extrayeardata('LY3')), 'Date range means no extrayear - 3'); # Test for labelyearspec literal string eq_or_diff($bibentries->entry('nodate1')->get_field('labelyear'), 'nodate', 'Labelyear string - 1'); eq_or_diff($bibentries->entry('nodate2')->get_field('labelyear'), 'nodate', 'Labelyear string - 2'); biblatex-biber-2.4/t/full.t000555000765000024 225712667073765 16103 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More; if ($ENV{BIBER_DEV_TESTS}) { plan tests => 5; } else { plan skip_all => 'BIBER_DEV_TESTS not set'; } use IPC::Run3; use File::Temp; use File::Compare; use File::Which; my $perl = which('perl'); my $tmpfile = File::Temp->new(); #my $tmpfile = File::Temp->new(UNLINK => 0); my $bbl = $tmpfile->filename; #print "File: $bbl\n"; my $stdout; run3 [ $perl, 'bin/biber', '--noconf', '--nolog', "--output-file=$bbl", 't/tdata/full.bcf' ], \undef, \$stdout, \undef; is($? >> 8, 0, 'Full test has zero exit status'); ok(compare($bbl, 't/tdata/full1.bbl') == 0, 'Testing lossort case and sortinit for macros'); like($stdout, qr|WARN - Duplicate entry key: 'F1' in file 't/tdata/full\.bib', skipping \.\.\.|ms, 'Testing duplicate/case key warnings - 1'); like($stdout, qr|WARN - Possible typo \(case mismatch\) between datasource keys: 'f1' and 'F1' in file 't/tdata/full\.bib'|ms, 'Testing duplicate/case key warnings - 2'); like($stdout, qr|WARN - Possible typo \(case mismatch\) between citation and datasource keys: 'C1' and 'c1' in file 't/tdata/full\.bib'|ms, 'Testing duplicate/case key warnings - 3'); biblatex-biber-2.4/t/labelalpha.t000555000765000024 6542512667073765 17254 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 119; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('labelalpha.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Biblatex options Biber::Config->setblxoption('maxalphanames', 1); Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('labeldate', undef); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('prefix1')->get_field('sortlabelalpha'), 'vVaa99', 'Default prefix settings entry prefix1 labelalpha'); eq_or_diff($bibentries->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=1 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main->get_extraalphadata('l1')), 'maxalphanames=1 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries->entry('L2')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main->get_extraalphadata('L2'), '1', 'maxalphanames=1 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries->entry('L3')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main->get_extraalphadata('L3'), '2', 'maxalphanames=1 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries->entry('L4')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L4 labelalpha'); eq_or_diff($main->get_extraalphadata('L4'), '3', 'maxalphanames=1 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries->entry('L5')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L5 labelalpha'); eq_or_diff($main->get_extraalphadata('L5'), '4', 'maxalphanames=1 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries->entry('L6')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L6 labelalpha'); eq_or_diff($main->get_extraalphadata('L6'), '5', 'maxalphanames=1 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries->entry('L7')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L7 labelalpha'); eq_or_diff($main->get_extraalphadata('L7'), '6', 'maxalphanames=1 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=1 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main->get_extraalphadata('L8')), 'maxalphanames=1 minalphanames=1 entry L8 extraalpha'); ok(is_undef($main->get_extraalphadata('L9')), 'L9 extraalpha unset due to shorthand'); ok(is_undef($main->get_extraalphadata('L10')), 'L10 extraalpha unset due to shorthand'); eq_or_diff($main->get_extraalphadata('knuth:ct'), '1', 'YEAR with range needs label differentiating from individual volumes - 1'); eq_or_diff($main->get_extraalphadata('knuth:ct:a'), '2', 'YEAR with range needs label differentiating from individual volumes - 2'); eq_or_diff($main->get_extraalphadata('knuth:ct:b'), '1', 'YEAR with range needs label differentiating from individual volumes - 3'); eq_or_diff($main->get_extraalphadata('knuth:ct:c'), '2', 'YEAR with range needs label differentiating from individual volumes - 4'); eq_or_diff($bibentries->entry('ignore1')->get_field('sortlabelalpha'), 'OTo07', 'Default ignore'); eq_or_diff($bibentries->entry('ignore2')->get_field('sortlabelalpha'), 'De 07', 'Default no ignore spaces'); # reset options and regenerate information Biber::Config->setblxoption('maxalphanames', 2); Biber::Config->setblxoption('minalphanames', 1); Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 1); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=2 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main->get_extraalphadata('l1')), 'maxalphanames=2 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main->get_extraalphadata('L2'), '1', 'maxalphanames=2 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main->get_extraalphadata('L3'), '2', 'maxalphanames=2 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries->entry('L4')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L4 labelalpha'); eq_or_diff($main->get_extraalphadata('L4'), '1', 'maxalphanames=2 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries->entry('L5')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L5 labelalpha'); eq_or_diff($main->get_extraalphadata('L5'), '2', 'maxalphanames=2 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries->entry('L6')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L6 labelalpha'); eq_or_diff($main->get_extraalphadata('L6'), '3', 'maxalphanames=2 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries->entry('L7')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L7 labelalpha'); eq_or_diff($main->get_extraalphadata('L7'), '4', 'maxalphanames=2 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=2 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main->get_extraalphadata('L8')), 'maxalphanames=2 minalphanames=1 entry L8 extraalpha'); # reset options and regenerate information Biber::Config->setblxoption('maxalphanames', 2); Biber::Config->setblxoption('minalphanames', 2); Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 2); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=2 minalphanames=2 entry L1 labelalpha'); ok(is_undef($main->get_extraalphadata('l1')), 'maxalphanames=2 minalphanames=2 entry L1 extraalpha'); eq_or_diff($bibentries->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=2 entry L2 labelalpha'); eq_or_diff($main->get_extraalphadata('L2'), '1', 'maxalphanames=2 minalphanames=2 entry L2 extraalpha'); eq_or_diff($bibentries->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=2 entry L3 labelalpha'); eq_or_diff($main->get_extraalphadata('L3'), '2', 'maxalphanames=2 minalphanames=2 entry L3 extraalpha'); eq_or_diff($bibentries->entry('L4')->get_field('sortlabelalpha'), 'DA+95', 'maxalphanames=2 minalphanames=2 entry L4 labelalpha'); eq_or_diff($main->get_extraalphadata('L4'), '1', 'maxalphanames=2 minalphanames=2 entry L4 extraalpha'); eq_or_diff($bibentries->entry('L5')->get_field('sortlabelalpha'), 'DA+95', 'maxalphanames=2 minalphanames=2 entry L5 labelalpha'); eq_or_diff($main->get_extraalphadata('L5'), '2', 'maxalphanames=2 minalphanames=2 entry L5 extraalpha'); eq_or_diff($bibentries->entry('L6')->get_field('sortlabelalpha'), 'DS+95', 'maxalphanames=2 minalphanames=2 entry L6 labelalpha'); eq_or_diff($main->get_extraalphadata('L6'), '1', 'maxalphanames=2 minalphanames=2 entry L6 extraalpha'); eq_or_diff($bibentries->entry('L7')->get_field('sortlabelalpha'), 'DS+95', 'maxalphanames=2 minalphanames=2 entry L7 labelalpha'); eq_or_diff($main->get_extraalphadata('L7'), '2', 'maxalphanames=2 minalphanames=2 entry L7 extraalpha'); eq_or_diff($bibentries->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=2 minalphanames=2 entry L8 labelalpha'); ok(is_undef($main->get_extraalphadata('L8')), 'maxalphanames=2 minalphanames=2 entry L8 extraalpha'); # reset options and regenerate information Biber::Config->setblxoption('maxalphanames', 3); Biber::Config->setblxoption('minalphanames', 1); Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=3 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main->get_extraalphadata('L1')), 'maxalphanames=3 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=3 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main->get_extraalphadata('L2'), '1', 'maxalphanames=3 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=3 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main->get_extraalphadata('L3'), '2', 'maxalphanames=3 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries->entry('L4')->get_field('sortlabelalpha'), 'DAE95', 'maxalphanames=3 minalphanames=1 entry L4 labelalpha'); eq_or_diff($main->get_extraalphadata('L4'), '1', 'maxalphanames=3 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries->entry('L5')->get_field('sortlabelalpha'), 'DAE95', 'maxalphanames=3 minalphanames=1 entry L5 labelalpha'); eq_or_diff($main->get_extraalphadata('L5'), '2', 'maxalphanames=3 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries->entry('L6')->get_field('sortlabelalpha'), 'DSE95', 'maxalphanames=3 minalphanames=1 entry L6 labelalpha'); ok(is_undef($main->get_extraalphadata('L6')), 'maxalphanames=3 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries->entry('L7')->get_field('sortlabelalpha'), 'DSJ95', 'maxalphanames=3 minalphanames=1 entry L7 labelalpha'); ok(is_undef($main->get_extraalphadata('L7')), 'maxalphanames=3 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=3 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main->get_extraalphadata('L8')), 'maxalphanames=3 minalphanames=1 entry L8 extraalpha'); eq_or_diff($bibentries->entry('LDN1')->get_field('sortlabelalpha'), 'VUR89', 'Testing compound lastnames 1'); eq_or_diff($bibentries->entry('LDN2')->get_field('sortlabelalpha'), 'VU45', 'Testing compound lastnames 2'); # reset options and regenerate information Biber::Config->setblxoption('maxalphanames', 4); Biber::Config->setblxoption('minalphanames', 4); Biber::Config->setblxoption('maxcitenames', 4); Biber::Config->setblxoption('mincitenames', 4); Biber::Config->setblxoption('labelalpha', 1); Biber::Config->setblxoption('labeldate', 1); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; my $out = $biber->get_output_obj; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('L11')->get_field('sortlabelalpha'), 'vRan22', 'prefix labelalpha 1'); eq_or_diff($bibentries->entry('L12')->get_field('sortlabelalpha'), 'vRvB2', 'prefix labelalpha 2'); # only the first name in the list is in the label due to namecount=1 eq_or_diff($bibentries->entry('L13')->get_field('sortlabelalpha'), 'vRa+-ksUnV', 'per-type labelalpha 1'); eq_or_diff($bibentries->entry('L14')->get_field('sortlabelalpha'), 'Alabel-ksUnW', 'per-type labelalpha 2'); eq_or_diff($bibentries->entry('L15')->get_field('sortlabelalpha'), 'AccBrClim', 'labelalpha disambiguation 1'); eq_or_diff($bibentries->entry('L16')->get_field('sortlabelalpha'), 'AccBaClim', 'labelalpha disambiguation 2'); eq_or_diff($bibentries->entry('L16a')->get_field('sortlabelalpha'), 'AccBaClim', 'labelalpha disambiguation 2a'); eq_or_diff($main->get_extraalphadata('L16'), '1', 'labelalpha disambiguation 2c'); eq_or_diff($main->get_extraalphadata('L16a'), '2', 'labelalpha disambiguation 2d'); eq_or_diff($bibentries->entry('L17')->get_field('sortlabelalpha'), 'AckBaClim', 'labelalpha disambiguation 3'); eq_or_diff($main->get_extraalphadata('L17a'), '2', 'custom labelalpha extrayear 1'); eq_or_diff($bibentries->entry('L18')->get_field('sortlabelalpha'), 'AgChLa', 'labelalpha disambiguation 4'); eq_or_diff($bibentries->entry('L19')->get_field('sortlabelalpha'), 'AgConLe', 'labelalpha disambiguation 5'); eq_or_diff($bibentries->entry('L20')->get_field('sortlabelalpha'), 'AgCouLa', 'labelalpha disambiguation 6'); eq_or_diff($bibentries->entry('L21')->get_field('sortlabelalpha'), 'BoConEdb', 'labelalpha disambiguation 7'); eq_or_diff($bibentries->entry('L22')->get_field('sortlabelalpha'), 'BoConEm', 'labelalpha disambiguation 8'); eq_or_diff($bibentries->entry('L23')->get_field('sortlabelalpha'), 'Sa', 'labelalpha disambiguation 9'); # reset options and regenerate information Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "labelname", substring_width => "vf", substring_fixed_threshold => 2, substring_side => "left" }, ], order => 1, }, ], type => "unpublished", }, 'ENTRYTYPE', 'unpublished'); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; # "Agas" and not "Aga" because the Schmidt/Schnee below need 4 chars to disambiguate eq_or_diff($bibentries->entry('L18')->get_field('sortlabelalpha'), 'AgasChaLaver', 'labelalpha disambiguation 10'); eq_or_diff($bibentries->entry('L19')->get_field('sortlabelalpha'), 'AgasConLendl', 'labelalpha disambiguation 11'); eq_or_diff($bibentries->entry('L20')->get_field('sortlabelalpha'), 'AgasCouLaver', 'labelalpha disambiguation 12'); # reset options and regenerate information Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "labelname", substring_width => "l", substring_side => "left" }, ], order => 1, }, ], type => "unpublished", }, 'ENTRYTYPE', 'unpublished'); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('L18')->get_field('sortlabelalpha'), 'AChL', 'labelalpha list disambiguation 1'); eq_or_diff($bibentries->entry('L19')->get_field('sortlabelalpha'), 'ACoL', 'labelalpha list disambiguation 2'); eq_or_diff($bibentries->entry('L20')->get_field('sortlabelalpha'), 'ACL', 'labelalpha list disambiguation 3'); eq_or_diff($bibentries->entry('L21')->get_field('sortlabelalpha'), 'BCEd', 'labelalpha list disambiguation 4'); eq_or_diff($bibentries->entry('L22')->get_field('sortlabelalpha'), 'BCE', 'labelalpha list disambiguation 5'); eq_or_diff($bibentries->entry('L24')->get_field('sortlabelalpha'), 'Z', 'labelalpha list disambiguation 6'); eq_or_diff($bibentries->entry('L25')->get_field('sortlabelalpha'), 'ZX', 'labelalpha list disambiguation 7'); eq_or_diff($bibentries->entry('L26')->get_field('sortlabelalpha'), 'ZX', 'labelalpha list disambiguation 8'); eq_or_diff(NFC($bibentries->entry('title1')->get_field('sortlabelalpha')), 'Tït', 'Title in braces with UTF-8 char - 1'); # reset options and regenerate information Biber::Config->setblxoption('maxalphanames', 3); Biber::Config->setblxoption('minalphanames', 1); Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "shorthand", final => 1 }, { content => "label" }, { content => "labelname", ifnamecount => 1, substring_side => "left", substring_width => 3, }, { content => "labelname", substring_side => "left", substring_width => 1 }, ], order => 1, }, { labelpart => [ { content => "year", substring_side => "right", substring_width => 2 }, ], order => 2, }, ], type => "global", }); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('Schmidt2007')->get_field('sortlabelalpha'), 'Sch+07', 'extraalpha ne extrayear 1'); eq_or_diff($main->get_extraalphadata('Schmidt2007'), '1', 'extraalpha ne extrayear 2'); eq_or_diff($bibentries->entry('Schmidt2007a')->get_field('sortlabelalpha'), 'Sch07', 'extraalpha ne extrayear 3'); eq_or_diff($main->get_extraalphadata('Schmidt2007a'), '1', 'extraalpha ne extrayear 4'); eq_or_diff($bibentries->entry('Schnee2007')->get_field('sortlabelalpha'), 'Sch+07', 'extraalpha ne extrayear 5'); eq_or_diff($main->get_extraalphadata('Schnee2007'), '2', 'extraalpha ne extrayear 6'); eq_or_diff($bibentries->entry('Schnee2007a')->get_field('sortlabelalpha'), 'Sch07', 'extraalpha ne extrayear 7'); eq_or_diff($main->get_extraalphadata('Schnee2007a'), '2', 'extraalpha ne extrayear 8'); Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "citekey", substring_side => "left", substring_width => 3, uppercase => 1, }, ], order => 1, }, ], type => "global", }); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('Schmidt2007')->get_field('sortlabelalpha'), 'SCH', 'entrykey label 1'); Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "labelyear", } ], order => 1, }, { labelpart => [ { content => "labelmonth", } ], order => 2, }, { labelpart => [ { content => "labelday", } ], order => 3, } ], type => "global", }); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('labelstest')->get_field('sortlabelalpha'), '20050302', 'labeldate test - 1'); eq_or_diff($bibentries->entry('padtest')->get_field('labelalpha'), '\&Al\_\_{\textasciitilde}{\textasciitilde}T07', 'pad test - 1'); eq_or_diff($bibentries->entry('padtest')->get_field('sortlabelalpha'), '&Al__~~T07', 'pad test - 2'); Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "author", ifnamecount => 1, substring_side => "left", substring_width => 3, substring_pwidth => 2, substring_pcompound=> 1, }, ], order => 1, }, { labelpart => [ { content => "title", substring_side => "left", substring_width => 4, }, ], order => 2, }, ], type => "global", }); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } # The "o"s are ignored for width substring calculation - take note Biber::Config->setoption('nolabelwidthcount', [ {value => q/o+/} ] ); $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('skipwidthtest1')->get_field('sortlabelalpha'), 'OToolOToole', 'Skip width test - 1'); eq_or_diff($bibentries->entry('prefix1')->get_field('sortlabelalpha'), 'vadeVaaThin', 'compound and string length entry prefix1 labelalpha'); Biber::Config->setblxoption('labelalphatemplate', { labelelement => [ { labelpart => [ { content => "author", namerange => "2-7" }, ], order => 1, }, { labelpart => [ { content => ".", }, ], order => 2, }, { labelpart => [ { content => "editor", namerange => "--3" }, ], order => 3, }, { labelpart => [ { content => ".", }, ], order => 4, }, { labelpart => [ { content => "translator", namerange => "2", noalphaothers => "1" }, ], order => 5, }, { labelpart => [ { content => ".", }, ], order => 6, }, { labelpart => [ { content => "foreword", namerange => "3--" }, ], order => 7, }, { labelpart => [ { content => ".", }, ], order => 8, }, { labelpart => [ { content => "holder", namerange => "2-+" }, ], order => 9, }, ], type => "global", }); Biber::Config->setblxoption('minalphanames', 2); foreach my $k ($section->get_citekeys) { $bibentries->entry($k)->del_field('sortlabelalpha'); $bibentries->entry($k)->del_field('labelalpha'); $main->set_extraalphadata_for_key($k, undef); } $biber->prepare; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff($bibentries->entry('rangetest1')->get_field('sortlabelalpha'), 'WAXAYAZA.VEWEXE+.VTWT.XFYFZF.WH+', 'Name range test - 1'); biblatex-biber-2.4/t/labelname.t000555000765000024 451612667073765 17061 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 4; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); $biber->parse_ctrlfile("general.bcf"); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biblatex options Biber::Config->setblxoption('labelnamespec', [ {content => 'shortauthor'}, {content => 'author'}, {content => 'shorteditor'}, {content => 'editor'}, {content => 'translator'}]); Biber::Config->setblxoption('labelnamespec', [ {content => 'editor'}, {content => 'translator'}], 'ENTRYTYPE', 'book'); Biber::Config->setblxoption('labelnamespec', [ {content => 'namea'}, {content => 'author' }], 'ENTRYTYPE', 'misc'); # Now generate the information $biber->prepare; my $bibentries = $biber->sections->get_section(0)->bibentries; eq_or_diff($bibentries->entry('angenendtsa')->get_labelname_info, 'shortauthor', 'global shortauthor' ); eq_or_diff($bibentries->entry('stdmodel')->get_labelname_info, 'author', 'global author' ); eq_or_diff($bibentries->entry('aristotle:anima')->get_labelname_info, 'editor', 'type-specific editor' ); eq_or_diff($bibentries->entry('lne1')->get_labelname_info, 'namea', 'type-specific exotic name' ); biblatex-biber-2.4/t/names.t000555000765000024 10635012667073765 16303 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 55; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; use Unicode::Normalize; use Encode; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('names.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('namesep', 'und'); # Testing custom name splitting string Biber::Config->setoption('others_string', 'andere'); # Testing custom implied "et al" Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setblxoption('mincitenames', 3); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $name1 = { given => {string => 'John', initial => ['J']}, family => {string => 'Doe', initial => ['D']}, nameinitstring => 'Doe_J', namestring => 'Doe, John', prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }}; my $name2 = { given => {string => 'John', initial => ['J']}, family => {string => 'Doe', initial => ['D']}, nameinitstring => 'Doe_J', namestring => 'Doe, John', prefix => {string => undef, initial => undef}, suffix => {string => 'Jr', initial => ['J']}, strip => { given => 0, family => 0, prefix => undef, suffix => 0 }}; my $name3 = { given => {string => 'Johann~Gottfried', initial => ['J', 'G']}, family => {string => 'Berlichingen zu~Hornberg', initial => ['B', 'z', 'H']}, nameinitstring => 'v_Berlichingen_zu_Hornberg_JG', namestring => 'von Berlichingen zu Hornberg, Johann Gottfried', prefix => {string => 'von', initial => ['v']}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => 0, suffix => undef }}; my $name4 = { given => {string => 'Johann~Gottfried', initial => ['J', 'G']}, family => {string => 'Berlichingen zu~Hornberg', initial => ['B', 'z', 'H']}, nameinitstring => 'Berlichingen_zu_Hornberg_JG', namestring => 'von Berlichingen zu Hornberg, Johann Gottfried', prefix => {string => 'von', initial => ['v']}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => 0, suffix => undef }}; my $name5 = { given => {string => undef, initial => undef}, family => {string => 'Robert and Sons, Inc.', initial => ['R']}, nameinitstring => '{Robert_and_Sons,_Inc.}', namestring => 'Robert and Sons, Inc.', prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => undef, family => 1, prefix => undef, suffix => undef }}; my $name6 = { given => {string => 'ʿAbdallāh', initial => ['A']}, family => {string => 'al-Ṣāliḥ', initial => ['Ṣ']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => 'al-Ṣāliḥ, ʿAbdallāh', nameinitstring => 'al-Ṣāliḥ_A' } ; my $name7 = { given => {string => 'Jean Charles~Gabriel', initial => ['J', 'C', 'G']}, family => {string => 'Vallée~Poussin', initial => ['V', 'P']}, prefix => {string => 'de~la', initial => ['d', 'l']}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => 0, suffix => undef }, namestring => 'de la Vallée Poussin, Jean Charles Gabriel', nameinitstring => 'dl_Vallée_Poussin_JCG' } ; my $name8 = { given => {string => 'Jean Charles Gabriel', initial => ['J']}, family => {string => 'Vallée~Poussin', initial => ['V', 'P']}, prefix => {string => 'de~la', initial => ['d', 'l']}, suffix => {string => undef, initial => undef}, strip => { given => 1, family => 0, prefix => 0, suffix => undef }, namestring => 'de la Vallée Poussin, Jean Charles Gabriel', nameinitstring => 'Vallée_Poussin_J' } ; my $name9 = { given => {string => 'Jean Charles Gabriel {de la}~Vallée', initial => ['J', 'C', 'G', 'd', 'V']}, family => {string => 'Poussin', initial => ['P']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => 'Poussin, Jean Charles Gabriel {de la} Vallée', nameinitstring => 'Poussin_JCGdV' } ; my $name10 = { given => {string => 'Jean Charles~Gabriel', initial => ['J', 'C', 'G']}, family => {string => 'Vallée Poussin', initial => ['V']}, prefix => {string => 'de~la', initial => ['d', 'l']}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 1, prefix => 0, suffix => undef }, namestring => 'de la Vallée Poussin, Jean Charles Gabriel', nameinitstring => '{Vallée_Poussin}_JCG' } ; my $name11 = { given => {string => 'Jean Charles Gabriel', initial => ['J']}, family => {string => 'Vallée Poussin', initial => ['V']}, prefix => {string => 'de~la', initial => ['d', 'l']}, suffix => {string => undef, initial => undef}, strip => { given => 1, family => 1, prefix => 0, suffix => undef }, namestring => 'de la Vallée Poussin, Jean Charles Gabriel', nameinitstring => '{Vallée_Poussin}_J' } ; my $name12 = { given => {string => 'Jean Charles~Gabriel', initial => ['J', 'C', 'G']}, family => {string => 'Poussin', initial => ['P']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => 'Poussin, Jean Charles Gabriel', nameinitstring => 'Poussin_JCG' } ; my $name13 = { given => {string => 'Jean~Charles', initial => ['J', 'C']}, family => {string => 'Poussin Lecoq', initial => ['P']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 1, prefix => undef, suffix => undef }, namestring => 'Poussin Lecoq, Jean Charles', nameinitstring => '{Poussin_Lecoq}_JC' } ; my $name14 = { given => {string => 'J.~C.~G.', initial => ['J', 'C', 'G']}, family => {string => 'Vallée~Poussin', initial => ['V', 'P']}, prefix => {string => 'de~la', initial => ['d', 'l']}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => 0, suffix => undef }, namestring => 'de la Vallée Poussin, J. C. G.', nameinitstring => 'dl_Vallée_Poussin_JCG' } ; # Note that the family initials are wrong because the prefix "El-" was not stripped # This is because the default noinit regexp only strips lower-case prefices to protect # hyphenated names my $name15 = { given => {string => 'E.~S.', initial => ['E', 'S']}, family => {string => 'El-{M}allah', initial => ['E-M']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => 'El-{M}allah, E. S.', nameinitstring => 'El-{M}allah_ES' } ; my $name16 = { given => {string => 'E.~S.', initial => ['E', 'S']}, family => {string => '{K}ent-{B}oswell', initial => ['K-B']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => '{K}ent-{B}oswell, E. S.', nameinitstring => '{K}ent-{B}oswell_ES' } ; my $name17 = { given => {string => 'A.~N.', initial => ['A', 'N']}, family => {string => 'Other', initial => ['O']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => 0, family => 0, prefix => undef, suffix => undef }, namestring => 'Other, A. N.', nameinitstring => 'Other_AN' } ; my $name18 = { given => {string => undef, initial => undef}, family => {string => 'British National Corpus', initial => ['B']}, prefix => {string => undef, initial => undef}, suffix => {string => undef, initial => undef}, strip => { given => undef, family => 1, prefix => undef, suffix => undef }, namestring => 'British National Corpus', nameinitstring => '{British_National_Corpus}' } ; my $l1 = q| \entry{L1}{book}{} \name{author}{1}{}{% {{hash=72287a68c1714cb1b9f4ab9e03a88b96}{% family={Adler}, family_i={A\bibinitperiod}, given={Alfred}, given_i={A\bibinitperiod}}}% } \strng{namehash}{72287a68c1714cb1b9f4ab9e03a88b96} \strng{fullhash}{72287a68c1714cb1b9f4ab9e03a88b96} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelnamesource}{author} \endentry |; my $l2 = q| \entry{L2}{book}{} \name{author}{1}{}{% {{hash=1c867a2b5ceb243bab70afb18702dc04}{% family={Bull}, family_i={B\bibinitperiod}, given={Bertie\bibnamedelima B.}, given_i={B\bibinitperiod\bibinitdelim B\bibinitperiod}}}% } \strng{namehash}{1c867a2b5ceb243bab70afb18702dc04} \strng{fullhash}{1c867a2b5ceb243bab70afb18702dc04} \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labelnamesource}{author} \endentry |; my $l3 = q| \entry{L3}{book}{} \name{author}{1}{}{% {{hash=cecd18116c43ee86e5a136b6e0362948}{% family={Crop}, family_i={C\bibinitperiod}, given={C.\bibnamedelimi Z.}, given_i={C\bibinitperiod\bibinitdelim Z\bibinitperiod}}}% } \strng{namehash}{cecd18116c43ee86e5a136b6e0362948} \strng{fullhash}{cecd18116c43ee86e5a136b6e0362948} \field{sortinit}{C} \field{sortinithash}{59f25d509f3381b07695554a9f35ecb2} \field{labelnamesource}{author} \endentry |; my $l4 = q| \entry{L4}{book}{} \name{author}{1}{}{% {{hash=675883f3aca7c6069c0b154d47af4c86}{% family={Decket}, family_i={D\bibinitperiod}, given={Derek\bibnamedelima D}, given_i={D\bibinitperiod\bibinitdelim D\bibinitperiod}}}% } \strng{namehash}{675883f3aca7c6069c0b154d47af4c86} \strng{fullhash}{675883f3aca7c6069c0b154d47af4c86} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \endentry |; my $l5 = q| \entry{L5}{book}{} \name{author}{1}{}{% {{hash=c2d41bb75b01ec2339c1050981f9c2cc}{% prefix={von}, prefix_i={v\bibinitperiod}, family={Eel}, family_i={E\bibinitperiod}, given={Egbert}, given_i={E\bibinitperiod}}}% } \strng{namehash}{c2d41bb75b01ec2339c1050981f9c2cc} \strng{fullhash}{c2d41bb75b01ec2339c1050981f9c2cc} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l6 = q| \entry{L6}{book}{} \name{author}{1}{}{% {{hash=68e9105aa98379a85ef6cd2e7ac29c00}{% prefix={van\bibnamedelimb der\bibnamedelima valt}, prefix_i={v\bibinitperiod\bibinitdelim d\bibinitperiod\bibinitdelim v\bibinitperiod}, family={Frome}, family_i={F\bibinitperiod}, given={Francis}, given_i={F\bibinitperiod}}}% } \strng{namehash}{68e9105aa98379a85ef6cd2e7ac29c00} \strng{fullhash}{68e9105aa98379a85ef6cd2e7ac29c00} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l7 = q| \entry{L7}{book}{} \name{author}{1}{}{% {{hash=4dbef3c5464f951b537a49ba93676a9a}{% prefix={van}, prefix_i={v\bibinitperiod}, family={Gloom}, family_i={G\bibinitperiod}, given={Gregory\bibnamedelima R.}, given_i={G\bibinitperiod\bibinitdelim R\bibinitperiod}}}% } \strng{namehash}{4dbef3c5464f951b537a49ba93676a9a} \strng{fullhash}{4dbef3c5464f951b537a49ba93676a9a} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l8 = q| \entry{L8}{book}{} \name{author}{1}{}{% {{hash=9fb4d242b62f047e4255282864eedb97}{% prefix={van}, prefix_i={v\bibinitperiod}, family={Henkel}, family_i={H\bibinitperiod}, given={Henry\bibnamedelima F.}, given_i={H\bibinitperiod\bibinitdelim F\bibinitperiod}}}% } \strng{namehash}{9fb4d242b62f047e4255282864eedb97} \strng{fullhash}{9fb4d242b62f047e4255282864eedb97} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l9 = q| \entry{L9}{book}{} \name{author}{1}{}{% {{hash=1734924c4c55de5bb18d020c34a5249e}{% family={{Iliad\bibnamedelimb Ipswich}}, family_i={I\bibinitperiod}, given={Ian}, given_i={I\bibinitperiod}}}% } \strng{namehash}{1734924c4c55de5bb18d020c34a5249e} \strng{fullhash}{1734924c4c55de5bb18d020c34a5249e} \field{sortinit}{I} \field{sortinithash}{25e99d37ba90f7c4fb20baf4e310faf3} \field{labelnamesource}{author} \endentry |; my $l10 = q| \entry{L10}{book}{} \name{author}{1}{}{% {{hash=758a11cc45860d7635b1f6091b2d95a9}{% family={Jolly}, family_i={J\bibinitperiod}, suffix={III}, suffix_i={I\bibinitperiod}, given={James}, given_i={J\bibinitperiod}}}% } \strng{namehash}{758a11cc45860d7635b1f6091b2d95a9} \strng{fullhash}{758a11cc45860d7635b1f6091b2d95a9} \field{sortinit}{J} \field{sortinithash}{ec3950a647c092421b9fcca6d819504a} \field{labelnamesource}{author} \endentry |; my $l10a = q| \entry{L10a}{book}{} \name{author}{1}{}{% {{hash=5e60d697e6432558eab7dccf9890eb79}{% family={Pimentel}, family_i={P\bibinitperiod}, suffix={Jr.}, suffix_i={J\bibinitperiod}, given={Joseph\bibnamedelima J.}, given_i={J\bibinitperiod\bibinitdelim J\bibinitperiod}}}% } \strng{namehash}{5e60d697e6432558eab7dccf9890eb79} \strng{fullhash}{5e60d697e6432558eab7dccf9890eb79} \field{sortinit}{P} \field{sortinithash}{c0a4896d0e424f9ca4d7f14f2b3428e7} \field{labelnamesource}{author} \endentry |; my $l11 = q| \entry{L11}{book}{} \name{author}{1}{}{% {{hash=ef4ab7eba5cd140b54ba4329e1dda90b}{% prefix={van}, prefix_i={v\bibinitperiod}, family={Kluster}, family_i={K\bibinitperiod}, suffix={Jr.}, suffix_i={J\bibinitperiod}, given={Kevin}, given_i={K\bibinitperiod}}}% } \strng{namehash}{ef4ab7eba5cd140b54ba4329e1dda90b} \strng{fullhash}{ef4ab7eba5cd140b54ba4329e1dda90b} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l12 = q| \entry{L12}{book}{} \name{author}{1}{}{% {{hash=5bb094a9232384acc478f1aa54e8cf3c}{% prefix={de\bibnamedelima la}, prefix_i={d\bibinitperiod\bibinitdelim l\bibinitperiod}, family={Vallée\bibnamedelima Poussin}, family_i={V\bibinitperiod\bibinitdelim P\bibinitperiod}, given={Charles\bibnamedelimb Louis\bibnamedelimb Xavier\bibnamedelima Joseph}, given_i={C\bibinitperiod\bibinitdelim L\bibinitperiod\bibinitdelim X\bibinitperiod\bibinitdelim J\bibinitperiod}}}% } \strng{namehash}{5bb094a9232384acc478f1aa54e8cf3c} \strng{fullhash}{5bb094a9232384acc478f1aa54e8cf3c} \field{sortinit}{d} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \endentry |; my $l13 = q| \entry{L13}{book}{} \name{author}{1}{}{% {{hash=5e79da6869afaf0d38e01285b494d555}{% family={Van\bibnamedelimb de\bibnamedelima Graaff}, family_i={V\bibinitperiod\bibinitdelim d\bibinitperiod\bibinitdelim G\bibinitperiod}, given={R.\bibnamedelimi J.}, given_i={R\bibinitperiod\bibinitdelim J\bibinitperiod}}}% } \strng{namehash}{5e79da6869afaf0d38e01285b494d555} \strng{fullhash}{5e79da6869afaf0d38e01285b494d555} \field{sortinit}{V} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l14 = q| \entry{L14}{book}{} \name{author}{1}{}{% {{hash=2319907d9a5d5dd46da77879bdb7e609}{% family={St\bibnamedelima John-Mollusc}, family_i={S\bibinitperiod\bibinitdelim J\bibinithyphendelim M\bibinitperiod}, given={Oliver}, given_i={O\bibinitperiod}}}% } \strng{namehash}{2319907d9a5d5dd46da77879bdb7e609} \strng{fullhash}{2319907d9a5d5dd46da77879bdb7e609} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l15 = q| \entry{L15}{book}{} \name{author}{1}{}{% {{hash=379b415d869a4751678a5eee23b07e48}{% prefix={van}, prefix_i={v\bibinitperiod}, family={Gompel}, family_i={G\bibinitperiod}, given={Roger\bibnamedelima P.{\,}G.}, given_i={R\bibinitperiod\bibinitdelim P\bibinitperiod}}}% } \strng{namehash}{379b415d869a4751678a5eee23b07e48} \strng{fullhash}{379b415d869a4751678a5eee23b07e48} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l16 = q| \entry{L16}{book}{} \name{author}{1}{}{% {{hash=0a9532fa161f6305ec403c1c85951bdf}{% prefix={van}, prefix_i={v\bibinitperiod}, family={Gompel}, family_i={G\bibinitperiod}, given={Roger\bibnamedelima {P.\,G.}}, given_i={R\bibinitperiod\bibinitdelim P\bibinitperiod}}}% } \strng{namehash}{0a9532fa161f6305ec403c1c85951bdf} \strng{fullhash}{0a9532fa161f6305ec403c1c85951bdf} \field{sortinit}{v} \field{sortinithash}{d18f5ce25ce0b5ca7f924e3f6c04870e} \field{labelnamesource}{author} \endentry |; my $l17 = q| \entry{L17}{book}{} \name{author}{1}{}{% {{hash=766d5329cf995fcc7c1cef19de2a2ae8}{% family={Lovecraft}, family_i={L\bibinitperiod}, given={Bill\bibnamedelima H.{\,}P.}, given_i={B\bibinitperiod\bibinitdelim H\bibinitperiod}}}% } \strng{namehash}{766d5329cf995fcc7c1cef19de2a2ae8} \strng{fullhash}{766d5329cf995fcc7c1cef19de2a2ae8} \field{sortinit}{L} \field{sortinithash}{872351f18d0f736066eda0bf18bfa4f7} \field{labelnamesource}{author} \endentry |; my $l18 = q| \entry{L18}{book}{} \name{author}{1}{}{% {{hash=58620d2c7d6839bac23306c732c563fb}{% family={Lovecraft}, family_i={L\bibinitperiod}, given={Bill\bibnamedelima {H.\,P.}}, given_i={B\bibinitperiod\bibinitdelim H\bibinitperiod}}}% } \strng{namehash}{58620d2c7d6839bac23306c732c563fb} \strng{fullhash}{58620d2c7d6839bac23306c732c563fb} \field{sortinit}{L} \field{sortinithash}{872351f18d0f736066eda0bf18bfa4f7} \field{labelnamesource}{author} \endentry |; my $l19 = q| \entry{L19}{book}{} \name{author}{1}{}{% {{hash=83caa52f21f97e572dd3267bdf62978a}{% family={Mustermann}, family_i={M\bibinitperiod}, given={Klaus-Peter}, given_i={K\bibinithyphendelim P\bibinitperiod}}}% } \strng{namehash}{83caa52f21f97e572dd3267bdf62978a} \strng{fullhash}{83caa52f21f97e572dd3267bdf62978a} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelnamesource}{author} \endentry |; my $l19a = q| \entry{L19a}{book}{} \name{author}{1}{}{% {{hash=0963f6904ccfeaac2770c5882a587001}{% family={Lam}, family_i={L\bibinitperiod}, given={Ho-Pun}, given_i={H\bibinithyphendelim P\bibinitperiod}}}% } \strng{namehash}{0963f6904ccfeaac2770c5882a587001} \strng{fullhash}{0963f6904ccfeaac2770c5882a587001} \field{sortinit}{L} \field{sortinithash}{872351f18d0f736066eda0bf18bfa4f7} \field{labelnamesource}{author} \endentry |; my $l20 = q| \entry{L20}{book}{} \name{author}{1}{}{% {{hash=fdaa0936724be89ef8bd16cf02e08c74}{% family={Ford}, family_i={F\bibinitperiod}, given={{John\bibnamedelimb Henry}}, given_i={J\bibinitperiod}}}% } \strng{namehash}{fdaa0936724be89ef8bd16cf02e08c74} \strng{fullhash}{fdaa0936724be89ef8bd16cf02e08c74} \field{sortinit}{F} \field{sortinithash}{c6a7d9913bbd7b20ea954441c0460b78} \field{labelnamesource}{author} \endentry |; my $l21 = q| \entry{L21}{book}{} \name{author}{1}{}{% {{hash=4389a3c0dc7da74487b50808ba9436ad}{% family={Smith}, family_i={S\bibinitperiod}, given={\v{S}omeone}, given_i={\v{S}\bibinitperiod}}}% } \strng{namehash}{4389a3c0dc7da74487b50808ba9436ad} \strng{fullhash}{4389a3c0dc7da74487b50808ba9436ad} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l22u = q| \entry{L22}{book}{} \name{author}{1}{}{% {{hash=e58b861545799d0eaf883402a882126e}{% family={Šmith}, family_i={Š\bibinitperiod}, given={Someone}, given_i={S\bibinitperiod}}}% } \strng{namehash}{e58b861545799d0eaf883402a882126e} \strng{fullhash}{e58b861545799d0eaf883402a882126e} \field{sortinit}{Š} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l22 = q| \entry{L22}{book}{} \name{author}{1}{}{% {{hash=e58b861545799d0eaf883402a882126e}{% family={\v{S}mith}, family_i={\v{S}\bibinitperiod}, given={Someone}, given_i={S\bibinitperiod}}}% } \strng{namehash}{e58b861545799d0eaf883402a882126e} \strng{fullhash}{e58b861545799d0eaf883402a882126e} \field{sortinit}{\v{S}} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l23 = q| \entry{L23}{book}{} \name{author}{1}{}{% {{hash=4389a3c0dc7da74487b50808ba9436ad}{% family={Smith}, family_i={S\bibinitperiod}, given={Šomeone}, given_i={Š\bibinitperiod}}}% } \strng{namehash}{4389a3c0dc7da74487b50808ba9436ad} \strng{fullhash}{4389a3c0dc7da74487b50808ba9436ad} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l24 = q| \entry{L24}{book}{} \name{author}{1}{}{% {{hash=e58b861545799d0eaf883402a882126e}{% family={Šmith}, family_i={Š\bibinitperiod}, given={Someone}, given_i={S\bibinitperiod}}}% } \strng{namehash}{e58b861545799d0eaf883402a882126e} \strng{fullhash}{e58b861545799d0eaf883402a882126e} \field{sortinit}{Š} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; my $l25 = q| \entry{L25}{book}{} \name{author}{1}{}{% {{hash=7069367d4a4f37ffb0377e3830e98ed0}{% family={{American\bibnamedelimb Psychological\bibnamedelimb Association,\bibnamedelimb Task\bibnamedelimb Force\bibnamedelimb on\bibnamedelimb the\bibnamedelimb Sexualization\bibnamedelimb of\bibnamedelimb Girls}}, family_i={A\bibinitperiod}}}% } \strng{namehash}{7069367d4a4f37ffb0377e3830e98ed0} \strng{fullhash}{7069367d4a4f37ffb0377e3830e98ed0} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelnamesource}{author} \endentry |; my $l26 = q| \entry{L26}{book}{} \name{author}{1}{}{% {{hash=d176a8af5ce1c45cb06875c4433f2fe2}{% family={{Sci-Art\bibnamedelimb Publishers}}, family_i={S\bibinitperiod}}}% } \strng{namehash}{d176a8af5ce1c45cb06875c4433f2fe2} \strng{fullhash}{d176a8af5ce1c45cb06875c4433f2fe2} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelnamesource}{author} \endentry |; # Malformed anyway but a decent test my $l28 = q| \entry{L28}{book}{} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \warn{\item Name "Deux et al.,, O." is malformed (consecutive commas): skipping name} \endentry |; my $l29 = q| \entry{L29}{book}{} \name{author}{1}{}{% {{hash=59a5e43a502767d00e589eb29f863728}{% family={{U.S.\bibnamedelimi Department\bibnamedelimb of\bibnamedelimb Health\bibnamedelimb and\bibnamedelimb Human\bibnamedelimb Services,\bibnamedelimb National\bibnamedelimb Institute\bibnamedelimb of\bibnamedelimb Mental\bibnamedelimb Health,\bibnamedelimb National\bibnamedelimb Heart,\bibnamedelimb Lung\bibnamedelimb and\bibnamedelimb Blood\bibnamedelimb Institute}}, family_i={U\bibinitperiod}}}% } \strng{namehash}{59a5e43a502767d00e589eb29f863728} \strng{fullhash}{59a5e43a502767d00e589eb29f863728} \field{sortinit}{U} \field{sortinithash}{8145509bd2718876fc77d31fd2cde117} \field{labelnamesource}{author} \endentry |; my $l31 = q| \entry{L31}{book}{} \name{author}{1}{}{% {{hash=29c3ff92fff79d09a8b44d2f775de0b1}{% family={\~{Z}elly}, family_i={\~{Z}\\bibinitperiod}, given={Arthur}, given_i={A\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=29c3ff92fff79d09a8b44d2f775de0b1}{% family={\~{Z}elly}, family_i={\~{Z}\\bibinitperiod}, given={Arthur}, given_i={A\bibinitperiod}}}% } \name{translator}{1}{}{% {{hash=29c3ff92fff79d09a8b44d2f775de0b1}{% family={\~{Z}elly}, family_i={\~{Z}\\bibinitperiod}, given={Arthur}, given_i={A\bibinitperiod}}}% } \strng{namehash}{29c3ff92fff79d09a8b44d2f775de0b1} \strng{fullhash}{29c3ff92fff79d09a8b44d2f775de0b1} \field{sortinit}{\~{Z}} \field{sortinithash}{fdda4caaa6b5fa63e0c081dcb159543a} \field{labelnamesource}{author} \endentry |; is_deeply(Biber::Input::file::bibtex::parsename('John Doe', 'author'), $name1, 'parsename 1'); is_deeply(Biber::Input::file::bibtex::parsename('Doe, Jr, John', 'author'), $name2, 'parsename 2'); is_deeply(Biber::Input::file::bibtex::parsename('von Berlichingen zu Hornberg, Johann Gottfried', 'author', {useprefix => 1}), $name3, 'parsename 3') ; is_deeply(Biber::Input::file::bibtex::parsename('von Berlichingen zu Hornberg, Johann Gottfried', 'author', {useprefix => 0}), $name4, 'parsename 4') ; is_deeply(Biber::Input::file::bibtex::parsename('{Robert and Sons, Inc.}', 'author'), $name5, 'parsename 5') ; is_deeply(Biber::Input::file::bibtex::parsename('al-Ṣāliḥ, ʿAbdallāh', 'author', undef, 1), $name6, 'parsename 6') ; is_deeply(Biber::Input::file::bibtex::parsename('Jean Charles Gabriel de la Vallée Poussin', 'author', {useprefix => 1}, 1), $name7, 'parsename 7'); is_deeply(Biber::Input::file::bibtex::parsename('{Jean Charles Gabriel} de la Vallée Poussin', 'author', undef, 1), $name8, 'parsename 8'); is_deeply(Biber::Input::file::bibtex::parsename('Jean Charles Gabriel {de la} Vallée Poussin', 'author', undef, 1), $name9, 'parsename 9'); is_deeply(Biber::Input::file::bibtex::parsename('Jean Charles Gabriel de la {Vallée Poussin}', 'author', undef, 1), $name10, 'parsename 10'); is_deeply(Biber::Input::file::bibtex::parsename('{Jean Charles Gabriel} de la {Vallée Poussin}', 'author', undef, 1), $name11, 'parsename 11'); is_deeply(Biber::Input::file::bibtex::parsename('Jean Charles Gabriel Poussin', 'author'), $name12, 'parsename 12'); is_deeply(Biber::Input::file::bibtex::parsename('Jean Charles {Poussin Lecoq}', 'author'), $name13, 'parsename 13'); is_deeply(Biber::Input::file::bibtex::parsename('J. C. G. de la Vallée Poussin', 'author', {useprefix => 1}, 1), $name14, 'parsename 14'); is_deeply(Biber::Input::file::bibtex::parsename('E. S. El-{M}allah', 'author'), $name15, 'parsename 15'); is_deeply(Biber::Input::file::bibtex::parsename('E. S. {K}ent-{B}oswell', 'author'), $name16, 'parsename 16'); is_deeply(Biber::Input::file::bibtex::parsename('Other, A.~N.', 'author'), $name17, 'parsename 17'); is_deeply(Biber::Input::file::bibtex::parsename('{{{British National Corpus}}}', 'author'), $name18, 'parsename 18'); eq_or_diff( $out->get_output_entry('L1', $main), $l1, 'First Last') ; eq_or_diff( $out->get_output_entry('L2', $main), $l2, 'First Initial. Last') ; eq_or_diff( $out->get_output_entry('L3', $main), $l3, 'Initial. Initial. Last') ; eq_or_diff( $out->get_output_entry('L4', $main), $l4, 'First Initial Last') ; eq_or_diff( $out->get_output_entry('L5', $main), $l5, 'First prefix Last') ; eq_or_diff( $out->get_output_entry('L6', $main), $l6, 'First prefix prefix Last') ; eq_or_diff( $out->get_output_entry('L7', $main), $l7, 'First Initial. prefix Last') ; eq_or_diff( $out->get_output_entry('L8', $main), $l8, 'First Initial prefix Last') ; eq_or_diff( $out->get_output_entry('L9', $main), $l9, 'First {Last Last}') ; eq_or_diff( $out->get_output_entry('L10', $main), $l10, 'Last, Suffix, First') ; eq_or_diff( $out->get_output_entry('L10a', $main), $l10a, 'Last, Suffix, First Initial.') ; eq_or_diff( $out->get_output_entry('L11', $main), $l11, 'prefix Last, Suffix, First') ; eq_or_diff( $out->get_output_entry('L13', $main), $l13, 'Last Last Last, Initial. Initial.'); eq_or_diff( $out->get_output_entry('L14', $main), $l14, 'Last Last-Last, First'); eq_or_diff( $out->get_output_entry('L15', $main), $l15, 'First F.{\bibinitdelim }F. Last'); eq_or_diff( $out->get_output_entry('L16', $main), $l16, 'First {F.\bibinitdelim F.} Last'); eq_or_diff( $out->get_output_entry('L17', $main), $l17, 'Last, First {F.\bibinitdelim F.}'); eq_or_diff( $out->get_output_entry('L18', $main), $l18, 'Last, First F.{\bibinitdelim }F.'); eq_or_diff( $out->get_output_entry('L19', $main), $l19, 'Firstname with hyphen'); eq_or_diff( $out->get_output_entry('L19a', $main), $l19a, 'Short given name with hyphen'); eq_or_diff( $out->get_output_entry('L20', $main), $l20, 'Protected dual given name'); eq_or_diff( encode_utf8(NFC($out->get_output_entry('L22', $main))), encode_utf8($l22u), 'LaTeX encoded unicode family - 1'); eq_or_diff( NFC($out->get_output_entry('L23', $main)), $l23, 'Unicode given name'); eq_or_diff( NFC($out->get_output_entry('L24', $main)), $l24, 'Unicode family name'); eq_or_diff( $out->get_output_entry('L25', $main), $l25, 'Single string name'); eq_or_diff( $out->get_output_entry('L26', $main), $l26, 'Hyphen at brace level <> 0'); eq_or_diff($section->bibentry('L27')->get_field('author')->count_names, 1, 'Bad name with 3 commas'); eq_or_diff( $out->get_output_entry('L28', $main), $l28, 'Bad name with consecutive commas'); eq_or_diff( $out->get_output_entry('L29', $main), $l29, 'Escaped name with 3 commas'); # Checking visibility # Count does not include the "and others" as this "name" is delete in the output driver eq_or_diff($bibentries->entry('V1')->get_field($bibentries->entry('V1')->get_labelname_info)->count_names, '2', 'Name count for "and others" - 1'); eq_or_diff($bibentries->entry('V1')->get_field($bibentries->entry('V1')->get_labelname_info)->get_visible_cite, '2', 'Visibility for "and others" - 1'); eq_or_diff($bibentries->entry('V2')->get_field($bibentries->entry('V2')->get_labelname_info)->get_visible_cite, '1', 'Visibility for "and others" - 2'); # A few tests depend set to non UTF-8 output # Have to use a new biber object when trying to change encoding as this isn't # dealt with in ->prepare $biber->parse_ctrlfile('names.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('output_encoding', 'latin1'); # If you change the encoding options, you have to re-read the T::B data from the datasource # This won't happen unless you invalidate the T::B cache. Biber::Input::file::bibtex->init_cache; # Now generate the information $biber->prepare; $out = $biber->get_output_obj; $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $bibentries = $section->bibentries; eq_or_diff(NFC($bibentries->entry('L21')->get_field($bibentries->entry('L21')->get_labelname_info)->nth_name(1)->get_namepart_initial('given')->[0]), 'Š', 'Terseinitials 1'); # Should be in NFD UTF-8 eq_or_diff( encode_utf8($out->get_output_entry('L12', $main)), encode_utf8($l12), 'First First First First prefix prefix Last Last') ; eq_or_diff( $out->get_output_entry('L21', $main), $l21, 'LaTeX encoded unicode given name'); eq_or_diff( $out->get_output_entry('L22', $main), $l22, 'LaTeX encoded unicode family name - 2'); eq_or_diff( $out->get_output_entry('L31', $main), $l31, 'LaTeX encoded unicode family name with tie char'); biblatex-biber-2.4/t/options.t000555000765000024 1360412667073765 16652 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8' ; use Test::More tests => 9; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('options.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Testing customg xsv format sep Biber::Config->setoption('xsvsep', '\s*\|\s*'); # Biblatex options Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $dmv = [ [ {'presort' => {}}, {'mm' => {}}, ], [ {'sortkey' => {'final' => 1}} ], [ {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {'sorttitle' => {}}, {'title' => {}} ], [ {'sortyear' => {}}, {'year' => {}} ], [ {'volume' => {}}, {'0000' => {}} ] ]; my $bln = [ {content => 'author'}, {content => 'editor'} ]; my $l1 = q| \entry{L1}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelyear}{1998} \field{labelmonth}{04} \field{labelday}{05} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{05} \field{month}{04} \field{origday}{30} \field{origmonth}{10} \field{origyear}{1985} \field{title}{Title 1} \field{year}{1998} \keyw{one,two,three} \endentry |; my $l2 = q| \entry{L2}{book}{maxcitenames=3,maxbibnames=3,maxitems=2} \name{author}{1}{}{% {{uniquename=0,hash=19eec87c959944d6d9c72434a42856ba}{% family={Edwards}, family_i={E\bibinitperiod}, given={Ellison}, given_i={E\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{19eec87c959944d6d9c72434a42856ba} \strng{fullhash}{19eec87c959944d6d9c72434a42856ba} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{1998} \field{labelmonth}{04} \field{labelday}{05} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{05} \field{month}{04} \field{title}{Title 2} \field{year}{1998} \endentry |; my $l3 = q| \entry{L3}{book}{blah=10} \name{author}{1}{}{% {{uniquename=0,hash=490250da1f3b92580d97563dc96c6c84}{% family={Bluntford}, family_i={B\bibinitperiod}, given={Bunty}, given_i={B\bibinitperiod}}}% } \list{publisher}{1}{% {Oxford}% } \strng{namehash}{490250da1f3b92580d97563dc96c6c84} \strng{fullhash}{490250da1f3b92580d97563dc96c6c84} \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labelyear}{1999} \field{labelmonth}{04} \field{labelday}{05} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{05} \field{month}{04} \field{title}{Title 3} \field{year}{1999} \endentry |; ok(Biber::Config->getblxoption('uniquename') == 1, "Single-valued option") ; is_deeply(Biber::Config->getblxoption('labelnamespec'), [ {content => 'author'} ], "Multi-valued options"); ok(Biber::Config->getoption('mincrossrefs') == 88, "Setting Biber options via control file"); ok(Biber::Config->getblxoption('useprefix', 'book') == 1 , "Per-type single-valued options"); is_deeply(Biber::Config->getblxoption('labelnamespec', 'book'), $bln, "Per-type multi-valued options"); eq_or_diff($bibentries->entry('L1')->get_labeldate_info->{field}{year}, 'year', 'Global labelyear setting' ) ; eq_or_diff( $out->get_output_entry('L1', $main), $l1, 'Global labelyear setting - labelyear should be YEAR') ; eq_or_diff( $out->get_output_entry('L2', $main), $l2, 'Entry-local biblatex option mappings - 1') ; eq_or_diff( $out->get_output_entry('L3', $main), $l3, 'Entry-local biblatex option mappings - 2') ; biblatex-biber-2.4/t/related-entries.t000555000765000024 2244312667073765 20247 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 12; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('related.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $shs = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $k1 = q| \entry{key1}{article}{} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{1998} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{Journal Title} \field{number}{5} \field{relatedtype}{reprintas} \field{shorthand}{RK1} \field{title}{Original Title} \field{volume}{12} \field{year}{1998} \field{related}{78f825aaa0103319aaa1a30bf4fe3ada,3631578538a2d6ba5879b31a9a42f290} \field{pages}{125\bibrangedash 150} \range{pages}{26} \endentry |; my $k2 = q| \entry{key2}{inbook}{} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \list{location}{1}{% {Location}% } \list{publisher}{1}{% {Publisher}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{2009} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Booktitle} \field{relatedstring}{First} \field{relatedtype}{reprintof} \field{shorthand}{RK2} \field{title}{Reprint Title} \field{year}{2009} \field{related}{c2add694bf942dc77b376592d9c862cd} \field{pages}{34\bibrangedash 60} \range{pages}{27} \endentry |; my $kck1 = q| \entry{c2add694bf942dc77b376592d9c862cd}{article}{dataonly} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{clonesourcekey}{key1} \field{journaltitle}{Journal Title} \field{number}{5} \field{relatedtype}{reprintas} \field{shorthand}{RK1} \field{title}{Original Title} \field{volume}{12} \field{year}{1998} \field{related}{78f825aaa0103319aaa1a30bf4fe3ada,3631578538a2d6ba5879b31a9a42f290} \field{pages}{125\bibrangedash 150} \range{pages}{26} \endentry |; my $kck2 = q| \entry{78f825aaa0103319aaa1a30bf4fe3ada}{inbook}{dataonly} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \list{location}{1}{% {Location}% } \list{publisher}{1}{% {Publisher}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{clonesourcekey}{key2} \field{booktitle}{Booktitle} \field{relatedstring}{First} \field{relatedtype}{reprintof} \field{shorthand}{RK2} \field{title}{Reprint Title} \field{year}{2009} \field{related}{c2add694bf942dc77b376592d9c862cd} \field{pages}{34\bibrangedash 60} \range{pages}{27} \endentry |; my $kck3 = q| \entry{3631578538a2d6ba5879b31a9a42f290}{inbook}{dataonly} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \list{location}{1}{% {Location}% } \list{publisher}{1}{% {Publisher2}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{clonesourcekey}{key3} \field{booktitle}{Booktitle} \field{relatedtype}{translationof} \field{shorthand}{RK3} \field{title}{Reprint Title} \field{year}{2010} \field{related}{caf8e34be07426ae7127c1b4829983c1} \field{pages}{33\bibrangedash 57} \range{pages}{25} \endentry |; my $kck4 = q| \entry{caf8e34be07426ae7127c1b4829983c1}{inbook}{dataonly} \name{author}{1}{}{% {{hash=a517747c3d12f99244ae598910d979c5}{% family={Author}, family_i={A\bibinitperiod}}}% } \list{location}{1}{% {Location}% } \list{publisher}{1}{% {Publisher2}% } \strng{namehash}{a517747c3d12f99244ae598910d979c5} \strng{fullhash}{a517747c3d12f99244ae598910d979c5} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{clonesourcekey}{key4} \field{booktitle}{Booktitle} \field{shorthand}{RK4} \field{title}{Orig Language Title} \field{year}{2011} \field{pages}{33\bibrangedash 57} \range{pages}{25} \endentry |; my $c1 = q| \entry{c1}{book}{} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{related}{9ab62b5ef34a985438bfdf7ee0102229} \endentry |; my $c2k = q| \entry{9ab62b5ef34a985438bfdf7ee0102229}{book}{dataonly} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{clonesourcekey}{c2} \field{related}{0a3d72134fb3d6c024db4c510bc1605b} \endentry |; my $c3k = q| \entry{0a3d72134fb3d6c024db4c510bc1605b}{book}{dataonly} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{clonesourcekey}{c3} \field{related}{9ab62b5ef34a985438bfdf7ee0102229} \endentry |; eq_or_diff( $out->get_output_entry('key1', $main), $k1, 'Related entry test 1' ) ; eq_or_diff( $out->get_output_entry('key2', $main), $k2, 'Related entry test 2' ) ; # Key k3 is used only to create a related entry clone but since it isn't cited itself # it shouldn't be in the .bbl eq_or_diff( $out->get_output_entry('key3', $main), undef, 'Related entry test 3' ) ; eq_or_diff( $out->get_output_entry('c2add694bf942dc77b376592d9c862cd', $main), $kck1, 'Related entry test 4' ) ; eq_or_diff( $out->get_output_entry('78f825aaa0103319aaa1a30bf4fe3ada', $main), $kck2, 'Related entry test 5' ) ; eq_or_diff( $out->get_output_entry('3631578538a2d6ba5879b31a9a42f290', $main), $kck3, 'Related entry test 6' ) ; eq_or_diff( $out->get_output_entry('caf8e34be07426ae7127c1b4829983c1', $main), $kck4, 'Related entry test 7' ) ; # Key k4 is used only to create a related entry clone but since it isn't cited itself # it shouldn't be in the .bbl eq_or_diff( $out->get_output_entry('key4', $main), undef, 'Related entry test 8' ) ; is_deeply([$shs->get_keys], [ "caf8e34be07426ae7127c1b4829983c1", "78f825aaa0103319aaa1a30bf4fe3ada", "3631578538a2d6ba5879b31a9a42f290", "c2add694bf942dc77b376592d9c862cd", "key1", "key2", ], 'Related entry test 9'); # Testing circular dependencies eq_or_diff( $out->get_output_entry('c1', $main), $c1, 'Related entry test 10' ) ; eq_or_diff( $out->get_output_entry('9ab62b5ef34a985438bfdf7ee0102229', $main), $c2k, 'Related entry test 11' ) ; eq_or_diff( $out->get_output_entry('0a3d72134fb3d6c024db4c510bc1605b', $main), $c3k, 'Related entry test 12' ) ; biblatex-biber-2.4/t/remote-files.t000555000765000024 1706612667073765 17560 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8' ; use Test::More; use Test::Differences; unified_diff; if ($ENV{BIBER_DEV_TESTS}) { plan tests => 3; } else { plan skip_all => 'BIBER_DEV_TESTS not set'; } use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('remote-files.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('quiet', 1); Biber::Config->setoption('nodieonerror', 1); # because the remote bibs might be messy # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $cu1 = q| \entry{citeulike:8283461}{article}{} \name{author}{4}{}{% {{uniquename=0,hash=aba7750b7045425a3cf8573f7710ec18}{% family={Marazziti}, family_i={M\bibinitperiod}, given={D.}, given_i={D\bibinitperiod}}}% {{uniquename=0,hash=1f2c257ff6c86cffeb33019b6d8598c5}{% family={Akiskal}, family_i={A\\bibinitperiod}, given={H.\bibnamedelimi S.}, given_i={H\bibinitperiod\bibinitdelim S\bibinitperiod}}}% {{uniquename=0,hash=e1b1769dbb6e7d04008811b49cd745a9}{% family={Rossi}, family_i={R\bibinitperiod}, given={A.}, given_i={A\bibinitperiod}}}% {{uniquename=0,hash=b1d8ec8b73d39a27898e50cfa3e3c676}{% family={Cassano}, family_i={C\bibinitperiod}, given={G.\bibnamedelimi B.}, given_i={G\bibinitperiod\bibinitdelim B\bibinitperiod}}}% } \strng{namehash}{7f19319e09aa3239f02eb31ec7a4aa8b} \strng{fullhash}{ee363ce5e21ebe022f83aae896dd47f9} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelyear}{1999} \field{labelmonth}{05} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{abstract}{{BACKGROUND}: The evolutionary consequences of love are so important that there must be some long-established biological process regulating it. Recent findings suggest that the serotonin ({5-HT}) transporter might be linked to both neuroticism and sexual behaviour as well as to obsessive-compulsive disorder ({OCD}). The similarities between an overvalued idea, such as that typical of subjects in the early phase of a love relationship, and obsession, prompted us to explore the possibility that the two conditions might share alterations at the level of the {5-HT} transporter. {METHODS}: Twenty subjects who had recently (within the previous 6 months) fallen in love, 20 unmedicated {OCD} patients and 20 normal controls, were included in the study. The {5-HT} transporter was evaluated with the specific binding of {3H}-paroxetine ({3H}-Par) to platelet membranes. {RESULTS}: The results showed that the density of {3H}-Par binding sites was significantly lower in subjects who had recently fallen in love and in {OCD} patients than in controls. {DISCUSSION}: The main finding of the present study is that subjects who were in the early romantic phase of a love relationship were not different from {OCD} patients in terms of the density of the platelet {5-HT} transporter, which proved to be significantly lower than in the normal controls. This would suggest common neurochemical changes involving the {5-HT} system, linked to psychological dimensions shared by the two conditions, perhaps at an ideational level.} \field{issn}{0033-2917} \field{journaltitle}{Psychological medicine} \field{month}{05} \field{number}{3} \field{title}{Alteration of the platelet serotonin transporter in romantic love.} \field{volume}{29} \field{year}{1999} \field{pages}{741\bibrangedash 745} \range{pages}{5} \verb{url} \verb http://www.biomedexperts.com/Abstract.bme/10405096 \endverb \keyw{love,romantic} \endentry |; my $dl1 = q| \entry{AbdelbarH98}{article}{} \name{author}{2}{}{% {{uniquename=0,hash=14c582ce40292affd427311ca8e3bc9c}{% family={Abdelbar}, family_i={A\bibinitperiod}, given={A.M.}, given_i={A\bibinitperiod}}}% {{uniquename=0,hash=558ac9729b484b6f378e45a86582ea1d}{% family={Hedetniemi}, family_i={H\bibinitperiod}, given={S.M.}, given_i={S\bibinitperiod}}}% } \strng{namehash}{01599a4cb58316d64208b12a07741765} \strng{fullhash}{01599a4cb58316d64208b12a07741765} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelyear}{1998} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{Artificial Intelligence} \field{title}{Approximating {MAP}s for belief networks is {NP}-hard and other theorems} \field{volume}{102} \field{year}{1998} \field{pages}{21\bibrangedash 38} \range{pages}{18} \endentry |; my $ssl = q| \entry{merleau-ponty_philosophe_2010}{incollection}{} \name{author}{1}{}{% {{uniquename=0,hash=83d062f99d033839537243075d75bad2}{% family={Merleau-Ponty}, family_i={M\bibinithyphendelim P\bibinitperiod}, given={Maurice}, given_i={M\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=ff5f90046157eecef0c22da4dac6486e}{% family={Lefort}, family_i={L\bibinitperiod}, given={Claude}, given_i={C\bibinitperiod}}}% } \list{language}{1}{% {Fransk}% } \list{location}{1}{% {Paris}% } \list{publisher}{1}{% {Éditions Gallimard}% } \strng{namehash}{83d062f99d033839537243075d75bad2} \strng{fullhash}{83d062f99d033839537243075d75bad2} \field{sortinit}{M} \field{sortinithash}{2684bec41e9697b92699b46491061da2} \field{labelyear}{2010} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{Œuvres} \field{title}{Le philosophe et son ombre} \field{year}{2010} \field{pages}{1267\bibrangedash 1289} \range{pages}{23} \keyw{Husserl,Edmund,autrui,chair,constitution,intercorporéité,l'impensé,ouverture} \endentry |; eq_or_diff( $out->get_output_entry('citeulike:8283461', $main), $cu1, 'Fetch from citeulike') ; eq_or_diff( $out->get_output_entry('AbdelbarH98', $main), $dl1, 'Fetch from plain bib download') ; eq_or_diff( $out->get_output_entry('merleau-ponty_philosophe_2010', $main), $ssl, 'HTTPS test') ; biblatex-biber-2.4/t/ris.t000555000765000024 1102312667073765 15745 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8' ; use Test::More tests => 2; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; # Set up Biber object my $biber = Biber->new( configfile => 'biber-test.conf'); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('ris.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # THERE IS A CONFIG FILE BEING READ TO TEST USER MAPS TOO! # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $l1 = q| \entry{test1}{report}{} \name{author}{5}{}{% {{uniquename=0,hash=35fb6a7132629790580cd2c9c0a5ab87}{% family={Baldwin}, family_i={B\bibinitperiod}, given={S.A.}, given_i={S\bibinitperiod}}}% {{uniquename=0,hash=f8b1ae371652de603e137e413b55de78}{% family={Fugaccia}, family_i={F\bibinitperiod}, given={I.}, given_i={I\bibinitperiod}}}% {{uniquename=0,hash=86957f40459ed948ee1b4ff0ec7740f6}{% family={Brown}, family_i={B\bibinitperiod}, given={D.R.}, given_i={D\bibinitperiod}}}% {{uniquename=0,hash=baf6c971e311fa61ec2f75e93531016e}{% family={Brown}, family_i={B\bibinitperiod}, given={L.V.}, given_i={L\bibinitperiod}}}% {{uniquename=0,hash=bd289ff4276c0fc8c16a49161011c5da}{% family={Scheff}, family_i={S\bibinitperiod}, given={S.W.}, given_i={S\bibinitperiod}}}% } \strng{namehash}{deae9fead6c78a99d3f38159b0710b1f} \strng{fullhash}{bde87bef9bb3834837786f78acfebc54} \field{sortinit}{B} \field{sortinithash}{4ecbea03efd0532989d3836d1a048c32} \field{labelyear}{1996} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{J.Neurosurgery} \field{title}{Blood-brain barrier breach following cortical contusion in the rat} \field{volume}{85} \field{year}{1996} \field{pages}{476\bibrangedash 481} \range{pages}{6} \keyw{cortical contusion,blood-brain barrier,horseradish peroxidase,head trauma,hippocampus,rat} \endentry |; my $l2 = q| \entry{test2}{inbook}{} \name{author}{1}{}{% {{uniquename=0,hash=f2574dc91f1242eb0e7507a71730631b}{% family={Smith}, family_i={S\bibinitperiod}, suffix={III}, suffix_i={I\bibinitperiod}, given={John\bibnamedelima Frederick}, given_i={J\bibinitperiod\bibinitdelim F\bibinitperiod}}}% } \name{editor}{1}{}{% {{hash=c889e5c69d0c445e8f3bb0fe1ea7a19c}{% family={Brown}, family_i={B\bibinitperiod}, given={Alan}, given_i={A\bibinitperiod}}}% } \strng{namehash}{f2574dc91f1242eb0e7507a71730631b} \strng{fullhash}{f2574dc91f1242eb0e7507a71730631b} \field{sortinit}{S} \field{sortinithash}{fd1e7c5ab79596b13dbbb67f8d70fb5a} \field{labelyear}{1996} \field{labelmonth}{03} \field{labelday}{12} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{day}{12} \field{month}{03} \field{title}{Sometitle} \field{year}{1996} \field{pages}{1\bibrangedash 20} \range{pages}{20} \keyw{somevalue} \endentry |; eq_or_diff( $out->get_output_entry('test1', $main), $l1, 'Basic RIS test - 1') ; eq_or_diff( $out->get_output_entry('test2', $main), $l2, 'Basic RIS test - 2') ; biblatex-biber-2.4/t/sections-complex.t000555000765000024 2776212667073765 20465 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 64; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sections-complex.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('maxalphanames', 1); Biber::Config->setblxoption('labeldate', undef); # Now generate the information $biber->prepare; my $section0 = $biber->sections->get_section(0); my $bibentries0 = $section0->bibentries; my $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $section1 = $biber->sections->get_section(1); my $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); my $bibentries1 = $section1->bibentries; eq_or_diff($bibentries0->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=1 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main0->get_extraalphadata('L1')), 'maxalphanames=1 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries0->entry('L2')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main0->get_extraalphadata('L2'), '1', 'maxalphanames=1 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries0->entry('L3')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main0->get_extraalphadata('L3'), '2', 'maxalphanames=1 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries0->entry('L4')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L4 labelalpha'); eq_or_diff($main0->get_extraalphadata('L4'), '3', 'maxalphanames=1 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries1->entry('L5')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L5 labelalpha'); eq_or_diff($main1->get_extraalphadata('L5'), '1', 'maxalphanames=1 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries1->entry('L6')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L6 labelalpha'); eq_or_diff($main1->get_extraalphadata('L6'), '2', 'maxalphanames=1 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries1->entry('L7')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=1 minalphanames=1 entry L7 labelalpha'); eq_or_diff($main1->get_extraalphadata('L7'), '3', 'maxalphanames=1 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries1->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=1 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main1->get_extraalphadata('L8')), 'maxalphanames=1 minalphanames=1 entry L8 extraalpha'); # reset options and regenerate information Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('maxalphanames', 2); Biber::Config->setblxoption('minalphanames', 1); for (my $i=1; $i<5; $i++) { $bibentries0->entry("L$i")->del_field('sortlabelalpha'); $bibentries0->entry("L$i")->del_field('labelalpha'); $main0->set_extraalphadata_for_key("L$i", undef); } for (my $i=5; $i<9; $i++) { $bibentries1->entry("L$i")->del_field('sortlabelalpha'); $bibentries1->entry("L$i")->del_field('labelalpha'); $main1->set_extraalphadata_for_key("L$i", undef); } $biber->prepare; $section0 = $biber->sections->get_section(0); $bibentries0 = $section0->bibentries; $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $section1 = $biber->sections->get_section(1); $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); $bibentries1 = $section1->bibentries; eq_or_diff($bibentries0->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=2 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main0->get_extraalphadata('L1')), 'maxalphanames=2 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries0->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main0->get_extraalphadata('L2'), '1', 'maxalphanames=2 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries0->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main0->get_extraalphadata('L3'), '2', 'maxalphanames=2 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries0->entry('L4')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L4 labelalpha'); ok(is_undef($main0->get_extraalphadata('L4')), 'maxalphanames=2 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries1->entry('L5')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L5 labelalpha'); eq_or_diff($main1->get_extraalphadata('L5'), '1', 'maxalphanames=2 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries1->entry('L6')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L6 labelalpha'); eq_or_diff($main1->get_extraalphadata('L6'), '2', 'maxalphanames=2 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries1->entry('L7')->get_field('sortlabelalpha'), 'Doe+95', 'maxalphanames=2 minalphanames=1 entry L7 labelalpha'); eq_or_diff($main1->get_extraalphadata('L7'), '3', 'maxalphanames=2 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries1->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=2 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main1->get_extraalphadata('L8')), 'maxalphanames=2 minalphanames=1 entry L8 extraalpha'); # reset options and regenerate information Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 2); Biber::Config->setblxoption('maxalphanames', 2); Biber::Config->setblxoption('minalphanames', 2); for (my $i=1; $i<5; $i++) { $bibentries0->entry("L$i")->del_field('sortlabelalpha'); $bibentries0->entry("L$i")->del_field('labelalpha'); $main0->set_extraalphadata_for_key("L$i", undef); } for (my $i=5; $i<9; $i++) { $bibentries1->entry("L$i")->del_field('sortlabelalpha'); $bibentries1->entry("L$i")->del_field('labelalpha'); $main1->set_extraalphadata_for_key("L$i", undef); } $biber->prepare; $section0 = $biber->sections->get_section(0); $bibentries0 = $section0->bibentries; $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $section1 = $biber->sections->get_section(1); $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); $bibentries1 = $section1->bibentries; eq_or_diff($bibentries0->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=2 minalphanames=2 entry L1 labelalpha'); ok(is_undef($main0->get_extraalphadata('L1')), 'maxalphanames=2 minalphanames=2 entry L1 extraalpha'); eq_or_diff($bibentries0->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=2 entry L2 labelalpha'); eq_or_diff($main0->get_extraalphadata('L2'), '1', 'maxalphanames=2 minalphanames=2 entry L2 extraalpha'); eq_or_diff($bibentries0->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=2 minalphanames=2 entry L3 labelalpha'); eq_or_diff($main0->get_extraalphadata('L3'), '2', 'maxalphanames=2 minalphanames=2 entry L3 extraalpha'); eq_or_diff($bibentries0->entry('L4')->get_field('sortlabelalpha'), 'DA+95', 'maxalphanames=2 minalphanames=2 entry L4 labelalpha'); ok(is_undef($main0->get_extraalphadata('L4')), 'maxalphanames=2 minalphanames=2 entry L4 extraalpha'); eq_or_diff($bibentries1->entry('L5')->get_field('sortlabelalpha'), 'DA+95', 'maxalphanames=2 minalphanames=2 entry L5 labelalpha'); ok(is_undef($main1->get_extraalphadata('L5')), 'maxalphanames=2 minalphanames=2 entry L5 extraalpha'); eq_or_diff($bibentries1->entry('L6')->get_field('sortlabelalpha'), 'DS+95', 'maxalphanames=2 minalphanames=2 entry L6 labelalpha'); eq_or_diff($main1->get_extraalphadata('L6'), '1', 'maxalphanames=2 minalphanames=2 entry L6 extraalpha'); eq_or_diff($bibentries1->entry('L7')->get_field('sortlabelalpha'), 'DS+95', 'maxalphanames=2 minalphanames=2 entry L7 labelalpha'); eq_or_diff($main1->get_extraalphadata('L7'), '2', 'maxalphanames=2 minalphanames=2 entry L7 extraalpha'); eq_or_diff($bibentries1->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=2 minalphanames=2 entry L8 labelalpha'); ok(is_undef($main1->get_extraalphadata('L8')), 'maxalphanames=2 minalphanames=2 entry L8 extraalpha'); # reset options and regenerate information Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('maxalphanames', 3); Biber::Config->setblxoption('minalphanames', 1); for (my $i=1; $i<5; $i++) { $bibentries0->entry("L$i")->del_field('sortlabelalpha'); $bibentries0->entry("L$i")->del_field('labelalpha'); $main0->set_extraalphadata_for_key("L$i", undef); } for (my $i=5; $i<9; $i++) { $bibentries1->entry("L$i")->del_field('sortlabelalpha'); $bibentries1->entry("L$i")->del_field('labelalpha'); $main1->set_extraalphadata_for_key("L$i", undef); } $biber->prepare; $section0 = $biber->sections->get_section(0); $bibentries0 = $section0->bibentries; $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $section1 = $biber->sections->get_section(1); $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); $bibentries1 = $section1->bibentries; eq_or_diff($bibentries0->entry('L1')->get_field('sortlabelalpha'), 'Doe95', 'maxalphanames=3 minalphanames=1 entry L1 labelalpha'); ok(is_undef($main0->get_extraalphadata('L1')), 'maxalphanames=3 minalphanames=1 entry L1 extraalpha'); eq_or_diff($bibentries0->entry('L2')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=3 minalphanames=1 entry L2 labelalpha'); eq_or_diff($main0->get_extraalphadata('L2'), '1', 'maxalphanames=3 minalphanames=1 entry L2 extraalpha'); eq_or_diff($bibentries0->entry('L3')->get_field('sortlabelalpha'), 'DA95', 'maxalphanames=3 minalphanames=1 entry L3 labelalpha'); eq_or_diff($main0->get_extraalphadata('L3'), '2', 'maxalphanames=3 minalphanames=1 entry L3 extraalpha'); eq_or_diff($bibentries0->entry('L4')->get_field('sortlabelalpha'), 'DAE95', 'maxalphanames=3 minalphanames=1 entry L4 labelalpha'); ok(is_undef($main0->get_extraalphadata('L4')), 'maxalphanames=3 minalphanames=1 entry L4 extraalpha'); eq_or_diff($bibentries1->entry('L5')->get_field('sortlabelalpha'), 'DAE95', 'maxalphanames=3 minalphanames=1 entry L5 labelalpha'); ok(is_undef($main1->get_extraalphadata('L5')), 'maxalphanames=3 minalphanames=1 entry L5 extraalpha'); eq_or_diff($bibentries1->entry('L6')->get_field('sortlabelalpha'), 'DSE95', 'maxalphanames=3 minalphanames=1 entry L6 labelalpha'); ok(is_undef($main1->get_extraalphadata('L6')), 'maxalphanames=3 minalphanames=1 entry L6 extraalpha'); eq_or_diff($bibentries1->entry('L7')->get_field('sortlabelalpha'), 'DSJ95', 'maxalphanames=3 minalphanames=1 entry L7 labelalpha'); ok(is_undef($main1->get_extraalphadata('L7')), 'maxalphanames=3 minalphanames=1 entry L7 extraalpha'); eq_or_diff($bibentries1->entry('L8')->get_field('sortlabelalpha'), 'Sha85', 'maxalphanames=3 minalphanames=1 entry L8 labelalpha'); ok(is_undef($main1->get_extraalphadata('L8')), 'maxalphanames=3 minalphanames=1 entry L8 extraalpha'); biblatex-biber-2.4/t/sections.t000555000765000024 1067512667073765 17013 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 14; use Test::Differences; unified_diff; use Biber; use Biber::Constants; use Biber::Utils; use Biber::Output::bbl; use Unicode::Normalize; use Log::Log4perl; chdir("t/tdata"); my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sections.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('output_safechars', 1); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section0 = $biber->sections->get_section(0); my $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $shs0 = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); my $section1 = $biber->sections->get_section(1); my $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); my $shs1 = $biber->sortlists->get_list(1, 'shorthands/global', 'list', 'shorthands', 'global'); my $section2 = $biber->sections->get_section(2); my $main2 = $biber->sortlists->get_list(2, 'nty/global', 'entry', 'nty', 'global'); my $shs2 = $biber->sortlists->get_list(2, 'shorthands/global', 'list', 'shorthands', 'global'); my $section3 = $biber->sections->get_section(3); my $main3 = $biber->sortlists->get_list(3, 'nty/global', 'entry', 'nty', 'global'); my $shs3 = $biber->sortlists->get_list(3, 'shorthands/global', 'list', 'shorthands', 'global'); # Internal UTF-8 before output is always NFD so have to NFD bits of this my $preamble = [ NFD('Štring for Preamble 1'), 'String for Preamble 2', 'String for Preamble 3', 'String for Preamble 4' ]; my $v = $Biber::Config::VERSION; if ($Biber::Config::BETA_VERSION) { $v .= ' (beta)'; } my $head = qq|% \$ biblatex auxiliary file \$ % \$ biblatex bbl format version $BBL_VERSION \$ % Do not modify the above lines! % % This is an auxiliary file used by the 'biblatex' package. % This file may safely be deleted. It will be recreated by % biber as required. % \\begingroup \\makeatletter \\\@ifundefined{ver\@biblatex.sty} {\\\@latex\@error {Missing 'biblatex' package} {The bibliography requires the 'biblatex' package.} \\aftergroup\\endinput} {} \\endgroup \\preamble{% \\v{S}tring for Preamble 1% String for Preamble 2% String for Preamble 3% String for Preamble 4% } |; my $tail = qq||; is_deeply($biber->get_preamble, $preamble, 'Preamble for all sections'); eq_or_diff($section0->bibentry('sect1')->get_field('note'), 'value1', 'Section 0 macro test'); # If macros were not reset between sections, this would give a macro redef error eq_or_diff($section1->bibentry('sect4')->get_field('note'), 'value2', 'Section 1 macro test'); is_deeply([$main0->get_keys], ['sect1', 'sect2', 'sect3', 'sect8'], 'Section 0 citekeys'); is_deeply([$shs0->get_keys], ['sect1', 'sect2', 'sect8'], 'Section 0 shorthands'); is_deeply([$main1->get_keys], ['sect4', 'sect5'], 'Section 1 citekeys'); is_deeply([$shs1->get_keys], ['sect4', 'sect5'], 'Section 1 shorthands'); is_deeply([$main2->get_keys], ['sect1', 'sect6', 'sect7'], 'Section 2 citekeys'); is_deeply([$shs2->get_keys], ['sect1', 'sect6', 'sect7'], 'Section 2 shorthands'); is_deeply([$section3->get_orig_order_citekeys], ['sect1', 'sect2', 'sectall1'], 'Section 3 citekeys'); eq_or_diff($out->get_output_section(0)->number, '0', 'Checking output sections - 1'); eq_or_diff($out->get_output_section(1)->number, '1', 'Checking output sections - 2'); eq_or_diff($out->get_output_section(2)->number, '2', 'Checking output sections - 3'); eq_or_diff($out->get_output_head, $head, 'Preamble output check with output_safechars'); biblatex-biber-2.4/t/set-dynamic.t000555000765000024 1412012667073765 17366 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 7; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('set-dynamic.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $section0 = $biber->sections->get_section(0); my $main0 = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $sh0 = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); my $section1 = $biber->sections->get_section(1); my $main1 = $biber->sortlists->get_list(1, 'nty/global', 'entry', 'nty', 'global'); my $sh1 = $biber->sortlists->get_list(1, 'shorthands/global', 'list', 'shorthands', 'global'); my $out = $biber->get_output_obj; my $string1 = q| \entry{DynSet}{set}{} \set{Dynamic1,Dynamic2,Dynamic3} \name{author}{1}{}{% {{hash=252caa7921a061ca92087a1a52f15b78}{% family={Dynamism}, family_i={D\bibinitperiod}, given={Derek}, given_i={D\bibinitperiod}}}% } \strng{namehash}{252caa7921a061ca92087a1a52f15b78} \strng{fullhash}{252caa7921a061ca92087a1a52f15b78} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{2002} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{annotation}{Some Dynamic Note} \field{shorthand}{d1} \field{title}{Doing Daring Deeds} \field{year}{2002} \endentry |; my $string2 = q| \entry{Dynamic1}{book}{} \inset{DynSet} \name{author}{1}{}{% {{hash=252caa7921a061ca92087a1a52f15b78}{% family={Dynamism}, family_i={D\bibinitperiod}, given={Derek}, given_i={D\bibinitperiod}}}% } \strng{namehash}{252caa7921a061ca92087a1a52f15b78} \strng{fullhash}{252caa7921a061ca92087a1a52f15b78} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{annotation}{Some Dynamic Note} \field{shorthand}{d1} \field{title}{Doing Daring Deeds} \field{year}{2002} \endentry |; my $string3 = q| \entry{Dynamic2}{book}{} \inset{DynSet} \name{author}{1}{}{% {{hash=894a5fe6de820f5dcce84a65581667f4}{% family={Bunting}, family_i={B\bibinitperiod}, given={Brian}, given_i={B\bibinitperiod}}}% } \strng{namehash}{894a5fe6de820f5dcce84a65581667f4} \strng{fullhash}{894a5fe6de820f5dcce84a65581667f4} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{d2} \field{title}{Beautiful Birthdays} \field{year}{2010} \endentry |; my $string4 = q| \entry{Dynamic3}{book}{} \inset{DynSet} \name{author}{1}{}{% {{hash=fc3cc97631ceaecdde2aee6cc60ab42b}{% family={Regardless}, family_i={R\bibinitperiod}, given={Roger}, given_i={R\bibinitperiod}}}% } \strng{namehash}{fc3cc97631ceaecdde2aee6cc60ab42b} \strng{fullhash}{fc3cc97631ceaecdde2aee6cc60ab42b} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{d3} \field{title}{Reckless Ravishings} \field{year}{2000} \endentry |; # Labelyear is now here as skiplab is not set for this entry when cited in section # without citation of a set it is a member of my $string5 = q| \entry{Dynamic3}{book}{} \name{author}{1}{}{% {{hash=fc3cc97631ceaecdde2aee6cc60ab42b}{% family={Regardless}, family_i={R\bibinitperiod}, given={Roger}, given_i={R\bibinitperiod}}}% } \strng{namehash}{fc3cc97631ceaecdde2aee6cc60ab42b} \strng{fullhash}{fc3cc97631ceaecdde2aee6cc60ab42b} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{2000} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{d3} \field{title}{Reckless Ravishings} \field{year}{2000} \endentry |; # Make sure allkeys works with dynamic sets my @allkeys = qw(dynamic1 dynamic2 dynamic3 dynset elias1955 elias1955a elias1955b static1 static2 static3 static4); my @keys = sort map {lc()} $section0->get_citekeys; is_deeply( \@keys, \@allkeys, 'citekeys') ; eq_or_diff($out->get_output_entry('DynSet', $main0), $string1, 'Dynamic set test 1'); eq_or_diff($out->get_output_entry('Dynamic1', $main0), $string2, 'Dynamic set test 2'); eq_or_diff($out->get_output_entry('Dynamic2', $main0), $string3, 'Dynamic set test 3'); eq_or_diff($out->get_output_entry('Dynamic3', $main0), $string4, 'Dynamic set test 4'); eq_or_diff($out->get_output_entry('Dynamic3', $main0, 1), $string5, 'Dynamic set test 5'); eq_or_diff($out->get_output_entry('Dynamic1', $sh0), $string2, 'Dynamic set skipbiblist 1'); biblatex-biber-2.4/t/set-legacy.t000555000765000024 1153412667073765 17214 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 3; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('set-legacy.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $out = $biber->get_output_obj; my $string1 = q| \entry{Elias1955}{set}{} \set{Elias1955a,Elias1955b} \name{author}{1}{}{% {{hash=bdd4981ffb5a62685c993d6f9dec4c23}{% family={Elias}, family_i={E\bibinitperiod}, given={P.}, given_i={P\bibinitperiod}}}% } \strng{namehash}{bdd4981ffb5a62685c993d6f9dec4c23} \strng{fullhash}{bdd4981ffb5a62685c993d6f9dec4c23} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{1955} \field{labelmonth}{03} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{issn}{0096-1000} \field{journaltitle}{IRE Transactions on Information Theory} \field{month}{03} \field{number}{1} \field{title}{Predictive coding--I} \field{volume}{1} \field{year}{1955} \field{pages}{16\bibrangedash 24} \range{pages}{9} \verb{doi} \verb 10.1109/TIT.1955.1055126 \endverb \warn{\item Field 'crossref' is no longer needed in set entries in Biber - ignoring in entry 'Elias1955'} \endentry |; my $string2 = q| \entry{Elias1955a}{article}{} \inset{Elias1955} \name{author}{1}{}{% {{hash=bdd4981ffb5a62685c993d6f9dec4c23}{% family={Elias}, family_i={E\bibinitperiod}, given={P.}, given_i={P\bibinitperiod}}}% } \strng{namehash}{bdd4981ffb5a62685c993d6f9dec4c23} \strng{fullhash}{bdd4981ffb5a62685c993d6f9dec4c23} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{issn}{0096-1000} \field{journaltitle}{IRE Transactions on Information Theory} \field{month}{03} \field{number}{1} \field{title}{Predictive coding--I} \field{volume}{1} \field{year}{1955} \field{pages}{16\bibrangedash 24} \range{pages}{9} \verb{doi} \verb 10.1109/TIT.1955.1055126 \endverb \warn{\item Field 'entryset' is no longer needed in set member entries in Biber - ignoring in entry 'Elias1955a'} \endentry |; my $string3 = q| \entry{Elias1955b}{article}{} \inset{Elias1955} \name{author}{1}{}{% {{hash=bdd4981ffb5a62685c993d6f9dec4c23}{% family={Elias}, family_i={E\bibinitperiod}, given={P.}, given_i={P\bibinitperiod}}}% } \strng{namehash}{bdd4981ffb5a62685c993d6f9dec4c23} \strng{fullhash}{bdd4981ffb5a62685c993d6f9dec4c23} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{issn}{0096-1000} \field{journaltitle}{IRE Transactions on Information Theory} \field{month}{03} \field{number}{1} \field{title}{Predictive coding--II} \field{volume}{1} \field{year}{1955} \field{pages}{24\bibrangedash 33} \range{pages}{10} \verb{doi} \verb 10.1109/TIT.1955.1055116 \endverb \warn{\item Field 'entryset' is no longer needed in set member entries in Biber - ignoring in entry 'Elias1955b'} \endentry |; eq_or_diff($out->get_output_entry('Elias1955', $main), $string1, 'Legacy set test 1'); eq_or_diff($out->get_output_entry('Elias1955a', $main), $string2, 'Legacy set test 2'); eq_or_diff($out->get_output_entry('Elias1955b', $main), $string3, 'Legacy set test 3'); biblatex-biber-2.4/t/set-static.t000555000765000024 1244512667073765 17241 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 5; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('set-static.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $out = $biber->get_output_obj; my $string1 = q| \entry{Static1}{set}{} \set{Static2,Static3,Static4} \name{author}{1}{}{% {{hash=43874d80d7ce68027102819f16c47df1}{% family={Bumble}, family_i={B\bibinitperiod}, given={Brian}, given_i={B\bibinitperiod}}}% } \strng{namehash}{43874d80d7ce68027102819f16c47df1} \strng{fullhash}{43874d80d7ce68027102819f16c47df1} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{2001} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{annotation}{Some notes} \field{title}{Blessed Brains} \field{year}{2001} \endentry |; my $string2 = q| \entry{Static2}{book}{} \inset{Static1} \name{author}{1}{}{% {{hash=43874d80d7ce68027102819f16c47df1}{% family={Bumble}, family_i={B\bibinitperiod}, given={Brian}, given_i={B\bibinitperiod}}}% } \strng{namehash}{43874d80d7ce68027102819f16c47df1} \strng{fullhash}{43874d80d7ce68027102819f16c47df1} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{annotation}{Some Blessed Note} \field{title}{Blessed Brains} \field{year}{2001} \endentry |; my $string3 = q| \entry{Static3}{book}{} \inset{Static1} \name{author}{1}{}{% {{hash=da80091c8cd89e5269bd55af1bd5d2fa}{% family={Crenellation}, family_i={C\bibinitperiod}, given={Clive}, given_i={C\bibinitperiod}}}% } \strng{namehash}{da80091c8cd89e5269bd55af1bd5d2fa} \strng{fullhash}{da80091c8cd89e5269bd55af1bd5d2fa} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Castles and Crime} \field{year}{2002} \endentry |; my $string4 = q| \entry{Static4}{book}{} \inset{Static1} \name{author}{1}{}{% {{hash=22dafa5cd57bb5dd7f3e3bab98fd539c}{% family={Dingle}, family_i={D\bibinitperiod}, given={Derek}, given_i={D\bibinitperiod}}}% } \strng{namehash}{22dafa5cd57bb5dd7f3e3bab98fd539c} \strng{fullhash}{22dafa5cd57bb5dd7f3e3bab98fd539c} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Dungeons, Dark and Dangerous} \field{year}{2005} \endentry |; # Labelyear is now here as skiplab is not set for this entry when cited in section # without citation of a set it is a member of my $string5 = q| \entry{Static2}{book}{} \name{author}{1}{}{% {{hash=43874d80d7ce68027102819f16c47df1}{% family={Bumble}, family_i={B\bibinitperiod}, given={Brian}, given_i={B\bibinitperiod}}}% } \strng{namehash}{43874d80d7ce68027102819f16c47df1} \strng{fullhash}{43874d80d7ce68027102819f16c47df1} \field{sortinit}{0} \field{sortinithash}{990108227b3316c02842d895999a0165} \field{labelyear}{2001} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{annotation}{Some Blessed Note} \field{title}{Blessed Brains} \field{year}{2001} \endentry |; eq_or_diff($out->get_output_entry('Static1', $main), $string1, 'Static set test 1'); eq_or_diff($out->get_output_entry('Static2', $main), $string2, 'Static set test 2'); eq_or_diff($out->get_output_entry('Static3', $main), $string3, 'Static set test 3'); eq_or_diff($out->get_output_entry('Static4', $main), $string4, 'Static set test 4'); eq_or_diff($out->get_output_entry('Static2', $main, 1), $string5, 'Static set test 5'); biblatex-biber-2.4/t/skips.t000555000765000024 2116212667073765 16306 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 15; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('skips.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Now generate the information $biber->prepare; my $out = $biber->get_output_obj; my $section = $biber->sections->get_section(0); my $shs = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $bibentries = $section->bibentries; my $set1 = q| \entry{seta}{set}{} \set{set:membera,set:memberb,set:memberc} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe10} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{1} \field{labelyear}{2010} \field{datelabelsource}{} \field{extraalpha}{1} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Set Member A} \field{year}{2010} \keyw{key1,key2} \endentry |; my $set2 = q| \entry{set:membera}{book}{} \inset{seta} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Set Member A} \field{year}{2010} \keyw{key1,key2} \endentry |; my $set3 = q| \entry{set:memberb}{book}{} \inset{seta} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Set Member B} \field{year}{2010} \endentry |; my $set4 = q| \entry{set:memberc}{book}{} \inset{seta} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Set Member C} \field{year}{2010} \endentry |; my $noset1 = q| \entry{noseta}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe10} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{2} \field{labelyear}{2010} \field{datelabelsource}{} \field{extraalpha}{2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Stand-Alone A} \field{year}{2010} \endentry |; my $noset2 = q| \entry{nosetb}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe10} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{3} \field{labelyear}{2010} \field{datelabelsource}{} \field{extraalpha}{3} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Stand-Alone B} \field{year}{2010} \endentry |; my $noset3 = q| \entry{nosetc}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe10} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extrayear}{4} \field{labelyear}{2010} \field{datelabelsource}{} \field{extraalpha}{4} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Stand-Alone C} \field{year}{2010} \endentry |; my $sk4 = q| \entry{skip4}{article}{dataonly} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{AWS} \field{title}{Algorithms Which Sort} \field{year}{1932} \endentry |; is_deeply($bibentries->entry('skip1')->get_field('options'), ['skipbib'], 'Passing skipbib through'); eq_or_diff($bibentries->entry('skip2')->get_field('labelalpha'), 'SA', 'Normal labelalpha'); eq_or_diff($bibentries->entry('skip2')->get_field($bibentries->entry('skip2')->get_labeldate_info->{field}{year}), '1995', 'Normal labelyear'); ok(is_undef($bibentries->entry('skip3')->get_field('labelalpha')), 'skiplab - no labelalpha'); ok(is_undef($bibentries->entry('skip3')->get_labeldate_info), 'skiplab - no labelyear'); ok(is_undef($bibentries->entry('skip4')->get_field('labelalpha')), 'dataonly - no labelalpha'); eq_or_diff($out->get_output_entry('skip4', $main), $sk4, 'dataonly - checking output'); ok(is_undef($bibentries->entry('skip4')->get_labeldate_info), 'dataonly - no labelyear'); eq_or_diff($out->get_output_entry('seta', $main), $set1, 'Set parent - with labels'); eq_or_diff($out->get_output_entry('set:membera', $main), $set2, 'Set member - no labels 1'); eq_or_diff($out->get_output_entry('set:memberb', $main), $set3, 'Set member - no labels 2'); eq_or_diff($out->get_output_entry('set:memberc', $main), $set4, 'Set member - no labels 3'); eq_or_diff($out->get_output_entry('noseta', $main), $noset1, 'Not a set member - extrayear continues from set 1'); eq_or_diff($out->get_output_entry('nosetb', $main), $noset2, 'Not a set member - extrayear continues from set 2'); eq_or_diff($out->get_output_entry('nosetc', $main), $noset3, 'Not a set member - extrayear continues from set 3'); biblatex-biber-2.4/t/sort-case.t000555000765000024 426212667073765 17037 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 2; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata") ; my $S; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sort-case.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests Biber::Config->setoption('sortcase', 1); Biber::Config->setoption('sortupper', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); $S = [ [ {}, {'author' => {}}, ], ]; Biber::Config->setblxoption('sorting', $S); $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); is_deeply([$main->get_keys], ['CS1','CS3','CS2'], 'U::C case - 1'); $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('sort-case.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Global here is sortcase=0, sortupper=1 # title is sortcase=1, sortupper=0 # So, all names are the same and it depends on title $biber->prepare; $section = $biber->sections->get_section(0); $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); is_deeply([$main->get_keys], ['CS3','CS2','CS1'], 'U::C case - 2'); biblatex-biber-2.4/t/sort-complex.t000555000765000024 2043312667073765 17611 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 9; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sort-complex.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); # Want to ignore SHORTHAND* fields for the first few tests Biber::Config->setoption('sourcemap', [ { datatype => "bibtex", level => "user", map => [ { map_step => [{ map_field_set => "SHORTHAND", map_null => 1 }, { map_field_set => "SORTSHORTHAND", map_null => 1 }] }]}]); # Biblatex options Biber::Config->setblxoption('labeldate', undef); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $shs = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); my $out = $biber->get_output_obj; my $ss = { locale => 'en-US', spec => [ [ {}, {'presort' => {}} ], [ {'final' => 1}, {'sortkey' => {}} ], [ {}, {'labelalpha' => {}}, ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'volume' => {pad_char => '0', pad_side => 'left', pad_width => '4'}}, {'0000' => {}} ], ]}; my $l4 = q| \entry{L4}{book}{} \true{moreauthor} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {Another press}% } \strng{namehash}{6eb389989020e8246fee90ac93fcecbe} \strng{fullhash}{6eb389989020e8246fee90ac93fcecbe} \field{labelalpha}{Doe\textbf{+}95} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extraalpha}{2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Some title about sorting} \field{year}{1995} \endentry |; my $l1 = q| \entry{L1}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe95} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extraalpha}{1} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Algorithms For Sorting} \field{year}{1995} \endentry |; my $l2 = q| \entry{L2}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe95} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extraalpha}{3} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Sorting Algorithms} \field{year}{1995} \endentry |; my $l3 = q| \entry{L3}{book}{} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {A press}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{Doe95} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extraalpha}{2} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{More and More Algorithms} \field{year}{1995} \endentry |; my $l5 = q| \entry{L5}{book}{} \true{moreauthor} \name{author}{1}{}{% {{hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \list{location}{1}{% {Cambridge}% } \list{publisher}{1}{% {Another press}% } \strng{namehash}{6eb389989020e8246fee90ac93fcecbe} \strng{fullhash}{6eb389989020e8246fee90ac93fcecbe} \field{labelalpha}{Doe\textbf{+}95} \field{sortinit}{D} \field{sortinithash}{78f7c4753a2004675f316a80bdb31742} \field{extraalpha}{1} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Some other title about sorting} \field{year}{1995} \endentry |; is_deeply( $main->get_sortscheme , $ss, 'sort scheme'); eq_or_diff( $out->get_output_entry('L4', $main), $l4, '\alphaothers set by "and others"'); eq_or_diff( $out->get_output_entry('L1', $main), $l1, 'bbl test 1'); eq_or_diff( $out->get_output_entry('L2', $main), $l2, 'bbl test 2'); eq_or_diff( $out->get_output_entry('L3', $main), $l3, 'bbl test 3'); eq_or_diff( $out->get_output_entry('L5', $main), $l5, 'bbl test 4'); is_deeply([ $main->get_keys ], ['L5', 'L4', 'L1', 'L3', 'L2'], 'sortorder - 1'); # This would be the same as $main citeorder as both $main and $shs use same # global sort spec but here it's null because we've removed all shorthands using a map # above and the filter for the shorthand list only uses entries with SHORTHAND fields ... is_deeply([ $shs->get_keys ], [], 'sortorder - 2'); # reset options and regenerate information Biber::Config->setoption('sourcemap', undef); # no longer ignore shorthand* # Need to reset all entries due to "skip if already in Entries" # clause in bibtex.pm. Need to clear the cache as we've modified the T::B objects # by the sourcemap. Need to clear everykeys otherwise we'll just skip the keys $bibentries->del_entries; $section->del_everykeys; Biber::Input::file::bibtex->init_cache; Biber::Config->setoption('fastsort', 0); $biber->prepare; $section = $biber->sections->get_section(0); $shs = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); # Sort by shorthand is_deeply([ $shs->get_keys ], ['L1', 'L2', 'L3', 'L4', 'L5'], 'sortorder - 3'); biblatex-biber-2.4/t/sort-order.t000555000765000024 7167212667073765 17270 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 15; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); my $S; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sort-order.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('fastsort', 1); Biber::Config->setblxoption('labelyear', undef); Biber::Config->setblxoption('labelalpha', 0); # (re)generate informtion based on option settings $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); is_deeply([ $main->get_keys ], ['L2','L3','L1B','L1','L4','L5','L1A','L7','L8','L6','L9'], 'citeorder'); # nty $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([ $main->get_keys ], ['L5','L1A','L1','L1B','L2','L3','L4','L8','L7','L6','L9'], 'nty'); # nyt $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L5','L1A','L1','L1B','L2','L3','L4','L8','L7','L6','L9'], 'nyt'); # nyvt $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L5','L1','L1A','L1B','L2','L3','L4','L8','L7','L6','L9'], 'nyvt'); # nyvt with volume padding $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'volume' => {pad_side => 'right'}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L5','L1A','L1','L1B','L2','L3','L4','L8','L7','L6','L9'], 'nyvt with volume padding'); # ynt $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'9999' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L3','L1B','L1A','L1','L4','L2','L8','L7','L6','L9','L5'], 'ynt'); # ynt with year substring $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {'substring_side' => 'left', 'substring_width' => 3}}, {'9999' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L3','L1B','L1A','L1','L2','L4','L8','L7','L6','L9','L5'], 'ynt with year substring'); # ydnt $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {sort_direction => 'descending'}, {'sortyear' => {}}, {'year' => {}}, {'9999' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); # This is correct as "aaaaaa" sorts before all years when descending is_deeply([$main->get_keys], ['L5','L9','L6','L7','L8','L2','L4','L1A','L1','L1B','L3'], 'ydnt'); # anyt $S = { spec => [ [ {}, {'presort' => {}} ], [ {}, {'labelalpha' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); Biber::Config->setblxoption('labelalpha', 1); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L1B','L1A','L1','L2','L3','L4','L5','L8','L7','L6','L9'], 'anyt'); Biber::Config->setblxoption('labelalpha', 0); # anyvt $S = { spec => [ [ {}, {'presort' => {}} ], [ {}, {'labelalpha' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); Biber::Config->setblxoption('labelalpha', 1); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L1B','L1','L1A','L2','L3','L4','L5','L8','L7','L6','L9'], 'anyvt'); # nty with descending n $S = { spec => [ [ {sort_direction => 'descending'}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}}, {'0000' => {}} ], ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L9','L6','L7','L8','L5','L4','L3','L2','L1B','L1A','L1'], 'nty with descending n'); # testing case sensitive with fastsort # In alphabetic, all uppercase comes before lower so the # "sortcase => 1" on location means that "edinburgh" sorts at the end after "London" # Take this out of the location sorting spec and it fails as it should $S = { spec => [ [ {sortcase => 1}, {'location' => {}} ] ]}; $main->set_sortscheme($S); $biber->set_output_obj(Biber::Output::bbl->new()); # Have to set locale to something which understands lexical/case differences for this test # otherwise testing on Windows doesn't work ... Biber::Config->setoption('sortlocale', 'C.UTF-8'); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L1B','L1','L1A','L2','L3','L4','L5','L7','L8','L9','L6'], 'location - sortcase=1'); # Test nosort option $S = { spec => [ [ {}, {'title' => {}} ] ]}; $main->set_sortscheme($S); # Set nosort for tests, skipping "The " in titles so L7 should sort before L6 Biber::Config->setoption('nosort', [{ name => 'type_title', value => q/\AThe\s+/ }]); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L1A','L1','L1B','L2','L3','L4','L5','L7','L6','L9','L8'], 'nosort 1'); # Testing sorting keys which have the same order as they were cited in the same \cite*{} cmd. # In this case, they will be tied on sorting=none and can be further sorted by other fields $S = { spec => [ [ {}, {'citeorder' => {}} ], [ {}, {'year' => {}} ], ]}; $main->set_sortscheme($S); # Have to do a citekey deletion as we are not re-reading the .bcf which would do it for us # Otherwise, we have citekeys and allkeys which confuses fetch_data() $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([ $main->get_keys ], ['L3','L2','L1B','L1','L4','L5','L1A','L7','L8','L6','L9'], 'sorting=none + year'); # Testing special case of sorting=none and allkeys because in this case "citeorder" means # bib order $S = { spec => [ [ {}, {'citeorder' => {}} ], ]}; $main->set_sortscheme($S); # Have to do a citekey deletion as we are not re-reading the .bcf which would do it for us # Otherwise, we have citekeys and allkeys which confuses fetch_data() $section->del_citekeys; Biber::Config->reset_keyorder(0); $section->set_allkeys(1); $biber->set_output_obj(Biber::Output::bbl->new()); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['L1','L1A','L1B','L2','L3','L4','L5','L6','L7','L8','L9'], 'sorting=none and allkeys'); biblatex-biber-2.4/t/sort-uc.t000555000765000024 1143712667073765 16555 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 6; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); my $S; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sort-uc.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests Biber::Config->setoption('sortlocale', 'sv_SE.UTF-8'); # U::C Swedish tailoring $biber->prepare; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $shs = $biber->sortlists->get_list(0, 'shorthands/global', 'list', 'shorthands', 'global'); # Shorthands are sorted by shorthand (as per bcf) is_deeply([$main->get_keys], ['LS6','LS5','LS2','LS1','LS3','LS4'], 'U::C tailoring - 1'); is_deeply([$shs->get_keys], ['LS3', 'LS4','LS2','LS1'], 'U::C tailoring - 2'); # Set sorting of shorthands to global sorting default $shs->set_sortscheme(Biber::Config->getblxoption('sorting')); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$shs->get_keys], ['LS2', 'LS1','LS3','LS4'], 'U::C tailoring - 3'); # Descending name in Swedish collation $S = { spec => [ [ {}, {'presort' => {}} ], [ {final => 1}, {'sortkey' => {}} ], [ {sort_direction => 'descending'}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['LS3','LS4','LS1','LS2','LS5','LS6'], 'U::C tailoring descending - 1'); # Local lower before upper setting $S = { spec => [ [ {sortupper => 0}, {'title' => {}} ] ]}; $main->set_sortscheme($S); $biber->prepare; $section = $biber->sections->get_section(0); is_deeply([$main->get_keys], ['LS5', 'LS6', 'LS4', 'LS3','LS2','LS1'], 'upper_before_lower locally false'); # Local case insensitive negates the sortupper being false as this no longer # means anything so it reverts to bib order for LS3 and LS4 # For this, have to reparse the .bcf otherwise the citekey order from previous # test is kept for things that are not sort distinguishable $biber->parse_ctrlfile('sort-uc.bcf'); $section = $biber->sections->get_section(0); $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); $biber->set_output_obj(Biber::Output::bbl->new()); $S = { spec => [ [ {sortupper => 0, sortcase => 0}, {'title' => {}} ] ]}; $main->set_sortscheme($S); $biber->prepare; is_deeply([$main->get_keys], ['LS5', 'LS6','LS3', 'LS4','LS2','LS1'], 'sortcase locally false, upper_before_lower locally false'); biblatex-biber-2.4/t/sorting.t000555000765000024 10255212667073765 16665 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 44; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile("general.bcf"); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); my $yearoff1 = 'mm,,Knuth!Donald E,Computers Typesetting,1984,0000'; my $yearoff2 = 'mm,,Knuth!Donald E,Computers Typesetting,198,0000'; my $yearoff3 = 'mm,,Knuth!Donald E,Computers Typesetting,1984,0000'; my $yearoff4 = 'mm,,Knuth!Donald E,Computers Typesetting,984,0000'; my $yearoff5 = 'mm,,Knuth!Donald E,Computers Typesetting,1984,0000'; my $yearoff6 = 'mm,,Knuth!Donald E,Computers Typesetting,1984,0000'; my $yearoff7 = 'mm,,Knuth!Donald E,Computers Typesetting,198,0000'; my $yearoff8 = 'mm,,Knuth!Donald E,Computers Typesetting,1984,0000'; my $yearoff9 = 'mm,,Knuth!Donald E,Computers Typesetting,984,0000'; my $vol1 = 'mm,,Glashow!Sheldon,Partial Symmetries of Weak Interactions,1961,2200'; my $vol2 = 'mm,,Glashow!Sheldon,Partial Symmetries of Weak Interactions,1961,2200000'; my $vol3 = 'mm,,Glashow!Sheldon,Partial Symmetries of Weak Interactions,1961,ĐĐĐ22'; my $nty = 'mm,,Glashow!Sheldon,Partial Symmetries of Weak Interactions,1961,22'; my $nyt = 'mm,,Glashow!Sheldon,1961,Partial Symmetries of Weak Interactions,22'; my $nyvt = 'mm,,Glashow!Sheldon,1961,22,Partial Symmetries of Weak Interactions'; my $anyt_la = 'mm,Gla61,,Glashow!Sheldon,1961,Partial Symmetries of Weak Interactions,0000'; my $anyt = 'mm,,,Glashow!Sheldon,1961,Partial Symmetries of Weak Interactions,0000'; my $anyvt_la = 'mm,Gla61,,Glashow!Sheldon,1961,0022,Partial Symmetries of Weak Interactions'; my $anyvt_la2 = "mm,Hos+98,,Hostetler!Michael J\x{10FFFD},1998,0014,Alkanethiolate gold cluster molecules with core diameters from 15 to 52 nm"; my $anyvt_la3 = "mm,HW98,,Hostetler!Michael J#Wingate!Julia E\x{10FFFD},1998,0014,Alkanethiolate gold cluster molecules with core diameters from 15 to 52 nm"; my $anyvt_la4 = "mm,HW+98,,Hostetler!Michael J#Wingate!Julia E\x{10FFFD},1998,0014,Alkanethiolate gold cluster molecules with core diameters from 15 to 52 nm"; my $anyvt = 'mm,,,Glashow!Sheldon,1961,0022,Partial Symmetries of Weak Interactions'; my $ynt = 'mm,,1961,Glashow!Sheldon,Partial Symmetries of Weak Interactions'; my $ydnt = 'mm,,1961,Glashow!Sheldon,Partial Symmetries of Weak Interactions'; my $sortinits = 'mm,,1961,Glashow!S,Partial Symmetries of Weak Interactions'; my $debug = 'stdmodel'; my $sk1 = 'mm,,AATESTKEY,AATESTKEY,AATESTKEY,AATESTKEY'; my $ps_sc = 'zs,,Partial Symmetries of Weak Interactions,,Partial Symmetries of Weak Interactions,Partial Symmetries of Weak Interactions'; my $noname = 'mm,,Partial Symmetries of Weak Interactions,Partial Symmetries of Weak Interactions,1961,22'; my $citeorder = '0000001'; my $lists1 = 'Marcel Dekker'; my $lists2 = 'Chichester'; my $lists3 = "IBM\x{10FFFD}"; my $lists4 = "IBM!HP\x{10FFFD}"; my $lists5 = 'IBM!HP!Sun!Sony'; my $dates1 = '1979,01,0200000,1980,04,08,1924,06,07,1924,07,09,1924,0002,05,192,02,03,1979,03,04,79,03,03'; my $edtypeclass1 = 'redactor,Jaffé!Philipp,Loewenfeld!Samuel#Kaltenbrunner!Ferdinand#Ewald!Paul'; my $prefix1 = 'mm,,Luzzatto!Moshe Ḥayyim,,,Lashon laRamḥal uvo sheloshah ḥiburim,2000,0000'; my $diacritic1 = 'mm,,Hasan!Alī,alHasan!ʿAlī,Hasan!Alī,Some title,2000,0000'; my $labels = '2005,03,02'; my $sn1 = ''; my $snk1 = 'mm,,John John!von!Doe!Jr,,,0000'; # These have custom presort and also an exclusion on year and title set my $useprefix1 = 'ww,,von!Bobble!Terrence,,,0000'; my $useprefix2 = 'ww,,Bobble!Terrence!von,,,0000'; Biber::Config->setblxoption('useprefix', 1); # regenerate information $biber->prepare; my $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($main->get_sortdata('tvonb')->[0], $useprefix1, 'von with type-specific presort, exclusions and useprefix=true' ); # Testing custom name sorting key my $SNK; $SNK = {global => [ [{ type => 'namepart', value => 'given' }, { type => 'literal', value => ' ' }, { type => 'namepart', value => 'given' }], [{ type => 'namepart', value => 'prefix', use => 1}], [{ type => 'namepart', value => 'family'}], [{ type => 'namepart', value => 'suffix'}], [{ type => 'namepart', value => 'prefix', use => 0}] ]}; Biber::Config->setblxoption('sortingnamekey', $SNK); $biber->prepare; eq_or_diff($main->get_sortdata('snk1')->[0], $snk1, 'Sorting name key - 1' ); # regenerate information Biber::Config->setblxoption('useprefix', 0); # Default name sorting key back again $SNK = {global => [ [{ type => 'namepart', value => 'prefix', use => 1}], [{ type => 'namepart', value => 'family'}], [{ type => 'namepart', value => 'given' }], [{ type => 'namepart', value => 'suffix'}], [{ type => 'namepart', value => 'prefix', use => 0}] ]}; Biber::Config->setblxoption('sortingnamekey', $SNK); $biber->prepare; eq_or_diff($main->get_sortdata('tvonb')->[0], $useprefix2, 'von with type-specific presort, exclusions and useprefix=false' ); my $S; # Testing nosort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'editor' => {}}, ], [ {}, {'translator' => {}}, ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'labelyear' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); Biber::Config->setoption('nosort', [ { name => 'author', value => q/\A\p{L}{2}\p{Pd}/ }, { name => 'author', value => q/[\x{2bf}\x{2018}]/ }, { name => 'translator', value => q/\A\p{L}{2}\p{Pd}/ }, { name => 'translator', value => q/[\x{2bf}\x{2018}]/ }, # type_title should be not used as there is an # explicit title nosort { name => 'type_title', value => q/\A.*/ }, { name => 'title', value => q/\A\p{L}{2}\p{Pd}/ } ]); Biber::Config->setoption('sortcase', '1'); # regenerate information $biber->prepare; eq_or_diff(NFC($main->get_sortdata('luzzatto')->[0]), $prefix1, 'Title with nosort' ); eq_or_diff(NFC($main->get_sortdata('hasan')->[0]), $diacritic1, 'Name with nosort' ); # Testing editor roles $S = {spec => [ [ {}, {'editoratype' => {}}, ], [ {}, {'editor' => {}}, ], [ {}, {'editora' => {}}, ], ]}; $main->set_sortscheme($S); Biber::Config->setoption('sortcase', 0); # regenerate information $biber->prepare; eq_or_diff(NFC($main->get_sortdata('jaffe')->[0]), $edtypeclass1, 'Editor type/class' ); # Testing sorting using various date fields $S = {spec => [ [ {}, {'year' => {}}, ], [ {}, {'month' => {}}, ], [ {}, {'day' => {pad_side => 'right', pad_width => 7}}, ], [ {}, {'endyear' => {}}, ], [ {}, {'endmonth' => {}}, ], [ {}, {'endday' => {}}, ], [ {}, {'origyear' => {'sort_direction' => 'descending'}} ], [ {}, {'origmonth' => {}} ], [ {}, {'origday' => {}} ], [ {}, {'origendyear' => {}} ], [ {}, {'origendmonth' => {}} ], [ {}, {'origendday' => {}} ], [ {}, {'eventendyear' => {}} ], [ {}, {'eventendmonth' => {pad_side => 'left', pad_width => 4}} ], [ {}, {'eventendday' => {}} ], [ {}, {'eventyear' => {'substring_side' => 'left', 'substring_width' => 3}} ], [ {}, {'eventmonth' => {}} ], [ {}, {'eventday' => {}} ], [ {sort_direction => 'descending'}, {'urlendyear' => {}} ], [ {}, {'urlendmonth' => {}} ], [ {}, {'urlendday' => {}} ], [ {}, {'urlyear' => {'substring_side' => 'right', 'substring_width' => 2}} ], [ {}, {'urlmonth' => {}} ], [ {}, {'urlday' => {}} ], ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('moraux')->[0], $dates1, 'Very contrived but thorough test of date sorting' ); # Testing max/minITEMS with sorting using list fields # publisher $S = {spec => [ [ {}, {'publisher' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('augustine')->[0], $lists1, 'max/minitems test 1 (publisher)' ); # location $S = {spec => [ [ {}, {'location' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('cotton')->[0], $lists2, 'max/minitems test 2 (location)' ); # institution $S = {spec => [ [ {}, {'institution' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('chiu')->[0], $lists3, 'max/minitems test 3 (institution)' ); # institution with minitems=2 Biber::Config->setblxoption('minitems', 2); $S = {spec => [ [ {}, {'institution' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('chiu')->[0], $lists4, 'max/minitems test 4 (institution - minitems=2)' ); # institution with maxitems=4, minitems=3 Biber::Config->setblxoption('maxitems', 4); Biber::Config->setblxoption('minitems', 3); $S = {spec => [ [ {}, {'institution' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('chiu')->[0], $lists5, 'max/minitems test 5 (institution - maxitems=4/minitems=3)' ); # nty with implicit default left, 4-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff1, 'nty with default left offset, 4 digit year' ); # nty with left, 3-digit year sort, case sensitive $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'left', 'substring_width' => 3}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); Biber::Config->setoption('sortcase', 1); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff2, 'nty with left offset, 3 digit year, case sensitive' ); # nty with left, 4-digit year sort, case sensitive $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'left', 'substring_width' => 4}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff3, 'nty with left offset, 4 digit year, case sensitive' ); # nty with right, 3-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'right', 'substring_width' => 3}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); Biber::Config->setoption('sortcase', 0); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff4, 'nty with right offset, 3 digit year' ); # nty with right, 4-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'right', 'substring_width' => 4}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff5, 'nty with right offset, 4 digit year' ); # ntyd with left, 4-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'left', 'substring_width' => 4, 'sort_direction' => 'descending'}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff6, 'ntyd with left offset, 4 digit year' ); # ntyd with left, 3-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'left', 'substring_width' => 3, 'sort_direction' => 'descending'}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff7, 'ntyd with left offset, 3 digit year' ); # ntyd with right, 4-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'right', 'substring_width' => 4, 'sort_direction' => 'descending'}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff8, 'ntyd with right offset, 4 digit year' ); # ntyd with right, 3-digit year sort $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'year' => {'substring_side' => 'right', 'substring_width' => 3, 'sort_direction' => 'descending'}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('knuth:ct')->[0], $yearoff9, 'ntyd with right offset, 3 digit year' ); # nty with right-padded vol $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {pad_side => 'right'}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $vol1, 'nty with right-padded vol' ); # nty with right-padded 7-char vol $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {pad_side => 'right', pad_width => 7}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $vol2, 'nty with right-padded 7-char vol' ); # nty with left-padded 5-char using Unicode "Đ" as pad_char vol # Unicode char will be lowercase "đ" in sortstring $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {pad_side => 'left', pad_width => 5, pad_char => 'Đ'}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $vol3, 'nty with left-padded 5-char "a" pad char vol' ); # nty $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $nty, 'basic nty sort' ); eq_or_diff($main->get_sortdata('angenendtsk')->[0], $sk1, 'basic sortkey sort' ); # nyt $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'labelname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $nyt, 'basic nyt sort' ); # nyvt $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $nyvt, 'basic nyvt sort' ); # anyt with labelalpha Biber::Config->setblxoption('labelalpha', 1); $S = {spec => [ [ {}, {'presort' => {}} ], [ {}, {'labelalpha' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $anyt_la, 'anyt sort (with labelalpha)' ); Biber::Config->setblxoption('labelalpha', 0); $bibentries->entry('stdmodel')->del_field('labelalpha'); $bibentries->entry('stdmodel')->del_field('sortlabelalpha'); $bibentries->entry('stdmodel:glashow')->del_field('labelalpha'); # it's a crossref so have to clear it here too $bibentries->entry('stdmodel:glashow')->del_field('sortlabelalpha'); # anyt without labelalpha # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $anyt, 'anyt sort (without labelalpha)' ); # anyvt with labelalpha Biber::Config->setblxoption('labelalpha',1); $S = {spec => [ [ {}, {'presort' => {}} ], [ {}, {'labelalpha' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {pad_width => 4}}, {'0000' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $anyvt_la, 'anyvt sort (with labelalpha)' ); eq_or_diff($main->get_sortdata('murray')->[0], $anyvt_la2, 'anyvt sort (> maxbibnames=3 minbibnames=1, with labelalpha and alphaothers)' ); Biber::Config->setblxoption('maxalphanames', 2); Biber::Config->setblxoption('minalphanames', 2); Biber::Config->setblxoption('maxbibnames', 2); Biber::Config->setblxoption('minbibnames', 2); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('murray')->[0], $anyvt_la4, 'anyvt sort (> maxbibnames=2 minbibnames=2, with labelalpha and alphaothers)' ); Biber::Config->setblxoption('alphaothers', ''); Biber::Config->setblxoption('sortalphaothers', ''); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('murray')->[0], $anyvt_la3, 'anyvt sort (> maxbibnames=2 minbibnames=2,with labelalpha and without alphaothers)' ); Biber::Config->setblxoption('labelalpha', 0); $bibentries->entry('stdmodel')->del_field('labelalpha'); $bibentries->entry('stdmodel')->del_field('sortlabelalpha'); $bibentries->entry('stdmodel:glashow')->del_field('labelalpha'); # it's a crossref so have to clear it here too $bibentries->entry('stdmodel:glashow')->del_field('sortlabelalpha'); $bibentries->entry('murray')->del_field('labelalpha'); $bibentries->entry('murray')->del_field('sortlabelalpha'); # anyvt without labelalpha # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $anyvt, 'anyvt sort (without labelalpha)' ); # ynt $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortyear' => {}}, {'labelyear' => {}}, {'9999' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $ynt, 'basic ynt sort' ); # ydnt $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {sort_direction => 'descending'}, {'sortyear' => {}}, {'year' => {}}, {'9999' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $ydnt, 'basic ydnt sort' ); Biber::Config->setoption('sortgiveninits', 1); $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $sortinits, 'sort first name inits only' ); Biber::Config->setoption('sortgiveninits', 0); Biber::Config->setblxoption('labelalpha', 0); # debug $S = {spec => [ [ {}, {'entrykey' => {}}, ], ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $debug, 'basic debug sort' ); # nty with use* all off Biber::Config->setblxoption('useauthor', 0); Biber::Config->setblxoption('useeditor', 0); Biber::Config->setblxoption('usetranslator', 0); $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $noname, 'nty with use* all off' ); # nty with modified presort and short_circuit at title $S = {spec => [ [ {}, {'presort' => {}} ], [ {final => 1, }, {'sortkey' => {}} ], [ {}, {'sortname' => {}}, {'author' => {}}, {'editor' => {}}, {'translator' => {}}, {'sorttitle' => {}}, {'title' => {}} ], [ {final => 1, }, {'sorttitle' => {}}, {'title' => {}} ], [ {}, {'sortyear' => {}}, {'year' => {}} ], [ {}, {'volume' => {}}, {'0000' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel:ps_sc')->[0], $ps_sc, 'nty with modified presort and short-circuit title' ); # citeorder sort $S = {spec => [ [ {}, {'citeorder' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('stdmodel')->[0], $citeorder, 'citeorder' ); # citeorder sort $S = {spec => [ [ {}, {'labelyear' => {}}, ], [ {}, {'labelmonth' => {}}, ], [ {}, {'labelday' => {}} ] ]}; $main->set_sortscheme($S); # regenerate information $biber->prepare; eq_or_diff($main->get_sortdata('labelstest')->[0], $labels, 'date labels' ); # sortname sort $S = {spec => [ [ {}, {'sortname' => {}}, {'author' => {}}, ] ]}; $main->set_sortscheme($S); Biber::Config->setblxoption('useauthor', 0); Biber::Config->setblxoption('useeditor', 0); Biber::Config->setblxoption('usetranslator', 0); Biber::Config->setblxoption('usenamea', 0); Biber::Config->setblxoption('useeditora', 0); $biber->prepare; # Testing that when no use settings are true, sortname is ignored eq_or_diff($main->get_sortdata('sn1')->[0], $sn1, 'Sortname - 1' ); biblatex-biber-2.4/t/sortlists.t000555000765000024 1305412667073765 17224 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 14; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); my $S; # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('sortlists.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); my $main = $biber->sortlists->get_list(0, 'lname', 'entry', 'lname', 'given'); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests Biber::Config->setoption('bcf', 'sortlists.bcf'); # (re)generate informtion based on option settings $biber->prepare; my $section = $biber->sections->get_section(0); my $out = $biber->get_output_obj; is_deeply([$biber->sortlists->get_list(0, 'lname', 'entry', 'lname', 'global')->get_keys], ['K11', 'K1', 'K2', 'K4', 'K3', 'K7', 'K8', 'K9', 'K10', 'K12', 'K5', 'K6'], 'List - name order'); is_deeply([$biber->sortlists->get_list(0, 'lyear', 'entry', 'lyear', 'global')->get_keys], ['K4', 'K1', 'K11', 'K12', 'K2', 'K3', 'K6', 'K5', 'K7', 'K8', 'K9', 'K10'], 'List - year order'); is_deeply([$biber->sortlists->get_list(0, 'ltitle', 'entry', 'ltitle', 'global')->get_keys], ['K1', 'K7', 'K8', 'K9', 'K4', 'K10', 'K2', 'K11', 'K6', 'K5', 'K12', 'K3'], 'List - title order'); is_deeply([$biber->sortlists->get_list(0, 'lnamef1', 'entry', 'lnamef1', 'global')->get_keys], ['K11', 'K2', 'K4', 'K12', 'K5', 'K6'], 'List - name order (filtered) - 1'); is_deeply([$biber->sortlists->get_list(0, 'lnamef2', 'entry', 'lnamef2', 'global')->get_keys], ['K4'], 'List - name order (filtered) - 2'); is_deeply([$biber->sortlists->get_list(0, 'lnamef3', 'entry', 'lnamef3', 'global')->get_keys], ['K11', 'K1', 'K2', 'K7', 'K12', 'K5', 'K6'], 'List - name order (filtered) - 3'); is_deeply([$biber->sortlists->get_list(0, 'lnamef4', 'entry', 'lnamef4', 'global')->get_keys], ['K3'], 'List - name order (filtered) - 4'); is_deeply([$biber->sortlists->get_list(0, 'lnamef5', 'entry', 'lnamef5', 'global')->get_keys], ['K1', 'K3'], 'List - name order (filtered) - 5'); # Test list-local locale sorting is_deeply([$biber->sortlists->get_list(0, 'lnameswe', 'entry', 'lnameswe', 'global')->get_keys], ['K11', 'K1', 'K2', 'K4', 'K3', 'K7', 'K8', 'K9', 'K10', 'K12', 'K6', 'K5'], 'List - name order (swedish)'); is_deeply([$biber->sortlists->get_list(0, 'ltitlespan', 'entry', 'ltitlespan', 'global')->get_keys], ['K1', 'K4', 'K10', 'K7', 'K8', 'K9', 'K2', 'K11', 'K6', 'K5', 'K12', 'K3'], 'List - title order (spanish)'); # Test sortset-local locale sorting is_deeply([$biber->sortlists->get_list(0, 'ltitleset', 'entry', 'ltitleset', 'global')->get_keys], ['K1', 'K7', 'K9', 'K8', 'K4', 'K10', 'K2', 'K11', 'K6', 'K5', 'K12', 'K3'], 'List - granular locale (spanish)'); # Testing sorting name key schemes # Note that: # * K6 has an entry scope override which makes it sort with family first despite the # 'given' name key scheme using the given name first. # * K11 has a name list scope override which forces "a" literal first # * K12 has a name scope override which forces "Z" literal first is_deeply([$biber->sortlists->get_list(0, 'lname', 'entry', 'lname', 'given')->get_keys], ['K11', 'K1', 'K2', 'K4', 'K3', 'K7', 'K5', 'K8', 'K9', 'K10', 'K12', 'K6'], 'List - sorting name key schemes - 1'); my $K11 = q| \entry{K11}{book}{} \name{author}{1}{sortnamekeyscheme=snk1}{% {{hash=4edc280a0ef229f9c061e3b121b17482}{% family={Xanax}, family_i={X\bibinitperiod}, given={Xavier}, given_i={X\bibinitperiod}}}% } \list{location}{1}{% {Moscow}% } \list{publisher}{1}{% {Publisher}% } \strng{namehash}{4edc280a0ef229f9c061e3b121b17482} \strng{fullhash}{4edc280a0ef229f9c061e3b121b17482} \field{sortinit}{a} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \field{labelyear}{1983} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{One} \field{year}{1983} \endentry |; my $K12 = q| \entry{K12}{book}{} \name{author}{1}{}{% {{sortnamekeyscheme=snk2,hash=a846a485fc9cbb59b0ebeedd6ac637e4}{% family={Allen}, family_i={A\bibinitperiod}, given={Arthur}, given_i={A\bibinitperiod}}}% } \list{location}{1}{% {Moscow}% } \list{publisher}{1}{% {Publisher}% } \strng{namehash}{a846a485fc9cbb59b0ebeedd6ac637e4} \strng{fullhash}{a846a485fc9cbb59b0ebeedd6ac637e4} \field{sortinit}{Z} \field{sortinithash}{fdda4caaa6b5fa63e0c081dcb159543a} \field{labelyear}{1983} \field{datelabelsource}{} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{title}{Two} \field{year}{1983} \endentry |; eq_or_diff($out->get_output_entry('K11', $main), $K11, 'sortlist output - 1'); eq_or_diff($out->get_output_entry('K12', $main), $K12, 'sortlist output - 2'); biblatex-biber-2.4/t/tool-bltxml-inout.t000444000765000024 1342112667073765 20562 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use Test::More tests => 1; use Test::Differences; unified_diff; use Text::Diff::Config; $Text::Diff::Config::Output_Unicode = 1; use Encode; use Biber; use Biber::Utils; use Biber::Output::biblatexml; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); no warnings 'utf8'; use utf8; # Set up Biber object my $biber = Biber->new( configfile => 'tool-test.conf'); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); my $outvar; $biber->set_output_obj(Biber::Output::biblatexml->new()); # Get reference to output object my $out = $biber->get_output_obj; # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('tool', 1); Biber::Config->setoption('output_resolve', 1); Biber::Config->setoption('output_format', 'biblatexml'); Biber::Config->setoption('input_format', 'biblatexml'); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('dsn', 'biblatexml.bltxml'); # Set the output target $out->set_output_target_file(\$outvar); # THERE IS A CONFIG FILE BEING READ! # Now generate the information $ARGV[0] = 'biblatexml.bltxml'; # fake this as we are not running through top-level biber program $biber->tool_mode_setup; $biber->prepare_tool; $out->output; my $main = $biber->sortlists->get_list(99999, Biber::Config->getblxoption('sortscheme') . '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global'); my $bltxml1 = q| bltx1a1 bltx1a2 useprefix=false Brown John Булгаков Павел Георгиевич von Розенфельд Борис-ZZ Aбрамович von Aхмедов Ашраф Ахмедович Smith Paul Brown John russian Москва Наука 240 Somestring reprint Научно-биографическая литература Мухаммад ибн муса ал-Хорезми. Около 783 – около 850 usera userb userc userd a 1 10 30 34 1983 1990-05-16 1990-05-17 1985-04-02 1991-07-01 |; # NFD here because we are testing internals here and all internals expect NFD eq_or_diff($outvar, encode_utf8($bltxml1), 'bltxml in and out tool mode - 1'); biblatex-biber-2.4/t/tool-bltxml.t000444000765000024 1336612667073765 17436 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use Test::More tests => 2; use Test::Differences; unified_diff; use Text::Diff::Config; $Text::Diff::Config::Output_Unicode = 1; use Encode; use Biber; use Biber::Utils; use Biber::Output::biblatexml; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); no warnings 'utf8'; use utf8; # Set up Biber object my $biber = Biber->new( configfile => 'tool-test.conf'); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); my $outvar; $biber->set_output_obj(Biber::Output::biblatexml->new()); # Get reference to output object my $out = $biber->get_output_obj; # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('tool', 1); Biber::Config->setoption('output_resolve', 1); Biber::Config->setoption('output_format', 'biblatexml'); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('dsn', 'tool.bib'); # Set the output target $out->set_output_target_file(\$outvar); # THERE IS A CONFIG FILE BEING READ! # Now generate the information $ARGV[0] = 'tool.bib'; # fake this as we are not running through top-level biber program $biber->tool_mode_setup; $biber->prepare_tool; $out->output; my $main = $biber->sortlists->get_list(99999, Biber::Config->getblxoption('sortscheme') . '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global'); my $bltxml1 = q| useprefix=false AAA BBB CCC DDD EEE REPlaCEDte early list test late early one two Some abstract %50 of which is useless i3Š Š title test 2003 Ellington Edward Paul New York London Macmillan A Note 2001 macmillanalias New York London Macmillan A Note 2001 macmillan:pubALIAS Macmillan New York London A Note mv1 Mainsubtitle Maintitle Maintitleaddon Booktitle 1999 mvalias Mainsubtitle Maintitle Maintitleaddon |; eq_or_diff($outvar, encode_utf8($bltxml1), 'bltxml tool mode - 1'); is_deeply([$main->get_keys], ['macmillan:pub', 'macmillan:loc', 'mv1', 'b1', 'xd1', 'macmillan', NFD('i3Š')], 'tool mode sorting'); biblatex-biber-2.4/t/tool.t000555000765000024 752212667073765 16116 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use Test::More tests => 6; use Test::Differences; unified_diff; use Encode; use Biber; use Biber::Utils; use Biber::Output::bibtex; use Log::Log4perl; use Unicode::Normalize; chdir("t/tdata"); no warnings 'utf8'; use utf8; # Set up Biber object my $biber = Biber->new(configfile => 'tool-test.conf'); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->set_output_obj(Biber::Output::bibtex->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('tool', 1); Biber::Config->setoption('output_align', '1'); Biber::Config->setoption('output_resolve', 1); Biber::Config->setoption('output_format', 'bibtex'); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # THERE IS A CONFIG FILE BEING READ! # Now generate the information $ARGV[0] = 'tool.bib'; # fake this as we are not running through top-level biber program $biber->tool_mode_setup; $biber->prepare_tool; my $main = $biber->sortlists->get_list(99999, Biber::Config->getblxoption('sortscheme'). '/global', 'entry', Biber::Config->getblxoption('sortscheme'), 'global'); my $out = $biber->get_output_obj; my $t1 = q|@UNPUBLISHED{i3Š, ABSTRACT = {Some abstract %50 of which is useless}, AUTHOR = {AAA and BBB and CCC and DDD and EEE}, DATE = {2003}, INSTITUTION = {REPlaCEDte and early}, KEYWORDS = {keyword}, LISTA = {list test}, LISTB = {late and early}, LOCATION = {one and two}, NOTE = {i3Š}, OPTIONS = {useprefix=false}, TITLE = {Š title}, USERB = {test}, } |; my $t2 = q|@BOOK{xd1, AUTHOR = {Edward Paul Ellington}, LOCATION = {New York and London}, NOTE = {A Note}, PUBLISHER = {Macmillan}, YEAR = {2001}, } |; my $t3 = q|@BOOK{b1, MAINSUBTITLE = {Mainsubtitle}, MAINTITLE = {Maintitle}, MAINTITLEADDON = {Maintitleaddon}, TITLE = {Booktitle}, YEAR = {1999}, } |; my $tc1 = ["\@COMMENT{Comment 1}\n", "\@COMMENT{Comment 2}\n", "\@COMMENT{jabref-meta: groupstree:\n0 AllEntriesGroup:;\n1 ExplicitGroup:Doktorandkurser\\;2\\;;\n2 KeywordGroup:Fra\x{30a}n ko\x{308}nsroll till genus\\;0\\;course\\;UCGS Fra\x{30a}n ko\x{308}nsrolltill genus\\;0\\;0\\;;\n2 KeywordGroup:Historiska och filosofiska perspektiv pa\x{30a} psykologi\\;0\\;course\\;Historiska och filosofiska perspektiv pa\x{30a} psykologi\\;0\\;0\\;;\n2 KeywordGroup:Kurs i introduktion\\;0\\;course\\;Kurs i introduktion\\;0\\;0\\;;\n2 KeywordGroup:Fenomenologi, ko\x{308}n och genus\\;0\\;course\\;UCGS Fenomenologi\\;0\\;0\\;;\n2 KeywordGroup:Quantitative Research Methods\\;0\\;course\\;QMR\\;0\\;0\\;;\n2 KeywordGroup:Multivariate Analysis\\;0\\;course\\;MVA\\;1\\;0\\;;\n}\n"]; # NFD here because we are testing internals here and all internals expect NFD eq_or_diff(encode_utf8($out->get_output_entry(NFD('i3Š'))), encode_utf8($t1), 'tool mode 1'); ok(is_undef($out->get_output_entry('loh')), 'tool mode 2'); eq_or_diff($out->get_output_entry('xd1',), $t2, 'tool mode 3'); eq_or_diff($out->get_output_entry('b1',), $t3, 'tool mode 4'); is_deeply([$main->get_keys], ['macmillan:pub', 'macmillan:loc', 'mv1', 'b1', 'xd1', 'macmillan', NFD('i3Š')], 'tool mode sorting'); eq_or_diff($out->get_output_comments, $tc1, 'tool mode 5'); biblatex-biber-2.4/t/uniqueness.t000555000765000024 12166412667073765 17404 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 193; use Test::Differences; unified_diff; use Biber; use Biber::Utils; use Biber::Output::bbl; use Log::Log4perl; chdir("t/tdata"); # Set up Biber object my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('uniqueness1.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; my $section = $biber->sections->get_section(0); my $bibentries = $section->bibentries; my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); # Basic uniquename and hash testing eq_or_diff($bibentries->entry('un1')->get_field($bibentries->entry('un1')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename requiring full name expansion - 1'); eq_or_diff($bibentries->entry('un2')->get_field($bibentries->entry('un2')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename requiring full name expansion - 2'); eq_or_diff($bibentries->entry('un5')->get_field($bibentries->entry('un5')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename requiring full name expansion - 3'); eq_or_diff($bibentries->entry('un3')->get_field($bibentries->entry('un2')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename requiring initials name expansion - 1'); eq_or_diff($bibentries->entry('un4')->get_field($bibentries->entry('un4')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename requiring initials name expansion - 2'); ok(is_undef($bibentries->entry('un4a')->get_field($bibentries->entry('un4a')->get_labelname_info)->nth_name(1)->get_uniquename), 'per-entry uniquename'); eq_or_diff($bibentries->entry('un6')->get_field('namehash'), 'f8169a157f8d9209961157b8d23902db', 'Namehash and fullhash - 1'); eq_or_diff($bibentries->entry('un6')->get_field('fullhash'), 'f8169a157f8d9209961157b8d23902db', 'Namehash and fullhash - 2'); eq_or_diff($bibentries->entry('un7')->get_field('namehash'), 'b33fbd3f3349d1536dbcc14664f2cbbd', 'Fullnamshash ignores SHORT* names - 1'); eq_or_diff($bibentries->entry('un7')->get_field('fullhash'), 'f8169a157f8d9209961157b8d23902db', 'Fullnamshash ignores SHORT* names - 2'); eq_or_diff($bibentries->entry('test1')->get_field('namehash'), '07df5c892ba1452776abee0a867591f2', 'Namehash and fullhash - 3'); eq_or_diff($bibentries->entry('test1')->get_field('fullhash'), '637292dd2997a74c91847f1ec5081a46', 'Namehash and fullhash - 4'); eq_or_diff($bibentries->entry('untf1')->get_field($bibentries->entry('untf1')->get_labelname_info)->nth_name(2)->get_uniquename, '2', 'Uniquename with full and repeat - 1'); eq_or_diff($bibentries->entry('untf2')->get_field($bibentries->entry('untf2')->get_labelname_info)->nth_name(2)->get_uniquename, '2', 'Uniquename with full and repeat - 2'); eq_or_diff($bibentries->entry('untf3')->get_field($bibentries->entry('untf3')->get_labelname_info)->nth_name(2)->get_uniquename, '2', 'Uniquename with full and repeat - 3'); # Prefix/suffix eq_or_diff($bibentries->entry('sp1')->get_field($bibentries->entry('sp1')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 1'); eq_or_diff($bibentries->entry('sp2')->get_field($bibentries->entry('sp2')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 2'); eq_or_diff($bibentries->entry('sp3')->get_field($bibentries->entry('sp3')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 3'); eq_or_diff($bibentries->entry('sp4')->get_field($bibentries->entry('sp4')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 4'); eq_or_diff($bibentries->entry('sp5')->get_field($bibentries->entry('sp5')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 5'); eq_or_diff($bibentries->entry('sp6')->get_field($bibentries->entry('sp6')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Prefix/Suffix - 6'); eq_or_diff($bibentries->entry('sp7')->get_field($bibentries->entry('sp7')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Prefix/Suffix - 7'); eq_or_diff($bibentries->entry('sp8')->get_field($bibentries->entry('sp8')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 8'); eq_or_diff($bibentries->entry('sp9')->get_field($bibentries->entry('sp9')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Prefix/Suffix - 9'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness1.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 1); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($bibentries->entry('unt1')->get_field($bibentries->entry('unt1')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename with inits and repeat - 1'); eq_or_diff($bibentries->entry('unt2')->get_field($bibentries->entry('unt2')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename with inits and repeat - 2'); eq_or_diff($bibentries->entry('unt3')->get_field($bibentries->entry('unt3')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename with inits and repeat - 3'); eq_or_diff($bibentries->entry('unt4')->get_field($bibentries->entry('unt4')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename with inits and repeat - 4'); eq_or_diff($bibentries->entry('unt5')->get_field($bibentries->entry('unt5')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename with inits and repeat - 5'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness2.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 5); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); # Hashes the same as uniquelist expansion expands to the whole list eq_or_diff($bibentries->entry('unall3')->get_field('namehash'), 'f1c5973adbc2e674fa4d98164c9ba5d5', 'Namehash and fullhash - 5'); eq_or_diff($bibentries->entry('unall3')->get_field('fullhash'), 'f1c5973adbc2e674fa4d98164c9ba5d5', 'Namehash and fullhash - 6'); ok(is_undef($bibentries->entry('unall3')->get_field($bibentries->entry('unall3')->get_labelname_info)->get_uniquelist), 'Uniquelist edgecase - 1'); eq_or_diff($bibentries->entry('unall4')->get_field($bibentries->entry('unall4')->get_labelname_info)->get_uniquelist, '6', 'Uniquelist edgecase - 2'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness1.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 1); Biber::Config->setblxoption('uniquelist', 0); # Now generate the information $biber->prepare; $bibentries = $biber->sections->get_section('0')->bibentries; eq_or_diff($bibentries->entry('test2')->get_field($bibentries->entry('test2')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename 0 due to mincitenames truncation'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness2.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 1); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('mincitenames', 1); # Now generate the information $biber->prepare; $bibentries = $biber->sections->get_section('0')->bibentries; eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 1'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename - 2'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Uniquename - 3'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 4'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename - 5'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Uniquename - 6'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(4)->get_uniquename, '0', 'Uniquename - 7'); eq_or_diff($bibentries->entry('un10')->get_field($bibentries->entry('un10')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 8'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 1'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 2'); ok(is_undef($bibentries->entry('un10')->get_field($bibentries->entry('un10')->get_labelname_info)->get_uniquelist), 'Uniquelist - 3'); eq_or_diff($bibentries->entry('unapa1')->get_field($bibentries->entry('unapa1')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 4'); eq_or_diff($bibentries->entry('unapa2')->get_field($bibentries->entry('unapa2')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 5'); ok(is_undef($bibentries->entry('others1')->get_field($bibentries->entry('others1')->get_labelname_info)->get_uniquelist), 'Uniquelist - 6'); # These next two should have uniquelist undef as they are identical author lists and so # can't be disambiguated (and shouldn't be). ok(is_undef($bibentries->entry('unall1')->get_field($bibentries->entry('unall1')->get_labelname_info)->get_uniquelist), 'Uniquelist - 7'); ok(is_undef($bibentries->entry('unall2')->get_field($bibentries->entry('unall2')->get_labelname_info)->get_uniquelist), 'Uniquelist - 8'); # These all should have uniquelist=5 as even though two are identical, they still both # need disambiguating from the other one which differs in fifth place eq_or_diff($bibentries->entry('unall5')->get_field($bibentries->entry('unall5')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 9'); eq_or_diff($bibentries->entry('unall6')->get_field($bibentries->entry('unall6')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 10'); eq_or_diff($bibentries->entry('unall7')->get_field($bibentries->entry('unall7')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 11'); # unall8/unall9 are the same (ul=5) and unall10 is superset of them (ul=6) # unall9a is ul=undef due to per-entry settings (would otherwise be ul=5) eq_or_diff($bibentries->entry('unall8')->get_field($bibentries->entry('unall8')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 12'); eq_or_diff($bibentries->entry('unall9')->get_field($bibentries->entry('unall9')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 13'); ok(is_undef($bibentries->entry('unall9a')->get_field($bibentries->entry('unall9a')->get_labelname_info)->get_uniquelist), 'Per-entry Uniquelist - 1'); eq_or_diff($bibentries->entry('unall10')->get_field($bibentries->entry('unall10')->get_labelname_info)->get_uniquelist, '6', 'Uniquelist - 14'); # These next two should have uniquelist 5/6 as they need disambiguating in place 5 eq_or_diff($bibentries->entry('unall3')->get_field($bibentries->entry('unall3')->get_labelname_info)->get_uniquelist, '5', 'Uniquelist - 15'); eq_or_diff($bibentries->entry('unall4')->get_field($bibentries->entry('unall4')->get_labelname_info)->get_uniquelist, '6', 'Uniquelist - 16'); # Testing "et al" counting as a uniquelist position # ul01 = 3 # ul02 = 3 (because it will be "XXX and YYY and ZZZ et al" which disambiguated the list from # "XXX and YYY and ZZZ" eq_or_diff($bibentries->entry('ul01')->get_field($bibentries->entry('ul01')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 17'); eq_or_diff($bibentries->entry('ul02')->get_field($bibentries->entry('ul02')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist - 18'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness1.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; $bibentries = $biber->sections->get_section('0')->bibentries; eq_or_diff($bibentries->entry('test3')->get_field($bibentries->entry('test3')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist - 19'); eq_or_diff($bibentries->entry('test3')->get_field($bibentries->entry('test3')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 9'); eq_or_diff($bibentries->entry('test3')->get_field($bibentries->entry('test3')->get_labelname_info)->nth_name(2)->get_uniquename, '2', 'Uniquename - 10'); eq_or_diff($bibentries->entry('test4')->get_field($bibentries->entry('test4')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist - 20'); eq_or_diff($bibentries->entry('test4')->get_field($bibentries->entry('test4')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 11'); eq_or_diff($bibentries->entry('test4')->get_field($bibentries->entry('test4')->get_labelname_info)->nth_name(2)->get_uniquename, '2', 'Uniquename - 12'); eq_or_diff($bibentries->entry('test5')->get_field($bibentries->entry('test5')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist - 21'); eq_or_diff($bibentries->entry('test5')->get_field($bibentries->entry('test5')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename - 13'); eq_or_diff($bibentries->entry('test5')->get_field($bibentries->entry('test5')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename - 14'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness4.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 3); Biber::Config->setblxoption('uniquename', 6); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('singletitle', 0); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($bibentries->entry('us1')->get_field($bibentries->entry('us1')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 1'); eq_or_diff($bibentries->entry('us1')->get_field($bibentries->entry('us1')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 2'); eq_or_diff($bibentries->entry('us2')->get_field($bibentries->entry('us2')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 3'); eq_or_diff($bibentries->entry('us2')->get_field($bibentries->entry('us2')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 4'); eq_or_diff($bibentries->entry('us3')->get_field($bibentries->entry('us3')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 5'); eq_or_diff($bibentries->entry('us3')->get_field($bibentries->entry('us3')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 6'); eq_or_diff($bibentries->entry('us4')->get_field($bibentries->entry('us4')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 7'); eq_or_diff($bibentries->entry('us4')->get_field($bibentries->entry('us4')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 8'); eq_or_diff($bibentries->entry('us5')->get_field($bibentries->entry('us5')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 9'); eq_or_diff($bibentries->entry('us6')->get_field($bibentries->entry('us6')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 10'); eq_or_diff($bibentries->entry('us6')->get_field($bibentries->entry('us6')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 11'); eq_or_diff($bibentries->entry('us6')->get_field($bibentries->entry('us6')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 12'); eq_or_diff($bibentries->entry('us7')->get_field($bibentries->entry('us7')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 13'); eq_or_diff($bibentries->entry('us7')->get_field($bibentries->entry('us7')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 14'); eq_or_diff($bibentries->entry('us8')->get_field($bibentries->entry('us8')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 15'); eq_or_diff($bibentries->entry('us8')->get_field($bibentries->entry('us8')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 16'); eq_or_diff($bibentries->entry('us9')->get_field($bibentries->entry('us9')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 17'); eq_or_diff($bibentries->entry('us9')->get_field($bibentries->entry('us9')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 18'); eq_or_diff($bibentries->entry('us10')->get_field($bibentries->entry('us10')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 19'); eq_or_diff($bibentries->entry('us10')->get_field($bibentries->entry('us10')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename sparse - 20'); eq_or_diff($bibentries->entry('us11')->get_field($bibentries->entry('us11')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 21'); eq_or_diff($bibentries->entry('us11')->get_field($bibentries->entry('us11')->get_labelname_info)->nth_name(2)->get_uniquename, '1', 'Uniquename sparse - 22'); eq_or_diff($bibentries->entry('us12')->get_field($bibentries->entry('us12')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 23'); eq_or_diff($bibentries->entry('us12')->get_field($bibentries->entry('us12')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 24'); eq_or_diff($bibentries->entry('us13')->get_field($bibentries->entry('us13')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 25'); eq_or_diff($bibentries->entry('us13')->get_field($bibentries->entry('us13')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 26'); # maxcitenames/mincitenames is 3 in but us14 is still "et al" so it's a "different list eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 27'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 28'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 29'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 30'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 31'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 32'); eq_or_diff($bibentries->entry('us16')->get_field($bibentries->entry('us16')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 33'); eq_or_diff($bibentries->entry('us16')->get_field($bibentries->entry('us16')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 34'); eq_or_diff($bibentries->entry('us16')->get_field($bibentries->entry('us16')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 35'); ok(is_undef($bibentries->entry('us16')->get_field($bibentries->entry('us16')->get_labelname_info)->get_uniquelist), 'Uniquename sparse - 36'); eq_or_diff($bibentries->entry('us17')->get_field($bibentries->entry('us17')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 37'); eq_or_diff($bibentries->entry('us17')->get_field($bibentries->entry('us17')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 38'); eq_or_diff($bibentries->entry('us17')->get_field($bibentries->entry('us17')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 39'); eq_or_diff($bibentries->entry('us17')->get_field($bibentries->entry('us17')->get_labelname_info)->nth_name(4)->get_uniquename, '0', 'Uniquename sparse - 40'); eq_or_diff($bibentries->entry('us17')->get_field($bibentries->entry('us17')->get_labelname_info)->get_uniquelist, '4', 'Uniquename sparse - 41'); eq_or_diff($bibentries->entry('us18')->get_field($bibentries->entry('us18')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 42'); eq_or_diff($bibentries->entry('us19')->get_field($bibentries->entry('us19')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 43'); ok(is_undef($bibentries->entry('us18')->get_field($bibentries->entry('us18')->get_labelname_info)->get_uniquelist), 'Uniquename sparse - 44'); eq_or_diff($bibentries->entry('us19')->get_field($bibentries->entry('us19')->get_labelname_info)->get_uniquelist, '4', 'Uniquename sparse - 45'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness4.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 6); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('singletitle', 0); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); # maxcitenames/mincitenames = 3/1 so these will not truncate to the same list (since # us15 would not be truncated at all) and they therefore would not need disambiguating with # uniquename = 5 or 6 eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 46'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 47'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 48'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 49'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 50'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 51'); # eq_or_diff($bibentries->entry('us20')->get_field($bibentries->entry('us20')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 52'); eq_or_diff($bibentries->entry('us21')->get_field($bibentries->entry('us21')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Uniquename sparse - 53'); eq_or_diff($bibentries->entry('us22')->get_field($bibentries->entry('us22')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 54'); eq_or_diff($bibentries->entry('us23')->get_field($bibentries->entry('us23')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 55'); eq_or_diff($bibentries->entry('us24')->get_field($bibentries->entry('us24')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 56'); eq_or_diff($bibentries->entry('us25')->get_field($bibentries->entry('us25')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 57'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness4.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 2); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 6); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('singletitle', 0); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); # maxcitenames/mincitenames = 2/1 so list are the same and need disambiguating but only in the first # name as the others are not visible eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 58'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 59'); eq_or_diff($bibentries->entry('us14')->get_field($bibentries->entry('us14')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 60'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 61'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Uniquename sparse - 62'); eq_or_diff($bibentries->entry('us15')->get_field($bibentries->entry('us15')->get_labelname_info)->nth_name(3)->get_uniquename, '0', 'Uniquename sparse - 63'); eq_or_diff($bibentries->entry('us26')->get_field($bibentries->entry('us26')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 64'); eq_or_diff($bibentries->entry('us27')->get_field($bibentries->entry('us27')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 65'); eq_or_diff($bibentries->entry('us28')->get_field($bibentries->entry('us28')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Uniquename sparse - 66'); eq_or_diff($bibentries->entry('us29')->get_field($bibentries->entry('us29')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 67'); eq_or_diff($bibentries->entry('us30')->get_field($bibentries->entry('us30')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Uniquename sparse - 68'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness5.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 1); Biber::Config->setblxoption('mincitenames', 1); Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 2); Biber::Config->setblxoption('singletitle', 0); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); ok(is_undef($bibentries->entry('uls1')->get_field($bibentries->entry('uls1')->get_labelname_info)->get_uniquelist), 'Uniquelist strict - 1'); ok(is_undef($bibentries->entry('uls2')->get_field($bibentries->entry('uls2')->get_labelname_info)->get_uniquelist), 'Uniquelist strict - 2'); eq_or_diff($bibentries->entry('uls3')->get_field($bibentries->entry('uls3')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist strict - 3'); eq_or_diff($bibentries->entry('uls4')->get_field($bibentries->entry('uls4')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist strict - 4'); eq_or_diff($bibentries->entry('uls5')->get_field($bibentries->entry('uls5')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist strict - 5'); eq_or_diff($bibentries->entry('uls6')->get_field($bibentries->entry('uls6')->get_labelname_info)->get_uniquelist, '2', 'Uniquelist strict - 6'); ok(is_undef($bibentries->entry('uls7')->get_field($bibentries->entry('uls7')->get_labelname_info)->get_uniquelist), 'Uniquelist strict - 7'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness5.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('maxcitenames', 3); Biber::Config->setblxoption('mincitenames', 2); Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 2); Biber::Config->setblxoption('singletitle', 0); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); ok(is_undef($bibentries->entry('uls8')->get_field($bibentries->entry('uls8')->get_labelname_info)->get_uniquelist), 'Uniquelist strict - 8'); ok(is_undef($bibentries->entry('uls9')->get_field($bibentries->entry('uls9')->get_labelname_info)->get_uniquelist),'Uniquelist strict - 9'); ok(is_undef($bibentries->entry('uls1')->get_field($bibentries->entry('uls1')->get_labelname_info)->get_uniquelist),'Uniquelist strict - 10'); eq_or_diff($bibentries->entry('uls10')->get_field($bibentries->entry('uls10')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist strict - 11'); eq_or_diff($bibentries->entry('uls11')->get_field($bibentries->entry('uls11')->get_labelname_info)->get_uniquelist, '3', 'Uniquelist strict - 12'); ok(is_undef($bibentries->entry('uls12')->get_field($bibentries->entry('uls12')->get_labelname_info)->get_uniquelist), 'Uniquelist strict - 13'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness3.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 1); Biber::Config->setblxoption('uniquelist', 0); Biber::Config->setblxoption('singletitle', 1); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($main->get_extrayeardata('ey1'), '1', 'Extrayear - 1'); eq_or_diff($main->get_extrayeardata('ey2'), '2', 'Extrayear - 2'); eq_or_diff($main->get_extrayeardata('ey3'), '1', 'Extrayear - 3'); eq_or_diff($main->get_extrayeardata('ey4'), '2', 'Extrayear - 4'); eq_or_diff($main->get_extrayeardata('ey5'), '1', 'Extrayear - 5'); eq_or_diff($main->get_extrayeardata('ey6'), '2', 'Extrayear - 6'); ok(is_undef($bibentries->entry('ey1')->get_field('singletitle')), 'Singletitle - 1'); ok(is_undef($bibentries->entry('ey2')->get_field('singletitle')), 'Singletitle - 2'); ok(is_undef($bibentries->entry('ey5')->get_field('singletitle')), 'Singletitle - 3'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness3.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 2); Biber::Config->setblxoption('uniquelist', 1); Biber::Config->setblxoption('singletitle', 1); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); ok(is_undef($main->get_extrayeardata('ey1')), 'Extrayear - 7'); ok(is_undef($main->get_extrayeardata('ey2')), 'Extrayear - 8'); eq_or_diff($main->get_extrayeardata('ey3'), '1', 'Extrayear - 9'); eq_or_diff($main->get_extrayeardata('ey4'), '2', 'Extrayear - 10'); ok(is_undef($main->get_extrayeardata('ey5')), 'Extrayear - 11'); ok(is_undef($main->get_extrayeardata('ey6')), 'Extrayear - 12'); eq_or_diff($bibentries->entry('ey1')->get_field('singletitle'), '1', 'Singletitle - 4'); eq_or_diff($bibentries->entry('ey2')->get_field('singletitle'), '1', 'Singletitle - 5'); eq_or_diff($bibentries->entry('ey5')->get_field('singletitle'), '1', 'Singletitle - 6'); ############################################################################# $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness3.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 0); Biber::Config->setblxoption('uniquelist', 0); Biber::Config->setblxoption('singletitle', 1); Biber::Config->setblxoption('labeldatespec', [ {content => 'date', type => 'field'} ]); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($main->get_extrayeardata('ey1'), '1', 'Extrayear - 13'); eq_or_diff($main->get_extrayeardata('ey2'), '2', 'Extrayear - 14'); eq_or_diff($main->get_extrayeardata('ey3'), '1', 'Extrayear - 15'); eq_or_diff($main->get_extrayeardata('ey4'), '2', 'Extrayear - 16'); eq_or_diff($main->get_extrayeardata('ey5'), '1', 'Extrayear - 17'); eq_or_diff($main->get_extrayeardata('ey6'), '2', 'Extrayear - 18'); ok(is_undef($bibentries->entry('ey1')->get_field('singletitle')), 'Singletitle - 7'); ok(is_undef($bibentries->entry('ey2')->get_field('singletitle')), 'Singletitle - 8'); ############################################################################# # Testing uniquename = 3 $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness2.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 3); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Forced init expansion - 1'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Forced init expansion - 2'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Forced init expansion - 3'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(1)->get_uniquename, '0', 'Forced init expansion - 4'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Forced init expansion - 5'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Forced init expansion - 6'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(4)->get_uniquename, '1', 'Forced init expansion - 7'); eq_or_diff($bibentries->entry('un10')->get_field($bibentries->entry('un10')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Forced init expansion - 8'); ############################################################################# # Testing uniquename = 4 $biber = Biber->new(noconf => 1); $biber->parse_ctrlfile('uniqueness2.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); # Biblatex options Biber::Config->setblxoption('uniquename', 4); Biber::Config->setblxoption('uniquelist', 1); # Now generate the information $biber->prepare; $section = $biber->sections->get_section(0); $bibentries = $section->bibentries; $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Forced name expansion - 1'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Forced name expansion - 2'); eq_or_diff($bibentries->entry('un8')->get_field($bibentries->entry('un8')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Forced name expansion - 3'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(1)->get_uniquename, '2', 'Forced name expansion - 4'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(2)->get_uniquename, '0', 'Forced name expansion - 5'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(3)->get_uniquename, '1', 'Forced name expansion - 6'); eq_or_diff($bibentries->entry('un9')->get_field($bibentries->entry('un9')->get_labelname_info)->nth_name(4)->get_uniquename, '1', 'Forced name expansion - 7'); eq_or_diff($bibentries->entry('un10')->get_field($bibentries->entry('un10')->get_labelname_info)->nth_name(1)->get_uniquename, '1', 'Forced name expansion - 8'); biblatex-biber-2.4/t/utils.t000555000765000024 2057012667073765 16317 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8' ; use open qw/:std :utf8/; use Test::More tests => 70; use Test::Differences; unified_diff; use Biber; use Biber::Entry::Name; use Biber::Entry::Names; use Biber::Utils; use Biber::LaTeX::Recode; use Log::Log4perl; use IPC::Cmd qw( can_run ); use Cwd; use Unicode::Normalize; use Encode; my $cwd = getcwd; my $biber = Biber->new(noconf => 1); my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 0 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); # NFD/NFC calls below as we are accessing internal functions which assume NFD and results strings # which assume NFC. # File locating # Using File::Spec->canonpath() to normalise path separators so these tests work # on Windows/non-Windows # Absolute path eq_or_diff(File::Spec->canonpath(locate_biber_file("$cwd/t/tdata/general.bcf")), File::Spec->canonpath("$cwd/t/tdata/general.bcf"), 'File location - 1'); # Relative path eq_or_diff(File::Spec->canonpath(locate_biber_file('t/tdata/general.bcf')), File::Spec->canonpath('t/tdata/general.bcf'), 'File location - 2'); # Same place as control file Biber::Config->set_ctrlfile_path('t/tdata/general.bcf'); eq_or_diff(File::Spec->canonpath(locate_biber_file('t/tdata/examples.bib')), File::Spec->canonpath('t/tdata/examples.bib'), 'File location - 3'); # The \cM* is there because if cygwin picks up miktex kpsewhich, it will return a path # with a Ctrl-M on the end # Testing using a file guaranteed to be installed with any latex install SKIP: { skip "No LaTeX installation", 1 unless can_run('kpsewhich'); # using kpsewhich like(File::Spec->canonpath(locate_biber_file('plain.tex')), qr|plain.tex\cM*\z|, 'File location - 4'); } # In output_directory Biber::Config->setoption('output_directory', 't/tdata'); eq_or_diff(File::Spec->canonpath(locate_biber_file('general.bcf')), File::Spec->canonpath("t/tdata/general.bcf"), 'File location - 5'); # String normalising eq_or_diff(normalise_string('"a, b–c: d" ', 1), 'a bc d', 'normalise_string' ); Biber::Config->setoption('output_encoding', 'UTF-8'); eq_or_diff(NFC(normalise_string_underscore(latex_decode('\c Se\x{c}\"ok-\foo{a}, N\`i\~no $§+ :-) '), 0)), 'Şecöka_Nìño', 'normalise_string_underscore 1' ); eq_or_diff(normalise_string_underscore('{Foo de Bar, Graf Ludwig}', 1), 'Foo_de_Bar_Graf_Ludwig', 'normalise_string_underscore 3'); # LaTeX decoding/encoding eq_or_diff(NFC(latex_decode('Mu\d{h}ammad ibn M\=us\=a al-Khw\=arizm\=\i{} \r{a}')), 'Muḥammad ibn Mūsā al-Khwārizmı̄ å', 'latex decode 1'); eq_or_diff(latex_decode('\alpha'), '\alpha', 'latex decode 2'); # no greek decoding by default eq_or_diff(latex_decode('\textless\textampersand'), '<&', 'latex decode 3'); # checking XML encoding bits eq_or_diff(latex_encode(NFD('Muḥammad ibn Mūsā al-Khwārizmī')), 'Mu\d{h}ammad ibn M\={u}s\={a} al-Khw\={a}rizm\=\i{}', 'latex encode 1'); eq_or_diff(latex_encode(NFD('α')), 'α', 'latex encode 2'); # no greek encoding by default eq_or_diff(NFC(latex_decode("{M{\\'a}t{\\'e}}")), '{Máté}', 'latex decode accent 1'); eq_or_diff(NFC(latex_decode("{M\\'{a}t\\'{e}}")), '{Máté}', 'latex decode accent 2'); eq_or_diff(NFC(latex_decode("{M\\'at\\'e}")), '{Máté}', 'latex decode accent 3'); eq_or_diff(NFC(latex_decode("R{\\'egis}")), 'R{égis}', 'latex decode accent 4'); eq_or_diff(NFC(latex_decode("\\textuppercase{\\'e}")), '\textuppercase{é}', 'latex decode accent 5'); eq_or_diff(NFC(latex_decode("\\DH{}and\\dj{}and\\'{c}, H.")), 'Ðandđandć, H.', 'latex reversing recoding test 1'); eq_or_diff(NFC(latex_decode("{\\DH{}and\\dj{}and\\'{c}, H.}")), '{Ðandđandć, H.}', 'latex reversing recoding test 2'); eq_or_diff(latex_encode(NFD('Ðandđandć, H.')), '\\DH{}and\\dj{}and\\\'{c}, H.', 'latex reversing recoding test 3'); eq_or_diff(latex_encode(NFD('{Ðandđandć, H.}')), '{\\DH{}and\\dj{}and\\\'{c}, H.}', 'latex reversing recoding test 4'); Biber::LaTeX::Recode->init_sets('full', 'full'); # Need to do this to reset eq_or_diff(latex_decode('\alpha'), 'α', 'latex decode 4'); # greek decoding with "full" eq_or_diff(NFC(latex_decode("\\'\\i")), 'ı́', 'latex decode 5'); # checking i/j with accents eq_or_diff(NFC(latex_decode("{\\'\\i}")), 'ı́', 'latex decode 5a'); # checking i/j with accents eq_or_diff(NFC(latex_decode("\\^{\\j}")), 'ȷ̂', 'latex decode 6'); # checking i/j with accents eq_or_diff(NFC(latex_decode("\\u{\\i}")), 'ı̆', 'latex decode 7'); # checking i/j with accents eq_or_diff(NFC(latex_decode("\\u\\i")), 'ı̆', 'latex decode 8'); # checking i/j with accents eq_or_diff(latex_decode('\i'), 'ı', 'latex decode 9'); # checking dotless i eq_or_diff(latex_decode('\j'), 'ȷ', 'latex decode 10'); # checking dotless j eq_or_diff(latex_decode('\textdiv'), '÷', 'latex decode 11'); # checking multiple set for types eq_or_diff(latex_decode('\textbackslash'), "\\", 'latex decode 12'); # checking multiple set for types eq_or_diff(latex_decode('--'), '--', 'latex decode 13'); # Testing raw eq_or_diff(latex_encode(NFD('α')), '{$\alpha$}', 'latex encode 3'); # greek encoding with "full" eq_or_diff(latex_encode(NFD('µ')), '{$\mu$}', 'latex encode 4'); # Testing symbols eq_or_diff(latex_encode(NFD('≄')), '{$\not\simeq$}', 'latex encode 5'); # Testing negated symbols eq_or_diff(latex_encode(NFD('Þ')), '\TH{}', 'latex encode 6'); # Testing preferred eq_or_diff(latex_encode('$'), '$', 'latex encode 7'); # Testing exclude eq_or_diff(latex_encode(NFD('–')), '--', 'latex encode 8'); # Testing raw eq_or_diff(latex_decode('a\-a'), 'a\-a', 'discretionary hyphens'); eq_or_diff(latex_encode(NFD('Åå')), '\r{A}\r{a}', 'latex encode 9'); eq_or_diff(latex_encode(NFD('a̍')), '\|{a}', 'latex encode 10'); eq_or_diff(latex_encode(NFD('ı̆')), '\u{\i{}}', 'latex encode 11'); my @arrayA = qw/ a b c d e f c /; my @arrayB = qw/ c e /; my @AminusB = reduce_array(\@arrayA, \@arrayB); my @AminusBexpected = qw/ a b d f /; is_deeply(\@AminusB, \@AminusBexpected, 'reduce_array') ; eq_or_diff(remove_outer('{Some string}'), 'Some string', 'remove_outer') ; eq_or_diff(normalise_string_hash('Ä.~{\c{C}}.~{\c S}.'), 'Äc:Cc:S', 'normalise_string_lite' ) ; Biber::LaTeX::Recode->init_sets('base', 'full'); # Need to do this to reset eq_or_diff(latex_decode('\textdiv'), '\textdiv', 'latex different encode/decode sets 1'); eq_or_diff(latex_encode(NFD('÷')), '{$\div$}', 'latex different encode/decode sets 2'); Biber::LaTeX::Recode->init_sets('null', 'full'); # Need to do this to reset eq_or_diff(latex_decode('\i'), '\i', 'latex null decode 1'); eq_or_diff(latex_encode(NFD('ı')), '\i{}', 'latex null encode 2'); eq_or_diff(rangelen([[10,15]]), 6, 'Rangelen test 1'); eq_or_diff(rangelen([[10,15],[47, 53]]), 13, 'Rangelen test 2'); eq_or_diff(rangelen([[10,15],[47, undef]]), 7, 'Rangelen test 3'); eq_or_diff(rangelen([[10,15],[47, '']]), -1, 'Rangelen test 4'); eq_or_diff(rangelen([[10,15],['', 35]]), -1, 'Rangelen test 5'); eq_or_diff(rangelen([[10,15],['', undef]]), -1, 'Rangelen test 6'); eq_or_diff(rangelen([[10,15],['XX', 'XXiv'],['i',10]]), 21, 'Rangelen test 7'); # This is nasty - it's U+2165 U+2160, U+217B to test unicode decomp eq_or_diff(rangelen([[10,15],['ⅥⅠ', 'ⅻ']]), 12, 'Rangelen test 8'); eq_or_diff(rangelen([['I-II', 'III-IV']]), -1, 'Rangelen test 9'); eq_or_diff(rangelen([[22,4],[123,7],[113,15]]), 11, 'Rangelen test 10'); # Test boolean mappings eq_or_diff(map_boolean('true', 'tonum'), 1, 'Boolean conversion - 1'); eq_or_diff(map_boolean('False', 'tonum'), 0, 'Boolean conversion - 2'); eq_or_diff(map_boolean(1, 'tostring'), 'true', 'Boolean conversion - 3'); eq_or_diff(map_boolean(0, 'tostring'), 'false', 'Boolean conversion - 4'); eq_or_diff(map_boolean(0, 'tonum'), 0, 'Boolean conversion - 5'); # Range parsing eq_or_diff(parse_range('1--2'), [1,2], 'Range parsing - 1'); eq_or_diff(parse_range('-2'), [1,2], 'Range parsing - 2'); eq_or_diff(parse_range('3-'), [3,undef], 'Range parsing - 3'); eq_or_diff(parse_range('5'), [1,5], 'Range parsing - 4'); eq_or_diff(parse_range('3--+'), [3,'+'], 'Range parsing - 5'); biblatex-biber-2.4/t/xdata.t000444000765000024 756512667073765 16246 0ustar00philkimestaff000000000000# -*- cperl -*- use strict; use warnings; use utf8; no warnings 'utf8'; use Test::More tests => 5; use Test::Differences; unified_diff; use Biber; use Biber::Output::bbl; use Log::Log4perl; use Capture::Tiny qw(capture); use Encode; chdir("t/tdata") ; # USING CAPTURE - DEBUGGING PRINTS, DUMPS WON'T BE VISIBLE UNLESS YOU PRINT $stderr # AT THE END! # Set up Biber object my $biber = Biber->new(noconf => 1); # Note stderr is output here so we can capture it and do a cyclic crossref test my $LEVEL = 'ERROR'; my $l4pconf = qq| log4perl.category.main = $LEVEL, Screen log4perl.category.screen = $LEVEL, Screen log4perl.appender.Screen = Log::Log4perl::Appender::Screen log4perl.appender.Screen.utf8 = 1 log4perl.appender.Screen.Threshold = $LEVEL log4perl.appender.Screen.stderr = 1 log4perl.appender.Screen.layout = Log::Log4perl::Layout::SimpleLayout |; Log::Log4perl->init(\$l4pconf); $biber->parse_ctrlfile('xdata.bcf'); $biber->set_output_obj(Biber::Output::bbl->new()); # Options - we could set these in the control file but it's nice to see what we're # relying on here for tests # Biber options Biber::Config->setoption('fastsort', 1); Biber::Config->setoption('sortlocale', 'en_GB.UTF-8'); Biber::Config->setoption('nodieonerror', 1); # because there is a cyclic xdata check # Now generate the information my ($stdout, $stderr) = capture { $biber->prepare }; my $section = $biber->sections->get_section(0); my $main = $biber->sortlists->get_list(0, 'nty/global', 'entry', 'nty', 'global'); my $out = $biber->get_output_obj; my $xd1 = q| \entry{xd1}{book}{} \name{author}{1}{}{% {{hash=51db4bfd331cba22959ce2d224c517cd}{% family={Ellington}, family_i={E\bibinitperiod}, given={Edward}, given_i={E\bibinitperiod}}}% } \list{location}{2}{% {New York}% {London}% } \list{publisher}{1}{% {Macmillan}% } \strng{namehash}{51db4bfd331cba22959ce2d224c517cd} \strng{fullhash}{51db4bfd331cba22959ce2d224c517cd} \field{sortinit}{E} \field{sortinithash}{fefc5210ef4721525b2a478df41efcd4} \field{labelyear}{2007} \field{datelabelsource}{} \field{labelnamesource}{author} \field{note}{A Note} \field{year}{2007} \endentry |; my $xd2 = q| \entry{xd2}{book}{} \name{author}{1}{}{% {{hash=68539e0ce4922cc4957c6cabf35e6fc8}{% family={Pillington}, family_i={P\bibinitperiod}, given={Peter}, given_i={P\bibinitperiod}}}% } \list{location}{2}{% {New York}% {London}% } \list{publisher}{1}{% {Routledge}% } \strng{namehash}{68539e0ce4922cc4957c6cabf35e6fc8} \strng{fullhash}{68539e0ce4922cc4957c6cabf35e6fc8} \field{sortinit}{P} \field{sortinithash}{c0a4896d0e424f9ca4d7f14f2b3428e7} \field{labelyear}{2003} \field{datelabelsource}{} \field{labelnamesource}{author} \field{abstract}{An abstract} \field{addendum}{Москва} \field{note}{A Note} \field{venue}{venue} \field{year}{2003} \endentry |; # Test::Differences doesn't like utf8 unless it's encoded here eq_or_diff($out->get_output_entry('xd1', $main), $xd1, 'xdata test - 1'); eq_or_diff(encode_utf8($out->get_output_entry('xd2', $main)), encode_utf8($xd2), 'xdata test - 2'); # XDATA entries should not be output at all eq_or_diff($out->get_output_entry('macmillan', $main), undef, 'xdata test - 3'); eq_or_diff($out->get_output_entry('macmillan:pub', $main), undef, 'xdata test - 4'); chomp $stderr; eq_or_diff($stderr, "ERROR - Circular XDATA inheritance between 'loop'<->'loop:3'", 'Cyclic xdata error check'); #print $stdout; #print $stderr; biblatex-biber-2.4/t/tdata000755000765000024 012667073765 15703 5ustar00philkimestaff000000000000biblatex-biber-2.4/t/tdata/basic-misc.bcf000444000765000024 26134612667073765 20602 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 0 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids entryset date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl urls abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urls urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender examples.bib examples.bib murray t1 t2 kant:ku kant:kpv shore missing1 missing2 anon1 anon2 u1 u2 alias1 alias2 alias6 us1 list1 isbn1 isbn2 issn1 shorthand biblatex-biber-2.4/t/tdata/biber-test.conf000444000765000024 15637112667073765 21024 0ustar00philkimestaff000000000000 testlocale 5 doesnotexist.bib examples.bib doesnotexist.bib ARTICLE UNPUBLISHED examples.bib MISC examples.bib examples.bib REPORT UNPUBLISHED ONLINE ris1.ris ris1.ris ris1.ris RPRT article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished hyphenation indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids entryset date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender hyphenation ids indextitle indexsorttitle isan ismn iswc keywords label library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender biblatex-biber-2.4/t/tdata/biblatexml.bcf000444000765000024 26223212667073765 20706 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 1 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 3 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender biblatexml.bltxml * biblatex-biber-2.4/t/tdata/biblatexml.bltxml000444000765000024 664312667073765 21420 0ustar00philkimestaff000000000000 useprefix=false bltx1a1 bltx1a2 Павел Георгиевич Булгаков von Борис-ZZ Aбрамович Розенфельд von Ашраф Ахмедович Aхмедов Paul Smith John Brown John Brown Мухаммад ибн муса ал-Хорезми. Около 783 – около 850 Москва Наука russian Научно-биографическая литература usera userb userc userd a 1983 1985-04-02 1990-05-16 1990-05-17 1991-07-01 240 1 10 30 34 biblatex-biber-2.4/t/tdata/bibtex-aliases.bcf000444000765000024 26511512667073765 21462 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme doesnotexist.bib bibtex-aliases.bib bibtex-aliases2.bib bibtex-aliases.bib bibtex-aliases.bib MISC REPORT REPORT UNPUBLISHED shorthand label labelname labelname year prefix family given suffix prefix mm presort mm sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender bibtex-aliases.bib alias1 alias2 alias3 alias4 alias5 alias6 alias7 biblatex-biber-2.4/t/tdata/bibtex-aliases.bib000444000765000024 253212667073765 21414 0ustar00philkimestaff000000000000@PHDTHESIS{alias1, AUTHOR = {Sammy Student}, TITLE = {Four Years Later}, INSTITUTION = {University of Life}, ADDRESS = {Ivory Towers}, DATE = {2003-10-01}, } % driver-defined default map to MISC @THING{alias2, AUTHOR = {Samuel Strange}, TITLE = {Entitled}, ADDRESS = {Ivory Towers}, SCHOOL = {University of West Grantham}, INSTITUTION = {University of East Grantham}, DATE = {2004-03-03}, } % User-defined map to CUSTOMB @CHAT{alias3, AUTHOR = {Samuel Strange}, TITLE = {Hello}, } % User-defined map to CUSTOMA plus some alsosets (see tests) @CONVERSATION{alias4, AUTHOR = {Samuel Strange}, TITLE = {Hello}, PARTICIPANT = {Sam Smith}, VERBC = {sometext}, PUBMEDID = {anid}, } % User-defined map of string replacements and null maps @UNPUBLISHED{alias5, ABSTRACT = {Some abstract %50 of which is useless}, AUTHOR = {AAA and BBB and CCC and DDD and EEE}, TITLE = {A title}, DATE = {2003}, USERB = {test}, LISTA = {list test}, LISTB = {late and early}, LISTC = {late and early}, } % No target, just field additions @MISC{alias6, AUTHOR = {Brian Broom}, TITLE = {Bristles} } % No regexp match % Also testing append mode @REPORT{alias7, LISTA = {listaval}, VERBA = {val1}, VERBB = {val2}, VERBC = {val3}, } biblatex-biber-2.4/t/tdata/bibtex-output.bcf000444000765000024 25746312667073765 21410 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 0 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids entryset date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender examples.bib murray kant:ku tool.bib b1 xd1 biblatex-biber-2.4/t/tdata/crossrefs.bcf000444000765000024 24760112667073765 20577 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 0 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender crossrefs.bib cr1 cr2 cr3 cr4 cr6 cr7 cr8 crt xr1 xr2 xr3 xr4 xrt mxr mcr ccr1 ccr2 ccr3 ccr4 circ1 circ2 circ3 r1 crossrefs.bib cr5 biblatex-biber-2.4/t/tdata/crossrefs.bib000444000765000024 1305712667073765 20555 0ustar00philkimestaff000000000000% Testing mincrossrefs. cr1 and cr2 crossrefs should trigger inclusion of cr_m and also % the crossref fields in both of them % Also a test of some aliases @INBOOK{cr1, AUTHOR = {Graham Gullam}, TITLE = {Great and Good Graphs}, ORIGDATE = {1955}, ARCHIVEPREFIX = {SomEPrFiX}, PRIMARYCLASS = {SOMECLASS}, CROSSREF = {cr_m} } @INBOOK{cr2, AUTHOR = {Frederick Fumble}, TITLE = {Fabulous Fourier Forms}, SCHOOL = {School}, INSTITUTION = {Institution}, ORIGDATE = {1943}, CROSSREF = {cr_m} } @BOOK{cr_m, EDITOR = {Edgar Erbriss}, TITLE = {Graphs of the Continent}, PUBLISHER = {Grimble}, YEAR = {1974} } % Testing explicit cite of crossref parent. Should trigger inclusion of child crossref field @INBOOK{cr3, AUTHOR = {Arthur Aptitude}, TITLE = {Arrangements of All Articles}, ORIGDATE = {1934}, ARCHIVEPREFIX = {SomEPrFiX}, EPRINTTYPE = {sometype}, CROSSREF = {crt} } @BOOK{crt, EDITOR = {Mark Monkley}, TITLE = {Beasts of the Burbling Burns}, PUBLISHER = {Rancour}, YEAR = {1996} } % Testing mincrossrefs not reached. cr4 is cited, cr5 isn't, therefore mincrossrefs (2) for % crn not reached @INBOOK{cr4, AUTHOR = {Morris Mumble}, TITLE = {Enterprising Entities}, ORIGDATE = {1911}, CROSSREF = {crn} } @INBOOK{cr5, AUTHOR = {Oliver Ordinary}, TITLE = {Questionable Quidities}, ORIGDATE = {1919}, CROSSREF = {crn} } @BOOK{crn, EDITOR = {Jeremy Jermain}, TITLE = {Vanquished, Victor, Vandal}, PUBLISHER = {Pillsbury}, YEAR = {1945} } % Testing inheritance of event information @PROCEEDINGS{cr6i, AUTHOR = {Spurious Author}, ADDRESS = {Address}, TITLE = {Title of proceeding}, EDITOR = {Editor}, PUBLISHER = {Publisher of proceeding}, EVENTDATE = {2009-08-21/2009-08-24}, EVENTTITLE = {Title of the event}, VENUE = {Location of event}, YEAR = {2009} } @INPROCEEDINGS{cr6, AUTHOR = {Author, Firstname}, CROSSREF = {cr6i}, PAGES = {123--}, TITLE = {Title of inproceeding}, BOOKTITLE = {Manual booktitle}, YEAR = {2009}, } % Testing inheritance of special fields (booktitle, bookauthor etc.) @BOOK{cr7i, AUTHOR = {Brian Bookauthor}, TITLE = {Book Title}, SUBTITLE = {Book Subtitle}, TITLEADDON = {Book Titleaddon}, PUBLISHER = {Publisher of proceeding}, YEAR = {2009}, VERBA = {String}, } @INBOOK{cr7, AUTHOR = {Author, Firstname}, CROSSREF = {cr7i}, PAGES = {123--126}, TITLE = {Title of Book bit}, YEAR = {2010} } % Testing supression of default inheritance @COLLECTION{cr8i, EDITOR = {Brian Editor}, TITLE = {Book Title}, SUBTITLE = {Book Subtitle}, TITLEADDON = {Book Titleaddon}, PUBLISHER = {Publisher of Collection}, YEAR = {2009} } @INCOLLECTION{cr8, AUTHOR = {Smith, Firstname}, CROSSREF = {cr8i}, PAGES = {1--12}, TITLE = {Title of Collection bit}, YEAR = {2010} } % Testing mincrossrefs. xr1 and xr2 xrefs should trigger inclusion of xrm and also % the xreffields in both of them @INBOOK{xr1, AUTHOR = {Zoe Zentrum}, TITLE = {Moods Mildly Modified}, ORIGDATE = {1921}, XREF = {xrm} } @INBOOK{xr2, AUTHOR = {Ian Instant}, TITLE = {Migraines Multiplying Madly}, ORIGDATE = {1926}, XREF = {xrm} } @BOOK{xrm, EDITOR = {Peter Prendergast}, TITLE = {Calligraphy, Calisthenics, Culture}, PUBLISHER = {Mainstream}, YEAR = {1970} } % Testing explicit cite of xref parent. Should trigger inclusion of child xref field @INBOOK{xr3, AUTHOR = {Norman Normal}, TITLE = {Russian Regalia Revisited}, ORIGDATE = {1923}, XREF = {xrt} } @BOOK{xrt, EDITOR = {Lucy Lunders}, TITLE = {Kings, Cork and Calculation}, PUBLISHER = {Middling}, YEAR = {1977} } % Testing mincrossrefs not reached. cr4 is cited, cr5 isn't, therefore mincrossrefs (2) for % crn not reached @INBOOK{xr4, AUTHOR = {Megan Mistrel}, TITLE = {Lumbering Lunatics}, ORIGDATE = {1933}, XREF = {xrn} } @INBOOK{xr5, AUTHOR = {Kenneth Kunrath}, TITLE = {Dreadful Dreary Days}, ORIGDATE = {1900}, XREF = {xrn} } @BOOK{xrn, EDITOR = {Victor Vivacious}, TITLE = {Examples of Excellent Exaggerations}, PUBLISHER = {Oxford}, YEAR = {1935} } % Testing missing xref @INBOOK{mxr, AUTHOR = {Megan Mistrel}, TITLE = {Lumbering Lunatics}, ORIGDATE = {1933}, XREF = {missing1} } % Testing missing crossref @INBOOK{mcr, AUTHOR = {Megan Mistrel}, TITLE = {Lumbering Lunatics}, ORIGDATE = {1933}, CROSSREF = {missing1} } % Testing cascading crossrefs @MVBOOK{ccr1, IDS = {ccr1alias}, AUTHOR = {Vince Various}, EDITOR = {Edward Editor}, TITLE = {Stuff Concerning Varia}, DATE = {1934} } % using alias @BOOK{ccr2, TITLE = {Misc etc.}, DATE = {1923}, CROSSREF = {ccr1alias} } @INBOOK{ccr3, TITLE = {Perhaps, Perchance, Possibilities?}, DATE = {1911}, CROSSREF = {ccr2} } % Testing circular refs detection @BOOK{circ1, DATE = {1911}, CROSSREF = {circ3} } @BOOK{circ2, DATE = {1911}, CROSSREF = {circ1} } @BOOK{circ3, DATE = {1911}, CROSSREF = {circ2} } % Test of dependency calculations for non-cited entries @BOOK{r1, DATE = {1911}, CROSSREF = {r2} } @BOOK{r2, DATE = {1911}, CROSSREF = {r3} } @BOOK{r3, DATE = {1911}, CROSSREF = {r4} } @BOOK{r4, DATE = {1911}, } biblatex-biber-2.4/t/tdata/dm-constraints.bcf000444000765000024 15301212667073765 21523 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort mm sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml eta etb etc etd misc day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedtype relatedstring reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file url verba verbb verbc keywords related options pages execute fielda fieldb field1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12 field13 field14 abstract isbn issn gender eta author title day endday endmonth endyear month year etb etc etd author title day endday endmonth endyear month year month journaltitle fielda fieldb field1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12 field13 field14 misc author title day endday endmonth endyear month year month journaltitle month eta author title etb author title journaltitle field1 field2 field3 field4 field5 field6 field1 field2 field7 field8 field5 field6 field9 field10 etc author title journaltitle field2 field3 field4 field5 field6 field7 field2 field3 field8 field9 field10 field11 field5 etd etc fielda fieldb etd author title journaltitle field2 field3 field4 field7 field5 field8 field9 field10 field11 field6 field12 field13 isbn issn date eventdate origdate urldate gender dm-constraints.bib c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 biblatex-biber-2.4/t/tdata/dm-constraints.bib000444000765000024 604312667073765 21466 0ustar00philkimestaff000000000000% Not a valid type % Valid gender @BADTYPE{c1, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, DATE = {2003-10-01}, GENDER = {sm} } % Completely nonexistent field and field (alias) not valid for this type % Testing a field valid for all entrytypes (ABSTRACT) % Testing missing mandatory field @ETA{c2, TITLE = {Limits of Things}, DATE = {2003-10-01}, BADFIELD = {Something}, JOURNAL = {Some journal}, ABSTRACT = {Some text} } % Datatype constraint - wrong month format % Randomly named field % Invalid gender @ETB{c3, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, YEAR = {2003}, MONTH = {WRONG FORMAT}, FIELD1 = {7}, GENDER = {zz} } % Datatype constraint - wrong month format (range) % Randomly named field with custom range (integer) @ETB{c4, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, YEAR = {2003}, MONTH = {14}, FIELD1 = {4} } % Conditional checks % XOR mandatory check - DATE and YEAR are both defined % all 2,3,4 -> none 5,6 (fail) @ETB{c5, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, DATE = {2004-01-02}, YEAR = {2003}, FIELD2 = {a}, FIELD3 = {a}, FIELD4 = {a}, FIELD5 = {a}, FIELD6 = {a}, } % Conditional checks % all 2,3,4 -> none 5,6 (pass) (because antecedent is not satisfied) % all 1,2 -> one 7,8 (fail) % all 5,6 -> all 9,10 (fail) @ETB{c6, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, YEAR = {2003}, FIELD1 = {8}, FIELD2 = {a}, FIELD3 = {a}, FIELD5 = {a}, FIELD6 = {a}, FIELD9 = {a} } % Conditional checks % one 2,3 -> none 4 (pass) % one 5,6 -> none 7 (fail) % one 2,3 -> all 8,9 (pass) % one 10,11 -> one 5 (pass) % Mandatory OR check - one of FIELDA or FIELDB must be present (fail) @ETC{c7, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, YEAR = {2003}, FIELD2 = {a}, FIELD3 = {a}, FIELD5 = {a}, FIELD7 = {a}, FIELD8 = {a}, FIELD9 = {a}, FIELD11 = {a}, } % Conditional checks % none 2,3 -> none 4 (fail) % none 7 -> none 5 (pass) as antecedent is false % none 8,9 -> one 10,11 (fail) % none 6 -> all 12,13 (fail) % Mandatory OR check - one of FIELDA or FIELDB must be present % (both are, testing different from XOR) (pass) @ETD{c8, AUTHOR = {Clive Constraint}, TITLE = {Limits of Things}, JOURNAL = {Some journal}, YEAR = {2003}, FIELD4 = {a}, FIELD5 = {a}, FIELD7 = {a}, FIELD12 = {a}, FIELDA = {a}, FIELDB = {a}, } % ISBN and ISSN checks @MISC{c9, AUTHOR = {Fred Flummox}, ISBN = {90-70002-34-5}, ISSN = {0317-8471}, } @MISC{c10, AUTHOR = {Fred Flummox}, ISBN = {90-7002-34-5}, ISSN = {0317-8470}, } biblatex-biber-2.4/t/tdata/dm-dateformats.bcf000444000765000024 24531212667073765 21472 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 1 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype reprinttitle shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language month note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location month note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location month note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language month note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon month note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon month note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location month note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location month note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location month note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title date eventdate origdate urldate gender dm-dateformats.bib L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 L15 L16 L17 biblatex-biber-2.4/t/tdata/dm-dateformats.bib000444000765000024 657312667073765 21440 0ustar00philkimestaff000000000000% WRONG - ORIGDATE is mistyped, URLDATE is just wrong % YEAR is messy and should be done by DATE but isn't wrong as such % MONTH is out of range @ARTICLE{L1, AUTHOR = {John Doe}, JOURNALTITLE = {Journal}, TITLE = {Title 1}, YEAR = {1995--1996}, MONTH = {14}, ORIGDATE = {1985-1030}, URLDATE = {1.5.1998}, } % WRONG - missing dash between month and day @BOOK{L2, AUTHOR = {John Doe}, TITLE = {Title 2}, PUBLISHER = {Oxford}, ORIGDATE = {1995-1230}, YEAR = {1991} } % WRONG - completely wrong date range format @BOOK{L3, AUTHOR = {John Doe}, TITLE = {Title 3}, PUBLISHER = {Oxford}, URL = {http://a/b/c}, URLDATE = {1.5.1988}, YEAR = {1854} } % WRONG - 1 digit month @BOOK{L4, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 1}, PUBLISHER = {Oxford}, DATE = {1995-1-04}, } % WRONG - 1 digit day @BOOK{L5, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1995-10-4}, } % WRONG - month out of bounds @BOOK{L6, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 1}, PUBLISHER = {Oxford}, DATE = {1996-13-03}, } % WRONG - day out of bounds @PROCEEDINGS{L7, EDITOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, EVENTDATE = {1996-10-35}, YEAR = {1934} } % WRONG - MONTH not integer @ARTICLE{L8, AUTHOR = {Bill Shakespeare}, JOURNALTITLE = {Journal}, TITLE = {Works}, YEAR = {1985a}, MONTH = {january} } % OK @PROCEEDINGS{L9, EDITOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, EVENTDATE = {1996-12-31}, YEAR = {1234} } % OK @PROCEEDINGS{L10, EDITOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, EVENTDATE = {1996-01-01}, YEAR = {1239} } % WRONG - DATE and YEAR specified @BOOK{L11, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1996-01-01}, YEAR = {1998}, } % WRONG - DATE and MONTH specified @ARTICLE{L12, AUTHOR = {John Doe and Albert Abrahams}, JOURNALTITLE = {Journal}, TITLE = {Title 2}, DATE = {1996-01-01}, MONTH = {02}, } % OK - open-ended date @BOOK{L13, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1996-01-01/}, } % OK - ENDYEAR same as YEAR, labelyear should only have YEAR @BOOK{L14, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1996-12-10/1996-12-12}, } % OK - labelyear should be undef, no DATE or YEAR @BOOK{L15, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, } % MISSING YEAR/DATE @PROCEEDINGS{L16, EDITOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, EVENTDATE = {1996-01-01}, } % OK - YEAR same as ENDYEAR, labelyear should only have YEAR @PROCEEDINGS{L17, PUBSTATE = {inpress}, EDITOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1996-12-10/1996-12-12}, ORIGDATE = {1998-12-10/1998-12-12}, EVENTDATE = {1998-12-10/2004-12-12}, } biblatex-biber-2.4/t/tdata/encoding1.bcf000444000765000024 25650512667073765 20440 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding1.bib testŠ biblatex-biber-2.4/t/tdata/encoding1.bib000444000765000024 43712667073765 20351 0ustar00philkimestaff000000000000% -*- coding: latin-9-unix -*- % This is a latin9 encoded file (Notice the "LATIN CAPITAL LETTER S WITH CARON"). % The top line is a hint to Emacs to open in the right encoding @BOOK{test, YEAR = {1999}, AUTHOR = {Edward Encalcer}, TITLE = {ome title}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/encoding2.bcf000444000765000024 25647712667073765 20451 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding2.bib * biblatex-biber-2.4/t/tdata/encoding2.bib000444000765000024 21712667073765 20346 0ustar00philkimestaff000000000000% This is a UTF-8 encoded file @BOOK{testŠ, YEAR = {1999}, AUTHOR = {Edward Encalcer}, TITLE = {Šome title}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/encoding3.bcf000444000765000024 25647712667073765 20452 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding3.bib * biblatex-biber-2.4/t/tdata/encoding3.bib000444000765000024 44112667073765 20346 0ustar00philkimestaff000000000000% -*- coding: latin-1-unix -*- % This is a latin1 encoded file (Notice the "LATIN SMALL LETTER O WITH DIAERESIS"). % The top line is a hint to Emacs to open in the right encoding @BOOK{test1, YEAR = {1999}, AUTHOR = {Edward Encalcer}, TITLE = {Sme title}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/encoding4.bcf000444000765000024 25647712667073765 20453 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding4.bib * biblatex-biber-2.4/t/tdata/encoding4.bib000444000765000024 44312667073765 20351 0ustar00philkimestaff000000000000% -*- coding: latin-2-unix -*- % This is a latin2 encoded file (Notice the "LATIN CAPITAL LETTER Z WITH DOT ABOVE"). % The top line is a hint to Emacs to open in the right encoding @BOOK{test1, YEAR = {1999}, AUTHOR = {Edward Encalcer}, TITLE = {ome title}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/encoding5.bcf000444000765000024 25647712667073765 20454 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding5.bib * biblatex-biber-2.4/t/tdata/encoding5.bib000444000765000024 21312667073765 20345 0ustar00philkimestaff000000000000% This is a UTF-8 encoded file @BOOK{test, AUTHOR = {Edward Encalcer}, YEAR = {1999}, TITLE = {à titlé}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/encoding6.bcf000444000765000024 25647712667073765 20455 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender encoding6.bib * biblatex-biber-2.4/t/tdata/encoding6.bib000444000765000024 21612667073765 20351 0ustar00philkimestaff000000000000% This is a UTF-8 encoded file @BOOK{test, AUTHOR = {Edward Encalcer}, YEAR = {1999}, TITLE = {↑à titlé}, PUBLISHER = {A press} } biblatex-biber-2.4/t/tdata/examples.bib000444000765000024 16647512667073765 20417 0ustar00philkimestaff000000000000@STRING{anch-ie = {Angew.~Chem. Int.~Ed.} } @STRING{cup = {Cambridge University Press} } @STRING{dtv = {Deutscher Taschenbuch-Verlag} } @STRING{hup = {Harvard University Press} } @STRING{jams = {J.~Amer. Math. Soc.} } @STRING{jchph = {J.~Chem. Phys.} } @STRING{jomch = {J.~Organomet. Chem.} } @STRING{pup = {Princeton University Press} } @InCollection{westfahl:space, crossref = {westfahl:frontier}, langid = {english}, langidopts = {variant=american}, author = {Westfahl, Gary}, indextitle = {True Frontier, The}, title = {The True Frontier}, subtitle = {Confronting and Avoiding the Realities of Space in American Science Fiction Films}, pages = {55--65}, annotation = {A cross-referenced article from a \texttt{collection}. This is an \texttt{incollection} entry with a \texttt{crossref} field. Note the \texttt{subtitle} and \texttt{indextitle} fields} } @Set{set, crossref = {set:herrmann}, entryset = {set:herrmann,set:aksin,set:yoon}, annotation = {A \texttt{set} entry with three members. Note the \texttt{entryset} and \texttt{crossref} fields. The cross-reference must point to the first member of the set} } @Set{stdmodel, crossref = {stdmodel:glashow}, entryset = {stdmodel:glashow,stdmodel:weinberg,stdmodel:salam}, annotation = {A \texttt{set} entry with three members discussing the standard model of particle physics.} } @Set{stdmodel:ps_sc, presort = {zs}, crossref = {stdmodel:glashow}, entryset = {stdmodel:glashow,stdmodel:weinberg,stdmodel:salam}, annotation = {A \texttt{set} entry with three members discussing the standard model of particle physics. Note the \texttt{entryset} and \texttt{crossref} fields. The cross-reference must point to the first member of the set} } @Article{angenendt, langid = {german}, author = {Angenendt, Arnold}, indextitle = {In Honore Salvatoris}, title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der Patrozinienkunde}, shorttitle = {In Honore Salvatoris}, journaltitle = {Revue d'Histoire Eccl{\'e}siastique}, volume = {97}, year = {2002}, pages = {431--456, 791--823}, annotation = {A German article in a French journal. Apart from that, a typical \texttt{article} entry. Note the \texttt{indextitle} field} } @Article{angenendtsk, sortkey = {AATESTKEY}, langid = {german}, author = {Angenendt, Arnold}, indextitle = {In Honore Salvatoris}, title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der Patrozinienkunde}, shorttitle = {In Honore Salvatoris}, journaltitle = {Revue d'Histoire Eccl{\'e}siastique}, volume = {97}, year = {2002}, pages = {431--456, 791--823}, annotation = {A German article in a French journal. Apart from that, a typical \texttt{article} entry. Note the \texttt{indextitle} field} } @Article{angenendtsa, langid = {german}, shortauthor = {AA}, author = {Angenendt, Arnold}, indextitle = {In Honore Salvatoris}, title = {In Honore Salvatoris~-- Vom Sinn und Unsinn der Patrozinienkunde}, shorttitle = {In Honore Salvatoris}, journaltitle = {Revue d'Histoire Eccl{\'e}siastique}, volume = {97}, year = {2002}, pages = {431--456, 791--823}, annotation = {A German article in a French journal. Apart from that, a typical \texttt{article} entry. Note the \texttt{indextitle} field} } @Article{baez/article, langid = {english}, langidopts = {variant=american}, author = {Baez, John C. and Lauda, Aaron D.}, title = {Higher-Dimensional Algebra V: 2-Groups}, journaltitle = {Theory and Applications of Categories}, volume = {12}, version = {3}, date = {2004}, pages = {423--491}, eprint = {math/0307200v3}, eprinttype = {arxiv}, annotation = {An \texttt{article} with \texttt{eprint} and \texttt{eprinttype} fields. Note that the arXiv reference is transformed into a clickable link if \texttt{hyperref} support has been enabled. Compare \texttt{baez\slash online} which is the same item given as an \texttt{online} entry} } @Article{bertram, langid = {english}, langidopts = {variant=american}, author = {Bertram, Aaron and Wentworth, Richard}, title = {Gromov invariants for holomorphic maps on Riemann surfaces}, shorttitle = {Gromov invariants}, journaltitle = jams, volume = {9}, number = {2}, year = {1996}, pages = {529--571}, annotation = {An \texttt{article} entry with a \texttt{volume} and a \texttt{number} field} } @Article{gillies, langid = {english}, langidopts = {variant=british}, author = {Gillies, Alexander}, title = {Herder and the Preparation of Goethe's Idea of World Literature}, journaltitle = {Publications of the English Goethe Society}, volume = {9}, series = {newseries}, year = {1933}, pages = {46--67}, annotation = {An \texttt{article} entry with a \texttt{series} and a \texttt{volume} field. Note that format of the \texttt{series} field in the database file} } @Article{kastenholz, langid = {english}, langidopts = {variant=american}, author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.}, indextitle = {Computation of ionic solvation free energies}, title = {Computation of methodology\hyphen independent ionic solvation free energies from molecular simulations}, subtitle = {I. The electrostatic potential in molecular liquids}, journaltitle = jchph, volume = {124}, eid = {124106}, year = {2006}, doi = {10.1063/1.2172593}, annotation = {An \texttt{article} entry with an \texttt{eid} and a \texttt{doi} field. Note that the \textsc{doi} is transformed into a clickable link if \texttt{hyperref} support has been enabled}, abstract = {The computation of ionic solvation free energies from atomistic simulations is a surprisingly difficult problem that has found no satisfactory solution for more than 15 years. The reason is that the charging free energies evaluated from such simulations are affected by very large errors. One of these is related to the choice of a specific convention for summing up the contributions of solvent charges to the electrostatic potential in the ionic cavity, namely, on the basis of point charges within entire solvent molecules (M scheme) or on the basis of individual point charges (P scheme). The use of an inappropriate convention may lead to a charge-independent offset in the calculated potential, which depends on the details of the summation scheme, on the quadrupole-moment trace of the solvent molecule, and on the approximate form used to represent electrostatic interactions in the system. However, whether the M or P scheme (if any) represents the appropriate convention is still a matter of on-going debate. The goal of the present article is to settle this long-standing controversy by carefully analyzing (both analytically and numerically) the properties of the electrostatic potential in molecular liquids (and inside cavities within them).} } @Article{murray, langid = {english}, langidopts = {variant=american}, author = {Hostetler, Michael J. and Wingate, Julia E. and Zhong, Chuan-Jian and Harris, Jay E. and Vachet, Richard W. and Clark, Michael R. and Londono, J. David and Green, Stephen J. and Stokes, Jennifer J. and Wignall, George D. and Glish, Gary L. and Porter, Marc D. and Evans, Neal D. and Murray, Royce W.}, indextitle = {Alkanethiolate gold cluster molecules}, title = {Alkanethiolate gold cluster molecules with core diameters from 1.5 to 5.2~nm}, subtitle = {Core and monolayer properties as a function of core size}, shorttitle = {Alkanethiolate gold cluster molecules}, journaltitle = {Langmuir}, volume = {14}, number = {1}, year = {1998}, pages = {17--30}, annotation = {An \texttt{article} entry with \arabic{author} authors. By default, long author and editor lists are automatically truncated. This is configurable} } @Article{reese, langid = {english}, langidopts = {variant=american}, author = {Reese, Trevor R.}, title = {Georgia in Anglo-Spanish Diplomacy, 1736-1739}, journaltitle = {William and Mary Quarterly}, volume = {15}, series = {3}, year = {1958}, pages = {168--190}, annotation = {An \texttt{article} entry with a \texttt{series} and a \texttt{volume} field. Note the format of the series. If the value of the \texttt{series} field is an integer, this number is printed as an ordinal and the string \enquote*{series} is appended automatically} } @Article{set:aksin, entryset = {set}, author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent and {\k{C}}etinkaya, Bekir and Ni, Chaoying and B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan}, indextitle = {Effect of immobilization on catalytic characteristics}, title = {Effect of immobilization on catalytic characteristics of saturated Pd-N-heterocyclic carbenes in Mizoroki-Heck reactions}, journaltitle = jomch, volume = {691}, number = {13}, year = {2006}, month = {02}, pages = {3027--3036} } @Article{set:herrmann, entryset = {set}, author = {Herrmann, Wolfgang A. and {\"O}fele, Karl and Schneider, Sabine K. and Herdtweck, Eberhardt and Hoffmann, Stephan D.}, indextitle = {Carbocyclic carbene as an efficient catalyst, A}, title = {A carbocyclic carbene as an efficient catalyst ligand for C--C coupling reactions}, journaltitle = anch-ie, volume = {45}, number = {23}, year = {2006}, pages = {3859--3862} } @Article{set:yoon, entryset = {set}, author = {Yoon, Myeong S. and Ryu, Dowook and Kim, Jeongryul and Ahn, Kyo Han}, indextitle = {Palladium pincer complexes}, title = {Palladium pincer complexes with reduced bond angle strain: efficient catalysts for the Heck reaction}, journaltitle = {Organometallics}, volume = {25}, number = {10}, year = {2006}, pages = {2409--2411} } @Article{shore, author = {Shore, Bradd}, title = {Twice-Born, Once Conceived}, subtitle = {Meaning Construction and Cultural Cognition}, journaltitle = {American Anthropologist}, volume = {93}, series = {newseries}, number = {1}, month = mar, year = {1991}, pages = {9--27}, annotation = {An \texttt{article} entry with \texttt{series}, \texttt{volume}, and \texttt{number} fields. Note the format of the \texttt{series} which is a localization key} } @Article{sigfridsson, langid = {english}, langidopts = {variant=american}, author = {Sigfridsson, Emma and Ryde, Ulf}, indextitle = {Methods for deriving atomic charges}, title = {Comparison of methods for deriving atomic charges from the electrostatic potential and moments}, journaltitle = {Journal of Computational Chemistry}, volume = {19}, number = {4}, year = {1998}, doi = {10.1002/(SICI)1096-987X(199803)19:4<377::AID-JCC1>3.0.CO;2-P}, pages = {377--395}, annotation = {An \texttt{article} entry with \texttt{volume}, \texttt{number}, and \texttt{doi} fields. Note that the \textsc{doi} is transformed into a clickable link if \texttt{hyperref} support has been enabled}, abstract = { Four methods for deriving partial atomic charges from the quantum chemical electrostatic potential (CHELP, CHELPG, Merz-Kollman, and RESP) have been compared and critically evaluated. It is shown that charges strongly depend on how and where the potential points are selected. Two alternative methods are suggested to avoid the arbitrariness in the point-selection schemes and van der Waals exclusion radii: CHELP-BOW, which also estimates the charges from the electrostatic potential, but with potential points that are Boltzmann-weighted after their occurrence in actual simulations using the energy function of the program in which the charges will be used, and CHELMO, which estimates the charges directly from the electrostatic multipole moments. Different criteria for the quality of the charges are discussed.} } @Article{spiegelberg, langid = {german}, sorttitle = {Intention und Intentionalitat in der Scholastik, bei Brentano und Husserl}, indexsorttitle = {Intention und Intentionalitat in der Scholastik, bei Brentano und Husserl}, author = {Spiegelberg, Herbert}, title = {\mkbibquote{Intention} und \mkbibquote{Intentionalit{\"a}t} in der Scholastik, bei Brentano und Husserl}, shorttitle = {Intention und Intentionalit{\"a}t}, journaltitle = {Studia Philosophica}, volume = {29}, year = {1969}, pages = {189--216}, annotation = {An \texttt{article} entry. Note the \texttt{sorttitle} and \texttt{indexsorttitle} fields and the markup of the quotes in the database file} } @Article{springer, langid = {english}, langidopts = {variant=british}, author = {Springer, Otto}, title = {Mediaeval Pilgrim Routes from Scandinavia to Rome}, shorttitle = {Mediaeval Pilgrim Routes}, journaltitle = {Mediaeval Studies}, volume = {12}, year = {1950}, pages = {92--122}, annotation = {A plain \texttt{article} entry} } @Article{stdmodel:glashow, entryset = {stdmodel}, author = {Glashow, Sheldon}, title = {Partial Symmetries of Weak Interactions}, journaltitle = {Nucl.~Phys.}, volume = {22}, year = {1961}, pages = {579\psqq} } @Article{stdmodel:weinberg, entryset = {stdmodel}, author = {Weinberg, Steven}, title = {A Model of Leptons}, journaltitle = {Phys.~Rev.~Lett.}, volume = {19}, year = {1967}, pages = {1264\psqq} } @Book{aristotle:anima, keywords = {primary}, langid = {english}, langidopts = {variant=british}, author = {Aristotle}, editor = {Hicks, Robert Drew}, title = {De Anima}, publisher = cup, location = {Cambridge}, year = {1907}, annotation = {A \texttt{book} entry with an \texttt{author} and an \texttt{editor}} } @Book{aristotle:physics, keywords = {primary}, langid = {english}, langidopts = {variant=american}, author = {Aristotle}, translator = {Wicksteed, P. H. and Cornford, F. M.}, title = {Physics}, shorttitle = {Physics}, publisher = {G. P. Putnam}, location = {New York}, year = {1929}, annotation = {A \texttt{book} entry with a \texttt{translator} field} } @Book{aristotle:poetics, keywords = {primary}, langid = {english}, langidopts = {variant=british}, author = {Aristotle}, editor = {Lucas, D. W.}, title = {Poetics}, shorttitle = {Poetics}, series = {Clarendon Aristotle}, publisher = {Clarendon Press}, location = {Oxford}, year = {1968}, annotation = {A \texttt{book} entry with an \texttt{author} and an \texttt{editor} as well as a \texttt{series} field} } @Book{aristotle:rhetoric, keywords = {primary}, langid = {english}, langidopts = {variant=british}, sorttitle = {Rhetoric of Aristotle}, author = {Aristotle}, editor = {Cope, Edward Meredith}, commentator = {Cope, Edward Meredith}, indextitle = {Rhetoric of Aristotle, The}, title = {The Rhetoric of Aristotle with a commentary by the late Edward Meredith Cope}, shorttitle = {Rhetoric}, volumes = {3}, publisher = cup, year = {1877}, annotation = {A commented edition. Note the concatenation of the \texttt{editor} and \texttt{commentator} fields as well as the \texttt{volumes}, \texttt{sorttitle}, and \texttt{indextitle} fields} } @Book{augustine, langid = {english}, langidopts = {variant=british}, author = {Augustine, Robert L.}, title = {Heterogeneous catalysis for the synthetic chemist}, shorttitle = {Heterogeneous catalysis}, publisher = {Marcel Dekker}, location = {New York}, year = {1995}, annotation = {A plain \texttt{book} entry} } @Book{averroes/bland, keywords = {primary}, langid = {english}, langidopts = {variant=american}, author = {Averroes}, editor = {Bland, Kalman P.}, translator = {Bland, Kalman P.}, indextitle = {Epistle on the Possibility of Conjunction, The}, title = {The Epistle on the Possibility of Conjunction with the Active Intellect by Ibn Rushd with the Commentary of Moses Narboni}, shorttitle = {Possibility of Conjunction}, series = {Moreshet: Studies in Jewish History, Literature and Thought}, number = {7}, publisher = {Jewish Theological Seminary of America}, location = {New York}, year = {1982}, annotation = {A \texttt{book} entry with a \texttt{series} and a \texttt{number}. Note the concatenation of the \texttt{editor} and \texttt{translator} fields as well as the \texttt{indextitle} field} } @Book{averroes/hannes, keywords = {primary}, langid = {german}, sorttitle = {Uber die Moglichkeit der Conjunktion}, indexsorttitle = {Uber die Moglichkeit der Conjunktion}, author = {Averroes}, editor = {Hannes, Ludwig}, translator = {Hannes, Ludwig}, annotator = {Hannes, Ludwig}, indextitle = {{\"U}ber die M{\"o}glichkeit der Conjunktion}, title = {Des Averro{\"e}s Abhandlung: \mkbibquote{{\"U}ber die M{\"o}glichkeit der Conjunktion} oder \mkbibquote{{\"U}ber den materiellen Intellekt}}, shorttitle = {M{\"o}glichkeit der Conjunktion}, publisher = {C.~A. Kaemmerer}, location = {Halle an der Saale}, year = {1892}, annotation = {An annotated edition. Note the concatenation of the \texttt{editor}, \texttt{translator}, and \texttt{annotator} fields. Also note the \texttt{shorttitle}, \texttt{indextitle}, \texttt{sorttitle}, and \texttt{indexsorttitle} fields} } @Book{averroes/hercz, keywords = {primary}, langid = {german}, indexsorttitle = {Drei Abhandlungen uber die Conjunction}, author = {Averroes}, editor = {Hercz, J.}, translator = {Hercz, J.}, indextitle = {Drei Abhandlungen {\"u}ber die Conjunction}, title = {Drei Abhandlungen {\"u}ber die Conjunction des separaten Intellects mit dem Menschen}, subtitle = {Von Averroes (Vater und Sohn), aus dem Arabischen {\"u}bersetzt von Samuel Ibn Tibbon}, shorttitle = {Drei Abhandlungen}, publisher = {S.~Hermann}, location = {Berlin}, year = {1869}, annotation = {A \texttt{book} entry. Note the concatenation of the \texttt{editor} and \texttt{translator} fields as well as the \texttt{indextitle} and \texttt{indexsorttitle} fields} } @Book{cicero, langid = {german}, author = {Cicero, Marcus Tullius}, editor = {Blank-Sangmeister, Ursula}, translator = {Blank-Sangmeister, Ursula}, afterword = {Thraede, Klaus}, indextitle = {De natura deorum}, title = {De natura deorum. {\"U}ber das Wesen der G{\"o}tter}, shorttitle = {De natura deorum}, language = {langlatin and langgerman}, publisher = {Reclam}, location = {Stuttgart}, year = {1995}, annotation = {A bilingual edition of Cicero's \emph{De natura deorum}, with a German translation. Note the format of the \texttt{language} field in the database file, the concatenation of the \texttt{editor} and \texttt{translator} fields, and the \texttt{afterword} field} } @Book{coleridge, langid = {english}, langidopts = {variant=british}, author = {Coleridge, Samuel Taylor}, editor = {Coburn, Kathleen and Engell, James and Bate, W. Jackson}, indextitle = {Biographia literaria}, title = {Biographia literaria, or Biographical sketches of my literary life and opinions}, shorttitle = {Biographia literaria}, maintitle = {The collected works of Samuel Taylor Coleridge}, part = {2}, volume = {7}, series = {Bollingen Series}, number = {75}, publisher = {Routledge and Kegan Paul}, location = {London}, year = {1983}, annotation = {One (partial) volume of a multivolume book. This is a \texttt{book} entry with a \texttt{volume} and a \texttt{part} field which explicitly refers to the second (physical) part of the seventh (logical) volume. Also note the \texttt{series} and \texttt{number} fields} } @Book{companion, langid = {english}, langidopts = {variant=american}, sorttitle = {LaTeX Companion}, author = {Goossens, Michel and Mittelbach, Frank and Samarin, Alexander}, indextitle = {LaTeX Companion, The}, title = {The LaTeX Companion}, shorttitle = {LaTeX Companion}, edition = {1}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1994}, annotation = {A book with three authors. Note the formatting of the author list. By default, only the first name is reversed in the bibliography} } @Book{cotton, langid = {english}, langidopts = {variant=british}, author = {Cotton, Frank Albert and Wilkinson, Geoffrey and Murillio, Carlos A. and Bochmann, Manfred}, title = {Advanced inorganic chemistry}, edition = {6}, publisher = {Wiley}, location = {Chichester}, year = {1999}, annotation = {A \texttt{book} entry with \arabic{author} authors and an \texttt{edition} field. By default, long \texttt{author} and \texttt{editor} lists are automatically truncated. This is configurable} } @Book{gerhardt, langid = {english}, langidopts = {variant=american}, sorttitle = {Federal Appointments Process}, author = {Gerhardt, Michael J.}, indextitle = {Federal Appointments Process, The}, title = {The Federal Appointments Process}, subtitle = {A Constitutional and Historical Analysis}, shorttitle = {Federal Appointments Process}, publisher = {Duke University Press}, location = {Durham and London}, year = {2000}, annotation = {This is a \texttt{book} entry. Note the format of the \texttt{location} field as well as the \texttt{sorttitle} and \texttt{indextitle} fields} } @Book{gonzalez, langid = {english}, langidopts = {variant=american}, sorttitle = {Ghost of John Wayne and Other Stories}, author = {Gonzalez, Ray}, indextitle = {Ghost of John Wayne and Other Stories, The}, title = {The Ghost of John Wayne and Other Stories}, shorttitle = {Ghost of John Wayne}, publisher = {The University of Arizona Press}, location = {Tucson}, year = {2001}, isbn = {0-816-52066-6}, annotation = {A collection of short stories. This is a \texttt{book} entry. Note the \texttt{sorttitle} and \texttt{indextitle} fields in the database file. There's also an \texttt{isbn} field} } @Book{hammond, langid = {english}, langidopts = {variant=british}, sorttitle = {Basics of crystallography and diffraction}, author = {Hammond, Christopher}, indextitle = {Basics of crystallography and diffraction, The}, title = {The basics of crystallography and diffraction}, shorttitle = {Crystallography and diffraction}, publisher = {International Union of Crystallography and Oxford University Press}, location = {Oxford}, year = {1997}, annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and \texttt{indextitle} fields as well as the format of the \texttt{publisher} field} } @Book{iliad, langid = {german}, sorttitle = {Ilias}, author = {Homer}, translator = {Schadewaldt, Wolfgang}, introduction = {Latacz, Joachim}, indextitle = {Ilias, Die}, title = {Die Ilias}, shorttitle = {Ilias}, edition = {3}, publisher = {Artemis \& Winkler}, location = {D{\"u}sseldorf and Z{\"u}rich}, year = {2004}, annotation = {A German translation of the \emph{Iliad}. Note the \texttt{translator} and \texttt{introduction} fields and the format of the \texttt{location} field in the database file. Also note the \texttt{sorttitle} and \texttt{indextitle} fields} } @Book{knuth:ct, langid = {english}, langidopts = {variant=american}, sortyear = {1984-0}, sorttitle = {Computers & Typesetting}, indexsorttitle = {Computers & Typesetting}, author = {Knuth, Donald E.}, title = {Computers \& Typesetting}, volumes = {5}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, date = {1984/1986}, annotation = {A five-volume book cited as a whole. This is a \texttt{book} entry, note the \texttt{volumes} field} } @Book{knuth:ct:a, langid = {english}, langidopts = {variant=american}, sortyear = {1984-1}, sorttitle = {Computers & Typesetting A}, indexsorttitle = {The TeXbook}, author = {Knuth, Donald E.}, indextitle = {\TeX book, The}, title = {The \TeX book}, shorttitle = {\TeX book}, maintitle = {Computers \& Typesetting}, volume = {A}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1984}, annotation = {The first volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields. We want this volume to be listed after the entry referring to the entire five-volume set. Also note the \texttt{indextitle} and \texttt{indexsorttitle} fields} } @Book{knuth:ct:b, langid = {english}, langidopts = {variant=american}, sortyear = {1984-2}, sorttitle = {Computers & Typesetting B}, indexsorttitle = {TeX: The Program}, author = {Knuth, Donald E.}, title = {\TeX: The Program}, shorttitle = {\TeX}, maintitle = {Computers \& Typesetting}, volume = {B}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1986}, annotation = {The second volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields. Also note the \texttt{indexsorttitle} field} } @Book{knuth:ct:c, langid = {english}, langidopts = {variant=american}, sortyear = {1984-3}, sorttitle = {Computers & Typesetting C}, author = {Knuth, Donald E.}, indextitle = {METAFONTbook, The}, title = {The METAFONTbook}, shorttitle = {METAFONTbook}, maintitle = {Computers \& Typesetting}, volume = {C}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1986}, annotation = {The third volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields as well as the \texttt{indextitle} field} } @Book{knuth:ct:d, langid = {english}, langidopts = {variant=american}, sortyear = {1984-4}, sorttitle = {Computers & Typesetting D}, author = {Knuth, Donald E.}, title = {METAFONT: The Program}, shorttitle = {METAFONT}, maintitle = {Computers \& Typesetting}, volume = {D}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1986}, annotation = {The fourth volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields} } @Book{knuth:ct:e, langid = {english}, langidopts = {variant=american}, sortyear = {1984-5}, sorttitle = {Computers & Typesetting E}, author = {Knuth, Donald E.}, title = {Computer Modern Typefaces}, maintitle = {Computers \& Typesetting}, volume = {E}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, year = {1986}, annotation = {The fifth volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields} } @Book{malinowski, langid = {english}, langidopts = {variant=british}, author = {Malinowski, Bronis{\l}aw}, title = {Argonauts of the Western Pacific}, subtitle = {An account of native enterprise and adventure in the Archipelagoes of Melanesian New Guinea}, shorttitle = {Argonauts}, edition = {8}, publisher = {Routledge and Kegan Paul}, location = {London}, year = {1972}, annotation = {This is a \texttt{book} entry. Note the format of the \texttt{publisher} and \texttt{edition} fields as well as the \texttt{subtitle} field} } @Book{maron, langid = {english}, langidopts = {variant=american}, author = {Maron, Monika}, translator = {Brigitte Goldstein}, title = {Animal Triste}, shorttitle = {Animal Triste}, publisher = {University of Nebraska Press}, location = {Lincoln}, year = {2000}, origlanguage = {german}, annotation = {An English translation of a German novel with a French title. In other words: a \texttt{book} entry with a \texttt{translator} field. Note the \texttt{origlanguage} field which is concatenated with the \texttt{translator}} } @Book{massa, langid = {english}, langidopts = {variant=british}, author = {Werner Massa}, title = {Crystal structure determination}, edition = {2}, publisher = {Spinger}, location = {Berlin}, year = {2004}, annotation = {A \texttt{book} entry with an \texttt{edition} field} } @Book{nietzsche:ksa, langid = {german}, sortyear = {1988-00-000}, sorttitle = {Werke-00-000}, indexsorttitle = {Samtliche Werke}, author = {Nietzsche, Friedrich}, editor = {Colli, Giorgio and Montinari, Mazzino}, title = {S{\"a}mtliche Werke}, subtitle = {Kritische Studienausgabe}, volumes = {15}, edition = {2}, publisher = dtv # { and Walter de Gruyter}, location = {M{\"u}nchen and Berlin and New York}, year = {1988}, annotation = {The critical edition of Nietzsche's works. This is a \texttt{book} entry referring to a 15-volume work as a whole. Note the \texttt{volumes} field and the format of the \texttt{publisher} and \texttt{location} fields in the database file. Also note the \texttt{sorttitle} and \texttt{sortyear} fields which are used to fine-tune the sorting order of the bibliography. We want this item listed first in the bibliography} } @Book{nietzsche:ksa1, langid = {german}, sortyear = {1988-01-000}, sorttitle = {Werke-01-000}, indexsorttitle = {Samtliche Werke I}, author = {Nietzsche, Friedrich}, bookauthor = {Nietzsche, Friedrich}, editor = {Colli, Giorgio and Montinari, Mazzino}, indextitle = {S{\"a}mtliche Werke I}, title = {Die Geburt der Trag{\"o}die. Unzeitgem{\"a}{\ss}e Betrachtungen I--IV. Nachgelassene Schriften 1870--1973}, shorttitle = {S{\"a}mtliche Werke I}, maintitle = {S{\"a}mtliche Werke}, mainsubtitle = {Kritische Studienausgabe}, volume = {1}, edition = {2}, publisher = dtv # { and Walter de Gruyter}, location = {M{\"u}nchen and Berlin and New York}, year = {1988}, annotation = {A single volume from the critical edition of Nietzsche's works. This \texttt{book} entry explicitly refers to the first volume only. Note the \texttt{title} and \texttt{maintitle} fields. Also note the \texttt{sorttitle} and \texttt{sortyear} fields. We want this entry to be listed after the entry referring to the entire edition} } @Book{nussbaum, keywords = {secondary}, langid = {english}, langidopts = {variant=american}, sorttitle = {Aristotle's De Motu Animalium}, indexsorttitle = {Aristotle's De Motu Animalium}, author = {Nussbaum, Martha}, title = {Aristotle's \mkbibquote{De Motu Animalium}}, publisher = pup, location = {Princeton}, year = {1978}, annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and \texttt{indexsorttitle} fields and the markup of the quotes in the database file} } @Book{piccato, langid = {english}, langidopts = {variant=american}, author = {Piccato, Pablo}, title = {City of Suspects}, subtitle = {Crime in Mexico City, 1900--1931}, shorttitle = {City of Suspects}, publisher = {Duke University Press}, location = {Durham and London}, year = {2001}, annotation = {This is a \texttt{book} entry. Note the format of the \texttt{location} field in the database file} } @Book{vangennep, options = {useprefix}, langid = {french}, sorttitle = {Rites de passage}, author = {van Gennep, Arnold}, indextitle = {Rites de passage, Les}, title = {Les rites de passage}, shorttitle = {Rites de passage}, publisher = {Nourry}, location = {Paris}, year = {1909}, annotation = {A \texttt{book} entry. Note the format of the printed name and compare the \texttt{useprefix} option in the \texttt{options} field as well as \texttt{brandt} and \texttt{geer}} } @Book{vangennepx, langid = {french}, author = {van Gennep, Jean}, title = {Il a neigé à Port-au-Prince}, publisher = {Alhambra}, location = {Montréal}, year = {1999} } @Book{vazques-de-parga, langid = {spanish}, sorttitle = {Peregrinaciones a Santiago de Compostela}, author = {V{\'a}zques{ de }Parga, Luis and Lacarra, Jos{\'e} Mar{\'i}a and Ur{\'i}a R{\'i}u, Juan}, indextitle = {Peregrinaciones a Santiago de Compostela, Las}, title = {Las Peregrinaciones a Santiago de Compostela}, shorttitle = {Peregrinaciones}, volumes = {3}, publisher = {Iberdrola}, location = {Pamplona}, year = {1993}, note = {Ed. facs. de la realizada en 1948--49}, annotation = {A multivolume book cited as a whole. This is a \texttt{book} entry with \texttt{volumes}, \texttt{note}, \texttt{sorttitle}, and \texttt{indextitle} fields} } @Book{worman, langid = {english}, langidopts = {variant=american}, sorttitle = {Cast of Character}, author = {Worman, Nancy}, indextitle = {Cast of Character, The}, title = {The Cast of Character}, subtitle = {Style in Greek Literature}, shorttitle = {Cast of Character}, publisher = {University of Texas Press}, location = {Austin}, year = {2002}, annotation = {A \texttt{book} entry. Note the \texttt{sorttitle} and \texttt{indextitle} fields} } @Book{wormanx, langid = {english}, langidopts = {variant=american}, sorttitle = {Someone did it again}, author = {Worman, Nana}, indextitle = {Someone did it again}, title = {Someone did it again}, publisher = {University of Nowhere Press}, location = {Somewhere}, year = {2009} } @Collection{britannica, options = {useeditor=false}, label = {EB}, langid = {english}, langidopts = {variant=british}, sorttitle = {Encyclop{\ae}dia Britannica}, editor = {Preece, Warren E.}, indextitle = {Encyclop{\ae}dia Britannica, The New}, title = {The New Encyclop{\ae}dia Britannica}, shorttitle = {Encyclop{\ae}dia Britannica}, volumes = {32}, edition = {15}, publisher = {Encyclop{\ae}dia Britannica}, location = {Chicago, Ill.}, year = {2003}, annotation = {This is a \texttt{collection} entry for an encyclopedia. Note the \texttt{useeditor} option in the \texttt{options} field as well as the \texttt{sorttitle} field. We want this entry to be cited and alphabetized by title even though there is an editor. In addition to that, we want the title to be alphabetized under \enquote*{E} rather than \enquote*{T}. Also note the \texttt{label} field which is provided for author-year citation styles} } @Collection{gaonkar, langid = {english}, langidopts = {variant=american}, editor = {Gaonkar, Dilip Parameshwar}, title = {Alternative Modernities}, publisher = {Duke University Press}, location = {Durham and London}, year = {2001}, isbn = {0-822-32714-7}, annotation = {This is a \texttt{collection} entry. Note the format of the \texttt{location} field in the database file as well as the \texttt{isbn} field} } @Collection{jaffe, editor = {Jaff{\'e}, Philipp}, editora = {Loewenfeld, Samuel and Kaltenbrunner, Ferdinand and Ewald, Paul}, editoratype = {redactor}, indextitle = {Regesta Pontificum Romanorum}, title = {Regesta Pontificum Romanorum ab condita ecclesia ad annum post Christum natum \textsc{mcxcviii}}, shorttitle = {Regesta Pontificum Romanorum}, volumes = {2}, edition = {2}, location = {Leipzig}, date = {1885/1888}, annotation = {A \texttt{collection} entry with \texttt{edition} and \texttt{volumes} fields. Note the \texttt{editortype} field handling the redactor} } @Collection{westfahl:frontier, langid = {english}, langidopts = {variant=american}, editor = {Westfahl, Gary}, title = {Space and Beyond}, subtitle = {The Frontier Theme in Science Fiction}, booktitle = {Space and Beyond}, booksubtitle = {The Frontier Theme in Science Fiction}, publisher = {Greenwood}, location = {Westport, Conn. and London}, year = {2000}, annotation = {This is a \texttt{collection} entry. Note the format of the \texttt{location} field as well as the \texttt{subtitle} and \texttt{booksubtitle} fields} } @InBook{kant:kpv, shorthand = {KpV}, langid = {german}, author = {Kant, Immanuel}, bookauthor = {Kant, Immanuel}, title = {Kritik der praktischen Vernunft}, shorttitle = {Kritik der praktischen Vernunft}, booktitle = {Kritik der praktischen Vernunft. Kritik der Urtheilskraft}, maintitle = {Kants Werke. Akademie Textausgabe}, volume = {5}, publisher = {Walter de Gruyter}, location = {Berlin}, year = {1968}, pages = {1--163}, annotation = {An edition of Kant's \emph{Collected Works}, volume five. This is an \texttt{inbook} entry which explicitly refers to the \emph{Critique of Practical Reason} only, not to the entire fifth volume. Note the \texttt{author} and \texttt{bookauthor} fields in the database file. By default, the \texttt{bookauthor} is omitted if the values of the \texttt{author} and \texttt{bookauthor} fields are identical} } @InBook{kant:ku, shorthand = {KU}, langid = {german}, author = {Kant, Immanuel}, bookauthor = {Kant, Immanuel}, title = {Kritik der Urtheilskraft}, booktitle = {Kritik der praktischen Vernunft. Kritik der Urtheilskraft}, maintitle = {Kants Werke. Akademie Textausgabe}, volume = {5}, publisher = {Walter de Gruyter}, location = {Berlin}, year = {1968}, pages = {165--485}, annotation = {An edition of Kant's \emph{Collected Works}, volume five. This is an \texttt{inbook} entry which explicitly refers to the \emph{Critique of Judgment} only, not to the entire fifth volume} } @InBook{nietzsche:historie, langid = {german}, sortyear = {1988-01-243}, sorttitle = {Werke-01-243}, indexsorttitle = {Vom Nutzen und Nachtheil der Historie fur das Leben}, author = {Nietzsche, Friedrich}, bookauthor = {Nietzsche, Friedrich}, editor = {Colli, Giorgio and Montinari, Mazzino}, indextitle = {Vom Nutzen und Nachtheil der Historie f{\"u}r das Leben}, title = {Unzeitgem{\"a}sse Betrachtungen. Zweites St{\"u}ck}, subtitle = {Vom Nutzen und Nachtheil der Historie f{\"u}r das Leben}, shorttitle = {Vom Nutzen und Nachtheil der Historie}, booktitle = {Die Geburt der Trag{\"o}die. Unzeitgem{\"a}{\ss}e Betrachtungen I--IV. Nachgelassene Schriften 1870--1973}, maintitle = {S{\"a}mtliche Werke}, mainsubtitle = {Kritische Studienausgabe}, volume = {1}, publisher = dtv # { and Walter de Gruyter}, location = {M{\"u}nchen and Berlin and New York}, year = {1988}, pages = {243--334}, annotation = {A single essay from the critical edition of Nietzsche's works. This \texttt{inbook} entry explicitly refers to an essay found in the first volume. Note the \texttt{title}, \texttt{booktitle}, and \texttt{maintitle} fields. Also note the \texttt{sorttitle} and \texttt{sortyear} fields. We want this entry to be listed after the entry referring to the entire first volume} } @InCollection{brandt, options = {useprefix=false}, langid = {german}, indexsorttitle = {Nordischen Lander von der Mitte des 11. Jahrhunderts bis 1448}, author = {von Brandt, Ahasver and Erich Hoffmann}, editor = {Ferdinand Seibt}, indextitle = {Nordischen L{\"a}nder von der Mitte des 11.~Jahrhunderts bis 1448, Die}, title = {Die nordischen L{\"a}nder von der Mitte des 11.~Jahrhunderts bis 1448}, shorttitle = {Die nordischen L{\"a}nder}, booktitle = {Europa im Hoch- und Sp{\"a}tmittelalter}, series = {Handbuch der europ{\"a}ischen Geschichte}, number = {2}, publisher = {Klett-Cotta}, location = {Stuttgart}, year = {1987}, pages = {884--917}, annotation = {An \texttt{incollection} entry with a \texttt{series} and a \texttt{number}. Note the format of the printed name and compare the \texttt{useprefix} option in the \texttt{options} field as well as \texttt{vangennep}. Also note the \texttt{indextitle, and \texttt{indexsorttitle} fields}} } @InCollection{hyman, keywords = {secondary}, langid = {english}, langidopts = {variant=american}, author = {Arthur Hyman}, editor = {O'Meara, Dominic J.}, indextitle = {Aristotle's Theory of the Intellect}, title = {Aristotle's Theory of the Intellect and its Interpretation by Averroes}, shorttitle = {Aristotle's Theory of the Intellect}, booktitle = {Studies in Aristotle}, series = {Studies in Philosophy and the History of Philosophy}, number = {9}, publisher = {The Catholic University of America Press}, location = {Washington, D.C.}, year = {1981}, pages = {161--191}, annotation = {An \texttt{incollection} entry with a \texttt{series} and \texttt{number} field} } @InCollection{pines, keywords = {secondary}, langid = {english}, langidopts = {variant=american}, author = {Pines, Shlomo}, editor = {Twersky, Isadore}, indextitle = {Limitations of Human Knowledge According to Al-Farabi, ibn Bajja, and Maimonides, The}, title = {The Limitations of Human Knowledge According to Al-Farabi, ibn Bajja, and Maimonides}, shorttitle = {Limitations of Human Knowledge}, booktitle = {Studies in Medieval Jewish History and Literature}, publisher = hup, location = {Cambridge, Mass.}, year = {1979}, pages = {82--109}, annotation = {A typical \texttt{incollection} entry. Note the \texttt{indextitle} field} } @InProceedings{moraux, keywords = {secondary}, langid = {french}, indexsorttitle = {De Anima dans la tradition grecque}, author = {Moraux, Paul}, editor = {Lloyd, G. E. R. and Owen, G. E. L.}, indextitle = {\emph{De Anima} dans la tradition gr{\`e}cque, Le}, title = {Le \emph{De Anima} dans la tradition gr{\`e}cque}, subtitle = {Quelques aspects de l'interpretation du trait{\'e}, de Theophraste {\`a} Themistius}, shorttitle = {\emph{De Anima} dans la tradition gr{\`e}cque}, booktitle = {Aristotle on Mind and the Senses}, booktitleaddon = {Proceedings of the Seventh Symposium Aristotelicum (1975)}, publisher = cup, location = {Cambridge}, date = {1979-01-02/1980-04-08}, origdate = {1924-06-07/1924-07-09}, eventdate = {1924-02-03/1924-02-05}, urldate = {1979-03-03/1979-03-04}, url = {http://some/thing}, pages = {281--324}, annotation = {This is a typical \texttt{inproceedings} entry. Note the \texttt{booksubtitle}, \texttt{shorttitle}, \texttt{indextitle}, and \texttt{indexsorttitle} fields} } @InProceedings{stdmodel:salam, entryset = {stdmodel}, author = {Salam, Abdus}, editor = {Svartholm, Nils}, title = {Weak and Electromagnetic Interactions}, booktitle = {Elementary particle theory}, booksubtitle = {Relativistic groups and analyticity}, booktitleaddon = {Proceedings of the Eighth Nobel Symposium, May 19--25, 1968}, venue = {Aspen{\"a}sgarden, Lerum}, publisher = {Almquist \& Wiksell}, location = {Stockholm}, year = {1968}, pages = {367\psqq} } @Manual{cms, label = {CMS}, langid = {english}, langidopts = {variant=american}, sorttitle = {Chicago Manual of Style}, indextitle = {Chicago Manual of Style, The}, title = {The Chicago Manual of Style}, subtitle = {The Essential Guide for Writers, Editors, and Publishers}, shorttitle = {Chicago Manual of Style}, edition = {15}, publisher = {University of Chicago Press}, location = {Chicago, Ill.}, year = {2003}, isbn = {0-226-10403-6}, annotation = {This is a \texttt{manual} entry without an \texttt{author} or \texttt{editor}. Note the \texttt{label} field in the database file which is provided for author-year citation styles. Also note the \texttt{sorttitle} and \texttt{indextitle} fields. By default, all entries without an \texttt{author} or \texttt{editor} are alphabetized by \texttt{title} but we want this entry to be alphabetized under \enquote*{C} rather than \enquote*{T}. There's also an \texttt{isbn} field} } @Online{baez/online, langid = {english}, langidopts = {variant=american}, author = {Baez, John C. and Lauda, Aaron D.}, title = {Higher-Dimensional Algebra V: 2-Groups}, version = {3}, date = {2004-10-27}, eprint = {math/0307200v3}, eprinttype = {arxiv}, annotation = {An \texttt{online} reference from arXiv. Note the \texttt{eprint} and \texttt{eprinttype} fields. Also note that the arXiv reference is transformed into a clickable link if \texttt{hyperref} support has been enabled. Compare \texttt{baez\slash article} which is the same item given as an \texttt{article} entry with eprint information} } @Online{ctan, label = {CTAN}, langid = {english}, langidopts = {variant=american}, title = {CTAN}, subtitle = {The Comprehensive TeX Archive Network}, year = {2006}, url = {http://www.ctan.org}, urldate = {2006-10-01}, annotation = {This is an \texttt{online} entry. The \textsc{url}, which is given in the \texttt{url} field, is transformed into a clickable link if \texttt{hyperref} support has been enabled. Note the format of the \texttt{urldate} field (\texttt{yyyy-mm-dd}) in the database file. It is also possible to use the fields \texttt{urlday}\slash \texttt{urlmonth}\slash \texttt{urlyear} instead. Also note the \texttt{label} field which may be used as a fallback by citation styles which need an \texttt{author} and\slash or a \texttt{year}} } @Online{itzhaki, langid = {english}, langidopts = {variant=american}, author = {Itzhaki, Nissan}, title = {Some remarks on 't Hooft's S-matrix for black holes}, version = {1}, date = {1996-03-11}, eprint = {hep-th/9603067}, eprinttype = {arxiv}, annotation = {An \texttt{online} reference from arXiv. Note the \texttt{eprint} and \texttt{eprinttype} fields. Also note that the arXiv reference is transformed into a clickable link if \texttt{hyperref} support has been enabled}, abstract = {We discuss the limitations of 't Hooft's proposal for the black hole S-matrix. We find that the validity of the S-matrix implies violation of the semi-classical approximation at scales large compared to the Planck scale. We also show that the effect of the centrifugal barrier on the S-matrix is crucial even for large transverse distances.} } @Online{markey, langid = {english}, langidopts = {variant=american}, sorttitle = {Tame the Beast}, author = {Markey, Nicolas}, title = {Tame the BeaST}, subtitle = {The B to X of BibTeX}, version = {1.3}, url = {http://tug.ctan.org/tex-archive/info/bibtex/tamethebeast/ttb_en.pdf}, urldate = {2006-10-01}, annotation = {An \texttt{online} entry for a tutorial. Note the format of the \texttt{date} field (\texttt{yyyy-mm-dd}) in the database file. It is also possible to use the fields \texttt{day}\slash \texttt{month}\slash \texttt{year} instead.} } @Patent{almendro, langid = {german}, author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez, Alberto and Nozal, Fernando}, title = {Elektromagnetisches Signalhorn}, number = {EU-29702195U}, location = {countryes and countryfr and countryuk and countryde}, year = {1998}, annotation = {This is a \texttt{patent} entry with a \texttt{location} field. The number is given in the \texttt{number} field. Note the format of the \texttt{location} field in the database file. Compare \texttt{laufenberg}, \texttt{sorace}, and \texttt{kowalik}} } @Patent{kowalik, langid = {french}, author = {Kowalik, F. and Isard, M.}, indextitle = {Estimateur d'un d{\'e}faut de fonctionnement}, title = {Estimateur d'un d{\'e}faut de fonctionnement d'un modulateur en quadrature et {\'e}tage de modulation l'utilisant}, type = {patreqfr}, number = {9500261}, date = {1995-01-11}, annotation = {This is a \texttt{patent} entry for a French patent request with a full date. The number is given in the \texttt{number} field. Note the format of the \texttt{type} and \texttt{date} fields in the database file. Compare \texttt{almendro}, \texttt{laufenberg}, and \texttt{sorace}} } @Patent{laufenberg, langid = {german}, author = {Laufenberg, Xaver and Eynius, Dominique and Suelzle, Helmut and Usbeck, Stephan and Spaeth, Matthias and Neuser-Hoffmann, Miriam and Myrzik, Christian and Schmid, Manfred and Nietfeld, Franz and Thiel, Alexander and Braun, Harald and Ebner, Norbert}, holder = {{Robert Bosch GmbH} and {Daimler Chrysler AG} and {Bayerische Motoren Werke AG}}, title = {Elektrische Einrichtung und Betriebsverfahren}, type = {patenteu}, number = {1700367}, location = {countryde and countrywo}, date = {2006-09-13}, annotation = {This is a \texttt{patent} entry with a \texttt{holder} field. Note the format of the \texttt{type} and \texttt{location} fields in the database file. Compare \texttt{almendro}, \texttt{sorace}, and \texttt{kowalik}}, abstract = {The invention relates to an electric device comprising a generator, in particular for use in the vehicle electric system of a motor vehicle and a controller for controlling the generator voltage. The device is equipped with a control zone, in which the voltage is controlled and zones, in which the torque is controlled. The invention also relates to methods for operating a device of this type.}, file = {http://v3.espacenet.com/textdoc?IDX=EP1700367} } @Patent{sorace, langid = {english}, langidopts = {variant=american}, author = {Sorace, Ronald E. and Reinhardt, Victor S. and Vaughn, Steven A.}, holder = {{Hughes Aircraft Company}}, title = {High-Speed Digital-to-RF Converter}, type = {patentus}, number = {5668842}, date = {1997-09-16}, annotation = {This is a \texttt{patent} entry with a \texttt{holder} field. Note the format of the \texttt{type} and \texttt{date} fields in the database file. Compare \texttt{almendro}, \texttt{laufenberg}, and \texttt{kowalik}} } @Report{chiu, langid = {english}, langidopts = {variant=american}, sorttitle = {Hybrid Hierarchical Model of a Multiple Virtual Storage (MVS) Operating System}, author = {Chiu, Willy W. and Chow, We Min}, indextitle = {Hybrid Hierarchical Model, A}, title = {A Hybrid Hierarchical Model of a Multiple Virtual Storage (MVS) Operating System}, institution = {IBM and HP and Sun and Sony}, type = {resreport}, number = {RC-6947}, year = {1978}, annotation = {This is a \texttt{report} entry for a research report. Note the format of the \texttt{type} field in the database file which uses a localization key. The number of the report is given in the \texttt{number} field. Also note the \texttt{sorttitle} and \texttt{indextitle} fields} } @Report{padhye, langid = {english}, langidopts = {variant=american}, sorttitle = {A Stochastic Model of TCP Reno Congestion Avoidance and Control}, author = {Padhye, Jitendra and Firoiu, Victor and Towsley, Don}, indextitle = {Stochastic Model of TCP Reno Congestion Avoidance and Control, A}, title = {A Stochastic Model of TCP Reno Congestion Avoidance and Control}, institution = {University of Massachusetts}, type = {techreport}, number = {99-02}, location = {Amherst, Mass.}, year = {1999}, annotation = {This is a \texttt{report} entry for a technical report. Note the format of the \texttt{type} field in the database file which uses a localization key. The number of the report is given in the \texttt{number} field. Also note the \texttt{sorttitle} and \texttt{indextitle} fields}, abstract = {The steady state performance of a bulk transfer TCP flow (i.e. a flow with a large amount of data to send, such as FTP transfers) may be characterized by three quantities. The first is the send rate, which is the amount of data sent by the sender in unit time. The second is the throughput, which is the amount of data received by the receiver in unit time. Note that the throughput will always be less than or equal to the send rate due to losses. Finally, the number of non-duplicate packets received by the receiver in unit time gives us the goodput of the connection. The goodput is always less than or equal to the throughput, since the receiver may receive two copies of the same packet due to retransmissions by the sender. In a previous paper, we presented a simple model for predicting the steady state send rate of a bulk transfer TCP flow as a function of loss rate and round trip time. In this paper, we extend that work in two ways. First, we analyze the performance of bulk transfer TCP flows using more precise, stochastic analysis. Second, we build upon the previous analysis to provide both an approximate formula as well as a more accurate stochastic model for the steady state throughput of a bulk transfer TCP flow.}, file = {ftp://gaia.cs.umass.edu/pub/Padhey99-markov.ps} } @Thesis{geer, options = {useprefix=false}, langid = {english}, langidopts = {variant=british}, author = {de Geer, Ingrid}, title = {Earl, Saint, Bishop, Skald~-- and Music}, subtitle = {The Orkney Earldom of the Twelfth Century. A Musicological Study}, institution = {Uppsala Universitet}, type = {phdthesis}, location = {Uppsala}, year = {1985}, annotation = {This is a typical \texttt{thesis} entry for a PhD thesis. Note the \texttt{type} field in the database file which uses a localization key. Also note the format of the printed name and compare the \texttt{useprefix} option in the \texttt{options} field as well as \texttt{vangennep}} } @Thesis{loh, langid = {english}, langidopts = {variant=american}, author = {Loh, Nin C.}, title = {High-Resolution Micromachined Interferometric Accelerometer}, institution = {Massachusetts Institute of Technology}, type = {mathesis}, location = {Cambridge, Mass.}, year = {1992}, annotation = {This is a typical \texttt{thesis} entry for an MA thesis. Note the \texttt{type} field in the database file which uses a localization key} } @Thesis{Pimentel00, author = {Pimentel, Jr.,Joseph J.}, title = {Sociolinguistic Reflections of Privatization and Globalization: The {Arabic} of {Egyptian} newspaper advertisements}, school = {University of Michigan}, year = {2000}, } @Book{luzzatto, author = {Luzzatto, Moshe Ḥayyim}, title = {ha-Lashon la-Ramḥal: u-vo sheloshah ḥiburim}, location = {Yerushalayim}, publisher = {Makhon Ramḥal}, year = {2000} } % Without braces round this prefixed lastname, T::B::N fails to get % the lastname on Windows for some reason @BOOK{hasan, author = {{al-Hasan}, ʿAlī}, editor = {{al-Hasan}, ʿAlī}, translator = {{al-Hasan}, ʿAlī}, title = {Some title}, publisher = {Some press}, year = {2000}, } % This also tests auto-escaping of some LaTeX specials chars like "%" @MISC{t1, KEYWORDS = { primary, something,somethingelse}, AUTHOR = {Bill Brown}, TITLE = {10\% of [100] and 90% of $Normal_2$ | \& # things {$^{3}$}}, YEAR = 1992, PAGES = {100--} } % SORTNAME should not be output @MISC{t2, AUTHOR = {Bill Brown}, SORTNAME = {Bill Brown}, TITLE = {Signs of W$\frac{o}{a}$nder}, YEAR = {1994}, PAGES = {100--108} } @MISC{tvonb, AUTHOR = {Terrence von Bobble}, TITLE = {Things}, YEAR = {1997} } % fullhash and namehash should be different for these two @UNPUBLISHED{anon1, AUTHOR = {AnonymousX}, TITLE = {Title1}, YEAR = {1835}, SHORTAUTHOR = {XAnony}, SHORTTITLE = {Shorttitle}, KEYWORDS = {arc}, PAGES = {111--118}, LANGID = {english}, LANGIDOPTS = {variant=american}, } @UNPUBLISHED{anon2, AUTHOR = {AnonymousY}, TITLE = {Title2}, YEAR = {1839}, PAGES = {1176--1276}, SHORTAUTHOR = {YAnony}, SHORTTITLE = {Shorttitle}, KEYWORDS = {arc}, LANGID = {en}, LANGIDOPTS = {variant=american}, } % Testing uniquelist @MISC{u1, AUTHOR = {AAA and BBB and CCC and DDD}, TITLE = {A title}, DATE = {2000} } @MISC{u2, AUTHOR = {AAA and BBB and CCC and DDD and EEE}, TITLE = {A title}, DATE = {2003} } % Testing ignore @UNPUBLISHED{i1, ABSTRACT = {Some abstract %50 of which is useless}, AUTHOR = {AAA and BBB and CCC and DDD and EEE}, TITLE = {A title}, DATE = {2003}, USERB = {test}, LISTA = {list test}, LISTB = {late and early}, LISTC = {late and early}, LISTD = {æøå}, } @MISC{i2, USERB = {Some text & some bad chars}, USERF = {Something to lose in an alsoset}, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, DATE = {2005} } % Testing per_type and per_entry max/min*names @MISC{tmn1, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, INSTITUTION = {A and B and C}, DATE = {2005} } @BOOK{tmn2, OPTIONS = {maxalphanames = 2}, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, DATE = {2005} } @UNPUBLISHED{tmn3, OPTIONS = {minitems=2}, AUTHOR = {AAA and BBB and CCC}, INSTITUTION = {A and B and C}, TITLE = {A title}, DATE = {2005} } @UNPUBLISHED{tmn4, OPTIONS = {maxbibnames=4}, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, DATE = {2005} } % Test of duplicate skipping @UNPUBLISHED{tmn4, AUTHOR = {ZZZ} } % Testing exotic labelnames @MISC{lne1, AUTHOR = {AAA and BBB and CCC}, NAMEA = {ZZZ}, TITLE = {A title}, DATE = {2005} } % Testing citekey aliases @MISC{alias1, AUTHOR = {Alan Alias}, DATE = {2005}, IDS = {alias2, alias3} } @MISC{alias2, AUTHOR = {Alan Alias}, DATE = {2005}, IDS = {alias4} } @MISC{alias5, AUTHOR = {Alan Alias}, DATE = {2005}, IDS = {alias6} } % Testing url encoding @MISC{url1, AUTHOR = {Alan Alias}, DATE = {2005}, URL = {http://www.something.com/q=á\'{e}\'aŠ}, URLS = {http://www.something.com/q=á\'{e}\'aŠ and http://www.sun.com} } @ONLINE{ol1, AUTHOR = {Oliver Online}, TITLE = {Online1}, NOTE = {A note} } @MISC{pages1, PAGES = {23--24} } @MISC{pages2, PAGES = {23} } @MISC{pages3, PAGES = {{I-II}---{III-IV}} } @MISC{pages4, PAGES = { 3 -- 5 }, } @MISC{pages5, PAGES = {42--}, } @MISC{pages6, PAGES = {\bibstring{number} 42}, } @MISC{pages7, PAGES = {\bibstring{number} 42, 3 --- 6, {I-II}--5}, } @MISC{pages8, PAGES = {10-15, ⅥⅠ-ⅻ}, } @MISC{pages9, PAGES = {M-1--M-4}, } % Testing user->style maps @CONVERSATION{us1, AUTHOR = {Test}, } @BOOK{labelstest, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, DATE = {2005-03-02} } @BOOK{list1, LOCATION = {AAA and BBB and others} } @BOOK{sn1, SORTNAME = {ZZZ}, AUTHOR = {AAA} } % ISBN tests @MISC{isbn1, AUTHOR = {Fred Flummox}, ISBN = {0816520666} } @MISC{isbn2, AUTHOR = {Fred Flummox}, ISBN = {9780816520664} } % Sorting name key tests @BOOK{snk1, AUTHOR = {von Doe, Jr, John} } biblatex-biber-2.4/t/tdata/extratitle.bcf000444000765000024 26056612667073765 20760 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 1 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender extratitle.bib L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12 biblatex-biber-2.4/t/tdata/extratitle.bib000444000765000024 167612667073765 20715 0ustar00philkimestaff000000000000@BOOK{L1, AUTHOR = {John Doe}, TITLE = {Title 1}, YEAR = {1995}, } @BOOK{L2, AUTHOR = {John Doe}, TITLE = {Title 1}, YEAR = {1996}, } @BOOK{L3, TITLE = {Title 2}, YEAR = {1995}, } @BOOK{L4, TITLE = {Title 2}, YEAR = {1995}, } @BOOK{L5, TITLE = {Title 1}, YEAR = {1995}, } @BOOK{L6, SHORTTITLE = {Title A}, TITLE = {Title 3}, YEAR = {1995}, } @BOOK{L7, TITLE = {Title A}, YEAR = {1995}, } @BOOK{L8, AUTHOR = {Billy Brown}, TITLE = {Title A}, YEAR = {1934} } @BOOK{L9, AUTHOR = {Billy Brown}, TITLE = {Title B}, YEAR = {1932} } @BOOK{L10, AUTHOR = {Clive Cautious}, TITLE = {Title A}, YEAR = {1946} } @BOOK{L11, TITLE = {Titular Titilation}, YEAR = {1946} } @BOOK{L12, YEAR = {1943} } biblatex-biber-2.4/t/tdata/extratitleyear.bcf000444000765000024 26030712667073765 21632 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 1 labeltitlespec shorttitle title labeltitleyear 1 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender extratitleyear.bib L1 L2 L3 L4 L5 LY1 LY2 LY3 biblatex-biber-2.4/t/tdata/extratitleyear.bib000444000765000024 123412667073765 21564 0ustar00philkimestaff000000000000@BOOK{L1, TITLE = {Title 1}, YEAR = {1995}, PUBLISHER = {puba} } @BOOK{L2, TITLE = {Title 1}, YEAR = {1995}, PUBLISHER = {pubb} } @BOOK{L3, AUTHOR = {Jim Smith}, YEAR = {1995}, } @BOOK{L4, TITLE = {Title 1}, YEAR = {1996}, } @BOOK{L5, SHORTTITLE = {Title A}, TITLE = {Title 1}, YEAR = {1995}, } @BOOK{LY1, AUTHOR = {Arthur Example}, DATE = {2006/2009}, TITLE = {Some title} } @BOOK{LY2, AUTHOR = {Arthur Example}, DATE = {2006}, TITLE = {Some title} } @BOOK{LY3, AUTHOR = {Arthur Example}, DATE = {2006/}, TITLE = {Some title} } biblatex-biber-2.4/t/tdata/extrayear.bcf000444000765000024 26154312667073765 20573 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date nodate maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender extrayear.bib L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 LY1 LY2 LY3 companion1 companion2 companion3 vangennep gennep nodate1 nodate2 biblatex-biber-2.4/t/tdata/extrayear.bib000444000765000024 410512667073765 20522 0ustar00philkimestaff000000000000@BOOK{L1, AUTHOR = {John Doe}, TITLE = {Title 1}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L2, AUTHOR = {John Doe}, TITLE = {Title 2}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L3, AUTHOR = {John Doe}, TITLE = {Title 3}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L4, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 1}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L5, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L6, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 1}, PUBLISHER = {Oxford}, YEAR = {1996}, } @BOOK{L7, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, YEAR = {1996}, } @BOOK{L8, AUTHOR = {Bill Shakespeare}, TITLE = {Works}, PUBLISHER = {Oxford}, DATE = {1985}, } @BOOK{L9, TITLE = {Title with no author}, DATE = {1985}, } @BOOK{L10, TITLE = {Another title with no author}, DATE = {1985}, } @BOOK{companion1, AUTHOR = {Goossens, M. and Mittelbach, F. and Samarin, A.}, DATE = {1994}, TITLE = {Some title} } @BOOK{companion2, AUTHOR = {Goossens, M. and Mittelbach, F.}, YEAR = {1994}, TITLE = {Some title} } @BOOK{companion3, AUTHOR = {Goossens, M.}, DATE = {1994}, TITLE = {Some title} } @BOOK{vangennep, OPTIONS = {useprefix}, AUTHOR = {van Gennep, Arnold}, DATE = {1909}, TITLE = {Some title} } @BOOK{gennep, AUTHOR = {van Gennep, Arnold}, DATE = {1909}, TITLE = {Some title} } @BOOK{LY1, AUTHOR = {Arthur Example}, DATE = {2006/2009}, TITLE = {Some title} } @BOOK{LY2, AUTHOR = {Arthur Example}, DATE = {2006}, TITLE = {Some title} } @BOOK{LY3, AUTHOR = {Arthur Example}, DATE = {2006/}, TITLE = {Some title} } % Testing no date @BOOK{nodate1, AUTHOR = {Neil Nodate}, TITLE = {Testing}, } @BOOK{nodate2, AUTHOR = {Neil Nodate}, TITLE = {Testing 2}, } biblatex-biber-2.4/t/tdata/full.bcf000444000765000024 25721512667073765 17532 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 0 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 1 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort shorthand sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender full.bib F1a C1 shorthand biblatex-biber-2.4/t/tdata/full.bib000444000765000024 122612667073765 17461 0ustar00philkimestaff000000000000@BOOK{F1, IDS = {F1a}, SHORTHAND = {\emph{A}}, SORTSHORTHAND = {A}, AUTHOR = {John Doe}, TITLE = {The Fullness of Times}, YEAR = {1995} } % Duplicate key. Should be reported via a warning @MISC{F1, AUTHOR = {Frank Frill}, TITLE = {Dresses for Gentlemen}, YEAR = {1997} } % Mismatched cased key. Should be reported via a warning @BOOK{f1, AUTHOR = {Someone Else}, TITLE = {The Case of the Duplicitous Duplicate}, YEAR = {1996} } @MISC{c1, AUTHOR = {Benny Balgreen}, TITLE = {Names We Invent}, YEAR = {1900} }biblatex-biber-2.4/t/tdata/full1.bbl000444000765000024 376712667073765 17561 0ustar00philkimestaff000000000000% $ biblatex auxiliary file $ % $ biblatex bbl format version 2.6 $ % Do not modify the above lines! % % This is an auxiliary file used by the 'biblatex' package. % This file may safely be deleted. It will be recreated by % biber as required. % \begingroup \makeatletter \@ifundefined{ver@biblatex.sty} {\@latex@error {Missing 'biblatex' package} {The bibliography requires the 'biblatex' package.} \aftergroup\endinput} {} \endgroup \refsection{0} \sortlist[list]{shorthands/global} \entry{F1}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{\emph{A}} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{\emph{A}} \field{title}{The Fullness of Times} \field{year}{1995} \endentry \endsortlist \sortlist[entry]{nty/global} \entry{F1}{book}{} \name{author}{1}{}{% {{uniquename=0,hash=bd051a2f7a5f377e3a62581b0e0f8577}{% family={Doe}, family_i={D\bibinitperiod}, given={John}, given_i={J\bibinitperiod}}}% } \strng{namehash}{bd051a2f7a5f377e3a62581b0e0f8577} \strng{fullhash}{bd051a2f7a5f377e3a62581b0e0f8577} \field{labelalpha}{\emph{A}} \field{sortinit}{A} \field{sortinithash}{b685c7856330eaee22789815b49de9bb} \true{singletitle} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{shorthand}{\emph{A}} \field{title}{The Fullness of Times} \field{year}{1995} \endentry \endsortlist \keyalias{F1a}{F1} \missing{C1} \endrefsection \endinput biblatex-biber-2.4/t/tdata/general.bcf000444000765000024 26114012667073765 20175 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 1 usetranslator 1 usenamea 1 useeditora 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm ww year title presort sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender examples.bib stdmodel knuth:ct angenendtsk angenendtsa stdmodel:glashow stdmodel:ps_sc murray aristotle:anima aristotle:rhetoric augustine cotton chiu moraux jaffe luzzatto hasan t1 tvonb lne1 labelstest sn1 snk1 biblatex-biber-2.4/t/tdata/labelalpha.bcf000444000765000024 27235012667073765 20652 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 1 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 useforeword 1 useholder 1 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year origday shorthand label labelname labelname year origday & labelname title year label labelname - title title labelname labelname labelname title prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender labelalpha.bib L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12 L13 L14 L15 L16 L16a L17 L17a L18 L19 L20 L21 L22 L23 L24 L25 L26 knuth:ct knuth:ct:a knuth:ct:b knuth:ct:c Schmidt2007 Schmidt2007a Schnee2007 Schnee2007a LDN1 LDN2 title1 labelstest padtest ignore1 ignore2 skipwidthtest1 prefix1 rangetest1 biblatex-biber-2.4/t/tdata/labelalpha.bib000444000765000024 1712412667073765 20630 0ustar00philkimestaff000000000000@BOOK{L1, AUTHOR = {John Doe}, TITLE = {Title 1}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L2, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 2}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L3, AUTHOR = {John Doe and Albert Abrahams}, TITLE = {Title 3}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L4, AUTHOR = {John Doe and Albert Abrahams and Ernie Edwards}, TITLE = {Title 4}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L5, AUTHOR = {John Doe and Albert Abrahams and Ernie Edwards}, TITLE = {Title 5}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L6, AUTHOR = {John Doe and Simon Smith and Ernie Edwards}, TITLE = {Title 6}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L7, AUTHOR = {John Doe and Simon Smith and James Jones}, TITLE = {Title 7}, PUBLISHER = {Oxford}, YEAR = {1995}, } @BOOK{L8, AUTHOR = {Bill Shakespeare}, TITLE = {Works}, PUBLISHER = {Oxford}, DATE = {1985/1992}, } % For these two, the shorthand should prevent extraalpha being set for them as % they are disambiguated by their shorthands and labelalpha is true @BOOK{L9, SHORTHAND = {SS1}, AUTHOR = {Sam Smiley}, TITLE = {Works}, PUBLISHER = {Oxford}, YEAR = {1922}, } @BOOK{L10, SHORTHAND = {SS2}, AUTHOR = {Sam Smiley}, TITLE = {UnWorks}, PUBLISHER = {Oxford}, YEAR = {1922}, } % prefix in label @BOOK{L11, AUTHOR = {Carl von Rancour}, TITLE = {UnWorks}, YEAR = {1922}, } @BOOK{L12, AUTHOR = {Carl von Rancour and Russel von Bile}, TITLE = {UnWorks}, ORIGDATE = {1922-03-21}, } % per-type labeltemplate @MISC{L13, AUTHOR = {Carl von Rancour and Russel von Bile}, TITLE = {UnVorks}, YEAR = {1987}, } @MISC{L14, LABEL = {Alabel}, AUTHOR = {Carl von Rancour and Russel von Bile}, TITLE = {UnWorks}, YEAR = {1989}, } % disambiguation of labelparts @UNPUBLISHED{L15, AUTHOR = {Alan Acckerman and Bert Briff and Clive Climben}, TITLE = {Title}, YEAR = {1989}, } @BOOKLET{L16, AUTHOR = {Alan Acckerman and Bert Baff and Clive Climbi}, TITLE = {Title}, YEAR = {1990}, } @BOOKLET{L16a, AUTHOR = {Alan Acckerman and Bert Baff and Clive Climbi}, TITLE = {Title2}, YEAR = {1990}, } @REPORT{L17, AUTHOR = {Alan Ackkerman and Bert Baff and Clive Climbi}, TITLE = {Title}, YEAR = {1911}, } @REPORT{L17a, AUTHOR = {Alan Ackkerman and Bert Baff and Clive Climbi}, TITLE = {Title2}, YEAR = {1911}, } @UNPUBLISHED{L18, AUTHOR = {Agassi and Chang and Laver}, TITLE = {Title}, YEAR = {1911}, } @UNPUBLISHED{L19, AUTHOR = {Agassi and Connors and Lendl}, TITLE = {Title}, YEAR = {1911}, } @UNPUBLISHED{L20, AUTHOR = {Agassi and Courier and Laver}, TITLE = {Title}, YEAR = {1911}, } @UNPUBLISHED{L21, AUTHOR = {Borg and Connors and Edberg}, TITLE = {Title}, YEAR = {1911}, } @UNPUBLISHED{L22, AUTHOR = {Borg and Connors and Emerson}, TITLE = {Title}, YEAR = {1911}, } @UNPUBLISHED{L23, AUTHOR = {Sanchez-Vicario, Bill}, TITLE = {Title}, YEAR = {1900}, } @UNPUBLISHED{L24, AUTHOR = {Zaa}, TITLE = {Title}, YEAR = {1900}, } @UNPUBLISHED{L25, AUTHOR = {Zoo and Xaa}, TITLE = {Title}, YEAR = {1900}, } @UNPUBLISHED{L26, AUTHOR = {Zoo and Xaa}, TITLE = {Title}, YEAR = {1901}, } @BOOK{LDN1, AUTHOR = {Vela, Luis and Ura Ru, Juan}, TITLE = {Title}, YEAR = {1889}, } @CUSTOMA{LDN2, AUTHOR = {Vela, Luis and Ura Ru, Juan}, TITLE = {Title}, YEAR = {1845}, } % Some examples from biblatex examples file of collection plus individual volumes % The date ranges should be handled differently by extrayear and extraalpha @BOOK{knuth:ct, langid = {english}, langidopts = {variant=american}, sortyear = {1984-0}, sorttitle = {Computers & Typesetting}, indexsorttitle = {Computers & Typesetting}, author = {Knuth, Donald E.}, title = {Computers \& Typesetting}, volumes = {5}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, date = {1984/1986}, annotation = {A five-volume book cited as a whole. This is a \texttt{book} entry, note the \texttt{volumes} field} } @BOOK{knuth:ct:a, langid = {english}, langidopts = {variant=american}, sortyear = {1984-1}, sorttitle = {Computers & Typesetting A}, indexsorttitle = {The TeXbook}, author = {Knuth, Donald E.}, indextitle = {\TeX book, The}, title = {The \TeX book}, shorttitle = {\TeX book}, maintitle = {Computers \& Typesetting}, volume = {A}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, date = {1984}, annotation = {The first volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields. We want this volume to be listed after the entry referring to the entire five-volume set. Also note the \texttt{indextitle} and \texttt{indexsorttitle} fields} } @BOOK{knuth:ct:b, langid = {english}, langidopts = {variant=american}, sortyear = {1986-1}, sorttitle = {Computers & Typesetting B}, indexsorttitle = {TeX: The Program}, author = {Knuth, Donald E.}, title = {\TeX: The Program}, shorttitle = {\TeX}, maintitle = {Computers \& Typesetting}, volume = {B}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, date = {1986}, annotation = {The second volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields. Also note the \texttt{indexsorttitle} field} } @BOOK{knuth:ct:c, langid = {english}, langidopts = {variant=american}, sortyear = {1986-2}, sorttitle = {Computers & Typesetting C}, author = {Knuth, Donald E.}, indextitle = {METAFONTbook, The}, title = {The METAFONTbook}, shorttitle = {METAFONTbook}, maintitle = {Computers \& Typesetting}, volume = {C}, publisher = {Addison-Wesley}, location = {Reading, Mass.}, date = {1986}, annotation = {The third volume of a five-volume book. Note the \texttt{sorttitle} and \texttt{sortyear} fields as well as the \texttt{indextitle} field} } @PHDTHESIS{Schmidt2007a, author = {C. Schmidt}, year = {2007}, } @INPROCEEDINGS{Schmidt2007, author = {C. Schmidt and XXX and YYY and ZZZ}, year = {2007}, } @PHDTHESIS{Schnee2007a, author = {D. Schnee}, year = {2007}, } @ARTICLE{Schnee2007, author = {D. Schnee and XXX and YYY and ZZZ}, year = {2007}, } @CUSTOMB{title1, author = {D. Schnee and XXX and YYY and ZZZ}, title = {{T\"i{tle} in Braces with char}}, year = {2007}, } @BOOK{labelstest, AUTHOR = {AAA and BBB and CCC}, TITLE = {A title}, DATE = {2005-03-02} } @CUSTOMC{padtest, AUTHOR = {Alan Al}, TITLE = {T}, YEAR = {2007}, } @ARTICLE{ignore1, AUTHOR = {O'Toole, Alexander}, YEAR = {2007}, } @ARTICLE{ignore2, AUTHOR = {De Long, Alexander}, YEAR = {2007}, } @ARTICLE{skipwidthtest1, AUTHOR = {O'Toole, Henry}, TITLE = {O'Toole}, YEAR = {2007}, } @ARTICLE{prefix1, AUTHOR = {Alan van der Vaar}, TITLE = {Thing}, YEAR = {1999}, } @ARTICLE{rangetest1, AUTHOR = {VA and WA and XA and YA and ZA}, EDITOR = {VE and WE and XE and YE and ZE}, TRANSLATOR = {VT and WT and XT and YT and ZT}, FOREWORD = {VF and WF and XF and YF and ZF}, HOLDER = {VH and WH and XH and YH and ZH} } biblatex-biber-2.4/t/tdata/names.bcf000444000765000024 25764212667073765 17677 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 0 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 1 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender names.bib * biblatex-biber-2.4/t/tdata/names.bib000444000765000024 464412667073765 17631 0ustar00philkimestaff000000000000@BOOK{L1, AUTHOR = {Alfred Adler}, } @BOOK{L2, AUTHOR = {Bertie B. Bull}, } @BOOK{L3, AUTHOR = {C. Z. Crop}, } @BOOK{L4, AUTHOR = {Derek D Decket}, } @BOOK{L5, AUTHOR = {Egbert von Eel}, } @BOOK{L6, AUTHOR = {Francis van der valt Frome}, } @BOOK{L7, AUTHOR = {Gregory R. van Gloom}, } @BOOK{L8, AUTHOR = {Henry F. van Henkel}, } @BOOK{L9, AUTHOR = {Ian {Iliad Ipswich}}, } @BOOK{L10, AUTHOR = {Jolly, III, James}, } @BOOK{L10a, AUTHOR = {Pimentel, Jr. ,Joseph J.}, } @BOOK{L11, AUTHOR = {van Kluster, Jr., Kevin}, } @BOOK{L12, AUTHOR = {Charles Louis Xavier Joseph de la Vall{\'e}e Poussin} } @BOOK{L13, AUTHOR = {Van de Graaff, R. J.} } @BOOK{L14, AUTHOR = {St John-Mollusc, Oliver} } @BOOK{L15, AUTHOR = {Roger P.{\,}G. van Gompel} } @BOOK{L16, AUTHOR = {Roger {P.\,G.} van Gompel} } @BOOK{L17, AUTHOR = {Lovecraft, Bill H.{\,}P.}, } @BOOK{L18, AUTHOR = {Lovecraft, Bill {H.\,P.}}, } @BOOK{L19, AUTHOR = {Mustermann, Klaus-Peter}, } @BOOK{L19a, AUTHOR = {Lam, Ho-Pun}, } @BOOK{L20, AUTHOR = {{John Henry} Ford}, } @BOOK{L21, AUTHOR = {{\v S}omeone Smith}, } @BOOK{L22, AUTHOR = {Someone {\v S}mith}, } @BOOK{L23, AUTHOR = {Šomeone Smith}, } @BOOK{L24, AUTHOR = {Someone Šmith}, } @BOOK{L25, AUTHOR = {{American Psychological Association, Task Force on the Sexualization of Girls}}, } @BOOK{L26, AUTHOR = {{Sci-Art Publishers}} } % Should skip the first name as it has too many commas @BOOK{L27, AUTHOR = {Smith, Jr., Bill, Lee und James Smith} } % This causes Text::BibTeX <=0.4 to segfault @BOOK{L28, AUTHOR = {Deux et al.,, O.} } % Should be ok as escaped. Text::BibTeX < 0.41 has a bug however and replaces % the third comma with a space. @BOOK{L29, AUTHOR = {{U.S. Department of Health and Human Services, National Institute of Mental Health, National Heart, Lung and Blood Institute}} } % The protected {M} causes problems for the btparse library so we strip this in biber @BOOK{L30, AUTHOR = {E. S. El-{M}allah} } % Make sure when we replace ties, we don't accidentally strip this ... @BOOK{L31, AUTHOR = {{\~ Z}elly, Arthur}, EDITOR = {{\~Z}elly, Arthur}, TRANSLATOR = {{\~{Z}}elly, Arthur} } % Checking visibility of "and others" (with custom "and" and "others") @BOOK{V1, AUTHOR = {Alan Author und Steven Secondauthor und andere}, } @BOOK{V2, AUTHOR = {Alan Author und andere}, } biblatex-biber-2.4/t/tdata/options.bcf000444000765000024 25674712667073765 20274 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 88 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers + labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec author editor useprefix 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender options.bib * biblatex-biber-2.4/t/tdata/options.bib000444000765000024 101412667073765 20205 0ustar00philkimestaff000000000000@BOOK{L1, AUTHOR = {John Doe}, TITLE = {Title 1}, PUBLISHER = {Oxford}, ORIGDATE = {1985-10-30}, DATE = {1998-04-05}, KEYWORDS = {one|two|three} } % testing custom xsvsep @BOOK{L2, OPTIONS = {maxnames=3|maxitems=2|maxalphanames=10}, AUTHOR = {Ellison Edwards}, TITLE = {Title 2}, PUBLISHER = {Oxford}, DATE = {1998-04-05}, } @BOOK{L3, OPTIONS = {blah=10}, AUTHOR = {Bunty Bluntford}, TITLE = {Title 3}, PUBLISHER = {Oxford}, DATE = {1999-04-05}, } biblatex-biber-2.4/t/tdata/related.bcf000444000765000024 25532412667073765 20207 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender related.bib key1 key2 c1 shorthand biblatex-biber-2.4/t/tdata/related.bib000444000765000024 262212667073765 20140 0ustar00philkimestaff000000000000@ARTICLE{key1, IDS = {key1alias}, RELATED = {key2,key3,missing1}, RELATEDTYPE = {reprintas}, AUTHOR = {Author}, TITLE = {Original Title}, JOURNALTITLE = {Journal Title}, VOLUME = {12}, NUMBER = {5}, DATE = {1998}, PAGES = {125--150}, SHORTHAND = {RK1} } @INBOOK{key2, RELATED = {key1alias}, RELATEDTYPE = {reprintof}, RELATEDSTRING = {First}, AUTHOR = {Author}, TITLE = {Reprint Title}, BOOKTITLE = {Booktitle}, LOCATION = {Location}, PUBLISHER = {Publisher}, DATE = {2009}, PAGES = {34--60}, SHORTHAND = {RK2} } @INBOOK{key3, RELATED = {key4}, RELATEDTYPE = {translationof}, AUTHOR = {Author}, TITLE = {Reprint Title}, BOOKTITLE = {Booktitle}, LOCATION = {Location}, PUBLISHER = {Publisher2}, DATE = {2010}, PAGES = {33--57}, SHORTHAND = {RK3} } @INBOOK{key4, AUTHOR = {Author}, TITLE = {Orig Language Title}, BOOKTITLE = {Booktitle}, LOCATION = {Location}, PUBLISHER = {Publisher2}, DATE = {2011}, PAGES = {33--57}, SHORTHAND = {RK4} } @BOOK{c1, RELATED = {c2}, } @BOOK{c2, RELATED = {c3}, } @BOOK{c3, RELATED = {c2}, } biblatex-biber-2.4/t/tdata/remote-files.bcf000444000765000024 26002212667073765 21151 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 88 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers + labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec author editor useprefix 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender http://www.citeulike.org/bibtex/group/8082 http://people.cs.uu.nl/hansb/graphs-bib/definitions.bib http://people.cs.uu.nl/hansb/graphs-bib/papers.bib https://api.zotero.org/groups/9097/items/II22KQ7D?format=bibtex&limit=1 citeulike:8283461 AbdelbarH98 merleau-ponty_philosophe_2010 biblatex-biber-2.4/t/tdata/ris.bcf000444000765000024 25641612667073765 17367 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 88 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers + labelalpha 0 labelnamespec author labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 1 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec author editor useprefix 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender ris1.ris test1 test2 biblatex-biber-2.4/t/tdata/ris1.ris000444000765000024 423412667073765 17440 0ustar00philkimestaff000000000000TY - JOUR ID - test1 A1 - Baldwin,S.A. A1 - Fugaccia,I. A1 - Brown,D.R. A1 - Brown,L.V. A1 - Scheff,S.W. TI - Blood-brain barrier breach following cortical contusion in the rat JO - J.Neurosurg. Y1 - 1996 VL - 85 SP - 476 EP - 481 RP - Not In File KW - cortical contusion KW - blood-brain barrier KW - horseradish peroxidase KW - head trauma KW - hippocampus KW - rat N2 - Adult Fisher 344 rats were subjected to a unilateral impact to the dorsal cortex above the hippocampus at 3.5 m/sec with a 2 mm cortical depression. This caused severe cortical damage and neuronal loss in hippocampus subfields CA1, CA3 and hilus. Breakdown of the blood-brain barrier (BBB) was assessed by injecting the protein horseradish peroxidase (HRP) 5 minutes prior to or at various times following injury (5 minutes, 1, 2, 6, 12 hours, 1, 2, 5, and 10 days). Animals were killed 1 hour after HRP injection and brain sections were reacted with diaminobenzidine to visualize extravascular accumulation of the protein. Maximum staining occurred in animals injected with HRP 5 minutes prior to or 5 minutes after cortical contusion. Staining at these time points was observed in the ipsilateral hippocampus. Some modest staining occurred in the dorsal contralateral cortex near the superior sagittal sinus. Cortical HRP stain gradually decreased at increasing time intervals postinjury. By 10 days, no HRP stain was observed in any area of the brain. In the ipsilateral hippocampus, HRP stain was absent by 3 hours postinjury and remained so at the 6- and 12- hour time points. Surprisingly, HRP stain was again observed in the ipsilateral hippocampus 1 and 2 days following cortical contusion, indicating a biphasic opening of the BBB following head trauma and a possible second wave of secondary brain damage days after the contusion injury. These data indicate regions not initially destroyed by cortical impact, but evidencing BBB breach, may be accessible to neurotrophic factors administered intravenously both immediately and days after brain trauma. ER - TY - BOOK ID - test2 AU - Smith,John Frederick,III ED - Brown,Alan TI - Sometitle PY - 1996/03/12 SP - 1 EP - 20 KW - keyword ER - biblatex-biber-2.4/t/tdata/sections-complex.bcf000444000765000024 26076012667073765 22063 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender labelalpha.bib L1 L2 L3 L4 labelalpha.bib L5 L6 L7 L8 biblatex-biber-2.4/t/tdata/sections.bcf000444000765000024 26453012667073765 20415 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort labelalpha sortkey sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sections1.bib sections2.bib sect1 sect2 sect3 sections3.bib sect4 sect5 sections4.bib sections1.bib sect1 sect6 sect7 sect3 sectx sections1.bib * sect8 shorthand shorthand shorthand shorthand biblatex-biber-2.4/t/tdata/sections1.bib000444000765000024 154312667073765 20431 0ustar00philkimestaff000000000000@PREAMBLE{"Štring for Preamble 1"} @STRING{STRING1 = {value1}} @ARTICLE{sect1, SHORTHAND = {AA}, AUTHOR = {Aaron Adamson}, TITLE = {Artificial Advice}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, VOLUME = {4}, YEAR = {1995}, NOTE = STRING1 } @ARTICLE{sect2, SHORTHAND = {BB}, AUTHOR = {Brian Britherthwaite}, TITLE = {Best Barnacled Boat Bottoms}, PUBLISHER = {British Bulldog Press}, LOCATION = {Bridlington}, YEAR = {2004}, } @ARTICLE{sectall1, AUTHOR = {Alan All}, TITLE = {Alternative Alternations}, PUBLISHER = {Average Aunt Press}, LOCATION = {Allertron}, YEAR = {2004}, } @PREAMBLE{"String for Preamble 2"}biblatex-biber-2.4/t/tdata/sections2.bib000444000765000024 104012667073765 20422 0ustar00philkimestaff000000000000@ARTICLE{sect3, AUTHOR = {Clive Clumberton}, TITLE = {Clumsy Cultural Caveats}, SUBTITLE = {Counter-cultural Concepts}, PUBLISHER = {Clapp and Clopp Press}, LOCATION = {Cambridge}, YEAR = {1914}, } @ARTICLE{sect8, SHORTHAND = {JJ}, AUTHOR = {Jimmy Johnson}, TITLE = {Jovial Jamborees}, PUBLISHER = {Jasper and Jiff}, LOCATION = {Johannesburg}, YEAR = {1938}, } @PREAMBLE{"String for Preamble 3"}biblatex-biber-2.4/t/tdata/sections3.bib000444000765000024 120512667073765 20426 0ustar00philkimestaff000000000000@STRING{STRING1 = {value2}} @BOOK{sect4, SHORTHAND = {DDDD}, AUTHOR = {Derek Ditherington and David Dumpton}, TITLE = {Dangerous Dames}, SUBTITLE = {Don't Dally Dude!}, PUBLISHER = {Dright and Drought Press}, LOCATION = {Dunbar}, YEAR = {2003}, NOTE = STRING1 } @BOOK{sect5, SHORTHAND = {EE}, SORTKEY = {aaaaaaa}, AUTHOR = {Edward E. Ethoxon}, TITLE = {Eating Evil Enemies}, PUBLISHER = {Ethical Encouragement Press}, LOCATION = {Edinburgh}, YEAR = {2007}, } biblatex-biber-2.4/t/tdata/sections4.bib000444000765000024 104412667073765 20430 0ustar00philkimestaff000000000000@BOOK{sect6, SHORTHAND = {MMMM}, AUTHOR = {Michael Mumford and Millie Mutherington}, TITLE = {Malodourous Muffins}, PUBLISHER = {Ming and Mink Press}, LOCATION = {Manchester}, YEAR = {2003}, } @PREAMBLE{"String for Preamble 4"} @BOOK{sect7, SHORTHAND = {PP}, AUTHOR = {Percy Pilkington}, TITLE = {Perhaps Penguins Prance}, PUBLISHER = {Possible Prattle Press}, LOCATION = {Pimlico}, YEAR = {2007}, } biblatex-biber-2.4/t/tdata/set-dynamic.bcf000444000765000024 25635412667073765 21010 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sets.bib DynSet * sets.bib Dynamic3 shorthand shorthand biblatex-biber-2.4/t/tdata/set-legacy.bcf000444000765000024 25470112667073765 20622 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sets.bib Elias1955 biblatex-biber-2.4/t/tdata/set-static.bcf000444000765000024 25564612667073765 20656 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sets.bib Static2 Static1 sets.bib Static2 Static3 Static4 biblatex-biber-2.4/t/tdata/sets.bib000444000765000024 354612667073765 17504 0ustar00philkimestaff000000000000@SET{Elias1955, ENTRYSET = {Elias1955aALIAS,Elias1955b}, CROSSREF = {Elias1955a} } % Also test of month hacking - should be forced to "03" by the bibtex driver @ARTICLE{Elias1955a, IDS = {Elias1955aALIAS}, AUTHOR = {Elias, P.}, TITLE = {Predictive coding--I}, JOURNAL = {IRE Transactions on Information Theory}, YEAR = {1955}, VOLUME = {1}, PAGES = {16-24}, NUMBER = {1}, MONTH = {March}, DOI = {10.1109/TIT.1955.1055126}, ENTRYSET = {Elias1955}, ISSN = {0096-1000}, } % Also test of month hacking - should be forced to "03" by the bibtex driver @ARTICLE{Elias1955b, AUTHOR = {Elias, P.}, TITLE = {Predictive coding--II}, JOURNAL = {IRE Transactions on Information Theory}, YEAR = {1955}, VOLUME = {1}, PAGES = {24-33}, NUMBER = {1}, MONTH = {Mar.}, DOI = {10.1109/TIT.1955.1055116}, ENTRYSET = {Elias1955}, ISSN = {0096-1000}, } @SET{Static1, ENTRYSET = {Static2alias, Static3, Static4, missing1}, ANNOTATION = {Some notes} } @BOOK{Static2, IDS = {Somealias, Static2alias}, AUTHOR = {Brian Bumble}, TITLE = {Blessed Brains}, YEAR = {2001}, ANNOTATION = {Some Blessed Note} } @BOOK{Static3, AUTHOR = {Clive Crenellation}, TITLE = {Castles and Crime}, YEAR = {2002} } @BOOK{Static4, AUTHOR = {Derek Dingle}, TITLE = {Dungeons, Dark and Dangerous}, YEAR = {2005} } @BOOK{Dynamic1, AUTHOR = {Derek Dynamism}, TITLE = {Doing Daring Deeds}, YEAR = {2002}, ANNOTATION = {Some Dynamic Note}, SHORTHAND = {d1} } @BOOK{Dynamic2, AUTHOR = {Brian Bunting}, TITLE = {Beautiful Birthdays}, YEAR = {2010}, SHORTHAND = {d2} } @BOOK{Dynamic3, IDS = {Dynamic3alias}, AUTHOR = {Roger Regardless}, TITLE = {Reckless Ravishings}, YEAR = {2000}, SHORTHAND = {d3} } biblatex-biber-2.4/t/tdata/skips.bcf000444000765000024 26065312667073765 17721 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year volume 0000 sorttitle title sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender skips.bib skip1 skip2 skip3 skip4 seta noseta nosetb nosetc shorthand biblatex-biber-2.4/t/tdata/skips.bib000444000765000024 304712667073765 17653 0ustar00philkimestaff000000000000@ARTICLE{skip1, OPTIONS = {skipbib}, AUTHOR = {John Doe}, SHORTHAND = {AFS}, TITLE = {Algorithms For Sorting}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1994}, } @ARTICLE{skip2, OPTIONS = {skipbiblist}, SHORTHAND = {SA}, AUTHOR = {John Doe}, TITLE = {Sorting Algorithms}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1995}, } @ARTICLE{skip3, OPTIONS = {skipbiblist,skiplab}, SHORTHAND = {SWA}, AUTHOR = {John Doe}, TITLE = {Sorting With Algorithms}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1934}, } @ARTICLE{skip4, OPTIONS = {dataonly}, SHORTHAND = {AWS}, AUTHOR = {John Doe}, TITLE = {Algorithms Which Sort}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1932}, } @SET{seta, ENTRYSET = {set:membera,set:memberb,set:memberc} } @BOOK{set:membera, KEYWORDS = {key1, key2}, AUTHOR = {Doe, John}, TITLE = {Set Member A}, DATE = {2010}, } @BOOK{set:memberb, AUTHOR = {Doe, John}, TITLE = {Set Member B}, DATE = {2010}, } @BOOK{set:memberc, AUTHOR = {Doe, John}, TITLE = {Set Member C}, DATE = {2010}, } @BOOK{noseta, AUTHOR = {Doe, John}, TITLE = {Stand-Alone A}, DATE = {2010}, } @BOOK{nosetb, AUTHOR = {Doe, John}, TITLE = {Stand-Alone B}, DATE = {2010}, } @BOOK{nosetc, AUTHOR = {Doe, John}, TITLE = {Stand-Alone C}, DATE = {2010}, } biblatex-biber-2.4/t/tdata/sort-case.bcf000444000765000024 25667012667073765 20474 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sort-case.bib CS1 CS2 CS3 biblatex-biber-2.4/t/tdata/sort-case.bib000444000765000024 45612667073765 20403 0ustar00philkimestaff000000000000% Test of U::C case sensitivity and case ordering @BOOK{CS1, AUTHOR = {Albert, Edwin}, TITLE = {TITLE} } @BOOK{CS2, AUTHOR = {albert, Edwin}, TITLE = {title} } @BOOK{CS3, AUTHOR = {Albert, edwin}, TITLE = {The title} } biblatex-biber-2.4/t/tdata/sort-complex.bcf000444000765000024 26034412667073765 21221 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 labelnamespec shorteditor editor translator useeditor 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey labelalpha sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sort.bib L1 L2 L3 L4 L5 shorthand biblatex-biber-2.4/t/tdata/sort-order.bcf000444000765000024 25557312667073765 20675 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sort-order.bib L2 L3 L1B L1 L4 L5 L1A L7 L8 L6 L9 biblatex-biber-2.4/t/tdata/sort-order.bib000444000765000024 470312667073765 20622 0ustar00philkimestaff000000000000@ARTICLE{L1, AUTHOR = {Aaron Adamson}, TITLE = {Artificial Advice}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, VOLUME = {4}, YEAR = {1995}, } @ARTICLE{L1A, AUTHOR = {Aaron Adamson}, TITLE = {Anarchic Ambidexstrous Anomalies}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, VOLUME = {40}, YEAR = {1995}, } @ARTICLE{L1B, AUTHOR = {Aaron Adazki}, TITLE = {Average Attitudes Are Awful}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, YEAR = {1984}, } @ARTICLE{L2, AUTHOR = {Brian Britherthwaite}, TITLE = {Best Barnacled Boat Bottoms}, PUBLISHER = {British Bulldog Press}, LOCATION = {Bridlington}, YEAR = {2004}, } @ARTICLE{L3, AUTHOR = {Clive Clumberton}, TITLE = {Clumsy Cultural Caveats}, SUBTITLE = {Counter-cultural Concepts}, PUBLISHER = {Clapp and Clopp Press}, LOCATION = {Cambridge}, YEAR = {1914}, } @BOOK{L4, AUTHOR = {Derek Ditherington and David Dumpton}, TITLE = {Dangerous Dames}, SUBTITLE = {Don't Dally Dude!}, PUBLISHER = {Dright and Drought Press}, LOCATION = {Dunbar}, YEAR = {2003}, } @BOOK{L5, SORTKEY = {aaaaaaa}, AUTHOR = {Edward E. Ethoxon}, TITLE = {Eating Evil Enemies}, PUBLISHER = {Ethical Encouragement Press}, LOCATION = {Edinburgh}, YEAR = {2007}, } @BOOK{L6, AUTHOR = {Richard F. Rank}, TITLE = {Ruminating on Rhubarb}, PUBLISHER = {Red, Raw and Raucous}, LOCATION = {edinburgh}, YEAR = {2011}, } @BOOK{L7, AUTHOR = {Peter Pettigrew}, TITLE = {The Pretending Peanuts Pout}, PUBLISHER = {Nut Press}, LOCATION = {Edinburgh}, YEAR = {2010}, } @BOOK{L8, AUTHOR = {Lawrence Langour}, TITLE = {Why Walnuts Won't}, PUBLISHER = {Nut Press}, LOCATION = {Edinburgh}, YEAR = {2009}, } @BOOK{L9, AUTHOR = {Steven Sensible}, TITLE = {Sorting Sucks Eggs}, PUBLISHER = {Yolk Enterprises}, LOCATION = {London} } biblatex-biber-2.4/t/tdata/sort-uc.bcf000444000765000024 25755012667073765 20166 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 1 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sortyear year sorttitle title volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sort-uc.bib LS1 LS2 LS3 LS4 LS5 LS6 shorthand shorthand biblatex-biber-2.4/t/tdata/sort-uc.bib000444000765000024 237112667073765 20115 0ustar00philkimestaff000000000000% Test of U::C tailoring - Swedish - in UCA, å and ä are sorted before z but should be after @BOOK{LS1, AUTHOR = {Slippery, Zänny}, TITLE = {Silent Slippers}, PUBLISHER = {Footwear Folios}, LOCATION = {London}, YEAR = {1932}, SHORTHAND = {SZä} } @BOOK{LS2, AUTHOR = {Slippery, Zznny}, TITLE = {People Prefer Packages to Post}, PUBLISHER = {Terrible Typists}, LOCATION = {Grimsby}, YEAR = {1945}, SHORTHAND = {SZå} } @BOOK{LS3, AUTHOR = {Slippery, Zönny}, TITLE = {Last Lingering Lemons}, PUBLISHER = {Fruit Folios}, LOCATION = {Catterick}, YEAR = {1966}, SHORTHAND = {SZo} } % Upper before lower false @BOOK{LS4, AUTHOR = {Slippery, Zönny}, TITLE = {last lingering lemons}, PUBLISHER = {Fruit Folios}, LOCATION = {Catterick}, YEAR = {1966}, SHORTHAND = {SZo} } @BOOK{LS5, AUTHOR = {Slippery, Zanny}, YEAR = {1989}, } % Surname is substring so should be first @BOOK{LS6, AUTHOR = {Slippery, Zan}, YEAR = {1988}, } biblatex-biber-2.4/t/tdata/sort.bib000444000765000024 175012667073765 17510 0ustar00philkimestaff000000000000@BOOK{L1, SHORTHAND = {\emph{A}}, SORTSHORTHAND = {A}, AUTHOR = {John Doe}, TITLE = {Algorithms For Sorting}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1995}, } @BOOK{L2, SHORTHAND = {B}, AUTHOR = {John Doe}, TITLE = {Sorting Algorithms}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1995}, } @BOOK{L3, SHORTHAND = {C}, AUTHOR = {John Doe}, TITLE = {More and More Algorithms}, PUBLISHER = {A press}, LOCATION = {Cambridge}, YEAR = {1995}, } @BOOK{L4, SHORTHAND = {D}, AUTHOR = {John Doe and others}, TITLE = {Some title about sorting}, PUBLISHER = {Another press}, LOCATION = {Cambridge}, YEAR = {1995}, } @BOOK{L5, SHORTHAND = {E}, AUTHOR = {John Doe and others}, TITLE = {Some other title about sorting}, PUBLISHER = {Another press}, LOCATION = {Cambridge}, YEAR = {1995}, } biblatex-biber-2.4/t/tdata/sortlists.bcf000444000765000024 26762012667073765 20637 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 1 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix given family a family Z family mm citeorder sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender sortlists.bib sortlists.bltxml K1 K2 K3 K4 K5 K6 K7 K8 K9 K10 K11 K12 author author publisher verba author key2 author thesis key1 author verba rubbish author author verba rubbish author year title title title note publisher author biblatex-biber-2.4/t/tdata/sortlists.bib000444000765000024 410012667073765 20557 0ustar00philkimestaff000000000000@ARTICLE{K1, AUTHOR = {Aaron Adamson}, TITLE = {Artificial Advice}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, YEAR = {1995}, VERBA = {String} } @BOOK{K2, AUTHOR = {Brian Bully}, TITLE = {Lucid Lamas}, PUBLISHER = {Aardvark Press}, LOCATION = {Arlington}, YEAR = {1971}, } @PHDTHESIS{K3, ENTRYSUBTYPE = {rubbish}, AUTHOR = {Richard Radiator}, TITLE = {Zenos Things}, LOCATION = {Cambridge}, YEAR = {1953}, } @BOOK{K4, AUTHOR = {Linda Lucid}, TITLE = {Collation is cruel}, PUBLISHER = {Stuff and Nonesense Press}, LOCATION = {London}, YEAR = {1999}, KEYWORDS = {key1, key2} } @BOOK{K5, AUTHOR = {Slippery Zånny}, TITLE = {Silent Slippers}, PUBLISHER = {Footwear Folios}, LOCATION = {London}, YEAR = {1932}, } @BOOK{K6, OPTIONS = {sortnamekeyscheme=global}, AUTHOR = {Slippery Zznny}, TITLE = {People Prefer Packages to Post}, PUBLISHER = {Terrible Typists}, LOCATION = {Grimsby}, YEAR = {1945}, } % In es_ES_trad, title comes after K4 as "ch" sorts between "c" and "d" @BOOK{K7, AUTHOR = {Simon Spaniard}, TITLE = {Collation is chilling}, YEAR = {1906} } % Testing locales at sortitem level % K8, K9, K10 all in in en_US % K9, K8, K10 when NOTE is es_ES_trad @BOOK{K8, AUTHOR = {Terrance Tremble}, TITLE = {Collation is chilling}, NOTE = {Collation is chilling}, KEYWORDS = {key1} } @BOOK{K9, AUTHOR = {Terrance Tremble}, TITLE = {Collation is chilling}, NOTE = {Collation is cruel}, KEYWORDS = {key1} } @BOOK{K10, AUTHOR = {Terrance Tremble}, TITLE = {Collation is cruel}, KEYWORDS = {key1} } biblatex-biber-2.4/t/tdata/sortlists.bltxml000444000765000024 222112667073765 21327 0ustar00philkimestaff000000000000 Xavier Xanax One Moscow Publisher 1983 Arthur Allen Two Moscow Publisher 1983 biblatex-biber-2.4/t/tdata/tool-test.conf000444000765000024 21133312667073765 20704 0ustar00philkimestaff000000000000 testlocale 5 doesnotexist.bib examples.bib doesnotexist.bib ARTICLE UNPUBLISHED examples.bib MISC examples.bib examples.bib REPORT UNPUBLISHED ONLINE endnote.xml endnote.xml Report endnote.xml ris1.ris ris1.ris ris1.ris RPRT journalArticle zotero.rdf journalArticle book bookSection prefix family given suffix prefix mm year sf,sm,sn,pf,pm,pn,pp family,given,prefix,suffix article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished hyphenation indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids entryset date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender hyphenation ids indextitle indexsorttitle isan ismn iswc keywords label library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender biblatex-biber-2.4/t/tdata/tool.bib000444000765000024 310112667073765 17466 0ustar00philkimestaff000000000000@UNPUBLISHED{i3Š, OPTIONS = {useprefix=false}, ABSTRACT = {Some abstract %50 of which is useless}, AUTHOR = {AAA and BBB and CCC and DDD and EEE}, TITLE = {Š title}, DATE = {2003}, USERB = {test}, LOCATION = {one and two}, LISTA = {list test}, LISTB = {late and early}, LISTC = {late and early}, KEYWORDS = {keyword}, } @COMMENT{Comment 1} @BOOK{xd1, AUTHOR = {Edward Paul Ellington}, XDATA = {macmillanalias, missingxd} } @XDATA{macmillan, IDS = {macmillanalias}, YEAR = {2001}, XDATA = {macmillan:pubALIAS, macmillan:loc} } @COMMENT{ Comment 2 } @XDATA{macmillan:pub, IDS = {macmillan:pubALIAS}, PUBLISHER = {Macmillan} } @XDATA{macmillan:loc, LOCATION = {New York and London}, NOTE = {A Note} } @COMMENT{jabref-meta: groupstree: 0 AllEntriesGroup:; 1 ExplicitGroup:Doktorandkurser\;2\;; 2 KeywordGroup:Från könsroll till genus\;0\;course\;UCGS Från könsrolltill genus\;0\;0\;; 2 KeywordGroup:Historiska och filosofiska perspektiv på psykologi\;0\;course\;Historiska och filosofiska perspektiv på psykologi\;0\;0\;; 2 KeywordGroup:Kurs i introduktion\;0\;course\;Kurs i introduktion\;0\;0\;; 2 KeywordGroup:Fenomenologi, kön och genus\;0\;course\;UCGS Fenomenologi\;0\;0\;; 2 KeywordGroup:Quantitative Research Methods\;0\;course\;QMR\;0\;0\;; 2 KeywordGroup:Multivariate Analysis\;0\;course\;MVA\;1\;0\;; } @BOOK{b1, TITLE = {Booktitle}, YEAR = {1999}, CROSSREF = {mvalias} } @MVBOOK{mv1, IDS = {mvalias}, TITLE = {Maintitle}, SUBTITLE = {Mainsubtitle}, TITLEADDON = {Maintitleaddon} } biblatex-biber-2.4/t/tdata/uniqueness1.bcf000444000765000024 25656112667073765 21053 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 1 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 1 uniquename 2 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort mm sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender uniqueness1.bib * biblatex-biber-2.4/t/tdata/uniqueness1.bib000444000765000024 631712667073765 21005 0ustar00philkimestaff000000000000@ARTICLE{un1, AUTHOR = {John AAA}, YEAR = {1994}, } % Always good to have a repeated labelname entry as this is often an edge case @ARTICLE{un1a, AUTHOR = {John AAA}, YEAR = {1999}, } @ARTICLE{un2, AUTHOR = {J. AAA}, YEAR = {1999}, } @ARTICLE{un3, AUTHOR = {K. AAA}, YEAR = {1939}, } @ARTICLE{un4, AUTHOR = {Edward AAA}, YEAR = {1934}, } @ARTICLE{un4a, OPTIONS = {uniquename=false}, AUTHOR = {Edward AAA}, YEAR = {1934}, } @ARTICLE{un5, AUTHOR = {Jane AAA}, YEAR = {1983}, } % uniquelist not set because it's not ambiguous with un1 with max/minnames=1 because % un1 is "AAA" and un6 is "AAA et al". @ARTICLE{un6, AUTHOR = {John AAA and Mike BBB}, YEAR = {1921}, } @ARTICLE{un7, SHORTAUTHOR = {Chaps}, AUTHOR = {John AAA and Mike BBB}, YEAR = {1921}, } % test2 should have un=0 because minnames makes Brian Jones invisible @BOOK{test1, AUTHOR = {Paul Smith and Brian Jones and Peter Brown}, YEAR = {1900} } @BOOK{test2, AUTHOR = {Henry Jones}, YEAR = {1903} } @MISC{test3, AUTHOR = {John Blether and John Doe}, DATE = {2011} } @MISC{test4, AUTHOR = {John Blether and Jane Doe}, DATE = {2011} } @MISC{test5, AUTHOR = {John Blether and Edward Doe}, DATE = {2011} } % Testing repeated entries for un=1 @MISC{unt1, AUTHOR = {Jeremy Alton and Alan Rattle}, TITLE = {Title}, DATE = {2011} } @MISC{unt2, AUTHOR = {Jeremy Alton and Andrew Rattle}, TITLE = {Title}, DATE = {2011} } @MISC{unt3, AUTHOR = {Jeremy Alton and Edward Rattle}, TITLE = {Title}, DATE = {2011} } @MISC{unt4, AUTHOR = {Meredith Williams}, TITLE = {Title}, DATE = {2011} } @MISC{unt5, AUTHOR = {Michael Williams}, TITLE = {Title}, DATE = {2011} } % Testing repeated entries for un=2 @MISC{untf1, AUTHOR = {Simon Monocle and Walter Ripple}, TITLE = {Title}, DATE = {2011} } @MISC{untf2, AUTHOR = {Simon Monocle and Walter Ripple}, TITLE = {Title}, DATE = {2011} } @MISC{untf3, AUTHOR = {Simon Monocle and William Ripple}, TITLE = {Title}, DATE = {2011} } % Testing prefices/suffices @MISC{sp1, AUTHOR = {Greaves, Jr., Percy L.}, TITLE = {Title}, DATE = {2011} } @MISC{sp2, AUTHOR = {Greaves, Jr., Percy L.}, TITLE = {Title2}, DATE = {2012} } @MISC{sp3, AUTHOR = {von Greaves, Jr., Percy L.}, TITLE = {Title1}, DATE = {2012} } @MISC{sp4, AUTHOR = {von Greaves, Jr., Percy L.}, TITLE = {Title2}, DATE = {2012} } % This counts as the same as sp1 and sp2 because of the useprefix=false @MISC{sp5, OPTIONS = {useprefix=false}, AUTHOR = {von Greaves, Jr., Percy L.}, TITLE = {Title2}, DATE = {2012} } @MISC{sp6, AUTHOR = {von Mises, Jr., Percy L.}, TITLE = {Title1}, DATE = {2010} } @MISC{sp7, AUTHOR = {von Mises, Jr., Paul L.}, TITLE = {Title1}, DATE = {2010} } @MISC{sp8, AUTHOR = {Ralley, Percy L.}, TITLE = {Title1}, DATE = {2010} } @MISC{sp9, AUTHOR = {Ralley, Jr., Percy L.}, TITLE = {Title1}, DATE = {2010} } biblatex-biber-2.4/t/tdata/uniqueness2.bcf000444000765000024 25656112667073765 21054 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 1 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 1 uniquename 2 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort mm sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender uniqueness2.bib * biblatex-biber-2.4/t/tdata/uniqueness2.bib000444000765000024 533012667073765 21000 0ustar00philkimestaff000000000000@ARTICLE{un8, AUTHOR = {Alan AAA and B. BBB and A. CCC}, } @ARTICLE{un9, AUTHOR = {Anthon AAA and B. BBB and B. CCC and A. DDD}, } @ARTICLE{un10, AUTHOR = {B. DDD}, } @ARTICLE{unapa1, AUTHOR = {Ireys, A. and Chernoff, A. and DeVet, A. and Kim, A.}, } @ARTICLE{unapa2, AUTHOR = {Ireys, A. and Chernoff, A. and Stein, A. and DeVet, A. and Silver, A.}, } @MISC{others1, AUTHOR = {NameA and NameB and others}, YEAR = {2011} } @MISC{others2, AUTHOR = {NameA and NameB and others}, YEAR = {2011} } % Two works by the same author list, should be no uniquelist @BOOK{unall1, AUTHOR = {Name11 and Name22 and Name33 and Name44 and Name55}, TITLE = {Title 1}, YEAR = {2011} } @BOOK{unall2, AUTHOR = {Name11 and Name22 and Name33 and Name44 and Name55}, TITLE = {Title 2}, YEAR = {2011} } % First namelist is subset of second, % maxnames=5 -> ul=undef and ul=6 respectively % maxnames=1 -> ul=5 and ul=6 respectively @BOOK{unall3, AUTHOR = {A111 and A222 and A333 and A444 and A555}, YEAR = {2011} } @BOOK{unall4, AUTHOR = {A111 and A222 and A333 and A444 and A555 and A666}, YEAR = {2011} } % Two lists with same authors, one differing in last place % ul=5 @BOOK{unall5, AUTHOR = {Name1 and Name2 and Name3 and Name4 and Name5}, TITLE = {Title 3}, YEAR = {2010} } % ul=5 @BOOK{unall6, AUTHOR = {Name1 and Name2 and Name3 and Name4 and Name5}, TITLE = {Title 5}, YEAR = {2010} } % ul=5 @BOOK{unall7, AUTHOR = {Name1 and Name2 and Name3 and Name4 and Name6}, TITLE = {Title 3}, YEAR = {2010} } % Two lists with same authors, one differing in being a superset. maxnames/minnames=1 % so the truncations are ambiguous, hence uniquelist is needed. % ul=5 @BOOK{unall8, AUTHOR = {Name1111 and Name2222 and Name3333 and Name4444 and Name5555}, TITLE = {Title 3}, YEAR = {2010} } % ul=5 @BOOK{unall9, AUTHOR = {Name1111 and Name2222 and Name3333 and Name4444 and Name5555}, TITLE = {Title 5}, YEAR = {2010} } % ul=undef (per-entry setting) @BOOK{unall9a, OPTIONS = {uniquelist=0}, AUTHOR = {Name1111 and Name2222 and Name3333 and Name4444 and Name5555}, TITLE = {Title 5}, YEAR = {2010} } % ul=6 @BOOK{unall10, AUTHOR = {Name1111 and Name2222 and Name3333 and Name4444 and Name5555 and Name6666}, TITLE = {Title 5}, YEAR = {2010} } % Testing "et al" counting as a uniquelist position % ul01 = 3 % ul02 = 3 (because it will be "XXX and YYY and ZZZ et al" which disambiguated the list from % "XXX and YYY and ZZZ" @ARTICLE{ul01, AUTHOR = {XXX and YYY and ZZZ}, } @ARTICLE{ul02, AUTHOR = {XXX and YYY and ZZZ and MMM and NNN}, } biblatex-biber-2.4/t/tdata/uniqueness3.bcf000444000765000024 25704412667073765 21052 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 1 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 1 uniquename 2 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender uniqueness3.bib ey1 ey2 ey3 ey4 ey5 ey6 biblatex-biber-2.4/t/tdata/uniqueness3.bib000444000765000024 104412667073765 20777 0ustar00philkimestaff000000000000@ARTICLE{ey1, AUTHOR = {A. AAA and B. BBB and A. CCC and E. EEE}, YEAR = {1968} } @ARTICLE{ey2, AUTHOR = {A. AAA and B. BBB and A. CCC and D. DDD}, YEAR = {1968} } @ARTICLE{ey3, AUTHOR = {A. MMM and B. NNN}, YEAR = {1968} } @ARTICLE{ey4, AUTHOR = {A. MMM and B. NNN}, YEAR = {1968} } @ARTICLE{ey5, AUTHOR = {Aaa ZZZ and Bbb VVV}, YEAR = {1968} } @ARTICLE{ey6, AUTHOR = {Abb ZZZ and Bbb VVV}, YEAR = {1968} } biblatex-biber-2.4/t/tdata/uniqueness4.bcf000444000765000024 26134612667073765 21053 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 1 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 1 uniquename 2 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender uniqueness4.bib us1 us2 us3 us4 us5 us6 us7 us8 us9 us10 us11 us12 us13 us14 us15 us16 us17 us18 us19 us20 us21 us22 us23 us24 us25 us26 us27 us27a us28 us29 us29a us30 biblatex-biber-2.4/t/tdata/uniqueness4.bib000444000765000024 656712667073765 21017 0ustar00philkimestaff000000000000% Smith and Smith @ARTICLE{us1, AUTHOR = {John Smith and Bert Smith}, YEAR = {1968} } % Reynolds and Plumb @ARTICLE{us2, AUTHOR = {Bill Reynolds and James Plumb}, YEAR = {1932} } % Plumb and Reynolds @ARTICLE{us3, AUTHOR = {Alan Plumb and Trevor Reynolds}, YEAR = {1945} } % Brown and Heretic @ARTICLE{us4, AUTHOR = {Basil Brown and Helen Heretic}, YEAR = {1984} } % Brown @ARTICLE{us5, AUTHOR = {Mary Brown}, YEAR = {1983} } % Prefect, Mangle and Loon @ARTICLE{us6, AUTHOR = {Peter Prefect and Martin Mangle and Leigh Loon}, YEAR = {1982} } % Prefect and Mangle @ARTICLE{us7, AUTHOR = {Russ Prefect and Graham Mangle}, YEAR = {1989} } % Jingle and Irate @ARTICLE{us8, AUTHOR = {Jeremy Jingle and Otto Irate}, YEAR = {1982} } % Jingle and Montle @ARTICLE{us9, AUTHOR = {Kevin Jingle and Barbara Montle}, YEAR = {1989} } % R. Red and G. Green @ARTICLE{us10, AUTHOR = {Richard Red and Graham Green}, YEAR = {1982} } % V. Red and M. Green @ARTICLE{us11, AUTHOR = {Victor Red and Mark Green}, YEAR = {1989} } % Simon Slip and Brass @ARTICLE{us12, AUTHOR = {Simon Slip and Bertie Brass}, YEAR = {1989} } % Steven Slip and Brass @ARTICLE{us13, AUTHOR = {Steven Slip and Bertie Brass}, YEAR = {1989} } % With maxnames/minnames=3, don't disambiguate the names in these lists as due to the "et al", % the lists are different in themselves % With maxnames=2/minnames=1, the lists are "the same" (Gurgle et al) so do disambiguate the % lists. % With maxnames=3/minnames=1, the lists are different (Gurgle et al, Gurgle, Splonk and Remedial) % so don't disambiguate % lists. % Gurgle, Splonk, Remdial et al @ARTICLE{us14, AUTHOR = {Peter Gurgle and Martin Splonk and Leigh Remedial and Trevor Argue}, YEAR = {1989} } % Gurgle, Splonk and Remedial @ARTICLE{us15, AUTHOR = {Alan Gurgle and Michael Splonk and Leigh Remedial}, YEAR = {1989} } % $ul = 3 and 4 @ARTICLE{us16, AUTHOR = {AAA and BBB and CCC}, YEAR = {1902} } @ARTICLE{us17, AUTHOR = {AAA and BBB and CCC and DDD}, YEAR = {1906} } % $ul = 3 and 4 % AAAA won't be disambiguated since the lists are therefore different @ARTICLE{us18, AUTHOR = {a. AAAA and BBBB and CCCC}, YEAR = {1902} } @ARTICLE{us19, AUTHOR = {b. AAAA and BBBB and CCCC and DDDD}, YEAR = {1906} } % @ARTICLE{us20, AUTHOR = {Ulrich Schmitz}, YEAR = {1906} } @ARTICLE{us21, AUTHOR = {Ulrich Schmitz}, YEAR = {1934} } @ARTICLE{us22, AUTHOR = {Brian Cambell and Frank Schmitz}, YEAR = {1936} } @ARTICLE{us23, AUTHOR = {Oliver Oligarch}, YEAR = {1906} } @ARTICLE{us24, AUTHOR = {Otto Oligarch}, YEAR = {1934} } @ARTICLE{us25, AUTHOR = {Ian Ink and Peter Oligarch}, YEAR = {1936} } @ARTICLE{us26, AUTHOR = {Roger Meredith}, YEAR = {1936} } @ARTICLE{us27a, AUTHOR = {Roger Meredith}, YEAR = {1934} } @ARTICLE{us27, AUTHOR = {Alan Meredith}, YEAR = {1936} } @ARTICLE{us28, AUTHOR = {Andrew Meredith}, YEAR = {1936} } @ARTICLE{us29, AUTHOR = {Clive Creation and Peter Patronage}, YEAR = {1936} } @ARTICLE{us29a, AUTHOR = {Clive Creation and Peter Patronage}, YEAR = {1934} } @ARTICLE{us30, AUTHOR = {Liam Creation and Peter Patronage}, YEAR = {1932} } biblatex-biber-2.4/t/tdata/uniqueness5.bcf000444000765000024 25650112667073765 21051 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 1 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 1 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 1 uniquename 2 useprefix 1 useauthor 1 useeditor 1 usetranslator 1 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender uniqueness5.bib * biblatex-biber-2.4/t/tdata/uniqueness5.bib000444000765000024 300712667073765 21002 0ustar00philkimestaff000000000000% maxnames=1, minnames=1 % both should be uniquelist=undef as the year disambiguates @ARTICLE{uls1, AUTHOR = {John Smith and Henry Jones}, YEAR = {2000} } @ARTICLE{uls2, AUTHOR = {John Smith and Sam Small}, YEAR = {2001} } % Should be uniquelist = 2 for both as the year is the same @ARTICLE{uls3, AUTHOR = {Henry Helarn and Brian Bonkers}, YEAR = {2000} } @ARTICLE{uls4, AUTHOR = {Henry Helarn and Michael Resin}, YEAR = {2000} } % uls5 and uls6 should all be uniquelist = 2 as same year but uls7 should be undef @ARTICLE{uls5, AUTHOR = {Robert Feld and Ian Ink}, YEAR = {2000} } @ARTICLE{uls6, AUTHOR = {Robert Feld and Brian Belt}, YEAR = {2000} } @ARTICLE{uls7, AUTHOR = {Robert Feld and Stanley Gibbons}, YEAR = {2001} } % maxnames=3, minnames=2 % uls8 and uls9 should all be undef as the year disambiguates @ARTICLE{uls8, AUTHOR = {Patrick Poodle and Robin Vessel and Marvin Eagle and Rupert Trendle}, YEAR = {2000} } @ARTICLE{uls9, AUTHOR = {Patrick Poodle and Robin Vessel and Jeremy Idle and Leigh Loog}, YEAR = {2001} } % uls10 and uls11 should be uniquelist = 3 and uls12 should be undef @ARTICLE{uls10, AUTHOR = {Vogel and Beast and Garble and Rook}, YEAR = {2000} } @ARTICLE{uls11, AUTHOR = {Vogel and Beast and Tremble and Bite}, YEAR = {2000} } @ARTICLE{uls12, AUTHOR = {Vogel and Beast and Acid and Squeeze}, YEAR = {2001} }biblatex-biber-2.4/t/tdata/xdata.bcf000444000765000024 25675312667073765 17677 0ustar00philkimestaff000000000000 output_encoding utf8 input_encoding utf8 debug 0 mincrossrefs 2 sortcase 0 sortgiveninits 0 sortupper 1 alphaothers \textbf{+} labelalpha 0 labelnamespec shortauthor author shorteditor editor translator labeltitle 0 labeltitlespec shorttitle title labeltitleyear 0 labeldate 1 labeldatespec date maxalphanames 3 maxbibnames 3 maxcitenames 3 maxitems 3 minalphanames 1 minbibnames 1 mincitenames 1 minitems 1 singletitle 0 sortalphaothers + sortlocale english sortscheme nty uniquelist 0 uniquename 0 useprefix 0 useauthor 1 useeditor 0 usetranslator 0 datamodel labelalphatemplate inheritance sortingnamekey sortscheme labelnamespec labeltitlespec labeldatespec controlversion alphaothers sortalphaothers presort backend texencoding bibencoding sorting sortlos sortlocale language babel autolang backrefsetstyle block date datelabel urldate eventdate origdate alldates autocite notetype refsection refsegment citereset backrefstyle arxiv useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor debug loadfiles safeinputenc sortcase sortupper terseinits firstinits sortfirstinits giveninits sortgiveninits abbreviate dateabbrev clearlang indexing sortcites hyperref backref pagetracker citecounter citetracker ibidtracker idemtracker opcittracker loccittracker parentracker datezeros autopunct punctfont labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle defernumbers bibwarn useprefix defernums isbn url doi eprint related dashed mergedate mincrossrefs maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames maxparens alphaothers sortalphaothers presort useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing labelnumber labelalpha labeltitle labeltitleyear labeldate labelyear uniquelist uniquename singletitle useprefix skipbib skiplos skipbiblist skiplab dataonly labelalphatemplate sortexclusion labelnamespec labeltitlespec labeldatespec maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useafterword useannotator useauthor usebookauthor usecommentator useeditor useeditora useeditorb useeditorc useforeword useholder useintroduction usenamea usenameb usenamec usetranslator useshortauthor useshorteditor indexing uniquelist uniquename useprefix skipbib skiplos skipbiblist skiplab dataonly sortnamekeyscheme presort maxnames minnames maxbibnames minbibnames maxcitenames mincitenames maxitems minitems maxalphanames minalphanames useprefix sortnamekeyscheme useprefix sortnamekeyscheme shorthand label labelname labelname year prefix family given suffix prefix mm presort sortkey sortname author editor translator sorttitle title sorttitle title sortyear year volume 0000 sf,sm,sn,pf,pm,pn,pp prefix,family,suffix,given boolean,integer,string,xml article artwork audio bibnote book bookinbook booklet collection commentary customa customb customc customd custome customf inbook incollection inproceedings inreference image jurisdiction legal legislation letter manual misc movie music mvcollection mvbook online patent performance periodical proceedings reference report review set software standard suppbook suppcollection thesis unpublished video xdata day endday endmonth eventday eventendday eventendmonth eventmonth eventyear origday origendday origendmonth origmonth origyear urlday urlendday urlendmonth urlmonth urlyear abstract addendum annotation booksubtitle booktitle booktitleaddon chapter edition eid entrysubtype eprintclass eprinttype eventtitle eventtitleaddon gender howpublished langid langidopts indexsorttitle indextitle isan isbn ismn isrn issn issue issuesubtitle issuetitle iswc journalsubtitle journaltitle label library mainsubtitle maintitle maintitleaddon nameaddon note number origtitle pagetotal part relatedstring relatedtype reprinttitle series shorthand shorthandintro shortjournal shortseries shorttitle subtitle title titleaddon usera userb userc userd usere userf venue version volume volumes month year urlendyear endyear eventendyear origendyear sorttitle sortshorthand sortyear sortkey presort entryset institution lista listb listc listd liste listf location organization origlocation origpublisher publisher afterword annotator author bookauthor commentator editor editora editorb editorc foreword holder introduction namea nameb namec shortauthor shorteditor translator sortname authortype editoratype editorbtype editorctype editortype bookpagination nameatype namebtype namectype origlanguage pagination pubstate type language crossref xref xdata ids date eventdate origdate urldate doi eprint file verba verbb verbc url keywords related options relatedoptions pages execute with writer producer execproducer director abstractloc doubtfulauthor doubtfuldate titleisdescription newspaper urldescription abstracturl abstract annotation authortype bookpagination crossref entryset entrysubtype execute file gender ids indextitle indexsorttitle isan ismn iswc keywords label langid langidopts library lista listb listc listd liste listf nameaddon options origday origendday origendmonth origendyear origmonth origyear origlocation origpublisher origtitle pagination presort related relatedtype relatedstring shortauthor shorteditor shorthand shorthandintro shortjournal shortseries shorttitle sortkey sortname sortshorthand sorttitle sortyear usera userb userc userd usere userf verba verbb verbc xdata xref set entryset crossref article author journaltitle title day endday endmonth endyear month year addendum annotator commentator doi editor editora editorb editorc editoratype editorbtype editorctype eid eprint eprintclass eprinttype issn issue issuetitle issuesubtitle journalsubtitle language note number origlanguage pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear version volume bibnote note book author title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location maintitle maintitleaddon mainsubtitle note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvbook author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes inbook bookinbook suppbook author title booktitle day endday endmonth endyear month year addendum afterword annotator bookauthor booksubtitle booktitleaddon chapter commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage part publisher pages pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes booklet author editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype howpublished language location note pages pagetotal pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear collection reference editor title day endday endmonth endyear month year addendum afterword annotator chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages pagetotal part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes mvcollection mvreference author title day endday endmonth endyear month year addendum afterword annotator commentator doi edition editor editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location note number origlanguage publisher pubstate subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes incollection suppcollection inreference author editor title booktitle day endday endmonth endyear month year addendum afterword annotator booksubtitle booktitleaddon chapter commentator doi edition editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype foreword introduction isbn language location mainsubtitle maintitle maintitleaddon note number origlanguage pages part publisher pubstate series subtitle titleaddon translator url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume volumes manual title day endday endmonth endyear month year addendum author chapter doi edition editor eprint eprintclass eprinttype isbn language location note number organization pages pagetotal publisher pubstate series subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version misc title day endday endmonth endyear day endday endmonth endyear month year addendum author doi editor eprint eprintclass eprinttype howpublished language location note organization pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version online title url addendum author editor language month note organization pubstate subtitle titleaddon urlday urlendday urlendmonth urlendyear urlmonth urlyear version year patent author title number day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype holder location note pubstate subtitle titleaddon type url urlday urlendday urlendmonth urlendyear urlmonth urlyear version periodical editor title day endday endmonth endyear month year addendum doi editora editorb editorc editoratype editorbtype editorctype eprint eprintclass eprinttype issn issue issuesubtitle issuetitle language note number pubstate series subtitle url urlday urlendday urlendmonth urlendyear urlmonth urlyear volume mvproceedings editor title day endday endmonth endyear month year addendum doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location note number organization pagetotal publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volumes proceedings editor title day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages pagetotal part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes inproceedings author editor title booktitle day endday endmonth endyear month year addendum booksubtitle booktitleaddon chapter doi eprint eprintclass eprinttype eventday eventendday eventendmonth eventendyear eventmonth eventyear eventtitle eventtitleaddon isbn language location mainsubtitle maintitle maintitleaddon note number organization pages part publisher pubstate series subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear venue volume volumes report author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype isrn language location note number pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear version thesis author title type institution day endday endmonth endyear month year addendum chapter doi eprint eprintclass eprinttype language location note pages pagetotal pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear unpublished author title day endday endmonth endyear month year addendum howpublished language location note pubstate subtitle titleaddon url urlday urlendday urlendmonth urlendyear urlmonth urlyear article book inbook bookinbook suppbook booklet collection incollection suppcollection manual misc mvbook mvcollection online patent periodical suppperiodical proceedings inproceedings reference inreference report set thesis unpublished date year set entryset crossref article author journaltitle title book mvbook mvcollection mvreference author title inbook bookinbook suppbook author title booktitle booklet author editor title collection reference editor title incollection suppcollection inreference author editor title booktitle manual title misc title online title url patent author title number periodical editor title proceedings mvproceedings editor title inproceedings author editor title booktitle report author title type institution thesis author title type institution unpublished author title isbn issn ismn date eventdate origdate urldate gender xdata.bib xdata.bltxml xd1 xd2 xd3 biblatex-biber-2.4/t/tdata/xdata.bib000444000765000024 146012667073765 17620 0ustar00philkimestaff000000000000@XDATA{macmillan:pub, IDS = {macmillan:pubALIAS}, PUBLISHER = {Macmillan} } @XDATA{macmillan:loc, LOCATION = {New York and London}, NOTE = {A Note} } @XDATA{macmillan, IDS = {macmillanalias}, XDATA = {macmillan:pubALIAS, macmillan:loc} } @BOOK{xd1, AUTHOR = {Edward Ellington}, DATE = {2007}, XDATA = {macmillanalias, missingxd} } @BOOK{xd2, AUTHOR = {Peter Pillington}, DATE = {2003}, PUBLISHER = {Routledge}, XDATA = {macmillan:loc, bltxxd1} } % Loop detection test @XDATA{loop:1, NOTE = {Note} } @XDATA{loop:2, XDATA = {loop:3} } @XDATA{loop:3, XDATA = {loop} } @XDATA{loop, XDATA = {loop:1, loop:2} } @BOOK{xd3, AUTHOR = {Edward Ellington}, DATE = {1923}, XDATA = {loop} } biblatex-biber-2.4/t/tdata/xdata.bltxml000444000765000024 116612667073765 20371 0ustar00philkimestaff000000000000 Москва bltxxd2 bltxxd3 An abstract venue