diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/citation-style-language/citation-style-language.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/citation-style-language/citation-style-language.sty | 807 |
1 files changed, 807 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/citation-style-language/citation-style-language.sty b/Master/texmf-dist/tex/latex/citation-style-language/citation-style-language.sty new file mode 100644 index 00000000000..117e9c844ab --- /dev/null +++ b/Master/texmf-dist/tex/latex/citation-style-language/citation-style-language.sty @@ -0,0 +1,807 @@ +% +% Copyright (C) 2021 Zeping Lee +% + +\NeedsTeXFormat{LaTeX2e} +\RequirePackage{expl3} +\RequirePackage{xparse} +\ProvidesExplPackage {citation-style-language} {2022-01-22} {v0.1.0} + {Citation Style Language for LaTeX} + +% \msg_new:nnn { citation-style-language } { require-luatex } +% { LuaTeX~ is~ required~ for~ `citation-style-language'~ package. } +% \sys_if_engine_luatex:F { \msg_fatal:nn { citation-style-language } { require-luatex } } + +\sys_if_engine_luatex:T + { \lua_now:n { csl = require("csl") } } + +\RequirePackage { filehook } +\RequirePackage { url } + +\cs_new:Npn \csl_incompatible_package:n #1 + { + \AtBeginOfPackageFile* { #1 } + { \msg_error:nnn { citation-style-language } { incompatible-package } { #1 } } + } +\msg_new:nnn { citation-style-language } { incompatible-package } + { The~ `#1'~ package~ is~ incompatible~ with~ `citeproc'. } + +\csl_incompatible_package:n { babelbib } +\csl_incompatible_package:n { backref } +\csl_incompatible_package:n { biblatex } +\csl_incompatible_package:n { bibtopic } +\csl_incompatible_package:n { bibunits } +\csl_incompatible_package:n { chapterbib } +\csl_incompatible_package:n { cite } +\csl_incompatible_package:n { citeref } +\csl_incompatible_package:n { inlinebib } +\csl_incompatible_package:n { jurabib } +\csl_incompatible_package:n { mcite } +\csl_incompatible_package:n { mciteplus } +\csl_incompatible_package:n { multibib } +\csl_incompatible_package:n { natbib } +\csl_incompatible_package:n { splitbib } + + +\NewDocumentCommand \cslsetup { m } + { \keys_set:nn { csl } {#1} } + +\cs_new:Npn \csloptions #1 { } + + +\DeclareDocumentCommand \cite { o o m } + { + \IfValueTF { #2 } + { \csl_cite:nnn { #1 } { #2 } { #3 } } + { + \IfValueTF { #1 } + { \csl_cite:nnn { } { #1 } { #3 } } + { \csl_cite:nnn { } { } { #3 } } + } + } + + +% % multicite command +% \DeclareDocumentCommand \cites { o o m } + + +\DeclareDocumentCommand \nocite { m } + { + \ifx \@begindocumenthook \@undefined \else + \exp_after:wN \AtBeginDocument + \fi + { + \if@filesw + \iow_now:Nn \@auxout + { \citation { { nocite } { #1 } { } } } + \fi + } + \sys_if_engine_luatex:T + { \lua_now:n { csl.nocite("#1") } } +} + + +\tl_new:N \l__csl_citation_tl +\tl_new:N \l__csl_citation_id_tl +\tl_new:N \l__csl_cite_items_tl +\tl_new:N \l__csl_note_index_tl +\tl_new:N \l__csl_citation_info_tl + +\cs_new:Npn \csl_cite:nnn #1#2#3 + { + \csl_process_citation_id:n { #3 } + \csl_process_cite_items:nnn { #1 } { #2 } { #3 } + \exp_args:NV \csl_process_note_index:n \l__csl_citation_id_tl + \tl_set:Nx \l__csl_citation_info_tl + { + { \l__csl_citation_id_tl } + { \l__csl_cite_items_tl } + { \l__csl_note_index_tl } + } + \if@filesw + { + \iow_now:Nx \@auxout + { \exp_not:N \citation { \l__csl_citation_info_tl } } + } + \fi + \tl_clear:N \l__csl_citation_tl + \tl_if_exist:cTF { g__csl_citation_ \l__csl_citation_id_tl _tl } + { + \exp_args:Nv \csl_print_defined_citation:n + { g__csl_citation_ \l__csl_citation_id_tl _tl } + } + { + \bool_if:NTF \l__csl_engine_initialized_bool + { + \tl_set:Nx \l__csl_citation_tl + { \lua_now:e { csl.cite("\l__csl_citation_info_tl") } } + } + { + \exp_args:Nx \csl_print_undefined_citation:n + { \clist_use:Nn \l__csl_keys_clist { ,~ } } + } + } + } + +\cs_new:Npn \csl_print_undefined_citation:n #1 + { + \tl_set:Nn \l__csl_citation_tl { [ \textbf { #1 } ] } + \G@refundefinedtrue + \exp_args:Nnnx \msg_warning:nnn { citation-style-language } { citation / undefined } { #1 } + \group_begin: + \reset@font [ \textbf { #1 } ] + \group_end: + } + +\cs_new:Npn \csl_print_defined_citation:n #1 + { + \csl_print_defined_citation_aux:nn #1 + } + +\cs_new:Npn \csl_print_defined_citation_aux:nn #1#2 + { + \tl_set:Nn \l__csl_citation_tl { #2 } + \tl_if_eq:nnTF { #1 } { note } + { \footnote { #2 } } + { #2 } + } + + +\msg_new:nnn { citation-style-language } { citation / undefined } + { + Citation~ `#1'~ on~ page~ \thepage \space undefined~ \msg_line_context: . + } + + +\clist_new:N \l__csl_keys_clist +\tl_new:N \l__csl_normalized_keys_tl + +% \csl_process_citation_id:n { <cite item ids> } +% It sets the `\l__csl_citation_id_tl` `ITEM-1,ITEM-2@4`. +\cs_new:Npn \csl_process_citation_id:n #1 + { + \clist_set:Nn \l__csl_keys_clist { #1 } + \tl_set:Nx \l__csl_normalized_keys_tl + { \clist_use:Nn \l__csl_keys_clist { , } } + \int_if_exist:cF { g__csl_citation_count_ \l__csl_normalized_keys_tl _int } + { + \int_gzero_new:c + { g__csl_citation_count_ \l__csl_normalized_keys_tl _int } + } + \int_gincr:c { g__csl_citation_count_ \l__csl_normalized_keys_tl _int } + \tl_set:Nx \l__csl_citation_id_tl + { + \l__csl_normalized_keys_tl @ + \int_use:c { g__csl_citation_count_ \l__csl_normalized_keys_tl _int } + } + } + + +\tl_new:N \l__csl_cite_item_tl + +% `{citationID}{{id={id1},{}},{}}{<noteIndex>}` +\cs_new:Npn \csl_process_cite_items:nnn #1#2#3 + { + \tl_clear:N \l__csl_cite_items_tl + \clist_map_inline:nn { #3 } + { + \tl_if_empty:NTF \l__csl_cite_items_tl + { + \csl_process_cite_item:nnn { #1 } { #2 } { ##1 } + \tl_put_right:Nx \l__csl_cite_items_tl { { \l__csl_cite_item_tl } } + } + { + \csl_process_cite_item:nnn { } { } { ##1 } + \tl_put_right:Nx \l__csl_cite_items_tl { , { \l__csl_cite_item_tl } } + } + } + } + + +\prop_new:N \l__csl_cite_item_prop + +\keys_define:nn { csl / cite-item } + { + prefix .prop_put:N = \l__csl_cite_item_prop, + suffix .prop_put:N = \l__csl_cite_item_prop, + locator .prop_put:N = \l__csl_cite_item_prop, + label .prop_put:N = \l__csl_cite_item_prop, + suppress-author .prop_put:N = \l__csl_cite_item_prop, + author-only .prop_put:N = \l__csl_cite_item_prop, + uris .prop_put:N = \l__csl_cite_item_prop, + book .code:n = { \csl_set_locator:nn { book } { #1 } } , + chapter .code:n = { \csl_set_locator:nn { chapter } { #1 } } , + column .code:n = { \csl_set_locator:nn { column } { #1 } } , + figure .code:n = { \csl_set_locator:nn { figure } { #1 } } , + folio .code:n = { \csl_set_locator:nn { folio } { #1 } } , + issue .code:n = { \csl_set_locator:nn { issue } { #1 } } , + line .code:n = { \csl_set_locator:nn { line } { #1 } } , + note .code:n = { \csl_set_locator:nn { note } { #1 } } , + opus .code:n = { \csl_set_locator:nn { opus } { #1 } } , + page .code:n = { \csl_set_locator:nn { page } { #1 } } , + paragraph .code:n = { \csl_set_locator:nn { paragraph } { #1 } } , + part .code:n = { \csl_set_locator:nn { part } { #1 } } , + section .code:n = { \csl_set_locator:nn { section } { #1 } } , + sub-verbo .code:n = { \csl_set_locator:nn { sub-verbo } { #1 } } , + verse .code:n = { \csl_set_locator:nn { verse } { #1 } } , + volume .code:n = { \csl_set_locator:nn { volume } { #1 } } , + } + +\cs_new:Npn \csl_set_locator:nn #1#2 + { + \prop_put:Nnn \l__csl_cite_item_prop { label } { #1 } + \prop_put:Nnn \l__csl_cite_item_prop { locator } { #2 } + } + +\tl_new:N \l__csl_prefix_tl +\tl_new:N \l__csl_suffix_tl + +% \csl_process_cite_item:nnn { <prenote> } { <postnote> } { <item ID> } +% return: `id={ITEM},locator={42},label={page}` +\cs_new:Npn \csl_process_cite_item:nnn #1#2#3 + { + \prop_clear:N \l__csl_cite_item_prop + \prop_put:Nnn \l__csl_cite_item_prop { id } { #3 } + \tl_if_empty:nF { #1 } + { + \tl_set:Nn \l__csl_prefix_tl { #1 } + \tl_put_right:NV \l__csl_prefix_tl \l__csl_prefix_separator_tl + \prop_put:NnV \l__csl_cite_item_prop { prefix } { \l__csl_prefix_tl } + } + \tl_if_in:nnTF { #2 } { = } + { + \keys_set:nn { csl / cite-item } { #2 } + } + { + \tl_if_empty:nF { #2 } + { + \regex_match:nnTF { \d+ } { #2 } + { \csl_set_locator:nn { page } { #2 } } + { + \tl_set:Nn \l__csl_suffix_tl { #2 } + \tl_put_left:NV \l__csl_suffix_tl \l__csl_suffix_separator_tl + \prop_put:NnV \l__csl_cite_item_prop { suffix } { \l__csl_suffix_tl } + } + } + } + \tl_clear:N \l__csl_cite_item_tl + \prop_map_inline:Nn \l__csl_cite_item_prop + { + \tl_if_empty:NF \l__csl_cite_item_tl + { \tl_put_right:Nn \l__csl_cite_item_tl { , } } + \tl_put_right:Nn \l__csl_cite_item_tl { ##1 = { ##2 } } + } + } + +\int_new:N \l__csl_note_index_int +\int_gzero_new:N \g__csl_last_note_index_int +\int_gzero_new:N \g__csl_citation_note_count_int + +% \csl_process_note_index:nnn { <citation ID> } +\cs_new:Npn \csl_process_note_index:n #1 + { + \int_set_eq:Nc \l__csl_note_index_int { c@ \@mpfn } + \tl_if_exist:cTF { g__csl_citation_ #1 _tl } + { \int_incr:N \l__csl_note_index_int } + { \int_gincr:N \g__csl_citation_note_count_int } + \int_add:Nn \l__csl_note_index_int { \g__csl_citation_note_count_int } + \tl_set:Nx \l__csl_note_index_tl + { \int_use:N \l__csl_note_index_int } + \int_gset_eq:NN \g__csl_last_note_index_int \l__csl_note_index_int + \int_compare:nT { \l__csl_note_index_int < \g__csl_last_note_index_int } + { + \int_gzero:N \g__csl_last_note_index_int + \int_gzero:N \g__csl_citation_note_count_int + } + } + + +% Used in aux files to register cite items. +\cs_set:Npn \citation #1 + { + \sys_if_engine_luatex:T + { \lua_now:n { csl.register_citation_info("#1") } } + } + + +\cs_new:Npn \cslcite #1#2 + { + \bibcite { #1 } { #2 } + \if@filesw + \iow_now:Nn \@auxout { \bibcite { #1 } { #2 } } + \fi + } + + +\cs_set:Npn \bibcite #1#2 + { + \tl_gset:cn { g__csl_citation_ #1 _tl } { #2 } + } + +% The `babel` package redefines \bibcite in the \@begindocumenthook. +% This should be disabled. +\AtEndOfPackageFile* { babel } + { + \cs_set_eq:NN \bbl@cite@choice \relax + } + +\AtEndOfPackageFile* { hyperref } + { + \cs_set:Npn \bibcite #1#2 + { + \tl_gset:cn { g__csl_citation_ #1 _tl } { #2 } + } + } + +\NewDocumentCommand \printbibliography { } + { + \sys_if_engine_luatex:TF + { + \bool_if:NTF \l__csl_engine_initialized_bool + { \lua_now:n { csl.bibliography() } } + { \msg_warning:nnn { citation-style-language } { bibliography / empty } } + } + { + \tl_if_empty:NTF \l__csl_bibliography_tl + { + \file_if_exist_input:nF { \jobname .bbl } + { + \msg_warning:nnx { citation-style-language } { file / non-exist} { \jobname .bbl } + } + } + { \exp_args:NV \csl_print_bibiliography_tl \l__csl_bibliography_tl } + } + } + +\cs_new:Npn \csl_print_bibliography_tl #1 + { + \begin { thebibliography } + #1 + \end { thebibliography } + } + +\msg_new:nnn { citation-style-language } { bibliography / empty } + { The~ bibliography~ is~ empty. } + +\msg_new:nnn { citation-style-language } { file / non-exist } + { No~ file~ #1. } + + +\tl_new:N \l__csl_style_tl +\clist_new:N \l__csl_bib_resources_clist +\tl_new:N \l__csl_prefix_separator_tl +\tl_new:N \l__csl_suffix_separator_tl +\tl_new:N \l__csl_locale_tl +\tl_new:N \l__csl_bib_font_tl +\tl_new:N \l__csl_bib_item_sep_tl +\tl_new:N \l__csl_bib_hang_tl +\bool_new:N \l__csl_hanging_indent_bool +\tl_new:N \l__csl_line_spacing_tl +\tl_new:N \l__csl_entry_spacing_tl + + +\keys_define:nn { csl } + { + style .tl_set:N = \l__csl_style_tl , + prefix-separator .tl_set:N = \l__csl_prefix_separator_tl , + suffix-separator .tl_set:N = \l__csl_suffix_separator_tl , + locale .tl_set:N = \l__csl_locale_tl , + bib-font .tl_set:N = \l__csl_bib_font_tl , + bib-item-sep .tl_set:N = \l__csl_bib_item_sep_tl , + bib-hang .tl_set:N = \l__csl_bib_hang_tl , + hanging-indent .bool_set:N = \l__csl_hanging_indent_bool , + line-spacing .tl_set:N = \l__csl_line_spacing_tl , + entry-spacing .tl_set:N = \l__csl_entry_spacing_tl , + } + +\keys_set:nn { csl } + { + prefix-separator = { ~ } , + suffix-separator = { , ~ } , + bib-hang = { 1 em } , + line-spacing = { 1 } , + entry-spacing = { 1 } , + } + +\bool_new:N \l__csl_engine_initialized_bool + +\prop_set_from_keyval:Nn \l__csl_babel_locale_mapping_prop + { + acadian = fr-CA, + american = en-US, + australian = en-AU, + afrikaans = af-ZA, + albanian = sq-AL, + amharic = am-ET, + arabic = ar, + 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 = la-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-Latn, + 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, + } + +\tl_new:N \l__csl_bibliography_tl +\tl_new:N \l__csl_bibliography_setup_tl + +\AtBeginDocument + { + \tl_if_empty:NTF \l__csl_style_tl + { \tl_set_eq:NN \l__csl_style_tl \g__csl_aux_bibstyle_tl } + { \exp_args:Nx \csl_write_aux_bibstyle:n { \l__csl_style_tl } } + \clist_if_empty:NTF \l__csl_bib_resources_clist + { \clist_set_eq:NN \l__csl_bib_resources_clist \g__csl_aux_bib_files_clist } + { + \exp_args:Nx \csl_write_aux_bibdata:n + { \clist_use:Nn \l__csl_bib_resources_clist { , } } + } + \csl_write_aux_csl_options: + \sys_if_engine_luatex:T + { + \lua_now:e + { + csl.init( + "\l__csl_style_tl", + "\l__csl_bib_resources_clist", + "\l__csl_locale_tl" + ) + } + \str_if_eq:eeT { \lua_now:n { tex.print(csl.initialized) } } { true } + { \bool_set_true:N \l__csl_engine_initialized_bool } + \@ifpackageloaded { hyperref } + { \lua_now:n { csl.enable_linking() } } + { } + } + % Load .bbl at the beginning of document to save one pass of latex. + % In this procedure, the \cslcite command is processed and the contents + % of `thebibliography` is stored into \l__csl_bibliography_tl. + \group_begin: + \RenewDocumentCommand \cslsetup { m } + { \tl_set:Nn \l__csl_bibliography_setup_tl { #1 } } + \RenewDocumentEnvironment { thebibliography } { m +b } + { \tl_set:Nn \l__csl_bibliography_tl { { #1 } #2 } } + { } + \file_if_exist_input:n { \jobname .bbl } + \group_end: + } + +\cs_new:Npn \csl_write_aux_bibstyle:n #1 + { + \if@filesw + \iow_now:Nn \@auxout { \bibstyle { #1 } } + \fi + } + +\clist_new:N \l__csl_options_clist + +\cs_new:Nn \csl_write_aux_csl_options: + { + \clist_clear:N \l__csl_options_clist + % locale + \tl_if_empty:NT \l__csl_locale_tl + { + \tl_if_exist:NT \bbl@main@language + { + \prop_get:NVN \l__csl_babel_locale_mapping_prop \bbl@main@language + \l__csl_locale_tl + } + } + \tl_if_empty:NF \l__csl_locale_tl + { + \clist_put_right:Nx \l__csl_options_clist + { locale = \l__csl_locale_tl } + } + % linking + \@ifpackageloaded { hyperref } + { \clist_put_right:Nn \l__csl_options_clist { linking = true } } + { } + % write to aux file + \prop_if_empty:NF \l__csl_options_clist + { + \if@filesw + \iow_now:Nx \@auxout + { + \exp_not:N \csloptions + { \clist_use:Nn \l__csl_options_clist { , } } + } + \fi + } + } + + +\DeclareDocumentCommand \bibliographystyle { m } + { + \ifx \@begindocumenthook \@undefined + \csl_write_aux_bibstyle:n { #1 } + \fi + \tl_set:Nn \l__csl_style_tl { #1 } + } + +\tl_new:N \g__csl_aux_bibstyle_tl +\cs_set:Npn \bibstyle #1 + { \tl_gset:Nn \g__csl_aux_bibstyle_tl { #1 } } + + +\NewDocumentCommand \addbibresource { o m } + { \clist_put_right:Nn \l__csl_bib_resources_clist { #2 } } + + +\clist_new:N \g__csl_aux_bib_files_clist +\cs_set:Npn \bibdata #1 + { \clist_gput_right:Nn \g__csl_aux_bib_files_clist { #1 } } + + +\DeclareDocumentCommand \bibliography { m } + { + \csl_write_aux_bibdata:n { #1 } + \printbibliography + } + +\cs_new:Npn \csl_write_aux_bibdata:n #1 + { + \if@filesw + \iow_now:Nn \@auxout { \bibdata { #1 } } + \fi + } + + +\clist_new:N \g__csl_bib_items_clist + +% For numeric or label-style bibliography +% \def\@lbibitem[#1]#2{\item[\@biblabel{#1}\hfill]\if@filesw +% {\let\protect\noexpand +% \immediate +% \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +\cs_new:Npn \csl_lbibitem:nn [#1]#2 + { + \clist_gput_right:Nn \g__csl_bib_items_clist { #2 } + \item [ \@biblabel { #1 } \hfill ] \ignorespaces + } +\cs_set_eq:NN \@lbibitem \csl_lbibitem:nn + +% For author-date bibliography +% \def\@bibitem#1{\item\if@filesw \immediate\write\@auxout +% {\string\bibcite{#1}{\the\value{\@listctr}}}\fi\ignorespaces} +\cs_new:Npn \csl_bibitem:n #1 + { + \clist_gput_right:Nn \g__csl_bib_items_clist { #1 } + \item [ ] \ignorespaces + } +\cs_set_eq:NN \@bibitem \csl_bibitem:n + +\AtEndOfPackageFile* { hyperref } + { + \cs_gset_eq:NN \@lbibitem \csl_lbibitem:nn + \cs_gset_eq:NN \@bibitem \csl_bibitem:n + } + +% CSL outputs the whole label thus the brackets are removed from \@biblabel +% \def\@biblabel#1{[#1]} +\cs_set:Npn \@biblabel #1 { #1 } + + +\cs_if_exist:cTF { chapter } + { + \cs_set:Nn \csl_bib_section: + { + \chapter * + { + \bibname + \@mkboth + { \MakeUppercase { \bibname } } + { \MakeUppercase { \bibname } } + } + } + } + { + \cs_set:Nn \csl_bib_section: + { + \section * + { + \refname + \@mkboth + { \MakeUppercase { \refname } } + { \MakeUppercase { \refname } } + } + } + } + +\tl_new:N \l__csl_bib_preamble_tl + +\tl_new:N \l__csl_bib_postamble_tl + +\dim_new:N \l__csl_bib_hang_dim +\skip_new:N \l__csl_bib_item_sep_skip + +\cs_new:Npn \csl_set_bib_label_spacing:n #1 + { + \bool_if:NTF \l__csl_hanging_indent_bool + { + \dim_set:Nn \l__csl_bib_hang_dim { \l__csl_bib_hang_tl } + \dim_set_eq:NN \leftmargin \l__csl_bib_hang_dim + \dim_set:Nn \itemindent { - \leftmargin } + } + { + \settowidth \labelwidth { \@biblabel { #1 } } + \dim_set_eq:NN \leftmargin \labelwidth + \dim_add:Nn \leftmargin { \labelsep } + } + } + +\cs_new:Nn \csl_set_bib_item_sep: + { + \skip_zero:N \parsep + \tl_if_empty:NTF \l__csl_bib_item_sep_tl + { + \skip_set:Nn \l__csl_bib_item_sep_skip + { + 8 pt plus 4 pt minus 2 pt * \dim_ratio:nn { 1 em } { 8 pt } + * \l__csl_entry_spacing_tl + } + } + { \skip_set:Nn \l__csl_bib_item_sep_skip { \l__csl_bib_item_sep_tl } } + } + +\cs_new:Nn \csl_set_bib_allow_break: + { + \sloppy + \int_set:Nn \clubpenalty { 4000 } + \int_set_eq:NN \@clubpenalty \clubpenalty + \int_set:Nn \widowpenalty { 4000 } + % \sfcode`\.\@m + \frenchspacing + } +% TODO: \biburlsetup + +\cs_new_eq:NN \csl_set_bib_page_break: \csl_set_bib_allow_break: + +\cs_new:Nn \csl_set_bib_no_break: + { + \sloppy + \int_set:Nn \interlinepenalty { 5000 } + \int_set:Nn \widowpenalty { 10000 } + \int_set:Nn \clubpenalty { 10000 } + \int_set_eq:NN \@clubpenalty \clubpenalty + \raggedbottom + \frenchspacing + } + +% It will be used for multi-bibliography. +\cs_new:Nn \csl_reset_bib_format: + { + \keys_set:nn { csl } { + hanging-indent = false , + line-spacing = 1 , + entry-spacing = 1 , + } + } + +% \newenvironment{thebibliography}[1] +\RenewDocumentEnvironment { thebibliography } { m } + { + \csl_bib_section: + \dim_zero:N \parindent + \l__csl_bib_preamble_tl + \tl_if_eq:NnF \l__csl_line_spacing_tl { 1 } + { \linespread { \l__csl_line_spacing_tl } \selectfont } + \l__csl_bib_font_tl + \list { } + { + \csl_set_bib_label_spacing:n { #1 } + \csl_set_bib_item_sep: + } + \sloppy + \csl_set_bib_page_break: + \frenchspacing + \clist_gclear:N \g__csl_bib_items_clist + } + { + \l__csl_bib_postamble_tl + \tl_set:Nn \@noitemerr + { \msg_warning:nnn { citation-style-language } { bibliography / empty } } + \endlist + \csl_reset_bib_format: + } + +\endinput |