% % Copyright (c) 2021-2024 Zeping Lee % Released under the MIT License. % Repository: https://github.com/zepinglee/citeproc-lua % % ## Compatibilities with other packages % ### `babel` % This should be disabled. \hook_gput_code:nnn { package / babel / after } { . } { \RenewDocumentCommand \nocite { m } { % \@safe@activestrue\org@nocite{#1}\@safe@activesfalse \@safe@activestrue \__csl_no_cite:n {#1} \@safe@activesfalse } \cs_set_eq:NN \bbl@cite@choice \relax \cs_set_eq:NN \@lbibitem \__csl_lbibitem_plain:nn \cs_set_eq:NN \@bibitem \__csl_bibitem_plain:n } % ### `backref` \hook_gput_code:nnn { package / backref / after } { . } { \cs_set:Npn \__csl_add_back_ref_info: { \seq_map_inline:Nn \l__csl_cite_keys_seq { \Hy@backout {##1} } } } % ### `beamer` % `beamer` passes `implicit=false` to `hyperref` to skip its patch to LaTeX2e % internal bibliographic commands. Instead `beamer` refines those commands % in its own way. \cs_new:Npn \__csl_beamer_cite_item:nn #1#2 { \hyperlink { beamerbib #1 } { #2 } } \cs_new:Npn \__csl_beamer_lbibitem:nn [#1]#2 { \exp_after:wN \item \beamer@bibstore [ \@biblabel {#1} \hfill ] \cs_if_exist:cF { beamerbib@ #2 @ \int_use:N \c@framenumber } { \cs_gset:cpn { beamerbib@ #2 @ \int_use:N \c@framenumber } { \relax } \hypertarget { beamerbib #2 } { } } \hbox { } \ignorespaces } \cs_new:Npn \__csl_beamer_bibitem:n #1 { \exp_after:wN \item \beamer@bibstore \cs_if_exist:cF { beamerbib@ #1 @ \int_use:N \c@framenumber } { \cs_gset:cpn { beamerbib@ #1 @ \int_use:N \c@framenumber } { \relax } \hypertarget { beamerbib #1 } { } } } \hook_gput_code:nnn { class / beamer / after } { . } { \cs_gset_eq:NN \@lbibitem \__csl_beamer_lbibitem:nn \cs_gset_eq:NN \@bibitem \__csl_beamer_bibitem:n \cs_gset_eq:NN \cslcite \__csl_beamer_cite_item:nn } % ### `biblatex` % The following doesn't really make `csl` compatible with `biblatex`. % It just provides commands to make it accepting `biblatex`'s database. \ProvideDocumentCommand { \hyphen } { } { \nobreak - \nobreak \hskip \z@skip } % ### `csquotes` \hook_gput_code:nnn { package / csquotes / after } { . } { \BlockquoteDisable { \cs_set_eq:NN \__csl_process_citation_info:NN \use_none:nn \cs_set_eq:NN \__csl_make_citation:N \use_none:n } } % ### `hyperref` \cs_set:Npn \__csl_hyperref_cite_item:nn #1#2 { \hyper@@link [ cite ] { } { cite. #1 \@extra@b@citeb } { #2 } } \cs_new:Npn \__csl_hyperref_lbibitem:nn [#1]#2 { \clist_gput_right:Nn \g__csl_bib_items_clist {#2} \@skiphyperreftrue \H@item[% \ifx\Hy@raisedlink\@empty \hyper@anchorstart{cite.#2\@extra@b@citeb}% \@BIBLABEL{#1}% \hyper@anchorend \else \Hy@raisedlink{% \hyper@anchorstart{cite.#2\@extra@b@citeb}\hyper@anchorend }% \@BIBLABEL{#1}% \fi \hfill ]% \@skiphyperreffalse \ignorespaces } \cs_new:Npn \__csl_hyperref_bibitem:n #1 { \clist_gput_right:Nn \g__csl_bib_items_clist {#1} \@skiphyperreftrue \H@item \@skiphyperreffalse \Hy@raisedlink { \hyper@anchorstart { cite. #1 \@extra@b@citeb } \relax \hyper@anchorend } \ignorespaces } % The hyperref package also patches \bibcite but it cannot provide hyperlinks % when used with csl. \bool_new:N \l__csl_hyperref_loaded_bool \hook_gput_code:nnn { package / hyperref / after } { . } { \bool_set_true:N \l__csl_hyperref_loaded_bool % Pakcage "hyperref" redefines \@lbibitem and \bibitem and we need to % recover them. % In non-implicit mode (e.g., loaded by `beamer`), hyperref stops early % (`\MaybeStopEarly`) and it doesn't redefine the cite internal commands. \cs_if_exist:NT \@extra@b@citeb { \cs_gset_eq:NN \@lbibitem \__csl_lbibitem: \cs_gset_eq:NN \@bibitem \__csl_bibitem: \cs_gset_eq:NN \__csl_lbibitem_plain:nn \__csl_hyperref_lbibitem:nn \cs_gset_eq:NN \__csl_bibitem_plain:n \__csl_hyperref_bibitem:n \cs_gset_eq:NN \cslcite \__csl_hyperref_cite_item:nn } }