%% %% This is file `expl3-code.tex', %% generated with the docstrip utility. %% %% The original source files were: %% %% expl3.dtx (with options: `package') %% l3bootstrap.dtx (with options: `package') %% l3names.dtx (with options: `package') %% l3basics.dtx (with options: `package') %% l3expan.dtx (with options: `package') %% l3tl.dtx (with options: `package') %% l3str.dtx (with options: `package') %% l3seq.dtx (with options: `package') %% l3int.dtx (with options: `package') %% l3intarray.dtx (with options: `package') %% l3flag.dtx (with options: `package') %% l3quark.dtx (with options: `package') %% l3prg.dtx (with options: `package') %% l3clist.dtx (with options: `package') %% l3token.dtx (with options: `package') %% l3prop.dtx (with options: `package') %% l3msg.dtx (with options: `package') %% l3file.dtx (with options: `package') %% l3skip.dtx (with options: `package') %% l3keys.dtx (with options: `package') %% l3fp.dtx (with options: `package') %% l3fp-aux.dtx (with options: `package') %% l3fp-traps.dtx (with options: `package') %% l3fp-round.dtx (with options: `package') %% l3fp-parse.dtx (with options: `package') %% l3fp-logic.dtx (with options: `package') %% l3fp-basics.dtx (with options: `package') %% l3fp-extended.dtx (with options: `package') %% l3fp-expo.dtx (with options: `package') %% l3fp-trig.dtx (with options: `package') %% l3fp-convert.dtx (with options: `package') %% l3fp-random.dtx (with options: `package') %% l3fp-assign.dtx (with options: `package') %% l3sort.dtx (with options: `package') %% l3tl-build.dtx (with options: `package') %% l3tl-analysis.dtx (with options: `package') %% l3regex.dtx (with options: `package') %% l3box.dtx (with options: `package') %% l3coffins.dtx (with options: `package') %% l3color.dtx (with options: `package') %% l3sys.dtx (with options: `package') %% l3deprecation.dtx (with options: `package') %% l3candidates.dtx (with options: `package') %% l3luatex.dtx (with options: `package,tex') %% %% Copyright (C) 1990-2017 The LaTeX3 Project %% %% It may be distributed and/or modified under the conditions of %% the LaTeX Project Public License (LPPL), either version 1.3c of %% this license or (at your option) any later version. The latest %% version of this license is in the file: %% %% https://www.latex-project.org/lppl.txt %% %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx Copyright (C) 1990-2017 The LaTeX3 Project \def\ExplFileDate{2017/12/16}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax \begingroup \def\next{\endgroup\endgroup}% \def\PackageError#1#2#3% {% \endgroup \errhelp{#3}% \errmessage{#1 Error: #2!}% }% \fi \expandafter\ifx\csname ExplLoaderFileDate\endcsname\relax \def\next {% \PackageError{expl3}{No expl3 loader detected} {% You have attempted to use the expl3 code directly rather than using the correct loader. Loading of expl3 will abort. }% \endgroup \endinput } \else \ifx\ExplLoaderFileDate\ExplFileDate \else \def\next {% \PackageError{expl3}{Mismatched expl3 files detected} {% You have attempted to load expl3 with mismatched files: probably you have one or more files 'locally installed' which are in conflict. Loading of expl3 will abort. }% \endgroup \endinput }% \fi \fi \next \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname ver@expl3-code.tex\endcsname\relax \expandafter\edef\csname ver@expl3-code.tex\endcsname {% \ExplFileDate\space L3 programming layer }% \else \expandafter\endinput \fi \immediate\write-1 % {% Package: expl3 \ExplFileDate\space L3 programming layer (code)% }% %% File: l3bootstrap.dtx Copyright (C) 2011-2017 The LaTeX3 project \begingroup \csname protected\endcsname\gdef\GetIdInfo {% \begingroup \catcode 32 = 10 % \GetIdInfoAuxI }% \csname protected\endcsname\gdef\GetIdInfoAuxI$#1$#2% {% \def\tempa{#1}% \def\tempb{Id}% \ifx\tempa\tempb \def\tempa {% \endgroup \def\ExplFileDate{0000/00/00}% \def\ExplFileDescription{#2}% \def\ExplFileName{[unknown]}% \def\ExplFileExtension{[unknown extension]}% \def\ExplFileVersion{-1}% }% \else \def\tempa {% \endgroup \def\ExplFileDescription{#2}% \GetIdInfoAuxII$#1 $% }% \fi \tempa }% \csname protected\endcsname\gdef\GetIdInfoAuxII$#1 #2.#3 #4 #5 #6$% {% \def\ExplFileName{#2}% \def\ExplFileExtension{#3}% \def\ExplFileVersion{#4}% \begingroup \def\tempa{#4}% \def\tempb{-1}% \ifx\tempa\tempb \def\tempa {% \endgroup \def\ExplFileDate{0000/00/00}% }% \else \def\tempa {% \endgroup \GetIdInfoAuxIII$#5$% }% \fi \tempa }% \csname protected\endcsname\gdef\GetIdInfoAuxIII$#1-#2-#3$% {% \def\ExplFileDate{#1/#2/#3}% }% \endgroup \begingroup \expandafter\ifx\csname directlua\endcsname\relax \else \directlua{% local i local t = { } for _,i in pairs(tex.extraprimitives("luatex")) do if string.match(i,"^U") then if not string.match(i,"^Uchar$") then %$ table.insert(t,i) end end end tex.enableprimitives("", t) }% \fi \endgroup \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfstrcmp\endcsname\relax \let\pdfstrcmp\strcmp \fi \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname directlua\endcsname\relax \else \ifnum\luatexversion<70 % \else \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname newcatcodetable\endcsname\relax \input{ltluatex}% \fi \newcatcodetable\ucharcat@table \directlua{ l3kernel = l3kernel or { } local charcat_table = \number\ucharcat@table\space l3kernel.charcat_table = charcat_table }% \directlua{require("expl3")}% \ifnum 0% \directlua{ if status.ini_version then tex.write("1") end }>0 % \everyjob\expandafter{% \the\expandafter\everyjob \csname\detokenize{lua_now_x:n}\endcsname{require("expl3")}% }% \fi \fi \fi \begingroup \def\next{\endgroup}% \def\ShortText{Required primitives not found}% \def\LongText% {% LaTeX3 requires the e-TeX primitives and additional functionality as described in the README file. \LineBreak These are available in the engines\LineBreak - pdfTeX v1.40\LineBreak - XeTeX v0.9994\LineBreak - LuaTeX v0.70\LineBreak - e-(u)pTeX mid-2012\LineBreak or later.\LineBreak \LineBreak }% \ifnum0% \expandafter\ifx\csname pdfstrcmp\endcsname\relax \else \expandafter\ifx\csname pdftexversion\endcsname\relax 1% \else \ifnum\pdftexversion<140 \else 1\fi \fi \fi \expandafter\ifx\csname directlua\endcsname\relax \else \ifnum\luatexversion<70 \else 1\fi \fi =0 % \newlinechar`\^^J % \def\LineBreak{\noexpand\MessageBreak}% \expandafter\ifx\csname PackageError\endcsname\relax \def\LineBreak{^^J}% \def\PackageError#1#2#3% {% \errhelp{#3}% \errmessage{#1 Error: #2}% }% \fi \edef\next {% \noexpand\PackageError{expl3}{\ShortText} {\LongText Loading of expl3 will abort!}% \endgroup \noexpand\endinput }% \fi \next \begingroup \def\@tempa{LaTeX2e}% \def\next{}% \ifx\fmtname\@tempa \expandafter\ifx\csname extrafloats\endcsname\relax \def\next {% \RequirePackage{etex}% \csname reserveinserts\endcsname{32}% }% \fi \fi \expandafter\endgroup \next \protected\def\ExplSyntaxOff{}% \protected\edef\ExplSyntaxOff {% \protected\def\ExplSyntaxOff{}% \catcode 9 = \the\catcode 9\relax \catcode 32 = \the\catcode 32\relax \catcode 34 = \the\catcode 34\relax \catcode 38 = \the\catcode 38\relax \catcode 58 = \the\catcode 58\relax \catcode 94 = \the\catcode 94\relax \catcode 95 = \the\catcode 95\relax \catcode 124 = \the\catcode 124\relax \catcode 126 = \the\catcode 126\relax \endlinechar = \the\endlinechar\relax \chardef\csname\detokenize{l__kernel_expl_bool}\endcsname = 0\relax }% \catcode 9 = 9\relax \catcode 32 = 9\relax \catcode 34 = 12\relax \catcode 38 = 4\relax \catcode 58 = 11\relax \catcode 94 = 7\relax \catcode 95 = 11\relax \catcode 124 = 12\relax \catcode 126 = 10\relax \endlinechar = 32\relax \chardef\l__kernel_expl_bool = 1\relax \protected \def \ExplSyntaxOn { \bool_if:NF \l__kernel_expl_bool { \cs_set_protected:Npx \ExplSyntaxOff { \char_set_catcode:nn { 9 } { \char_value_catcode:n { 9 } } \char_set_catcode:nn { 32 } { \char_value_catcode:n { 32 } } \char_set_catcode:nn { 34 } { \char_value_catcode:n { 34 } } \char_set_catcode:nn { 38 } { \char_value_catcode:n { 38 } } \char_set_catcode:nn { 58 } { \char_value_catcode:n { 58 } } \char_set_catcode:nn { 94 } { \char_value_catcode:n { 94 } } \char_set_catcode:nn { 95 } { \char_value_catcode:n { 95 } } \char_set_catcode:nn { 124 } { \char_value_catcode:n { 124 } } \char_set_catcode:nn { 126 } { \char_value_catcode:n { 126 } } \tex_endlinechar:D = \tex_the:D \tex_endlinechar:D \scan_stop: \bool_set_false:N \l__kernel_expl_bool \cs_set_protected:Npn \ExplSyntaxOff { } } } \char_set_catcode_ignore:n { 9 } % tab \char_set_catcode_ignore:n { 32 } % space \char_set_catcode_other:n { 34 } % double quote \char_set_catcode_alignment:n { 38 } % ampersand \char_set_catcode_letter:n { 58 } % colon \char_set_catcode_math_superscript:n { 94 } % circumflex \char_set_catcode_letter:n { 95 } % underscore \char_set_catcode_other:n { 124 } % pipe \char_set_catcode_space:n { 126 } % tilde \tex_endlinechar:D = 32 \scan_stop: \bool_set_true:N \l__kernel_expl_bool } %% File: l3names.dtx Copyright (C) 1990-2017 The LaTeX3 project \let \tex_global:D \global \let \tex_let:D \let \begingroup \long \def \__kernel_primitive:NN #1#2 { \tex_global:D \tex_let:D #2 #1 } \__kernel_primitive:NN \ \tex_space:D \__kernel_primitive:NN \/ \tex_italiccorrection:D \__kernel_primitive:NN \- \tex_hyphen:D \__kernel_primitive:NN \above \tex_above:D \__kernel_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D \__kernel_primitive:NN \abovedisplayskip \tex_abovedisplayskip:D \__kernel_primitive:NN \abovewithdelims \tex_abovewithdelims:D \__kernel_primitive:NN \accent \tex_accent:D \__kernel_primitive:NN \adjdemerits \tex_adjdemerits:D \__kernel_primitive:NN \advance \tex_advance:D \__kernel_primitive:NN \afterassignment \tex_afterassignment:D \__kernel_primitive:NN \aftergroup \tex_aftergroup:D \__kernel_primitive:NN \atop \tex_atop:D \__kernel_primitive:NN \atopwithdelims \tex_atopwithdelims:D \__kernel_primitive:NN \badness \tex_badness:D \__kernel_primitive:NN \baselineskip \tex_baselineskip:D \__kernel_primitive:NN \batchmode \tex_batchmode:D \__kernel_primitive:NN \begingroup \tex_begingroup:D \__kernel_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D \__kernel_primitive:NN \belowdisplayskip \tex_belowdisplayskip:D \__kernel_primitive:NN \binoppenalty \tex_binoppenalty:D \__kernel_primitive:NN \botmark \tex_botmark:D \__kernel_primitive:NN \box \tex_box:D \__kernel_primitive:NN \boxmaxdepth \tex_boxmaxdepth:D \__kernel_primitive:NN \brokenpenalty \tex_brokenpenalty:D \__kernel_primitive:NN \catcode \tex_catcode:D \__kernel_primitive:NN \char \tex_char:D \__kernel_primitive:NN \chardef \tex_chardef:D \__kernel_primitive:NN \cleaders \tex_cleaders:D \__kernel_primitive:NN \closein \tex_closein:D \__kernel_primitive:NN \closeout \tex_closeout:D \__kernel_primitive:NN \clubpenalty \tex_clubpenalty:D \__kernel_primitive:NN \copy \tex_copy:D \__kernel_primitive:NN \count \tex_count:D \__kernel_primitive:NN \countdef \tex_countdef:D \__kernel_primitive:NN \cr \tex_cr:D \__kernel_primitive:NN \crcr \tex_crcr:D \__kernel_primitive:NN \csname \tex_csname:D \__kernel_primitive:NN \day \tex_day:D \__kernel_primitive:NN \deadcycles \tex_deadcycles:D \__kernel_primitive:NN \def \tex_def:D \__kernel_primitive:NN \defaulthyphenchar \tex_defaulthyphenchar:D \__kernel_primitive:NN \defaultskewchar \tex_defaultskewchar:D \__kernel_primitive:NN \delcode \tex_delcode:D \__kernel_primitive:NN \delimiter \tex_delimiter:D \__kernel_primitive:NN \delimiterfactor \tex_delimiterfactor:D \__kernel_primitive:NN \delimitershortfall \tex_delimitershortfall:D \__kernel_primitive:NN \dimen \tex_dimen:D \__kernel_primitive:NN \dimendef \tex_dimendef:D \__kernel_primitive:NN \discretionary \tex_discretionary:D \__kernel_primitive:NN \displayindent \tex_displayindent:D \__kernel_primitive:NN \displaylimits \tex_displaylimits:D \__kernel_primitive:NN \displaystyle \tex_displaystyle:D \__kernel_primitive:NN \displaywidowpenalty \tex_displaywidowpenalty:D \__kernel_primitive:NN \displaywidth \tex_displaywidth:D \__kernel_primitive:NN \divide \tex_divide:D \__kernel_primitive:NN \doublehyphendemerits \tex_doublehyphendemerits:D \__kernel_primitive:NN \dp \tex_dp:D \__kernel_primitive:NN \dump \tex_dump:D \__kernel_primitive:NN \edef \tex_edef:D \__kernel_primitive:NN \else \tex_else:D \__kernel_primitive:NN \emergencystretch \tex_emergencystretch:D \__kernel_primitive:NN \end \tex_end:D \__kernel_primitive:NN \endcsname \tex_endcsname:D \__kernel_primitive:NN \endgroup \tex_endgroup:D \__kernel_primitive:NN \endinput \tex_endinput:D \__kernel_primitive:NN \endlinechar \tex_endlinechar:D \__kernel_primitive:NN \eqno \tex_eqno:D \__kernel_primitive:NN \errhelp \tex_errhelp:D \__kernel_primitive:NN \errmessage \tex_errmessage:D \__kernel_primitive:NN \errorcontextlines \tex_errorcontextlines:D \__kernel_primitive:NN \errorstopmode \tex_errorstopmode:D \__kernel_primitive:NN \escapechar \tex_escapechar:D \__kernel_primitive:NN \everycr \tex_everycr:D \__kernel_primitive:NN \everydisplay \tex_everydisplay:D \__kernel_primitive:NN \everyhbox \tex_everyhbox:D \__kernel_primitive:NN \everyjob \tex_everyjob:D \__kernel_primitive:NN \everymath \tex_everymath:D \__kernel_primitive:NN \everypar \tex_everypar:D \__kernel_primitive:NN \everyvbox \tex_everyvbox:D \__kernel_primitive:NN \exhyphenpenalty \tex_exhyphenpenalty:D \__kernel_primitive:NN \expandafter \tex_expandafter:D \__kernel_primitive:NN \fam \tex_fam:D \__kernel_primitive:NN \fi \tex_fi:D \__kernel_primitive:NN \finalhyphendemerits \tex_finalhyphendemerits:D \__kernel_primitive:NN \firstmark \tex_firstmark:D \__kernel_primitive:NN \floatingpenalty \tex_floatingpenalty:D \__kernel_primitive:NN \font \tex_font:D \__kernel_primitive:NN \fontdimen \tex_fontdimen:D \__kernel_primitive:NN \fontname \tex_fontname:D \__kernel_primitive:NN \futurelet \tex_futurelet:D \__kernel_primitive:NN \gdef \tex_gdef:D \__kernel_primitive:NN \global \tex_global:D \__kernel_primitive:NN \globaldefs \tex_globaldefs:D \__kernel_primitive:NN \halign \tex_halign:D \__kernel_primitive:NN \hangafter \tex_hangafter:D \__kernel_primitive:NN \hangindent \tex_hangindent:D \__kernel_primitive:NN \hbadness \tex_hbadness:D \__kernel_primitive:NN \hbox \tex_hbox:D \__kernel_primitive:NN \hfil \tex_hfil:D \__kernel_primitive:NN \hfill \tex_hfill:D \__kernel_primitive:NN \hfilneg \tex_hfilneg:D \__kernel_primitive:NN \hfuzz \tex_hfuzz:D \__kernel_primitive:NN \hoffset \tex_hoffset:D \__kernel_primitive:NN \holdinginserts \tex_holdinginserts:D \__kernel_primitive:NN \hrule \tex_hrule:D \__kernel_primitive:NN \hsize \tex_hsize:D \__kernel_primitive:NN \hskip \tex_hskip:D \__kernel_primitive:NN \hss \tex_hss:D \__kernel_primitive:NN \ht \tex_ht:D \__kernel_primitive:NN \hyphenation \tex_hyphenation:D \__kernel_primitive:NN \hyphenchar \tex_hyphenchar:D \__kernel_primitive:NN \hyphenpenalty \tex_hyphenpenalty:D \__kernel_primitive:NN \if \tex_if:D \__kernel_primitive:NN \ifcase \tex_ifcase:D \__kernel_primitive:NN \ifcat \tex_ifcat:D \__kernel_primitive:NN \ifdim \tex_ifdim:D \__kernel_primitive:NN \ifeof \tex_ifeof:D \__kernel_primitive:NN \iffalse \tex_iffalse:D \__kernel_primitive:NN \ifhbox \tex_ifhbox:D \__kernel_primitive:NN \ifhmode \tex_ifhmode:D \__kernel_primitive:NN \ifinner \tex_ifinner:D \__kernel_primitive:NN \ifmmode \tex_ifmmode:D \__kernel_primitive:NN \ifnum \tex_ifnum:D \__kernel_primitive:NN \ifodd \tex_ifodd:D \__kernel_primitive:NN \iftrue \tex_iftrue:D \__kernel_primitive:NN \ifvbox \tex_ifvbox:D \__kernel_primitive:NN \ifvmode \tex_ifvmode:D \__kernel_primitive:NN \ifvoid \tex_ifvoid:D \__kernel_primitive:NN \ifx \tex_ifx:D \__kernel_primitive:NN \ignorespaces \tex_ignorespaces:D \__kernel_primitive:NN \immediate \tex_immediate:D \__kernel_primitive:NN \indent \tex_indent:D \__kernel_primitive:NN \input \tex_input:D \__kernel_primitive:NN \inputlineno \tex_inputlineno:D \__kernel_primitive:NN \insert \tex_insert:D \__kernel_primitive:NN \insertpenalties \tex_insertpenalties:D \__kernel_primitive:NN \interlinepenalty \tex_interlinepenalty:D \__kernel_primitive:NN \jobname \tex_jobname:D \__kernel_primitive:NN \kern \tex_kern:D \__kernel_primitive:NN \language \tex_language:D \__kernel_primitive:NN \lastbox \tex_lastbox:D \__kernel_primitive:NN \lastkern \tex_lastkern:D \__kernel_primitive:NN \lastpenalty \tex_lastpenalty:D \__kernel_primitive:NN \lastskip \tex_lastskip:D \__kernel_primitive:NN \lccode \tex_lccode:D \__kernel_primitive:NN \leaders \tex_leaders:D \__kernel_primitive:NN \left \tex_left:D \__kernel_primitive:NN \lefthyphenmin \tex_lefthyphenmin:D \__kernel_primitive:NN \leftskip \tex_leftskip:D \__kernel_primitive:NN \leqno \tex_leqno:D \__kernel_primitive:NN \let \tex_let:D \__kernel_primitive:NN \limits \tex_limits:D \__kernel_primitive:NN \linepenalty \tex_linepenalty:D \__kernel_primitive:NN \lineskip \tex_lineskip:D \__kernel_primitive:NN \lineskiplimit \tex_lineskiplimit:D \__kernel_primitive:NN \long \tex_long:D \__kernel_primitive:NN \looseness \tex_looseness:D \__kernel_primitive:NN \lower \tex_lower:D \__kernel_primitive:NN \lowercase \tex_lowercase:D \__kernel_primitive:NN \mag \tex_mag:D \__kernel_primitive:NN \mark \tex_mark:D \__kernel_primitive:NN \mathaccent \tex_mathaccent:D \__kernel_primitive:NN \mathbin \tex_mathbin:D \__kernel_primitive:NN \mathchar \tex_mathchar:D \__kernel_primitive:NN \mathchardef \tex_mathchardef:D \__kernel_primitive:NN \mathchoice \tex_mathchoice:D \__kernel_primitive:NN \mathclose \tex_mathclose:D \__kernel_primitive:NN \mathcode \tex_mathcode:D \__kernel_primitive:NN \mathinner \tex_mathinner:D \__kernel_primitive:NN \mathop \tex_mathop:D \__kernel_primitive:NN \mathopen \tex_mathopen:D \__kernel_primitive:NN \mathord \tex_mathord:D \__kernel_primitive:NN \mathpunct \tex_mathpunct:D \__kernel_primitive:NN \mathrel \tex_mathrel:D \__kernel_primitive:NN \mathsurround \tex_mathsurround:D \__kernel_primitive:NN \maxdeadcycles \tex_maxdeadcycles:D \__kernel_primitive:NN \maxdepth \tex_maxdepth:D \__kernel_primitive:NN \meaning \tex_meaning:D \__kernel_primitive:NN \medmuskip \tex_medmuskip:D \__kernel_primitive:NN \message \tex_message:D \__kernel_primitive:NN \mkern \tex_mkern:D \__kernel_primitive:NN \month \tex_month:D \__kernel_primitive:NN \moveleft \tex_moveleft:D \__kernel_primitive:NN \moveright \tex_moveright:D \__kernel_primitive:NN \mskip \tex_mskip:D \__kernel_primitive:NN \multiply \tex_multiply:D \__kernel_primitive:NN \muskip \tex_muskip:D \__kernel_primitive:NN \muskipdef \tex_muskipdef:D \__kernel_primitive:NN \newlinechar \tex_newlinechar:D \__kernel_primitive:NN \noalign \tex_noalign:D \__kernel_primitive:NN \noboundary \tex_noboundary:D \__kernel_primitive:NN \noexpand \tex_noexpand:D \__kernel_primitive:NN \noindent \tex_noindent:D \__kernel_primitive:NN \nolimits \tex_nolimits:D \__kernel_primitive:NN \nonscript \tex_nonscript:D \__kernel_primitive:NN \nonstopmode \tex_nonstopmode:D \__kernel_primitive:NN \nulldelimiterspace \tex_nulldelimiterspace:D \__kernel_primitive:NN \nullfont \tex_nullfont:D \__kernel_primitive:NN \number \tex_number:D \__kernel_primitive:NN \omit \tex_omit:D \__kernel_primitive:NN \openin \tex_openin:D \__kernel_primitive:NN \openout \tex_openout:D \__kernel_primitive:NN \or \tex_or:D \__kernel_primitive:NN \outer \tex_outer:D \__kernel_primitive:NN \output \tex_output:D \__kernel_primitive:NN \outputpenalty \tex_outputpenalty:D \__kernel_primitive:NN \over \tex_over:D \__kernel_primitive:NN \overfullrule \tex_overfullrule:D \__kernel_primitive:NN \overline \tex_overline:D \__kernel_primitive:NN \overwithdelims \tex_overwithdelims:D \__kernel_primitive:NN \pagedepth \tex_pagedepth:D \__kernel_primitive:NN \pagefilllstretch \tex_pagefilllstretch:D \__kernel_primitive:NN \pagefillstretch \tex_pagefillstretch:D \__kernel_primitive:NN \pagefilstretch \tex_pagefilstretch:D \__kernel_primitive:NN \pagegoal \tex_pagegoal:D \__kernel_primitive:NN \pageshrink \tex_pageshrink:D \__kernel_primitive:NN \pagestretch \tex_pagestretch:D \__kernel_primitive:NN \pagetotal \tex_pagetotal:D \__kernel_primitive:NN \par \tex_par:D \__kernel_primitive:NN \parfillskip \tex_parfillskip:D \__kernel_primitive:NN \parindent \tex_parindent:D \__kernel_primitive:NN \parshape \tex_parshape:D \__kernel_primitive:NN \parskip \tex_parskip:D \__kernel_primitive:NN \patterns \tex_patterns:D \__kernel_primitive:NN \pausing \tex_pausing:D \__kernel_primitive:NN \penalty \tex_penalty:D \__kernel_primitive:NN \postdisplaypenalty \tex_postdisplaypenalty:D \__kernel_primitive:NN \predisplaypenalty \tex_predisplaypenalty:D \__kernel_primitive:NN \predisplaysize \tex_predisplaysize:D \__kernel_primitive:NN \pretolerance \tex_pretolerance:D \__kernel_primitive:NN \prevdepth \tex_prevdepth:D \__kernel_primitive:NN \prevgraf \tex_prevgraf:D \__kernel_primitive:NN \radical \tex_radical:D \__kernel_primitive:NN \raise \tex_raise:D \__kernel_primitive:NN \read \tex_read:D \__kernel_primitive:NN \relax \tex_relax:D \__kernel_primitive:NN \relpenalty \tex_relpenalty:D \__kernel_primitive:NN \right \tex_right:D \__kernel_primitive:NN \righthyphenmin \tex_righthyphenmin:D \__kernel_primitive:NN \rightskip \tex_rightskip:D \__kernel_primitive:NN \romannumeral \tex_romannumeral:D \__kernel_primitive:NN \scriptfont \tex_scriptfont:D \__kernel_primitive:NN \scriptscriptfont \tex_scriptscriptfont:D \__kernel_primitive:NN \scriptscriptstyle \tex_scriptscriptstyle:D \__kernel_primitive:NN \scriptspace \tex_scriptspace:D \__kernel_primitive:NN \scriptstyle \tex_scriptstyle:D \__kernel_primitive:NN \scrollmode \tex_scrollmode:D \__kernel_primitive:NN \setbox \tex_setbox:D \__kernel_primitive:NN \setlanguage \tex_setlanguage:D \__kernel_primitive:NN \sfcode \tex_sfcode:D \__kernel_primitive:NN \shipout \tex_shipout:D \__kernel_primitive:NN \show \tex_show:D \__kernel_primitive:NN \showbox \tex_showbox:D \__kernel_primitive:NN \showboxbreadth \tex_showboxbreadth:D \__kernel_primitive:NN \showboxdepth \tex_showboxdepth:D \__kernel_primitive:NN \showlists \tex_showlists:D \__kernel_primitive:NN \showthe \tex_showthe:D \__kernel_primitive:NN \skewchar \tex_skewchar:D \__kernel_primitive:NN \skip \tex_skip:D \__kernel_primitive:NN \skipdef \tex_skipdef:D \__kernel_primitive:NN \spacefactor \tex_spacefactor:D \__kernel_primitive:NN \spaceskip \tex_spaceskip:D \__kernel_primitive:NN \span \tex_span:D \__kernel_primitive:NN \special \tex_special:D \__kernel_primitive:NN \splitbotmark \tex_splitbotmark:D \__kernel_primitive:NN \splitfirstmark \tex_splitfirstmark:D \__kernel_primitive:NN \splitmaxdepth \tex_splitmaxdepth:D \__kernel_primitive:NN \splittopskip \tex_splittopskip:D \__kernel_primitive:NN \string \tex_string:D \__kernel_primitive:NN \tabskip \tex_tabskip:D \__kernel_primitive:NN \textfont \tex_textfont:D \__kernel_primitive:NN \textstyle \tex_textstyle:D \__kernel_primitive:NN \the \tex_the:D \__kernel_primitive:NN \thickmuskip \tex_thickmuskip:D \__kernel_primitive:NN \thinmuskip \tex_thinmuskip:D \__kernel_primitive:NN \time \tex_time:D \__kernel_primitive:NN \toks \tex_toks:D \__kernel_primitive:NN \toksdef \tex_toksdef:D \__kernel_primitive:NN \tolerance \tex_tolerance:D \__kernel_primitive:NN \topmark \tex_topmark:D \__kernel_primitive:NN \topskip \tex_topskip:D \__kernel_primitive:NN \tracingcommands \tex_tracingcommands:D \__kernel_primitive:NN \tracinglostchars \tex_tracinglostchars:D \__kernel_primitive:NN \tracingmacros \tex_tracingmacros:D \__kernel_primitive:NN \tracingonline \tex_tracingonline:D \__kernel_primitive:NN \tracingoutput \tex_tracingoutput:D \__kernel_primitive:NN \tracingpages \tex_tracingpages:D \__kernel_primitive:NN \tracingparagraphs \tex_tracingparagraphs:D \__kernel_primitive:NN \tracingrestores \tex_tracingrestores:D \__kernel_primitive:NN \tracingstats \tex_tracingstats:D \__kernel_primitive:NN \uccode \tex_uccode:D \__kernel_primitive:NN \uchyph \tex_uchyph:D \__kernel_primitive:NN \underline \tex_underline:D \__kernel_primitive:NN \unhbox \tex_unhbox:D \__kernel_primitive:NN \unhcopy \tex_unhcopy:D \__kernel_primitive:NN \unkern \tex_unkern:D \__kernel_primitive:NN \unpenalty \tex_unpenalty:D \__kernel_primitive:NN \unskip \tex_unskip:D \__kernel_primitive:NN \unvbox \tex_unvbox:D \__kernel_primitive:NN \unvcopy \tex_unvcopy:D \__kernel_primitive:NN \uppercase \tex_uppercase:D \__kernel_primitive:NN \vadjust \tex_vadjust:D \__kernel_primitive:NN \valign \tex_valign:D \__kernel_primitive:NN \vbadness \tex_vbadness:D \__kernel_primitive:NN \vbox \tex_vbox:D \__kernel_primitive:NN \vcenter \tex_vcenter:D \__kernel_primitive:NN \vfil \tex_vfil:D \__kernel_primitive:NN \vfill \tex_vfill:D \__kernel_primitive:NN \vfilneg \tex_vfilneg:D \__kernel_primitive:NN \vfuzz \tex_vfuzz:D \__kernel_primitive:NN \voffset \tex_voffset:D \__kernel_primitive:NN \vrule \tex_vrule:D \__kernel_primitive:NN \vsize \tex_vsize:D \__kernel_primitive:NN \vskip \tex_vskip:D \__kernel_primitive:NN \vsplit \tex_vsplit:D \__kernel_primitive:NN \vss \tex_vss:D \__kernel_primitive:NN \vtop \tex_vtop:D \__kernel_primitive:NN \wd \tex_wd:D \__kernel_primitive:NN \widowpenalty \tex_widowpenalty:D \__kernel_primitive:NN \write \tex_write:D \__kernel_primitive:NN \xdef \tex_xdef:D \__kernel_primitive:NN \xleaders \tex_xleaders:D \__kernel_primitive:NN \xspaceskip \tex_xspaceskip:D \__kernel_primitive:NN \year \tex_year:D \__kernel_primitive:NN \beginL \etex_beginL:D \__kernel_primitive:NN \beginR \etex_beginR:D \__kernel_primitive:NN \botmarks \etex_botmarks:D \__kernel_primitive:NN \clubpenalties \etex_clubpenalties:D \__kernel_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D \__kernel_primitive:NN \currentgrouptype \etex_currentgrouptype:D \__kernel_primitive:NN \currentifbranch \etex_currentifbranch:D \__kernel_primitive:NN \currentiflevel \etex_currentiflevel:D \__kernel_primitive:NN \currentiftype \etex_currentiftype:D \__kernel_primitive:NN \detokenize \etex_detokenize:D \__kernel_primitive:NN \dimexpr \etex_dimexpr:D \__kernel_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D \__kernel_primitive:NN \endL \etex_endL:D \__kernel_primitive:NN \endR \etex_endR:D \__kernel_primitive:NN \eTeXrevision \etex_eTeXrevision:D \__kernel_primitive:NN \eTeXversion \etex_eTeXversion:D \__kernel_primitive:NN \everyeof \etex_everyeof:D \__kernel_primitive:NN \firstmarks \etex_firstmarks:D \__kernel_primitive:NN \fontchardp \etex_fontchardp:D \__kernel_primitive:NN \fontcharht \etex_fontcharht:D \__kernel_primitive:NN \fontcharic \etex_fontcharic:D \__kernel_primitive:NN \fontcharwd \etex_fontcharwd:D \__kernel_primitive:NN \glueexpr \etex_glueexpr:D \__kernel_primitive:NN \glueshrink \etex_glueshrink:D \__kernel_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D \__kernel_primitive:NN \gluestretch \etex_gluestretch:D \__kernel_primitive:NN \gluestretchorder \etex_gluestretchorder:D \__kernel_primitive:NN \gluetomu \etex_gluetomu:D \__kernel_primitive:NN \ifcsname \etex_ifcsname:D \__kernel_primitive:NN \ifdefined \etex_ifdefined:D \__kernel_primitive:NN \iffontchar \etex_iffontchar:D \__kernel_primitive:NN \interactionmode \etex_interactionmode:D \__kernel_primitive:NN \interlinepenalties \etex_interlinepenalties:D \__kernel_primitive:NN \lastlinefit \etex_lastlinefit:D \__kernel_primitive:NN \lastnodetype \etex_lastnodetype:D \__kernel_primitive:NN \marks \etex_marks:D \__kernel_primitive:NN \middle \etex_middle:D \__kernel_primitive:NN \muexpr \etex_muexpr:D \__kernel_primitive:NN \mutoglue \etex_mutoglue:D \__kernel_primitive:NN \numexpr \etex_numexpr:D \__kernel_primitive:NN \pagediscards \etex_pagediscards:D \__kernel_primitive:NN \parshapedimen \etex_parshapedimen:D \__kernel_primitive:NN \parshapeindent \etex_parshapeindent:D \__kernel_primitive:NN \parshapelength \etex_parshapelength:D \__kernel_primitive:NN \predisplaydirection \etex_predisplaydirection:D \__kernel_primitive:NN \protected \etex_protected:D \__kernel_primitive:NN \readline \etex_readline:D \__kernel_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D \__kernel_primitive:NN \savingvdiscards \etex_savingvdiscards:D \__kernel_primitive:NN \scantokens \etex_scantokens:D \__kernel_primitive:NN \showgroups \etex_showgroups:D \__kernel_primitive:NN \showifs \etex_showifs:D \__kernel_primitive:NN \showtokens \etex_showtokens:D \__kernel_primitive:NN \splitbotmarks \etex_splitbotmarks:D \__kernel_primitive:NN \splitdiscards \etex_splitdiscards:D \__kernel_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D \__kernel_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D \__kernel_primitive:NN \topmarks \etex_topmarks:D \__kernel_primitive:NN \tracingassigns \etex_tracingassigns:D \__kernel_primitive:NN \tracinggroups \etex_tracinggroups:D \__kernel_primitive:NN \tracingifs \etex_tracingifs:D \__kernel_primitive:NN \tracingnesting \etex_tracingnesting:D \__kernel_primitive:NN \tracingscantokens \etex_tracingscantokens:D \__kernel_primitive:NN \unexpanded \etex_unexpanded:D \__kernel_primitive:NN \unless \etex_unless:D \__kernel_primitive:NN \widowpenalties \etex_widowpenalties:D \__kernel_primitive:NN \pdfannot \pdftex_pdfannot:D \__kernel_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D \__kernel_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D \__kernel_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D \__kernel_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D \__kernel_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D \__kernel_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D \__kernel_primitive:NN \pdfdest \pdftex_pdfdest:D \__kernel_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D \__kernel_primitive:NN \pdfendlink \pdftex_pdfendlink:D \__kernel_primitive:NN \pdfendthread \pdftex_pdfendthread:D \__kernel_primitive:NN \pdffontattr \pdftex_pdffontattr:D \__kernel_primitive:NN \pdffontname \pdftex_pdffontname:D \__kernel_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D \__kernel_primitive:NN \pdfgamma \pdftex_pdfgamma:D \__kernel_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D \__kernel_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D \__kernel_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D \__kernel_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D \__kernel_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D \__kernel_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D \__kernel_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D \__kernel_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D \__kernel_primitive:NN \pdfinclusioncopyfonts \pdftex_pdfinclusioncopyfonts:D \__kernel_primitive:NN \pdfinclusionerrorlevel \pdftex_pdfinclusionerrorlevel:D \__kernel_primitive:NN \pdfinfo \pdftex_pdfinfo:D \__kernel_primitive:NN \pdflastannot \pdftex_pdflastannot:D \__kernel_primitive:NN \pdflastlink \pdftex_pdflastlink:D \__kernel_primitive:NN \pdflastobj \pdftex_pdflastobj:D \__kernel_primitive:NN \pdflastxform \pdftex_pdflastxform:D \__kernel_primitive:NN \pdflastximage \pdftex_pdflastximage:D \__kernel_primitive:NN \pdflastximagecolordepth \pdftex_pdflastximagecolordepth:D \__kernel_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D \__kernel_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D \__kernel_primitive:NN \pdfliteral \pdftex_pdfliteral:D \__kernel_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D \__kernel_primitive:NN \pdfnames \pdftex_pdfnames:D \__kernel_primitive:NN \pdfobj \pdftex_pdfobj:D \__kernel_primitive:NN \pdfobjcompresslevel \pdftex_pdfobjcompresslevel:D \__kernel_primitive:NN \pdfoutline \pdftex_pdfoutline:D \__kernel_primitive:NN \pdfoutput \pdftex_pdfoutput:D \__kernel_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D \__kernel_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D \__kernel_primitive:NN \pdfpageref \pdftex_pdfpageref:D \__kernel_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D \__kernel_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D \__kernel_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D \__kernel_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D \__kernel_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D \__kernel_primitive:NN \pdfrestore \pdftex_pdfrestore:D \__kernel_primitive:NN \pdfretval \pdftex_pdfretval:D \__kernel_primitive:NN \pdfsave \pdftex_pdfsave:D \__kernel_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D \__kernel_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D \__kernel_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D \__kernel_primitive:NN \pdfsuppressptexinfo \pdftex_pdfsuppressptexinfo:D \__kernel_primitive:NN \pdfthread \pdftex_pdfthread:D \__kernel_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D \__kernel_primitive:NN \pdftrailer \pdftex_pdftrailer:D \__kernel_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D \__kernel_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D \__kernel_primitive:NN \pdfxform \pdftex_pdfxform:D \__kernel_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D \__kernel_primitive:NN \pdfxformname \pdftex_pdfxformname:D \__kernel_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D \__kernel_primitive:NN \pdfximage \pdftex_pdfximage:D \__kernel_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D \__kernel_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D \__kernel_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D \__kernel_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D \__kernel_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D \__kernel_primitive:NN \pdfcopyfont \pdftex_copyfont:D \__kernel_primitive:NN \pdfdraftmode \pdftex_draftmode:D \__kernel_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D \__kernel_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D \__kernel_primitive:NN \pdffilemoddate \pdftex_filemoddate:D \__kernel_primitive:NN \pdffilesize \pdftex_filesize:D \__kernel_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D \__kernel_primitive:NN \pdffontexpand \pdftex_fontexpand:D \__kernel_primitive:NN \pdffontsize \pdftex_fontsize:D \__kernel_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D \__kernel_primitive:NN \pdfinsertht \pdftex_insertht:D \__kernel_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D \__kernel_primitive:NN \pdflastxpos \pdftex_lastxpos:D \__kernel_primitive:NN \pdflastypos \pdftex_lastypos:D \__kernel_primitive:NN \pdfmapfile \pdftex_mapfile:D \__kernel_primitive:NN \pdfmapline \pdftex_mapline:D \__kernel_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D \__kernel_primitive:NN \pdfnoligatures \pdftex_noligatures:D \__kernel_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D \__kernel_primitive:NN \pdfpageheight \pdftex_pageheight:D \__kernel_primitive:NN \pdfpagewidth \pdftex_pagewidth:D \__kernel_primitive:NN \pdfpkmode \pdftex_pkmode:D \__kernel_primitive:NN \pdfpkresolution \pdftex_pkresolution:D \__kernel_primitive:NN \pdfprimitive \pdftex_primitive:D \__kernel_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D \__kernel_primitive:NN \pdfpxdimen \pdftex_pxdimen:D \__kernel_primitive:NN \pdfrandomseed \pdftex_randomseed:D \__kernel_primitive:NN \pdfsavepos \pdftex_savepos:D \__kernel_primitive:NN \pdfstrcmp \pdftex_strcmp:D \__kernel_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D \__kernel_primitive:NN \pdfshellescape \pdftex_shellescape:D \__kernel_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D \__kernel_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D \__kernel_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D \__kernel_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D \__kernel_primitive:NN \pdftexversion \pdftex_pdftexversion:D \__kernel_primitive:NN \efcode \pdftex_efcode:D \__kernel_primitive:NN \ifincsname \pdftex_ifincsname:D \__kernel_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D \__kernel_primitive:NN \letterspacefont \pdftex_letterspacefont:D \__kernel_primitive:NN \lpcode \pdftex_lpcode:D \__kernel_primitive:NN \quitvmode \pdftex_quitvmode:D \__kernel_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D \__kernel_primitive:NN \rpcode \pdftex_rpcode:D \__kernel_primitive:NN \synctex \pdftex_synctex:D \__kernel_primitive:NN \tagcode \pdftex_tagcode:D \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2} \tex_long:D \tex_def:D \use_none:n #1 { } \tex_long:D \tex_def:D \__kernel_primitive:NN #1#2 { \etex_ifdefined:D #1 \tex_expandafter:D \use_ii:nn \tex_fi:D \use_none:n { \tex_global:D \tex_let:D #2 #1 } } \__kernel_primitive:NN \suppressfontnotfounderror \xetex_suppressfontnotfounderror:D \__kernel_primitive:NN \XeTeXcharclass \xetex_charclass:D \__kernel_primitive:NN \XeTeXcharglyph \xetex_charglyph:D \__kernel_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D \__kernel_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D \__kernel_primitive:NN \XeTeXcountselectors \xetex_countselectors:D \__kernel_primitive:NN \XeTeXcountvariations \xetex_countvariations:D \__kernel_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D \__kernel_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D \__kernel_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D \__kernel_primitive:NN \XeTeXfeaturename \xetex_featurename:D \__kernel_primitive:NN \XeTeXfindfeaturebyname \xetex_findfeaturebyname:D \__kernel_primitive:NN \XeTeXfindselectorbyname \xetex_findselectorbyname:D \__kernel_primitive:NN \XeTeXfindvariationbyname \xetex_findvariationbyname:D \__kernel_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D \__kernel_primitive:NN \XeTeXfonttype \xetex_fonttype:D \__kernel_primitive:NN \XeTeXgenerateactualtext \xetex_generateactualtext:D \__kernel_primitive:NN \XeTeXglyph \xetex_glyph:D \__kernel_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D \__kernel_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D \__kernel_primitive:NN \XeTeXglyphname \xetex_glyphname:D \__kernel_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D \__kernel_primitive:NN \XeTeXinputnormalization \xetex_inputnormalization:D \__kernel_primitive:NN \XeTeXinterchartokenstate \xetex_interchartokenstate:D \__kernel_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D \__kernel_primitive:NN \XeTeXisdefaultselector \xetex_isdefaultselector:D \__kernel_primitive:NN \XeTeXisexclusivefeature \xetex_isexclusivefeature:D \__kernel_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D \__kernel_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D \__kernel_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D \__kernel_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D \__kernel_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D \__kernel_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D \__kernel_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D \__kernel_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D \__kernel_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D \__kernel_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D \__kernel_primitive:NN \XeTeXpdffile \xetex_pdffile:D \__kernel_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D \__kernel_primitive:NN \XeTeXpicfile \xetex_picfile:D \__kernel_primitive:NN \XeTeXselectorname \xetex_selectorname:D \__kernel_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D \__kernel_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D \__kernel_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D \__kernel_primitive:NN \XeTeXvariation \xetex_variation:D \__kernel_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D \__kernel_primitive:NN \XeTeXvariationmax \xetex_variationmax:D \__kernel_primitive:NN \XeTeXvariationmin \xetex_variationmin:D \__kernel_primitive:NN \XeTeXvariationname \xetex_variationname:D \__kernel_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D \__kernel_primitive:NN \XeTeXversion \xetex_XeTeXversion:D \__kernel_primitive:NN \mdfivesum \pdftex_mdfivesum:D \__kernel_primitive:NN \ifprimitive \pdftex_ifprimitive:D \__kernel_primitive:NN \primitive \pdftex_primitive:D \__kernel_primitive:NN \shellescape \pdftex_shellescape:D \__kernel_primitive:NN \alignmark \luatex_alignmark:D \__kernel_primitive:NN \aligntab \luatex_aligntab:D \__kernel_primitive:NN \attribute \luatex_attribute:D \__kernel_primitive:NN \attributedef \luatex_attributedef:D \__kernel_primitive:NN \automatichyphenpenalty \luatex_automatichyphenpenalty:D \__kernel_primitive:NN \begincsname \luatex_begincsname:D \__kernel_primitive:NN \catcodetable \luatex_catcodetable:D \__kernel_primitive:NN \clearmarks \luatex_clearmarks:D \__kernel_primitive:NN \crampeddisplaystyle \luatex_crampeddisplaystyle:D \__kernel_primitive:NN \crampedscriptscriptstyle \luatex_crampedscriptscriptstyle:D \__kernel_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D \__kernel_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D \__kernel_primitive:NN \directlua \luatex_directlua:D \__kernel_primitive:NN \dviextension \luatex_dviextension:D \__kernel_primitive:NN \dvifeedback \luatex_dvifeedback:D \__kernel_primitive:NN \dvivariable \luatex_dvivariable:D \__kernel_primitive:NN \etoksapp \luatex_etoksapp:D \__kernel_primitive:NN \etokspre \luatex_etokspre:D \__kernel_primitive:NN \explicithyphenpenalty \luatex_explicithyphenpenalty:D \__kernel_primitive:NN \expanded \luatex_expanded:D \__kernel_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D \__kernel_primitive:NN \fontid \luatex_fontid:D \__kernel_primitive:NN \formatname \luatex_formatname:D \__kernel_primitive:NN \hjcode \luatex_hjcode:D \__kernel_primitive:NN \hpack \luatex_hpack:D \__kernel_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D \__kernel_primitive:NN \hyphenationmin \luatex_hyphenationmin:D \__kernel_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D \__kernel_primitive:NN \gleaders \luatex_gleaders:D \__kernel_primitive:NN \initcatcodetable \luatex_initcatcodetable:D \__kernel_primitive:NN \lastnamedcs \luatex_lastnamedcs:D \__kernel_primitive:NN \latelua \luatex_latelua:D \__kernel_primitive:NN \letcharcode \luatex_letcharcode:D \__kernel_primitive:NN \luaescapestring \luatex_luaescapestring:D \__kernel_primitive:NN \luafunction \luatex_luafunction:D \__kernel_primitive:NN \luatexbanner \luatex_luatexbanner:D \__kernel_primitive:NN \luatexdatestamp \luatex_luatexdatestamp:D \__kernel_primitive:NN \luatexrevision \luatex_luatexrevision:D \__kernel_primitive:NN \luatexversion \luatex_luatexversion:D \__kernel_primitive:NN \mathdisplayskipmode \luatex_mathdisplayskipmode:D \__kernel_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D \__kernel_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D \__kernel_primitive:NN \mathoption \luatex_mathoption:D \__kernel_primitive:NN \mathrulesfam \luatex_mathrulesfam:D \__kernel_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D \__kernel_primitive:NN \mathstyle \luatex_mathstyle:D \__kernel_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D \__kernel_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D \__kernel_primitive:NN \nohrule \luatex_nohrule:D \__kernel_primitive:NN \nokerns \luatex_nokerns:D \__kernel_primitive:NN \noligs \luatex_noligs:D \__kernel_primitive:NN \nospaces \luatex_nospaces:D \__kernel_primitive:NN \novrule \luatex_novrule:D \__kernel_primitive:NN \outputbox \luatex_outputbox:D \__kernel_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D \__kernel_primitive:NN \pageleftoffset \luatex_pageleftoffset:D \__kernel_primitive:NN \pagerightoffset \luatex_pagerightoffset:D \__kernel_primitive:NN \pagetopoffset \luatex_pagetopoffset:D \__kernel_primitive:NN \pdfextension \luatex_pdfextension:D \__kernel_primitive:NN \pdffeedback \luatex_pdffeedback:D \__kernel_primitive:NN \pdfvariable \luatex_pdfvariable:D \__kernel_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D \__kernel_primitive:NN \posthyphenchar \luatex_posthyphenchar:D \__kernel_primitive:NN \predisplaygapfactor \luatex_predisplaygapfactor:D \__kernel_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D \__kernel_primitive:NN \prehyphenchar \luatex_prehyphenchar:D \__kernel_primitive:NN \savecatcodetable \luatex_savecatcodetable:D \__kernel_primitive:NN \scantextokens \luatex_scantextokens:D \__kernel_primitive:NN \setfontid \luatex_setfontid:D \__kernel_primitive:NN \shapemode \luatex_shapemode:D \__kernel_primitive:NN \suppressifcsnameerror \luatex_suppressifcsnameerror:D \__kernel_primitive:NN \suppresslongerror \luatex_suppresslongerror:D \__kernel_primitive:NN \suppressmathparerror \luatex_suppressmathparerror:D \__kernel_primitive:NN \suppressoutererror \luatex_suppressoutererror:D \__kernel_primitive:NN \toksapp \luatex_toksapp:D \__kernel_primitive:NN \tokspre \luatex_tokspre:D \__kernel_primitive:NN \tpack \luatex_tpack:D \__kernel_primitive:NN \vpack \luatex_vpack:D \__kernel_primitive:NN \bodydir \luatex_bodydir:D \__kernel_primitive:NN \boxdir \luatex_boxdir:D \__kernel_primitive:NN \leftghost \luatex_leftghost:D \__kernel_primitive:NN \linedir \luatex_linedir:D \__kernel_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D \__kernel_primitive:NN \localinterlinepenalty \luatex_localinterlinepenalty:D \__kernel_primitive:NN \localleftbox \luatex_localleftbox:D \__kernel_primitive:NN \localrightbox \luatex_localrightbox:D \__kernel_primitive:NN \mathdir \luatex_mathdir:D \__kernel_primitive:NN \pagedir \luatex_pagedir:D \__kernel_primitive:NN \pardir \luatex_pardir:D \__kernel_primitive:NN \rightghost \luatex_rightghost:D \__kernel_primitive:NN \textdir \luatex_textdir:D \__kernel_primitive:NN \adjustspacing \pdftex_adjustspacing:D \__kernel_primitive:NN \copyfont \pdftex_copyfont:D \__kernel_primitive:NN \draftmode \pdftex_draftmode:D \__kernel_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D \__kernel_primitive:NN \ifabsdim \pdftex_ifabsdim:D \__kernel_primitive:NN \ifabsnum \pdftex_ifabsnum:D \__kernel_primitive:NN \ignoreligaturesinfont \pdftex_ignoreligaturesinfont:D \__kernel_primitive:NN \insertht \pdftex_insertht:D \__kernel_primitive:NN \lastsavedboxresourceindex \pdftex_pdflastxform:D \__kernel_primitive:NN \lastsavedimageresourceindex \pdftex_pdflastximage:D \__kernel_primitive:NN \lastsavedimageresourcepages \pdftex_pdflastximagepages:D \__kernel_primitive:NN \lastxpos \pdftex_lastxpos:D \__kernel_primitive:NN \lastypos \pdftex_lastypos:D \__kernel_primitive:NN \normaldeviate \pdftex_normaldeviate:D \__kernel_primitive:NN \outputmode \pdftex_pdfoutput:D \__kernel_primitive:NN \pageheight \pdftex_pageheight:D \__kernel_primitive:NN \pagewidth \pdftex_pagewith:D \__kernel_primitive:NN \protrudechars \pdftex_protrudechars:D \__kernel_primitive:NN \pxdimen \pdftex_pxdimen:D \__kernel_primitive:NN \randomseed \pdftex_randomseed:D \__kernel_primitive:NN \useboxresource \pdftex_pdfrefxform:D \__kernel_primitive:NN \useimageresource \pdftex_pdfrefximage:D \__kernel_primitive:NN \savepos \pdftex_savepos:D \__kernel_primitive:NN \saveboxresource \pdftex_pdfxform:D \__kernel_primitive:NN \saveimageresource \pdftex_pdfximage:D \__kernel_primitive:NN \setrandomseed \pdftex_setrandomseed:D \__kernel_primitive:NN \tracingfonts \pdftex_tracingfonts:D \__kernel_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D \__kernel_primitive:NN \Uchar \utex_char:D \__kernel_primitive:NN \Ucharcat \utex_charcat:D \__kernel_primitive:NN \Udelcode \utex_delcode:D \__kernel_primitive:NN \Udelcodenum \utex_delcodenum:D \__kernel_primitive:NN \Udelimiter \utex_delimiter:D \__kernel_primitive:NN \Udelimiterover \utex_delimiterover:D \__kernel_primitive:NN \Udelimiterunder \utex_delimiterunder:D \__kernel_primitive:NN \Uhextensible \utex_hextensible:D \__kernel_primitive:NN \Umathaccent \utex_mathaccent:D \__kernel_primitive:NN \Umathaxis \utex_mathaxis:D \__kernel_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D \__kernel_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D \__kernel_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D \__kernel_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D \__kernel_primitive:NN \Umathbinopspacing \utex_binopspacing:D \__kernel_primitive:NN \Umathbinordspacing \utex_binordspacing:D \__kernel_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D \__kernel_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D \__kernel_primitive:NN \Umathchar \utex_mathchar:D \__kernel_primitive:NN \Umathcharclass \utex_mathcharclass:D \__kernel_primitive:NN \Umathchardef \utex_mathchardef:D \__kernel_primitive:NN \Umathcharfam \utex_mathcharfam:D \__kernel_primitive:NN \Umathcharnum \utex_mathcharnum:D \__kernel_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D \__kernel_primitive:NN \Umathcharslot \utex_mathcharslot:D \__kernel_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D \__kernel_primitive:NN \Umathcloseclosespacing \utex_closeclosespacing:D \__kernel_primitive:NN \Umathcloseinnerspacing \utex_closeinnerspacing:D \__kernel_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D \__kernel_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D \__kernel_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D \__kernel_primitive:NN \Umathclosepunctspacing \utex_closepunctspacing:D \__kernel_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D \__kernel_primitive:NN \Umathcode \utex_mathcode:D \__kernel_primitive:NN \Umathcodenum \utex_mathcodenum:D \__kernel_primitive:NN \Umathconnectoroverlapmin \utex_connectoroverlapmin:D \__kernel_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D \__kernel_primitive:NN \Umathfractiondenomdown \utex_fractiondenomdown:D \__kernel_primitive:NN \Umathfractiondenomvgap \utex_fractiondenomvgap:D \__kernel_primitive:NN \Umathfractionnumup \utex_fractionnumup:D \__kernel_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D \__kernel_primitive:NN \Umathfractionrule \utex_fractionrule:D \__kernel_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D \__kernel_primitive:NN \Umathinnerclosespacing \utex_innerclosespacing:D \__kernel_primitive:NN \Umathinnerinnerspacing \utex_innerinnerspacing:D \__kernel_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D \__kernel_primitive:NN \Umathinneropspacing \utex_inneropspacing:D \__kernel_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D \__kernel_primitive:NN \Umathinnerpunctspacing \utex_innerpunctspacing:D \__kernel_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D \__kernel_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D \__kernel_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D \__kernel_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D \__kernel_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D \__kernel_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D \__kernel_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D \__kernel_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D \__kernel_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D \__kernel_primitive:NN \Umathopbinspacing \utex_opbinspacing:D \__kernel_primitive:NN \Umathopclosespacing \utex_opclosespacing:D \__kernel_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D \__kernel_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D \__kernel_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D \__kernel_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D \__kernel_primitive:NN \Umathopenopspacing \utex_openopspacing:D \__kernel_primitive:NN \Umathopenordspacing \utex_openordspacing:D \__kernel_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D \__kernel_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D \__kernel_primitive:NN \Umathoperatorsize \utex_operatorsize:D \__kernel_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D \__kernel_primitive:NN \Umathopopenspacing \utex_opopenspacing:D \__kernel_primitive:NN \Umathopopspacing \utex_opopspacing:D \__kernel_primitive:NN \Umathopordspacing \utex_opordspacing:D \__kernel_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D \__kernel_primitive:NN \Umathoprelspacing \utex_oprelspacing:D \__kernel_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D \__kernel_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D \__kernel_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D \__kernel_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D \__kernel_primitive:NN \Umathordopspacing \utex_ordopspacing:D \__kernel_primitive:NN \Umathordordspacing \utex_ordordspacing:D \__kernel_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D \__kernel_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D \__kernel_primitive:NN \Umathoverbarkern \utex_overbarkern:D \__kernel_primitive:NN \Umathoverbarrule \utex_overbarrule:D \__kernel_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D \__kernel_primitive:NN \Umathoverdelimiterbgap \utex_overdelimiterbgap:D \__kernel_primitive:NN \Umathoverdelimitervgap \utex_overdelimitervgap:D \__kernel_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D \__kernel_primitive:NN \Umathpunctclosespacing \utex_punctclosespacing:D \__kernel_primitive:NN \Umathpunctinnerspacing \utex_punctinnerspacing:D \__kernel_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D \__kernel_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D \__kernel_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D \__kernel_primitive:NN \Umathpunctpunctspacing \utex_punctpunctspacing:D \__kernel_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D \__kernel_primitive:NN \Umathquad \utex_quad:D \__kernel_primitive:NN \Umathradicaldegreeafter \utex_radicaldegreeafter:D \__kernel_primitive:NN \Umathradicaldegreebefore \utex_radicaldegreebefore:D \__kernel_primitive:NN \Umathradicaldegreeraise \utex_radicaldegreeraise:D \__kernel_primitive:NN \Umathradicalkern \utex_radicalkern:D \__kernel_primitive:NN \Umathradicalrule \utex_radicalrule:D \__kernel_primitive:NN \Umathradicalvgap \utex_radicalvgap:D \__kernel_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D \__kernel_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D \__kernel_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D \__kernel_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D \__kernel_primitive:NN \Umathrelopspacing \utex_relopspacing:D \__kernel_primitive:NN \Umathrelordspacing \utex_relordspacing:D \__kernel_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D \__kernel_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D \__kernel_primitive:NN \Umathskewedfractionhgap \utex_skewedfractionhgap:D \__kernel_primitive:NN \Umathskewedfractionvgap \utex_skewedfractionvgap:D \__kernel_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D \__kernel_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D \__kernel_primitive:NN \Umathstacknumup \utex_stacknumup:D \__kernel_primitive:NN \Umathstackvgap \utex_stackvgap:D \__kernel_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D \__kernel_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D \__kernel_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D \__kernel_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D \__kernel_primitive:NN \Umathsubtopmax \utex_subtopmax:D \__kernel_primitive:NN \Umathsupbottommin \utex_supbottommin:D \__kernel_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D \__kernel_primitive:NN \Umathsupshiftup \utex_supshiftup:D \__kernel_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D \__kernel_primitive:NN \Umathunderbarkern \utex_underbarkern:D \__kernel_primitive:NN \Umathunderbarrule \utex_underbarrule:D \__kernel_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D \__kernel_primitive:NN \Umathunderdelimiterbgap \utex_underdelimiterbgap:D \__kernel_primitive:NN \Umathunderdelimitervgap \utex_underdelimitervgap:D \__kernel_primitive:NN \Uoverdelimiter \utex_overdelimiter:D \__kernel_primitive:NN \Uradical \utex_radical:D \__kernel_primitive:NN \Uroot \utex_root:D \__kernel_primitive:NN \Uskewed \utex_skewed:D \__kernel_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D \__kernel_primitive:NN \Ustack \utex_stack:D \__kernel_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D \__kernel_primitive:NN \Ustartmath \utex_startmath:D \__kernel_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D \__kernel_primitive:NN \Ustopmath \utex_stopmath:D \__kernel_primitive:NN \Usubscript \utex_subscript:D \__kernel_primitive:NN \Usuperscript \utex_superscript:D \__kernel_primitive:NN \Uunderdelimiter \utex_underdelimiter:D \__kernel_primitive:NN \Uvextensible \utex_vextensible:D \__kernel_primitive:NN \autospacing \ptex_autospacing:D \__kernel_primitive:NN \autoxspacing \ptex_autoxspacing:D \__kernel_primitive:NN \dtou \ptex_dtou:D \__kernel_primitive:NN \euc \ptex_euc:D \__kernel_primitive:NN \ifdbox \ptex_ifdbox:D \__kernel_primitive:NN \ifddir \ptex_ifddir:D \__kernel_primitive:NN \ifmdir \ptex_ifmdir:D \__kernel_primitive:NN \iftbox \ptex_iftbox:D \__kernel_primitive:NN \iftdir \ptex_iftdir:D \__kernel_primitive:NN \ifybox \ptex_ifybox:D \__kernel_primitive:NN \ifydir \ptex_ifydir:D \__kernel_primitive:NN \inhibitglue \ptex_inhibitglue:D \__kernel_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D \__kernel_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D \__kernel_primitive:NN \jfam \ptex_jfam:D \__kernel_primitive:NN \jfont \ptex_jfont:D \__kernel_primitive:NN \jis \ptex_jis:D \__kernel_primitive:NN \kanjiskip \ptex_kanjiskip:D \__kernel_primitive:NN \kansuji \ptex_kansuji:D \__kernel_primitive:NN \kansujichar \ptex_kansujichar:D \__kernel_primitive:NN \kcatcode \ptex_kcatcode:D \__kernel_primitive:NN \kuten \ptex_kuten:D \__kernel_primitive:NN \noautospacing \ptex_noautospacing:D \__kernel_primitive:NN \noautoxspacing \ptex_noautoxspacing:D \__kernel_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D \__kernel_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D \__kernel_primitive:NN \showmode \ptex_showmode:D \__kernel_primitive:NN \sjis \ptex_sjis:D \__kernel_primitive:NN \tate \ptex_tate:D \__kernel_primitive:NN \tbaselineshift \ptex_tbaselineshift:D \__kernel_primitive:NN \tfont \ptex_tfont:D \__kernel_primitive:NN \xkanjiskip \ptex_xkanjiskip:D \__kernel_primitive:NN \xspcode \ptex_xspcode:D \__kernel_primitive:NN \ybaselineshift \ptex_ybaselineshift:D \__kernel_primitive:NN \yoko \ptex_yoko:D \__kernel_primitive:NN \disablecjktoken \uptex_disablecjktoken:D \__kernel_primitive:NN \enablecjktoken \uptex_enablecjktoken:D \__kernel_primitive:NN \forcecjktoken \uptex_forcecjktoken:D \__kernel_primitive:NN \kchar \uptex_kchar:D \__kernel_primitive:NN \kchardef \uptex_kchardef:D \__kernel_primitive:NN \kuten \uptex_kuten:D \__kernel_primitive:NN \ucs \uptex_ucs:D \tex_endgroup:D \etex_ifdefined:D \@@end \tex_let:D \tex_end:D \@@end \tex_let:D \tex_everydisplay:D \frozen@everydisplay \tex_let:D \tex_everymath:D \frozen@everymath \tex_let:D \tex_hyphen:D \@@hyph \tex_let:D \tex_input:D \@@input \tex_let:D \tex_italiccorrection:D \@@italiccorr \tex_let:D \tex_underline:D \@@underline \etex_ifdefined:D \@@shipout \tex_let:D \tex_shipout:D \@@shipout \tex_fi:D \tex_begingroup:D \tex_edef:D \l_tmpa_tl { \tex_string:D \shipout } \tex_edef:D \l_tmpb_tl { \tex_meaning:D \shipout } \tex_ifx:D \l_tmpa_tl \l_tmpb_tl \tex_else:D \tex_expandafter:D \@tfor \tex_expandafter:D \@tempa \tex_string:D := \CROP@shipout \dup@shipout \GPTorg@shipout \LL@shipout \mem@oldshipout \opem@shipout \pgfpages@originalshipout \pr@shipout \Shipout \verso@orig@shipout \do { \tex_edef:D \l_tmpb_tl { \tex_expandafter:D \tex_meaning:D \@tempa } \tex_ifx:D \l_tmpa_tl \l_tmpb_tl \tex_global:D \tex_expandafter:D \tex_let:D \tex_expandafter:D \tex_shipout:D \@tempa \tex_fi:D } \tex_fi:D \tex_endgroup:D \tex_let:D \pdftex_tracingfonts:D \tex_undefined:D \etex_ifdefined:D \pdftracingfonts \tex_let:D \pdftex_tracingfonts:D \pdftracingfonts \tex_else:D \etex_ifdefined:D \luatex_directlua:D \luatex_directlua:D { tex.enableprimitives("@@", {"tracingfonts"}) } \tex_let:D \pdftex_tracingfonts:D \luatextracingfonts \tex_fi:D \tex_fi:D \tex_fi:D \etex_ifdefined:D \luatexsuppressfontnotfounderror \tex_let:D \luatex_alignmark:D \luatexalignmark \tex_let:D \luatex_aligntab:D \luatexaligntab \tex_let:D \luatex_attribute:D \luatexattribute \tex_let:D \luatex_attributedef:D \luatexattributedef \tex_let:D \luatex_catcodetable:D \luatexcatcodetable \tex_let:D \luatex_clearmarks:D \luatexclearmarks \tex_let:D \luatex_crampeddisplaystyle:D \luatexcrampeddisplaystyle \tex_let:D \luatex_crampedscriptscriptstyle:D \luatexcrampedscriptscriptstyle \tex_let:D \luatex_crampedscriptstyle:D \luatexcrampedscriptstyle \tex_let:D \luatex_crampedtextstyle:D \luatexcrampedtextstyle \tex_let:D \luatex_fontid:D \luatexfontid \tex_let:D \luatex_formatname:D \luatexformatname \tex_let:D \luatex_gleaders:D \luatexgleaders \tex_let:D \luatex_initcatcodetable:D \luatexinitcatcodetable \tex_let:D \luatex_latelua:D \luatexlatelua \tex_let:D \luatex_luaescapestring:D \luatexluaescapestring \tex_let:D \luatex_luafunction:D \luatexluafunction \tex_let:D \luatex_mathstyle:D \luatexmathstyle \tex_let:D \luatex_nokerns:D \luatexnokerns \tex_let:D \luatex_noligs:D \luatexnoligs \tex_let:D \luatex_outputbox:D \luatexoutputbox \tex_let:D \luatex_pageleftoffset:D \luatexpageleftoffset \tex_let:D \luatex_pagetopoffset:D \luatexpagetopoffset \tex_let:D \luatex_postexhyphenchar:D \luatexpostexhyphenchar \tex_let:D \luatex_posthyphenchar:D \luatexposthyphenchar \tex_let:D \luatex_preexhyphenchar:D \luatexpreexhyphenchar \tex_let:D \luatex_prehyphenchar:D \luatexprehyphenchar \tex_let:D \luatex_savecatcodetable:D \luatexsavecatcodetable \tex_let:D \luatex_scantextokens:D \luatexscantextokens \tex_let:D \luatex_suppressifcsnameerror:D \luatexsuppressifcsnameerror \tex_let:D \luatex_suppresslongerror:D \luatexsuppresslongerror \tex_let:D \luatex_suppressmathparerror:D \luatexsuppressmathparerror \tex_let:D \luatex_suppressoutererror:D \luatexsuppressoutererror \tex_let:D \utex_char:D \luatexUchar \tex_let:D \xetex_suppressfontnotfounderror:D \luatexsuppressfontnotfounderror \tex_let:D \luatex_bodydir:D \luatexbodydir \tex_let:D \luatex_boxdir:D \luatexboxdir \tex_let:D \luatex_leftghost:D \luatexleftghost \tex_let:D \luatex_localbrokenpenalty:D \luatexlocalbrokenpenalty \tex_let:D \luatex_localinterlinepenalty:D \luatexlocalinterlinepenalty \tex_let:D \luatex_localleftbox:D \luatexlocalleftbox \tex_let:D \luatex_localrightbox:D \luatexlocalrightbox \tex_let:D \luatex_mathdir:D \luatexmathdir \tex_let:D \luatex_pagebottomoffset:D \luatexpagebottomoffset \tex_let:D \luatex_pagedir:D \luatexpagedir \tex_let:D \pdftex_pageheight:D \luatexpageheight \tex_let:D \luatex_pagerightoffset:D \luatexpagerightoffset \tex_let:D \pdftex_pagewidth:D \luatexpagewidth \tex_let:D \luatex_pardir:D \luatexpardir \tex_let:D \luatex_rightghost:D \luatexrightghost \tex_let:D \luatex_textdir:D \luatextextdir \tex_fi:D \tex_ifnum:D 0 \etex_ifdefined:D \pdftex_pdftexversion:D 1 \tex_fi:D \etex_ifdefined:D \luatex_luatexversion:D 1 \tex_fi:D = 0 % \tex_let:D \pdftex_mapfile:D \tex_undefined:D \tex_let:D \pdftex_mapline:D \tex_undefined:D \tex_fi:D \etex_ifdefined:D \XeTeXdelcode \tex_let:D \utex_delcode:D \XeTeXdelcode \tex_let:D \utex_delcodenum:D \XeTeXdelcodenum \tex_let:D \utex_delimiter:D \XeTeXdelimiter \tex_let:D \utex_mathaccent:D \XeTeXmathaccent \tex_let:D \utex_mathchar:D \XeTeXmathchar \tex_let:D \utex_mathchardef:D \XeTeXmathchardef \tex_let:D \utex_mathcharnum:D \XeTeXmathcharnum \tex_let:D \utex_mathcharnumdef:D \XeTeXmathcharnumdef \tex_let:D \utex_mathcode:D \XeTeXmathcode \tex_let:D \utex_mathcodenum:D \XeTeXmathcodenum \tex_fi:D \etex_ifdefined:D \luatex_luatexversion:D \tex_let:D \pdftex_pdftexbanner:D \tex_undefined:D \tex_let:D \pdftex_pdftexrevision:D \tex_undefined:D \tex_let:D \pdftex_pdftexversion:D \tex_undefined:D \tex_fi:D \etex_ifdefined:D \normalend \tex_let:D \tex_end:D \normalend \tex_let:D \tex_everyjob:D \normaleveryjob \tex_let:D \tex_input:D \normalinput \tex_let:D \tex_language:D \normallanguage \tex_let:D \tex_mathop:D \normalmathop \tex_let:D \tex_month:D \normalmonth \tex_let:D \tex_outer:D \normalouter \tex_let:D \tex_over:D \normalover \tex_let:D \tex_vcenter:D \normalvcenter \tex_let:D \etex_unexpanded:D \normalunexpanded \tex_let:D \luatex_expanded:D \normalexpanded \tex_fi:D \etex_ifdefined:D \normalitaliccorrection \tex_let:D \tex_hoffset:D \normalhoffset \tex_let:D \tex_italiccorrection:D \normalitaliccorrection \tex_let:D \tex_voffset:D \normalvoffset \tex_let:D \etex_showtokens:D \normalshowtokens \tex_let:D \luatex_bodydir:D \spac_directions_normal_body_dir \tex_let:D \luatex_pagedir:D \spac_directions_normal_page_dir \tex_fi:D \etex_ifdefined:D \normalleft \tex_let:D \tex_left:D \normalleft \tex_let:D \tex_middle:D \normalmiddle \tex_let:D \tex_right:D \normalright \tex_fi:D %% File: l3basics.dtx Copyright (C) 1990-2017 The LaTeX3 project \tex_let:D \if_true: \tex_iftrue:D \tex_let:D \if_false: \tex_iffalse:D \tex_let:D \or: \tex_or:D \tex_let:D \else: \tex_else:D \tex_let:D \fi: \tex_fi:D \tex_let:D \reverse_if:N \etex_unless:D \tex_let:D \if:w \tex_if:D \tex_let:D \if_charcode:w \tex_if:D \tex_let:D \if_catcode:w \tex_ifcat:D \tex_let:D \if_meaning:w \tex_ifx:D \tex_let:D \if_mode_math: \tex_ifmmode:D \tex_let:D \if_mode_horizontal: \tex_ifhmode:D \tex_let:D \if_mode_vertical: \tex_ifvmode:D \tex_let:D \if_mode_inner: \tex_ifinner:D \tex_let:D \if_cs_exist:N \etex_ifdefined:D \tex_let:D \if_cs_exist:w \etex_ifcsname:D \tex_let:D \cs:w \tex_csname:D \tex_let:D \cs_end: \tex_endcsname:D \tex_let:D \exp_after:wN \tex_expandafter:D \tex_let:D \exp_not:N \tex_noexpand:D \tex_let:D \exp_not:n \etex_unexpanded:D \tex_let:D \exp:w \tex_romannumeral:D \tex_chardef:D \exp_end: = 0 ~ \tex_let:D \token_to_meaning:N \tex_meaning:D \tex_let:D \cs_meaning:N \tex_meaning:D \tex_let:D \tl_to_str:n \etex_detokenize:D \tex_let:D \token_to_str:N \tex_string:D \tex_let:D \scan_stop: \tex_relax:D \tex_let:D \group_begin: \tex_begingroup:D \tex_let:D \group_end: \tex_endgroup:D \tex_let:D \if_int_compare:w \tex_ifnum:D \tex_let:D \__int_to_roman:w \tex_romannumeral:D \tex_let:D \group_insert_after:N \tex_aftergroup:D \tex_long:D \tex_def:D \exp_args:Nc #1#2 { \exp_after:wN #1 \cs:w #2 \cs_end: } \tex_long:D \tex_def:D \exp_args:cc #1#2 { \cs:w #1 \exp_after:wN \cs_end: \cs:w #2 \cs_end: } \tex_def:D \token_to_str:c { \exp_args:Nc \token_to_str:N } \tex_long:D \tex_def:D \cs_meaning:c #1 { \if_cs_exist:w #1 \cs_end: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \exp_args:Nc \cs_meaning:N {#1} } { \tl_to_str:n {undefined} } } \tex_let:D \token_to_meaning:c = \cs_meaning:c \tex_chardef:D \c_zero = 0 ~ \etex_ifdefined:D \luatex_luatexversion:D \tex_chardef:D \c_max_register_int = 65 535 ~ \tex_else:D \tex_mathchardef:D \c_max_register_int = 32 767 ~ \tex_fi:D \tex_let:D \cs_set_nopar:Npn \tex_def:D \tex_let:D \cs_set_nopar:Npx \tex_edef:D \etex_protected:D \tex_long:D \tex_def:D \cs_set:Npn { \tex_long:D \tex_def:D } \etex_protected:D \tex_long:D \tex_def:D \cs_set:Npx { \tex_long:D \tex_edef:D } \etex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npn { \etex_protected:D \tex_def:D } \etex_protected:D \tex_long:D \tex_def:D \cs_set_protected_nopar:Npx { \etex_protected:D \tex_edef:D } \etex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npn { \etex_protected:D \tex_long:D \tex_def:D } \etex_protected:D \tex_long:D \tex_def:D \cs_set_protected:Npx { \etex_protected:D \tex_long:D \tex_edef:D } \tex_let:D \cs_gset_nopar:Npn \tex_gdef:D \tex_let:D \cs_gset_nopar:Npx \tex_xdef:D \cs_set_protected:Npn \cs_gset:Npn { \tex_long:D \tex_gdef:D } \cs_set_protected:Npn \cs_gset:Npx { \tex_long:D \tex_xdef:D } \cs_set_protected:Npn \cs_gset_protected_nopar:Npn { \etex_protected:D \tex_gdef:D } \cs_set_protected:Npn \cs_gset_protected_nopar:Npx { \etex_protected:D \tex_xdef:D } \cs_set_protected:Npn \cs_gset_protected:Npn { \etex_protected:D \tex_long:D \tex_gdef:D } \cs_set_protected:Npn \cs_gset_protected:Npx { \etex_protected:D \tex_long:D \tex_xdef:D } \cs_set_nopar:Npn \l__exp_internal_tl { } \cs_set:Npn \use:c #1 { \cs:w #1 \cs_end: } \cs_set_protected:Npn \use:x #1 { \cs_set_nopar:Npx \l__exp_internal_tl {#1} \l__exp_internal_tl } \cs_set:Npn \use:n #1 {#1} \cs_set:Npn \use:nn #1#2 {#1#2} \cs_set:Npn \use:nnn #1#2#3 {#1#2#3} \cs_set:Npn \use:nnnn #1#2#3#4 {#1#2#3#4} \cs_set:Npn \use_i:nn #1#2 {#1} \cs_set:Npn \use_ii:nn #1#2 {#2} \cs_set:Npn \use_i:nnn #1#2#3 {#1} \cs_set:Npn \use_ii:nnn #1#2#3 {#2} \cs_set:Npn \use_iii:nnn #1#2#3 {#3} \cs_set:Npn \use_i_ii:nnn #1#2#3 {#1#2} \cs_set:Npn \use_i:nnnn #1#2#3#4 {#1} \cs_set:Npn \use_ii:nnnn #1#2#3#4 {#2} \cs_set:Npn \use_iii:nnnn #1#2#3#4 {#3} \cs_set:Npn \use_iv:nnnn #1#2#3#4 {#4} \cs_set:Npn \use_none_delimit_by_q_nil:w #1 \q_nil { } \cs_set:Npn \use_none_delimit_by_q_stop:w #1 \q_stop { } \cs_set:Npn \use_none_delimit_by_q_recursion_stop:w #1 \q_recursion_stop { } \cs_set:Npn \use_i_delimit_by_q_nil:nw #1#2 \q_nil {#1} \cs_set:Npn \use_i_delimit_by_q_stop:nw #1#2 \q_stop {#1} \cs_set:Npn \use_i_delimit_by_q_recursion_stop:nw #1#2 \q_recursion_stop {#1} \cs_set:Npn \use_none:n #1 { } \cs_set:Npn \use_none:nn #1#2 { } \cs_set:Npn \use_none:nnn #1#2#3 { } \cs_set:Npn \use_none:nnnn #1#2#3#4 { } \cs_set:Npn \use_none:nnnnn #1#2#3#4#5 { } \cs_set:Npn \use_none:nnnnnn #1#2#3#4#5#6 { } \cs_set:Npn \use_none:nnnnnnn #1#2#3#4#5#6#7 { } \cs_set:Npn \use_none:nnnnnnnn #1#2#3#4#5#6#7#8 { } \cs_set:Npn \use_none:nnnnnnnnn #1#2#3#4#5#6#7#8#9 { } \cs_set_protected:Npn \__debug:TF #1#2 {#2} \tex_ifodd:D \l@expl@enable@debug@bool \cs_set_protected:Npn \__debug:TF #1#2 {#1} \fi: \__debug:TF { \cs_set_protected:Npn \debug_on:n #1 { \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} } { \cs_if_exist_use:cF { __debug_##1_on: } { \__msg_kernel_error:nnn { kernel } { debug } {##1} } } } \cs_set_protected:Npn \debug_off:n #1 { \exp_args:No \clist_map_inline:nn { \tl_to_str:n {#1} } { \cs_if_exist_use:cF { __debug_##1_off: } { \__msg_kernel_error:nnn { kernel } { debug } {##1} } } } } { \cs_set_protected:Npn \debug_on:n #1 { \__msg_kernel_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_on:n {#1} } } } \cs_set_protected:Npn \debug_off:n #1 { \__msg_kernel_error:nnx { kernel } { enable-debug } { \tl_to_str:n { \debug_off:n {#1} } } } } \__debug:TF { \cs_set_nopar:Npn \l__debug_suspended_tl { } \cs_set_protected:Npn \debug_suspend: { \tl_put_right:Nn \l__debug_suspended_tl { . } \cs_set_eq:NN \__debug_suspended:T \use:n } \cs_set_protected:Npn \debug_resume: { \tl_set:Nx \l__debug_suspended_tl { \tl_tail:N \l__debug_suspended_tl } \tl_if_empty:NT \l__debug_suspended_tl { \cs_set_eq:NN \__debug_suspended:T \use_none:n } } \cs_set:Npn \__debug_suspended:T #1 { } } { \cs_set_protected:Npn \debug_suspend: { } \cs_set_protected:Npn \debug_resume: { } } \__debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_on: } { \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { \__msg_kernel_error:nnx { kernel } { non-declared-variable } { \token_to_str:N ##1 } } } \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { \__debug_suspended:T \use_none:nnn \cs_if_exist:NF ##1 { \__msg_kernel_error:nnx { kernel } { command-not-defined } { \token_to_str:N ##1 } } } \cs_set_protected:Npn \__debug_chk_var_scope:NN { \__debug_suspended:T \use_none:nnn \__debug_chk_var_scope_aux:NN } \cs_set_protected:Npn \__debug_chk_var_local:N ##1 { \__debug_suspended:T \use_none:nnnnn \__debug_chk_var_exist:N ##1 \__debug_chk_var_scope_aux:NN l ##1 } \cs_set_protected:Npn \__debug_chk_var_global:N ##1 { \__debug_suspended:T \use_none:nnnnn \__debug_chk_var_exist:N ##1 \__debug_chk_var_scope_aux:NN g ##1 } } \exp_args:Nc \cs_set_protected:Npn { __debug_check-declarations_off: } { \cs_set_protected:Npn \__debug_chk_var_exist:N ##1 { } \cs_set_protected:Npn \__debug_chk_cs_exist:N ##1 { } \cs_set_protected:Npn \__debug_chk_var_local:N ##1 { } \cs_set_protected:Npn \__debug_chk_var_global:N ##1 { } \cs_set_protected:Npn \__debug_chk_var_scope:NN ##1##2 { } } \cs_set_protected:Npn \__debug_chk_cs_exist:c { \exp_args:Nc \__debug_chk_cs_exist:N } \tex_ifodd:D \l@expl@check@declarations@bool \use:c { __debug_check-declarations_on: } \else: \use:c { __debug_check-declarations_off: } \fi: } { } \__debug:TF { \cs_set_protected:Npn \__debug_chk_var_scope_aux:NN #1#2 { \exp_args:NNf \__debug_chk_var_scope_aux:Nn #1 { \cs_to_str:N #2 } } \cs_set_protected:Npn \__debug_chk_var_scope_aux:Nn #1#2 { \if:w _ \use_i:nn \use_i_delimit_by_q_stop:nw #2 ? ? \q_stop \exp_after:wN \__debug_chk_var_scope_aux:NNn \use_i_delimit_by_q_stop:nw #2 ? \q_stop #1 {#2} \else: \exp_args:Nc \__debug_chk_var_scope_aux:NNn { __debug_chk_/ #2 } #1 {#2} \fi: } \cs_set_protected:Npn \__debug_chk_var_scope_aux:NNn #1#2#3 { \if:w #1 #2 \else: \if:w #1 \scan_stop: \cs_gset_nopar:Npn #1 {#2} \else: \__msg_kernel_error:nnxxx { kernel } { local-global } {#1} {#2} { \iow_char:N \\ #3 } \fi: \fi: } } { } \__debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_on: } { \cs_set:Npn \__debug_chk_expr:nNnN ##1##2 { \__debug_suspended:T { ##1 \use_none:nnnnnnn } \exp_after:wN \__debug_chk_expr_aux:nNnN \exp_after:wN { \tex_the:D ##2 ##1 \tex_relax:D } ##2 } } \exp_args:Nc \cs_set_protected:Npn { __debug_check-expressions_off: } { \cs_set:Npn \__debug_chk_expr:nNnN ##1##2##3##4 {##1} } \use:c { __debug_check-expressions_off: } \cs_set:Npn \__debug_chk_expr_aux:nNnN #1#2#3#4 { \tl_if_empty:oF { \tex_romannumeral:D - 0 \exp_after:wN \use_none:n \__int_value:w #3 #2 #1 \tex_relax:D } { \__msg_kernel_expandable_error:nnnn { kernel } { expr } {#4} {#1} } #1 } } { } \__debug:TF { \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_on: } { \cs_set_protected:Npn \__debug_log:x { \__debug_suspended:T \use_none:nn \iow_log:x } } \exp_args:Nc \cs_set_protected:Npn { __debug_log-functions_off: } { \cs_set_protected:Npn \__debug_log:x { \use_none:n } } \tex_ifodd:D \l@expl@log@functions@bool \use:c { __debug_log-functions_on: } \else: \use:c { __debug_log-functions_off: } \fi: } { } \__debug:TF { \cs_set_protected:Npn \__debug_deprecation_on: { \g__debug_deprecation_on_tl } \cs_set_protected:Npn \__debug_deprecation_off: { \g__debug_deprecation_off_tl } \cs_set_nopar:Npn \g__debug_deprecation_on_tl { } \cs_set_nopar:Npn \g__debug_deprecation_off_tl { } } { } \__debug:TF { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2#3#4#5# { \if_meaning:w \cs_new_protected:Npn #3 \else: \__msg_kernel_error:nnx { kernel } { debug-unpatchable } { \token_to_str:N #3 ~(for~deprecation) } \fi: \__debug_deprecation_aux:nnNnn {#1} {#2} #4 {#5} } \cs_set_protected:Npn \__debug_deprecation_aux:nnNnn #1#2#3#4#5 { \tl_gput_right:Nn \g__debug_deprecation_on_tl { \tex_let:D #3 \scan_stop: \__deprecation_error:Nnn #3 {#2} {#1} } \tl_gput_right:Nn \g__debug_deprecation_off_tl { \tex_let:D #3 \scan_stop: \cs_set_protected:Npn #3 #4 {#5} } \cs_new_protected:Npx #3 { \exp_not:N \__msg_kernel_warning:nnxxx { kernel } { deprecated-command } {#1} { \token_to_str:N #3 } { \tl_to_str:n {#2} } \exp_not:n { \cs_gset_protected:Npn #3 #4 {#5} } \exp_not:N #3 } } } { \cs_set_protected:Npn \__debug_deprecation:nnNNpn #1#2 { } } \__debug:TF { \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2#3#4#5# { \__debug_patch_aux:nnnn {#1} {#2} { #3 #4 #5 } } \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1#2#3#4# { \__debug_patch_auxii:nnnn {#1} { #2 #3 #4 } } \cs_set_protected:Npn \__debug_patch_aux:nnnn #1#2#3#4 { #3 { #1 #4 #2 } } \cs_set_protected:Npn \__debug_patch_auxii:nnnn #1#2#3#4 { #2 {#3} { #1 #4 } } } { \cs_set_protected:Npn \__debug_patch:nnNNpn #1#2 { } \cs_set_protected:Npn \__debug_patch_conditional:nNNpnn #1 { } } \cs_set_protected:Npn \__debug_patch_args:nNNpn { \__debug_patch_args:nnnNNpn { } { } } \cs_set_protected:Npn \__debug_patch_conditional_args:nNNpnn { \__debug_patch_conditional_args:nnnNNpnn { } { } } \__debug:TF { \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3#4#5#6# { \__debug_patch_args_aux:nnnNNnn {#1} {#2} {#3} #4 #5 {#6} } \cs_set_protected:Npn \__debug_patch_conditional_args:nnnNNpnn #1#2#3#4#5#6# { \__debug_patch_args_aux:nnnNNnnn {#1} {#2} {#3} #4 #5 {#6} } \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnn #1#2#3#4#5#6#7 { \cs_set:Npn \__debug_tmp:w #6 {#7} \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN { \__debug_tmp:w #3 } { #4 #5 #6 } {#1} {#2} } \cs_set_protected:Npn \__debug_patch_args_aux:nnnNNnnn #1#2#3#4#5#6#7#8 { \cs_set:Npn \__debug_tmp:w #6 {#8} \exp_after:wN \__debug_patch_args_aux:nnnn \exp_after:wN { \__debug_tmp:w #3 } { #4 #5 #6 {#7} } {#1} {#2} } \cs_set_protected:Npn \__debug_patch_args_aux:nnnn #1#2#3#4 { #2 { #3 #1 #4 } } } { \cs_set_protected:Npn \__debug_patch_args:nnnNNpn #1#2#3 { } \cs_set_protected:Npn \__debug_patch_conditional_args:nnnNNpnn #1#2#3 { } } \cs_set:Npn \prg_return_true: { \exp_after:wN \use_i:nn \exp:w } \cs_set:Npn \prg_return_false: { \exp_after:wN \use_ii:nn \exp:w} \cs_set_protected:Npn \prg_set_conditional:Npnn { \__prg_generate_conditional_parm:nnNpnn { set } { } } \cs_set_protected:Npn \prg_new_conditional:Npnn { \__prg_generate_conditional_parm:nnNpnn { new } { } } \cs_set_protected:Npn \prg_set_protected_conditional:Npnn { \__prg_generate_conditional_parm:nnNpnn { set } { _protected } } \cs_set_protected:Npn \prg_new_protected_conditional:Npnn { \__prg_generate_conditional_parm:nnNpnn { new } { _protected } } \cs_set_protected:Npn \__prg_generate_conditional_parm:nnNpnn #1#2#3#4# { \__cs_split_function:NN #3 \__prg_generate_conditional:nnNnnnnn {#1} {#2} {#4} } \cs_set_protected:Npn \prg_set_conditional:Nnn { \__prg_generate_conditional_count:nnNnn { set } { } } \cs_set_protected:Npn \prg_new_conditional:Nnn { \__prg_generate_conditional_count:nnNnn { new } { } } \cs_set_protected:Npn \prg_set_protected_conditional:Nnn { \__prg_generate_conditional_count:nnNnn { set } { _protected } } \cs_set_protected:Npn \prg_new_protected_conditional:Nnn { \__prg_generate_conditional_count:nnNnn { new } { _protected } } \cs_set_protected:Npn \__prg_generate_conditional_count:nnNnn #1#2#3 { \__cs_split_function:NN #3 \__prg_generate_conditional_count:nnNnnnn {#1} {#2} } \cs_set_protected:Npn \__prg_generate_conditional_count:nnNnnnn #1#2#3#4#5 { \__cs_parm_from_arg_count:nnF { \__prg_generate_conditional:nnNnnnnn {#1} {#2} #3 {#4} {#5} } { \tl_count:n {#2} } { \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:c { #1 : #2 } } { \tl_count:n {#2} } \use_none:nn } } \cs_set_protected:Npn \__prg_generate_conditional:nnNnnnnn #1#2#3#4#5#6#7#8 { \if_meaning:w \c_false_bool #3 \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none:nn \fi: \use:x { \exp_not:N \__prg_generate_conditional:nnnnnnw \exp_not:n { {#4} {#5} {#1} {#2} {#6} {#8} } \tl_to_str:n {#7} \exp_not:n { , \q_recursion_tail , \q_recursion_stop } } } \cs_set_protected:Npn \__prg_generate_conditional:nnnnnnw #1#2#3#4#5#6#7 , { \if_meaning:w \q_recursion_tail #7 \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \use:c { __prg_generate_ #7 _form:wnnnnnn } \tl_if_empty:nF {#7} { \__msg_kernel_error:nnxx { kernel } { conditional-form-unknown } {#7} { \token_to_str:c { #3 : #4 } } } \use_none:nnnnnnn \q_stop {#1} {#2} {#3} {#4} {#5} {#6} \__prg_generate_conditional:nnnnnnw {#1} {#2} {#3} {#4} {#5} {#6} } \cs_set_protected:Npn \__prg_generate_p_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 { \if_meaning:w \scan_stop: #3 \scan_stop: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \exp_args:cc { cs_ #2 #3 :Npn } { #4 _p: #5 } #6 { #7 \exp_end: \c_true_bool \c_false_bool } } { \__msg_kernel_error:nnx { kernel } { protected-predicate } { \token_to_str:c { #4 _p: #5 } } } } \cs_set_protected:Npn \__prg_generate_T_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 { \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 T } #6 { #7 \exp_end: \use:n \use_none:n } } \cs_set_protected:Npn \__prg_generate_F_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 { \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 F } #6 { #7 \exp_end: { } } } \cs_set_protected:Npn \__prg_generate_TF_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 { \exp_args:cc { cs_ #2 #3 :Npn } { #4 : #5 TF } #6 { #7 \exp_end: } } \cs_set_protected:Npn \prg_set_eq_conditional:NNn { \__prg_set_eq_conditional:NNNn \cs_set_eq:cc } \cs_set_protected:Npn \prg_new_eq_conditional:NNn { \__prg_set_eq_conditional:NNNn \cs_new_eq:cc } \cs_set_protected:Npn \__prg_set_eq_conditional:NNNn #1#2#3#4 { \use:x { \exp_not:N \__prg_set_eq_conditional:nnNnnNNw \__cs_split_function:NN #2 \prg_do_nothing: \__cs_split_function:NN #3 \prg_do_nothing: \exp_not:N #1 \tl_to_str:n {#4} \exp_not:n { , \q_recursion_tail , \q_recursion_stop } } } \cs_set_protected:Npn \__prg_set_eq_conditional:nnNnnNNw #1#2#3#4#5#6 { \if_meaning:w \c_false_bool #3 \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \if_meaning:w \c_false_bool #6 \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:c {#4} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#4} {#5} } \cs_set_protected:Npn \__prg_set_eq_conditional_loop:nnnnNw #1#2#3#4#5#6 , { \if_meaning:w \q_recursion_tail #6 \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \use:c { __prg_set_eq_conditional_ #6 _form:wNnnnn } \tl_if_empty:nF {#6} { \__msg_kernel_error:nnxx { kernel } { conditional-form-unknown } {#6} { \token_to_str:c { #1 : #2 } } } \use_none:nnnnnn \q_stop #5 {#1} {#2} {#3} {#4} \__prg_set_eq_conditional_loop:nnnnNw {#1} {#2} {#3} {#4} #5 } \__debug_patch:nnNNpn { \__debug_chk_cs_exist:c { #5 _p : #6 } } { } \cs_set:Npn \__prg_set_eq_conditional_p_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 _p : #4 } { #5 _p : #6 } } \__debug_patch:nnNNpn { \__debug_chk_cs_exist:c { #5 : #6 TF } } { } \cs_set:Npn \__prg_set_eq_conditional_TF_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 TF } { #5 : #6 TF } } \__debug_patch:nnNNpn { \__debug_chk_cs_exist:c { #5 : #6 T } } { } \cs_set:Npn \__prg_set_eq_conditional_T_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 T } { #5 : #6 T } } \__debug_patch:nnNNpn { \__debug_chk_cs_exist:c { #5 : #6 F } } { } \cs_set:Npn \__prg_set_eq_conditional_F_form:wNnnnn #1 \q_stop #2#3#4#5#6 { #2 { #3 : #4 F } { #5 : #6 F } } \tex_chardef:D \c_true_bool = 1 ~ \tex_chardef:D \c_false_bool = 0 ~ \cs_set:Npn \cs_to_str:N { \tex_romannumeral:D \if:w \token_to_str:N \ \__cs_to_str:w \fi: \exp_after:wN \__cs_to_str:N \token_to_str:N } \cs_set:Npn \__cs_to_str:N #1 { \c_zero } \cs_set:Npn \__cs_to_str:w #1 \__cs_to_str:N { - \__int_value:w \fi: \exp_after:wN \c_zero } \cs_set:Npx \__cs_split_function:NN #1 { \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN \exp_not:N \exp_after:wN \exp_not:N \__cs_split_function_auxi:w \exp_not:N \cs_to_str:N #1 \exp_not:N \q_mark \c_true_bool \token_to_str:N : \exp_not:N \q_mark \c_false_bool \exp_not:N \q_stop } \use:x { \cs_set:Npn \exp_not:N \__cs_split_function_auxi:w ##1 \token_to_str:N : ##2 \exp_not:N \q_mark ##3##4 \exp_not:N \q_stop ##5 } { \__cs_split_function_auxii:w #5 #1 \q_mark \q_stop {#2} #3 } \cs_set:Npn \__cs_split_function_auxii:w #1#2 \q_mark #3 \q_stop { #1 {#2} } \cs_set:Npn \__cs_get_function_name:N #1 { \__cs_split_function:NN #1 \use_i:nnn } \cs_set:Npn \__cs_get_function_signature:N #1 { \__cs_split_function:NN #1 \use_ii:nnn } \prg_set_conditional:Npnn \cs_if_exist:N #1 { p , T , F , TF } { \if_meaning:w #1 \scan_stop: \prg_return_false: \else: \if_cs_exist:N #1 \prg_return_true: \else: \prg_return_false: \fi: \fi: } \prg_set_conditional:Npnn \cs_if_exist:c #1 { p , T , F , TF } { \if_cs_exist:w #1 \cs_end: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: \prg_return_false: \else: \prg_return_true: \fi: } \prg_return_false: } \prg_set_conditional:Npnn \cs_if_free:N #1 { p , T , F , TF } { \if_meaning:w #1 \scan_stop: \prg_return_true: \else: \if_cs_exist:N #1 \prg_return_false: \else: \prg_return_true: \fi: \fi: } \prg_set_conditional:Npnn \cs_if_free:c #1 { p , T , F , TF } { \if_cs_exist:w #1 \cs_end: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \exp_after:wN \if_meaning:w \cs:w #1 \cs_end: \scan_stop: \prg_return_true: \else: \prg_return_false: \fi: } { \prg_return_true: } } \cs_set:Npn \cs_if_exist_use:NTF #1#2 { \cs_if_exist:NTF #1 { #1 #2 } } \cs_set:Npn \cs_if_exist_use:NF #1 { \cs_if_exist:NTF #1 { #1 } } \cs_set:Npn \cs_if_exist_use:NT #1 #2 { \cs_if_exist:NTF #1 { #1 #2 } { } } \cs_set:Npn \cs_if_exist_use:N #1 { \cs_if_exist:NTF #1 { #1 } { } } \cs_set:Npn \cs_if_exist_use:cTF #1#2 { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } } \cs_set:Npn \cs_if_exist_use:cF #1 { \cs_if_exist:cTF {#1} { \use:c {#1} } } \cs_set:Npn \cs_if_exist_use:cT #1#2 { \cs_if_exist:cTF {#1} { \use:c {#1} #2 } { } } \cs_set:Npn \cs_if_exist_use:c #1 { \cs_if_exist:cTF {#1} { \use:c {#1} } { } } \cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4 { \tex_newlinechar:D = `\^^J \tex_relax:D \tex_errmessage:D { !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J Argh,~internal~LaTeX3~error! ^^J ^^J Module ~ #1 , ~ message~name~"#2": ^^J Arguments~'#3'~and~'#4' ^^J ^^J This~is~one~for~The~LaTeX3~Project:~bailing~out } \tex_end:D } \cs_set_protected:Npn \__msg_kernel_error:nnx #1#2#3 { \__msg_kernel_error:nnxx {#1} {#2} {#3} { } } \cs_set_protected:Npn \__msg_kernel_error:nn #1#2 { \__msg_kernel_error:nnxx {#1} {#2} { } { } } \cs_set:Npn \msg_line_context: { on~line~ \tex_the:D \tex_inputlineno:D } \cs_set_protected:Npn \iow_log:x { \tex_immediate:D \tex_write:D -1 } \cs_set_protected:Npn \iow_term:x { \tex_immediate:D \tex_write:D 16 } \__debug_patch:nnNNpn { } { \__debug_log:x { Defining~\token_to_str:N #1~ \msg_line_context: } } \cs_set_protected:Npn \__chk_if_free_cs:N #1 { \cs_if_free:NF #1 { \__msg_kernel_error:nnxx { kernel } { command-already-defined } { \token_to_str:N #1 } { \token_to_meaning:N #1 } } } \cs_set_protected:Npn \__chk_if_free_cs:c { \exp_args:Nc \__chk_if_free_cs:N } \cs_set:Npn \__cs_tmp:w #1#2 { \cs_set_protected:Npn #1 ##1 { \__chk_if_free_cs:N ##1 #2 ##1 } } \__cs_tmp:w \cs_new_nopar:Npn \cs_gset_nopar:Npn \__cs_tmp:w \cs_new_nopar:Npx \cs_gset_nopar:Npx \__cs_tmp:w \cs_new:Npn \cs_gset:Npn \__cs_tmp:w \cs_new:Npx \cs_gset:Npx \__cs_tmp:w \cs_new_protected_nopar:Npn \cs_gset_protected_nopar:Npn \__cs_tmp:w \cs_new_protected_nopar:Npx \cs_gset_protected_nopar:Npx \__cs_tmp:w \cs_new_protected:Npn \cs_gset_protected:Npn \__cs_tmp:w \cs_new_protected:Npx \cs_gset_protected:Npx \cs_set:Npn \__cs_tmp:w #1#2 { \cs_new_protected_nopar:Npn #1 { \exp_args:Nc #2 } } \__cs_tmp:w \cs_set_nopar:cpn \cs_set_nopar:Npn \__cs_tmp:w \cs_set_nopar:cpx \cs_set_nopar:Npx \__cs_tmp:w \cs_gset_nopar:cpn \cs_gset_nopar:Npn \__cs_tmp:w \cs_gset_nopar:cpx \cs_gset_nopar:Npx \__cs_tmp:w \cs_new_nopar:cpn \cs_new_nopar:Npn \__cs_tmp:w \cs_new_nopar:cpx \cs_new_nopar:Npx \__cs_tmp:w \cs_set:cpn \cs_set:Npn \__cs_tmp:w \cs_set:cpx \cs_set:Npx \__cs_tmp:w \cs_gset:cpn \cs_gset:Npn \__cs_tmp:w \cs_gset:cpx \cs_gset:Npx \__cs_tmp:w \cs_new:cpn \cs_new:Npn \__cs_tmp:w \cs_new:cpx \cs_new:Npx \__cs_tmp:w \cs_set_protected_nopar:cpn \cs_set_protected_nopar:Npn \__cs_tmp:w \cs_set_protected_nopar:cpx \cs_set_protected_nopar:Npx \__cs_tmp:w \cs_gset_protected_nopar:cpn \cs_gset_protected_nopar:Npn \__cs_tmp:w \cs_gset_protected_nopar:cpx \cs_gset_protected_nopar:Npx \__cs_tmp:w \cs_new_protected_nopar:cpn \cs_new_protected_nopar:Npn \__cs_tmp:w \cs_new_protected_nopar:cpx \cs_new_protected_nopar:Npx \__cs_tmp:w \cs_set_protected:cpn \cs_set_protected:Npn \__cs_tmp:w \cs_set_protected:cpx \cs_set_protected:Npx \__cs_tmp:w \cs_gset_protected:cpn \cs_gset_protected:Npn \__cs_tmp:w \cs_gset_protected:cpx \cs_gset_protected:Npx \__cs_tmp:w \cs_new_protected:cpn \cs_new_protected:Npn \__cs_tmp:w \cs_new_protected:cpx \cs_new_protected:Npx \cs_new_protected:Npn \cs_set_eq:NN #1 { \tex_let:D #1 =~ } \cs_new_protected:Npn \cs_set_eq:cN { \exp_args:Nc \cs_set_eq:NN } \cs_new_protected:Npn \cs_set_eq:Nc { \exp_args:NNc \cs_set_eq:NN } \cs_new_protected:Npn \cs_set_eq:cc { \exp_args:Ncc \cs_set_eq:NN } \cs_new_protected:Npn \cs_gset_eq:NN { \tex_global:D \cs_set_eq:NN } \cs_new_protected:Npn \cs_gset_eq:Nc { \exp_args:NNc \cs_gset_eq:NN } \cs_new_protected:Npn \cs_gset_eq:cN { \exp_args:Nc \cs_gset_eq:NN } \cs_new_protected:Npn \cs_gset_eq:cc { \exp_args:Ncc \cs_gset_eq:NN } \cs_new_protected:Npn \cs_new_eq:NN #1 { \__chk_if_free_cs:N #1 \tex_global:D \cs_set_eq:NN #1 } \cs_new_protected:Npn \cs_new_eq:cN { \exp_args:Nc \cs_new_eq:NN } \cs_new_protected:Npn \cs_new_eq:Nc { \exp_args:NNc \cs_new_eq:NN } \cs_new_protected:Npn \cs_new_eq:cc { \exp_args:Ncc \cs_new_eq:NN } \cs_new_protected:Npn \cs_undefine:N #1 { \cs_gset_eq:NN #1 \tex_undefined:D } \cs_new_protected:Npn \cs_undefine:c #1 { \if_cs_exist:w #1 \cs_end: \exp_after:wN \use:n \else: \exp_after:wN \use_none:n \fi: { \cs_gset_eq:cN {#1} \tex_undefined:D } } \cs_set_protected:Npn \__cs_parm_from_arg_count:nnF #1#2 { \exp_args:Nx \__cs_parm_from_arg_count_test:nnF { \exp_after:wN \exp_not:n \if_case:w \__int_eval:n {#2} { } \or: { ##1 } \or: { ##1##2 } \or: { ##1##2##3 } \or: { ##1##2##3##4 } \or: { ##1##2##3##4##5 } \or: { ##1##2##3##4##5##6 } \or: { ##1##2##3##4##5##6##7 } \or: { ##1##2##3##4##5##6##7##8 } \or: { ##1##2##3##4##5##6##7##8##9 } \else: { \c_false_bool } \fi: } {#1} } \cs_set_protected:Npn \__cs_parm_from_arg_count_test:nnF #1#2 { \if_meaning:w \c_false_bool #1 \exp_after:wN \use_ii:nn \else: \exp_after:wN \use_i:nn \fi: { #2 {#1} } } \cs_new:Npn \__cs_count_signature:N #1 { \int_eval:n { \__cs_split_function:NN #1 \__cs_count_signature:nnN } } \cs_new:Npn \__cs_count_signature:nnN #1#2#3 { \if_meaning:w \c_true_bool #3 \tl_count:n {#2} \else: -1 \fi: } \cs_new:Npn \__cs_count_signature:c { \exp_args:Nc \__cs_count_signature:N } \cs_new_protected:Npn \cs_generate_from_arg_count:NNnn #1#2#3#4 { \__cs_parm_from_arg_count:nnF { \use:nnn #2 #1 } {#3} { \__msg_kernel_error:nnxx { kernel } { bad-number-of-arguments } { \token_to_str:N #1 } { \int_eval:n {#3} } \use_none:n } {#4} } \cs_new_protected:Npn \cs_generate_from_arg_count:cNnn { \exp_args:Nc \cs_generate_from_arg_count:NNnn } \cs_new_protected:Npn \cs_generate_from_arg_count:Ncnn { \exp_args:NNc \cs_generate_from_arg_count:NNnn } \cs_set:Npn \__cs_tmp:w #1#2#3 { \cs_new_protected:cpx { cs_ #1 : #2 } { \exp_not:N \__cs_generate_from_signature:NNn \exp_after:wN \exp_not:N \cs:w cs_ #1 : #3 \cs_end: } } \cs_new_protected:Npn \__cs_generate_from_signature:NNn #1#2 { \__cs_split_function:NN #2 \__cs_generate_from_signature:nnNNNn #1 #2 } \cs_new_protected:Npn \__cs_generate_from_signature:nnNNNn #1#2#3#4#5#6 { \bool_if:NTF #3 { \str_if_eq_x:nnF { } { \tl_map_function:nN {#2} \__cs_generate_from_signature:n } { \__msg_kernel_error:nnx { kernel } { non-base-function } { \token_to_str:N #5 } } \cs_generate_from_arg_count:NNnn #5 #4 { \tl_count:n {#2} } {#6} } { \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:N #5 } } } \cs_new:Npn \__cs_generate_from_signature:n #1 { \if:w n #1 \else: \if:w N #1 \else: \if:w T #1 \else: \if:w F #1 \else: #1 \fi: \fi: \fi: \fi: } \__cs_tmp:w { set } { Nn } { Npn } \__cs_tmp:w { set } { Nx } { Npx } \__cs_tmp:w { set_nopar } { Nn } { Npn } \__cs_tmp:w { set_nopar } { Nx } { Npx } \__cs_tmp:w { set_protected } { Nn } { Npn } \__cs_tmp:w { set_protected } { Nx } { Npx } \__cs_tmp:w { set_protected_nopar } { Nn } { Npn } \__cs_tmp:w { set_protected_nopar } { Nx } { Npx } \__cs_tmp:w { gset } { Nn } { Npn } \__cs_tmp:w { gset } { Nx } { Npx } \__cs_tmp:w { gset_nopar } { Nn } { Npn } \__cs_tmp:w { gset_nopar } { Nx } { Npx } \__cs_tmp:w { gset_protected } { Nn } { Npn } \__cs_tmp:w { gset_protected } { Nx } { Npx } \__cs_tmp:w { gset_protected_nopar } { Nn } { Npn } \__cs_tmp:w { gset_protected_nopar } { Nx } { Npx } \__cs_tmp:w { new } { Nn } { Npn } \__cs_tmp:w { new } { Nx } { Npx } \__cs_tmp:w { new_nopar } { Nn } { Npn } \__cs_tmp:w { new_nopar } { Nx } { Npx } \__cs_tmp:w { new_protected } { Nn } { Npn } \__cs_tmp:w { new_protected } { Nx } { Npx } \__cs_tmp:w { new_protected_nopar } { Nn } { Npn } \__cs_tmp:w { new_protected_nopar } { Nx } { Npx } \cs_set:Npn \__cs_tmp:w #1#2 { \cs_new_protected:cpx { cs_ #1 : c #2 } { \exp_not:N \exp_args:Nc \exp_after:wN \exp_not:N \cs:w cs_ #1 : N #2 \cs_end: } } \__cs_tmp:w { set } { n } \__cs_tmp:w { set } { x } \__cs_tmp:w { set_nopar } { n } \__cs_tmp:w { set_nopar } { x } \__cs_tmp:w { set_protected } { n } \__cs_tmp:w { set_protected } { x } \__cs_tmp:w { set_protected_nopar } { n } \__cs_tmp:w { set_protected_nopar } { x } \__cs_tmp:w { gset } { n } \__cs_tmp:w { gset } { x } \__cs_tmp:w { gset_nopar } { n } \__cs_tmp:w { gset_nopar } { x } \__cs_tmp:w { gset_protected } { n } \__cs_tmp:w { gset_protected } { x } \__cs_tmp:w { gset_protected_nopar } { n } \__cs_tmp:w { gset_protected_nopar } { x } \__cs_tmp:w { new } { n } \__cs_tmp:w { new } { x } \__cs_tmp:w { new_nopar } { n } \__cs_tmp:w { new_nopar } { x } \__cs_tmp:w { new_protected } { n } \__cs_tmp:w { new_protected } { x } \__cs_tmp:w { new_protected_nopar } { n } \__cs_tmp:w { new_protected_nopar } { x } \prg_new_conditional:Npnn \cs_if_eq:NN #1#2 { p , T , F , TF } { \if_meaning:w #1#2 \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \cs_if_eq_p:cN { \exp_args:Nc \cs_if_eq_p:NN } \cs_new:Npn \cs_if_eq:cNTF { \exp_args:Nc \cs_if_eq:NNTF } \cs_new:Npn \cs_if_eq:cNT { \exp_args:Nc \cs_if_eq:NNT } \cs_new:Npn \cs_if_eq:cNF { \exp_args:Nc \cs_if_eq:NNF } \cs_new:Npn \cs_if_eq_p:Nc { \exp_args:NNc \cs_if_eq_p:NN } \cs_new:Npn \cs_if_eq:NcTF { \exp_args:NNc \cs_if_eq:NNTF } \cs_new:Npn \cs_if_eq:NcT { \exp_args:NNc \cs_if_eq:NNT } \cs_new:Npn \cs_if_eq:NcF { \exp_args:NNc \cs_if_eq:NNF } \cs_new:Npn \cs_if_eq_p:cc { \exp_args:Ncc \cs_if_eq_p:NN } \cs_new:Npn \cs_if_eq:ccTF { \exp_args:Ncc \cs_if_eq:NNTF } \cs_new:Npn \cs_if_eq:ccT { \exp_args:Ncc \cs_if_eq:NNT } \cs_new:Npn \cs_if_eq:ccF { \exp_args:Ncc \cs_if_eq:NNF } \cs_new_protected:Npn \__kernel_check_defined:NT #1#2 { \cs_if_exist:NTF #1 {#2} { \__msg_kernel_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #1 } } } \cs_new_protected:Npn \__kernel_register_show:N { \__kernel_register_show_aux:NN \tl_show:n } \cs_new_protected:Npn \__kernel_register_show:c { \exp_args:Nc \__kernel_register_show:N } \cs_new_protected:Npn \__kernel_register_log:N { \__kernel_register_show_aux:NN \tl_log:n } \cs_new_protected:Npn \__kernel_register_log:c { \exp_args:Nc \__kernel_register_log:N } \cs_new_protected:Npn \__kernel_register_show_aux:NN #1#2 { \__kernel_check_defined:NT #2 { \exp_args:No \__kernel_register_show_aux:nNN { \tex_the:D #2 } #2 #1 } } \cs_new_protected:Npn \__kernel_register_show_aux:nNN #1#2#3 { \exp_args:No #3 { \token_to_str:N #2 = #1 } } \cs_new_protected:Npn \cs_show:N { \__kernel_show:NN \tl_show:n } \cs_new_protected:Npn \cs_show:c { \group_begin: \exp_args:NNc \group_end: \cs_show:N } \cs_new_protected:Npn \cs_log:N { \__kernel_show:NN \tl_log:n } \cs_new_protected:Npn \cs_log:c { \group_begin: \exp_args:NNc \group_end: \cs_log:N } \cs_new_protected:Npn \__kernel_show:NN #1#2 { \group_begin: \int_set:Nn \tex_escapechar:D { `\\ } \exp_args:NNx \group_end: #1 { \token_to_str:N #2 = \cs_meaning:N #2 } } \cs_new_nopar:Npn \prg_do_nothing: { } \cs_new_eq:NN \__prg_break_point:Nn \use_ii:nn \cs_new:Npn \__prg_map_break:Nn #1#2#3 \__prg_break_point:Nn #4#5 { #5 \if_meaning:w #1 #4 \exp_after:wN \use_iii:nnn \fi: \__prg_map_break:Nn #1 {#2} } \cs_new_eq:NN \__prg_break_point: \prg_do_nothing: \cs_new:Npn \__prg_break: #1 \__prg_break_point: { } \cs_new:Npn \__prg_break:n #1#2 \__prg_break_point: {#1} %% File: l3expan.dtx Copyright (C) 1990-2017 The LaTeX3 project \cs_new:Npn \__exp_arg_next:nnn #1#2#3 { #2 \::: { #3 {#1} } } \cs_new:Npn \__exp_arg_next:Nnn #1#2#3 { #2 \::: { #3 #1 } } \cs_new:Npn \::: #1 {#1} \cs_new:Npn \::n #1 \::: #2#3 { #1 \::: { #2 {#3} } } \cs_new:Npn \::N #1 \::: #2#3 { #1 \::: {#2#3} } \cs_new:Npn \::p #1 \::: #2#3# { #1 \::: {#2#3} } \cs_new:Npn \::c #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:Nnn \cs:w #3 \cs_end: {#1} {#2} } \cs_new:Npn \::o #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN {#3} {#1} {#2} } \cs_new:Npn \::f #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN { \exp:w \exp_end_continue_f:w #3 } {#1} {#2} } \use:nn { \cs_new_eq:NN \exp_stop_f: } { ~ } \cs_new_protected:Npn \::x #1 \::: #2#3 { \cs_set_nopar:Npx \l__exp_internal_tl { {#3} } \exp_after:wN \__exp_arg_next:nnn \l__exp_internal_tl {#1} {#2} } \cs_new:Npn \::V #1 \::: #2#3 { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN { \exp:w \__exp_eval_register:N #3 } {#1} {#2} } \cs_new:Npn \::v # 1\::: #2#3 { \exp_after:wN \__exp_arg_next:nnn \exp_after:wN { \exp:w \__exp_eval_register:c {#3} } {#1} {#2} } \cs_new:Npn \__exp_eval_register:N #1 { \exp_after:wN \if_meaning:w \exp_not:N #1 #1 \if_meaning:w \scan_stop: #1 \__exp_eval_error_msg:w \fi: \else: \exp_after:wN \use_i_ii:nnn \fi: \exp_after:wN \exp_end: \tex_the:D #1 } \cs_new:Npn \__exp_eval_register:c #1 { \exp_after:wN \__exp_eval_register:N \cs:w #1 \cs_end: } \cs_new:Npn \__exp_eval_error_msg:w #1 \tex_the:D #2 { \fi: \fi: \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2} \exp_end: } \cs_new:Npn \exp_args:NNc #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \cs:w # 3\cs_end: } \cs_new:Npn \exp_args:Ncc #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \cs:w #3 \cs_end: } \cs_new:Npn \exp_args:Nccc #1#2#3#4 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \cs:w #3 \exp_after:wN \cs_end: \cs:w #4 \cs_end: } \cs_new:Npn \exp_args:No #1#2 { \exp_after:wN #1 \exp_after:wN {#2} } \cs_new:Npn \exp_args:NNo #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN {#3} } \cs_new:Npn \exp_args:NNNo #1#2#3#4 { \exp_after:wN #1 \exp_after:wN#2 \exp_after:wN #3 \exp_after:wN {#4} } \cs_new:Npn \exp_args:Nf #1#2 { \exp_after:wN #1 \exp_after:wN { \exp:w \exp_end_continue_f:w #2 } } \cs_new:Npn \exp_args:Nv #1#2 { \exp_after:wN #1 \exp_after:wN { \exp:w \__exp_eval_register:c {#2} } } \cs_new:Npn \exp_args:NV #1#2 { \exp_after:wN #1 \exp_after:wN { \exp:w \__exp_eval_register:N #2 } } \cs_new:Npn \exp_args:NNV #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN { \exp:w \__exp_eval_register:N #3 } } \cs_new:Npn \exp_args:NNv #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN { \exp:w \__exp_eval_register:c {#3} } } \cs_new:Npn \exp_args:NNf #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN { \exp:w \exp_end_continue_f:w #3 } } \cs_new:Npn \exp_args:Nco #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN {#3} } \cs_new:Npn \exp_args:NcV #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN { \exp:w \__exp_eval_register:N #3 } } \cs_new:Npn \exp_args:Ncv #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN { \exp:w \__exp_eval_register:c {#3} } } \cs_new:Npn \exp_args:Ncf #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN { \exp:w \exp_end_continue_f:w #3 } } \cs_new:Npn \exp_args:NVV #1#2#3 { \exp_after:wN #1 \exp_after:wN { \exp:w \exp_after:wN \__exp_eval_register:N \exp_after:wN #2 \exp_after:wN } \exp_after:wN { \exp:w \__exp_eval_register:N #3 } } \cs_new:Npn \exp_args:NNNV #1#2#3#4 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN { \exp:w \__exp_eval_register:N #4 } } \cs_new:Npn \exp_args:NcNc #1#2#3#4 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN #3 \cs:w #4 \cs_end: } \cs_new:Npn \exp_args:NcNo #1#2#3#4 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp_after:wN #3 \exp_after:wN {#4} } \cs_new:Npn \exp_args:Ncco #1#2#3#4 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \cs:w #3 \exp_after:wN \cs_end: \exp_after:wN {#4} } \cs_new_protected:Npn \exp_args:Nx { \::x \::: } \cs_new:Npn \exp_args:Nnc { \::n \::c \::: } \cs_new:Npn \exp_args:Nno { \::n \::o \::: } \cs_new:Npn \exp_args:NnV { \::n \::V \::: } \cs_new:Npn \exp_args:Nnv { \::n \::v \::: } \cs_new:Npn \exp_args:Nnf { \::n \::f \::: } \cs_new:Npn \exp_args:Noc { \::o \::c \::: } \cs_new:Npn \exp_args:Noo { \::o \::o \::: } \cs_new:Npn \exp_args:Nof { \::o \::f \::: } \cs_new:Npn \exp_args:NVo { \::V \::o \::: } \cs_new:Npn \exp_args:Nfo { \::f \::o \::: } \cs_new:Npn \exp_args:Nff { \::f \::f \::: } \cs_new_protected:Npn \exp_args:NNx { \::N \::x \::: } \cs_new_protected:Npn \exp_args:Ncx { \::c \::x \::: } \cs_new_protected:Npn \exp_args:Nnx { \::n \::x \::: } \cs_new_protected:Npn \exp_args:Nox { \::o \::x \::: } \cs_new_protected:Npn \exp_args:Nxo { \::x \::o \::: } \cs_new_protected:Npn \exp_args:Nxx { \::x \::x \::: } \cs_new:Npn \exp_args:NNcf { \::N \::c \::f \::: } \cs_new:Npn \exp_args:NNno { \::N \::n \::o \::: } \cs_new:Npn \exp_args:NNnV { \::N \::n \::V \::: } \cs_new:Npn \exp_args:NNoo { \::N \::o \::o \::: } \cs_new:Npn \exp_args:NNVV { \::N \::V \::V \::: } \cs_new:Npn \exp_args:Ncno { \::c \::n \::o \::: } \cs_new:Npn \exp_args:NcnV { \::c \::n \::V \::: } \cs_new:Npn \exp_args:Ncoo { \::c \::o \::o \::: } \cs_new:Npn \exp_args:NcVV { \::c \::V \::V \::: } \cs_new:Npn \exp_args:Nnnc { \::n \::n \::c \::: } \cs_new:Npn \exp_args:Nnno { \::n \::n \::o \::: } \cs_new:Npn \exp_args:Nnnf { \::n \::n \::f \::: } \cs_new:Npn \exp_args:Nnff { \::n \::f \::f \::: } \cs_new:Npn \exp_args:Nooo { \::o \::o \::o \::: } \cs_new:Npn \exp_args:Noof { \::o \::o \::f \::: } \cs_new:Npn \exp_args:Nffo { \::f \::f \::o \::: } \cs_new_protected:Npn \exp_args:NNNx { \::N \::N \::x \::: } \cs_new_protected:Npn \exp_args:NNnx { \::N \::n \::x \::: } \cs_new_protected:Npn \exp_args:NNox { \::N \::o \::x \::: } \cs_new_protected:Npn \exp_args:Nnnx { \::n \::n \::x \::: } \cs_new_protected:Npn \exp_args:Nnox { \::n \::o \::x \::: } \cs_new_protected:Npn \exp_args:Nccx { \::c \::c \::x \::: } \cs_new_protected:Npn \exp_args:Ncnx { \::c \::n \::x \::: } \cs_new_protected:Npn \exp_args:Noox { \::o \::o \::x \::: } \cs_new:Npn \__exp_arg_last_unbraced:nn #1#2 { #2#1 } \cs_new:Npn \::o_unbraced \::: #1#2 { \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN {#2} {#1} } \cs_new:Npn \::V_unbraced \::: #1#2 { \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN { \exp:w \__exp_eval_register:N #2 } {#1} } \cs_new:Npn \::v_unbraced \::: #1#2 { \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN { \exp:w \__exp_eval_register:c {#2} } {#1} } \cs_new:Npn \::f_unbraced \::: #1#2 { \exp_after:wN \__exp_arg_last_unbraced:nn \exp_after:wN { \exp:w \exp_end_continue_f:w #2 } {#1} } \cs_new_protected:Npn \::x_unbraced \::: #1#2 { \cs_set_nopar:Npx \l__exp_internal_tl { \exp_not:n {#1} #2 } \l__exp_internal_tl } \cs_new:Npn \exp_last_unbraced:No #1#2 { \exp_after:wN #1 #2 } \cs_new:Npn \exp_last_unbraced:NV #1#2 { \exp_after:wN #1 \exp:w \__exp_eval_register:N #2 } \cs_new:Npn \exp_last_unbraced:Nv #1#2 { \exp_after:wN #1 \exp:w \__exp_eval_register:c {#2} } \cs_new:Npn \exp_last_unbraced:Nf #1#2 { \exp_after:wN #1 \exp:w \exp_end_continue_f:w #2 } \cs_new:Npn \exp_last_unbraced:NNo #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 #3 } \cs_new:Npn \exp_last_unbraced:NNV #1#2#3 { \exp_after:wN #1 \exp_after:wN #2 \exp:w \__exp_eval_register:N #3 } \cs_new:Npn \exp_last_unbraced:Nco #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: #3 } \cs_new:Npn \exp_last_unbraced:NcV #1#2#3 { \exp_after:wN #1 \cs:w #2 \exp_after:wN \cs_end: \exp:w \__exp_eval_register:N #3 } \cs_new:Npn \exp_last_unbraced:NNNo #1#2#3#4 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 #4 } \cs_new:Npn \exp_last_unbraced:NNNV #1#2#3#4 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp:w \__exp_eval_register:N #4 } \cs_new:Npn \exp_last_unbraced:Nno { \::n \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:Noo { \::o \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:Nfo { \::f \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:NnNo { \::n \::N \::o_unbraced \::: } \cs_new:Npn \exp_last_unbraced:NNNNo #1#2#3#4#5 { \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 #5 } \cs_new_protected:Npn \exp_last_unbraced:Nx { \::x_unbraced \::: } \cs_new:Npn \exp_last_two_unbraced:Noo #1#2#3 { \exp_after:wN \__exp_last_two_unbraced:noN \exp_after:wN {#3} {#2} #1 } \cs_new:Npn \__exp_last_two_unbraced:noN #1#2#3 { \exp_after:wN #3 #2 #1 } \cs_new:Npn \exp_not:c #1 { \exp_after:wN \exp_not:N \cs:w #1 \cs_end: } \cs_new:Npn \exp_not:o #1 { \etex_unexpanded:D \exp_after:wN {#1} } \cs_new:Npn \exp_not:f #1 { \etex_unexpanded:D \exp_after:wN { \exp:w \exp_end_continue_f:w #1 } } \cs_new:Npn \exp_not:V #1 { \etex_unexpanded:D \exp_after:wN { \exp:w \__exp_eval_register:N #1 } } \cs_new:Npn \exp_not:v #1 { \etex_unexpanded:D \exp_after:wN { \exp:w \__exp_eval_register:c {#1} } } \group_begin: \tex_catcode:D `\^^@ = 13 \cs_new_protected:Npn \exp_end_continue_f:w { `^^@ } \cs_new:Npn ^^@ { \__msg_kernel_expandable_error:nn { kernel } { bad-exp-end-f } } \cs_new:Npn \exp_end_continue_f:nw #1 { `^^@ #1 } \group_end: \__debug_patch:nnNNpn { \__debug_chk_cs_exist:N #1 } { } \cs_new_protected:Npn \cs_generate_variant:Nn #1#2 { \__cs_generate_variant:N #1 \exp_after:wN \__cs_split_function:NN \exp_after:wN #1 \exp_after:wN \__cs_generate_variant:nnNN \exp_after:wN #1 \tl_to_str:n {#2} , \scan_stop: , \q_recursion_stop } \cs_new_protected:Npn \cs_generate_variant:cn { \exp_args:Nc \cs_generate_variant:Nn } \cs_new_protected:Npx \__cs_generate_variant:N #1 { \exp_not:N \exp_after:wN \exp_not:N \if_meaning:w \exp_not:N \exp_not:N #1 #1 \cs_set_eq:NN \exp_not:N \__cs_tmp:w \cs_new_protected:Npx \exp_not:N \else: \exp_not:N \exp_after:wN \exp_not:N \__cs_generate_variant:ww \exp_not:N \token_to_meaning:N #1 \tl_to_str:n { ma } \exp_not:N \q_mark \exp_not:N \q_mark \cs_new_protected:Npx \tl_to_str:n { pr } \exp_not:N \q_mark \cs_new:Npx \exp_not:N \q_stop \exp_not:N \fi: } \exp_last_unbraced:NNNNo \cs_new_protected:Npn \__cs_generate_variant:ww #1 { \tl_to_str:n { ma } } #2 \q_mark { \__cs_generate_variant:wwNw #1 } \exp_last_unbraced:NNNNo \cs_new_protected:Npn \__cs_generate_variant:wwNw #1 { \tl_to_str:n { pr } } #2 \q_mark #3 #4 \q_stop { \cs_set_eq:NN \__cs_tmp:w #3 } \cs_new_protected:Npn \__cs_generate_variant:nnNN #1#2#3#4 { \if_meaning:w \c_false_bool #3 \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \__cs_generate_variant:Nnnw #4 {#1}{#2} } \cs_new_protected:Npn \__cs_generate_variant:Nnnw #1#2#3#4 , { \if_meaning:w \scan_stop: #4 \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \use:x { \exp_not:N \__cs_generate_variant:wwNN \__cs_generate_variant_loop:nNwN { } #4 \__cs_generate_variant_loop_end:nwwwNNnn \q_mark #3 ~ { ~ { } \fi: \__cs_generate_variant_loop_long:wNNnn } ~ { } \q_stop \exp_not:N #1 {#2} {#4} } \__cs_generate_variant:Nnnw #1 {#2} {#3} } \cs_new:Npn \__cs_generate_variant_loop:nNwN #1#2#3 \q_mark #4 { \if:w #2 #4 \exp_after:wN \__cs_generate_variant_loop_same:w \else: \if:w #4 \__cs_generate_variant_loop_base:N #2 \else: \if:w 0 \if:w N #4 \else: \if:w n #4 \else: 1 \fi: \fi: \if:w \scan_stop: \__cs_generate_variant_loop_base:N #2 1 \fi: 0 \__cs_generate_variant_loop_special:NNwNNnn #4#2 \else: \__cs_generate_variant_loop_invalid:NNwNNnn #4#2 \fi: \fi: \fi: #1 \prg_do_nothing: #2 \__cs_generate_variant_loop:nNwN { } #3 \q_mark } \cs_new:Npn \__cs_generate_variant_loop_base:N #1 { \if:w c #1 N \else: \if:w o #1 n \else: \if:w V #1 n \else: \if:w v #1 n \else: \if:w f #1 n \else: \if:w x #1 n \else: \if:w n #1 n \else: \if:w N #1 N \else: \scan_stop: \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: } \cs_new:Npn \__cs_generate_variant_loop_same:w #1 \prg_do_nothing: #2#3#4 { #3 { #1 \__cs_generate_variant_same:N #2 } } \cs_new:Npn \__cs_generate_variant_loop_end:nwwwNNnn #1#2 \q_mark #3 ~ #4 \q_stop #5#6#7#8 { \scan_stop: \scan_stop: \fi: \exp_not:N \q_mark \exp_not:N \q_stop \exp_not:N #6 \exp_not:c { #7 : #8 #1 #3 } } \cs_new:Npn \__cs_generate_variant_loop_long:wNNnn #1 \q_stop #2#3#4#5 { \exp_not:n { \q_mark \__msg_kernel_error:nnxx { kernel } { variant-too-long } {#5} { \token_to_str:N #3 } \use_none:nnn \q_stop #3 #3 } } \cs_new:Npn \__cs_generate_variant_loop_invalid:NNwNNnn #1#2 \fi: \fi: \fi: #3 \q_stop #4#5#6#7 { \fi: \fi: \fi: \exp_not:n { \q_mark \__msg_kernel_error:nnxxxx { kernel } { invalid-variant } {#7} { \token_to_str:N #5 } {#1} {#2} \use_none:nnn \q_stop #5 #5 } } \cs_new:Npn \__cs_generate_variant_loop_special:NNwNNnn #1#2#3 \q_stop #4#5#6#7 { #3 \q_stop #4 #5 {#6} {#7} \exp_not:n { \__cs_generate_variant_loop_warning:nnxxxx { kernel } { invalid-variant } {#7} { \token_to_str:N #5 } {#1} {#2} } } \cs_new_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx { \__msg_kernel_warning:nnxxxx } \cs_new:Npn \__cs_generate_variant_same:N #1 { \if:w N #1 N \else: \if:w p #1 p \else: n \if:w n #1 \else: \__cs_generate_variant_loop_special:NNwNNnn #1#1 \fi: \fi: \fi: } \__debug_patch:nnNNpn { \cs_if_free:NF #4 { \__debug_log:x { Variant~\token_to_str:N #4~% already~defined;~ not~ changing~ it~ \msg_line_context: } } } { } \cs_new_protected:Npn \__cs_generate_variant:wwNN #1 \q_mark #2 \q_stop #3#4 { #2 \cs_if_free:NT #4 { \group_begin: \__cs_generate_internal_variant:n {#1} \__cs_tmp:w #4 { \exp_not:c { exp_args:N #1 } \exp_not:N #3 } \group_end: } } \cs_new_protected:Npx \__cs_generate_internal_variant:n #1 { \exp_not:N \__cs_generate_internal_variant:wwnNwnn #1 \exp_not:N \q_mark { \cs_set_eq:NN \exp_not:N \__cs_tmp:w \cs_new_protected:Npx } \cs_new_protected:cpx \token_to_str:N x \exp_not:N \q_mark { } \cs_new:cpx \exp_not:N \q_stop { exp_args:N #1 } { \exp_not:N \__cs_generate_internal_variant_loop:n #1 { : \exp_not:N \use_i:nn } } } \use:x { \cs_new_protected:Npn \exp_not:N \__cs_generate_internal_variant:wwnNwnn ##1 \token_to_str:N x ##2 \exp_not:N \q_mark ##3 ##4 ##5 \exp_not:N \q_stop ##6 ##7 } { #3 \cs_if_free:cT {#6} { #4 {#6} {#7} } } \cs_new:Npn \__cs_generate_internal_variant_loop:n #1 { \exp_after:wN \exp_not:N \cs:w :: #1 \cs_end: \__cs_generate_internal_variant_loop:n } \cs_new_protected:Npn \prg_generate_conditional_variant:Nnn #1 { \__cs_split_function:NN #1 \__cs_generate_variant:nnNnn } \cs_new_protected:Npn \__cs_generate_variant:nnNnn #1#2#3#4#5 { \if_meaning:w \c_false_bool #3 \__msg_kernel_error:nnx { kernel } { missing-colon } { \token_to_str:c {#1} } \use_i_delimit_by_q_stop:nw \fi: \exp_after:wN \__cs_generate_variant:w \tl_to_str:n {#5} , \scan_stop: , \q_recursion_stop \use_none_delimit_by_q_stop:w \q_mark {#1} {#2} {#4} \q_stop } \cs_new_protected:Npn \__cs_generate_variant:w #1 , #2 \q_mark #3#4#5 { \if_meaning:w \scan_stop: #1 \scan_stop: \if_meaning:w \q_nil #1 \q_nil \use_i:nnn \fi: \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \else: \cs_if_exist_use:cTF { __cs_generate_variant_#1_form:nnn } { {#3} {#4} {#5} } { \__msg_kernel_error:nnxx { kernel } { conditional-form-unknown } {#1} { \token_to_str:c { #3 : #4 } } } \fi: \__cs_generate_variant:w #2 \q_mark {#3} {#4} {#5} } \cs_new_protected:Npn \__cs_generate_variant_p_form:nnn #1#2 { \cs_generate_variant:cn { #1 _p : #2 } } \cs_new_protected:Npn \__cs_generate_variant_T_form:nnn #1#2 { \cs_generate_variant:cn { #1 : #2 T } } \cs_new_protected:Npn \__cs_generate_variant_F_form:nnn #1#2 { \cs_generate_variant:cn { #1 : #2 F } } \cs_new_protected:Npn \__cs_generate_variant_TF_form:nnn #1#2 { \cs_generate_variant:cn { #1 : #2 TF } } %% File: l3tl.dtx Copyright (C) 1990-2017 The LaTeX3 Project \cs_new_protected:Npn \tl_new:N #1 { \__chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_empty_tl } \cs_generate_variant:Nn \tl_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \tl_const:Nn #1#2 { \__chk_if_free_cs:N #1 \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \tl_const:Nx #1#2 { \__chk_if_free_cs:N #1 \cs_gset_nopar:Npx #1 {#2} } \cs_generate_variant:Nn \tl_const:Nn { c } \cs_generate_variant:Nn \tl_const:Nx { c } \cs_new_protected:Npn \tl_clear:N #1 { \tl_set_eq:NN #1 \c_empty_tl } \cs_new_protected:Npn \tl_gclear:N #1 { \tl_gset_eq:NN #1 \c_empty_tl } \cs_generate_variant:Nn \tl_clear:N { c } \cs_generate_variant:Nn \tl_gclear:N { c } \cs_new_protected:Npn \tl_clear_new:N #1 { \tl_if_exist:NTF #1 { \tl_clear:N #1 } { \tl_new:N #1 } } \cs_new_protected:Npn \tl_gclear_new:N #1 { \tl_if_exist:NTF #1 { \tl_gclear:N #1 } { \tl_new:N #1 } } \cs_generate_variant:Nn \tl_clear_new:N { c } \cs_generate_variant:Nn \tl_gclear_new:N { c } \tex_ifodd:D \l@expl@enable@debug@bool \cs_new_protected:Npn \tl_set_eq:NN #1#2 { \__debug_chk_var_local:N #1 \__debug_chk_var_exist:N #2 \cs_set_eq:NN #1 #2 } \cs_new_protected:Npn \tl_gset_eq:NN #1#2 { \__debug_chk_var_global:N #1 \__debug_chk_var_exist:N #2 \cs_gset_eq:NN #1 #2 } \else: \cs_new_eq:NN \tl_set_eq:NN \cs_set_eq:NN \cs_new_eq:NN \tl_gset_eq:NN \cs_gset_eq:NN \fi: \cs_generate_variant:Nn \tl_set_eq:NN { cN, Nc, cc } \cs_generate_variant:Nn \tl_gset_eq:NN { cN, Nc, cc } \__debug_patch:nnNNpn { \__debug_chk_var_exist:N #2 \__debug_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_concat:NNN #1#2#3 { \tl_set:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } \__debug_patch:nnNNpn { \__debug_chk_var_exist:N #2 \__debug_chk_var_exist:N #3 } { } \cs_new_protected:Npn \tl_gconcat:NNN #1#2#3 { \tl_gset:Nx #1 { \exp_not:o {#2} \exp_not:o {#3} } } \cs_generate_variant:Nn \tl_concat:NNN { ccc } \cs_generate_variant:Nn \tl_gconcat:NNN { ccc } \prg_new_eq_conditional:NNn \tl_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \tl_if_exist:c \cs_if_exist:c { TF , T , F , p } \tl_const:Nn \c_empty_tl { } \group_begin: \tex_lccode:D `A = `- \tex_lccode:D `N = `N \tex_lccode:D `V = `V \tex_lowercase:D { \group_end: \tl_const:Nn \c_novalue_tl { ANoValue- } } \tl_const:Nn \c_space_tl { ~ } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_set:Nx #1#2 { \cs_set_nopar:Npx #1 {#2} } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gset:Nx #1#2 { \cs_gset_nopar:Npx #1 {#2} } \cs_generate_variant:Nn \tl_set:Nn { NV , Nv , Nf } \cs_generate_variant:Nn \tl_set:Nx { c } \cs_generate_variant:Nn \tl_set:Nn { c, co , cV , cv , cf } \cs_generate_variant:Nn \tl_gset:Nn { NV , Nv , Nf } \cs_generate_variant:Nn \tl_gset:Nx { c } \cs_generate_variant:Nn \tl_gset:Nn { c, co , cV , cv , cf } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_left:Nx #1#2 { \cs_set_nopar:Npx #1 { #2 \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:n {#2} \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:V #2 \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#2} \exp_not:o #1 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_left:Nx #1#2 { \cs_gset_nopar:Npx #1 { #2 \exp_not:o {#1} } } \cs_generate_variant:Nn \tl_put_left:Nn { c } \cs_generate_variant:Nn \tl_put_left:NV { c } \cs_generate_variant:Nn \tl_put_left:No { c } \cs_generate_variant:Nn \tl_put_left:Nx { c } \cs_generate_variant:Nn \tl_gput_left:Nn { c } \cs_generate_variant:Nn \tl_gput_left:NV { c } \cs_generate_variant:Nn \tl_gput_left:No { c } \cs_generate_variant:Nn \tl_gput_left:Nx { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nn #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:NV #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:No #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \tl_put_right:Nx #1#2 { \cs_set_nopar:Npx #1 { \exp_not:o #1 #2 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nn #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:n {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:NV #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:V #2 } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:No #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o #1 \exp_not:o {#2} } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \tl_gput_right:Nx #1#2 { \cs_gset_nopar:Npx #1 { \exp_not:o {#1} #2 } } \cs_generate_variant:Nn \tl_put_right:Nn { c } \cs_generate_variant:Nn \tl_put_right:NV { c } \cs_generate_variant:Nn \tl_put_right:No { c } \cs_generate_variant:Nn \tl_put_right:Nx { c } \cs_generate_variant:Nn \tl_gput_right:Nn { c } \cs_generate_variant:Nn \tl_gput_right:NV { c } \cs_generate_variant:Nn \tl_gput_right:No { c } \cs_generate_variant:Nn \tl_gput_right:Nx { c } \tl_const:Nx \c__tl_rescan_marker_tl { : \token_to_str:N : } \cs_new_protected:Npn \tl_set_rescan:Nnn { \__tl_set_rescan:NNnn \tl_set:Nn } \cs_new_protected:Npn \tl_gset_rescan:Nnn { \__tl_set_rescan:NNnn \tl_gset:Nn } \cs_new_protected:Npn \tl_rescan:nn { \__tl_set_rescan:NNnn \prg_do_nothing: \use:n } \cs_new_protected:Npn \__tl_set_rescan:NNnn #1#2#3#4 { \tl_if_empty:nTF {#4} { \group_begin: #3 \group_end: #1 #2 { } } { \group_begin: \exp_args:No \etex_everyeof:D { \c__tl_rescan_marker_tl \exp_not:N } \int_compare:nNnT \tex_endlinechar:D = { 32 } { \int_set:Nn \tex_endlinechar:D { -1 } } \tex_newlinechar:D \tex_endlinechar:D #3 \scan_stop: \exp_args:No \__tl_set_rescan:n { \tl_to_str:n {#4} } \exp_args:NNNo \group_end: #1 #2 \l__tl_internal_a_tl } } \cs_new_protected:Npn \__tl_set_rescan_multi:n #1 { \tl_set:Nx \l__tl_internal_a_tl { \exp_after:wN \__tl_rescan:w \exp_after:wN \prg_do_nothing: \etex_scantokens:D {#1} } } \exp_args:Nno \use:nn { \cs_new:Npn \__tl_rescan:w #1 } \c__tl_rescan_marker_tl { \exp_not:o {#1} } \cs_generate_variant:Nn \tl_set_rescan:Nnn { Nno , Nnx } \cs_generate_variant:Nn \tl_set_rescan:Nnn { c , cno , cnx } \cs_generate_variant:Nn \tl_gset_rescan:Nnn { Nno , Nnx } \cs_generate_variant:Nn \tl_gset_rescan:Nnn { c , cno } \group_begin: \tex_catcode:D `\^^@ = 12 \scan_stop: \cs_new_protected:Npn \__tl_set_rescan:n #1 { \int_compare:nNnTF \tex_newlinechar:D < 0 { \use_ii:nn } { \char_set_lccode:nn { 0 } { \tex_newlinechar:D } \tex_lowercase:D { \__tl_set_rescan:NnTF ^^@ } {#1} } { \__tl_set_rescan_multi:n } { \__tl_set_rescan_single:nn { ' } } {#1} } \cs_new_protected:Npn \__tl_set_rescan:NnTF #1#2 { \tl_if_in:nnTF {#2} {#1} } \cs_new_protected:Npn \__tl_set_rescan_single:nn #1 { \int_compare:nNnTF { \char_value_catcode:n { `#1 } / 3 } = 4 { \__tl_set_rescan_single_aux:nn {#1} } { \int_compare:nNnTF { `#1 } < { `\~ } { \char_set_lccode:nn { 0 } { `#1 + 1 } \tex_lowercase:D { \__tl_set_rescan_single:nn { ^^@ } } } { \__tl_set_rescan_single_aux:nn { } } } } \cs_new_protected:Npn \__tl_set_rescan_single_aux:nn #1#2 { \int_set:Nn \tex_endlinechar:D { -1 } \use:x { \exp_not:N \use:n { \exp_not:n { \cs_set:Npn \__tl_rescan:w ##1 } \exp_after:wN \__tl_rescan:w \exp_after:wN \prg_do_nothing: \etex_scantokens:D {#1} } \c__tl_rescan_marker_tl } { \exp_not:o {##1} } \tl_set:Nx \l__tl_internal_a_tl { \int_compare:nNnT { \char_value_catcode:n { \exp_last_unbraced:Nf ` \str_head:n {#2} ~ } } = { 10 } { ~ } \exp_after:wN \__tl_rescan:w \exp_after:wN \prg_do_nothing: \etex_scantokens:D { #2 #1 } } } \group_end: \cs_new_protected:Npn \tl_replace_once:Nnn { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_set:Nx } \cs_new_protected:Npn \tl_greplace_once:Nnn { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_gset:Nx } \cs_new_protected:Npn \tl_replace_all:Nnn { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_set:Nx } \cs_new_protected:Npn \tl_greplace_all:Nnn { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_gset:Nx } \cs_generate_variant:Nn \tl_replace_once:Nnn { c } \cs_generate_variant:Nn \tl_greplace_once:Nnn { c } \cs_generate_variant:Nn \tl_replace_all:Nnn { c } \cs_generate_variant:Nn \tl_greplace_all:Nnn { c } \cs_new_protected:Npn \__tl_replace:NnNNNnn #1#2#3#4#5#6#7 { \tl_if_empty:nTF {#6} { \__msg_kernel_error:nnx { kernel } { empty-search-pattern } { \tl_to_str:n {#7} } } { \tl_if_in:onTF { #5 #6 } {#1} { \tl_if_in:nnTF {#6} {#1} { \exp_args:Nc \__tl_replace:NnNNNnn {#2} {#2?} } { \quark_if_nil:nTF {#6} { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } } { \__tl_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil } } } } { \__tl_replace_auxii:nNNNnn {#1} } #3#4#5 {#6} {#7} } } \cs_new_protected:Npn \__tl_replace_auxi:NnnNNNnn #1#2#3 { \tl_if_in:NnTF #1 { #2 #3 #3 } { \__tl_replace_auxi:NnnNNNnn #1 { #2 #3 } {#2} } { \__tl_replace_auxii:nNNNnn { #2 #3 #3 } } } \cs_new_protected:Npn \__tl_replace_auxii:nNNNnn #1#2#3#4#5#6 { \group_align_safe_begin: \cs_set:Npn \__tl_replace_wrap:w ##1 #1 ##2 { \exp_not:o { \use_none:nn ##1 } ##2 } \cs_set:Npx \__tl_replace_next:w ##1 #5 { \exp_not:N \__tl_replace_wrap:w ##1 \exp_not:n { #1 } \exp_not:n { \exp_not:n {#6} } \exp_not:n { #2 { } { } } } #3 #4 { \exp_after:wN \__tl_replace_next:w \exp_after:wN { \exp_after:wN } \exp_after:wN { \exp_after:wN } #4 #1 { \if_false: { \fi: } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } #5 } \group_align_safe_end: } \cs_new_eq:NN \__tl_replace_wrap:w ? \cs_new_eq:NN \__tl_replace_next:w ? \cs_new_protected:Npn \tl_remove_once:Nn #1#2 { \tl_replace_once:Nnn #1 {#2} { } } \cs_new_protected:Npn \tl_gremove_once:Nn #1#2 { \tl_greplace_once:Nnn #1 {#2} { } } \cs_generate_variant:Nn \tl_remove_once:Nn { c } \cs_generate_variant:Nn \tl_gremove_once:Nn { c } \cs_new_protected:Npn \tl_remove_all:Nn #1#2 { \tl_replace_all:Nnn #1 {#2} { } } \cs_new_protected:Npn \tl_gremove_all:Nn #1#2 { \tl_greplace_all:Nnn #1 {#2} { } } \cs_generate_variant:Nn \tl_remove_all:Nn { c } \cs_generate_variant:Nn \tl_gremove_all:Nn { c } \prg_new_conditional:Npnn \tl_if_blank:n #1 { p , T , F , TF } { \__tl_if_empty_return:o { \use_none:n #1 ? } } \prg_generate_conditional_variant:Nnn \tl_if_blank:n { V , o } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF } { \if_meaning:w #1 \c_empty_tl \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \tl_if_empty:N { c } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:n #1 { p , TF , T , F } { \exp_after:wN \if_meaning:w \exp_after:wN \q_nil \tl_to_str:n {#1} \q_nil \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \tl_if_empty:n { V } { p , TF , T , F } \cs_new:Npn \__tl_if_empty_return:o #1 { \exp_after:wN \if_meaning:w \exp_after:wN \q_nil \etex_detokenize:D \exp_after:wN {#1} \q_nil \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \tl_if_empty:o #1 { p , TF , T , F } { \__tl_if_empty_return:o {#1} } \prg_new_conditional:Npnn \tl_if_eq:NN #1#2 { p , T , F , TF } { \if_meaning:w #1 #2 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \tl_if_eq:NN { Nc , c , cc } { p , TF , T , F } \prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F , TF } { \group_begin: \tl_set:Nn \l__tl_internal_a_tl {#1} \tl_set:Nn \l__tl_internal_b_tl {#2} \if_meaning:w \l__tl_internal_a_tl \l__tl_internal_b_tl \group_end: \prg_return_true: \else: \group_end: \prg_return_false: \fi: } \tl_new:N \l__tl_internal_a_tl \tl_new:N \l__tl_internal_b_tl \cs_new_protected:Npn \tl_if_in:NnT { \exp_args:No \tl_if_in:nnT } \cs_new_protected:Npn \tl_if_in:NnF { \exp_args:No \tl_if_in:nnF } \cs_new_protected:Npn \tl_if_in:NnTF { \exp_args:No \tl_if_in:nnTF } \prg_generate_conditional_variant:Nnn \tl_if_in:Nn { c } { T , F , TF } \prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T , F , TF } { \if_false: { \fi: \cs_set:Npn \__tl_tmp:w ##1 #2 { } \tl_if_empty:oTF { \__tl_tmp:w #1 {} {} #2 } { \prg_return_false: } { \prg_return_true: } \if_false: } \fi: } \prg_generate_conditional_variant:Nnn \tl_if_in:nn { V , o , no } { T , F , TF } \use:x { \prg_new_conditional:Npnn \exp_not:N \tl_if_novalue:n ##1 { p , T , F , TF } { \exp_not:N \str_if_eq:onTF { \exp_not:N \__tl_if_novalue:w ? ##1 { } \c_novalue_tl } { ? { } \c_novalue_tl } { \exp_not:N \prg_return_true: } { \exp_not:N \prg_return_false: } } \cs_new:Npn \exp_not:N \__tl_if_novalue:w ##1 \c_novalue_tl {##1} } \cs_new:Npn \tl_if_single_p:N { \exp_args:No \tl_if_single_p:n } \cs_new:Npn \tl_if_single:NT { \exp_args:No \tl_if_single:nT } \cs_new:Npn \tl_if_single:NF { \exp_args:No \tl_if_single:nF } \cs_new:Npn \tl_if_single:NTF { \exp_args:No \tl_if_single:nTF } \prg_new_conditional:Npnn \tl_if_single:n #1 { p , T , F , TF } { \if_catcode:w ^ \exp_after:wN \__tl_if_single:nnw \tl_to_str:n \exp_after:wN { \use_none:nn #1 ?? } ^ ? \q_stop \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \__tl_if_single:nnw #1#2#3 \q_stop {#2} \cs_new:Npn \tl_case:Nn #1#2 { \exp:w \__tl_case:NnTF #1 {#2} { } { } } \cs_new:Npn \tl_case:NnT #1#2#3 { \exp:w \__tl_case:NnTF #1 {#2} {#3} { } } \cs_new:Npn \tl_case:NnF #1#2#3 { \exp:w \__tl_case:NnTF #1 {#2} { } {#3} } \cs_new:Npn \tl_case:NnTF #1#2 { \exp:w \__tl_case:NnTF #1 {#2} } \cs_new:Npn \__tl_case:NnTF #1#2#3#4 { \__tl_case:Nw #1 #2 #1 { } \q_mark {#3} \q_mark {#4} \q_stop } \cs_new:Npn \__tl_case:Nw #1#2#3 { \tl_if_eq:NNTF #1 #2 { \__tl_case_end:nw {#3} } { \__tl_case:Nw #1 } } \cs_generate_variant:Nn \tl_case:Nn { c } \prg_generate_conditional_variant:Nnn \tl_case:Nn { c } { T , F , TF } \cs_new:Npn \__prg_case_end:nw #1#2#3 \q_mark #4#5 \q_stop { \exp_end: #1 #4 } \cs_new_eq:NN \__tl_case_end:nw \__prg_case_end:nw \cs_new:Npn \tl_map_function:nN #1#2 { \__tl_map_function:Nn #2 #1 \q_recursion_tail \__prg_break_point:Nn \tl_map_break: { } } \cs_new:Npn \tl_map_function:NN { \exp_args:No \tl_map_function:nN } \cs_new:Npn \__tl_map_function:Nn #1#2 { \__quark_if_recursion_tail_break:nN {#2} \tl_map_break: #1 {#2} \__tl_map_function:Nn #1 } \cs_generate_variant:Nn \tl_map_function:NN { c } \cs_new_protected:Npn \tl_map_inline:nn #1#2 { \int_gincr:N \g__prg_map_int \cs_gset_protected:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2} \exp_args:Nc \__tl_map_function:Nn { __prg_map_ \int_use:N \g__prg_map_int :w } #1 \q_recursion_tail \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_new_protected:Npn \tl_map_inline:Nn { \exp_args:No \tl_map_inline:nn } \cs_generate_variant:Nn \tl_map_inline:Nn { c } \cs_new_protected:Npn \tl_map_variable:nNn #1#2#3 { \__tl_map_variable:Nnn #2 {#3} #1 \q_recursion_tail \__prg_break_point:Nn \tl_map_break: { } } \cs_new_protected:Npn \tl_map_variable:NNn { \exp_args:No \tl_map_variable:nNn } \cs_new_protected:Npn \__tl_map_variable:Nnn #1#2#3 { \tl_set:Nn #1 {#3} \__quark_if_recursion_tail_break:NN #1 \tl_map_break: \use:n {#2} \__tl_map_variable:Nnn #1 {#2} } \cs_generate_variant:Nn \tl_map_variable:NNn { c } \cs_new:Npn \tl_map_break: { \__prg_map_break:Nn \tl_map_break: { } } \cs_new:Npn \tl_map_break:n { \__prg_map_break:Nn \tl_map_break: } \cs_generate_variant:Nn \tl_to_str:n { V } \cs_new:Npn \tl_to_str:N #1 { \etex_detokenize:D \exp_after:wN {#1} } \cs_generate_variant:Nn \tl_to_str:N { c } \cs_new:Npn \tl_use:N #1 { \tl_if_exist:NTF #1 {#1} { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } } \cs_generate_variant:Nn \tl_use:N { c } \cs_new:Npn \tl_count:n #1 { \int_eval:n { 0 \tl_map_function:nN {#1} \__tl_count:n } } \cs_new:Npn \tl_count:N #1 { \int_eval:n { 0 \tl_map_function:NN #1 \__tl_count:n } } \cs_new:Npn \__tl_count:n #1 { + 1 } \cs_generate_variant:Nn \tl_count:n { V , o } \cs_generate_variant:Nn \tl_count:N { c } \cs_new:Npn \tl_reverse_items:n #1 { \__tl_reverse_items:nwNwn #1 ? \q_mark \__tl_reverse_items:nwNwn \q_mark \__tl_reverse_items:wn \q_stop { } } \cs_new:Npn \__tl_reverse_items:nwNwn #1 #2 \q_mark #3 #4 \q_stop #5 { #3 #2 \q_mark \__tl_reverse_items:nwNwn \q_mark \__tl_reverse_items:wn \q_stop { {#1} #5 } } \cs_new:Npn \__tl_reverse_items:wn #1 \q_stop #2 { \exp_not:o { \use_none:nn #2 } } \cs_new:Npn \tl_trim_spaces:n #1 { \__tl_trim_spaces:nn { \q_mark #1 } \exp_not:o } \cs_generate_variant:Nn \tl_trim_spaces:n { o } \cs_new_protected:Npn \tl_trim_spaces:N #1 { \tl_set:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } \cs_new_protected:Npn \tl_gtrim_spaces:N #1 { \tl_gset:Nx #1 { \exp_args:No \tl_trim_spaces:n {#1} } } \cs_generate_variant:Nn \tl_trim_spaces:N { c } \cs_generate_variant:Nn \tl_gtrim_spaces:N { c } \cs_set:Npn \__tl_tmp:w #1 { \cs_new:Npn \__tl_trim_spaces:nn ##1 { \__tl_trim_spaces_auxi:w ##1 \q_nil \q_mark #1 { } \q_mark \__tl_trim_spaces_auxii:w \__tl_trim_spaces_auxiii:w #1 \q_nil \__tl_trim_spaces_auxiv:w \q_stop } \cs_new:Npn \__tl_trim_spaces_auxi:w ##1 \q_mark #1 ##2 \q_mark ##3 { ##3 \__tl_trim_spaces_auxi:w \q_mark ##2 \q_mark #1 {##1} } \cs_new:Npn \__tl_trim_spaces_auxii:w \__tl_trim_spaces_auxi:w \q_mark \q_mark ##1 { \__tl_trim_spaces_auxiii:w ##1 } \cs_new:Npn \__tl_trim_spaces_auxiii:w ##1 #1 \q_nil ##2 { ##2 ##1 \q_nil \__tl_trim_spaces_auxiii:w } \cs_new:Npn \__tl_trim_spaces_auxiv:w ##1 \q_nil ##2 \q_stop ##3 { ##3 { \use_none:n ##1 } } } \__tl_tmp:w { ~ } \cs_new:Npn \__tl_act:NNNnn #1#2#3#4#5 { \group_align_safe_begin: \__tl_act_loop:w #5 \q__tl_act_mark \q__tl_act_stop {#4} #1 #2 #3 \__tl_act_result:n { } } \cs_new:Npn \__tl_act_loop:w #1 \q__tl_act_stop { \tl_if_head_is_N_type:nTF {#1} { \__tl_act_normal:NwnNNN } { \tl_if_head_is_group:nTF {#1} { \__tl_act_group:nwnNNN } { \__tl_act_space:wwnNNN } } #1 \q__tl_act_stop } \cs_new:Npn \__tl_act_normal:NwnNNN #1 #2 \q__tl_act_stop #3#4 { \if_meaning:w \q__tl_act_mark #1 \exp_after:wN \__tl_act_end:wn \fi: #4 {#3} #1 \__tl_act_loop:w #2 \q__tl_act_stop {#3} #4 } \cs_new:Npn \__tl_act_end:wn #1 \__tl_act_result:n #2 { \group_align_safe_end: \exp_end: #2 } \cs_new:Npn \__tl_act_group:nwnNNN #1 #2 \q__tl_act_stop #3#4#5 { #5 {#3} {#1} \__tl_act_loop:w #2 \q__tl_act_stop {#3} #4 #5 } \exp_last_unbraced:NNo \cs_new:Npn \__tl_act_space:wwnNNN \c_space_tl #1 \q__tl_act_stop #2#3#4#5 { #5 {#2} \__tl_act_loop:w #1 \q__tl_act_stop {#2} #3 #4 #5 } \cs_new:Npn \__tl_act_output:n #1 #2 \__tl_act_result:n #3 { #2 \__tl_act_result:n { #3 #1 } } \cs_new:Npn \__tl_act_reverse_output:n #1 #2 \__tl_act_result:n #3 { #2 \__tl_act_result:n { #1 #3 } } \cs_new:Npn \tl_reverse:n #1 { \etex_unexpanded:D \exp_after:wN { \exp:w \__tl_act:NNNnn \__tl_reverse_normal:nN \__tl_reverse_group_preserve:nn \__tl_reverse_space:n { } {#1} } } \cs_generate_variant:Nn \tl_reverse:n { o , V } \cs_new:Npn \__tl_reverse_normal:nN #1#2 { \__tl_act_reverse_output:n {#2} } \cs_new:Npn \__tl_reverse_group_preserve:nn #1#2 { \__tl_act_reverse_output:n { {#2} } } \cs_new:Npn \__tl_reverse_space:n #1 { \__tl_act_reverse_output:n { ~ } } \cs_new_protected:Npn \tl_reverse:N #1 { \tl_set:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } \cs_new_protected:Npn \tl_greverse:N #1 { \tl_gset:Nx #1 { \exp_args:No \tl_reverse:n { #1 } } } \cs_generate_variant:Nn \tl_reverse:N { c } \cs_generate_variant:Nn \tl_greverse:N { c } \cs_new:Npn \tl_head:n #1 { \etex_unexpanded:D \if_false: { \fi: \__tl_head_auxi:nw #1 { } \q_stop } } \cs_new:Npn \__tl_head_auxi:nw #1#2 \q_stop { \exp_after:wN \__tl_head_auxii:n \exp_after:wN { \if_false: } \fi: {#1} } \cs_new:Npn \__tl_head_auxii:n #1 { \exp_after:wN \if_meaning:w \exp_after:wN \q_nil \tl_to_str:n \exp_after:wN { \use_none:n #1 } \q_nil \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: {#1} { \if_false: { \fi: \__tl_head_auxi:nw #1 } } } \cs_generate_variant:Nn \tl_head:n { V , v , f } \cs_new:Npn \tl_head:w #1#2 \q_stop {#1} \cs_new:Npn \tl_head:N { \exp_args:No \tl_head:n } \cs_new:Npn \tl_tail:n #1 { \etex_unexpanded:D \tl_if_blank:nTF {#1} { { } } { \exp_after:wN { \use_none:n #1 } } } \cs_generate_variant:Nn \tl_tail:n { V , v , f } \cs_new:Npn \tl_tail:N { \exp_args:No \tl_tail:n } \prg_new_conditional:Npnn \tl_if_head_eq_charcode:nN #1#2 { p , T , F , TF } { \if_charcode:w \exp_not:N #2 \tl_if_head_is_N_type:nTF { #1 ? } { \exp_after:wN \exp_not:N \tl_head:w #1 { ? \use_none:nn } \q_stop } { \str_head:n {#1} } \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \tl_if_head_eq_charcode:nN { f } { p , TF , T , F } \prg_new_conditional:Npnn \tl_if_head_eq_catcode:nN #1 #2 { p , T , F , TF } { \if_catcode:w \exp_not:N #2 \tl_if_head_is_N_type:nTF { #1 ? } { \exp_after:wN \exp_not:N \tl_head:w #1 { ? \use_none:nn } \q_stop } { \tl_if_head_is_group:nTF {#1} { \c_group_begin_token } { \c_space_token } } \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \tl_if_head_eq_meaning:nN #1#2 { p , T , F , TF } { \tl_if_head_is_N_type:nTF { #1 ? } { \__tl_if_head_eq_meaning_normal:nN } { \__tl_if_head_eq_meaning_special:nN } {#1} #2 } \cs_new:Npn \__tl_if_head_eq_meaning_normal:nN #1 #2 { \exp_after:wN \if_meaning:w \tl_head:w #1 { ?? \use_none:nnn } \q_stop #2 \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \__tl_if_head_eq_meaning_special:nN #1 #2 { \if_charcode:w \str_head:n {#1} \exp_not:N #2 \exp_after:wN \use:n \else: \prg_return_false: \exp_after:wN \use_none:n \fi: { \if_catcode:w \exp_not:N #2 \tl_if_head_is_group:nTF {#1} { \c_group_begin_token } { \c_space_token } \prg_return_true: \else: \prg_return_false: \fi: } } \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF } { \if_catcode:w \if_false: { \fi: \__tl_if_head_is_N_type:w ? #1 ~ } \exp_after:wN \use_none:n \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } * * \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \__tl_if_head_is_N_type:w #1 ~ { \tl_if_empty:oTF { \use_none:n #1 } { ^ } { } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } \prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF } { \if_catcode:w \exp_after:wN \use_none:n \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } * * \prg_return_false: \else: \prg_return_true: \fi: } \prg_new_conditional:Npnn \tl_if_head_is_space:n #1 { p , T , F , TF } { \exp:w \if_false: { \fi: \__tl_if_head_is_space:w ? #1 ? ~ } } \cs_new:Npn \__tl_if_head_is_space:w #1 ~ { \tl_if_empty:oTF { \use_none:n #1 } { \exp_after:wN \exp_end: \exp_after:wN \prg_return_true: } { \exp_after:wN \exp_end: \exp_after:wN \prg_return_false: } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } \cs_new:Npn \tl_item:nn #1#2 { \exp_args:Nf \__tl_item:nn { \exp_args:Nf \__tl_item_aux:nn { \int_eval:n {#2} } {#1} } #1 \q_recursion_tail \__prg_break_point: } \cs_new:Npn \__tl_item_aux:nn #1#2 { \int_compare:nNnTF {#1} < 0 { \int_eval:n { \tl_count:n {#2} + 1 + #1 } } {#1} } \cs_new:Npn \__tl_item:nn #1#2 { \__quark_if_recursion_tail_break:nN {#2} \__prg_break: \int_compare:nNnTF {#1} = 1 { \__prg_break:n { \exp_not:n {#2} } } { \exp_args:Nf \__tl_item:nn { \int_eval:n { #1 - 1 } } } } \cs_new:Npn \tl_item:Nn { \exp_args:No \tl_item:nn } \cs_generate_variant:Nn \tl_item:Nn { c } \cs_new_protected:Npn \tl_show:N { \__tl_show:NN \tl_show:n } \cs_generate_variant:Nn \tl_show:N { c } \cs_new_protected:Npn \tl_log:N { \__tl_show:NN \tl_log:n } \cs_generate_variant:Nn \tl_log:N { c } \cs_new_protected:Npn \__tl_show:NN #1#2 { \__kernel_check_defined:NT #2 { \exp_args:Nx #1 { \token_to_str:N #2 = \exp_not:o {#2} } } } \cs_new_protected:Npn \tl_show:n #1 { \iow_wrap:nnnN { >~ \tl_to_str:n {#1} . } { } { } \__tl_show:n } \cs_new_protected:Npn \__tl_show:n #1 { \tl_set:Nf \l__tl_internal_a_tl { \__tl_show:w #1 \q_stop } \__iow_with:Nnn \tex_newlinechar:D { 10 } { \__iow_with:Nnn \tex_errorcontextlines:D { -1 } { \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN { \exp_after:wN \l__tl_internal_a_tl } } } } \cs_new:Npn \__tl_show:w #1 > #2 . \q_stop {#2} \cs_new_protected:Npn \tl_log:n #1 { \iow_wrap:nnnN { > ~ \tl_to_str:n {#1} . } { } { } \iow_log:n } \tl_new:N \g_tmpa_tl \tl_new:N \g_tmpb_tl \tl_new:N \l_tmpa_tl \tl_new:N \l_tmpb_tl \__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_lowercase:D } \cs_new_protected:Npn \tl_to_lowercase:n #1 { \tex_lowercase:D {#1} } \__debug_deprecation:nnNNpn { 2017-12-31 } { \tex_uppercase:D } \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} } %% File: l3str.dtx Copyright (C) 2011-2017 The LaTeX3 Project \group_begin: \cs_set_protected:Npn \__str_tmp:n #1 { \tl_if_blank:nF {#1} { \cs_new_eq:cc { str_ #1 :N } { tl_ #1 :N } \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :N } { c } \__str_tmp:n } } \__str_tmp:n { new } { use } { clear } { gclear } { clear_new } { gclear_new } { } \group_end: \cs_new_eq:NN \str_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \str_gset_eq:NN \tl_gset_eq:NN \cs_generate_variant:Nn \str_set_eq:NN { c , Nc , cc } \cs_generate_variant:Nn \str_gset_eq:NN { c , Nc , cc } \cs_new_eq:NN \str_concat:NNN \tl_concat:NNN \cs_new_eq:NN \str_gconcat:NNN \tl_gconcat:NNN \cs_generate_variant:Nn \str_concat:NNN { ccc } \cs_generate_variant:Nn \str_gconcat:NNN { ccc } \group_begin: \cs_set_protected:Npn \__str_tmp:n #1 { \tl_if_blank:nF {#1} { \cs_new_protected:cpx { str_ #1 :Nn } ##1##2 { \exp_not:c { tl_ #1 :Nx } ##1 { \exp_not:N \tl_to_str:n {##2} } } \exp_args:Nc \cs_generate_variant:Nn { str_ #1 :Nn } { Nx , cn , cx } \__str_tmp:n } } \__str_tmp:n { set } { gset } { const } { put_left } { gput_left } { put_right } { gput_right } { } \group_end: \cs_new_protected:Npn \str_replace_once:Nnn { \__str_replace:NNNnn \prg_do_nothing: \tl_set:Nx } \cs_new_protected:Npn \str_greplace_once:Nnn { \__str_replace:NNNnn \prg_do_nothing: \tl_gset:Nx } \cs_new_protected:Npn \str_replace_all:Nnn { \__str_replace:NNNnn \__str_replace_next:w \tl_set:Nx } \cs_new_protected:Npn \str_greplace_all:Nnn { \__str_replace:NNNnn \__str_replace_next:w \tl_gset:Nx } \cs_generate_variant:Nn \str_replace_once:Nnn { c } \cs_generate_variant:Nn \str_greplace_once:Nnn { c } \cs_generate_variant:Nn \str_replace_all:Nnn { c } \cs_generate_variant:Nn \str_greplace_all:Nnn { c } \cs_new_protected:Npn \__str_replace:NNNnn #1#2#3#4#5 { \tl_if_empty:nTF {#4} { \__msg_kernel_error:nnx { kernel } { empty-search-pattern } {#5} } { \use:x { \exp_not:n { \__str_replace_aux:NNNnnn #1 #2 #3 } { \tl_to_str:N #3 } { \tl_to_str:n {#4} } { \tl_to_str:n {#5} } } } } \cs_new_protected:Npn \__str_replace_aux:NNNnnn #1#2#3#4#5#6 { \cs_set:Npn \__str_replace_next:w ##1 #5 { ##1 #6 #1 } #2 #3 { \__str_replace_next:w #4 \use_none_delimit_by_q_stop:w #5 \q_stop } } \cs_new_eq:NN \__str_replace_next:w ? \cs_new_protected:Npn \str_remove_once:Nn #1#2 { \str_replace_once:Nnn #1 {#2} { } } \cs_new_protected:Npn \str_gremove_once:Nn #1#2 { \str_greplace_once:Nnn #1 {#2} { } } \cs_generate_variant:Nn \str_remove_once:Nn { c } \cs_generate_variant:Nn \str_gremove_once:Nn { c } \cs_new_protected:Npn \str_remove_all:Nn #1#2 { \str_replace_all:Nnn #1 {#2} { } } \cs_new_protected:Npn \str_gremove_all:Nn #1#2 { \str_greplace_all:Nnn #1 {#2} { } } \cs_generate_variant:Nn \str_remove_all:Nn { c } \cs_generate_variant:Nn \str_gremove_all:Nn { c } \prg_new_eq_conditional:NNn \str_if_exist:N \tl_if_exist:N { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_exist:c \tl_if_exist:c { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_empty:N \tl_if_empty:N { p , T , F , TF } \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c { p , T , F , TF } \cs_new:Npn \__str_if_eq_x:nn #1#2 { \pdftex_strcmp:D {#1} {#2} } \cs_if_exist:NT \luatex_luatexversion:D { \cs_set:Npn \__str_if_eq_x:nn #1#2 { \luatex_directlua:D { l3kernel.strcmp ( " \__str_escape_x:n {#1} " , " \__str_escape_x:n {#2} " ) } } \cs_new:Npn \__str_escape_x:n #1 { \luatex_luaescapestring:D { \etex_detokenize:D \exp_after:wN { \luatex_expanded:D {#1} } } } } \cs_new:Npn \__str_if_eq_x_return:nn #1 #2 { \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \str_if_eq:nn #1#2 { p , T , F , TF } { \if_int_compare:w \__str_if_eq_x:nn { \exp_not:n {#1} } { \exp_not:n {#2} } = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \str_if_eq:nn { V , o , nV , no , VV } { p , T , F , TF } \prg_new_conditional:Npnn \str_if_eq_x:nn #1#2 { p , T , F , TF } { \if_int_compare:w \__str_if_eq_x:nn {#1} {#2} = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \str_if_eq:NN #1#2 { p , TF , T , F } { \if_int_compare:w \__str_if_eq_x:nn { \tl_to_str:N #1 } { \tl_to_str:N #2 } = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \str_if_eq:NN { c , Nc , cc } { T , F , TF , p } \prg_new_protected_conditional:Npnn \str_if_in:Nn #1#2 { T , F , TF } { \use:x { \tl_if_in:nnTF { \tl_to_str:N #1 } { \tl_to_str:n {#2} } } { \prg_return_true: } { \prg_return_false: } } \prg_generate_conditional_variant:Nnn \str_if_in:Nn { c } { T , F , TF } \prg_new_protected_conditional:Npnn \str_if_in:nn #1#2 { T , F , TF } { \use:x { \tl_if_in:nnTF { \tl_to_str:n {#1} } { \tl_to_str:n {#2} } } { \prg_return_true: } { \prg_return_false: } } \cs_new:Npn \str_case:nn #1#2 { \exp:w \__str_case:nnTF {#1} {#2} { } { } } \cs_new:Npn \str_case:nnT #1#2#3 { \exp:w \__str_case:nnTF {#1} {#2} {#3} { } } \cs_new:Npn \str_case:nnF #1#2 { \exp:w \__str_case:nnTF {#1} {#2} { } } \cs_new:Npn \str_case:nnTF #1#2 { \exp:w \__str_case:nnTF {#1} {#2} } \cs_new:Npn \__str_case:nnTF #1#2#3#4 { \__str_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } \cs_generate_variant:Nn \str_case:nn { o , nV , nv } \prg_generate_conditional_variant:Nnn \str_case:nn { o , nV , nv } { T , F , TF } \cs_new:Npn \__str_case:nw #1#2#3 { \str_if_eq:nnTF {#1} {#2} { \__str_case_end:nw {#3} } { \__str_case:nw {#1} } } \cs_new:Npn \str_case_x:nn #1#2 { \exp:w \__str_case_x:nnTF {#1} {#2} { } { } } \cs_new:Npn \str_case_x:nnT #1#2#3 { \exp:w \__str_case_x:nnTF {#1} {#2} {#3} { } } \cs_new:Npn \str_case_x:nnF #1#2 { \exp:w \__str_case_x:nnTF {#1} {#2} { } } \cs_new:Npn \str_case_x:nnTF #1#2 { \exp:w \__str_case_x:nnTF {#1} {#2} } \cs_new:Npn \__str_case_x:nnTF #1#2#3#4 { \__str_case_x:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } \cs_new:Npn \__str_case_x:nw #1#2#3 { \str_if_eq_x:nnTF {#1} {#2} { \__str_case_end:nw {#3} } { \__str_case_x:nw {#1} } } \cs_new_eq:NN \__str_case_end:nw \__prg_case_end:nw \cs_new:Npn \str_map_function:nN #1#2 { \exp_after:wN \__str_map_function:w \exp_after:wN \__str_map_function:Nn \exp_after:wN #2 \etex_detokenize:D {#1} \q_recursion_tail ? ~ \__prg_break_point:Nn \str_map_break: { } } \cs_new:Npn \str_map_function:NN { \exp_args:No \str_map_function:nN } \cs_new:Npn \__str_map_function:w #1 ~ { #1 { ~ { ~ } \__str_map_function:w } } \cs_new:Npn \__str_map_function:Nn #1#2 { \if_meaning:w \q_recursion_tail #2 \exp_after:wN \str_map_break: \fi: #1 #2 \__str_map_function:Nn #1 } \cs_generate_variant:Nn \str_map_function:NN { c } \cs_new_protected:Npn \str_map_inline:nn #1#2 { \int_gincr:N \g__prg_map_int \cs_gset_protected:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2} \use:x { \exp_not:N \__str_map_inline:NN \exp_not:c { __prg_map_ \int_use:N \g__prg_map_int :w } \__str_to_other_fast:n {#1} } \q_recursion_tail \__prg_break_point:Nn \str_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_new_protected:Npn \str_map_inline:Nn { \exp_args:No \str_map_inline:nn } \cs_generate_variant:Nn \str_map_inline:Nn { c } \cs_new:Npn \__str_map_inline:NN #1#2 { \__quark_if_recursion_tail_break:NN #2 \str_map_break: \exp_args:No #1 { \token_to_str:N #2 } \__str_map_inline:NN #1 } \cs_new_protected:Npn \str_map_variable:nNn #1#2#3 { \use:x { \exp_not:n { \__str_map_variable:NnN #2 {#3} } \__str_to_other_fast:n {#1} } \q_recursion_tail \__prg_break_point:Nn \str_map_break: { } } \cs_new_protected:Npn \str_map_variable:NNn { \exp_args:No \str_map_variable:nNn } \cs_new_protected:Npn \__str_map_variable:NnN #1#2#3 { \__quark_if_recursion_tail_break:NN #3 \str_map_break: \str_set:Nn #1 {#3} \use:n {#2} \__str_map_variable:NnN #1 {#2} } \cs_generate_variant:Nn \str_map_variable:NNn { c } \cs_new:Npn \str_map_break: { \__prg_map_break:Nn \str_map_break: { } } \cs_new:Npn \str_map_break:n { \__prg_map_break:Nn \str_map_break: } \cs_new:Npn \__str_to_other:n #1 { \exp_after:wN \__str_to_other_loop:w \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_mark \q_stop } \group_begin: \tex_lccode:D `\* = `\ % \tex_lccode:D `\A = `\A % \tex_lowercase:D { \group_end: \cs_new:Npn \__str_to_other_loop:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 \q_stop { \if_meaning:w A #8 \__str_to_other_end:w \fi: \__str_to_other_loop:w #9 #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * \q_stop } \cs_new:Npn \__str_to_other_end:w \fi: #1 \q_mark #2 * A #3 \q_stop { \fi: #2 } } \cs_new:Npn \__str_to_other_fast:n #1 { \exp_after:wN \__str_to_other_fast_loop:w \tl_to_str:n {#1} ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ \q_stop } \group_begin: \tex_lccode:D `\* = `\ % \tex_lccode:D `\A = `\A % \tex_lowercase:D { \group_end: \cs_new:Npn \__str_to_other_fast_loop:w #1 ~ #2 ~ #3 ~ #4 ~ #5 ~ #6 ~ #7 ~ #8 ~ #9 ~ { \if_meaning:w A #9 \__str_to_other_fast_end:w \fi: #1 * #2 * #3 * #4 * #5 * #6 * #7 * #8 * #9 \__str_to_other_fast_loop:w * } \cs_new:Npn \__str_to_other_fast_end:w #1 * A #2 \q_stop {#1} } \cs_new:Npn \str_item:Nn { \exp_args:No \str_item:nn } \cs_generate_variant:Nn \str_item:Nn { c } \cs_new:Npn \str_item:nn #1#2 { \exp_args:Nf \tl_to_str:n { \exp_args:Nf \__str_item:nn { \__str_to_other:n {#1} } {#2} } } \cs_new:Npn \str_item_ignore_spaces:nn #1 { \exp_args:No \__str_item:nn { \tl_to_str:n {#1} } } \__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } } \cs_new:Npn \__str_item:nn #1#2 { \exp_after:wN \__str_item:w \__int_value:w \__int_eval:w #2 \exp_after:wN ; \__int_value:w \__str_count:n {#1} ; #1 \q_stop } \cs_new:Npn \__str_item:w #1; #2; { \int_compare:nNnTF {#1} < 0 { \int_compare:nNnTF {#1} < {-#2} { \use_none_delimit_by_q_stop:w } { \exp_after:wN \use_i_delimit_by_q_stop:nw \exp:w \exp_after:wN \__str_skip_exp_end:w \__int_value:w \__int_eval:w #1 + #2 ; } } { \int_compare:nNnTF {#1} > {#2} { \use_none_delimit_by_q_stop:w } { \exp_after:wN \use_i_delimit_by_q_stop:nw \exp:w \__str_skip_exp_end:w #1 ; { } } } } \cs_new:Npn \__str_skip_exp_end:w #1; { \if_int_compare:w #1 > 8 \exp_stop_f: \exp_after:wN \__str_skip_loop:wNNNNNNNN \else: \exp_after:wN \__str_skip_end:w \__int_value:w \__int_eval:w \fi: #1 ; } \cs_new:Npn \__str_skip_loop:wNNNNNNNN #1; #2#3#4#5#6#7#8#9 { \exp_after:wN \__str_skip_exp_end:w \__int_value:w \__int_eval:w #1 - 8 ; } \cs_new:Npn \__str_skip_end:w #1 ; { \exp_after:wN \__str_skip_end:NNNNNNNN \if_case:w #1 \exp_stop_f: \or: \or: \or: \or: \or: \or: \or: \or: } \cs_new:Npn \__str_skip_end:NNNNNNNN #1#2#3#4#5#6#7#8 { \fi: \exp_end: } \cs_new:Npn \str_range:Nnn { \exp_args:No \str_range:nnn } \cs_generate_variant:Nn \str_range:Nnn { c } \cs_new:Npn \str_range:nnn #1#2#3 { \exp_args:Nf \tl_to_str:n { \exp_args:Nf \__str_range:nnn { \__str_to_other:n {#1} } {#2} {#3} } } \cs_new:Npn \str_range_ignore_spaces:nnn #1 { \exp_args:No \__str_range:nnn { \tl_to_str:n {#1} } } \__debug_patch_args:nNNpn { {#1} { \__int_eval:n {#2} } { \__int_eval:n {#3} } } \cs_new:Npn \__str_range:nnn #1#2#3 { \exp_after:wN \__str_range:w \__int_value:w \__str_count:n {#1} \exp_after:wN ; \__int_value:w \__int_eval:w #2 - 1 \exp_after:wN ; \__int_value:w \__int_eval:w #3 ; #1 \q_stop } \cs_new:Npn \__str_range:w #1; #2; #3; { \exp_args:Nf \__str_range:nnw { \__str_range_normalize:nn {#2} {#1} } { \__str_range_normalize:nn {#3} {#1} } } \cs_new:Npn \__str_range:nnw #1#2 { \exp_after:wN \__str_collect_delimit_by_q_stop:w \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ; \exp:w \__str_skip_exp_end:w #1 ; } \cs_new:Npn \__str_range_normalize:nn #1#2 { \int_eval:n { \if_int_compare:w #1 < 0 \exp_stop_f: \if_int_compare:w #1 < -#2 \exp_stop_f: 0 \else: #1 + #2 + 1 \fi: \else: \if_int_compare:w #1 < #2 \exp_stop_f: #1 \else: #2 \fi: \fi: } } \cs_new:Npn \__str_collect_delimit_by_q_stop:w #1; { \__str_collect_loop:wn #1 ; { } } \cs_new:Npn \__str_collect_loop:wn #1 ; { \if_int_compare:w #1 > 7 \exp_stop_f: \exp_after:wN \__str_collect_loop:wnNNNNNNN \else: \exp_after:wN \__str_collect_end:wn \fi: #1 ; } \cs_new:Npn \__str_collect_loop:wnNNNNNNN #1; #2 #3#4#5#6#7#8#9 { \exp_after:wN \__str_collect_loop:wn \__int_value:w \__int_eval:w #1 - 7 ; { #2 #3#4#5#6#7#8#9 } } \cs_new:Npn \__str_collect_end:wn #1 ; { \exp_after:wN \__str_collect_end:nnnnnnnnw \if_case:w \if_int_compare:w #1 > 0 \exp_stop_f: #1 \else: 0 \fi: \exp_stop_f: \or: \or: \or: \or: \or: \or: \fi: } \cs_new:Npn \__str_collect_end:nnnnnnnnw #1#2#3#4#5#6#7#8 #9 \q_stop { #1#2#3#4#5#6#7#8 } \cs_new:Npn \str_count_spaces:N { \exp_args:No \str_count_spaces:n } \cs_generate_variant:Nn \str_count_spaces:N { c } \cs_new:Npn \str_count_spaces:n #1 { \int_eval:n { \exp_after:wN \__str_count_spaces_loop:w \tl_to_str:n {#1} ~ X 7 ~ X 6 ~ X 5 ~ X 4 ~ X 3 ~ X 2 ~ X 1 ~ X 0 ~ X -1 ~ \q_stop } } \cs_new:Npn \__str_count_spaces_loop:w #1~#2~#3~#4~#5~#6~#7~#8~#9~ { \if_meaning:w X #9 \use_i_delimit_by_q_stop:nw \fi: 9 + \__str_count_spaces_loop:w } \cs_new:Npn \str_count:N { \exp_args:No \str_count:n } \cs_generate_variant:Nn \str_count:N { c } \cs_new:Npn \str_count:n #1 { \__str_count_aux:n { \str_count_spaces:n {#1} + \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1} } } \cs_new:Npn \__str_count:n #1 { \__str_count_aux:n { \__str_count_loop:NNNNNNNNN #1 } } \cs_new:Npn \str_count_ignore_spaces:n #1 { \__str_count_aux:n { \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1} } } \cs_new:Npn \__str_count_aux:n #1 { \int_eval:n { #1 { X 8 } { X 7 } { X 6 } { X 5 } { X 4 } { X 3 } { X 2 } { X 1 } { X 0 } \q_stop } } \cs_new:Npn \__str_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9 { \if_meaning:w X #9 \exp_after:wN \use_none_delimit_by_q_stop:w \fi: 9 + \__str_count_loop:NNNNNNNNN } \cs_new:Npn \str_head:N { \exp_args:No \str_head:n } \cs_generate_variant:Nn \str_head:N { c } \cs_new:Npn \str_head:n #1 { \exp_after:wN \__str_head:w \tl_to_str:n {#1} { { } } ~ \q_stop } \cs_new:Npn \__str_head:w #1 ~ % { \use_i_delimit_by_q_stop:nw #1 { ~ } } \cs_new:Npn \str_head_ignore_spaces:n #1 { \exp_after:wN \use_i_delimit_by_q_stop:nw \tl_to_str:n {#1} { } \q_stop } \cs_new:Npn \str_tail:N { \exp_args:No \str_tail:n } \cs_generate_variant:Nn \str_tail:N { c } \cs_new:Npn \str_tail:n #1 { \exp_after:wN \__str_tail_auxi:w \reverse_if:N \if_charcode:w \scan_stop: \tl_to_str:n {#1} X X \q_stop } \cs_new:Npn \__str_tail_auxi:w #1 X #2 \q_stop { \fi: #1 } \cs_new:Npn \str_tail_ignore_spaces:n #1 { \exp_after:wN \__str_tail_auxii:w \tl_to_str:n {#1} \q_mark \q_mark \q_stop } \cs_new:Npn \__str_tail_auxii:w #1 #2 \q_mark #3 \q_stop { #2 } \cs_new:Npn \str_fold_case:n #1 { \__str_change_case:nn {#1} { fold } } \cs_new:Npn \str_lower_case:n #1 { \__str_change_case:nn {#1} { lower } } \cs_new:Npn \str_upper_case:n #1 { \__str_change_case:nn {#1} { upper } } \cs_generate_variant:Nn \str_fold_case:n { V } \cs_generate_variant:Nn \str_lower_case:n { f } \cs_generate_variant:Nn \str_upper_case:n { f } \cs_new:Npn \__str_change_case:nn #1 { \exp_after:wN \__str_change_case_aux:nn \exp_after:wN { \tl_to_str:n {#1} } } \cs_new:Npn \__str_change_case_aux:nn #1#2 { \__str_change_case_loop:nw {#2} #1 \q_recursion_tail \q_recursion_stop \__str_change_case_result:n { } } \cs_new:Npn \__str_change_case_output:nw #1#2 \__str_change_case_result:n #3 { #2 \__str_change_case_result:n { #3 #1 } } \cs_generate_variant:Nn \__str_change_case_output:nw { f } \cs_new:Npn \__str_change_case_end:wn #1 \__str_change_case_result:n #2 { #2 } \cs_new:Npn \__str_change_case_loop:nw #1#2 \q_recursion_stop { \tl_if_head_is_space:nTF {#2} { \__str_change_case_space:n } { \__str_change_case_char:nN } {#1} #2 \q_recursion_stop } \use:x { \cs_new:Npn \exp_not:N \__str_change_case_space:n ##1 \c_space_tl } { \__str_change_case_output:nw { ~ } \__str_change_case_loop:nw {#1} } \cs_new:Npn \__str_change_case_char:nN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \__str_change_case_end:wn } \cs_if_exist:cTF { c__unicode_ #1 _ #2 _tl } { \__str_change_case_output:fw { \tl_to_str:c { c__unicode_ #1 _ #2 _tl } } } { \__str_change_case_char_aux:nN {#1} #2 } \__str_change_case_loop:nw {#1} } \cs_if_exist:NTF \utex_char:D { \cs_new:Npn \__str_change_case_char_aux:nN #1#2 { \int_compare:nNnTF { \use:c { __str_lookup_ #1 :N } #2 } = { 0 } { \__str_change_case_output:nw {#2} } { \__str_change_case_output:fw { \utex_char:D \use:c { __str_lookup_ #1 :N } #2 ~ } } } \cs_new_protected:Npn \__str_lookup_lower:N #1 { \tex_lccode:D `#1 } \cs_new_protected:Npn \__str_lookup_upper:N #1 { \tex_uccode:D `#1 } \cs_new_eq:NN \__str_lookup_fold:N \__str_lookup_lower:N } { \cs_new:Npn \__str_change_case_char_aux:nN #1#2 { \__str_change_case_output:nw {#2} } } \str_const:Nx \c_ampersand_str { \cs_to_str:N \& } \str_const:Nx \c_atsign_str { \cs_to_str:N \@ } \str_const:Nx \c_backslash_str { \cs_to_str:N \\ } \str_const:Nx \c_left_brace_str { \cs_to_str:N \{ } \str_const:Nx \c_right_brace_str { \cs_to_str:N \} } \str_const:Nx \c_circumflex_str { \cs_to_str:N \^ } \str_const:Nx \c_colon_str { \cs_to_str:N \: } \str_const:Nx \c_dollar_str { \cs_to_str:N \$ } \str_const:Nx \c_hash_str { \cs_to_str:N \# } \str_const:Nx \c_percent_str { \cs_to_str:N \% } \str_const:Nx \c_tilde_str { \cs_to_str:N \~ } \str_const:Nx \c_underscore_str { \cs_to_str:N \_ } \str_new:N \l_tmpa_str \str_new:N \l_tmpb_str \str_new:N \g_tmpa_str \str_new:N \g_tmpb_str \cs_new_eq:NN \str_show:n \tl_show:n \cs_new_eq:NN \str_show:N \tl_show:N \cs_generate_variant:Nn \str_show:N { c } \group_begin: \tex_chardef:D \g__unicode_data_ior \etex_numexpr:D \cs_if_exist:NTF \lastallocatedread { \lastallocatedread } { \cs_if_exist:NTF \c_syst_last_allocated_read { \c_syst_last_allocated_read } { \tex_count:D 16 ~ } } + 1 \scan_stop: \cs_set_protected:Npn \__unicode_map_inline:n #1 { \group_begin: \tex_catcode:D `\# = 12 \scan_stop: \tex_catcode:D `\ = 10 \scan_stop: \tex_openin:D \g__unicode_data_ior = #1 \scan_stop: \cs_if_exist:NT \utex_char:D { \__unicode_map_loop: } \tex_closein:D \g__unicode_data_ior \group_end: } \cs_set_protected:Npn \__unicode_map_loop: { \tex_ifeof:D \g__unicode_data_ior \exp_after:wN \use_none:n \else: \exp_after:wN \use:n \fi: { \tex_read:D \g__unicode_data_ior to \l__unicode_tmp_tl \if_meaning:w \c_empty_tl \l__unicode_tmp_tl \else: \exp_after:wN \__unicode_parse:w \l__unicode_tmp_tl \q_stop \fi: \__unicode_map_loop: } } \cs_set_protected:Npn \__unicode_parse:w #1#2 \q_stop { \reverse_if:N \if:w \c_hash_str #1 \__unicode_parse_auxi:w #1#2 \q_stop \else: \if_int_compare:w \__str_if_eq_x:nn { \exp_not:n {#2} } { ~Conditional~Mappings~ } = 0 \exp_stop_f: \cs_set_protected:Npn \__unicode_parse:w ##1 \q_stop { } \fi: \fi: } \cs_set_protected:Npn \__unicode_store:nnnnn #1#2#3#4#5 { \tl_const:cx { c__unicode_ #2 _ \utex_char:D "#1 _tl } { \utex_char:D "#3 ~ \utex_char:D "#4 ~ \tl_if_blank:nF {#5} { \utex_char:D "#5 } } } \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ; { \__unicode_parse_auxii:w #1 ; } \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop { \tl_if_blank:nF {#7} { \if_int_compare:w \__str_if_eq_x:nn { #5 ~ } {#7} = 0 \exp_stop_f: \else: \tl_const:cx { c__unicode_mixed_ \utex_char:D "#1 _tl } { \utex_char:D "#7 } \fi: } } \__unicode_map_inline:n { UnicodeData.txt } \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ; #4 \q_stop { \if_int_compare:w \__str_if_eq_x:nn {#2} { C } = 0 \exp_stop_f: \if_int_compare:w \tex_lccode:D "#1 = "#3 \scan_stop: \else: \tl_const:cx { c__unicode_fold_ \utex_char:D "#1 _tl } { \utex_char:D "#3 ~ } \fi: \else: \if_int_compare:w \__str_if_eq_x:nn {#2} { F } = 0 \exp_stop_f: \__unicode_parse_auxii:w #1 ~ #3 ~ \q_stop \fi: \fi: } \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 \q_stop { \__unicode_store:nnnnn {#1} { fold } {#2} {#3} {#4} } \__unicode_map_inline:n { CaseFolding.txt } \cs_set_protected:Npn \__unicode_parse_auxi:w #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop { \use:n { \__unicode_parse_auxii:w #1 ~ lower ~ #2 ~ } ~ \q_stop \use:n { \__unicode_parse_auxii:w #1 ~ upper ~ #4 ~ } ~ \q_stop \if_int_compare:w \__str_if_eq_x:nn {#3} {#4} = 0 \exp_stop_f: \else: \use:n { \__unicode_parse_auxii:w #1 ~ mixed ~ #3 ~ } ~ \q_stop \fi: } \cs_set_protected:Npn \__unicode_parse_auxii:w #1 ~ #2 ~ #3 ~ #4 ~ #5 \q_stop { \tl_if_empty:nF {#4} { \__unicode_store:nnnnn {#1} {#2} {#3} {#4} {#5} } } \__unicode_map_inline:n { SpecialCasing.txt } \cs_if_exist:NF \utex_char:D { \cs_set_protected:Npn \__unicode_tmp:NN #1#2 { \if_meaning:w \q_recursion_tail #2 \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: \tl_const:cn { c__unicode_fold_ #1 _tl } {#2} \tl_const:cn { c__unicode_lower_ #1 _tl } {#2} \tl_const:cn { c__unicode_upper_ #2 _tl } {#1} \__unicode_tmp:NN } \__unicode_tmp:NN AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz ? \q_recursion_tail \q_recursion_stop } \group_end: %% File: l3seq.dtx Copyright (C) 1990-2017 The LaTeX3 Project \cs_new:Npn \__seq_item:n { \__msg_kernel_expandable_error:nn { kernel } { misused-sequence } \use_none:n } \tl_new:N \l__seq_internal_a_tl \tl_new:N \l__seq_internal_b_tl \cs_new_eq:NN \__seq_tmp:w ? \tl_const:Nn \c_empty_seq { \s__seq } \cs_new_protected:Npn \seq_new:N #1 { \__chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_empty_seq } \cs_generate_variant:Nn \seq_new:N { c } \cs_new_protected:Npn \seq_clear:N #1 { \seq_set_eq:NN #1 \c_empty_seq } \cs_generate_variant:Nn \seq_clear:N { c } \cs_new_protected:Npn \seq_gclear:N #1 { \seq_gset_eq:NN #1 \c_empty_seq } \cs_generate_variant:Nn \seq_gclear:N { c } \cs_new_protected:Npn \seq_clear_new:N #1 { \seq_if_exist:NTF #1 { \seq_clear:N #1 } { \seq_new:N #1 } } \cs_generate_variant:Nn \seq_clear_new:N { c } \cs_new_protected:Npn \seq_gclear_new:N #1 { \seq_if_exist:NTF #1 { \seq_gclear:N #1 } { \seq_new:N #1 } } \cs_generate_variant:Nn \seq_gclear_new:N { c } \cs_new_eq:NN \seq_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \seq_set_eq:Nc \tl_set_eq:Nc \cs_new_eq:NN \seq_set_eq:cN \tl_set_eq:cN \cs_new_eq:NN \seq_set_eq:cc \tl_set_eq:cc \cs_new_eq:NN \seq_gset_eq:NN \tl_gset_eq:NN \cs_new_eq:NN \seq_gset_eq:Nc \tl_gset_eq:Nc \cs_new_eq:NN \seq_gset_eq:cN \tl_gset_eq:cN \cs_new_eq:NN \seq_gset_eq:cc \tl_gset_eq:cc \cs_new_protected:Npn \seq_set_from_clist:NN #1#2 { \tl_set:Nx #1 { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_set_from_clist:Nn #1#2 { \tl_set:Nx #1 { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:NN #1#2 { \tl_gset:Nx #1 { \s__seq \clist_map_function:NN #2 \__seq_wrap_item:n } } \cs_new_protected:Npn \seq_gset_from_clist:Nn #1#2 { \tl_gset:Nx #1 { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n } } \cs_generate_variant:Nn \seq_set_from_clist:NN { Nc } \cs_generate_variant:Nn \seq_set_from_clist:NN { c , cc } \cs_generate_variant:Nn \seq_set_from_clist:Nn { c } \cs_generate_variant:Nn \seq_gset_from_clist:NN { Nc } \cs_generate_variant:Nn \seq_gset_from_clist:NN { c , cc } \cs_generate_variant:Nn \seq_gset_from_clist:Nn { c } \cs_new_protected:Npn \seq_set_split:Nnn { \__seq_set_split:NNnn \tl_set:Nx } \cs_new_protected:Npn \seq_gset_split:Nnn { \__seq_set_split:NNnn \tl_gset:Nx } \cs_new_protected:Npn \__seq_set_split:NNnn #1#2#3#4 { \tl_if_empty:nTF {#3} { \tl_set:Nn \l__seq_internal_a_tl { \tl_map_function:nN {#4} \__seq_wrap_item:n } } { \tl_set:Nn \l__seq_internal_a_tl { \__seq_set_split_auxi:w \prg_do_nothing: #4 \__seq_set_split_end: } \tl_replace_all:Nnn \l__seq_internal_a_tl { #3 } { \__seq_set_split_end: \__seq_set_split_auxi:w \prg_do_nothing: } \tl_set:Nx \l__seq_internal_a_tl { \l__seq_internal_a_tl } } #1 #2 { \s__seq \l__seq_internal_a_tl } } \cs_new:Npn \__seq_set_split_auxi:w #1 \__seq_set_split_end: { \exp_not:N \__seq_set_split_auxii:w \exp_args:No \tl_trim_spaces:n {#1} \exp_not:N \__seq_set_split_end: } \cs_new:Npn \__seq_set_split_auxii:w #1 \__seq_set_split_end: { \__seq_wrap_item:n {#1} } \cs_generate_variant:Nn \seq_set_split:Nnn { NnV } \cs_generate_variant:Nn \seq_gset_split:Nnn { NnV } \cs_new_protected:Npn \seq_concat:NNN #1#2#3 { \tl_set:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } } \cs_new_protected:Npn \seq_gconcat:NNN #1#2#3 { \tl_gset:Nf #1 { \exp_after:wN \use_i:nn \exp_after:wN #2 #3 } } \cs_generate_variant:Nn \seq_concat:NNN { ccc } \cs_generate_variant:Nn \seq_gconcat:NNN { ccc } \prg_new_eq_conditional:NNn \seq_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \seq_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_new_protected:Npn \seq_put_left:Nn #1#2 { \tl_set:Nx #1 { \exp_not:n { \s__seq \__seq_item:n {#2} } \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 } } } \cs_new_protected:Npn \seq_gput_left:Nn #1#2 { \tl_gset:Nx #1 { \exp_not:n { \s__seq \__seq_item:n {#2} } \exp_not:f { \exp_after:wN \__seq_put_left_aux:w #1 } } } \cs_new:Npn \__seq_put_left_aux:w \s__seq { \exp_stop_f: } \cs_generate_variant:Nn \seq_put_left:Nn { NV , Nv , No , Nx } \cs_generate_variant:Nn \seq_put_left:Nn { c , cV , cv , co , cx } \cs_generate_variant:Nn \seq_gput_left:Nn { NV , Nv , No , Nx } \cs_generate_variant:Nn \seq_gput_left:Nn { c , cV , cv , co , cx } \cs_new_protected:Npn \seq_put_right:Nn #1#2 { \tl_put_right:Nn #1 { \__seq_item:n {#2} } } \cs_new_protected:Npn \seq_gput_right:Nn #1#2 { \tl_gput_right:Nn #1 { \__seq_item:n {#2} } } \cs_generate_variant:Nn \seq_gput_right:Nn { NV , Nv , No , Nx } \cs_generate_variant:Nn \seq_gput_right:Nn { c , cV , cv , co , cx } \cs_generate_variant:Nn \seq_put_right:Nn { NV , Nv , No , Nx } \cs_generate_variant:Nn \seq_put_right:Nn { c , cV , cv , co , cx } \cs_new:Npn \__seq_wrap_item:n #1 { \exp_not:n { \__seq_item:n {#1} } } \seq_new:N \l__seq_remove_seq \cs_new_protected:Npn \seq_remove_duplicates:N { \__seq_remove_duplicates:NN \seq_set_eq:NN } \cs_new_protected:Npn \seq_gremove_duplicates:N { \__seq_remove_duplicates:NN \seq_gset_eq:NN } \cs_new_protected:Npn \__seq_remove_duplicates:NN #1#2 { \seq_clear:N \l__seq_remove_seq \seq_map_inline:Nn #2 { \seq_if_in:NnF \l__seq_remove_seq {##1} { \seq_put_right:Nn \l__seq_remove_seq {##1} } } #1 #2 \l__seq_remove_seq } \cs_generate_variant:Nn \seq_remove_duplicates:N { c } \cs_generate_variant:Nn \seq_gremove_duplicates:N { c } \cs_new_protected:Npn \seq_remove_all:Nn { \__seq_remove_all_aux:NNn \tl_set:Nx } \cs_new_protected:Npn \seq_gremove_all:Nn { \__seq_remove_all_aux:NNn \tl_gset:Nx } \cs_new_protected:Npn \__seq_remove_all_aux:NNn #1#2#3 { \__seq_push_item_def:n { \str_if_eq:nnT {##1} {#3} { \if_false: { \fi: } \tl_set:Nn \l__seq_internal_b_tl {##1} #1 #2 { \if_false: } \fi: \exp_not:o {#2} \tl_if_eq:NNT \l__seq_internal_a_tl \l__seq_internal_b_tl { \use_none:nn } } \__seq_wrap_item:n {##1} } \tl_set:Nn \l__seq_internal_a_tl {#3} #1 #2 {#2} \__seq_pop_item_def: } \cs_generate_variant:Nn \seq_remove_all:Nn { c } \cs_generate_variant:Nn \seq_gremove_all:Nn { c } \cs_new_protected:Npn \seq_reverse:N { \__seq_reverse:NN \tl_set:Nx } \cs_new_protected:Npn \seq_greverse:N { \__seq_reverse:NN \tl_gset:Nx } \cs_new_protected:Npn \__seq_reverse:NN #1 #2 { \cs_set_eq:NN \__seq_tmp:w \__seq_item:n \cs_set_eq:NN \__seq_item:n \__seq_reverse_item:nwn #1 #2 { #2 \exp_not:n { } } \cs_set_eq:NN \__seq_item:n \__seq_tmp:w } \cs_new:Npn \__seq_reverse_item:nwn #1 #2 \exp_not:n #3 { #2 \exp_not:n { \__seq_item:n {#1} #3 } } \cs_generate_variant:Nn \seq_reverse:N { c } \cs_generate_variant:Nn \seq_greverse:N { c } \prg_new_conditional:Npnn \seq_if_empty:N #1 { p , T , F , TF } { \if_meaning:w #1 \c_empty_seq \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \seq_if_empty:N { c } { p , T , F , TF } \prg_new_protected_conditional:Npnn \seq_if_in:Nn #1#2 { T , F , TF } { \group_begin: \tl_set:Nn \l__seq_internal_a_tl {#2} \cs_set_protected:Npn \__seq_item:n ##1 { \tl_set:Nn \l__seq_internal_b_tl {##1} \if_meaning:w \l__seq_internal_a_tl \l__seq_internal_b_tl \exp_after:wN \__seq_if_in: \fi: } #1 \group_end: \prg_return_false: \__prg_break_point: } \cs_new:Npn \__seq_if_in: { \__prg_break:n { \group_end: \prg_return_true: } } \prg_generate_conditional_variant:Nnn \seq_if_in:Nn { NV , Nv , No , Nx , c , cV , cv , co , cx } { T , F , TF } \cs_new_protected:Npn \__seq_pop:NNNN #1#2#3#4 { \if_meaning:w #3 \c_empty_seq \tl_set:Nn #4 { \q_no_value } \else: #1#2#3#4 \fi: } \cs_new_protected:Npn \__seq_pop_TF:NNNN #1#2#3#4 { \if_meaning:w #3 \c_empty_seq % \tl_set:Nn #4 { \q_no_value } \prg_return_false: \else: #1#2#3#4 \prg_return_true: \fi: } \cs_new_protected:Npn \seq_get_left:NN #1#2 { \tl_set:Nx #2 { \exp_after:wN \__seq_get_left:wnw #1 \__seq_item:n { \q_no_value } \q_stop } } \cs_new:Npn \__seq_get_left:wnw #1 \__seq_item:n #2#3 \q_stop { \exp_not:n {#2} } \cs_generate_variant:Nn \seq_get_left:NN { c } \cs_new_protected:Npn \seq_pop_left:NN { \__seq_pop:NNNN \__seq_pop_left:NNN \tl_set:Nn } \cs_new_protected:Npn \seq_gpop_left:NN { \__seq_pop:NNNN \__seq_pop_left:NNN \tl_gset:Nn } \cs_new_protected:Npn \__seq_pop_left:NNN #1#2#3 { \exp_after:wN \__seq_pop_left:wnwNNN #2 \q_stop #1#2#3 } \cs_new_protected:Npn \__seq_pop_left:wnwNNN #1 \__seq_item:n #2#3 \q_stop #4#5#6 { #4 #5 { #1 #3 } \tl_set:Nn #6 {#2} } \cs_generate_variant:Nn \seq_pop_left:NN { c } \cs_generate_variant:Nn \seq_gpop_left:NN { c } \cs_new_protected:Npn \seq_get_right:NN #1#2 { \exp_after:wN \use_i_ii:nnn \exp_after:wN \__seq_get_right_loop:nn \exp_after:wN \q_no_value #1 { ?? \tl_set:Nn #2 } { } { } } \cs_new_protected:Npn \__seq_get_right_loop:nn #1#2 { \use_none:nn #2 {#1} \__seq_get_right_loop:nn } \cs_generate_variant:Nn \seq_get_right:NN { c } \cs_new_protected:Npn \seq_pop_right:NN { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_set:Nx } \cs_new_protected:Npn \seq_gpop_right:NN { \__seq_pop:NNNN \__seq_pop_right:NNN \tl_gset:Nx } \cs_new_protected:Npn \__seq_pop_right:NNN #1#2#3 { \cs_set_eq:NN \__seq_tmp:w \__seq_item:n \cs_set_eq:NN \__seq_item:n \scan_stop: #1 #2 { \if_false: } \fi: \s__seq \exp_after:wN \use_i:nnn \exp_after:wN \__seq_pop_right_loop:nn #2 { \if_false: { \fi: } \tl_set:Nx #3 } { } \use_none:nn \cs_set_eq:NN \__seq_item:n \__seq_tmp:w } \cs_new:Npn \__seq_pop_right_loop:nn #1#2 { #2 { \exp_not:n {#1} } \__seq_pop_right_loop:nn } \cs_generate_variant:Nn \seq_pop_right:NN { c } \cs_generate_variant:Nn \seq_gpop_right:NN { c } \prg_new_protected_conditional:Npnn \seq_get_left:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_left:NN #1#2 } \prg_new_protected_conditional:Npnn \seq_get_right:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \prg_do_nothing: \seq_get_right:NN #1#2 } \prg_generate_conditional_variant:Nnn \seq_get_left:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \seq_get_right:NN { c } { T , F , TF } \prg_new_protected_conditional:Npnn \seq_pop_left:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_set:Nn #1 #2 } \prg_new_protected_conditional:Npnn \seq_gpop_left:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \__seq_pop_left:NNN \tl_gset:Nn #1 #2 } \prg_new_protected_conditional:Npnn \seq_pop_right:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_set:Nx #1 #2 } \prg_new_protected_conditional:Npnn \seq_gpop_right:NN #1#2 { T , F , TF } { \__seq_pop_TF:NNNN \__seq_pop_right:NNN \tl_gset:Nx #1 #2 } \prg_generate_conditional_variant:Nnn \seq_pop_left:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \seq_gpop_left:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \seq_pop_right:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \seq_gpop_right:NN { c } { T , F , TF } \cs_new:Npn \seq_item:Nn #1 { \exp_after:wN \__seq_item:wNn #1 \q_stop #1 } \cs_new:Npn \__seq_item:wNn \s__seq #1 \q_stop #2#3 { \exp_args:Nf \__seq_item:nnn { \exp_args:Nf \__seq_item:nN { \int_eval:n {#3} } #2 } #1 { ? \__prg_break: } { } \__prg_break_point: } \cs_new:Npn \__seq_item:nN #1#2 { \int_compare:nNnTF {#1} < 0 { \int_eval:n { \seq_count:N #2 + 1 + #1 } } {#1} } \cs_new:Npn \__seq_item:nnn #1#2#3 { \use_none:n #2 \int_compare:nNnTF {#1} = 1 { \__prg_break:n { \exp_not:n {#3} } } { \exp_args:Nf \__seq_item:nnn { \int_eval:n { #1 - 1 } } } } \cs_generate_variant:Nn \seq_item:Nn { c } \cs_new:Npn \seq_map_break: { \__prg_map_break:Nn \seq_map_break: { } } \cs_new:Npn \seq_map_break:n { \__prg_map_break:Nn \seq_map_break: } \cs_new:Npn \seq_map_function:NN #1#2 { \exp_after:wN \use_i_ii:nnn \exp_after:wN \__seq_map_function:NNn \exp_after:wN #2 #1 { ? \seq_map_break: } { } \__prg_break_point:Nn \seq_map_break: { } } \cs_new:Npn \__seq_map_function:NNn #1#2#3 { \use_none:n #2 #1 {#3} \__seq_map_function:NNn #1 } \cs_generate_variant:Nn \seq_map_function:NN { c } \cs_new_protected:Npn \__seq_push_item_def:n { \__seq_push_item_def: \cs_gset:Npn \__seq_item:n ##1 } \cs_new_protected:Npn \__seq_push_item_def:x { \__seq_push_item_def: \cs_gset:Npx \__seq_item:n ##1 } \cs_new_protected:Npn \__seq_push_item_def: { \int_gincr:N \g__prg_map_int \cs_gset_eq:cN { __prg_map_ \int_use:N \g__prg_map_int :w } \__seq_item:n } \cs_new_protected:Npn \__seq_pop_item_def: { \cs_gset_eq:Nc \__seq_item:n { __prg_map_ \int_use:N \g__prg_map_int :w } \int_gdecr:N \g__prg_map_int } \cs_new_protected:Npn \seq_map_inline:Nn #1#2 { \__seq_push_item_def:n {#2} #1 \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: } } \cs_generate_variant:Nn \seq_map_inline:Nn { c } \cs_new_protected:Npn \seq_map_variable:NNn #1#2#3 { \__seq_push_item_def:x { \tl_set:Nn \exp_not:N #2 {##1} \exp_not:n {#3} } #1 \__prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: } } \cs_generate_variant:Nn \seq_map_variable:NNn { Nc } \cs_generate_variant:Nn \seq_map_variable:NNn { c , cc } \cs_new:Npn \seq_count:N #1 { \int_eval:n { 0 \seq_map_function:NN #1 \__seq_count:n } } \cs_new:Npn \__seq_count:n #1 { + 1 } \cs_generate_variant:Nn \seq_count:N { c } \cs_new:Npn \seq_use:Nnnn #1#2#3#4 { \seq_if_exist:NTF #1 { \int_case:nnF { \seq_count:N #1 } { { 0 } { } { 1 } { \exp_after:wN \__seq_use:NNnNnn #1 ? { } { } } { 2 } { \exp_after:wN \__seq_use:NNnNnn #1 {#2} } } { \exp_after:wN \__seq_use_setup:w #1 \__seq_item:n \q_mark { \__seq_use:nwwwwnwn {#3} } \q_mark { \__seq_use:nwwn {#4} } \q_stop { } } } { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } } \cs_generate_variant:Nn \seq_use:Nnnn { c } \cs_new:Npn \__seq_use:NNnNnn #1#2#3#4#5#6 { \exp_not:n { #3 #6 #5 } } \cs_new:Npn \__seq_use_setup:w \s__seq { \__seq_use:nwwwwnwn { } } \cs_new:Npn \__seq_use:nwwwwnwn #1 \__seq_item:n #2 \__seq_item:n #3 \__seq_item:n #4#5 \q_mark #6#7 \q_stop #8 { #6 \__seq_item:n {#3} \__seq_item:n {#4} #5 \q_mark {#6} #7 \q_stop { #8 #1 #2 } } \cs_new:Npn \__seq_use:nwwn #1 \__seq_item:n #2 #3 \q_stop #4 { \exp_not:n { #4 #1 #2 } } \cs_new:Npn \seq_use:Nn #1#2 { \seq_use:Nnnn #1 {#2} {#2} {#2} } \cs_generate_variant:Nn \seq_use:Nn { c } \cs_new_eq:NN \seq_push:Nn \seq_put_left:Nn \cs_new_eq:NN \seq_push:NV \seq_put_left:NV \cs_new_eq:NN \seq_push:Nv \seq_put_left:Nv \cs_new_eq:NN \seq_push:No \seq_put_left:No \cs_new_eq:NN \seq_push:Nx \seq_put_left:Nx \cs_new_eq:NN \seq_push:cn \seq_put_left:cn \cs_new_eq:NN \seq_push:cV \seq_put_left:cV \cs_new_eq:NN \seq_push:cv \seq_put_left:cv \cs_new_eq:NN \seq_push:co \seq_put_left:co \cs_new_eq:NN \seq_push:cx \seq_put_left:cx \cs_new_eq:NN \seq_gpush:Nn \seq_gput_left:Nn \cs_new_eq:NN \seq_gpush:NV \seq_gput_left:NV \cs_new_eq:NN \seq_gpush:Nv \seq_gput_left:Nv \cs_new_eq:NN \seq_gpush:No \seq_gput_left:No \cs_new_eq:NN \seq_gpush:Nx \seq_gput_left:Nx \cs_new_eq:NN \seq_gpush:cn \seq_gput_left:cn \cs_new_eq:NN \seq_gpush:cV \seq_gput_left:cV \cs_new_eq:NN \seq_gpush:cv \seq_gput_left:cv \cs_new_eq:NN \seq_gpush:co \seq_gput_left:co \cs_new_eq:NN \seq_gpush:cx \seq_gput_left:cx \cs_new_eq:NN \seq_get:NN \seq_get_left:NN \cs_new_eq:NN \seq_get:cN \seq_get_left:cN \cs_new_eq:NN \seq_pop:NN \seq_pop_left:NN \cs_new_eq:NN \seq_pop:cN \seq_pop_left:cN \cs_new_eq:NN \seq_gpop:NN \seq_gpop_left:NN \cs_new_eq:NN \seq_gpop:cN \seq_gpop_left:cN \prg_new_eq_conditional:NNn \seq_get:NN \seq_get_left:NN { T , F , TF } \prg_new_eq_conditional:NNn \seq_get:cN \seq_get_left:cN { T , F , TF } \prg_new_eq_conditional:NNn \seq_pop:NN \seq_pop_left:NN { T , F , TF } \prg_new_eq_conditional:NNn \seq_pop:cN \seq_pop_left:cN { T , F , TF } \prg_new_eq_conditional:NNn \seq_gpop:NN \seq_gpop_left:NN { T , F , TF } \prg_new_eq_conditional:NNn \seq_gpop:cN \seq_gpop_left:cN { T , F , TF } \cs_new_protected:Npn \seq_show:N { \__seq_show:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \seq_show:N { c } \cs_new_protected:Npn \seq_log:N { \__seq_show:NN \msg_log:nnxxxx } \cs_generate_variant:Nn \seq_log:N { c } \cs_new_protected:Npn \__seq_show:NN #1#2 { \__kernel_check_defined:NT #2 { #1 { LaTeX/kernel } { show-seq } { \token_to_str:N #2 } { \seq_map_function:NN #2 \msg_show_item:n } { } { } } } \seq_new:N \l_tmpa_seq \seq_new:N \l_tmpb_seq \seq_new:N \g_tmpa_seq \seq_new:N \g_tmpb_seq %% File: l3int.dtx Copyright (C) 1990-2017 The LaTeX3 Project \cs_new_eq:NN \__int_value:w \tex_number:D \cs_new_eq:NN \__int_eval:w \etex_numexpr:D \cs_new_eq:NN \__int_eval_end: \tex_relax:D \cs_new_eq:NN \if_int_odd:w \tex_ifodd:D \cs_new_eq:NN \if_case:w \tex_ifcase:D \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_eval:n } } \cs_new:Npn \int_eval:n #1 { \__int_value:w \__int_eval:w #1 \__int_eval_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \__int_eval:n } } \cs_new:Npn \__int_eval:n #1 { \__int_eval:w #1 \__int_eval_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_abs:n } } \cs_new:Npn \int_abs:n #1 { \__int_value:w \exp_after:wN \__int_abs:N \__int_value:w \__int_eval:w #1 \__int_eval_end: \exp_stop_f: } \cs_new:Npn \__int_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_max:nn } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_max:nn } } \cs_set:Npn \int_max:nn #1#2 { \__int_value:w \exp_after:wN \__int_maxmin:wwN \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; > \exp_stop_f: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_min:nn } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_min:nn } } \cs_set:Npn \int_min:nn #1#2 { \__int_value:w \exp_after:wN \__int_maxmin:wwN \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; < \exp_stop_f: } \cs_new:Npn \__int_maxmin:wwN #1 ; #2 ; #3 { \if_int_compare:w #1 #3 #2 ~ #1 \else: #2 \fi: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_div_truncate:nn } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_div_truncate:nn } } \cs_new:Npn \int_div_truncate:nn #1#2 { \__int_value:w \__int_eval:w \exp_after:wN \__int_div_truncate:NwNw \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; \__int_eval_end: } \cs_new:Npn \__int_div_truncate:NwNw #1#2; #3#4; { \if_meaning:w 0 #1 0 \else: ( #1#2 \if_meaning:w - #1 + \else: - \fi: ( \if_meaning:w - #3 - \fi: #3#4 - 1 ) / 2 ) \fi: / #3#4 } \cs_new:Npn \int_div_round:nn #1#2 { \__int_value:w \__int_eval:w ( #1 ) / ( #2 ) \__int_eval_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_mod:nn } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_mod:nn } } \cs_new:Npn \int_mod:nn #1#2 { \__int_value:w \__int_eval:w \exp_after:wN \__int_mod:ww \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; \__int_eval_end: } \cs_new:Npn \__int_mod:ww #1; #2; { #1 - ( \__int_div_truncate:NwNw #1 ; #2 ; ) * #2 } \cs_new_protected:Npn \int_new:N #1 { \__chk_if_free_cs:N #1 \cs:w newcount \cs_end: #1 } \cs_generate_variant:Nn \int_new:N { c } \__debug_patch_args:nnnNNpn { \__debug_chk_var_scope:NN c #1 } { } { {#1} { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_const:Nn } } \cs_new_protected:Npn \int_const:Nn #1#2 { \int_compare:nNnTF {#2} < \c_zero { \int_new:N #1 \tex_global:D } { \int_compare:nNnTF {#2} > \c__max_constdef_int { \int_new:N #1 \tex_global:D } { \__chk_if_free_cs:N #1 \tex_global:D \__int_constdef:Nw } } #1 = \__int_eval:w #2 \__int_eval_end: } \cs_generate_variant:Nn \int_const:Nn { c } \if_int_odd:w 0 \cs_if_exist:NT \luatex_luatexversion:D { 1 } \cs_if_exist:NT \uptex_disablecjktoken:D { \if_int_compare:w \ptex_jis:D "2121 = "3000 ~ 1 \fi: } \cs_if_exist:NT \xetex_XeTeXversion:D { 1 } ~ \cs_if_exist:NTF \uptex_disablecjktoken:D { \cs_new_eq:NN \__int_constdef:Nw \uptex_kchardef:D } { \cs_new_eq:NN \__int_constdef:Nw \tex_chardef:D } \__int_constdef:Nw \c__max_constdef_int 1114111 ~ \else: \cs_new_eq:NN \__int_constdef:Nw \tex_mathchardef:D \tex_mathchardef:D \c__max_constdef_int 32767 ~ \fi: \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_zero:N #1 { #1 = \c_zero } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gzero:N #1 { \tex_global:D #1 = \c_zero } \cs_generate_variant:Nn \int_zero:N { c } \cs_generate_variant:Nn \int_gzero:N { c } \cs_new_protected:Npn \int_zero_new:N #1 { \int_if_exist:NTF #1 { \int_zero:N #1 } { \int_new:N #1 } } \cs_new_protected:Npn \int_gzero_new:N #1 { \int_if_exist:NTF #1 { \int_gzero:N #1 } { \int_new:N #1 } } \cs_generate_variant:Nn \int_zero_new:N { c } \cs_generate_variant:Nn \int_gzero_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \int_set_eq:NN { c , Nc , cc } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \int_gset_eq:NN { c , Nc , cc } \prg_new_eq_conditional:NNn \int_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \int_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_set_protected:Npn \__int_tmp:w #1#2#3 { \__debug_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { \__debug_chk_expr:nNnN {##2} \__int_eval:w { } #3 } } #2 #3 } \__int_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \int_add:Nn #1#2 { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: } \__int_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \int_sub:Nn #1#2 { \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: } \__int_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \int_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: } \__int_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \int_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \__int_eval:w #2 \__int_eval_end: } \cs_generate_variant:Nn \int_add:Nn { c } \cs_generate_variant:Nn \int_gadd:Nn { c } \cs_generate_variant:Nn \int_sub:Nn { c } \cs_generate_variant:Nn \int_gsub:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_incr:N #1 { \tex_advance:D #1 \c_one } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \int_decr:N #1 { \tex_advance:D #1 - \c_one } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gincr:N #1 { \tex_global:D \tex_advance:D #1 \c_one } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \int_gdecr:N #1 { \tex_global:D \tex_advance:D #1 - \c_one } \cs_generate_variant:Nn \int_incr:N { c } \cs_generate_variant:Nn \int_decr:N { c } \cs_generate_variant:Nn \int_gincr:N { c } \cs_generate_variant:Nn \int_gdecr:N { c } \__int_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \int_set:Nn #1#2 { #1 ~ \__int_eval:w #2 \__int_eval_end: } \__int_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \int_gset:Nn #1#2 { \tex_global:D #1 ~ \__int_eval:w #2 \__int_eval_end: } \cs_generate_variant:Nn \int_set:Nn { c } \cs_generate_variant:Nn \int_gset:Nn { c } \cs_new_eq:NN \int_use:N \tex_the:D \cs_new:Npn \int_use:c #1 { \tex_the:D \cs:w #1 \cs_end: } \cs_new_protected:Npn \__prg_compare_error: { \if_int_compare:w \c_zero \c_zero \fi: = \__prg_compare_error: } \cs_new:Npn \__prg_compare_error:Nw #1#2 \q_stop { { } \c_zero \fi: \__msg_kernel_expandable_error:nnn { kernel } { unknown-comparison } {#1} \prg_return_false: } \prg_new_conditional:Npnn \int_compare:n #1 { p , T , F , TF } { \exp_after:wN \__int_compare:w \__int_value:w \__int_eval:w #1 \__prg_compare_error: } \cs_new:Npn \__int_compare:w #1 \__prg_compare_error: { \exp_after:wN \if_false: \__int_value:w \__int_compare:Nw #1 e { = nd_ } \q_stop } \cs_new:Npn \__int_compare:Nw #1#2 \q_stop { \exp_after:wN \__int_compare:NNw \__int_to_roman:w - 0 #2 \q_mark #1#2 \q_stop } \cs_new:Npn \__int_compare:NNw #1#2#3 \q_mark { \etex_unexpanded:D \use:c { __int_compare_ \token_to_str:N #1 \if_meaning:w = #2 = \fi: :NNw } \__prg_compare_error:Nw #1 } \cs_new:cpn { __int_compare_end_=:NNw } #1#2#3 e #4 \q_stop { {#3} \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: } \cs_new:Npn \__int_compare:nnN #1#2#3 { {#2} \exp_stop_f: \prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w \fi: #1 #2 #3 \exp_after:wN \__int_compare:Nw \__int_value:w \__int_eval:w } \cs_new:cpn { __int_compare_=:NNw } #1#2#3 = { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} = } \cs_new:cpn { __int_compare_<:NNw } #1#2#3 < { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} < } \cs_new:cpn { __int_compare_>:NNw } #1#2#3 > { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} > } \cs_new:cpn { __int_compare_==:NNw } #1#2#3 == { \__int_compare:nnN { \reverse_if:N \if_int_compare:w } {#3} = } \cs_new:cpn { __int_compare_!=:NNw } #1#2#3 != { \__int_compare:nnN { \if_int_compare:w } {#3} = } \cs_new:cpn { __int_compare_<=:NNw } #1#2#3 <= { \__int_compare:nnN { \if_int_compare:w } {#3} > } \cs_new:cpn { __int_compare_>=:NNw } #1#2#3 >= { \__int_compare:nnN { \if_int_compare:w } {#3} < } \__debug_patch_conditional_args:nNNpnn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_compare:nNn } { \__int_eval_end: #2 } { \__debug_chk_expr:nNnN {#3} \__int_eval:w { } \int_compare:nNn } } \prg_new_conditional:Npnn \int_compare:nNn #1#2#3 { p , T , F , TF } { \if_int_compare:w \__int_eval:w #1 #2 \__int_eval:w #3 \__int_eval_end: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \int_case:nnTF #1 { \exp:w \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } } \cs_new:Npn \int_case:nnT #1#2#3 { \exp:w \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} {#3} { } } \cs_new:Npn \int_case:nnF #1#2 { \exp:w \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} { } } \cs_new:Npn \int_case:nn #1#2 { \exp:w \exp_args:Nf \__int_case:nnTF { \int_eval:n {#1} } {#2} { } { } } \cs_new:Npn \__int_case:nnTF #1#2#3#4 { \__int_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } \cs_new:Npn \__int_case:nw #1#2#3 { \int_compare:nNnTF {#1} = {#2} { \__int_case_end:nw {#3} } { \__int_case:nw {#1} } } \cs_new_eq:NN \__int_case_end:nw \__prg_case_end:nw \__debug_patch_conditional_args:nNNpnn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_odd:n } } \prg_new_conditional:Npnn \int_if_odd:n #1 { p , T , F , TF} { \if_int_odd:w \__int_eval:w #1 \__int_eval_end: \prg_return_true: \else: \prg_return_false: \fi: } \__debug_patch_conditional_args:nNNpnn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_if_even:n } } \prg_new_conditional:Npnn \int_if_even:n #1 { p , T , F , TF} { \if_int_odd:w \__int_eval:w #1 \__int_eval_end: \prg_return_false: \else: \prg_return_true: \fi: } \cs_new:Npn \int_while_do:nn #1#2 { \int_compare:nT {#1} { #2 \int_while_do:nn {#1} {#2} } } \cs_new:Npn \int_until_do:nn #1#2 { \int_compare:nF {#1} { #2 \int_until_do:nn {#1} {#2} } } \cs_new:Npn \int_do_while:nn #1#2 { #2 \int_compare:nT {#1} { \int_do_while:nn {#1} {#2} } } \cs_new:Npn \int_do_until:nn #1#2 { #2 \int_compare:nF {#1} { \int_do_until:nn {#1} {#2} } } \cs_new:Npn \int_while_do:nNnn #1#2#3#4 { \int_compare:nNnT {#1} #2 {#3} { #4 \int_while_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \int_until_do:nNnn #1#2#3#4 { \int_compare:nNnF {#1} #2 {#3} { #4 \int_until_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \int_do_while:nNnn #1#2#3#4 { #4 \int_compare:nNnT {#1} #2 {#3} { \int_do_while:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \int_do_until:nNnn #1#2#3#4 { #4 \int_compare:nNnF {#1} #2 {#3} { \int_do_until:nNnn {#1} #2 {#3} {#4} } } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_step_function:nnnN } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_step_function:nnnN } { \__debug_chk_expr:nNnN {#3} \__int_eval:w { } \int_step_function:nnnN } } \cs_new:Npn \int_step_function:nnnN #1#2#3 { \exp_after:wN \__int_step:wwwN \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 \exp_after:wN ; \__int_value:w \__int_eval:w #3 ; } \cs_new:Npn \__int_step:wwwN #1; #2; #3; #4 { \int_compare:nNnTF {#2} > \c_zero { \__int_step:NnnnN > } { \int_compare:nNnTF {#2} = \c_zero { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#4} \use_none:nnnn } { \__int_step:NnnnN < } } {#1} {#2} {#3} #4 } \cs_new:Npn \__int_step:NnnnN #1#2#3#4#5 { \int_compare:nNnF {#2} #1 {#4} { #5 {#2} \exp_args:NNf \__int_step:NnnnN #1 { \int_eval:n { #2 + #3 } } {#3} {#4} #5 } } \cs_new_protected:Npn \int_step_inline:nnnn { \int_gincr:N \g__prg_map_int \exp_args:NNc \__int_step:NNnnnn \cs_gset_protected:Npn { __prg_map_ \int_use:N \g__prg_map_int :w } } \cs_new_protected:Npn \int_step_variable:nnnNn #1#2#3#4#5 { \int_gincr:N \g__prg_map_int \exp_args:NNc \__int_step:NNnnnn \cs_gset_protected:Npx { __prg_map_ \int_use:N \g__prg_map_int :w } {#1}{#2}{#3} { \tl_set:Nn \exp_not:N #4 {##1} \exp_not:n {#5} } } \cs_new_protected:Npn \__int_step:NNnnnn #1#2#3#4#5#6 { #1 #2 ##1 {#6} \int_step_function:nnnN {#3} {#4} {#5} #2 \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int } } \cs_new_eq:NN \int_to_arabic:n \int_eval:n \cs_new:Npn \int_to_symbols:nnn #1#2#3 { \int_compare:nNnTF {#1} > {#2} { \exp_args:NNo \exp_args:No \__int_to_symbols:nnnn { \int_case:nn { 1 + \int_mod:nn { #1 - 1 } {#2} } {#3} } {#1} {#2} {#3} } { \int_case:nn {#1} {#3} } } \cs_new:Npn \__int_to_symbols:nnnn #1#2#3#4 { \exp_args:Nf \int_to_symbols:nnn { \int_div_truncate:nn { #2 - 1 } {#3} } {#3} {#4} #1 } \cs_new:Npn \int_to_alph:n #1 { \int_to_symbols:nnn {#1} { 26 } { { 1 } { a } { 2 } { b } { 3 } { c } { 4 } { d } { 5 } { e } { 6 } { f } { 7 } { g } { 8 } { h } { 9 } { i } { 10 } { j } { 11 } { k } { 12 } { l } { 13 } { m } { 14 } { n } { 15 } { o } { 16 } { p } { 17 } { q } { 18 } { r } { 19 } { s } { 20 } { t } { 21 } { u } { 22 } { v } { 23 } { w } { 24 } { x } { 25 } { y } { 26 } { z } } } \cs_new:Npn \int_to_Alph:n #1 { \int_to_symbols:nnn {#1} { 26 } { { 1 } { A } { 2 } { B } { 3 } { C } { 4 } { D } { 5 } { E } { 6 } { F } { 7 } { G } { 8 } { H } { 9 } { I } { 10 } { J } { 11 } { K } { 12 } { L } { 13 } { M } { 14 } { N } { 15 } { O } { 16 } { P } { 17 } { Q } { 18 } { R } { 19 } { S } { 20 } { T } { 21 } { U } { 22 } { V } { 23 } { W } { 24 } { X } { 25 } { Y } { 26 } { Z } } } \cs_new:Npn \int_to_base:nn #1 { \exp_args:Nf \__int_to_base:nn { \int_eval:n {#1} } } \cs_new:Npn \int_to_Base:nn #1 { \exp_args:Nf \__int_to_Base:nn { \int_eval:n {#1} } } \cs_new:Npn \__int_to_base:nn #1#2 { \int_compare:nNnTF {#1} < 0 { \exp_args:No \__int_to_base:nnN { \use_none:n #1 } {#2} - } { \__int_to_base:nnN {#1} {#2} \c_empty_tl } } \cs_new:Npn \__int_to_Base:nn #1#2 { \int_compare:nNnTF {#1} < 0 { \exp_args:No \__int_to_Base:nnN { \use_none:n #1 } {#2} - } { \__int_to_Base:nnN {#1} {#2} \c_empty_tl } } \cs_new:Npn \__int_to_base:nnN #1#2#3 { \int_compare:nNnTF {#1} < {#2} { \exp_last_unbraced:Nf #3 { \__int_to_letter:n {#1} } } { \exp_args:Nf \__int_to_base:nnnN { \__int_to_letter:n { \int_mod:nn {#1} {#2} } } {#1} {#2} #3 } } \cs_new:Npn \__int_to_base:nnnN #1#2#3#4 { \exp_args:Nf \__int_to_base:nnN { \int_div_truncate:nn {#2} {#3} } {#3} #4 #1 } \cs_new:Npn \__int_to_Base:nnN #1#2#3 { \int_compare:nNnTF {#1} < {#2} { \exp_last_unbraced:Nf #3 { \__int_to_Letter:n {#1} } } { \exp_args:Nf \__int_to_Base:nnnN { \__int_to_Letter:n { \int_mod:nn {#1} {#2} } } {#1} {#2} #3 } } \cs_new:Npn \__int_to_Base:nnnN #1#2#3#4 { \exp_args:Nf \__int_to_Base:nnN { \int_div_truncate:nn {#2} {#3} } {#3} #4 #1 } \cs_new:Npn \__int_to_letter:n #1 { \exp_after:wN \exp_after:wN \if_case:w \__int_eval:w #1 - 10 \__int_eval_end: a \or: b \or: c \or: d \or: e \or: f \or: g \or: h \or: i \or: j \or: k \or: l \or: m \or: n \or: o \or: p \or: q \or: r \or: s \or: t \or: u \or: v \or: w \or: x \or: y \or: z \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end: \fi: } \cs_new:Npn \__int_to_Letter:n #1 { \exp_after:wN \exp_after:wN \if_case:w \__int_eval:w #1 - 10 \__int_eval_end: A \or: B \or: C \or: D \or: E \or: F \or: G \or: H \or: I \or: J \or: K \or: L \or: M \or: N \or: O \or: P \or: Q \or: R \or: S \or: T \or: U \or: V \or: W \or: X \or: Y \or: Z \else: \__int_value:w \__int_eval:w #1 \exp_after:wN \__int_eval_end: \fi: } \cs_new:Npn \int_to_bin:n #1 { \int_to_base:nn {#1} { 2 } } \cs_new:Npn \int_to_hex:n #1 { \int_to_base:nn {#1} { 16 } } \cs_new:Npn \int_to_Hex:n #1 { \int_to_Base:nn {#1} { 16 } } \cs_new:Npn \int_to_oct:n #1 { \int_to_base:nn {#1} { 8 } } \cs_new:Npn \int_to_roman:n #1 { \exp_after:wN \__int_to_roman:N \__int_to_roman:w \int_eval:n {#1} Q } \cs_new:Npn \__int_to_roman:N #1 { \use:c { __int_to_roman_ #1 :w } \__int_to_roman:N } \cs_new:Npn \int_to_Roman:n #1 { \exp_after:wN \__int_to_Roman_aux:N \__int_to_roman:w \int_eval:n {#1} Q } \cs_new:Npn \__int_to_Roman_aux:N #1 { \use:c { __int_to_Roman_ #1 :w } \__int_to_Roman_aux:N } \cs_new:Npn \__int_to_roman_i:w { i } \cs_new:Npn \__int_to_roman_v:w { v } \cs_new:Npn \__int_to_roman_x:w { x } \cs_new:Npn \__int_to_roman_l:w { l } \cs_new:Npn \__int_to_roman_c:w { c } \cs_new:Npn \__int_to_roman_d:w { d } \cs_new:Npn \__int_to_roman_m:w { m } \cs_new:Npn \__int_to_roman_Q:w #1 { } \cs_new:Npn \__int_to_Roman_i:w { I } \cs_new:Npn \__int_to_Roman_v:w { V } \cs_new:Npn \__int_to_Roman_x:w { X } \cs_new:Npn \__int_to_Roman_l:w { L } \cs_new:Npn \__int_to_Roman_c:w { C } \cs_new:Npn \__int_to_Roman_d:w { D } \cs_new:Npn \__int_to_Roman_m:w { M } \cs_new:Npn \__int_to_Roman_Q:w #1 { } \cs_new:Npn \__int_pass_signs:wn #1 { \if:w + \if:w - \exp_not:N #1 + \fi: \exp_not:N #1 \exp_after:wN \__int_pass_signs:wn \else: \exp_after:wN \__int_pass_signs_end:wn \exp_after:wN #1 \fi: } \cs_new:Npn \__int_pass_signs_end:wn #1 \q_stop #2 { #2 #1 } \cs_new:Npn \int_from_alph:n #1 { \int_eval:n { \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1} \q_stop { \__int_from_alph:nN { 0 } } \q_recursion_tail \q_recursion_stop } } \cs_new:Npn \__int_from_alph:nN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 {#1} \exp_args:Nf \__int_from_alph:nN { \int_eval:n { #1 * 26 + \__int_from_alph:N #2 } } } \cs_new:Npn \__int_from_alph:N #1 { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } } \cs_new:Npn \int_from_base:nn #1#2 { \int_eval:n { \exp_after:wN \__int_pass_signs:wn \tl_to_str:n {#1} \q_stop { \__int_from_base:nnN { 0 } {#2} } \q_recursion_tail \q_recursion_stop } } \cs_new:Npn \__int_from_base:nnN #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #3 {#1} \exp_args:Nf \__int_from_base:nnN { \int_eval:n { #1 * #2 + \__int_from_base:N #3 } } {#2} } \cs_new:Npn \__int_from_base:N #1 { \int_compare:nNnTF { `#1 } < { 58 } {#1} { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } } } \cs_new:Npn \int_from_bin:n #1 { \int_from_base:nn {#1} { 2 } } \cs_new:Npn \int_from_hex:n #1 { \int_from_base:nn {#1} { 16 } } \cs_new:Npn \int_from_oct:n #1 { \int_from_base:nn {#1} { 8 } } \int_const:cn { c__int_from_roman_i_int } { 1 } \int_const:cn { c__int_from_roman_v_int } { 5 } \int_const:cn { c__int_from_roman_x_int } { 10 } \int_const:cn { c__int_from_roman_l_int } { 50 } \int_const:cn { c__int_from_roman_c_int } { 100 } \int_const:cn { c__int_from_roman_d_int } { 500 } \int_const:cn { c__int_from_roman_m_int } { 1000 } \int_const:cn { c__int_from_roman_I_int } { 1 } \int_const:cn { c__int_from_roman_V_int } { 5 } \int_const:cn { c__int_from_roman_X_int } { 10 } \int_const:cn { c__int_from_roman_L_int } { 50 } \int_const:cn { c__int_from_roman_C_int } { 100 } \int_const:cn { c__int_from_roman_D_int } { 500 } \int_const:cn { c__int_from_roman_M_int } { 1000 } \cs_new:Npn \int_from_roman:n #1 { \int_eval:n { ( 0 \exp_after:wN \__int_from_roman:NN \tl_to_str:n {#1} \q_recursion_tail \q_recursion_tail \q_recursion_stop ) } } \cs_new:Npn \__int_from_roman:NN #1#2 { \quark_if_recursion_tail_stop:N #1 \int_if_exist:cF { c__int_from_roman_ #1 _int } { \__int_from_roman_error:w } \quark_if_recursion_tail_stop_do:Nn #2 { + \use:c { c__int_from_roman_ #1 _int } } \int_if_exist:cF { c__int_from_roman_ #2 _int } { \__int_from_roman_error:w } \int_compare:nNnTF { \use:c { c__int_from_roman_ #1 _int } } < { \use:c { c__int_from_roman_ #2 _int } } { + \use:c { c__int_from_roman_ #2 _int } - \use:c { c__int_from_roman_ #1 _int } \__int_from_roman:NN } { + \use:c { c__int_from_roman_ #1 _int } \__int_from_roman:NN #2 } } \cs_new:Npn \__int_from_roman_error:w #1 \q_recursion_stop #2 { #2 * 0 - 1 } \cs_new_eq:NN \int_show:N \__kernel_register_show:N \cs_generate_variant:Nn \int_show:N { c } \cs_new_protected:Npn \int_show:n { \msg_show_eval:Nn \int_eval:n } \cs_new_eq:NN \int_log:N \__kernel_register_log:N \cs_generate_variant:Nn \int_log:N { c } \cs_new_protected:Npn \int_log:n { \msg_log_eval:Nn \int_eval:n } \int_const:Nn \c_one { 1 } \int_const:Nn \c_two { 2 } \int_const:Nn \c_three { 3 } \int_const:Nn \c_four { 4 } \int_const:Nn \c_five { 5 } \int_const:Nn \c_six { 6 } \int_const:Nn \c_seven { 7 } \int_const:Nn \c_eight { 8 } \int_const:Nn \c_nine { 9 } \int_const:Nn \c_ten { 10 } \int_const:Nn \c_eleven { 11 } \int_const:Nn \c_twelve { 12 } \int_const:Nn \c_thirteen { 13 } \int_const:Nn \c_fourteen { 14 } \int_const:Nn \c_fifteen { 15 } \int_const:Nn \c_sixteen { 16 } \int_const:Nn \c_thirty_two { 32 } \int_const:Nn \c_two_hundred_fifty_five { 255 } \int_const:Nn \c_two_hundred_fifty_six { 256 } \int_const:Nn \c_one_hundred { 100 } \int_const:Nn \c_one_thousand { 1000 } \int_const:Nn \c_ten_thousand { 10000 } \int_const:Nn \c_max_int { 2 147 483 647 } \int_const:Nn \c_max_char_int { \if_int_odd:w 0 \cs_if_exist:NT \luatex_luatexversion:D { 1 } \cs_if_exist:NT \xetex_XeTeXversion:D { 1 } ~ "10FFFF \else: "FF \fi: } \int_new:N \l_tmpa_int \int_new:N \l_tmpb_int \int_new:N \g_tmpa_int \int_new:N \g_tmpb_int \cs_gset_eq:NN \c__deprecation_minus_one \m@ne \cs_new_eq:NN \c_minus_one \c__deprecation_minus_one \__debug:TF { \tl_gput_right:Nn \g__debug_deprecation_on_tl { \__deprecation_error:Nnn \c_minus_one { -1 } { 2018-12-31 } } \tl_gput_right:Nn \g__debug_deprecation_off_tl { \tex_let:D \c_minus_one \c__deprecation_minus_one } } { } %% File: l3intarray.dtx Copyright (C) 2017 The LaTeX3 Project \int_new:N \g__intarray_font_int \cs_new_protected:Npn \__intarray_new:Nn #1#2 { \__chk_if_free_cs:N #1 \int_gincr:N \g__intarray_font_int \tex_global:D \tex_font:D #1 = cmr10~at~ \g__intarray_font_int sp \scan_stop: \tex_hyphenchar:D #1 = \int_eval:n {#2} \scan_stop: \int_compare:nNnT { \tex_hyphenchar:D #1 } > 0 { \tex_fontdimen:D \tex_hyphenchar:D #1 #1 = 0 sp \scan_stop: } \int_step_inline:nnnn { 1 } { 1 } { 8 } { \tex_fontdimen:D ##1 #1 = 0 sp \scan_stop: } } \cs_new:Npn \__intarray_count:N #1 { \tex_the:D \tex_hyphenchar:D #1 } \cs_new_protected:Npn \__intarray_gset_fast:Nnn #1#2#3 { \tex_fontdimen:D \int_eval:n {#2} #1 = \int_eval:n {#3} sp \scan_stop: } \cs_new_protected:Npn \__intarray_gset:Nnn #1#2#3 { \exp_args:Nff \__intarray_gset_aux:Nnn #1 { \int_eval:n {#2} } { \int_eval:n {#3} } } \cs_new_protected:Npn \__intarray_gset_aux:Nnn #1#2#3 { \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 } { \int_compare:nTF { - \c_max_dim <= \int_abs:n {#3} <= \c_max_dim } { \__intarray_gset_fast:Nnn #1 {#2} {#3} } { \__msg_kernel_error:nnxxxx { kernel } { overflow } { \token_to_str:N #1 } {#2} {#3} { \int_compare:nNnT {#3} < 0 { - } \__int_value:w \c_max_dim } \__intarray_gset_fast:Nnn #1 {#2} { \int_compare:nNnT {#3} < 0 { - } \c_max_dim } } } { \__msg_kernel_error:nnxxx { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 } } } \cs_new:Npn \__intarray_item_fast:Nn #1#2 { \__int_value:w \tex_fontdimen:D \int_eval:n {#2} #1 } \cs_new:Npn \__intarray_item:Nn #1#2 { \exp_args:Nf \__intarray_item_aux:Nn #1 { \int_eval:n {#2} } } \cs_new:Npn \__intarray_item_aux:Nn #1#2 { \int_compare:nTF { 1 <= #2 <= \__intarray_count:N #1 } { \__intarray_item_fast:Nn #1 {#2} } { \__msg_kernel_expandable_error:nnnnn { kernel } { out-of-bounds } { \token_to_str:N #1 } {#2} { \__intarray_count:N #1 } 0 } } %% File: l3flag.dtx Copyright (C) 2011-2017 The LaTeX3 Project \cs_new_protected:Npn \flag_new:n #1 { \cs_new:cpn { flag~#1 } ##1 ; { \exp_after:wN \use_none:n \cs:w flag~#1~##1 \cs_end: } } \__debug_patch:nnNNpn { \exp_args:Nc \__debug_chk_var_exist:N { flag~#1 } } { } \cs_new_protected:Npn \flag_clear:n #1 { \__flag_clear:wn 0 ; {#1} } \cs_new_protected:Npn \__flag_clear:wn #1 ; #2 { \if_cs_exist:w flag~#2~#1 \cs_end: \cs_set_eq:cN { flag~#2~#1 } \tex_undefined:D \exp_after:wN \__flag_clear:wn \__int_value:w \__int_eval:w 1 + #1 \else: \use_i:nnn \fi: ; {#2} } \cs_new_protected:Npn \flag_clear_new:n #1 { \flag_if_exist:nTF {#1} { \flag_clear:n } { \flag_new:n } {#1} } \cs_new_protected:Npn \flag_show:n { \__flag_show:Nn \tl_show:n } \cs_new_protected:Npn \flag_log:n { \__flag_show:Nn \tl_log:n } \cs_new_protected:Npn \__flag_show:Nn #1#2 { \exp_args:Nc \__kernel_check_defined:NT { flag~#2 } { \exp_args:Nx #1 { \tl_to_str:n { flag~#2~height } = \flag_height:n {#2} } } } \tex_ifodd:D \l@expl@enable@debug@bool \cs_new:Npn \__flag_chk_exist:n #1 { \flag_if_exist:nF {#1} { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } { flag~#1~ } } } \fi: \prg_new_conditional:Npnn \flag_if_exist:n #1 { p , T , F , TF } { \cs_if_exist:cTF { flag~#1 } { \prg_return_true: } { \prg_return_false: } } \__debug_patch_conditional:nNNpnn { \__flag_chk_exist:n {#1} } \prg_new_conditional:Npnn \flag_if_raised:n #1 { p , T , F , TF } { \if_cs_exist:w flag~#1~0 \cs_end: \prg_return_true: \else: \prg_return_false: \fi: } \__debug_patch:nnNNpn { \__flag_chk_exist:n {#1} } { } \cs_new:Npn \flag_height:n #1 { \__flag_height_loop:wn 0; {#1} } \cs_new:Npn \__flag_height_loop:wn #1 ; #2 { \if_cs_exist:w flag~#2~#1 \cs_end: \exp_after:wN \__flag_height_loop:wn \__int_value:w \__int_eval:w 1 + \else: \exp_after:wN \__flag_height_end:wn \fi: #1 ; {#2} } \cs_new:Npn \__flag_height_end:wn #1 ; #2 {#1} \cs_new:Npn \flag_raise:n #1 { \cs:w flag~#1 \exp_after:wN \cs_end: \__int_value:w \flag_height:n {#1} ; } %% File: l3quark.dtx Copyright (C) 1990-2017 The LaTeX3 Project \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN q #1 } { } \cs_new_protected:Npn \quark_new:N #1 { \__chk_if_free_cs:N #1 \cs_gset_nopar:Npn #1 {#1} } \quark_new:N \q_nil \quark_new:N \q_mark \quark_new:N \q_no_value \quark_new:N \q_stop \quark_new:N \q_recursion_tail \quark_new:N \q_recursion_stop \cs_new:Npn \quark_if_recursion_tail_stop:N #1 { \if_meaning:w \q_recursion_tail #1 \exp_after:wN \use_none_delimit_by_q_recursion_stop:w \fi: } \cs_new:Npn \quark_if_recursion_tail_stop_do:Nn #1 { \if_meaning:w \q_recursion_tail #1 \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw \else: \exp_after:wN \use_none:n \fi: } \cs_new:Npn \quark_if_recursion_tail_stop:n #1 { \tl_if_empty:oTF { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } { \use_none_delimit_by_q_recursion_stop:w } { } } \cs_new:Npn \quark_if_recursion_tail_stop_do:nn #1 { \tl_if_empty:oTF { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } { \use_i_delimit_by_q_recursion_stop:nw } { \use_none:n } } \cs_new:Npn \__quark_if_recursion_tail:w #1 \q_recursion_tail #2 ? #3 ?! { #1 #2 } \cs_generate_variant:Nn \quark_if_recursion_tail_stop:n { o } \cs_generate_variant:Nn \quark_if_recursion_tail_stop_do:nn { o } \cs_new:Npn \__quark_if_recursion_tail_break:NN #1#2 { \if_meaning:w \q_recursion_tail #1 \exp_after:wN #2 \fi: } \cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2 { \tl_if_empty:oTF { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } {#2} { } } \prg_new_conditional:Npnn \quark_if_nil:N #1 { p, T , F , TF } { \if_meaning:w \q_nil #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \quark_if_no_value:N #1 { p, T , F , TF } { \if_meaning:w \q_no_value #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \quark_if_no_value:N { c } { p , T , F , TF } \prg_new_conditional:Npnn \quark_if_nil:n #1 { p, T , F , TF } { \__tl_if_empty_return:o { \__quark_if_nil:w {} #1 {} ? ! \q_nil ? ? ! } } \cs_new:Npn \__quark_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 } \prg_new_conditional:Npnn \quark_if_no_value:n #1 { p, T , F , TF } { \__tl_if_empty_return:o { \__quark_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! } } \cs_new:Npn \__quark_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 } \prg_generate_conditional_variant:Nnn \quark_if_nil:n { V , o } { p , TF , T , F } \quark_new:N \q__tl_act_mark \quark_new:N \q__tl_act_stop \tl_new:N \g__scan_marks_tl \cs_new_protected:Npn \__scan_new:N #1 { \tl_if_in:NnTF \g__scan_marks_tl { #1 } { \__msg_kernel_error:nnx { kernel } { scanmark-already-defined } { \token_to_str:N #1 } } { \tl_gput_right:Nn \g__scan_marks_tl {#1} \cs_new_eq:NN #1 \scan_stop: } } \__scan_new:N \s__stop \cs_new:Npn \__use_none_delimit_by_s__stop:w #1 \s__stop { } \__scan_new:N \s__seq %% File: l3prg.dtx Copyright (C) 2005-2017 The LaTeX3 Project \cs_new_eq:NN \if_bool:N \tex_ifodd:D \cs_new_eq:NN \if_predicate:w \tex_ifodd:D \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_true:N #1 { \cs_set_eq:NN #1 \c_true_bool } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set_false:N #1 { \cs_set_eq:NN #1 \c_false_bool } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_true:N #1 { \cs_gset_eq:NN #1 \c_true_bool } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset_false:N #1 { \cs_gset_eq:NN #1 \c_false_bool } \cs_generate_variant:Nn \bool_set_true:N { c } \cs_generate_variant:Nn \bool_set_false:N { c } \cs_generate_variant:Nn \bool_gset_true:N { c } \cs_generate_variant:Nn \bool_gset_false:N { c } \cs_new_eq:NN \bool_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \bool_gset_eq:NN \tl_gset_eq:NN \cs_generate_variant:Nn \bool_set_eq:NN { Nc, cN, cc } \cs_generate_variant:Nn \bool_gset_eq:NN { Nc, cN, cc } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \bool_set:Nn #1#2 { \tex_chardef:D #1 = \bool_if_p:n {#2} } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \bool_gset:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} } \cs_generate_variant:Nn \bool_set:Nn { c } \cs_generate_variant:Nn \bool_gset:Nn { c } \prg_new_conditional:Npnn \bool_if:N #1 { p , T , F , TF } { \if_bool:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \bool_if:N { c } { p , T , F , TF } \cs_new_protected:Npn \bool_show:n { \msg_show_eval:Nn \__bool_to_str:n } \cs_new_protected:Npn \bool_log:n { \msg_log_eval:Nn \__bool_to_str:n } \cs_new:Npn \__bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } } \cs_new_protected:Npn \bool_show:N { \__bool_show:NN \tl_show:n } \cs_generate_variant:Nn \bool_show:N { c } \cs_new_protected:Npn \bool_log:N { \__bool_show:NN \tl_log:n } \cs_generate_variant:Nn \bool_log:N { c } \cs_new_protected:Npn \__bool_show:NN #1#2 { \__kernel_check_defined:NT #2 { \exp_args:Nx #1 { \token_to_str:N #2 = \__bool_to_str:n {#2} } } } \bool_new:N \l_tmpa_bool \bool_new:N \l_tmpb_bool \bool_new:N \g_tmpa_bool \bool_new:N \g_tmpb_bool \prg_new_eq_conditional:NNn \bool_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \bool_if_exist:c \cs_if_exist:c { TF , T , F , p } \prg_new_conditional:Npnn \bool_if:n #1 { T , F , TF } { \if_predicate:w \bool_if_p:n {#1} \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \bool_if_p:n #1 { \group_align_safe_begin: \exp_after:wN \group_align_safe_end: \exp:w \exp_end_continue_f:w % ( \__bool_get_next:NN \use_i:nnnn #1 ) } \cs_new:Npn \__bool_get_next:NN #1#2 { \use:c { __bool_ \if_meaning:w !#2 ! \else: \if_meaning:w (#2 ( \else: p \fi: \fi: :Nw } #1 #2 } \cs_new:cpn { __bool_!:Nw } #1#2 { \exp_after:wN \__bool_get_next:NN #1 \use_ii:nnnn \use_i:nnnn \use_iii:nnnn \use_iv:nnnn } \cs_new:cpn { __bool_(:Nw } #1#2 { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \__int_value:w \__bool_get_next:NN \use_i:nnnn } \cs_new:cpn { __bool_p:Nw } #1 { \exp_after:wN \__bool_choose:NNN \exp_after:wN #1 \__int_value:w } \cs_new:Npn \__bool_choose:NNN #1#2#3 { \use:c { __bool_ \token_to_str:N #3 _ #1 #2 { \if_meaning:w 0 #2 1 \else: 0 \fi: } 2 0 : } } \cs_new:cpn { __bool_)_0: } { \c_false_bool } \cs_new:cpn { __bool_)_1: } { \c_true_bool } \cs_new:cpn { __bool_)_2: } { \c_true_bool } \cs_new:cpn { __bool_&_0: } & { \__bool_get_next:NN \use_iv:nnnn } \cs_new:cpn { __bool_&_1: } & { \__bool_get_next:NN \use_i:nnnn } \cs_new:cpn { __bool_&_2: } & { \__bool_get_next:NN \use_iii:nnnn } \cs_new:cpn { __bool_|_0: } | { \__bool_get_next:NN \use_i:nnnn } \cs_new:cpn { __bool_|_1: } | { \__bool_get_next:NN \use_iii:nnnn } \cs_new:cpn { __bool_|_2: } | { \__bool_get_next:NN \use_iii:nnnn } \prg_new_conditional:Npnn \bool_lazy_all:n #1 { p , T , F , TF } { \__bool_lazy_all:n #1 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__bool_lazy_all:n #1 { \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_true: } \bool_if:nF {#1} { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_false: } } \__bool_lazy_all:n } \prg_new_conditional:Npnn \bool_lazy_and:nn #1#2 { p , T , F , TF } { \bool_if:nTF {#1} { \bool_if:nTF {#2} { \prg_return_true: } { \prg_return_false: } } { \prg_return_false: } } \prg_new_conditional:Npnn \bool_lazy_any:n #1 { p , T , F , TF } { \__bool_lazy_any:n #1 \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__bool_lazy_any:n #1 { \quark_if_recursion_tail_stop_do:nn {#1} { \prg_return_false: } \bool_if:nT {#1} { \use_i_delimit_by_q_recursion_stop:nw { \prg_return_true: } } \__bool_lazy_any:n } \prg_new_conditional:Npnn \bool_lazy_or:nn #1#2 { p , T , F , TF } { \bool_if:nTF {#1} { \prg_return_true: } { \bool_if:nTF {#2} { \prg_return_true: } { \prg_return_false: } } } \cs_new:Npn \bool_not_p:n #1 { \bool_if_p:n { ! ( #1 ) } } \cs_new:Npn \bool_xor_p:nn #1#2 { \int_compare:nNnTF { \bool_if_p:n {#1} } = { \bool_if_p:n {#2} } \c_false_bool \c_true_bool } \cs_new:Npn \bool_while_do:Nn #1#2 { \bool_if:NT #1 { #2 \bool_while_do:Nn #1 {#2} } } \cs_new:Npn \bool_until_do:Nn #1#2 { \bool_if:NF #1 { #2 \bool_until_do:Nn #1 {#2} } } \cs_generate_variant:Nn \bool_while_do:Nn { c } \cs_generate_variant:Nn \bool_until_do:Nn { c } \cs_new:Npn \bool_do_while:Nn #1#2 { #2 \bool_if:NT #1 { \bool_do_while:Nn #1 {#2} } } \cs_new:Npn \bool_do_until:Nn #1#2 { #2 \bool_if:NF #1 { \bool_do_until:Nn #1 {#2} } } \cs_generate_variant:Nn \bool_do_while:Nn { c } \cs_generate_variant:Nn \bool_do_until:Nn { c } \cs_new:Npn \bool_while_do:nn #1#2 { \bool_if:nT {#1} { #2 \bool_while_do:nn {#1} {#2} } } \cs_new:Npn \bool_do_while:nn #1#2 { #2 \bool_if:nT {#1} { \bool_do_while:nn {#1} {#2} } } \cs_new:Npn \bool_until_do:nn #1#2 { \bool_if:nF {#1} { #2 \bool_until_do:nn {#1} {#2} } } \cs_new:Npn \bool_do_until:nn #1#2 { #2 \bool_if:nF {#1} { \bool_do_until:nn {#1} {#2} } } \cs_new:Npn \prg_replicate:nn #1 { \exp:w \exp_after:wN \__prg_replicate_first:N \__int_value:w \__int_eval:n {#1} \cs_end: } \cs_new:Npn \__prg_replicate:N #1 { \cs:w __prg_replicate_#1 :n \__prg_replicate:N } \cs_new:Npn \__prg_replicate_first:N #1 { \cs:w __prg_replicate_first_ #1 :n \__prg_replicate:N } \cs_new:Npn \__prg_replicate_ :n #1 { \cs_end: } \cs_new:cpn { __prg_replicate_0:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} } \cs_new:cpn { __prg_replicate_1:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1 } \cs_new:cpn { __prg_replicate_2:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1 } \cs_new:cpn { __prg_replicate_3:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1 } \cs_new:cpn { __prg_replicate_4:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1 } \cs_new:cpn { __prg_replicate_5:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1 } \cs_new:cpn { __prg_replicate_6:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_7:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_8:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_9:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1#1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_first_-:n } #1 { \exp_end: \__msg_kernel_expandable_error:nn { kernel } { negative-replication } } \cs_new:cpn { __prg_replicate_first_0:n } #1 { \exp_end: } \cs_new:cpn { __prg_replicate_first_1:n } #1 { \exp_end: #1 } \cs_new:cpn { __prg_replicate_first_2:n } #1 { \exp_end: #1#1 } \cs_new:cpn { __prg_replicate_first_3:n } #1 { \exp_end: #1#1#1 } \cs_new:cpn { __prg_replicate_first_4:n } #1 { \exp_end: #1#1#1#1 } \cs_new:cpn { __prg_replicate_first_5:n } #1 { \exp_end: #1#1#1#1#1 } \cs_new:cpn { __prg_replicate_first_6:n } #1 { \exp_end: #1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_first_7:n } #1 { \exp_end: #1#1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_first_8:n } #1 { \exp_end: #1#1#1#1#1#1#1#1 } \cs_new:cpn { __prg_replicate_first_9:n } #1 { \exp_end: #1#1#1#1#1#1#1#1#1 } \prg_new_conditional:Npnn \mode_if_vertical: { p , T , F , TF } { \if_mode_vertical: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \mode_if_horizontal: { p , T , F , TF } { \if_mode_horizontal: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \mode_if_inner: { p , T , F , TF } { \if_mode_inner: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \mode_if_math: { p , T , F , TF } { \if_mode_math: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \group_align_safe_begin: { \if_int_compare:w \if_false: { \fi: `} = \c_zero \fi: } \cs_new:Npn \group_align_safe_end: { \if_int_compare:w `{ = \c_zero } \fi: } \int_new:N \g__prg_map_int %% File: l3clist.dtx Copyright (C) 2004-2011 Frank Mittelbach, %% The LaTeX3 project %% (C) 2012-2017 The LaTeX3 Project \cs_new_eq:NN \c_empty_clist \c_empty_tl \tl_new:N \l__clist_internal_clist \cs_new_protected:Npn \__clist_tmp:w { } \cs_new_eq:NN \clist_new:N \tl_new:N \cs_new_eq:NN \clist_new:c \tl_new:c \cs_new_protected:Npn \clist_const:Nn #1#2 { \tl_const:Nx #1 { \__clist_trim_spaces:n {#2} } } \cs_generate_variant:Nn \clist_const:Nn { c , Nx , cx } \cs_new_eq:NN \clist_clear:N \tl_clear:N \cs_new_eq:NN \clist_clear:c \tl_clear:c \cs_new_eq:NN \clist_gclear:N \tl_gclear:N \cs_new_eq:NN \clist_gclear:c \tl_gclear:c \cs_new_eq:NN \clist_clear_new:N \tl_clear_new:N \cs_new_eq:NN \clist_clear_new:c \tl_clear_new:c \cs_new_eq:NN \clist_gclear_new:N \tl_gclear_new:N \cs_new_eq:NN \clist_gclear_new:c \tl_gclear_new:c \cs_new_eq:NN \clist_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \clist_set_eq:Nc \tl_set_eq:Nc \cs_new_eq:NN \clist_set_eq:cN \tl_set_eq:cN \cs_new_eq:NN \clist_set_eq:cc \tl_set_eq:cc \cs_new_eq:NN \clist_gset_eq:NN \tl_gset_eq:NN \cs_new_eq:NN \clist_gset_eq:Nc \tl_gset_eq:Nc \cs_new_eq:NN \clist_gset_eq:cN \tl_gset_eq:cN \cs_new_eq:NN \clist_gset_eq:cc \tl_gset_eq:cc \cs_new_protected:Npn \clist_set_from_seq:NN { \__clist_set_from_seq:NNNN \clist_clear:N \tl_set:Nx } \cs_new_protected:Npn \clist_gset_from_seq:NN { \__clist_set_from_seq:NNNN \clist_gclear:N \tl_gset:Nx } \cs_new_protected:Npn \__clist_set_from_seq:NNNN #1#2#3#4 { \seq_if_empty:NTF #4 { #1 #3 } { #2 #3 { \exp_last_unbraced:Nf \use_none:n { \seq_map_function:NN #4 \__clist_wrap_item:n } } } } \cs_new:Npn \__clist_wrap_item:n #1 { , \tl_if_empty:oTF { \__clist_set_from_seq:w #1 ~ , #1 ~ } { \exp_not:n {#1} } { \exp_not:n { {#1} } } } \cs_new:Npn \__clist_set_from_seq:w #1 , #2 ~ { } \cs_generate_variant:Nn \clist_set_from_seq:NN { Nc } \cs_generate_variant:Nn \clist_set_from_seq:NN { c , cc } \cs_generate_variant:Nn \clist_gset_from_seq:NN { Nc } \cs_generate_variant:Nn \clist_gset_from_seq:NN { c , cc } \cs_new_protected:Npn \clist_concat:NNN { \__clist_concat:NNNN \tl_set:Nx } \cs_new_protected:Npn \clist_gconcat:NNN { \__clist_concat:NNNN \tl_gset:Nx } \cs_new_protected:Npn \__clist_concat:NNNN #1#2#3#4 { #1 #2 { \exp_not:o #3 \clist_if_empty:NF #3 { \clist_if_empty:NF #4 { , } } \exp_not:o #4 } } \cs_generate_variant:Nn \clist_concat:NNN { ccc } \cs_generate_variant:Nn \clist_gconcat:NNN { ccc } \prg_new_eq_conditional:NNn \clist_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \clist_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_new:Npn \__clist_trim_spaces_generic:nw #1#2 , { \__tl_trim_spaces:nn {#2} { \exp_args:No \__clist_trim_spaces_generic:nn } {#1} } \cs_new:Npn \__clist_trim_spaces_generic:nn #1#2 { #2 {#1} } \cs_new:Npn \__clist_trim_spaces:n #1 { \__clist_trim_spaces_generic:nw { \__clist_trim_spaces:nn { } } \q_mark #1 , \q_recursion_tail, \q_recursion_stop } \cs_new:Npn \__clist_trim_spaces:nn #1 #2 { \quark_if_recursion_tail_stop:n {#2} \tl_if_empty:nTF {#2} { \__clist_trim_spaces_generic:nw { \__clist_trim_spaces:nn {#1} } \q_mark } { #1 \exp_not:n {#2} \__clist_trim_spaces_generic:nw { \__clist_trim_spaces:nn { , } } \q_mark } } \cs_new_protected:Npn \clist_set:Nn #1#2 { \tl_set:Nx #1 { \__clist_trim_spaces:n {#2} } } \cs_new_protected:Npn \clist_gset:Nn #1#2 { \tl_gset:Nx #1 { \__clist_trim_spaces:n {#2} } } \cs_generate_variant:Nn \clist_set:Nn { NV , No , Nx , c , cV , co , cx } \cs_generate_variant:Nn \clist_gset:Nn { NV , No , Nx , c , cV , co , cx } \cs_new_protected:Npn \clist_put_left:Nn { \__clist_put_left:NNNn \clist_concat:NNN \clist_set:Nn } \cs_new_protected:Npn \clist_gput_left:Nn { \__clist_put_left:NNNn \clist_gconcat:NNN \clist_set:Nn } \cs_new_protected:Npn \__clist_put_left:NNNn #1#2#3#4 { #2 \l__clist_internal_clist {#4} #1 #3 \l__clist_internal_clist #3 } \cs_generate_variant:Nn \clist_put_left:Nn { NV , No , Nx } \cs_generate_variant:Nn \clist_put_left:Nn { c , cV , co , cx } \cs_generate_variant:Nn \clist_gput_left:Nn { NV , No , Nx } \cs_generate_variant:Nn \clist_gput_left:Nn { c , cV , co , cx } \cs_new_protected:Npn \clist_put_right:Nn { \__clist_put_right:NNNn \clist_concat:NNN \clist_set:Nn } \cs_new_protected:Npn \clist_gput_right:Nn { \__clist_put_right:NNNn \clist_gconcat:NNN \clist_set:Nn } \cs_new_protected:Npn \__clist_put_right:NNNn #1#2#3#4 { #2 \l__clist_internal_clist {#4} #1 #3 #3 \l__clist_internal_clist } \cs_generate_variant:Nn \clist_put_right:Nn { NV , No , Nx } \cs_generate_variant:Nn \clist_put_right:Nn { c , cV , co , cx } \cs_generate_variant:Nn \clist_gput_right:Nn { NV , No , Nx } \cs_generate_variant:Nn \clist_gput_right:Nn { c , cV , co , cx } \cs_new_protected:Npn \clist_get:NN #1#2 { \if_meaning:w #1 \c_empty_clist \tl_set:Nn #2 { \q_no_value } \else: \exp_after:wN \__clist_get:wN #1 , \q_stop #2 \fi: } \cs_new_protected:Npn \__clist_get:wN #1 , #2 \q_stop #3 { \tl_set:Nn #3 {#1} } \cs_generate_variant:Nn \clist_get:NN { c } \cs_new_protected:Npn \clist_pop:NN { \__clist_pop:NNN \tl_set:Nx } \cs_new_protected:Npn \clist_gpop:NN { \__clist_pop:NNN \tl_gset:Nx } \cs_new_protected:Npn \__clist_pop:NNN #1#2#3 { \if_meaning:w #2 \c_empty_clist \tl_set:Nn #3 { \q_no_value } \else: \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3 \fi: } \cs_new_protected:Npn \__clist_pop:wwNNN #1 , #2 \q_stop #3#4#5 { \tl_set:Nn #5 {#1} #3 #4 { \__clist_pop:wN \prg_do_nothing: #2 \exp_not:o , \q_mark \use_none:n \q_stop } } \cs_new:Npn \__clist_pop:wN #1 , \q_mark #2 #3 \q_stop { #2 {#1} } \cs_generate_variant:Nn \clist_pop:NN { c } \cs_generate_variant:Nn \clist_gpop:NN { c } \prg_new_protected_conditional:Npnn \clist_get:NN #1#2 { T , F , TF } { \if_meaning:w #1 \c_empty_clist \prg_return_false: \else: \exp_after:wN \__clist_get:wN #1 , \q_stop #2 \prg_return_true: \fi: } \prg_generate_conditional_variant:Nnn \clist_get:NN { c } { T , F , TF } \prg_new_protected_conditional:Npnn \clist_pop:NN #1#2 { T , F , TF } { \__clist_pop_TF:NNN \tl_set:Nx #1 #2 } \prg_new_protected_conditional:Npnn \clist_gpop:NN #1#2 { T , F , TF } { \__clist_pop_TF:NNN \tl_gset:Nx #1 #2 } \cs_new_protected:Npn \__clist_pop_TF:NNN #1#2#3 { \if_meaning:w #2 \c_empty_clist \prg_return_false: \else: \exp_after:wN \__clist_pop:wwNNN #2 , \q_mark \q_stop #1#2#3 \prg_return_true: \fi: } \prg_generate_conditional_variant:Nnn \clist_pop:NN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \clist_gpop:NN { c } { T , F , TF } \cs_new_eq:NN \clist_push:Nn \clist_put_left:Nn \cs_new_eq:NN \clist_push:NV \clist_put_left:NV \cs_new_eq:NN \clist_push:No \clist_put_left:No \cs_new_eq:NN \clist_push:Nx \clist_put_left:Nx \cs_new_eq:NN \clist_push:cn \clist_put_left:cn \cs_new_eq:NN \clist_push:cV \clist_put_left:cV \cs_new_eq:NN \clist_push:co \clist_put_left:co \cs_new_eq:NN \clist_push:cx \clist_put_left:cx \cs_new_eq:NN \clist_gpush:Nn \clist_gput_left:Nn \cs_new_eq:NN \clist_gpush:NV \clist_gput_left:NV \cs_new_eq:NN \clist_gpush:No \clist_gput_left:No \cs_new_eq:NN \clist_gpush:Nx \clist_gput_left:Nx \cs_new_eq:NN \clist_gpush:cn \clist_gput_left:cn \cs_new_eq:NN \clist_gpush:cV \clist_gput_left:cV \cs_new_eq:NN \clist_gpush:co \clist_gput_left:co \cs_new_eq:NN \clist_gpush:cx \clist_gput_left:cx \clist_new:N \l__clist_internal_remove_clist \cs_new_protected:Npn \clist_remove_duplicates:N { \__clist_remove_duplicates:NN \clist_set_eq:NN } \cs_new_protected:Npn \clist_gremove_duplicates:N { \__clist_remove_duplicates:NN \clist_gset_eq:NN } \cs_new_protected:Npn \__clist_remove_duplicates:NN #1#2 { \clist_clear:N \l__clist_internal_remove_clist \clist_map_inline:Nn #2 { \clist_if_in:NnF \l__clist_internal_remove_clist {##1} { \clist_put_right:Nn \l__clist_internal_remove_clist {##1} } } #1 #2 \l__clist_internal_remove_clist } \cs_generate_variant:Nn \clist_remove_duplicates:N { c } \cs_generate_variant:Nn \clist_gremove_duplicates:N { c } \cs_new_protected:Npn \clist_remove_all:Nn { \__clist_remove_all:NNn \tl_set:Nx } \cs_new_protected:Npn \clist_gremove_all:Nn { \__clist_remove_all:NNn \tl_gset:Nx } \cs_new_protected:Npn \__clist_remove_all:NNn #1#2#3 { \cs_set:Npn \__clist_tmp:w ##1 , #3 , { ##1 , \q_mark , \use_none_delimit_by_q_stop:w , \__clist_remove_all: } #1 #2 { \exp_after:wN \__clist_remove_all: #2 , \q_mark , #3 , \q_stop } \clist_if_empty:NF #2 { #1 #2 { \exp_args:No \exp_not:o { \exp_after:wN \use_none:n #2 } } } } \cs_new:Npn \__clist_remove_all: { \exp_after:wN \__clist_remove_all:w \__clist_tmp:w , } \cs_new:Npn \__clist_remove_all:w #1 , \q_mark , #2 , { \exp_not:n {#1} } \cs_generate_variant:Nn \clist_remove_all:Nn { c } \cs_generate_variant:Nn \clist_gremove_all:Nn { c } \cs_new_protected:Npn \clist_reverse:N #1 { \tl_set:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } \cs_new_protected:Npn \clist_greverse:N #1 { \tl_gset:Nx #1 { \exp_args:No \clist_reverse:n {#1} } } \cs_generate_variant:Nn \clist_reverse:N { c } \cs_generate_variant:Nn \clist_greverse:N { c } \cs_new:Npn \clist_reverse:n #1 { \__clist_reverse:wwNww ? #1 , \q_mark \__clist_reverse:wwNww ! , \q_mark \__clist_reverse_end:ww \q_stop ? \q_mark } \cs_new:Npn \__clist_reverse:wwNww #1 , #2 \q_mark #3 #4 \q_stop ? #5 \q_mark { #3 ? #2 \q_mark #3 #4 \q_stop #1 , #5 \q_mark } \cs_new:Npn \__clist_reverse_end:ww #1 ! #2 , \q_mark { \exp_not:o { \use_none:n #2 } } \prg_new_eq_conditional:NNn \clist_if_empty:N \tl_if_empty:N { p , T , F , TF } \prg_new_eq_conditional:NNn \clist_if_empty:c \tl_if_empty:c { p , T , F , TF } \prg_new_conditional:Npnn \clist_if_empty:n #1 { p , T , F , TF } { \__clist_if_empty_n:w ? #1 , \q_mark \prg_return_false: , \q_mark \prg_return_true: \q_stop } \cs_new:Npn \__clist_if_empty_n:w #1 , { \tl_if_empty:oTF { \use_none:nn #1 ? } { \__clist_if_empty_n:w ? } { \__clist_if_empty_n:wNw } } \cs_new:Npn \__clist_if_empty_n:wNw #1 \q_mark #2#3 \q_stop {#2} \prg_new_protected_conditional:Npnn \clist_if_in:Nn #1#2 { T , F , TF } { \exp_args:No \__clist_if_in_return:nn #1 {#2} } \prg_new_protected_conditional:Npnn \clist_if_in:nn #1#2 { T , F , TF } { \clist_set:Nn \l__clist_internal_clist {#1} \exp_args:No \__clist_if_in_return:nn \l__clist_internal_clist {#2} } \cs_new_protected:Npn \__clist_if_in_return:nn #1#2 { \cs_set:Npn \__clist_tmp:w ##1 ,#2, { } \tl_if_empty:oTF { \__clist_tmp:w ,#1, {} {} ,#2, } { \prg_return_false: } { \prg_return_true: } } \prg_generate_conditional_variant:Nnn \clist_if_in:Nn { NV , No , c , cV , co } { T , F , TF } \prg_generate_conditional_variant:Nnn \clist_if_in:nn { nV , no } { T , F , TF } \cs_new:Npn \clist_map_function:NN #1#2 { \clist_if_empty:NF #1 { \exp_last_unbraced:NNo \__clist_map_function:Nw #2 #1 , \q_recursion_tail , \__prg_break_point:Nn \clist_map_break: { } } } \cs_new:Npn \__clist_map_function:Nw #1#2 , { \__quark_if_recursion_tail_break:nN {#2} \clist_map_break: #1 {#2} \__clist_map_function:Nw #1 } \cs_generate_variant:Nn \clist_map_function:NN { c } \cs_new:Npn \clist_map_function:nN #1#2 { \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #2 } \q_mark #1, \q_recursion_tail, \__prg_break_point:Nn \clist_map_break: { } } \cs_new:Npn \__clist_map_function_n:Nn #1 #2 { \__quark_if_recursion_tail_break:nN {#2} \clist_map_break: \tl_if_empty:nF {#2} { \__clist_map_unbrace:Nw #1 #2, } \__clist_trim_spaces_generic:nw { \__clist_map_function_n:Nn #1 } \q_mark } \cs_new:Npn \__clist_map_unbrace:Nw #1 #2, { #1 {#2} } \cs_new_protected:Npn \clist_map_inline:Nn #1#2 { \clist_if_empty:NF #1 { \int_gincr:N \g__prg_map_int \cs_gset_protected:cpn { __prg_map_ \int_use:N \g__prg_map_int :w } ##1 {#2} \exp_last_unbraced:Nco \__clist_map_function:Nw { __prg_map_ \int_use:N \g__prg_map_int :w } #1 , \q_recursion_tail , \__prg_break_point:Nn \clist_map_break: { \int_gdecr:N \g__prg_map_int } } } \cs_new_protected:Npn \clist_map_inline:nn #1 { \clist_set:Nn \l__clist_internal_clist {#1} \clist_map_inline:Nn \l__clist_internal_clist } \cs_generate_variant:Nn \clist_map_inline:Nn { c } \cs_new_protected:Npn \clist_map_variable:NNn #1#2#3 { \clist_if_empty:NF #1 { \exp_args:Nno \use:nn { \__clist_map_variable:Nnw #2 {#3} } #1 , \q_recursion_tail , \q_recursion_stop \__prg_break_point:Nn \clist_map_break: { } } } \cs_new_protected:Npn \clist_map_variable:nNn #1 { \clist_set:Nn \l__clist_internal_clist {#1} \clist_map_variable:NNn \l__clist_internal_clist } \cs_new_protected:Npn \__clist_map_variable:Nnw #1#2#3, { \tl_set:Nn #1 {#3} \quark_if_recursion_tail_stop:N #1 \use:n {#2} \__clist_map_variable:Nnw #1 {#2} } \cs_generate_variant:Nn \clist_map_variable:NNn { c } \cs_new:Npn \clist_map_break: { \__prg_map_break:Nn \clist_map_break: { } } \cs_new:Npn \clist_map_break:n { \__prg_map_break:Nn \clist_map_break: } \cs_new:Npn \clist_count:N #1 { \int_eval:n { 0 \clist_map_function:NN #1 \__clist_count:n } } \cs_generate_variant:Nn \clist_count:N { c } \cs_new:Npx \clist_count:n #1 { \exp_not:N \int_eval:n { 0 \exp_not:N \__clist_count:w \c_space_tl #1 \exp_not:n { , \q_recursion_tail , \q_recursion_stop } } } \cs_new:Npn \__clist_count:n #1 { + 1 } \cs_new:Npx \__clist_count:w #1 , { \exp_not:n { \exp_args:Nf \quark_if_recursion_tail_stop:n } {#1} \exp_not:N \tl_if_blank:nF {#1} { + 1 } \exp_not:N \__clist_count:w \c_space_tl } \cs_new:Npn \clist_use:Nnnn #1#2#3#4 { \clist_if_exist:NTF #1 { \int_case:nnF { \clist_count:N #1 } { { 0 } { } { 1 } { \exp_after:wN \__clist_use:wwn #1 , , { } } { 2 } { \exp_after:wN \__clist_use:wwn #1 , {#2} } } { \exp_after:wN \__clist_use:nwwwwnwn \exp_after:wN { \exp_after:wN } #1 , \q_mark , { \__clist_use:nwwwwnwn {#3} } \q_mark , { \__clist_use:nwwn {#4} } \q_stop { } } } { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } } \cs_generate_variant:Nn \clist_use:Nnnn { c } \cs_new:Npn \__clist_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } } \cs_new:Npn \__clist_use:nwwwwnwn #1#2 , #3 , #4 , #5 \q_mark , #6#7 \q_stop #8 { #6 {#3} , {#4} , #5 \q_mark , {#6} #7 \q_stop { #8 #1 #2 } } \cs_new:Npn \__clist_use:nwwn #1#2 , #3 \q_stop #4 { \exp_not:n { #4 #1 #2 } } \cs_new:Npn \clist_use:Nn #1#2 { \clist_use:Nnnn #1 {#2} {#2} {#2} } \cs_generate_variant:Nn \clist_use:Nn { c } \cs_new:Npn \clist_item:Nn #1#2 { \__clist_item:ffoN { \clist_count:N #1 } { \int_eval:n {#2} } #1 \__clist_item_N_loop:nw } \cs_new:Npn \__clist_item:nnnN #1#2#3#4 { \int_compare:nNnTF {#2} < 0 { \int_compare:nNnTF {#2} < { - #1 } { \use_none_delimit_by_q_stop:w } { \exp_args:Nf #4 { \int_eval:n { #2 + 1 + #1 } } } } { \int_compare:nNnTF {#2} > {#1} { \use_none_delimit_by_q_stop:w } { #4 {#2} } } { } , #3 , \q_stop } \cs_generate_variant:Nn \__clist_item:nnnN { ffo, ff } \cs_new:Npn \__clist_item_N_loop:nw #1 #2, { \int_compare:nNnTF {#1} = 0 { \use_i_delimit_by_q_stop:nw { \exp_not:n {#2} } } { \exp_args:Nf \__clist_item_N_loop:nw { \int_eval:n { #1 - 1 } } } } \cs_generate_variant:Nn \clist_item:Nn { c } \cs_new:Npn \clist_item:nn #1#2 { \__clist_item:ffnN { \clist_count:n {#1} } { \int_eval:n {#2} } {#1} \__clist_item_n:nw } \cs_new:Npn \__clist_item_n:nw #1 { \__clist_item_n_loop:nw {#1} \prg_do_nothing: } \cs_new:Npn \__clist_item_n_loop:nw #1 #2, { \exp_args:No \tl_if_blank:nTF {#2} { \__clist_item_n_loop:nw {#1} \prg_do_nothing: } { \int_compare:nNnTF {#1} = 0 { \exp_args:No \__clist_item_n_end:n {#2} } { \exp_args:Nf \__clist_item_n_loop:nw { \int_eval:n { #1 - 1 } } \prg_do_nothing: } } } \cs_new:Npn \__clist_item_n_end:n #1 #2 \q_stop { \__tl_trim_spaces:nn { \q_mark #1 } { \exp_last_unbraced:No \__clist_item_n_strip:w } , } \cs_new:Npn \__clist_item_n_strip:w #1 , { \exp_not:n {#1} } \cs_new_protected:Npn \clist_show:N { \__clist_show:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \clist_show:N { c } \cs_new_protected:Npn \clist_log:N { \__clist_show:NN \msg_log:nnxxxx } \cs_generate_variant:Nn \clist_log:N { c } \cs_new_protected:Npn \__clist_show:NN #1#2 { \__kernel_check_defined:NT #2 { #1 { LaTeX/kernel } { show-clist } { \token_to_str:N #2 } { \clist_map_function:NN #2 \msg_show_item:n } { } { } } } \cs_new_protected:Npn \clist_show:n { \__clist_show:Nn \msg_show:nnxxxx } \cs_new_protected:Npn \clist_log:n { \__clist_show:Nn \msg_log:nnxxxx } \cs_new_protected:Npn \__clist_show:Nn #1#2 { #1 { LaTeX/kernel } { show-clist } { } { \clist_map_function:nN {#2} \msg_show_item:n } { } { } } \clist_new:N \l_tmpa_clist \clist_new:N \l_tmpb_clist \clist_new:N \g_tmpa_clist \clist_new:N \g_tmpb_clist %% File: l3token.dtx Copyright (C) 2005-2017 The LaTeX3 Project \cs_new_protected:Npn \char_set_catcode:nn #1#2 { \tex_catcode:D \__int_eval:n {#1} = \__int_eval:n {#2} } \cs_new:Npn \char_value_catcode:n #1 { \tex_the:D \tex_catcode:D \__int_eval:n {#1} } \cs_new_protected:Npn \char_show_value_catcode:n #1 { \exp_args:Nf \tl_show:n { \char_value_catcode:n {#1} } } \cs_new_protected:Npn \char_set_catcode_escape:N #1 { \char_set_catcode:nn { `#1 } { 0 } } \cs_new_protected:Npn \char_set_catcode_group_begin:N #1 { \char_set_catcode:nn { `#1 } { 1 } } \cs_new_protected:Npn \char_set_catcode_group_end:N #1 { \char_set_catcode:nn { `#1 } { 2 } } \cs_new_protected:Npn \char_set_catcode_math_toggle:N #1 { \char_set_catcode:nn { `#1 } { 3 } } \cs_new_protected:Npn \char_set_catcode_alignment:N #1 { \char_set_catcode:nn { `#1 } { 4 } } \cs_new_protected:Npn \char_set_catcode_end_line:N #1 { \char_set_catcode:nn { `#1 } { 5 } } \cs_new_protected:Npn \char_set_catcode_parameter:N #1 { \char_set_catcode:nn { `#1 } { 6 } } \cs_new_protected:Npn \char_set_catcode_math_superscript:N #1 { \char_set_catcode:nn { `#1 } { 7 } } \cs_new_protected:Npn \char_set_catcode_math_subscript:N #1 { \char_set_catcode:nn { `#1 } { 8 } } \cs_new_protected:Npn \char_set_catcode_ignore:N #1 { \char_set_catcode:nn { `#1 } { 9 } } \cs_new_protected:Npn \char_set_catcode_space:N #1 { \char_set_catcode:nn { `#1 } { 10 } } \cs_new_protected:Npn \char_set_catcode_letter:N #1 { \char_set_catcode:nn { `#1 } { 11 } } \cs_new_protected:Npn \char_set_catcode_other:N #1 { \char_set_catcode:nn { `#1 } { 12 } } \cs_new_protected:Npn \char_set_catcode_active:N #1 { \char_set_catcode:nn { `#1 } { 13 } } \cs_new_protected:Npn \char_set_catcode_comment:N #1 { \char_set_catcode:nn { `#1 } { 14 } } \cs_new_protected:Npn \char_set_catcode_invalid:N #1 { \char_set_catcode:nn { `#1 } { 15 } } \cs_new_protected:Npn \char_set_catcode_escape:n #1 { \char_set_catcode:nn {#1} { 0 } } \cs_new_protected:Npn \char_set_catcode_group_begin:n #1 { \char_set_catcode:nn {#1} { 1 } } \cs_new_protected:Npn \char_set_catcode_group_end:n #1 { \char_set_catcode:nn {#1} { 2 } } \cs_new_protected:Npn \char_set_catcode_math_toggle:n #1 { \char_set_catcode:nn {#1} { 3 } } \cs_new_protected:Npn \char_set_catcode_alignment:n #1 { \char_set_catcode:nn {#1} { 4 } } \cs_new_protected:Npn \char_set_catcode_end_line:n #1 { \char_set_catcode:nn {#1} { 5 } } \cs_new_protected:Npn \char_set_catcode_parameter:n #1 { \char_set_catcode:nn {#1} { 6 } } \cs_new_protected:Npn \char_set_catcode_math_superscript:n #1 { \char_set_catcode:nn {#1} { 7 } } \cs_new_protected:Npn \char_set_catcode_math_subscript:n #1 { \char_set_catcode:nn {#1} { 8 } } \cs_new_protected:Npn \char_set_catcode_ignore:n #1 { \char_set_catcode:nn {#1} { 9 } } \cs_new_protected:Npn \char_set_catcode_space:n #1 { \char_set_catcode:nn {#1} { 10 } } \cs_new_protected:Npn \char_set_catcode_letter:n #1 { \char_set_catcode:nn {#1} { 11 } } \cs_new_protected:Npn \char_set_catcode_other:n #1 { \char_set_catcode:nn {#1} { 12 } } \cs_new_protected:Npn \char_set_catcode_active:n #1 { \char_set_catcode:nn {#1} { 13 } } \cs_new_protected:Npn \char_set_catcode_comment:n #1 { \char_set_catcode:nn {#1} { 14 } } \cs_new_protected:Npn \char_set_catcode_invalid:n #1 { \char_set_catcode:nn {#1} { 15 } } \cs_new_protected:Npn \char_set_mathcode:nn #1#2 { \tex_mathcode:D \__int_eval:n {#1} = \__int_eval:n {#2} } \cs_new:Npn \char_value_mathcode:n #1 { \tex_the:D \tex_mathcode:D \__int_eval:n {#1} } \cs_new_protected:Npn \char_show_value_mathcode:n #1 { \exp_args:Nf \tl_show:n { \char_value_mathcode:n {#1} } } \cs_new_protected:Npn \char_set_lccode:nn #1#2 { \tex_lccode:D \__int_eval:n {#1} = \__int_eval:n {#2} } \cs_new:Npn \char_value_lccode:n #1 { \tex_the:D \tex_lccode:D \__int_eval:n {#1} } \cs_new_protected:Npn \char_show_value_lccode:n #1 { \exp_args:Nf \tl_show:n { \char_value_lccode:n {#1} } } \cs_new_protected:Npn \char_set_uccode:nn #1#2 { \tex_uccode:D \__int_eval:n {#1} = \__int_eval:n {#2} } \cs_new:Npn \char_value_uccode:n #1 { \tex_the:D \tex_uccode:D \__int_eval:n {#1} } \cs_new_protected:Npn \char_show_value_uccode:n #1 { \exp_args:Nf \tl_show:n { \char_value_uccode:n {#1} } } \cs_new_protected:Npn \char_set_sfcode:nn #1#2 { \tex_sfcode:D \__int_eval:n {#1} = \__int_eval:n {#2} } \cs_new:Npn \char_value_sfcode:n #1 { \tex_the:D \tex_sfcode:D \__int_eval:n {#1} } \cs_new_protected:Npn \char_show_value_sfcode:n #1 { \exp_args:Nf \tl_show:n { \char_value_sfcode:n {#1} } } \seq_new:N \l_char_special_seq \seq_set_split:Nnn \l_char_special_seq { } { \ \" \# \$ \% \& \\ \^ \_ \{ \} \~ } \seq_new:N \l_char_active_seq \seq_set_split:Nnn \l_char_active_seq { } { \" \$ \& \^ \_ \~ } \group_begin: \char_set_catcode_active:N \^^@ \cs_set_protected:Npn \__char_tmp:nN #1#2 { \cs_new_protected:cpn { #1 :nN } ##1 { \group_begin: \char_set_lccode:nn { `\^^@ } { ##1 } \tex_lowercase:D { \group_end: #2 ^^@ } } \cs_new_protected:cpx { #1 :NN } ##1 { \exp_not:c { #1 : nN } { `##1 } } } \__char_tmp:nN { char_set_active_eq } \cs_set_eq:NN \__char_tmp:nN { char_gset_active_eq } \cs_gset_eq:NN \group_end: \cs_generate_variant:Nn \char_set_active_eq:NN { Nc } \cs_generate_variant:Nn \char_gset_active_eq:NN { Nc } \cs_generate_variant:Nn \char_set_active_eq:nN { nc } \cs_generate_variant:Nn \char_gset_active_eq:nN { nc } \__debug_patch_args:nNNpn { { \__int_eval:n {#1} } { \__int_eval:n {#2} } } \cs_new:Npn \char_generate:nn #1#2 { \exp:w \exp_after:wN \__char_generate_aux:w \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; } \cs_new:Npn \__char_generate:nn #1#2 { \exp:w \exp_after:wN \__char_generate_aux:nnw \exp_after:wN { \__int_value:w \__int_eval:w #1 } {#2} \exp_end: } \cs_new:Npn \__char_generate_aux:w #1 ; #2 ; { \if_int_compare:w #2 = 13 \exp_stop_f: \__msg_kernel_expandable_error:nn { kernel } { char-active } \else: \if_int_compare:w #2 = 10 \exp_stop_f: \if_int_compare:w #1 = 0 \exp_stop_f: \__msg_kernel_expandable_error:nn { kernel } { char-null-space } \else: \__msg_kernel_expandable_error:nn { kernel } { char-space } \fi: \else: \if_int_odd:w 0 \if_int_compare:w #2 < 1 \exp_stop_f: 1 \fi: \if_int_compare:w #2 = 5 \exp_stop_f: 1 \fi: \if_int_compare:w #2 = 9 \exp_stop_f: 1 \fi: \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f: \__msg_kernel_expandable_error:nn { kernel } { char-invalid-catcode } \else: \if_int_odd:w 0 \if_int_compare:w #1 < 0 \exp_stop_f: 1 \fi: \if_int_compare:w #1 > \c__char_max_int 1 \fi: \exp_stop_f: \__msg_kernel_expandable_error:nn { kernel } { char-out-of-range } \else: \__char_generate_aux:nnw {#1} {#2} \fi: \fi: \fi: \fi: \exp_end: } \tl_new:N \l__char_tmp_tl \group_begin: \char_set_catcode_active:N \^^L \cs_set:Npn ^^L { } \char_set_catcode_other:n { 0 } \if_int_odd:w 0 \cs_if_exist:NT \luatex_directlua:D { 1 } \cs_if_exist:NT \utex_charcat:D { 1 } \exp_stop_f: \int_const:Nn \c__char_max_int { 1114111 } \cs_if_exist:NTF \luatex_directlua:D { \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end: { #3 \exp_after:wN \exp_end: \luatex_directlua:D { l3kernel.charcat(#1, #2) } } } { \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end: { #3 \exp_after:wN \exp_end: \utex_charcat:D #1 ~ #2 ~ } } \else: \int_const:Nn \c__char_max_int { 255 } \tl_set:Nn \l__char_tmp_tl { \exp_not:N \or: } \char_set_catcode_group_begin:n { 0 } % { \tl_put_right:Nn \l__char_tmp_tl { ^^@ \if_false: } } \char_set_catcode_group_end:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % } \tl_set:Nx \l__char_tmp_tl { \l__char_tmp_tl } \char_set_catcode_math_toggle:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_alignment:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: \etex_unexpanded:D \exp_after:wN { \exp_after:wN ^^@ \exp_after:wN } } \tl_put_right:Nn \l__char_tmp_tl { \or: } \char_set_catcode_parameter:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_math_superscript:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_math_subscript:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \tl_put_right:Nn \l__char_tmp_tl { \or: } \char_set_catcode_space:n { 0 } \tl_put_right:No \l__char_tmp_tl { \use:n { \or: } ^^@ } \char_set_catcode_letter:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_other:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \char_set_catcode_active:n { 0 } \tl_put_right:Nn \l__char_tmp_tl { \or: ^^@ } \cs_set_protected:Npn \__char_tmp:n #1 { \char_set_lccode:nn { 0 } {#1} \char_set_lccode:nn { 32 } {#1} \exp_args:Nx \tex_lowercase:D { \tl_const:Nn \exp_not:c { c__char_ \__int_to_roman:w #1 _tl } { \exp_not:o \l__char_tmp_tl } } } \int_step_function:nnnN { 0 } { 1 } { 11 } \__char_tmp:n \group_begin: \tl_replace_once:Nnn \l__char_tmp_tl { ^^@ } { \ERROR } \__char_tmp:n { 12 } \group_end: \int_step_function:nnnN { 13 } { 1 } { 255 } \__char_tmp:n \cs_new:Npn \__char_generate_aux:nnw #1#2#3 \exp_end: { #3 \exp_after:wN \exp_after:wN \exp_after:wN \exp_end: \exp_after:wN \exp_after:wN \if_case:w #2 \exp_last_unbraced:Nv \exp_stop_f: { c__char_ \__int_to_roman:w #1 _tl } \fi: } \fi: \group_end: \tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\ } { 12 } } \group_begin: \__chk_if_free_cs:N \c_group_begin_token \tex_global:D \tex_let:D \c_group_begin_token { \__chk_if_free_cs:N \c_group_end_token \tex_global:D \tex_let:D \c_group_end_token } \char_set_catcode_math_toggle:N \* \cs_new_eq:NN \c_math_toggle_token * \char_set_catcode_alignment:N \* \cs_new_eq:NN \c_alignment_token * \cs_new_eq:NN \c_parameter_token # \cs_new_eq:NN \c_math_superscript_token ^ \char_set_catcode_math_subscript:N \* \cs_new_eq:NN \c_math_subscript_token * \__chk_if_free_cs:N \c_space_token \use:n { \tex_global:D \tex_let:D \c_space_token = ~ } ~ \cs_new_eq:NN \c_catcode_letter_token a \cs_new_eq:NN \c_catcode_other_token 1 \group_end: \group_begin: \char_set_catcode_active:N \* \tl_const:Nn \c_catcode_active_tl { \exp_not:N * } \group_end: \prg_new_conditional:Npnn \token_if_group_begin:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_group_begin_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_group_end:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_group_end_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_math_toggle:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_math_toggle_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_alignment:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_alignment_token \prg_return_true: \else: \prg_return_false: \fi: } \group_begin: \cs_set_eq:NN \c_parameter_token \scan_stop: \prg_new_conditional:Npnn \token_if_parameter:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_parameter_token \prg_return_true: \else: \prg_return_false: \fi: } \group_end: \prg_new_conditional:Npnn \token_if_math_superscript:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_math_superscript_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_math_subscript:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_math_subscript_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_space:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_space_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_letter:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_catcode_letter_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_other:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_catcode_other_token \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_active:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \c_catcode_active_tl \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_eq_meaning:NN #1#2 { p , T , F , TF } { \if_meaning:w #1 #2 \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_eq_catcode:NN #1#2 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \exp_not:N #2 \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_eq_charcode:NN #1#2 { p , T , F , TF } { \if_charcode:w \exp_not:N #1 \exp_not:N #2 \prg_return_true: \else: \prg_return_false: \fi: } \use:x { \prg_new_conditional:Npnn \exp_not:N \token_if_macro:N ##1 { p , T , F , TF } { \exp_not:N \exp_after:wN \exp_not:N \__token_if_macro_p:w \exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { ma : } \exp_not:N \q_stop } \cs_new:Npn \exp_not:N \__token_if_macro_p:w ##1 \tl_to_str:n { ma } ##2 \c_colon_str ##3 \exp_not:N \q_stop } { \if_int_compare:w \__str_if_eq_x:nn { #2 } { cro } = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_cs:N #1 { p , T , F , TF } { \if_catcode:w \exp_not:N #1 \scan_stop: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \token_if_expandable:N #1 { p , T , F , TF } { \exp_after:wN \if_meaning:w \exp_not:N #1 #1 \prg_return_false: \else: \if_cs_exist:N #1 \prg_return_true: \else: \prg_return_false: \fi: \fi: } \group_begin: \cs_set_protected:Npn \__token_tmp:w #1 { \use:x { \cs_new:Npn \exp_not:c { __token_delimit_by_ #1 :w } ####1 \tl_to_str:n {#1} ####2 \exp_not:N \q_stop { ####1 \tl_to_str:n {#1} } } } \__token_tmp:w { char" } \__token_tmp:w { count } \__token_tmp:w { dimen } \__token_tmp:w { macro } \__token_tmp:w { muskip } \__token_tmp:w { skip } \__token_tmp:w { toks } \group_end: \group_begin: \cs_set_protected:Npn \__token_tmp:w #1#2#3 { \use:x { \prg_new_conditional:Npnn \exp_not:c { token_if_ #1 :N } ####1 { p , T , F , TF } { \cs_if_exist:cT { tex_ #2 :D } { \exp_not:N \if_meaning:w ####1 \exp_not:c { tex_ #2 :D } \exp_not:N \prg_return_false: \exp_not:N \else: \exp_not:N \if_meaning:w ####1 \exp_not:c { tex_ #2 def:D } \exp_not:N \prg_return_false: \exp_not:N \else: } \exp_not:N \__str_if_eq_x_return:nn { \exp_not:N \exp_after:wN \exp_not:c { __token_delimit_by_ #2 :w } \exp_not:N \token_to_meaning:N ####1 ? \tl_to_str:n {#2} \exp_not:N \q_stop } { \exp_not:n {#3} } \cs_if_exist:cT { tex_ #2 :D } { \exp_not:N \fi: \exp_not:N \fi: } } } } \__token_tmp:w { chardef } { char" } { \token_to_str:N \char" } \__token_tmp:w { mathchardef } { char" } { \token_to_str:N \mathchar" } \__token_tmp:w { long_macro } { macro } { \tl_to_str:n { \long } macro } \__token_tmp:w { protected_macro } { macro } { \tl_to_str:n { \protected } macro } \__token_tmp:w { protected_long_macro } { macro } { \token_to_str:N \protected \tl_to_str:n { \long } macro } \__token_tmp:w { dim_register } { dimen } { \token_to_str:N \dimen } \__token_tmp:w { int_register } { count } { \token_to_str:N \count } \__token_tmp:w { muskip_register } { muskip } { \token_to_str:N \muskip } \__token_tmp:w { skip_register } { skip } { \token_to_str:N \skip } \__token_tmp:w { toks_register } { toks } { \token_to_str:N \toks } \group_end: \tex_chardef:D \c__token_A_int = `A ~ % \use:x { \prg_new_conditional:Npnn \exp_not:N \token_if_primitive:N ##1 { p , T , F , TF } { \exp_not:N \token_if_macro:NTF ##1 \exp_not:N \prg_return_false: { \exp_not:N \exp_after:wN \exp_not:N \__token_if_primitive:NNw \exp_not:N \token_to_meaning:N ##1 \tl_to_str:n { : : : } \exp_not:N \q_stop ##1 } } \cs_new:Npn \exp_not:N \__token_if_primitive:NNw ##1##2 ##3 \c_colon_str ##4 \exp_not:N \q_stop { \exp_not:N \tl_if_empty:oTF { \exp_not:N \__token_if_primitive_space:w ##3 ~ } { \exp_not:N \__token_if_primitive_loop:N ##3 \c_colon_str \exp_not:N \q_stop } { \exp_not:N \__token_if_primitive_nullfont:N } } } \cs_new:Npn \__token_if_primitive_space:w #1 ~ { } \cs_new:Npn \__token_if_primitive_nullfont:N #1 { \if_meaning:w \tex_nullfont:D #1 \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \__token_if_primitive_loop:N #1 { \if_int_compare:w `#1 < \c__token_A_int % \exp_after:wN \__token_if_primitive:Nw \exp_after:wN #1 \else: \exp_after:wN \__token_if_primitive_loop:N \fi: } \cs_new:Npn \__token_if_primitive:Nw #1 #2 \q_stop { \if:w : #1 \exp_after:wN \__token_if_primitive_undefined:N \else: \prg_return_false: \exp_after:wN \use_none:n \fi: } \cs_new:Npn \__token_if_primitive_undefined:N #1 { \if_cs_exist:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \cs_new_eq:NN \l_peek_token ? \cs_new_eq:NN \g_peek_token ? \cs_new_eq:NN \l__peek_search_token ? \tl_new:N \l__peek_search_tl \cs_new:Npn \__peek_true:w { } \cs_new:Npn \__peek_true_aux:w { } \cs_new:Npn \__peek_false:w { } \cs_new:Npn \__peek_tmp:w { } \cs_new_protected:Npn \peek_after:Nw { \tex_futurelet:D \l_peek_token } \cs_new_protected:Npn \peek_gafter:Nw { \tex_global:D \tex_futurelet:D \g_peek_token } \cs_new_protected:Npn \__peek_true_remove:w { \tex_afterassignment:D \__peek_true_aux:w \cs_set_eq:NN \__peek_tmp:w } \cs_new_protected:Npn \__peek_token_generic_aux:NNNTF #1#2#3#4#5 { \group_align_safe_begin: \cs_set_eq:NN \l__peek_search_token #3 \tl_set:Nn \l__peek_search_tl {#3} \cs_set:Npx \__peek_true_aux:w { \exp_not:N \group_align_safe_end: \exp_not:n {#4} } \cs_set_eq:NN \__peek_true:w #1 \cs_set:Npx \__peek_false:w { \exp_not:N \group_align_safe_end: \exp_not:n {#5} } \peek_after:Nw #2 } \cs_new_protected:Npn \__peek_token_generic:NNTF { \__peek_token_generic_aux:NNNTF \__peek_true_aux:w } \cs_new_protected:Npn \__peek_token_generic:NNT #1#2#3 { \__peek_token_generic:NNTF #1 #2 {#3} { } } \cs_new_protected:Npn \__peek_token_generic:NNF #1#2#3 { \__peek_token_generic:NNTF #1 #2 { } {#3} } \cs_new_protected:Npn \__peek_token_remove_generic:NNTF { \__peek_token_generic_aux:NNNTF \__peek_true_remove:w } \cs_new_protected:Npn \__peek_token_remove_generic:NNT #1#2#3 { \__peek_token_remove_generic:NNTF #1 #2 {#3} { } } \cs_new_protected:Npn \__peek_token_remove_generic:NNF #1#2#3 { \__peek_token_remove_generic:NNTF #1 #2 { } {#3} } \cs_new:Npn \__peek_execute_branches_meaning: { \if_meaning:w \l_peek_token \l__peek_search_token \exp_after:wN \__peek_true:w \else: \exp_after:wN \__peek_false:w \fi: } \cs_new:Npn \__peek_execute_branches_catcode: { \if_catcode:w \__peek_execute_branches_catcode_aux: } \cs_new:Npn \__peek_execute_branches_charcode: { \if_charcode:w \__peek_execute_branches_catcode_aux: } \cs_new:Npn \__peek_execute_branches_catcode_aux: { \if_catcode:w \exp_not:N \l_peek_token \scan_stop: \exp_after:wN \exp_after:wN \exp_after:wN \__peek_execute_branches_catcode_auxii:N \exp_after:wN \exp_not:N \else: \exp_after:wN \__peek_execute_branches_catcode_auxiii: \fi: } \cs_new:Npn \__peek_execute_branches_catcode_auxii:N #1 { \exp_not:N #1 \exp_after:wN \exp_not:N \l__peek_search_tl \exp_after:wN \__peek_true:w \else: \exp_after:wN \__peek_false:w \fi: #1 } \cs_new:Npn \__peek_execute_branches_catcode_auxiii: { \exp_not:N \l_peek_token \exp_after:wN \exp_not:N \l__peek_search_tl \exp_after:wN \__peek_true:w \else: \exp_after:wN \__peek_false:w \fi: } \cs_new_protected:Npn \__peek_ignore_spaces_execute_branches: { \if_meaning:w \l_peek_token \c_space_token \exp_after:wN \peek_after:Nw \exp_after:wN \__peek_ignore_spaces_execute_branches: \exp:w \exp_end_continue_f:w \else: \exp_after:wN \__peek_execute_branches: \fi: } \group_begin: \cs_set:Npn \__peek_def:nnnn #1#2#3#4 { \__peek_def:nnnnn {#1} {#2} {#3} {#4} { TF } \__peek_def:nnnnn {#1} {#2} {#3} {#4} { T } \__peek_def:nnnnn {#1} {#2} {#3} {#4} { F } } \cs_set:Npn \__peek_def:nnnnn #1#2#3#4#5 { \cs_new_protected:cpx { #1 #5 } { \tl_if_empty:nF {#2} { \exp_not:n { \cs_set_eq:NN \__peek_execute_branches: #2 } } \exp_not:c { #3 #5 } \exp_not:n {#4} } } \__peek_def:nnnn { peek_catcode:N } { } { __peek_token_generic:NN } { \__peek_execute_branches_catcode: } \__peek_def:nnnn { peek_catcode_ignore_spaces:N } { \__peek_execute_branches_catcode: } { __peek_token_generic:NN } { \__peek_ignore_spaces_execute_branches: } \__peek_def:nnnn { peek_catcode_remove:N } { } { __peek_token_remove_generic:NN } { \__peek_execute_branches_catcode: } \__peek_def:nnnn { peek_catcode_remove_ignore_spaces:N } { \__peek_execute_branches_catcode: } { __peek_token_remove_generic:NN } { \__peek_ignore_spaces_execute_branches: } \__peek_def:nnnn { peek_charcode:N } { } { __peek_token_generic:NN } { \__peek_execute_branches_charcode: } \__peek_def:nnnn { peek_charcode_ignore_spaces:N } { \__peek_execute_branches_charcode: } { __peek_token_generic:NN } { \__peek_ignore_spaces_execute_branches: } \__peek_def:nnnn { peek_charcode_remove:N } { } { __peek_token_remove_generic:NN } { \__peek_execute_branches_charcode: } \__peek_def:nnnn { peek_charcode_remove_ignore_spaces:N } { \__peek_execute_branches_charcode: } { __peek_token_remove_generic:NN } { \__peek_ignore_spaces_execute_branches: } \__peek_def:nnnn { peek_meaning:N } { } { __peek_token_generic:NN } { \__peek_execute_branches_meaning: } \__peek_def:nnnn { peek_meaning_ignore_spaces:N } { \__peek_execute_branches_meaning: } { __peek_token_generic:NN } { \__peek_ignore_spaces_execute_branches: } \__peek_def:nnnn { peek_meaning_remove:N } { } { __peek_token_remove_generic:NN } { \__peek_execute_branches_meaning: } \__peek_def:nnnn { peek_meaning_remove_ignore_spaces:N } { \__peek_execute_branches_meaning: } { __peek_token_remove_generic:NN } { \__peek_ignore_spaces_execute_branches: } \group_end: \exp_args:Nno \use:nn { \cs_new:Npn \__peek_get_prefix_arg_replacement:wN #1 } { \tl_to_str:n { macro : } #2 -> #3 \q_stop #4 } { #4 {#1} {#2} {#3} } \cs_new:Npn \token_get_prefix_spec:N #1 { \token_if_macro:NTF #1 { \exp_after:wN \__peek_get_prefix_arg_replacement:wN \token_to_meaning:N #1 \q_stop \use_i:nnn } { \scan_stop: } } \cs_new:Npn \token_get_arg_spec:N #1 { \token_if_macro:NTF #1 { \exp_after:wN \__peek_get_prefix_arg_replacement:wN \token_to_meaning:N #1 \q_stop \use_ii:nnn } { \scan_stop: } } \cs_new:Npn \token_get_replacement_spec:N #1 { \token_if_macro:NTF #1 { \exp_after:wN \__peek_get_prefix_arg_replacement:wN \token_to_meaning:N #1 \q_stop \use_iii:nnn } { \scan_stop: } } \__debug_deprecation:nnNNpn { 2018-12-31 } { \cs_new_eq:NN } \cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 } %% File: l3prop.dtx Copyright (C) 1990-2017 The LaTeX3 Project \__scan_new:N \s__prop \cs_new:Npn \__prop_pair:wn #1 \s__prop #2 { \__msg_kernel_expandable_error:nn { kernel } { misused-prop } } \tl_new:N \l__prop_internal_tl \tl_const:Nn \c_empty_prop { \s__prop } \cs_new_protected:Npn \prop_new:N #1 { \__chk_if_free_cs:N #1 \cs_gset_eq:NN #1 \c_empty_prop } \cs_generate_variant:Nn \prop_new:N { c } \cs_new_protected:Npn \prop_clear:N #1 { \prop_set_eq:NN #1 \c_empty_prop } \cs_generate_variant:Nn \prop_clear:N { c } \cs_new_protected:Npn \prop_gclear:N #1 { \prop_gset_eq:NN #1 \c_empty_prop } \cs_generate_variant:Nn \prop_gclear:N { c } \cs_new_protected:Npn \prop_clear_new:N #1 { \prop_if_exist:NTF #1 { \prop_clear:N #1 } { \prop_new:N #1 } } \cs_generate_variant:Nn \prop_clear_new:N { c } \cs_new_protected:Npn \prop_gclear_new:N #1 { \prop_if_exist:NTF #1 { \prop_gclear:N #1 } { \prop_new:N #1 } } \cs_generate_variant:Nn \prop_gclear_new:N { c } \cs_new_eq:NN \prop_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \prop_set_eq:Nc \tl_set_eq:Nc \cs_new_eq:NN \prop_set_eq:cN \tl_set_eq:cN \cs_new_eq:NN \prop_set_eq:cc \tl_set_eq:cc \cs_new_eq:NN \prop_gset_eq:NN \tl_gset_eq:NN \cs_new_eq:NN \prop_gset_eq:Nc \tl_gset_eq:Nc \cs_new_eq:NN \prop_gset_eq:cN \tl_gset_eq:cN \cs_new_eq:NN \prop_gset_eq:cc \tl_gset_eq:cc \prop_new:N \l_tmpa_prop \prop_new:N \l_tmpb_prop \prop_new:N \g_tmpa_prop \prop_new:N \g_tmpb_prop \cs_new_protected:Npn \prop_set_from_keyval:Nn #1#2 { \tl_set:Nx #1 { \__prop_from_keyval:n {#2} } } \cs_generate_variant:Nn \prop_set_from_keyval:Nn { c } \cs_new_protected:Npn \prop_gset_from_keyval:Nn #1#2 { \tl_gset:Nx #1 { \__prop_from_keyval:n {#2} } } \cs_generate_variant:Nn \prop_gset_from_keyval:Nn { c } \cs_new_protected:Npn \prop_const_from_keyval:Nn #1#2 { \tl_const:Nx #1 { \__prop_from_keyval:n {#2} } } \cs_generate_variant:Nn \prop_const_from_keyval:Nn { c } \cs_new:Npn \__prop_from_keyval:n #1 { \s__prop \__prop_from_keyval_loop:w \q_mark #1 , \q_recursion_tail , \q_recursion_stop } \cs_new:Npn \__prop_from_keyval_loop:w #1 , { \quark_if_recursion_tail_stop:o { \use_none:n #1 } \__prop_from_keyval_split:Nw \__prop_from_keyval_key:w #1 = = \q_stop { \use_none:n #1 } \__prop_from_keyval_loop:w \q_mark } \cs_new:Npn \__prop_from_keyval_split:Nw #1#2 = { \__tl_trim_spaces:nn {#2} { \exp_last_unbraced:No #1 } \q_nil } \cs_new:Npn \__prop_from_keyval_key:w #1 \q_nil #2 \q_stop { \__prop_from_keyval_split:Nw \__prop_from_keyval_value:w \q_mark #2 \q_stop {#1} } \cs_new:Npn \__prop_from_keyval_value:w #1 \q_nil #2 \q_stop #3#4 { \tl_if_empty:nF { #3 #1 #2 } { \str_if_eq:nnTF {#2} { = } { \exp_not:N \__prop_pair:wn \tl_to_str:n {#3} \s__prop { \exp_not:n {#1} } } { \exp_args:Nnno \__msg_kernel_expandable_error:nnn { kernel } { prop-keyval } {#4} } } } \cs_new_protected:Npn \__prop_split:NnTF #1#2 { \exp_args:NNo \__prop_split_aux:NnTF #1 { \tl_to_str:n {#2} } } \cs_new_protected:Npn \__prop_split_aux:NnTF #1#2#3#4 { \cs_set:Npn \__prop_split_aux:w ##1 \__prop_pair:wn #2 \s__prop ##2 ##3 \q_mark ##4 ##5 \q_stop { ##4 {#3} {#4} } \exp_after:wN \__prop_split_aux:w #1 \q_mark \use_i:nn \__prop_pair:wn #2 \s__prop { } \q_mark \use_ii:nn \q_stop } \cs_new:Npn \__prop_split_aux:w { } \cs_new_protected:Npn \prop_remove:Nn #1#2 { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #1 { ##1 ##3 } } { } } \cs_new_protected:Npn \prop_gremove:Nn #1#2 { \__prop_split:NnTF #1 {#2} { \tl_gset:Nn #1 { ##1 ##3 } } { } } \cs_generate_variant:Nn \prop_remove:Nn { NV } \cs_generate_variant:Nn \prop_remove:Nn { c , cV } \cs_generate_variant:Nn \prop_gremove:Nn { NV } \cs_generate_variant:Nn \prop_gremove:Nn { c , cV } \cs_new_protected:Npn \prop_get:NnN #1#2#3 { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} } { \tl_set:Nn #3 { \q_no_value } } } \cs_generate_variant:Nn \prop_get:NnN { NV , No } \cs_generate_variant:Nn \prop_get:NnN { c , cV , co } \cs_new_protected:Npn \prop_pop:NnN #1#2#3 { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} \tl_set:Nn #1 { ##1 ##3 } } { \tl_set:Nn #3 { \q_no_value } } } \cs_new_protected:Npn \prop_gpop:NnN #1#2#3 { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} \tl_gset:Nn #1 { ##1 ##3 } } { \tl_set:Nn #3 { \q_no_value } } } \cs_generate_variant:Nn \prop_pop:NnN { No } \cs_generate_variant:Nn \prop_pop:NnN { c , co } \cs_generate_variant:Nn \prop_gpop:NnN { No } \cs_generate_variant:Nn \prop_gpop:NnN { c , co } \cs_new:Npn \prop_item:Nn #1#2 { \exp_last_unbraced:Noo \__prop_item_Nn:nwwn { \tl_to_str:n {#2} } #1 \__prop_pair:wn \tl_to_str:n {#2} \s__prop { } \__prg_break_point: } \cs_new:Npn \__prop_item_Nn:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 { \str_if_eq_x:nnTF {#1} {#3} { \__prg_break:n { \exp_not:n {#4} } } { \__prop_item_Nn:nwwn {#1} } } \cs_generate_variant:Nn \prop_item:Nn { c } \prg_new_protected_conditional:Npnn \prop_pop:NnN #1#2#3 { T , F , TF } { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} \tl_set:Nn #1 { ##1 ##3 } \prg_return_true: } { \prg_return_false: } } \prg_new_protected_conditional:Npnn \prop_gpop:NnN #1#2#3 { T , F , TF } { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} \tl_gset:Nn #1 { ##1 ##3 } \prg_return_true: } { \prg_return_false: } } \prg_generate_conditional_variant:Nnn \prop_pop:NnN { c } { T , F , TF } \prg_generate_conditional_variant:Nnn \prop_gpop:NnN { c } { T , F , TF } \cs_new_protected:Npn \prop_put:Nnn { \__prop_put:NNnn \tl_set:Nx } \cs_new_protected:Npn \prop_gput:Nnn { \__prop_put:NNnn \tl_gset:Nx } \cs_new_protected:Npn \__prop_put:NNnn #1#2#3#4 { \tl_set:Nn \l__prop_internal_tl { \exp_not:N \__prop_pair:wn \tl_to_str:n {#3} \s__prop { \exp_not:n {#4} } } \__prop_split:NnTF #2 {#3} { #1 #2 { \exp_not:n {##1} \l__prop_internal_tl \exp_not:n {##3} } } { #1 #2 { \exp_not:o {#2} \l__prop_internal_tl } } } \cs_generate_variant:Nn \prop_put:Nnn { NnV , Nno , Nnx , NV , NVV , No , Noo } \cs_generate_variant:Nn \prop_put:Nnn { c , cnV , cno , cnx , cV , cVV , co , coo } \cs_generate_variant:Nn \prop_gput:Nnn { NnV , Nno , Nnx , NV , NVV , No , Noo } \cs_generate_variant:Nn \prop_gput:Nnn { c , cnV , cno , cnx , cV , cVV , co , coo } \cs_new_protected:Npn \prop_put_if_new:Nnn { \__prop_put_if_new:NNnn \tl_set:Nx } \cs_new_protected:Npn \prop_gput_if_new:Nnn { \__prop_put_if_new:NNnn \tl_gset:Nx } \cs_new_protected:Npn \__prop_put_if_new:NNnn #1#2#3#4 { \tl_set:Nn \l__prop_internal_tl { \exp_not:N \__prop_pair:wn \tl_to_str:n {#3} \s__prop \exp_not:n { {#4} } } \__prop_split:NnTF #2 {#3} { } { #1 #2 { \exp_not:o {#2} \l__prop_internal_tl } } } \cs_generate_variant:Nn \prop_put_if_new:Nnn { c } \cs_generate_variant:Nn \prop_gput_if_new:Nnn { c } \prg_new_eq_conditional:NNn \prop_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \prop_if_exist:c \cs_if_exist:c { TF , T , F , p } \prg_new_conditional:Npnn \prop_if_empty:N #1 { p , T , F , TF } { \tl_if_eq:NNTF #1 \c_empty_prop \prg_return_true: \prg_return_false: } \prg_generate_conditional_variant:Nnn \prop_if_empty:N { c } { p , T , F , TF } \prg_new_conditional:Npnn \prop_if_in:Nn #1#2 { p , T , F , TF } { \exp_last_unbraced:Noo \__prop_if_in:nwwn { \tl_to_str:n {#2} } #1 \__prop_pair:wn \tl_to_str:n {#2} \s__prop { } \q_recursion_tail \__prg_break_point: } \cs_new:Npn \__prop_if_in:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 { \str_if_eq_x:nnTF {#1} {#3} { \__prop_if_in:N } { \__prop_if_in:nwwn {#1} } } \cs_new:Npn \__prop_if_in:N #1 { \if_meaning:w \q_recursion_tail #1 \prg_return_false: \else: \prg_return_true: \fi: \__prg_break: } \prg_generate_conditional_variant:Nnn \prop_if_in:Nn { NV , No , c , cV , co } { p , T , F , TF } \prg_new_protected_conditional:Npnn \prop_get:NnN #1#2#3 { T , F , TF } { \__prop_split:NnTF #1 {#2} { \tl_set:Nn #3 {##2} \prg_return_true: } { \prg_return_false: } } \prg_generate_conditional_variant:Nnn \prop_get:NnN { NV , No , c , cV , co } { T , F , TF } \cs_new:Npn \prop_map_function:NN #1#2 { \exp_last_unbraced:NNo \__prop_map_function:Nwwn #2 #1 \__prop_pair:wn \q_recursion_tail \s__prop { } \__prg_break_point:Nn \prop_map_break: { } } \cs_new:Npn \__prop_map_function:Nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 { \if_meaning:w \q_recursion_tail #3 \exp_after:wN \prop_map_break: \fi: #1 {#3} {#4} \__prop_map_function:Nwwn #1 } \cs_generate_variant:Nn \prop_map_function:NN { Nc , c , cc } \cs_new_protected:Npn \prop_map_inline:Nn #1#2 { \cs_gset_eq:cN { __prg_map_ \int_use:N \g__prg_map_int :wn } \__prop_pair:wn \int_gincr:N \g__prg_map_int \cs_gset_protected:Npn \__prop_pair:wn ##1 \s__prop ##2 {#2} #1 \__prg_break_point:Nn \prop_map_break: { \int_gdecr:N \g__prg_map_int \cs_gset_eq:Nc \__prop_pair:wn { __prg_map_ \int_use:N \g__prg_map_int :wn } } } \cs_generate_variant:Nn \prop_map_inline:Nn { c } \cs_new:Npn \prop_map_break: { \__prg_map_break:Nn \prop_map_break: { } } \cs_new:Npn \prop_map_break:n { \__prg_map_break:Nn \prop_map_break: } \cs_new_protected:Npn \prop_show:N { \__prop_show:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \prop_show:N { c } \cs_new_protected:Npn \prop_log:N { \__prop_show:NN \msg_log:nnxxxx } \cs_generate_variant:Nn \prop_log:N { c } \cs_new_protected:Npn \__prop_show:NN #1#2 { \__kernel_check_defined:NT #2 { #1 { LaTeX/kernel } { show-prop } { \token_to_str:N #2 } { \prop_map_function:NN #2 \msg_show_item:nn } { } { } } } %% File: l3msg.dtx Copyright (C) 2009-2017 The LaTeX3 Project \tl_new:N \l__msg_internal_tl \bool_new:N \l__msg_line_context_bool \tl_const:Nn \c__msg_text_prefix_tl { msg~text~>~ } \tl_const:Nn \c__msg_more_text_prefix_tl { msg~extra~text~>~ } \prg_new_conditional:Npnn \msg_if_exist:nn #1#2 { p , T , F , TF } { \cs_if_exist:cTF { \c__msg_text_prefix_tl #1 / #2 } { \prg_return_true: } { \prg_return_false: } } \__debug_patch:nnNNpn { } { \__debug_log:x { Defining~message~ #1 / #2 ~\msg_line_context: } } \cs_new_protected:Npn \__chk_if_free_msg:nn #1#2 { \msg_if_exist:nnT {#1} {#2} { \__msg_kernel_error:nnxx { kernel } { message-already-defined } {#1} {#2} } } \cs_new_protected:Npn \msg_new:nnnn #1#2 { \__chk_if_free_msg:nn {#1} {#2} \msg_gset:nnnn {#1} {#2} } \cs_new_protected:Npn \msg_new:nnn #1#2#3 { \msg_new:nnnn {#1} {#2} {#3} { } } \cs_new_protected:Npn \msg_set:nnnn #1#2#3#4 { \cs_set:cpn { \c__msg_text_prefix_tl #1 / #2 } ##1##2##3##4 {#3} \cs_set:cpn { \c__msg_more_text_prefix_tl #1 / #2 } ##1##2##3##4 {#4} } \cs_new_protected:Npn \msg_set:nnn #1#2#3 { \msg_set:nnnn {#1} {#2} {#3} { } } \cs_new_protected:Npn \msg_gset:nnnn #1#2#3#4 { \cs_gset:cpn { \c__msg_text_prefix_tl #1 / #2 } ##1##2##3##4 {#3} \cs_gset:cpn { \c__msg_more_text_prefix_tl #1 / #2 } ##1##2##3##4 {#4} } \cs_new_protected:Npn \msg_gset:nnn #1#2#3 { \msg_gset:nnnn {#1} {#2} {#3} { } } \tl_const:Nn \c__msg_coding_error_text_tl { This~is~a~coding~error. \\ \\ } \tl_const:Nn \c__msg_continue_text_tl { Type~~to~continue } \tl_const:Nn \c__msg_critical_text_tl { Reading~the~current~file~'\g_file_curr_name_str'~will~stop. } \tl_const:Nn \c__msg_fatal_text_tl { This~is~a~fatal~error:~LaTeX~will~abort. } \tl_const:Nn \c__msg_help_text_tl { For~immediate~help~type~H~ } \tl_const:Nn \c__msg_no_info_text_tl { LaTeX~does~not~know~anything~more~about~this~error,~sorry. \c__msg_return_text_tl } \tl_const:Nn \c__msg_on_line_text_tl { on~line } \tl_const:Nn \c__msg_return_text_tl { \\ \\ Try~typing~~to~proceed. \\ If~that~doesn't~work,~type~X~~to~quit. } \tl_const:Nn \c__msg_trouble_text_tl { \\ \\ More~errors~will~almost~certainly~follow: \\ the~LaTeX~run~should~be~aborted. } \cs_new:Npn \msg_line_number: { \int_use:N \tex_inputlineno:D } \cs_gset:Npn \msg_line_context: { \c__msg_on_line_text_tl \c_space_tl \msg_line_number: } \cs_new_protected:Npn \msg_interrupt:nnn #1#2#3 { \tl_if_empty:nTF {#3} { \__msg_interrupt_wrap:nn { \\ \c__msg_no_info_text_tl } {#1 \\\\ #2 \\\\ \c__msg_continue_text_tl } } { \__msg_interrupt_wrap:nn { \\ #3 } {#1 \\\\ #2 \\\\ \c__msg_help_text_tl } } } \cs_new_protected:Npn \__msg_interrupt_wrap:nn #1#2 { \iow_wrap:nnnN {#1} { | ~ } { } \__msg_interrupt_more_text:n \iow_wrap:nnnN {#2} { ! ~ } { } \__msg_interrupt_text:n } \cs_new_protected:Npn \__msg_interrupt_more_text:n #1 { \exp_args:Nx \tex_errhelp:D { |''''''''''''''''''''''''''''''''''''''''''''''' #1 \iow_newline: |............................................... } } \group_begin: \char_set_lccode:nn {`\{} {`\ } \char_set_lccode:nn {`\}} {`\ } \char_set_lccode:nn {`\&} {`\!} \char_set_catcode_active:N \& \tex_lowercase:D { \group_end: \cs_new_protected:Npn \__msg_interrupt_text:n #1 { \iow_term:x { \iow_newline: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \iow_newline: ! } \__iow_with:Nnn \tex_newlinechar:D { `\^^J } { \__iow_with:Nnn \tex_errorcontextlines:D { -1 } { \group_begin: \cs_set_protected:Npn & { \tex_errmessage:D { #1 \use_none:n { ............................................ } } } \exp_after:wN \group_end: & } } } } \cs_new_protected:Npn \msg_log:n #1 { \iow_log:n { ................................................. } \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n \iow_log:n { ................................................. } } \cs_new_protected:Npn \msg_term:n #1 { \iow_term:n { ************************************************* } \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n \iow_term:n { ************************************************* } } \cs_new:Npn \msg_fatal_text:n #1 { Fatal~#1~error \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: } } \cs_new:Npn \msg_critical_text:n #1 { Critical~#1~error \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: } } \cs_new:Npn \msg_error_text:n #1 { #1~error \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: } } \cs_new:Npn \msg_warning_text:n #1 { #1~warning \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: } } \cs_new:Npn \msg_info_text:n #1 { #1~info \bool_if:NT \l__msg_line_context_bool { ~ \msg_line_context: } } \cs_new:Npn \msg_see_documentation_text:n #1 { \\ \\ See~the~ \str_if_eq:nnTF {#1} { LaTeX } { LaTeX3 } {#1} ~ documentation~for~further~information. } \group_begin: \cs_set_protected:Npn \__msg_class_new:nn #1#2 { \prop_new:c { l__msg_redirect_ #1 _prop } \cs_new_protected:cpn { __msg_ #1 _code:nnnnnn } ##1##2##3##4##5##6 {#2} \cs_new_protected:cpn { msg_ #1 :nnnnnn } ##1##2##3##4##5##6 { \use:x { \exp_not:n { \__msg_use:nnnnnnn {#1} {##1} {##2} } { \tl_to_str:n {##3} } { \tl_to_str:n {##4} } { \tl_to_str:n {##5} } { \tl_to_str:n {##6} } } } \cs_new_protected:cpx { msg_ #1 :nnnnn } ##1##2##3##4##5 { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } \cs_new_protected:cpx { msg_ #1 :nnnn } ##1##2##3##4 { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } \cs_new_protected:cpx { msg_ #1 :nnn } ##1##2##3 { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } \cs_new_protected:cpx { msg_ #1 :nn } ##1##2 { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } } \cs_new_protected:cpx { msg_ #1 :nnxxxx } ##1##2##3##4##5##6 { \use:x { \exp_not:N \exp_not:n { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} } {##3} {##4} {##5} {##6} } } \cs_new_protected:cpx { msg_ #1 :nnxxx } ##1##2##3##4##5 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } \cs_new_protected:cpx { msg_ #1 :nnxx } ##1##2##3##4 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } \cs_new_protected:cpx { msg_ #1 :nnx } ##1##2##3 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } } \__msg_class_new:nn { fatal } { \msg_interrupt:nnn { \msg_fatal_text:n {#1} : ~ "#2" } { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} \msg_see_documentation_text:n {#1} } { \c__msg_fatal_text_tl } \tex_end:D } \__msg_class_new:nn { critical } { \msg_interrupt:nnn { \msg_critical_text:n {#1} : ~ "#2" } { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} \msg_see_documentation_text:n {#1} } { \c__msg_critical_text_tl } \tex_endinput:D } \__msg_class_new:nn { error } { \__msg_error:cnnnnn { \c__msg_more_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} { \msg_interrupt:nnn { \msg_error_text:n {#1} : ~ "#2" } { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} \msg_see_documentation_text:n {#1} } } } \cs_new_protected:Npn \__msg_error:cnnnnn #1#2#3#4#5#6 { \cs_if_eq:cNTF {#1} \__msg_no_more_text:nnnn { #6 { } } { #6 { \use:c {#1} {#2} {#3} {#4} {#5} } } } \cs_new:Npn \__msg_no_more_text:nnnn #1#2#3#4 { } \__msg_class_new:nn { warning } { \msg_term:n { \msg_warning_text:n {#1} : ~ "#2" \\ \\ \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } } \__msg_class_new:nn { info } { \msg_log:n { \msg_info_text:n {#1} : ~ "#2" \\ \\ \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } } \__msg_class_new:nn { log } { \iow_wrap:nnnN { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } { } { } \iow_log:n } \__msg_class_new:nn { none } { } \__msg_class_new:nn { show } { \iow_wrap:nnnN { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } { } { } \__msg_show:n } \cs_new_protected:Npn \__msg_show:n #1 { \tl_if_in:nnTF { ^^J #1 } { ^^J > ~ } { \tl_if_in:nnTF { #1 \q_mark } { . \q_mark } { \__msg_show_dot:w } { \__msg_show:w } ^^J #1 \q_stop } { \__msg_show:nn { ? #1 } { } } } \cs_new:Npn \__msg_show_dot:w #1 ^^J > ~ #2 . \q_stop { \__msg_show:nn {#1} {#2} } \cs_new:Npn \__msg_show:w #1 ^^J > ~ #2 \q_stop { \__msg_show:nn {#1} {#2} } \cs_new_protected:Npn \__msg_show:nn #1#2 { \tl_if_empty:nF {#1} { \exp_args:No \iow_term:n { \use_none:n #1 } } \tl_set:Nn \l__msg_internal_tl {#2} \__iow_with:Nnn \tex_newlinechar:D { 10 } { \__iow_with:Nnn \tex_errorcontextlines:D { -1 } { \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN { \exp_after:wN \l__msg_internal_tl } } } } \group_end: \cs_new:Npn \__msg_class_chk_exist:nT #1 { \cs_if_free:cTF { __msg_ #1 _code:nnnnnn } { \__msg_kernel_error:nnx { kernel } { message-class-unknown } {#1} } } \tl_new:N \l__msg_class_tl \tl_new:N \l__msg_current_class_tl \prop_new:N \l__msg_redirect_prop \seq_new:N \l__msg_hierarchy_seq \seq_new:N \l__msg_class_loop_seq \cs_new_protected:Npn \__msg_use:nnnnnnn #1#2#3#4#5#6#7 { \msg_if_exist:nnTF {#2} {#3} { \__msg_class_chk_exist:nT {#1} { \tl_set:Nn \l__msg_current_class_tl {#1} \cs_set_protected:Npx \__msg_use_code: { \exp_not:n { \use:c { __msg_ \l__msg_class_tl _code:nnnnnn } {#2} {#3} {#4} {#5} {#6} {#7} } } \__msg_use_redirect_name:n { #2 / #3 } } } { \__msg_kernel_error:nnxx { kernel } { message-unknown } {#2} {#3} } } \cs_new_protected:Npn \__msg_use_code: { } \cs_new_protected:Npn \__msg_use_redirect_name:n #1 { \prop_get:NnNTF \l__msg_redirect_prop { / #1 } \l__msg_class_tl { \__msg_use_code: } { \seq_clear:N \l__msg_hierarchy_seq \__msg_use_hierarchy:nwwN { } #1 \q_mark \__msg_use_hierarchy:nwwN / \q_mark \use_none_delimit_by_q_stop:w \q_stop \__msg_use_redirect_module:n { } } } \cs_new_protected:Npn \__msg_use_hierarchy:nwwN #1#2 / #3 \q_mark #4 { \seq_put_left:Nn \l__msg_hierarchy_seq {#1} #4 { #1 / #2 } #3 \q_mark #4 } \cs_new_protected:Npn \__msg_use_redirect_module:n #1 { \seq_map_inline:Nn \l__msg_hierarchy_seq { \prop_get:cnNTF { l__msg_redirect_ \l__msg_current_class_tl _prop } {##1} \l__msg_class_tl { \seq_map_break:n { \tl_if_eq:NNTF \l__msg_current_class_tl \l__msg_class_tl { \__msg_use_code: } { \tl_set_eq:NN \l__msg_current_class_tl \l__msg_class_tl \__msg_use_redirect_module:n {##1} } } } { \str_if_eq:nnT {##1} {#1} { \tl_set_eq:NN \l__msg_class_tl \l__msg_current_class_tl \seq_map_break:n { \__msg_use_code: } } } } } \cs_new_protected:Npn \msg_redirect_name:nnn #1#2#3 { \tl_if_empty:nTF {#3} { \prop_remove:Nn \l__msg_redirect_prop { / #1 / #2 } } { \__msg_class_chk_exist:nT {#3} { \prop_put:Nnn \l__msg_redirect_prop { / #1 / #2 } {#3} } } } \cs_new_protected:Npn \msg_redirect_class:nn { \__msg_redirect:nnn { } } \cs_new_protected:Npn \msg_redirect_module:nnn #1 { \__msg_redirect:nnn { / #1 } } \cs_new_protected:Npn \__msg_redirect:nnn #1#2#3 { \__msg_class_chk_exist:nT {#2} { \tl_if_empty:nTF {#3} { \prop_remove:cn { l__msg_redirect_ #2 _prop } {#1} } { \__msg_class_chk_exist:nT {#3} { \prop_put:cnn { l__msg_redirect_ #2 _prop } {#1} {#3} \tl_set:Nn \l__msg_current_class_tl {#2} \seq_clear:N \l__msg_class_loop_seq \__msg_redirect_loop_chk:nnn {#2} {#3} {#1} } } } } \cs_new_protected:Npn \__msg_redirect_loop_chk:nnn #1#2#3 { \seq_put_right:Nn \l__msg_class_loop_seq {#1} \prop_get:cnNT { l__msg_redirect_ #1 _prop } {#3} \l__msg_class_tl { \str_if_eq_x:nnF { \l__msg_class_tl } {#1} { \tl_if_eq:NNTF \l__msg_class_tl \l__msg_current_class_tl { \prop_put:cnn { l__msg_redirect_ #2 _prop } {#3} {#2} \__msg_kernel_warning:nnxxxx { kernel } { message-redirect-loop } { \seq_item:Nn \l__msg_class_loop_seq { 1 } } { \seq_item:Nn \l__msg_class_loop_seq { 2 } } {#3} { \seq_map_function:NN \l__msg_class_loop_seq \__msg_redirect_loop_list:n { \seq_item:Nn \l__msg_class_loop_seq { 1 } } } } { \__msg_redirect_loop_chk:onn \l__msg_class_tl {#2} {#3} } } } } \cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o } \cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ } \cs_new_protected:Npn \__msg_kernel_new:nnnn #1#2 { \msg_new:nnnn { LaTeX } { #1 / #2 } } \cs_new_protected:Npn \__msg_kernel_new:nnn #1#2 { \msg_new:nnn { LaTeX } { #1 / #2 } } \cs_new_protected:Npn \__msg_kernel_set:nnnn #1#2 { \msg_set:nnnn { LaTeX } { #1 / #2 } } \cs_new_protected:Npn \__msg_kernel_set:nnn #1#2 { \msg_set:nnn { LaTeX } { #1 / #2 } } \group_begin: \cs_set_protected:Npn \__msg_kernel_class_new:nN #1 { \__msg_kernel_class_new_aux:nN { kernel_ #1 } } \cs_set_protected:Npn \__msg_kernel_class_new_aux:nN #1#2 { \cs_new_protected:cpn { __msg_ #1 :nnnnnn } ##1##2##3##4##5##6 { \use:x { \exp_not:n { #2 { LaTeX } { ##1 / ##2 } } { \tl_to_str:n {##3} } { \tl_to_str:n {##4} } { \tl_to_str:n {##5} } { \tl_to_str:n {##6} } } } \cs_new_protected:cpx { __msg_ #1 :nnnnn } ##1##2##3##4##5 { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } } \cs_new_protected:cpx { __msg_ #1 :nnnn } ##1##2##3##4 { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } } \cs_new_protected:cpx { __msg_ #1 :nnn } ##1##2##3 { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } } \cs_new_protected:cpx { __msg_ #1 :nn } ##1##2 { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } } \cs_new_protected:cpx { __msg_ #1 :nnxxxx } ##1##2##3##4##5##6 { \use:x { \exp_not:N \exp_not:n { \exp_not:c { __msg_ #1 :nnnnnn } {##1} {##2} } {##3} {##4} {##5} {##6} } } \cs_new_protected:cpx { __msg_ #1 :nnxxx } ##1##2##3##4##5 { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } \cs_new_protected:cpx { __msg_ #1 :nnxx } ##1##2##3##4 { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } \cs_new_protected:cpx { __msg_ #1 :nnx } ##1##2##3 { \exp_not:c { __msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } } \__msg_kernel_class_new:nN { fatal } \__msg_fatal_code:nnnnnn \cs_undefine:N \__msg_kernel_error:nnxx \cs_undefine:N \__msg_kernel_error:nnx \cs_undefine:N \__msg_kernel_error:nn \__msg_kernel_class_new:nN { error } \__msg_error_code:nnnnnn \__msg_kernel_class_new:nN { warning } \msg_warning:nnxxxx \__msg_kernel_class_new:nN { info } \msg_info:nnxxxx \group_end: \__msg_kernel_new:nnnn { kernel } { message-already-defined } { Message~'#2'~for~module~'#1'~already~defined. } { \c__msg_coding_error_text_tl LaTeX~was~asked~to~define~a~new~message~called~'#2'\\ by~the~module~'#1':~this~message~already~exists. \c__msg_return_text_tl } \__msg_kernel_new:nnnn { kernel } { message-unknown } { Unknown~message~'#2'~for~module~'#1'. } { \c__msg_coding_error_text_tl LaTeX~was~asked~to~display~a~message~called~'#2'\\ by~the~module~'#1':~this~message~does~not~exist. \c__msg_return_text_tl } \__msg_kernel_new:nnnn { kernel } { message-class-unknown } { Unknown~message~class~'#1'. } { LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\ this~was~never~defined. \c__msg_return_text_tl } \__msg_kernel_new:nnnn { kernel } { message-redirect-loop } { Message~redirection~loop~caused~by~ {#1} ~=>~ {#2} \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } . } { Adding~the~message~redirection~ {#1} ~=>~ {#2} \tl_if_empty:nF {#3} { ~for~the~module~' \use_none:n #3 ' } ~ created~an~infinite~loop\\\\ \iow_indent:n { #4 \\\\ } } \__msg_kernel_new:nnnn { kernel } { bad-number-of-arguments } { Function~'#1'~cannot~be~defined~with~#2~arguments. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~define~a~function~'#1'~with~ #2~arguments.~ TeX~allows~between~0~and~9~arguments~for~a~single~function. } \__msg_kernel_new:nnn { kernel } { char-active } { Cannot~generate~active~chars. } \__msg_kernel_new:nnn { kernel } { char-invalid-catcode } { Invalid~catcode~for~char~generation. } \__msg_kernel_new:nnn { kernel } { char-null-space } { Cannot~generate~null~char~as~a~space. } \__msg_kernel_new:nnn { kernel } { char-out-of-range } { Charcode~requested~out~of~engine~range. } \__msg_kernel_new:nnn { kernel } { char-space } { Cannot~generate~space~chars. } \__msg_kernel_new:nnnn { kernel } { command-already-defined } { Control~sequence~#1~already~defined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~create~a~new~control~sequence~'#1'~ but~this~name~has~already~been~used~elsewhere. \\ \\ The~current~meaning~is:\\ \ \ #2 } \__msg_kernel_new:nnnn { kernel } { command-not-defined } { Control~sequence~#1~undefined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\ this~has~not~been~defined~yet. } \__msg_kernel_new:nnn { kernel } { deprecated-command } { The~deprecated~command~'#2'~has~been~or~will~be~removed~on~#1. \tl_if_empty:nF {#3} { ~Use~instead~'#3'. } } \__msg_kernel_new:nnnn { kernel } { empty-search-pattern } { Empty~search~pattern. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~ would~lead~to~an~infinite~loop! } \__msg_kernel_new:nnnn { kernel } { out-of-registers } { No~room~for~a~new~#1. } { TeX~only~supports~\int_use:N \c_max_register_int \ % of~each~type.~All~the~#1~registers~have~been~used.~ This~run~will~be~aborted~now. } \__msg_kernel_new:nnnn { kernel } { non-base-function } { Function~'#1'~is~not~a~base~function } { \c__msg_coding_error_text_tl Functions~defined~through~\iow_char:N\\cs_new:Nn~must~have~ a~signature~consisting~of~only~normal~arguments~'N'~and~'n'.~ To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~ and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn. } \__msg_kernel_new:nnnn { kernel } { missing-colon } { Function~'#1'~contains~no~':'. } { \c__msg_coding_error_text_tl Code-level~functions~must~contain~':'~to~separate~the~ argument~specification~from~the~function~name.~This~is~ needed~when~defining~conditionals~or~variants,~or~when~building~a~ parameter~text~from~the~number~of~arguments~of~the~function. } \__msg_kernel_new:nnnn { kernel } { overflow } { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. } { An~attempt~was~made~to~store~#3~at~position~#2~in~the~array~'#1'.~ The~largest~allowed~value~#4~will~be~used~instead. } \__msg_kernel_new:nnnn { kernel } { out-of-bounds } { Access~to~an~entry~beyond~an~array's~bounds. } { An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~ array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3. } \__msg_kernel_new:nnnn { kernel } { protected-predicate } { Predicate~'#1'~must~be~expandable. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~ Only~expandable~tests~can~have~a~predicate~version. } \__msg_kernel_new:nnnn { kernel } { conditional-form-unknown } { Conditional~form~'#1'~for~function~'#2'~unknown. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~ the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist. } \__msg_kernel_new:nnnn { kernel } { scanmark-already-defined } { Scan~mark~#1~already~defined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~ but~this~name~has~already~been~used~for~a~scan~mark. } \__msg_kernel_new:nnnn { kernel } { variable-not-defined } { Variable~#1~undefined. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~ been~defined~yet. } \__msg_kernel_new:nnnn { kernel } { variant-too-long } { Variant~form~'#1'~longer~than~base~signature~of~'#2'. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~ with~a~signature~starting~with~'#1',~but~that~is~longer~than~ the~signature~(part~after~the~colon)~of~'#2'. } \__msg_kernel_new:nnnn { kernel } { invalid-variant } { Variant~form~'#1'~invalid~for~base~form~'#2'. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~ with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~ from~type~'#3'~to~type~'#4'. } \bool_if:NTF \l@expl@enable@debug@bool { \__msg_kernel_new:nnnn { kernel } { debug } { The~debugging~option~'#1'~does~not~exist~\msg_line_context:. } { The~functions~'\iow_char:N\\debug_on:n'~and~ '\iow_char:N\\debug_off:n'~only~accept~the~arguments~ 'check-declarations',~'deprecation',~'log-functions',~not~'#1'. } \__msg_kernel_new:nnn { kernel } { expr } { '#2'~in~#1 } \__msg_kernel_new:nnnn { kernel } { local-global } { Inconsistent~local/global~assignment } { \c__msg_coding_error_text_tl \if:w l #2 Local \else: Global \fi: \ assignment~to~a~ \if:w l #1 local \else: \if:w g #1 global \else: constant \fi: \fi: \ variable~'#3'. } \__msg_kernel_new:nnnn { kernel } { non-declared-variable } { The~variable~#1~has~not~been~declared~\msg_line_context:. } { Checking~is~active,~and~you~have~tried~do~so~something~like: \\ \ \ \tl_set:Nn ~ #1 ~ \{ ~ ... ~ \} \\ without~first~having: \\ \ \ \tl_new:N ~ #1 \\ \\ LaTeX~will~create~the~variable~and~continue. } } { \__msg_kernel_new:nnnn { kernel } { enable-debug } { To~use~'#1'~load~expl3~with~the~'enable-debug'~option. } { The~function~'#1'~will~be~ignored~because~it~can~only~work~if~ some~internal~functions~in~expl3~have~been~appropriately~ defined.~This~only~happens~if~one~of~the~options~ 'enable-debug',~'check-declarations'~or~'log-functions'~was~ given~when~loading~expl3. } } \__msg_kernel_new:nnn { kernel } { bad-exp-end-f } { Misused~\exp_end_continue_f:w or~:nw } \__msg_kernel_new:nnn { kernel } { bad-variable } { Erroneous~variable~#1 used! } \__msg_kernel_new:nnn { kernel } { misused-sequence } { A~sequence~was~misused. } \__msg_kernel_new:nnn { kernel } { misused-prop } { A~property~list~was~misused. } \__msg_kernel_new:nnn { kernel } { negative-replication } { Negative~argument~for~\prg_replicate:nn. } \__msg_kernel_new:nnn { kernel } { prop-keyval } { Missing/extra~'='~in~'#1'~(in~'..._keyval:Nn') } \__msg_kernel_new:nnn { kernel } { unknown-comparison } { Relation~'#1'~unknown:~use~=,~<,~>,~==,~!=,~<=,~>=. } \__msg_kernel_new:nnn { kernel } { zero-step } { Zero~step~size~for~step~function~#1. } \__msg_kernel_new:nnn { kernel } { show-clist } { The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } \__msg_kernel_new:nnn { kernel } { show-prop } { The~property~list~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~pairs~(without~outer~braces): #2 . } } \__msg_kernel_new:nnn { kernel } { show-seq } { The~sequence~#1~ \tl_if_empty:nTF {#2} { is~empty \\>~ . } { contains~the~items~(without~outer~braces): #2 . } } \__msg_kernel_new:nnn { kernel } { show-streams } { \tl_if_empty:nTF {#2} { No~ } { The~following~ } \str_case:nn {#1} { { ior } { input ~ } { iow } { output ~ } } streams~are~ \tl_if_empty:nTF {#2} { open } { in~use: #2 . } } \group_begin: \cs_set_protected:Npn \__msg_tmp:w #1#2 { \cs_new:Npn \__msg_expandable_error:n ##1 { \exp:w \exp_after:wN \exp_after:wN \exp_after:wN \__msg_expandable_error:w \exp_after:wN \exp_after:wN \exp_after:wN \exp_end: \use:n { #1 #2 ##1 } #2 } \cs_new:Npn \__msg_expandable_error:w ##1 #2 ##2 #2 {##1} } \exp_args:Ncx \__msg_tmp:w { LaTeX3~error: } { \char_generate:nn { `\ } { 7 } } \group_end: \cs_new:Npn \__msg_kernel_expandable_error:nnnnnn #1#2#3#4#5#6 { \exp_args:Nf \__msg_expandable_error:n { \exp_args:NNc \exp_after:wN \exp_stop_f: { \c__msg_text_prefix_tl LaTeX / #1 / #2 } {#3} {#4} {#5} {#6} } } \cs_new:Npn \__msg_kernel_expandable_error:nnnnn #1#2#3#4#5 { \__msg_kernel_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } \cs_new:Npn \__msg_kernel_expandable_error:nnnn #1#2#3#4 { \__msg_kernel_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } \cs_new:Npn \__msg_kernel_expandable_error:nnn #1#2#3 { \__msg_kernel_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } \cs_new:Npn \__msg_kernel_expandable_error:nn #1#2 { \__msg_kernel_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } %% File: l3file.dtx Copyright (C) 1990-2017 The LaTeX3 Project \str_new:N \g_file_curr_dir_str \str_new:N \g_file_curr_ext_str \str_new:N \g_file_curr_name_str \cs_if_exist:NT \@currname { \str_gset_eq:NN \g_file_curr_name_str \@currname } \seq_new:N \g__file_stack_seq \group_begin: \cs_set_protected:Npn \__file_tmp:w #1#2#3 { \tl_if_blank:nTF {#1} { \cs_set:Npn \__file_tmp:w ##1 " ##2 " ##3 \q_stop { { } {##2} { } } \seq_gput_right:Nx \g__file_stack_seq { \exp_after:wN \__file_tmp:w \tex_jobname:D " \tex_jobname:D " \q_stop } } { \seq_gput_right:Nn \g__file_stack_seq { { } {#1} {#2} } \__file_tmp:w } } \cs_if_exist:NT \@currnamestack { \exp_after:wN \__file_tmp:w \@currnamestack } \group_end: \seq_new:N \g__file_record_seq \tl_new:N \l__file_tmp_tl \str_new:N \l__file_base_name_str \str_new:N \l__file_full_name_str \str_new:N \l__file_dir_str \str_new:N \l__file_ext_str \str_new:N \l__file_name_str \seq_new:N \l_file_search_path_seq \seq_new:N \l__file_tmp_seq \cs_new_protected:Npn \__file_name_sanitize:nN #1#2 { \group_begin: \seq_map_inline:Nn \l_char_active_seq { \tl_set:Nx \l__file_tmp_tl { \iow_char:N ##1 } \char_set_active_eq:NN ##1 \l__file_tmp_tl } \tl_set:Nx \l__file_tmp_tl {#1} \tl_set:Nx \l__file_tmp_tl { \tl_to_str:N \l__file_tmp_tl } \exp_args:NNNV \group_end: \str_set:Nn #2 \l__file_tmp_tl } \cs_new_protected:Npn \__file_name_quote:nN #1#2 { \str_set:Nx #2 {#1} \int_if_even:nF { 0 \tl_map_function:NN #2 \__file_name_quote_aux:n } { \__msg_kernel_error:nnx { kernel } { unbalanced-quote-in-filename } {#2} } \tl_remove_all:Nn #2 { " } \tl_if_in:NnT #2 { ~ } { \str_set:Nx #2 { " \exp_not:V #2 " } } } \cs_new:Npn \__file_name_quote_aux:n #1 { \token_if_eq_charcode:NNT #1 " { + 1 } } \cs_new_protected:Npn \file_get_full_name:nN #1#2 { \__file_name_sanitize:nN {#1} \l__file_base_name_str \__file_get_full_name_search:nN { } \use:n \seq_map_inline:Nn \l_file_search_path_seq { \__file_get_full_name_search:nN { ##1 / } \seq_map_break:n } \cs_if_exist:NT \input@path { \tl_map_inline:Nn \input@path { \__file_get_full_name_search:nN { ##1 } \tl_map_break:n } } \str_clear:N \l__file_full_name_str \__prg_break_point: \str_if_empty:NF \l__file_full_name_str { \exp_args:NV \file_parse_full_name:nNNN \l__file_full_name_str \l__file_dir_str \l__file_name_str \l__file_ext_str \str_if_empty:NT \l__file_ext_str { \__ior_open:No \g__file_internal_ior { \l__file_full_name_str .tex } \ior_if_eof:NF \g__file_internal_ior { \str_put_right:Nn \l__file_full_name_str { .tex } } } } \str_set_eq:NN #2 \l__file_full_name_str \ior_close:N \g__file_internal_ior } \cs_generate_variant:Nn \file_get_full_name:nN { V } \cs_new_protected:Npn \__file_get_full_name_search:nN #1#2 { \__file_name_quote:nN { \tl_to_str:n {#1} \l__file_base_name_str } \l__file_full_name_str \__ior_open:No \g__file_internal_ior \l__file_full_name_str \ior_if_eof:NF \g__file_internal_ior { #2 { \__prg_break: } } } \prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF } { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str { \prg_return_false: } { \prg_return_true: } } \cs_new_protected:Npn \__file_missing:n #1 { \__file_name_sanitize:nN {#1} \l__file_base_name_str \__msg_kernel_error:nnx { kernel } { file-not-found } { \l__file_base_name_str } } \cs_new_protected:Npn \file_input:n #1 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str { \__file_missing:n {#1} } { \__file_input:V \l__file_full_name_str } } \cs_new_protected:Npn \__file_input:n #1 { \clist_if_exist:NTF \@filelist { \@addtofilelist {#1} } { \seq_gput_right:Nn \g__file_record_seq {#1} } \__file_input_push:n {#1} \tex_input:D #1 \c_space_tl \__file_input_pop: } \cs_generate_variant:Nn \__file_input:n { V } \cs_new_protected:Npn \__file_input_push:n #1 { \seq_gpush:Nx \g__file_stack_seq { { \g_file_curr_dir_str } { \g_file_curr_name_str } { \g_file_curr_ext_str } } \file_parse_full_name:nNNN {#1} \l__file_dir_str \l__file_name_str \l__file_ext_str \str_gset_eq:NN \g_file_curr_dir_str \l__file_dir_str \str_gset_eq:NN \g_file_curr_name_str \l__file_name_str \str_gset_eq:NN \g_file_curr_ext_str \l__file_ext_str } \cs_new_protected:Npn \__file_input_pop: { \seq_gpop:NN \g__file_stack_seq \l__file_tmp_tl \exp_after:wN \__file_input_pop:nnn \l__file_tmp_tl } \cs_new_protected:Npn \__file_input_pop:nnn #1#2#3 { \str_gset:Nn \g_file_curr_dir_str {#1} \str_gset:Nn \g_file_curr_name_str {#2} \str_gset:Nn \g_file_curr_ext_str {#3} } \cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4 { \exp_after:wN \__file_parse_full_name_auxi:w \tl_to_str:n { #1 " #1 " } \q_stop #2#3#4 } \cs_new_protected:Npn \__file_parse_full_name_auxi:w #1 " #2 " #3 \q_stop #4#5#6 { \__file_parse_full_name_split:nNNNTF {#2} / #4 #5 { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } } { } \exp_args:No \__file_parse_full_name_split:nNNNTF {#5} . #5 #6 { \str_put_left:Nn #6 { . } } { \str_set_eq:NN #5 #6 \str_clear:N #6 } } \cs_new_protected:Npn \__file_parse_full_name_split:nNNNTF #1#2#3#4 { \cs_set_protected:Npn \__file_tmp:w ##1 ##2 #2 ##3 \q_stop { \tl_if_empty:nTF {##3} { \str_set:Nn #4 {##2} \tl_if_empty:nTF {##1} { \str_clear:N #3 \use_ii:nn } { \str_set:Nx #3 { \str_tail:n {##1} } \use_i:nn } } { \__file_tmp:w { ##1 #2 ##2 } ##3 \q_stop } } \__file_tmp:w { } #1 #2 \q_stop } \cs_new_protected:Npn \file_show_list: { \__file_list:N \msg_show:nnxxxx } \cs_new_protected:Npn \file_log_list: { \__file_list:N \msg_log:nnxxxx } \cs_new_protected:Npn \__file_list:N #1 { \seq_clear:N \l__file_tmp_seq \clist_if_exist:NT \@filelist { \exp_args:NNx \seq_set_from_clist:Nn \l__file_tmp_seq { \tl_to_str:N \@filelist } } \seq_concat:NNN \l__file_tmp_seq \l__file_tmp_seq \g__file_record_seq \seq_remove_duplicates:N \l__file_tmp_seq #1 { LaTeX/kernel } { file-list } { \seq_map_function:NN \l__file_tmp_seq \__file_list_aux:n } { } { } { } } \cs_new:Npn \__file_list_aux:n #1 { \iow_newline: #1 } \AtBeginDocument { \exp_args:NNx \seq_set_from_clist:Nn \l__file_tmp_seq { \tl_to_str:N \@filelist } \seq_gconcat:NNN \g__file_record_seq \g__file_record_seq \l__file_tmp_seq } \int_const:Nn \c_term_ior { 16 } \seq_new:N \g__ior_streams_seq \tl_new:N \l__ior_stream_tl \prop_new:N \g__ior_streams_prop \int_step_inline:nnnn { 0 } { 1 } { \cs_if_exist:NTF \normalend { \tex_count:D 38 ~ } { \tex_count:D 16 ~ % \cs_if_exist:NT \loccount { - 1 } } } { \prop_gput:Nnn \g__ior_streams_prop {#1} { Reserved~by~format } } \cs_new_protected:Npn \ior_new:N #1 { \cs_new_eq:NN #1 \c_term_ior } \cs_generate_variant:Nn \ior_new:N { c } \ior_new:N \g_tmpa_ior \ior_new:N \g_tmpb_ior \cs_new_protected:Npn \ior_open:Nn #1#2 { \ior_open:NnF #1 {#2} { \__file_missing:n {#2} } } \cs_generate_variant:Nn \ior_open:Nn { c } \prg_new_protected_conditional:Npnn \ior_open:Nn #1#2 { T , F , TF } { \file_get_full_name:nN {#2} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str { \prg_return_false: } { \__ior_open:No #1 \l__file_full_name_str \prg_return_true: } } \prg_generate_conditional_variant:Nnn \ior_open:Nn { c } { T , F , TF } \exp_args:NNf \cs_new_protected:Npn \__ior_new:N { \exp_args:NNc \exp_after:wN \exp_stop_f: { newread } } \cs_new_protected:Npn \__ior_open:Nn #1#2 { \ior_close:N #1 \seq_gpop:NNTF \g__ior_streams_seq \l__ior_stream_tl { \__ior_open_stream:Nn #1 {#2} } { \__ior_new:N #1 \tl_set:Nx \l__ior_stream_tl { \int_eval:n {#1} } \__ior_open_stream:Nn #1 {#2} } } \cs_generate_variant:Nn \__ior_open:Nn { No } \cs_new_protected:Npn \__ior_open_stream:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \l__ior_stream_tl \scan_stop: \prop_gput:NVn \g__ior_streams_prop #1 {#2} \tex_openin:D #1 #2 \scan_stop: } \cs_new_protected:Npn \ior_close:N #1 { \int_compare:nT { -1 < #1 < \c_term_ior } { \tex_closein:D #1 \prop_gremove:NV \g__ior_streams_prop #1 \seq_if_in:NVF \g__ior_streams_seq #1 { \seq_gpush:NV \g__ior_streams_seq #1 } \cs_gset_eq:NN #1 \c_term_ior } } \cs_generate_variant:Nn \ior_close:N { c } \cs_new_protected:Npn \ior_show_list: { \__ior_list:N \msg_show:nnxxxx } \cs_new_protected:Npn \ior_log_list: { \__ior_list:N \msg_log:nnxxxx } \cs_new_protected:Npn \__ior_list:N #1 { #1 { LaTeX / kernel } { show-streams } { ior } { \prop_map_function:NN \g__ior_streams_prop \msg_show_item_unbraced:nn } { } { } } \cs_new_eq:NN \if_eof:w \tex_ifeof:D \prg_new_conditional:Npnn \ior_if_eof:N #1 { p , T , F , TF } { \cs_if_exist:NTF #1 { \int_compare:nTF { -1 < #1 < \c_term_ior } { \if_eof:w #1 \prg_return_true: \else: \prg_return_false: \fi: } { \prg_return_true: } } { \prg_return_true: } } \cs_new_protected:Npn \ior_get:NN #1#2 { \tex_read:D #1 to #2 } \cs_new_protected:Npn \ior_str_get:NN #1#2 { \use:x { \int_set:Nn \tex_endlinechar:D { -1 } \exp_not:n { \etex_readline:D #1 to #2 } \int_set:Nn \tex_endlinechar:D { \int_use:N \tex_endlinechar:D } } } \cs_new:Npn \ior_map_break: { \__prg_map_break:Nn \ior_map_break: { } } \cs_new:Npn \ior_map_break:n { \__prg_map_break:Nn \ior_map_break: } \cs_new_protected:Npn \ior_map_inline:Nn { \__ior_map_inline:NNn \ior_get:NN } \cs_new_protected:Npn \ior_str_map_inline:Nn { \__ior_map_inline:NNn \ior_str_get:NN } \cs_new_protected:Npn \__ior_map_inline:NNn { \int_gincr:N \g__prg_map_int \exp_args:Nc \__ior_map_inline:NNNn { __prg_map_ \int_use:N \g__prg_map_int :n } } \cs_new_protected:Npn \__ior_map_inline:NNNn #1#2#3#4 { \cs_gset_protected:Npn #1 ##1 {#4} \ior_if_eof:NF #3 { \__ior_map_inline_loop:NNN #1#2#3 } \__prg_break_point:Nn \ior_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_new_protected:Npn \__ior_map_inline_loop:NNN #1#2#3 { #2 #3 \l__ior_internal_tl \ior_if_eof:NF #3 { \exp_args:No #1 \l__ior_internal_tl \__ior_map_inline_loop:NNN #1#2#3 } } \tl_new:N \l__ior_internal_tl \ior_new:N \g__file_internal_ior \int_const:Nn \c_log_iow { -1 } \int_const:Nn \c_term_iow { \cs_if_exist:NTF \luatex_directlua:D { \int_compare:nNnTF \luatex_luatexversion:D > { 80 } { 128 } { 16 } } { 16 } } \seq_new:N \g__iow_streams_seq \tl_new:N \l__iow_stream_tl \prop_new:N \g__iow_streams_prop \int_step_inline:nnnn { 0 } { 1 } { \cs_if_exist:NTF \normalend { \tex_count:D 39 ~ } { \tex_count:D 17 ~ \cs_if_exist:NT \loccount { - 1 } } } { \prop_gput:Nnn \g__iow_streams_prop {#1} { Reserved~by~format } } \cs_new_protected:Npn \iow_new:N #1 { \cs_new_eq:NN #1 \c_term_iow } \cs_generate_variant:Nn \iow_new:N { c } \iow_new:N \g_tmpa_iow \iow_new:N \g_tmpb_iow \exp_args:NNf \cs_new_protected:Npn \__iow_new:N { \exp_args:NNc \exp_after:wN \exp_stop_f: { newwrite } } \cs_new_protected:Npn \iow_open:Nn #1#2 { \__file_name_sanitize:nN {#2} \l__file_base_name_str \iow_close:N #1 \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl { \__iow_open_stream:NV #1 \l__file_base_name_str } { \__iow_new:N #1 \tl_set:Nx \l__iow_stream_tl { \int_eval:n {#1} } \__iow_open_stream:NV #1 \l__file_base_name_str } } \cs_generate_variant:Nn \iow_open:Nn { c } \cs_new_protected:Npn \__iow_open_stream:Nn #1#2 { \tex_global:D \tex_chardef:D #1 = \l__iow_stream_tl \scan_stop: \prop_gput:NVn \g__iow_streams_prop #1 {#2} \tex_immediate:D \tex_openout:D #1 #2 \scan_stop: } \cs_generate_variant:Nn \__iow_open_stream:Nn { NV } \cs_new_protected:Npn \iow_close:N #1 { \int_compare:nT { - \c_log_iow < #1 < \c_term_iow } { \tex_immediate:D \tex_closeout:D #1 \prop_gremove:NV \g__iow_streams_prop #1 \seq_if_in:NVF \g__iow_streams_seq #1 { \seq_gpush:NV \g__iow_streams_seq #1 } \cs_gset_eq:NN #1 \c_term_iow } } \cs_generate_variant:Nn \iow_close:N { c } \cs_new_protected:Npn \iow_show_list: { \__iow_list:N \msg_show:nnxxxx } \cs_new_protected:Npn \iow_log_list: { \__iow_list:N \msg_log:nnxxxx } \cs_new_protected:Npn \__iow_list:N #1 { #1 { LaTeX / kernel } { show-streams } { iow } { \prop_map_function:NN \g__iow_streams_prop \msg_show_item_unbraced:nn } { } { } } \cs_new_protected:Npn \iow_shipout_x:Nn #1#2 { \tex_write:D #1 {#2} } \cs_generate_variant:Nn \iow_shipout_x:Nn { c, Nx, cx } \cs_new_protected:Npn \iow_shipout:Nn #1#2 { \tex_write:D #1 { \exp_not:n {#2} } } \cs_generate_variant:Nn \iow_shipout:Nn { c, Nx, cx } \cs_new_protected:Npn \__iow_with:Nnn #1#2 { \int_compare:nNnTF {#1} = {#2} { \use:n } { \exp_args:No \__iow_with_aux:nNnn { \int_use:N #1 } #1 {#2} } } \cs_new_protected:Npn \__iow_with_aux:nNnn #1#2#3#4 { \int_set:Nn #2 {#3} #4 \int_set:Nn #2 {#1} } \cs_new_protected:Npn \iow_now:Nn #1#2 { \__iow_with:Nnn \tex_newlinechar:D { `\^^J } { \tex_immediate:D \tex_write:D #1 { \exp_not:n {#2} } } } \cs_generate_variant:Nn \iow_now:Nn { c, Nx, cx } \cs_set_protected:Npn \iow_log:x { \iow_now:Nx \c_log_iow } \cs_new_protected:Npn \iow_log:n { \iow_now:Nn \c_log_iow } \cs_set_protected:Npn \iow_term:x { \iow_now:Nx \c_term_iow } \cs_new_protected:Npn \iow_term:n { \iow_now:Nn \c_term_iow } \cs_new:Npn \iow_newline: { ^^J } \cs_new_eq:NN \iow_char:N \cs_to_str:N \int_new:N \l_iow_line_count_int \int_set:Nn \l_iow_line_count_int { 78 } \tl_new:N \l__iow_newline_tl \int_new:N \l__iow_line_target_int \tl_new:N \l__iow_one_indent_tl \int_new:N \l__iow_one_indent_int \cs_new:Npn \__iow_unindent:w { } \cs_new_protected:Npn \__iow_set_indent:n #1 { \tl_set:Nx \l__iow_one_indent_tl { \exp_args:No \__str_to_other_fast:n { \tl_to_str:n {#1} } } \int_set:Nn \l__iow_one_indent_int { \str_count:N \l__iow_one_indent_tl } \exp_last_unbraced:NNo \cs_set:Npn \__iow_unindent:w \l__iow_one_indent_tl { } } \exp_args:Nx \__iow_set_indent:n { \prg_replicate:nn { 4 } { ~ } } \tl_new:N \l__iow_indent_tl \int_new:N \l__iow_indent_int \tl_new:N \l__iow_line_tl \tl_new:N \l__iow_line_part_tl \bool_new:N \l__iow_line_break_bool \tl_new:N \l__iow_wrap_tl \group_begin: \int_set:Nn \tex_escapechar:D { -1 } \tl_const:Nx \c__iow_wrap_marker_tl { \tl_to_str:n { \^^I \^^O \^^W \^^_ \^^W \^^R \^^A \^^P } } \group_end: \tl_map_inline:nn { { end } { newline } { indent } { unindent } } { \tl_const:cx { c__iow_wrap_ #1 _marker_tl } { \c__iow_wrap_marker_tl #1 \c_catcode_other_space_tl } } \cs_new_protected:Npn \iow_indent:n #1 { \__msg_kernel_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } \cs_new:Npx \__iow_indent:n #1 { \c__iow_wrap_indent_marker_tl #1 \c__iow_wrap_unindent_marker_tl } \cs_new:Npn \__iow_indent_error:n #1 { \__msg_kernel_expandable_error:nnnnn { kernel } { iow-indent } { \iow_wrap:nnnN } { \iow_indent:n } {#1} #1 } \cs_new_protected:Npn \iow_wrap:nnnN #1#2#3#4 { \group_begin: \int_set:Nn \tex_escapechar:D { -1 } \cs_set:Npx \{ { \token_to_str:N \{ } \cs_set:Npx \# { \token_to_str:N \# } \cs_set:Npx \} { \token_to_str:N \} } \cs_set:Npx \% { \token_to_str:N \% } \cs_set:Npx \~ { \token_to_str:N \~ } \int_set:Nn \tex_escapechar:D { 92 } \cs_set_eq:NN \\ \iow_newline: \cs_set_eq:NN \ \c_catcode_other_space_tl \cs_set_eq:NN \iow_indent:n \__iow_indent:n #3 \cs_set_eq:NN \protect \token_to_str:N \tl_set:Nx \l__iow_wrap_tl {#1} \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n \tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 } \tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl } \int_set:Nn \l__iow_line_target_int { \l_iow_line_count_int - \str_count:N \l__iow_newline_tl + 1 } \__iow_wrap_do: \exp_args:NNf \group_end: #4 { \tl_to_str:N \l__iow_wrap_tl } } \cs_new_protected:Npn \__iow_wrap_do: { \tl_set:Nx \l__iow_wrap_tl { \exp_args:No \__str_to_other_fast:n \l__iow_wrap_tl \c__iow_wrap_end_marker_tl } \tl_set:Nx \l__iow_wrap_tl { \exp_after:wN \__iow_wrap_fix_newline:w \l__iow_wrap_tl ^^J \q_nil ^^J \q_stop } \exp_after:wN \__iow_wrap_start:w \l__iow_wrap_tl } \cs_new:Npn \__iow_wrap_fix_newline:w #1 ^^J #2 ^^J { #1 \if_meaning:w \q_nil #2 \use_i_delimit_by_q_stop:nw \fi: \c__iow_wrap_newline_marker_tl \__iow_wrap_fix_newline:w #2 ^^J } \cs_new_protected:Npn \__iow_wrap_start:w { \bool_set_false:N \l__iow_line_break_bool \tl_clear:N \l__iow_line_tl \tl_clear:N \l__iow_line_part_tl \tl_set:Nn \l__iow_wrap_tl { ~ \use_none:n } \int_zero:N \l__iow_indent_int \tl_clear:N \l__iow_indent_tl \__iow_wrap_chunk:nw { \l_iow_line_count_int } } \cs_set_protected:Npn \__iow_tmp:w #1#2 { \cs_new_protected:Npn \__iow_wrap_chunk:nw ##1##2 #2 { \tl_if_empty:nTF {##2} { \tl_clear:N \l__iow_line_part_tl \__iow_wrap_next:nw {##1} } { \tl_if_empty:NTF \l__iow_line_tl { \__iow_wrap_line:nw { \l__iow_indent_tl } ##1 - \l__iow_indent_int ; } { \__iow_wrap_line:nw { } ##1 ; } ##2 #1 \__iow_wrap_end_chunk:w 7 6 5 4 3 2 1 0 \q_stop } } \cs_new_protected:Npn \__iow_wrap_next:nw ##1##2 #1 { \use:c { __iow_wrap_##2:n } {##1} } } \exp_args:NVV \__iow_tmp:w \c_catcode_other_space_tl \c__iow_wrap_marker_tl \cs_new_protected:Npn \__iow_wrap_line:nw #1 { \tex_edef:D \l__iow_line_part_tl { \if_false: } \fi: #1 \exp_after:wN \__iow_wrap_line_loop:w \__int_value:w \__int_eval:w } \cs_new:Npn \__iow_wrap_line_loop:w #1 ; #2#3#4#5#6#7#8#9 { \if_int_compare:w #1 < 8 \exp_stop_f: \__iow_wrap_line_aux:Nw #1 \fi: #2 #3 #4 #5 #6 #7 #8 #9 \exp_after:wN \__iow_wrap_line_loop:w \__int_value:w \__int_eval:w #1 - 8 ; } \cs_new:Npn \__iow_wrap_line_aux:Nw #1#2#3 \exp_after:wN #4 ; { #2 \exp_after:wN \__iow_wrap_line_end:NnnnnnnnN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \exp_after:wN \exp_after:wN \if_case:w #1 \exp_stop_f: \prg_do_nothing: \or: \use_none:n \or: \use_none:nn \or: \use_none:nnn \or: \use_none:nnnn \or: \use_none:nnnnn \or: \use_none:nnnnnn \or: \use_none:nnnnnnn \fi: { } { } { } { } { } { } { } #3 } \cs_new:Npn \__iow_wrap_line_end:NnnnnnnnN #1#2#3#4#5#6#7#8#9 { #2 #3 #4 #5 #6 #7 #8 \use_none:nnnnn \__int_eval:w 8 - ; #9 \token_if_eq_charcode:NNTF \c_space_token #9 { \__iow_wrap_line_end:nw { } } { \if_false: { \fi: } \__iow_wrap_break:w #9 } } \cs_new:Npn \__iow_wrap_line_end:nw #1 { \if_false: { \fi: } \__iow_wrap_store_do:n {#1} \__iow_wrap_next_line:w } \cs_new:Npn \__iow_wrap_end_chunk:w #1 \__int_eval:w #2 - #3 ; #4#5 \q_stop { \if_false: { \fi: } \exp_args:Nf \__iow_wrap_next:nw { \int_eval:n { #2 - #4 } } } \cs_set_protected:Npn \__iow_tmp:w #1 { \cs_new:Npn \__iow_wrap_break:w { \tex_edef:D \l__iow_line_part_tl { \if_false: } \fi: \exp_after:wN \__iow_wrap_break_first:w \l__iow_line_part_tl #1 { ? \__iow_wrap_break_end:w } \q_mark } \cs_new:Npn \__iow_wrap_break_first:w ##1 #1 ##2 { \use_none:nn ##2 \__iow_wrap_break_none:w \__iow_wrap_break_loop:w ##1 #1 ##2 } \cs_new:Npn \__iow_wrap_break_none:w ##1##2 #1 ##3 \q_mark ##4 #1 { \tl_if_empty:NTF \l__iow_line_tl { ##2 ##4 \__iow_wrap_line_end:nw { } } { \__iow_wrap_line_end:nw { \__iow_wrap_trim:N } ##2 ##4 #1 } } \cs_new:Npn \__iow_wrap_break_loop:w ##1 #1 ##2 #1 ##3 { \use_none:n ##3 ##1 #1 \__iow_wrap_break_loop:w ##2 #1 ##3 } \cs_new:Npn \__iow_wrap_break_end:w ##1 #1 ##2 ##3 #1 ##4 \q_mark { ##1 \__iow_wrap_line_end:nw { } ##3 } } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl \cs_new_protected:Npn \__iow_wrap_next_line:w #1#2 \q_stop { \tl_clear:N \l__iow_line_tl \token_if_eq_meaning:NNTF #1 \__iow_wrap_end_chunk:w { \tl_clear:N \l__iow_line_part_tl \bool_set_true:N \l__iow_line_break_bool \__iow_wrap_next:nw { \l__iow_line_target_int } } { \__iow_wrap_line:nw { \l__iow_indent_tl } \l__iow_line_target_int - \l__iow_indent_int ; #1 #2 \q_stop } } \cs_new_protected:Npn \__iow_wrap_indent:n #1 { \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl } \bool_set_false:N \l__iow_line_break_bool \int_add:Nn \l__iow_indent_int { \l__iow_one_indent_int } \tl_put_right:No \l__iow_indent_tl { \l__iow_one_indent_tl } \__iow_wrap_chunk:nw {#1} } \cs_new_protected:Npn \__iow_wrap_unindent:n #1 { \tl_put_right:Nx \l__iow_line_tl { \l__iow_line_part_tl } \bool_set_false:N \l__iow_line_break_bool \int_sub:Nn \l__iow_indent_int { \l__iow_one_indent_int } \tl_set:Nx \l__iow_indent_tl { \exp_after:wN \__iow_unindent:w \l__iow_indent_tl } \__iow_wrap_chunk:nw {#1} } \cs_new_protected:Npn \__iow_wrap_newline:n #1 { \bool_if:NF \l__iow_line_break_bool { \__iow_wrap_store_do:n { \__iow_wrap_trim:N } } \bool_set_false:N \l__iow_line_break_bool \__iow_wrap_chunk:nw { \l__iow_line_target_int } } \cs_new_protected:Npn \__iow_wrap_end:n #1 { \bool_if:NF \l__iow_line_break_bool { \__iow_wrap_store_do:n { \__iow_wrap_trim:N } } \bool_set_false:N \l__iow_line_break_bool } \cs_new_protected:Npn \__iow_wrap_store_do:n #1 { \tl_set:Nx \l__iow_line_tl { \l__iow_line_tl \l__iow_line_part_tl } \tl_set:Nx \l__iow_wrap_tl { \l__iow_wrap_tl \l__iow_newline_tl #1 \l__iow_line_tl } \tl_clear:N \l__iow_line_tl } \cs_set_protected:Npn \__iow_tmp:w #1 { \cs_new:Npn \__iow_wrap_trim:N ##1 { \tl_if_empty:NF ##1 { \exp_after:wN \__iow_wrap_trim:w ##1 \q_stop } } \cs_new:Npn \__iow_wrap_trim:w ##1 #1 \q_stop {##1} } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl \__msg_kernel_new:nnnn { kernel } { file-not-found } { File~'#1'~not~found. } { The~requested~file~could~not~be~found~in~the~current~directory,~ in~the~TeX~search~path~or~in~the~LaTeX~search~path. } \__msg_kernel_new:nnn { kernel } { file-list } { >~File~List~< #1 \\ ............. } \__msg_kernel_new:nnnn { kernel } { input-streams-exhausted } { Input~streams~exhausted } { TeX~can~only~open~up~to~16~input~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } \__msg_kernel_new:nnnn { kernel } { output-streams-exhausted } { Output~streams~exhausted } { TeX~can~only~open~up~to~16~output~streams~at~one~time.\\ All~16~are~currently~in~use,~and~something~wanted~to~open~ another~one. } \__msg_kernel_new:nnnn { kernel } { unbalanced-quote-in-filename } { Unbalanced~quotes~in~file~name~'#1'. } { File~names~must~contain~balanced~numbers~of~quotes~("). } \__msg_kernel_new:nnnn { kernel } { iow-indent } { Only~#1 (arg~1)~allows~#2 } { The~command~#2 can~only~be~used~in~messages~ which~will~be~wrapped~using~#1.~ It~was~called~with~argument~'#3'. } \tl_new:N \g_file_current_name_tl \tl_gset:Nn \g_file_current_name_tl { \g_file_curr_name_str } \__debug:TF { \tl_gput_right:Nn \g__debug_deprecation_on_tl { \__deprecation_error:Nnn \g_file_current_name_tl { \g_file_curr_name_str } { 2018-12-31 } } \tl_gput_right:Nn \g__debug_deprecation_off_tl { \tex_def:D \g_file_current_name_tl { \g_file_curr_name_str } } } { } \__debug_deprecation:nnNNpn { 2018-12-31 } { \seq_put_right:Nn \l_file_search_path_seq } \cs_new_protected:Npn \file_path_include:n #1 { \__file_name_sanitize:nN {#1} \l__file_full_name_str \seq_if_in:NVF \l_file_search_path_seq \l__file_full_name_str { \seq_put_right:NV \l_file_search_path_seq \l__file_full_name_str } } \__debug_deprecation:nnNNpn { 2018-12-31 } { \seq_remove_all:Nn \l_file_search_path_seq } \cs_new_protected:Npn \file_path_remove:n #1 { \__file_name_sanitize:nN {#1} \l__file_full_name_str \seq_remove_all:NV \l_file_search_path_seq \l__file_full_name_str } \__debug_deprecation:nnNNpn { 2018-12-31 } { \file_get_full_name:nN } \cs_new_protected:Npn \file_add_path:nN #1#2 { \file_get_full_name:nN {#1} #2 \str_if_empty:NT #2 { \tl_set:Nn #2 { \q_no_value } } } \__debug_deprecation:nnNNpn { 2017-12-31 } { \ior_str_get:NN } \cs_new_protected:Npn \ior_get_str:NN { \ior_str_get:NN } \__debug_deprecation:nnNNpn { 2018-12-31 } { \file_log_list: } \cs_new_protected:Npn \file_list: { \file_log_list: } \__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_show_list: } \cs_new_protected:Npn \ior_list_streams: { \ior_show_list: } \__debug_deprecation:nnNNpn { 2018-12-31 } { \ior_log_list: } \cs_new_protected:Npn \ior_log_streams: { \ior_log_list: } \__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_show_list: } \cs_new_protected:Npn \iow_list_streams: { \iow_show_list: } \__debug_deprecation:nnNNpn { 2018-12-31 } { \iow_log_list: } \cs_new_protected:Npn \iow_log_streams: { \iow_log_list: } %% File: l3skip.dtx Copyright (C) 2004-2011 Frank Mittelbach, The LaTeX3 Project %% (C) 2012-2017 The LaTeX3 Project \cs_new_eq:NN \if_dim:w \tex_ifdim:D \cs_new_eq:NN \__dim_eval:w \etex_dimexpr:D \cs_new_eq:NN \__dim_eval_end: \tex_relax:D \cs_new_protected:Npn \dim_new:N #1 { \__chk_if_free_cs:N #1 \cs:w newdimen \cs_end: #1 } \cs_generate_variant:Nn \dim_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \dim_const:Nn #1#2 { \dim_new:N #1 \tex_global:D #1 ~ \dim_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \dim_const:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_zero:N #1 { #1 \c_zero_skip } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \dim_zero:N { c } \cs_generate_variant:Nn \dim_gzero:N { c } \cs_new_protected:Npn \dim_zero_new:N #1 { \dim_if_exist:NTF #1 { \dim_zero:N #1 } { \dim_new:N #1 } } \cs_new_protected:Npn \dim_gzero_new:N #1 { \dim_if_exist:NTF #1 { \dim_gzero:N #1 } { \dim_new:N #1 } } \cs_generate_variant:Nn \dim_zero_new:N { c } \cs_generate_variant:Nn \dim_gzero_new:N { c } \prg_new_eq_conditional:NNn \dim_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \dim_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { \__debug_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { \__debug_chk_expr:nNnN {##2} \__dim_eval:w { } #3 } } #2 #3 } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \dim_set:Nn #1#2 { #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \dim_gset:Nn #1#2 { \tex_global:D #1 ~ \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_set:Nn { c } \cs_generate_variant:Nn \dim_gset:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \dim_set_eq:NN #1#2 { #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_set_eq:NN { c , Nc , cc } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \dim_gset_eq:NN #1#2 { \tex_global:D #1 = #2 \scan_stop: } \cs_generate_variant:Nn \dim_gset_eq:NN { c , Nc , cc } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \dim_add:Nn #1#2 { \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \dim_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_add:Nn { c } \cs_generate_variant:Nn \dim_gadd:Nn { c } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \dim_sub:Nn #1#2 { \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \dim_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \__dim_eval:w #2 \__dim_eval_end: \scan_stop: } \cs_generate_variant:Nn \dim_sub:Nn { c } \cs_generate_variant:Nn \dim_gsub:Nn { c } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_abs:n } } \cs_new:Npn \dim_abs:n #1 { \exp_after:wN \__dim_abs:N \dim_use:N \__dim_eval:w #1 \__dim_eval_end: } \cs_new:Npn \__dim_abs:N #1 { \if_meaning:w - #1 \else: \exp_after:wN #1 \fi: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_max:nn } { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_max:nn } } \cs_new:Npn \dim_max:nn #1#2 { \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN \dim_use:N \__dim_eval:w #1 \exp_after:wN ; \dim_use:N \__dim_eval:w #2 ; > \__dim_eval_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_min:nn } { \__debug_chk_expr:nNnN {#2} \__dim_eval:w { } \dim_min:nn } } \cs_new:Npn \dim_min:nn #1#2 { \dim_use:N \__dim_eval:w \exp_after:wN \__dim_maxmin:wwN \dim_use:N \__dim_eval:w #1 \exp_after:wN ; \dim_use:N \__dim_eval:w #2 ; < \__dim_eval_end: } \cs_new:Npn \__dim_maxmin:wwN #1 ; #2 ; #3 { \if_dim:w #1 #3 #2 ~ #1 \else: #2 \fi: } \cs_new:Npn \dim_ratio:nn #1#2 { \__dim_ratio:n {#1} / \__dim_ratio:n {#2} } \cs_new:Npn \__dim_ratio:n #1 { \__int_value:w \__dim_eval:w (#1) \__dim_eval_end: } \__debug_patch_conditional_args:nNNpnn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_compare:nNn } { \__dim_eval_end: #2 } { \__debug_chk_expr:nNnN {#3} \__dim_eval:w { } \dim_compare:nNn } } \prg_new_conditional:Npnn \dim_compare:nNn #1#2#3 { p , T , F , TF } { \if_dim:w \__dim_eval:w #1 #2 \__dim_eval:w #3 \__dim_eval_end: \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \dim_compare:n #1 { p , T , F , TF } { \exp_after:wN \__dim_compare:w \dim_use:N \__dim_eval:w #1 \__prg_compare_error: } \cs_new:Npn \__dim_compare:w #1 \__prg_compare_error: { \exp_after:wN \if_false: \exp:w \exp_end_continue_f:w \__dim_compare:wNN #1 ? { = \__dim_compare_end:w \else: } \q_stop } \exp_args:Nno \use:nn { \cs_new:Npn \__dim_compare:wNN #1 } { \tl_to_str:n {pt} #2#3 } { \if_meaning:w = #3 \use:c { __dim_compare_#2:w } \fi: #1 pt \exp_stop_f: \prg_return_false: \exp_after:wN \use_none_delimit_by_q_stop:w \fi: \reverse_if:N \if_dim:w #1 pt #2 \exp_after:wN \__dim_compare:wNN \dim_use:N \__dim_eval:w #3 } \cs_new:cpn { __dim_compare_ ! :w } #1 \reverse_if:N #2 ! #3 = { #1 #2 = #3 } \cs_new:cpn { __dim_compare_ = :w } #1 \__dim_eval:w = { #1 \__dim_eval:w } \cs_new:cpn { __dim_compare_ < :w } #1 \reverse_if:N #2 < #3 = { #1 #2 > #3 } \cs_new:cpn { __dim_compare_ > :w } #1 \reverse_if:N #2 > #3 = { #1 #2 < #3 } \cs_new:Npn \__dim_compare_end:w #1 \prg_return_false: #2 \q_stop { #1 \prg_return_false: \else: \prg_return_true: \fi: } \cs_new:Npn \dim_case:nnTF #1 { \exp:w \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } } \cs_new:Npn \dim_case:nnT #1#2#3 { \exp:w \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} {#3} { } } \cs_new:Npn \dim_case:nnF #1#2 { \exp:w \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} { } } \cs_new:Npn \dim_case:nn #1#2 { \exp:w \exp_args:Nf \__dim_case:nnTF { \dim_eval:n {#1} } {#2} { } { } } \cs_new:Npn \__dim_case:nnTF #1#2#3#4 { \__dim_case:nw {#1} #2 {#1} { } \q_mark {#3} \q_mark {#4} \q_stop } \cs_new:Npn \__dim_case:nw #1#2#3 { \dim_compare:nNnTF {#1} = {#2} { \__dim_case_end:nw {#3} } { \__dim_case:nw {#1} } } \cs_new_eq:NN \__dim_case_end:nw \__prg_case_end:nw \cs_new:Npn \dim_while_do:nn #1#2 { \dim_compare:nT {#1} { #2 \dim_while_do:nn {#1} {#2} } } \cs_new:Npn \dim_until_do:nn #1#2 { \dim_compare:nF {#1} { #2 \dim_until_do:nn {#1} {#2} } } \cs_new:Npn \dim_do_while:nn #1#2 { #2 \dim_compare:nT {#1} { \dim_do_while:nn {#1} {#2} } } \cs_new:Npn \dim_do_until:nn #1#2 { #2 \dim_compare:nF {#1} { \dim_do_until:nn {#1} {#2} } } \cs_new:Npn \dim_while_do:nNnn #1#2#3#4 { \dim_compare:nNnT {#1} #2 {#3} { #4 \dim_while_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \dim_until_do:nNnn #1#2#3#4 { \dim_compare:nNnF {#1} #2 {#3} { #4 \dim_until_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \dim_do_while:nNnn #1#2#3#4 { #4 \dim_compare:nNnT {#1} #2 {#3} { \dim_do_while:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \dim_do_until:nNnn #1#2#3#4 { #4 \dim_compare:nNnF {#1} #2 {#3} { \dim_do_until:nNnn {#1} #2 {#3} {#4} } } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_eval:n } } \cs_new:Npn \dim_eval:n #1 { \dim_use:N \__dim_eval:w #1 \__dim_eval_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \__dim_eval:n } } \cs_new:Npn \__dim_eval:n #1 { \__dim_eval:w #1 \__dim_eval_end: } \cs_new_eq:NN \dim_use:N \tex_the:D \cs_new:Npn \dim_use:c #1 { \tex_the:D \cs:w #1 \cs_end: } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal:n } } \cs_new:Npn \dim_to_decimal:n #1 { \exp_after:wN \__dim_to_decimal:w \dim_use:N \__dim_eval:w #1 \__dim_eval_end: } \use:x { \cs_new:Npn \exp_not:N \__dim_to_decimal:w ##1 . ##2 \tl_to_str:n { pt } } { \int_compare:nNnTF {#2} > { 0 } { #1 . #2 } { #1 } } \cs_new:Npn \dim_to_decimal_in_bp:n #1 { \dim_to_decimal:n { ( #1 ) * 800 / 803 } } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__dim_eval:w { } \dim_to_decimal_in_sp:n } } \cs_new:Npn \dim_to_decimal_in_sp:n #1 { \int_eval:n { \__dim_eval:w #1 \__dim_eval_end: } } \cs_new:Npn \dim_to_decimal_in_unit:nn #1#2 { \dim_to_decimal:n { 1pt * \dim_ratio:nn {#1} {#2} } } \cs_new_eq:NN \dim_show:N \__kernel_register_show:N \cs_generate_variant:Nn \dim_show:N { c } \cs_new_protected:Npn \dim_show:n { \msg_show_eval:Nn \dim_eval:n } \cs_new_eq:NN \dim_log:N \__kernel_register_log:N \cs_new_eq:NN \dim_log:c \__kernel_register_log:c \cs_new_protected:Npn \dim_log:n { \msg_log_eval:Nn \dim_eval:n } \dim_const:Nn \c_zero_dim { 0 pt } \dim_const:Nn \c_max_dim { 16383.99999 pt } \dim_new:N \l_tmpa_dim \dim_new:N \l_tmpb_dim \dim_new:N \g_tmpa_dim \dim_new:N \g_tmpb_dim \cs_new_protected:Npn \skip_new:N #1 { \__chk_if_free_cs:N #1 \cs:w newskip \cs_end: #1 } \cs_generate_variant:Nn \skip_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \skip_const:Nn #1#2 { \skip_new:N #1 \tex_global:D #1 ~ \skip_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \skip_const:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \skip_zero:N #1 { #1 \c_zero_skip } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \skip_gzero:N #1 { \tex_global:D #1 \c_zero_skip } \cs_generate_variant:Nn \skip_zero:N { c } \cs_generate_variant:Nn \skip_gzero:N { c } \cs_new_protected:Npn \skip_zero_new:N #1 { \skip_if_exist:NTF #1 { \skip_zero:N #1 } { \skip_new:N #1 } } \cs_new_protected:Npn \skip_gzero_new:N #1 { \skip_if_exist:NTF #1 { \skip_gzero:N #1 } { \skip_new:N #1 } } \cs_generate_variant:Nn \skip_zero_new:N { c } \cs_generate_variant:Nn \skip_gzero_new:N { c } \prg_new_eq_conditional:NNn \skip_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \skip_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { \__debug_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { \__debug_chk_expr:nNnN {##2} \etex_glueexpr:D { } #3 } } #2 #3 } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \skip_set:Nn #1#2 { #1 ~ \etex_glueexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \skip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_set:Nn { c } \cs_generate_variant:Nn \skip_gset:Nn { c } \cs_new_protected:Npn \skip_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \skip_set_eq:NN { c , Nc , cc } \cs_new_protected:Npn \skip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \skip_gset_eq:NN { c , Nc , cc } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \skip_add:Nn #1#2 { \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \skip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_add:Nn { c } \cs_generate_variant:Nn \skip_gadd:Nn { c } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \skip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \skip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_glueexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \skip_sub:Nn { c } \cs_generate_variant:Nn \skip_gsub:Nn { c } \prg_new_conditional:Npnn \skip_if_eq:nn #1#2 { p , T , F , TF } { \if_int_compare:w \__str_if_eq_x:nn { \skip_eval:n { #1 } } { \skip_eval:n { #2 } } = 0 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: } \cs_set_protected:Npn \__dim_tmp:w #1 { \__debug_patch_conditional_args:nNNpnn { { \__debug_chk_expr:nNnN {##1} \etex_glueexpr:D { } \skip_if_finite:n } } \prg_new_conditional:Npnn \skip_if_finite:n ##1 { p , T , F , TF } { \exp_after:wN \__skip_if_finite:wwNw \skip_use:N \etex_glueexpr:D ##1 ; \prg_return_false: #1 ; \prg_return_true: \q_stop } \cs_new:Npn \__skip_if_finite:wwNw ##1 #1 ##2 ; ##3 ##4 \q_stop {##3} } \exp_args:No \__dim_tmp:w { \tl_to_str:n { fil } } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_eval:n } } \cs_new:Npn \skip_eval:n #1 { \skip_use:N \etex_glueexpr:D #1 \scan_stop: } \cs_new_eq:NN \skip_use:N \tex_the:D \cs_new:Npn \skip_use:c #1 { \tex_the:D \cs:w #1 \cs_end: } \cs_new_eq:NN \skip_horizontal:N \tex_hskip:D \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_horizontal:n } } \cs_new:Npn \skip_horizontal:n #1 { \skip_horizontal:N \etex_glueexpr:D #1 \scan_stop: } \cs_new_eq:NN \skip_vertical:N \tex_vskip:D \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \etex_glueexpr:D { } \skip_vertical:n } } \cs_new:Npn \skip_vertical:n #1 { \skip_vertical:N \etex_glueexpr:D #1 \scan_stop: } \cs_generate_variant:Nn \skip_horizontal:N { c } \cs_generate_variant:Nn \skip_vertical:N { c } \cs_new_eq:NN \skip_show:N \__kernel_register_show:N \cs_generate_variant:Nn \skip_show:N { c } \cs_new_protected:Npn \skip_show:n { \msg_show_eval:Nn \skip_eval:n } \cs_new_eq:NN \skip_log:N \__kernel_register_log:N \cs_new_eq:NN \skip_log:c \__kernel_register_log:c \cs_new_protected:Npn \skip_log:n { \msg_log_eval:Nn \skip_eval:n } \skip_const:Nn \c_zero_skip { \c_zero_dim } \skip_const:Nn \c_max_skip { \c_max_dim } \skip_new:N \l_tmpa_skip \skip_new:N \l_tmpb_skip \skip_new:N \g_tmpa_skip \skip_new:N \g_tmpb_skip \cs_new_protected:Npn \muskip_new:N #1 { \__chk_if_free_cs:N #1 \cs:w newmuskip \cs_end: #1 } \cs_generate_variant:Nn \muskip_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \muskip_const:Nn #1#2 { \muskip_new:N #1 \tex_global:D #1 ~ \muskip_eval:n {#2} \scan_stop: } \cs_generate_variant:Nn \muskip_const:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_zero:N #1 { #1 \c_zero_muskip } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gzero:N #1 { \tex_global:D #1 \c_zero_muskip } \cs_generate_variant:Nn \muskip_zero:N { c } \cs_generate_variant:Nn \muskip_gzero:N { c } \cs_new_protected:Npn \muskip_zero_new:N #1 { \muskip_if_exist:NTF #1 { \muskip_zero:N #1 } { \muskip_new:N #1 } } \cs_new_protected:Npn \muskip_gzero_new:N #1 { \muskip_if_exist:NTF #1 { \muskip_gzero:N #1 } { \muskip_new:N #1 } } \cs_generate_variant:Nn \muskip_zero_new:N { c } \cs_generate_variant:Nn \muskip_gzero_new:N { c } \prg_new_eq_conditional:NNn \muskip_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \muskip_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_set_protected:Npn \__dim_tmp:w #1#2#3 { \__debug_patch_args:nnnNNpn { #1 ##1 } { } { {##1} { \__debug_chk_expr:nNnN {##2} \etex_muexpr:D { \etex_mutoglue:D } #3 } } #2 #3 } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \muskip_set:Nn #1#2 { #1 ~ \etex_muexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \muskip_gset:Nn #1#2 { \tex_global:D #1 ~ \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_set:Nn { c } \cs_generate_variant:Nn \muskip_gset:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \muskip_set_eq:NN #1#2 { #1 = #2 } \cs_generate_variant:Nn \muskip_set_eq:NN { c , Nc , cc } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \muskip_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \muskip_gset_eq:NN { c , Nc , cc } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \muskip_add:Nn #1#2 { \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \muskip_gadd:Nn #1#2 { \tex_global:D \tex_advance:D #1 by \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_add:Nn { c } \cs_generate_variant:Nn \muskip_gadd:Nn { c } \__dim_tmp:w \__debug_chk_var_local:N \cs_new_protected:Npn \muskip_sub:Nn #1#2 { \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } \__dim_tmp:w \__debug_chk_var_global:N \cs_new_protected:Npn \muskip_gsub:Nn #1#2 { \tex_global:D \tex_advance:D #1 by - \etex_muexpr:D #2 \scan_stop: } \cs_generate_variant:Nn \muskip_sub:Nn { c } \cs_generate_variant:Nn \muskip_gsub:Nn { c } \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \etex_muexpr:D { \etex_mutoglue:D } \muskip_eval:n } } \cs_new:Npn \muskip_eval:n #1 { \muskip_use:N \etex_muexpr:D #1 \scan_stop: } \cs_new_eq:NN \muskip_use:N \tex_the:D \cs_generate_variant:Nn \muskip_use:N { c } \cs_new_eq:NN \muskip_show:N \__kernel_register_show:N \cs_generate_variant:Nn \muskip_show:N { c } \cs_new_protected:Npn \muskip_show:n { \msg_show_eval:Nn \muskip_eval:n } \cs_new_eq:NN \muskip_log:N \__kernel_register_log:N \cs_new_eq:NN \muskip_log:c \__kernel_register_log:c \cs_new_protected:Npn \muskip_log:n { \msg_log_eval:Nn \muskip_eval:n } \muskip_const:Nn \c_zero_muskip { 0 mu } \muskip_const:Nn \c_max_muskip { 16383.99999 mu } \muskip_new:N \l_tmpa_muskip \muskip_new:N \l_tmpb_muskip \muskip_new:N \g_tmpa_muskip \muskip_new:N \g_tmpb_muskip %% File: l3keys.dtx Copyright (C) 2006-2017 The LaTeX3 Project \tl_new:N \l__keyval_key_tl \tl_new:N \l__keyval_value_tl \tl_new:N \l__keyval_sanitise_tl \cs_new_protected:Npn \keyval_parse:NNn #1#2#3 { \tl_set:Nn \l__keyval_sanitise_tl {#3} \__keyval_sanitise_equals: \__keyval_sanitise_comma: \exp_after:wN \__keyval_loop:NNw \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN \q_mark \l__keyval_sanitise_tl , \q_recursion_tail , } \group_begin: \char_set_catcode_active:n { `\= } \char_set_catcode_active:n { `\, } \cs_new_protected:Npn \__keyval_sanitise_equals: { \exp_after:wN \__keyval_sanitise_equals_auxi:w \l__keyval_sanitise_tl \q_mark = \q_nil = \exp_after:wN \__keyval_sanitise_aux:w \l__keyval_sanitise_tl } \cs_new_protected:Npn \__keyval_sanitise_equals_auxi:w #1 = { \tl_set:Nn \l__keyval_sanitise_tl {#1} \__keyval_sanitise_equals_auxii:w } \cs_new_protected:Npn \__keyval_sanitise_equals_auxii:w #1 = { \if_meaning:w \q_nil #1 \scan_stop: \else: \tl_set:Nx \l__keyval_sanitise_tl { \exp_not:o \l__keyval_sanitise_tl \token_to_str:N = \exp_not:n {#1} } \exp_after:wN \__keyval_sanitise_equals_auxii:w \fi: } \cs_new_protected:Npn \__keyval_sanitise_comma: { \exp_after:wN \__keyval_sanitise_comma_auxi:w \l__keyval_sanitise_tl \q_mark , \q_nil , \exp_after:wN \__keyval_sanitise_aux:w \l__keyval_sanitise_tl } \cs_new_protected:Npn \__keyval_sanitise_comma_auxi:w #1 , { \tl_set:Nn \l__keyval_sanitise_tl {#1} \__keyval_sanitise_comma_auxii:w } \cs_new_protected:Npn \__keyval_sanitise_comma_auxii:w #1 , { \if_meaning:w \q_nil #1 \scan_stop: \else: \tl_set:Nx \l__keyval_sanitise_tl { \exp_not:o \l__keyval_sanitise_tl \token_to_str:N , \exp_not:n {#1} } \exp_after:wN \__keyval_sanitise_comma_auxii:w \fi: } \group_end: \cs_new_protected:Npn \__keyval_sanitise_aux:w #1 \q_mark { \tl_set:Nn \l__keyval_sanitise_tl {#1} } \cs_new_protected:Npn \__keyval_loop:NNw #1#2#3 , { \exp_after:wN \if_meaning:w \exp_after:wN \q_recursion_tail \use_none:n #3 \prg_do_nothing: \else: \__keyval_split:NNw #1#2#3 == \q_stop \exp_after:wN \__keyval_loop:NNw \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN \q_mark \fi: } \cs_new_protected:Npn \__keyval_split:NNw #1#2#3 = { \__keyval_def:Nn \l__keyval_key_tl {#3} \if_meaning:w \l__keyval_key_tl \c_empty_tl \exp_after:wN \__keyval_split_tidy:w \else: \exp_after:wN \__keyval_split_value:NNw \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN \q_mark \fi: } \cs_new_protected:Npn \__keyval_split_value:NNw #1#2#3 = #4 \q_stop { \if:w \scan_stop: \tl_to_str:n {#4} \scan_stop: \cs_set:Npx \__keyval_action: { \exp_not:N #1 { \exp_not:o \l__keyval_key_tl } } \else: \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #4 } \scan_stop: \__keyval_def:Nn \l__keyval_value_tl {#3} \cs_set:Npx \__keyval_action: { \exp_not:N #2 { \exp_not:o \l__keyval_key_tl } { \exp_not:o \l__keyval_value_tl } } \else: \cs_set:Npn \__keyval_action: { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } \fi: \fi: \__keyval_action: } \cs_new_protected:Npn \__keyval_split_tidy:w #1 \q_stop { \if:w \scan_stop: \etex_detokenize:D \exp_after:wN { \use_none:n #1 } \scan_stop: \else: \exp_after:wN \__keyval_empty_key: \fi: } \cs_new:Npn \__keyval_action: { } \cs_new_protected:Npn \__keyval_empty_key: { \__msg_kernel_error:nn { kernel } { misplaced-equals-sign } } \cs_new_protected:Npn \__keyval_def:Nn #1#2 { \tl_set:Nx #1 { \__tl_trim_spaces:nn {#2} \__keyval_def_aux:n } } \cs_new:Npn \__keyval_def_aux:n #1 { \exp_after:wN \__keyval_def_aux:w #1 \q_stop } \cs_new:Npn \__keyval_def_aux:w #1 \q_stop { \exp_not:n {#1} } \__msg_kernel_new:nnnn { kernel } { misplaced-equals-sign } { Misplaced~equals~sign~in~key-value~input~\msg_line_number: } { LaTeX~is~attempting~to~parse~some~key-value~input~but~found~ two~equals~signs~not~separated~by~a~comma. } \tl_const:Nn \c__keys_code_root_tl { key~code~>~ } \tl_const:Nn \c__keys_default_root_tl { key~default~>~ } \tl_const:Nn \c__keys_groups_root_tl { key~groups~>~ } \tl_const:Nn \c__keys_inherit_root_tl { key~inherit~>~ } \tl_const:Nn \c__keys_type_root_tl { key~type~>~ } \tl_const:Nn \c__keys_validate_root_tl { key~validate~>~ } \tl_const:Nn \c__keys_props_root_tl { key~prop~>~ } \int_new:N \l_keys_choice_int \tl_new:N \l_keys_choice_tl \clist_new:N \l__keys_groups_clist \tl_new:N \l_keys_key_tl \tl_new:N \l__keys_module_tl \bool_new:N \l__keys_no_value_bool \bool_new:N \l__keys_only_known_bool \tl_new:N \l_keys_path_tl \tl_new:N \l__keys_property_tl \bool_new:N \l__keys_selective_bool \bool_new:N \l__keys_filtered_bool \seq_new:N \l__keys_selective_seq \tl_new:N \l__keys_unused_clist \tl_new:N \l_keys_value_tl \bool_new:N \l__keys_tmp_bool \cs_new_protected:Npn \keys_define:nn { \__keys_define:onn \l__keys_module_tl } \cs_new_protected:Npn \__keys_define:nnn #1#2#3 { \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} } \keyval_parse:NNn \__keys_define:n \__keys_define:nn {#3} \tl_set:Nn \l__keys_module_tl {#1} } \cs_generate_variant:Nn \__keys_define:nnn { o } \cs_new_protected:Npn \__keys_define:n #1 { \bool_set_true:N \l__keys_no_value_bool \__keys_define_aux:nn {#1} { } } \cs_new_protected:Npn \__keys_define:nn #1#2 { \bool_set_false:N \l__keys_no_value_bool \__keys_define_aux:nn {#1} {#2} } \cs_new_protected:Npn \__keys_define_aux:nn #1#2 { \__keys_property_find:n {#1} \cs_if_exist:cTF { \c__keys_props_root_tl \l__keys_property_tl } { \__keys_define_code:n {#2} } { \tl_if_empty:NF \l__keys_property_tl { \__msg_kernel_error:nnxx { kernel } { property-unknown } { \l__keys_property_tl } { \l_keys_path_tl } } } } \cs_new_protected:Npn \__keys_property_find:n #1 { \tl_set:Nx \l__keys_property_tl { \__keys_remove_spaces:n {#1} } \exp_after:wN \__keys_property_find:w \l__keys_property_tl . . \q_stop {#1} } \cs_new_protected:Npn \__keys_property_find:w #1 . #2 . #3 \q_stop #4 { \tl_if_blank:nTF {#3} { \tl_clear:N \l__keys_property_tl \__msg_kernel_error:nnn { kernel } { key-no-property } {#4} } { \str_if_eq:nnTF {#3} { . } { \tl_set:Nx \l_keys_path_tl { \tl_if_empty:NF \l__keys_module_tl { \l__keys_module_tl / } #1 } \tl_set:Nn \l__keys_property_tl { . #2 } } { \tl_set:Nx \l_keys_path_tl { \l__keys_module_tl / #1 . #2 } \__keys_property_search:w #3 \q_stop } } } \cs_new_protected:Npn \__keys_property_search:w #1 . #2 \q_stop { \str_if_eq:nnTF {#2} { . } { \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl } \tl_set:Nn \l__keys_property_tl { . #1 } } { \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl . #1 } \__keys_property_search:w #2 \q_stop } } \cs_new_protected:Npn \__keys_define_code:n #1 { \bool_if:NTF \l__keys_no_value_bool { \exp_after:wN \__keys_define_code:w \l__keys_property_tl \q_stop { \use:c { \c__keys_props_root_tl \l__keys_property_tl } } { \__msg_kernel_error:nnxx { kernel } { property-requires-value } { \l__keys_property_tl } { \l_keys_path_tl } } } { \use:c { \c__keys_props_root_tl \l__keys_property_tl } {#1} } } \use:x { \cs_new:Npn \exp_not:N \__keys_define_code:w ##1 \c_colon_str ##2 \exp_not:N \q_stop } { \tl_if_empty:nTF {#2} } \cs_new_protected:Npn \__keys_bool_set:Nn #1#2 { \bool_if_exist:NF #1 { \bool_new:N #1 } \__keys_choice_make: \__keys_cmd_set:nx { \l_keys_path_tl / true } { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 } \__keys_cmd_set:nx { \l_keys_path_tl / false } { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { \__msg_kernel_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \__keys_default_set:n { true } } \cs_generate_variant:Nn \__keys_bool_set:Nn { c } \cs_new_protected:Npn \__keys_bool_set_inverse:Nn #1#2 { \bool_if_exist:NF #1 { \bool_new:N #1 } \__keys_choice_make: \__keys_cmd_set:nx { \l_keys_path_tl / true } { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 } \__keys_cmd_set:nx { \l_keys_path_tl / false } { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { \__msg_kernel_error:nnx { kernel } { boolean-values-only } { \l_keys_key_tl } } \__keys_default_set:n { true } } \cs_generate_variant:Nn \__keys_bool_set_inverse:Nn { c } \cs_new_protected:Npn \__keys_choice_make: { \__keys_choice_make:N \__keys_choice_find:n } \cs_new_protected:Npn \__keys_multichoice_make: { \__keys_choice_make:N \__keys_multichoice_find:n } \cs_new_protected:Npn \__keys_choice_make:N #1 { \cs_if_exist:cTF { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl } { \str_if_eq_x:nnTF { \exp_not:v { \c__keys_type_root_tl \__keys_parent:o \l_keys_path_tl } } { choice } { \__msg_kernel_error:nnxx { kernel } { nested-choice-key } { \l_keys_path_tl } { \__keys_parent:o \l_keys_path_tl } } { \__keys_choice_make_aux:N #1 } } { \__keys_choice_make_aux:N #1 } } \cs_new_protected:Npn \__keys_choice_make_aux:N #1 { \cs_set_nopar:cpn { \c__keys_type_root_tl \l_keys_path_tl } { choice } \__keys_cmd_set:nn { \l_keys_path_tl } { #1 {##1} } \__keys_cmd_set:nn { \l_keys_path_tl / unknown } { \__msg_kernel_error:nnxx { kernel } { key-choice-unknown } { \l_keys_path_tl } {##1} } } \cs_new_protected:Npn \__keys_choices_make:nn { \__keys_choices_make:Nnn \__keys_choice_make: } \cs_new_protected:Npn \__keys_multichoices_make:nn { \__keys_choices_make:Nnn \__keys_multichoice_make: } \cs_new_protected:Npn \__keys_choices_make:Nnn #1#2#3 { #1 \int_zero:N \l_keys_choice_int \clist_map_inline:nn {#2} { \int_incr:N \l_keys_choice_int \__keys_cmd_set:nx { \l_keys_path_tl / \__keys_remove_spaces:n {##1} } { \tl_set:Nn \exp_not:N \l_keys_choice_tl {##1} \int_set:Nn \exp_not:N \l_keys_choice_int { \int_use:N \l_keys_choice_int } \exp_not:n {#3} } } } \__debug_patch:nnNNpn { \cs_if_exist:cF { \c__keys_code_root_tl #1 } { \__debug_log:x { Defining~key~#1~\msg_line_context: } } } { } \cs_new_protected:Npn \__keys_cmd_set:nn #1#2 { \cs_set_protected:cpn { \c__keys_code_root_tl #1 } ##1 {#2} } \cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo } \cs_new_protected:Npn \__keys_default_set:n #1 { \tl_if_empty:nTF {#1} { \cs_set_eq:cN { \c__keys_default_root_tl \l_keys_path_tl } \tex_undefined:D } { \cs_set:cpx { \c__keys_default_root_tl \l_keys_path_tl } { \exp_not:n {#1} } } } \cs_new_protected:Npn \__keys_groups_set:n #1 { \clist_set:Nn \l__keys_groups_clist {#1} \clist_if_empty:NTF \l__keys_groups_clist { \cs_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl } \tex_undefined:D } { \cs_set_eq:cN { \c__keys_groups_root_tl \l_keys_path_tl } \l__keys_groups_clist } } \cs_new_protected:Npn \__keys_inherit:n #1 { \__keys_undefine: \cs_set_nopar:cpn { \c__keys_inherit_root_tl \l_keys_path_tl } {#1} } \cs_new_protected:Npn \__keys_initialise:n #1 { \cs_if_exist_use:cT { \c__keys_code_root_tl \l_keys_path_tl } { {#1} } } \cs_new_protected:Npn \__keys_meta_make:n #1 { \__keys_cmd_set:Vo \l_keys_path_tl { \exp_after:wN \keys_set:nn \exp_after:wN { \l__keys_module_tl } {#1} } } \cs_new_protected:Npn \__keys_meta_make:nn #1#2 { \__keys_cmd_set:Vn \l_keys_path_tl { \keys_set:nn {#1} {#2} } } \cs_new_protected:Npn \__keys_undefine: { \clist_map_inline:nn { code , default , groups , inherit , type , validate } { \cs_set_eq:cN { \tl_use:c { c__keys_ ##1 _root_tl } \l_keys_path_tl } \tex_undefined:D } } \cs_new_protected:Npn \__keys_value_requirement:nn #1#2 { \str_case:nnF {#2} { { true } { \cs_set_eq:cc { \c__keys_validate_root_tl \l_keys_path_tl } { __keys_validate_ #1 : } } { false } { \cs_if_eq:ccT { \c__keys_validate_root_tl \l_keys_path_tl } { __keys_validate_ #1 : } { \cs_set_eq:cN { \c__keys_validate_root_tl \l_keys_path_tl } \tex_undefined:D } } } { \__msg_kernel_error:nnx { kernel } { property-boolean-values-only } { .value_ #1 :n } } } \cs_new_protected:Npn \__keys_validate_forbidden: { \bool_if:NF \l__keys_no_value_bool { \__msg_kernel_error:nnxx { kernel } { value-forbidden } { \l_keys_path_tl } { \l_keys_value_tl } \__keys_validate_cleanup:w } } \cs_new_protected:Npn \__keys_validate_required: { \bool_if:NT \l__keys_no_value_bool { \__msg_kernel_error:nnx { kernel } { value-required } { \l_keys_path_tl } \__keys_validate_cleanup:w } } \cs_new_protected:Npn \__keys_validate_cleanup:w #1 \cs_end: #2#3 { } \cs_new_protected:Npn \__keys_variable_set:NnnN #1#2#3#4 { \use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 } \__keys_cmd_set:nx { \l_keys_path_tl } { \exp_not:c { #2 _ #3 set:N #4 } \exp_not:N #1 \exp_not:n { {##1} } } } \cs_generate_variant:Nn \__keys_variable_set:NnnN { c } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_set:N } #1 { \__keys_bool_set:Nn #1 { } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_set:c } #1 { \__keys_bool_set:cn {#1} { } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset:N } #1 { \__keys_bool_set:Nn #1 { g } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset:c } #1 { \__keys_bool_set:cn {#1} { g } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_set_inverse:N } #1 { \__keys_bool_set_inverse:Nn #1 { } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_set_inverse:c } #1 { \__keys_bool_set_inverse:cn {#1} { } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset_inverse:N } #1 { \__keys_bool_set_inverse:Nn #1 { g } } \cs_new_protected:cpn { \c__keys_props_root_tl .bool_gset_inverse:c } #1 { \__keys_bool_set_inverse:cn {#1} { g } } \cs_new_protected:cpn { \c__keys_props_root_tl .choice: } { \__keys_choice_make: } \cs_new_protected:cpn { \c__keys_props_root_tl .choices:nn } #1 { \__keys_choices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .choices:Vn } #1 { \exp_args:NV \__keys_choices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .choices:on } #1 { \exp_args:No \__keys_choices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .choices:xn } #1 { \exp_args:Nx \__keys_choices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .code:n } #1 { \__keys_cmd_set:nn { \l_keys_path_tl } {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .clist_set:N } #1 { \__keys_variable_set:NnnN #1 { clist } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .clist_set:c } #1 { \__keys_variable_set:cnnN {#1} { clist } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .clist_gset:N } #1 { \__keys_variable_set:NnnN #1 { clist } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .clist_gset:c } #1 { \__keys_variable_set:cnnN {#1} { clist } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .default:n } #1 { \__keys_default_set:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .default:V } #1 { \exp_args:NV \__keys_default_set:n #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .default:o } #1 { \exp_args:No \__keys_default_set:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .default:x } #1 { \exp_args:Nx \__keys_default_set:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .dim_set:N } #1 { \__keys_variable_set:NnnN #1 { dim } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .dim_set:c } #1 { \__keys_variable_set:cnnN {#1} { dim } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .dim_gset:N } #1 { \__keys_variable_set:NnnN #1 { dim } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .dim_gset:c } #1 { \__keys_variable_set:cnnN {#1} { dim } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .fp_set:N } #1 { \__keys_variable_set:NnnN #1 { fp } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .fp_set:c } #1 { \__keys_variable_set:cnnN {#1} { fp } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .fp_gset:N } #1 { \__keys_variable_set:NnnN #1 { fp } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .fp_gset:c } #1 { \__keys_variable_set:cnnN {#1} { fp } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .groups:n } #1 { \__keys_groups_set:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .inherit:n } #1 { \__keys_inherit:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:n } #1 { \__keys_initialise:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:V } #1 { \exp_args:NV \__keys_initialise:n #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:o } #1 { \exp_args:No \__keys_initialise:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:x } #1 { \exp_args:Nx \__keys_initialise:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .int_set:N } #1 { \__keys_variable_set:NnnN #1 { int } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .int_set:c } #1 { \__keys_variable_set:cnnN {#1} { int } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .int_gset:N } #1 { \__keys_variable_set:NnnN #1 { int } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .int_gset:c } #1 { \__keys_variable_set:cnnN {#1} { int } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .meta:n } #1 { \__keys_meta_make:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .meta:nn } #1 { \__keys_meta_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .multichoice: } { \__keys_multichoice_make: } \cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:nn } #1 { \__keys_multichoices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:Vn } #1 { \exp_args:NV \__keys_multichoices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:on } #1 { \exp_args:No \__keys_multichoices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .multichoices:xn } #1 { \exp_args:Nx \__keys_multichoices_make:nn #1 } \cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:N } #1 { \__keys_variable_set:NnnN #1 { skip } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .skip_set:c } #1 { \__keys_variable_set:cnnN {#1} { skip } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .skip_gset:N } #1 { \__keys_variable_set:NnnN #1 { skip } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .skip_gset:c } #1 { \__keys_variable_set:cnnN {#1} { skip } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_set:N } #1 { \__keys_variable_set:NnnN #1 { tl } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_set:c } #1 { \__keys_variable_set:cnnN {#1} { tl } { } n } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_set_x:N } #1 { \__keys_variable_set:NnnN #1 { tl } { } x } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_set_x:c } #1 { \__keys_variable_set:cnnN {#1} { tl } { } x } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset:N } #1 { \__keys_variable_set:NnnN #1 { tl } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset:c } #1 { \__keys_variable_set:cnnN {#1} { tl } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset_x:N } #1 { \__keys_variable_set:NnnN #1 { tl } { g } x } \cs_new_protected:cpn { \c__keys_props_root_tl .tl_gset_x:c } #1 { \__keys_variable_set:cnnN {#1} { tl } { g } x } \cs_new_protected:cpn { \c__keys_props_root_tl .undefine: } { \__keys_undefine: } \cs_new_protected:cpn { \c__keys_props_root_tl .value_forbidden:n } #1 { \__keys_value_requirement:nn { forbidden } {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .value_required:n } #1 { \__keys_value_requirement:nn { required } {#1} } \cs_new_protected:Npn \keys_set:nn { \__keys_set:onn { \l__keys_module_tl } } \cs_new_protected:Npn \__keys_set:nnn #1#2#3 { \tl_set:Nx \l__keys_module_tl { \__keys_remove_spaces:n {#2} } \keyval_parse:NNn \__keys_set:n \__keys_set:nn {#3} \tl_set:Nn \l__keys_module_tl {#1} } \cs_generate_variant:Nn \keys_set:nn { nV , nv , no } \cs_generate_variant:Nn \__keys_set:nnn { o } \cs_new_protected:Npn \keys_set_known:nnN { \__keys_set_known:onnN \l__keys_unused_clist } \cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no } \cs_new_protected:Npn \__keys_set_known:nnnN #1#2#3#4 { \clist_clear:N \l__keys_unused_clist \keys_set_known:nn {#2} {#3} \tl_set:Nx #4 { \exp_not:o { \l__keys_unused_clist } } \tl_set:Nn \l__keys_unused_clist {#1} } \cs_generate_variant:Nn \__keys_set_known:nnnN { o } \cs_new_protected:Npn \keys_set_known:nn #1#2 { \bool_if:NTF \l__keys_only_known_bool { \keys_set:nn } { \__keys_set_known:nn } {#1} {#2} } \cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no } \cs_new_protected:Npn \__keys_set_known:nn #1#2 { \bool_set_true:N \l__keys_only_known_bool \keys_set:nn {#1} {#2} \bool_set_false:N \l__keys_only_known_bool } \cs_new_protected:Npn \keys_set_filter:nnnN { \__keys_set_filter:onnnN \l__keys_unused_clist } \cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno } \cs_new_protected:Npn \__keys_set_filter:nnnnN #1#2#3#4#5 { \clist_clear:N \l__keys_unused_clist \keys_set_filter:nnn {#2} {#3} {#4} \tl_set:Nx #5 { \exp_not:o { \l__keys_unused_clist } } \tl_set:Nn \l__keys_unused_clist {#1} } \cs_generate_variant:Nn \__keys_set_filter:nnnnN { o } \cs_new_protected:Npn \keys_set_filter:nnn #1#2#3 { \bool_if:NTF \l__keys_filtered_bool { \__keys_set_selective:nnn } { \__keys_set_filter:nnn } {#1} {#2} {#3} } \cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno } \cs_new_protected:Npn \__keys_set_filter:nnn #1#2#3 { \bool_set_true:N \l__keys_filtered_bool \__keys_set_selective:nnn {#1} {#2} {#3} \bool_set_false:N \l__keys_filtered_bool } \cs_new_protected:Npn \keys_set_groups:nnn #1#2#3 { \bool_if:NTF \l__keys_filtered_bool { \__keys_set_groups:nnn } { \__keys_set_selective:nnn } {#1} {#2} {#3} } \cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno } \cs_new_protected:Npn \__keys_set_groups:nnn #1#2#3 { \bool_set_false:N \l__keys_filtered_bool \__keys_set_selective:nnn {#1} {#2} {#3} \bool_set_true:N \l__keys_filtered_bool } \cs_new_protected:Npn \__keys_set_selective:nnn { \__keys_set_selective:onnn \l__keys_selective_seq } \cs_new_protected:Npn \__keys_set_selective:nnnn #1#2#3#4 { \seq_set_from_clist:Nn \l__keys_selective_seq {#3} \bool_if:NTF \l__keys_selective_bool { \keys_set:nn } { \__keys_set_selective:nn } {#2} {#4} \tl_set:Nn \l__keys_selective_seq {#1} } \cs_generate_variant:Nn \__keys_set_selective:nnnn { o } \cs_new_protected:Npn \__keys_set_selective:nn #1#2 { \bool_set_true:N \l__keys_selective_bool \keys_set:nn {#1} {#2} \bool_set_false:N \l__keys_selective_bool } \cs_new_protected:Npn \__keys_set:n #1 { \bool_set_true:N \l__keys_no_value_bool \__keys_set_aux:onn \l__keys_module_tl {#1} { } } \cs_new_protected:Npn \__keys_set:nn #1#2 { \bool_set_false:N \l__keys_no_value_bool \__keys_set_aux:onn \l__keys_module_tl {#1} {#2} } \cs_new_protected:Npn \__keys_set_aux:nnn #1#2#3 { \tl_set:Nx \l_keys_path_tl { \tl_if_blank:nF {#1} { #1 / } \__keys_remove_spaces:n {#2} } \tl_clear:N \l__keys_module_tl \exp_after:wN \__keys_find_key_module:w \l_keys_path_tl / \q_stop \__keys_value_or_default:n {#3} \bool_if:NTF \l__keys_selective_bool { \__keys_set_selective: } { \__keys_execute: } \tl_set:Nn \l__keys_module_tl {#1} } \cs_generate_variant:Nn \__keys_set_aux:nnn { o } \cs_new_protected:Npn \__keys_find_key_module:w #1 / #2 \q_stop { \tl_if_blank:nTF {#2} { \tl_set:Nn \l_keys_key_tl {#1} } { \tl_put_right:Nx \l__keys_module_tl { \tl_if_empty:NF \l__keys_module_tl { / } #1 } \__keys_find_key_module:w #2 \q_stop } } \cs_new_protected:Npn \__keys_set_selective: { \cs_if_exist:cTF { \c__keys_groups_root_tl \l_keys_path_tl } { \clist_set_eq:Nc \l__keys_groups_clist { \c__keys_groups_root_tl \l_keys_path_tl } \__keys_check_groups: } { \bool_if:NTF \l__keys_filtered_bool { \__keys_execute: } { \__keys_store_unused: } } } \cs_new_protected:Npn \__keys_check_groups: { \bool_set_false:N \l__keys_tmp_bool \seq_map_inline:Nn \l__keys_selective_seq { \clist_map_inline:Nn \l__keys_groups_clist { \str_if_eq:nnT {##1} {####1} { \bool_set_true:N \l__keys_tmp_bool \clist_map_break:n { \seq_map_break: } } } } \bool_if:NTF \l__keys_tmp_bool { \bool_if:NTF \l__keys_filtered_bool { \__keys_store_unused: } { \__keys_execute: } } { \bool_if:NTF \l__keys_filtered_bool { \__keys_execute: } { \__keys_store_unused: } } } \cs_new_protected:Npn \__keys_value_or_default:n #1 { \bool_if:NTF \l__keys_no_value_bool { \cs_if_exist:cTF { \c__keys_default_root_tl \l_keys_path_tl } { \tl_set_eq:Nc \l_keys_value_tl { \c__keys_default_root_tl \l_keys_path_tl } } { \tl_clear:N \l_keys_value_tl } } { \tl_set:Nn \l_keys_value_tl {#1} } } \cs_new_protected:Npn \__keys_execute: { \cs_if_exist:cTF { \c__keys_code_root_tl \l_keys_path_tl } { \cs_if_exist_use:c { \c__keys_validate_root_tl \l_keys_path_tl } \cs:w \c__keys_code_root_tl \l_keys_path_tl \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } } { \__keys_execute_unknown: } } \cs_new_protected:Npn \__keys_execute_unknown: { \bool_if:NTF \l__keys_only_known_bool { \__keys_store_unused: } { \cs_if_exist:cTF { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl } { \clist_map_inline:cn { \c__keys_inherit_root_tl \__keys_parent:o \l_keys_path_tl } { \cs_if_exist:cT { \c__keys_code_root_tl ##1 / \l_keys_key_tl } { \cs:w \c__keys_code_root_tl ##1 / \l_keys_key_tl \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } \clist_map_break: } } } { \cs_if_exist:cTF { \c__keys_code_root_tl \l__keys_module_tl / unknown } { \cs:w \c__keys_code_root_tl \l__keys_module_tl / unknown \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } } { \__msg_kernel_error:nnxx { kernel } { key-unknown } { \l_keys_path_tl } { \l__keys_module_tl } } } } } \cs_new:Npn \__keys_execute:nn #1#2 { \cs_if_exist:cTF { \c__keys_code_root_tl #1 } { \cs:w \c__keys_code_root_tl #1 \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl } } {#2} } \cs_new_protected:Npn \__keys_store_unused: { \clist_put_right:Nx \l__keys_unused_clist { \exp_not:o \l_keys_key_tl \bool_if:NF \l__keys_no_value_bool { = { \exp_not:o \l_keys_value_tl } } } } \cs_new:Npn \__keys_choice_find:n #1 { \__keys_execute:nn { \l_keys_path_tl / \__keys_remove_spaces:n {#1} } { \__keys_execute:nn { \l_keys_path_tl / unknown } { } } } \cs_new:Npn \__keys_multichoice_find:n #1 { \clist_map_function:nN {#1} \__keys_choice_find:n } \cs_new:Npn \__keys_parent:n #1 { \__keys_parent:w #1 / / \q_stop { } } \cs_generate_variant:Nn \__keys_parent:n { o } \cs_new:Npn \__keys_parent:w #1 / #2 / #3 \q_stop #4 { \tl_if_blank:nTF {#2} { \use_none:n #4 } { \__keys_parent:w #2 / #3 \q_stop { #4 / #1 } } } \cs_new:Npn \__keys_remove_spaces:n #1 { \tl_trim_spaces:o { \tl_to_str:n {#1} } } \prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF } { \cs_if_exist:cTF { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 } } { \prg_return_true: } { \prg_return_false: } } \prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3 { p , T , F , TF } { \cs_if_exist:cTF { \c__keys_code_root_tl \__keys_remove_spaces:n { #1 / #2 / #3 } } { \prg_return_true: } { \prg_return_false: } } \cs_new_protected:Npn \keys_show:nn { \__keys_show:Nnn \msg_show:nnxxxx } \cs_new_protected:Npn \keys_log:nn { \__keys_show:Nnn \msg_log:nnxxxx } \cs_new_protected:Npn \__keys_show:Nnn #1#2#3 { #1 { LaTeX / kernel } { show-key } { \__keys_remove_spaces:n { #2 / #3 } } { \keys_if_exist:nnT {#2} {#3} { \exp_args:Nnf \msg_show_item_unbraced:nn { code } { \exp_args:Nc \token_get_replacement_spec:N { \c__keys_code_root_tl \__keys_remove_spaces:n { #2 / #3 } } } } } { } { } } \__msg_kernel_new:nnnn { kernel } { boolean-values-only } { Key~'#1'~accepts~boolean~values~only. } { The~key~'#1'~only~accepts~the~values~'true'~and~'false'. } \__msg_kernel_new:nnnn { kernel } { key-choice-unknown } { Key~'#1'~accepts~only~a~fixed~set~of~choices. } { The~key~'#1'~only~accepts~predefined~values,~ and~'#2'~is~not~one~of~these. } \__msg_kernel_new:nnnn { kernel } { key-no-property } { No~property~given~in~definition~of~key~'#1'. } { \c__msg_coding_error_text_tl Inside~\keys_define:nn each~key~name~ needs~a~property: \\ \\ \iow_indent:n { #1 . } \\ \\ LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property. } \__msg_kernel_new:nnnn { kernel } { key-unknown } { The~key~'#1'~is~unknown~and~is~being~ignored. } { The~module~'#2'~does~not~have~a~key~called~'#1'.\\ Check~that~you~have~spelled~the~key~name~correctly. } \__msg_kernel_new:nnnn { kernel } { nested-choice-key } { Attempt~to~define~'#1'~as~a~nested~choice~key. } { The~key~'#1'~cannot~be~defined~as~a~choice~as~the~parent~key~'#2'~is~ itself~a~choice. } \__msg_kernel_new:nnnn { kernel } { property-boolean-values-only } { The~property~'#1'~accepts~boolean~values~only. } { \c__msg_coding_error_text_tl The~property~'#1'~only~accepts~the~values~'true'~and~'false'. } \__msg_kernel_new:nnnn { kernel } { property-requires-value } { The~property~'#1'~requires~a~value. } { \c__msg_coding_error_text_tl LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\ No~value~was~given~for~the~property,~and~one~is~required. } \__msg_kernel_new:nnnn { kernel } { property-unknown } { The~key~property~'#1'~is~unknown. } { \c__msg_coding_error_text_tl LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~ this~property~is~not~defined. } \__msg_kernel_new:nnnn { kernel } { value-forbidden } { The~key~'#1'~does~not~take~a~value. } { The~key~'#1'~should~be~given~without~a~value.\\ The~value~'#2'~was~present:~the~key~will~be~ignored. } \__msg_kernel_new:nnnn { kernel } { value-required } { The~key~'#1'~requires~a~value. } { The~key~'#1'~must~have~a~value.\\ No~value~was~present:~the~key~will~be~ignored. } \__msg_kernel_new:nnn { kernel } { show-key } { The~key~#1~ \tl_if_empty:nTF {#2} { is~undefined. } { has~the~properties: #2 . } } %% File: l3fp.dtx Copyright (C) 2011-2017 The LaTeX3 Project %% File: l3fp-aux.dtx Copyright(C) 2011-2017 The LaTeX3 Project \cs_new:Npn \__fp_use_none_stop_f:n #1 { \exp_stop_f: } \cs_new:Npn \__fp_use_s:n #1 { #1; } \cs_new:Npn \__fp_use_s:nn #1#2 { #1#2; } \cs_new:Npn \__fp_use_none_until_s:w #1; { } \cs_new:Npn \__fp_use_i_until_s:nw #1#2; {#1} \cs_new:Npn \__fp_use_ii_until_s:nnw #1#2#3; {#2} \cs_new:Npn \__fp_reverse_args:Nww #1 #2; #3; { #1 #3; #2; } \cs_new:Npn \__fp_rrot:www #1; #2; #3; { #2; #3; #1; } \cs_new:Npn \__fp_use_i:ww #1; #2; { #1; } \cs_new:Npn \__fp_use_i:www #1; #2; #3; { #1; } \__scan_new:N \s__fp \cs_new_protected:Npn \__fp_chk:w #1 ; { \__msg_kernel_error:nnx { kernel } { misused-fp } { \fp_to_tl:n { \s__fp \__fp_chk:w #1 ; } } } \__scan_new:N \s__fp_mark \__scan_new:N \s__fp_stop \__scan_new:N \s__fp_invalid \__scan_new:N \s__fp_underflow \__scan_new:N \s__fp_overflow \__scan_new:N \s__fp_division \__scan_new:N \s__fp_exact \tl_const:Nn \c_zero_fp { \s__fp \__fp_chk:w 0 0 \s__fp_exact ; } \tl_const:Nn \c_minus_zero_fp { \s__fp \__fp_chk:w 0 2 \s__fp_exact ; } \tl_const:Nn \c_inf_fp { \s__fp \__fp_chk:w 2 0 \s__fp_exact ; } \tl_const:Nn \c_minus_inf_fp { \s__fp \__fp_chk:w 2 2 \s__fp_exact ; } \tl_const:Nn \c_nan_fp { \s__fp \__fp_chk:w 3 1 \s__fp_exact ; } \int_const:Nn \c__fp_prec_int { 16 } \int_const:Nn \c__fp_half_prec_int { 8 } \int_const:Nn \c__fp_block_int { 4 } \int_const:Nn \c__fp_myriad_int { 10000 } \int_const:Nn \c__fp_minus_min_exponent_int { 10000 } \int_const:Nn \c__fp_max_exponent_int { 10000 } \int_const:Nn \c__fp_max_exp_exponent_int { 5 } \tl_const:Nx \c__fp_overflowing_fp { \s__fp \__fp_chk:w 1 0 { \int_eval:n { \c__fp_max_exponent_int + 1 } } {1000} {0000} {0000} {0000} ; } \cs_new:Npn \__fp_zero_fp:N #1 { \s__fp \__fp_chk:w 0 #1 \s__fp_underflow ; } \cs_new:Npn \__fp_inf_fp:N #1 { \s__fp \__fp_chk:w 2 #1 \s__fp_overflow ; } \cs_new:Npn \__fp_exponent:w \s__fp \__fp_chk:w #1 { \if_meaning:w 1 #1 \exp_after:wN \__fp_use_ii_until_s:nnw \else: \exp_after:wN \__fp_use_i_until_s:nw \exp_after:wN 0 \fi: } \cs_new:Npn \__fp_neg_sign:N #1 { \__int_eval:w 2 - #1 \__int_eval_end: } \cs_new:Npn \__fp_sanitize:Nw #1 #2; { \if_case:w \if_int_compare:w #2 > \c__fp_max_exponent_int 1 ~ \else: \if_int_compare:w #2 < - \c__fp_minus_min_exponent_int 2 ~ \else: \if_meaning:w 1 #1 3 ~ \fi: \fi: \fi: 0 ~ \or: \exp_after:wN \__fp_overflow:w \or: \exp_after:wN \__fp_underflow:w \or: \exp_after:wN \__fp_sanitize_zero:w \fi: \s__fp \__fp_chk:w 1 #1 {#2} } \cs_new:Npn \__fp_sanitize:wN #1; #2 { \__fp_sanitize:Nw #2 #1; } \cs_new:Npn \__fp_sanitize_zero:w \s__fp \__fp_chk:w #1 #2 #3; { \c_zero_fp } \cs_new:Npn \__fp_exp_after_o:w \s__fp \__fp_chk:w #1 { \if_meaning:w 1 #1 \exp_after:wN \__fp_exp_after_normal:nNNw \else: \exp_after:wN \__fp_exp_after_special:nNNw \fi: { } #1 } \cs_new:Npn \__fp_exp_after_f:nw #1 \s__fp \__fp_chk:w #2 { \if_meaning:w 1 #2 \exp_after:wN \__fp_exp_after_normal:nNNw \else: \exp_after:wN \__fp_exp_after_special:nNNw \fi: { \exp:w \exp_end_continue_f:w #1 } #2 } \cs_new:Npn \__fp_exp_after_special:nNNw #1#2#3#4; { \exp_after:wN \s__fp \exp_after:wN \__fp_chk:w \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 \exp_after:wN ; #1 } \cs_new:Npn \__fp_exp_after_normal:nNNw #1 1 #2 #3 #4#5#6#7; { \exp_after:wN \__fp_exp_after_normal:Nwwwww \exp_after:wN #2 \__int_value:w #3 \exp_after:wN ; \__int_value:w 1 #4 \exp_after:wN ; \__int_value:w 1 #5 \exp_after:wN ; \__int_value:w 1 #6 \exp_after:wN ; \__int_value:w 1 #7 \exp_after:wN ; #1 } \cs_new:Npn \__fp_exp_after_normal:Nwwwww #1 #2; 1 #3 ; 1 #4 ; 1 #5 ; 1 #6 ; { \s__fp \__fp_chk:w 1 #1 {#2} {#3} {#4} {#5} {#6} ; } \cs_new:Npn \__fp_exp_after_array_f:w #1 { \cs:w __fp_exp_after \__fp_type_from_scan:N #1 _f:nw \cs_end: { \__fp_exp_after_array_f:w } #1 } \cs_new_eq:NN \__fp_exp_after_stop_f:nw \use_none:nn \int_const:Nn \c__fp_leading_shift_int { - 5 0000 } \int_const:Nn \c__fp_middle_shift_int { 5 0000 * 9999 } \int_const:Nn \c__fp_trailing_shift_int { 5 0000 * 10000 } \cs_new:Npn \__fp_pack:NNNNNw #1 #2#3#4#5 #6; { + #1#2#3#4#5 ; {#6} } \int_const:Nn \c__fp_big_leading_shift_int { - 15 2374 } \int_const:Nn \c__fp_big_middle_shift_int { 15 2374 * 9999 } \int_const:Nn \c__fp_big_trailing_shift_int { 15 2374 * 10000 } \cs_new:Npn \__fp_pack_big:NNNNNNw #1#2 #3#4#5#6 #7; { + #1#2#3#4#5#6 ; {#7} } \int_const:Nn \c__fp_Bigg_leading_shift_int { - 20 0000 } \int_const:Nn \c__fp_Bigg_middle_shift_int { 20 0000 * 9999 } \int_const:Nn \c__fp_Bigg_trailing_shift_int { 20 0000 * 10000 } \cs_new:Npn \__fp_pack_Bigg:NNNNNNw #1#2 #3#4#5#6 #7; { + #1#2#3#4#5#6 ; {#7} } \cs_new:Npn \__fp_pack_twice_four:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9 { #1 {#2#3#4#5} {#6#7#8#9} ; } \cs_new:Npn \__fp_pack_eight:wNNNNNNNN #1; #2#3#4#5 #6#7#8#9 { #1 {#2#3#4#5#6#7#8#9} ; } \cs_new:Npn \__fp_basics_pack_low:NNNNNw #1 #2#3#4#5 #6; { + #1 - 1 ; {#2#3#4#5} {#6} ; } \cs_new:Npn \__fp_basics_pack_high:NNNNNw #1 #2#3#4#5 #6; { \if_meaning:w 2 #1 \__fp_basics_pack_high_carry:w \fi: ; {#2#3#4#5} {#6} } \cs_new:Npn \__fp_basics_pack_high_carry:w \fi: ; #1 { \fi: + 1 ; {1000} } \cs_new:Npn \__fp_basics_pack_weird_low:NNNNw #1 #2#3#4 #5; { \if_meaning:w 2 #1 + 1 \fi: \__int_eval_end: #2#3#4; {#5} ; } \cs_new:Npn \__fp_basics_pack_weird_high:NNNNNNNNw 1 #1#2#3#4 #5#6#7#8 #9; { ; {#1#2#3#4} {#5#6#7#8} {#9} } \cs_new:Npn \__fp_decimate:nNnnnn #1 { \cs:w __fp_decimate_ \if_int_compare:w \__int_eval:w #1 > \c__fp_prec_int tiny \else: \__int_to_roman:w \__int_eval:w #1 \fi: :Nnnnn \cs_end: } \cs_new:Npn \__fp_decimate_:Nnnnn #1 #2#3#4#5 { #1 0 {#2#3} {#4#5} ; } \cs_new:Npn \__fp_decimate_tiny:Nnnnn #1 #2#3#4#5 { #1 1 { 0000 0000 } { 0000 0000 } 0 #2#3#4#5 ; } \cs_new:Npn \__fp_tmp:w #1 #2 #3 { \cs_new:cpn { __fp_decimate_ #1 :Nnnnn } ##1 ##2##3##4##5 { \exp_after:wN ##1 \__int_value:w \exp_after:wN \__fp_round_digit:Nw #2 ; \__fp_decimate_pack:nnnnnnnnnnw #3 ; } } \__fp_tmp:w {i} {\use_none:nnn #50}{ 0{#2}#3{#4}#5 } \__fp_tmp:w {ii} {\use_none:nn #5 }{ 00{#2}#3{#4}#5 } \__fp_tmp:w {iii} {\use_none:n #5 }{ 000{#2}#3{#4}#5 } \__fp_tmp:w {iv} { #5 }{ {0000}#2{#3}#4 #5 } \__fp_tmp:w {v} {\use_none:nnn #4#5 }{ 0{0000}#2{#3}#4 #5 } \__fp_tmp:w {vi} {\use_none:nn #4#5 }{ 00{0000}#2{#3}#4 #5 } \__fp_tmp:w {vii} {\use_none:n #4#5 }{ 000{0000}#2{#3}#4 #5 } \__fp_tmp:w {viii}{ #4#5 }{ {0000}0000{#2}#3 #4 #5 } \__fp_tmp:w {ix} {\use_none:nnn #3#4+#5}{ 0{0000}0000{#2}#3 #4 #5 } \__fp_tmp:w {x} {\use_none:nn #3#4+#5}{ 00{0000}0000{#2}#3 #4 #5 } \__fp_tmp:w {xi} {\use_none:n #3#4+#5}{ 000{0000}0000{#2}#3 #4 #5 } \__fp_tmp:w {xii} { #3#4+#5}{ {0000}0000{0000}#2 #3 #4 #5 } \__fp_tmp:w {xiii}{\use_none:nnn#2#3+#4#5}{ 0{0000}0000{0000}#2 #3 #4 #5 } \__fp_tmp:w {xiv} {\use_none:nn #2#3+#4#5}{ 00{0000}0000{0000}#2 #3 #4 #5 } \__fp_tmp:w {xv} {\use_none:n #2#3+#4#5}{ 000{0000}0000{0000}#2 #3 #4 #5 } \__fp_tmp:w {xvi} { #2#3+#4#5}{{0000}0000{0000}0000 #2 #3 #4 #5} \cs_new:Npn \__fp_decimate_pack:nnnnnnnnnnw #1#2#3#4#5 { \__fp_decimate_pack:nnnnnnw { #1#2#3#4#5 } } \cs_new:Npn \__fp_decimate_pack:nnnnnnw #1 #2#3#4#5#6 { {#1} {#2#3#4#5#6} } \cs_new:Npn \__fp_case_use:nw #1#2 \fi: #3 \s__fp { \fi: #1 \s__fp } \cs_new:Npn \__fp_case_return:nw #1#2 \fi: #3 ; { \fi: #1 } \cs_new:Npn \__fp_case_return_o:Nw #1#2 \fi: #3 \s__fp #4 ; { \fi: \exp_after:wN #1 } \cs_new:Npn \__fp_case_return_same_o:w #1 \fi: #2 \s__fp { \fi: \__fp_exp_after_o:w \s__fp } \cs_new:Npn \__fp_case_return_o:Nww #1#2 \fi: #3 \s__fp #4 ; #5 ; { \fi: \exp_after:wN #1 } \cs_new:Npn \__fp_case_return_i_o:ww #1 \fi: #2 \s__fp #3 ; \s__fp #4 ; { \fi: \__fp_exp_after_o:w \s__fp #3 ; } \cs_new:Npn \__fp_case_return_ii_o:ww #1 \fi: #2 \s__fp #3 ; { \fi: \__fp_exp_after_o:w } \prg_new_conditional:Npnn \__fp_int:w \s__fp \__fp_chk:w #1 #2 #3 #4; { TF , T , F , p } { \if_case:w #1 \exp_stop_f: \prg_return_true: \or: \if_charcode:w 0 \__fp_decimate:nNnnnn { \c__fp_prec_int - #3 } \__fp_use_i_until_s:nw #4 \prg_return_true: \else: \prg_return_false: \fi: \else: \prg_return_false: \fi: } \cs_new:Npn \__fp_small_int:wTF \s__fp \__fp_chk:w #1#2 { \if_case:w #1 \exp_stop_f: \__fp_case_return:nw { \__fp_small_int_true:wTF 0 ; } \or: \exp_after:wN \__fp_small_int_normal:NnwTF \or: \__fp_case_return:nw { \exp_after:wN \__fp_small_int_true:wTF \__int_value:w \if_meaning:w 2 #2 - \fi: 1 0000 0000 ; } \else: \__fp_case_return:nw \use_ii:nn \fi: #2 } \cs_new:Npn \__fp_small_int_true:wTF #1; #2#3 { #2 {#1} } \cs_new:Npn \__fp_small_int_normal:NnwTF #1#2#3; { \__fp_decimate:nNnnnn { \c__fp_prec_int - #2 } \__fp_small_int_test:NnnwNw #3 #1 } \cs_new:Npn \__fp_small_int_test:NnnwNw #1#2#3#4; #5 { \if_meaning:w 0 #1 \exp_after:wN \__fp_small_int_true:wTF \__int_value:w \if_meaning:w 2 #5 - \fi: \if_int_compare:w #2 > 0 \exp_stop_f: 1 0000 0000 \else: #3 \fi: \exp_after:wN ; \else: \exp_after:wN \use_ii:nn \fi: } \cs_new:Npn \__fp_array_count:n #1 { \__int_value:w \__int_eval:w 0 \__fp_array_count_loop:Nw #1 { ? \__prg_break: } ; \__prg_break_point: \__int_eval_end: } \cs_new:Npn \__fp_array_count_loop:Nw #1#2; { \use_none:n #1 + 1 \__fp_array_count_loop:Nw } \cs_new:Npn \__fp_expand:n #1 { \__fp_expand_loop:nwnN { } #1 \prg_do_nothing: \s__fp_mark { } \__fp_expand_loop:nwnN \s__fp_mark { } \__fp_use_i_until_s:nw ; } \cs_new:Npn \__fp_expand_loop:nwnN #1#2 \s__fp_mark #3 #4 { \exp_after:wN #4 \exp:w \exp_end_continue_f:w #2 \s__fp_mark { #3 #1 } #4 } \__msg_kernel_new:nnnn { kernel } { misused-fp } { A~floating~point~with~value~'#1'~was~misused. } { To~obtain~the~value~of~a~floating~point~variable,~use~ '\token_to_str:N \fp_to_decimal:N',~ '\token_to_str:N \fp_to_scientific:N',~or~other~ conversion~functions. } %% File: l3fp-traps.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project \flag_new:n { fp_invalid_operation } \flag_new:n { fp_division_by_zero } \flag_new:n { fp_overflow } \flag_new:n { fp_underflow } \cs_new_protected:Npn \fp_trap:nn #1#2 { \cs_if_exist_use:cF { __fp_trap_#1_set_#2: } { \clist_if_in:nnTF { invalid_operation , division_by_zero , overflow , underflow } {#1} { \__msg_kernel_error:nnxx { kernel } { unknown-fpu-trap-type } {#1} {#2} } { \__msg_kernel_error:nnx { kernel } { unknown-fpu-exception } {#1} } } } \cs_new_protected:Npn \__fp_trap_invalid_operation_set_error: { \__fp_trap_invalid_operation_set:N \prg_do_nothing: } \cs_new_protected:Npn \__fp_trap_invalid_operation_set_flag: { \__fp_trap_invalid_operation_set:N \use_none:nnnnn } \cs_new_protected:Npn \__fp_trap_invalid_operation_set_none: { \__fp_trap_invalid_operation_set:N \use_none:nnnnnnn } \cs_new_protected:Npn \__fp_trap_invalid_operation_set:N #1 { \exp_args:Nno \use:n { \cs_set:Npn \__fp_invalid_operation:nnw ##1##2##3; } { #1 \__fp_error:nnfn { fp-invalid } {##2} { \fp_to_tl:n { ##3; } } { } \flag_raise:n { fp_invalid_operation } ##1 } \exp_args:Nno \use:n { \cs_set:Npn \__fp_invalid_operation_o:Nww ##1##2; ##3; } { #1 \__fp_error:nffn { fp-invalid-ii } { \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1} \flag_raise:n { fp_invalid_operation } \exp_after:wN \c_nan_fp } \exp_args:Nno \use:n { \cs_set:Npn \__fp_invalid_operation_tl_o:ff ##1##2 } { #1 \__fp_error:nffn { fp-invalid } {##1} {##2} { } \flag_raise:n { fp_invalid_operation } \exp_after:wN \c_nan_fp } } \cs_new_protected:Npn \__fp_trap_division_by_zero_set_error: { \__fp_trap_division_by_zero_set:N \prg_do_nothing: } \cs_new_protected:Npn \__fp_trap_division_by_zero_set_flag: { \__fp_trap_division_by_zero_set:N \use_none:nnnnn } \cs_new_protected:Npn \__fp_trap_division_by_zero_set_none: { \__fp_trap_division_by_zero_set:N \use_none:nnnnnnn } \cs_new_protected:Npn \__fp_trap_division_by_zero_set:N #1 { \exp_args:Nno \use:n { \cs_set:Npn \__fp_division_by_zero_o:Nnw ##1##2##3; } { #1 \__fp_error:nnfn { fp-zero-div } {##2} { \fp_to_tl:n { ##3; } } { } \flag_raise:n { fp_division_by_zero } \exp_after:wN ##1 } \exp_args:Nno \use:n { \cs_set:Npn \__fp_division_by_zero_o:NNww ##1##2##3; ##4; } { #1 \__fp_error:nffn { fp-zero-div-ii } { \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2} \flag_raise:n { fp_division_by_zero } \exp_after:wN ##1 } } \cs_new_protected:Npn \__fp_trap_overflow_set_error: { \__fp_trap_overflow_set:N \prg_do_nothing: } \cs_new_protected:Npn \__fp_trap_overflow_set_flag: { \__fp_trap_overflow_set:N \use_none:nnnnn } \cs_new_protected:Npn \__fp_trap_overflow_set_none: { \__fp_trap_overflow_set:N \use_none:nnnnnnn } \cs_new_protected:Npn \__fp_trap_overflow_set:N #1 { \__fp_trap_overflow_set:NnNn #1 { overflow } \__fp_inf_fp:N { inf } } \cs_new_protected:Npn \__fp_trap_underflow_set_error: { \__fp_trap_underflow_set:N \prg_do_nothing: } \cs_new_protected:Npn \__fp_trap_underflow_set_flag: { \__fp_trap_underflow_set:N \use_none:nnnnn } \cs_new_protected:Npn \__fp_trap_underflow_set_none: { \__fp_trap_underflow_set:N \use_none:nnnnnnn } \cs_new_protected:Npn \__fp_trap_underflow_set:N #1 { \__fp_trap_overflow_set:NnNn #1 { underflow } \__fp_zero_fp:N { 0 } } \cs_new_protected:Npn \__fp_trap_overflow_set:NnNn #1#2#3#4 { \exp_args:Nno \use:n { \cs_set:cpn { __fp_ #2 :w } \s__fp \__fp_chk:w ##1##2##3; } { #1 \__fp_error:nffn { fp-flow \if_meaning:w 1 ##1 -to \fi: } { \fp_to_tl:n { \s__fp \__fp_chk:w ##1##2##3; } } { \token_if_eq_meaning:NNF 0 ##2 { - } #4 } {#2} \flag_raise:n { fp_#2 } #3 ##2 } } \cs_new:Npn \__fp_invalid_operation:nnw #1#2#3; { } \cs_new:Npn \__fp_invalid_operation_o:Nww #1#2; #3; { } \cs_new:Npn \__fp_invalid_operation_tl_o:ff #1 #2 { } \cs_new:Npn \__fp_division_by_zero_o:Nnw #1#2#3; { } \cs_new:Npn \__fp_division_by_zero_o:NNww #1#2#3; #4; { } \cs_new:Npn \__fp_overflow:w { } \cs_new:Npn \__fp_underflow:w { } \fp_trap:nn { invalid_operation } { error } \fp_trap:nn { division_by_zero } { flag } \fp_trap:nn { overflow } { flag } \fp_trap:nn { underflow } { flag } \cs_new:Npn \__fp_invalid_operation_o:nw { \__fp_invalid_operation:nnw { \exp_after:wN \c_nan_fp } } \cs_generate_variant:Nn \__fp_invalid_operation_o:nw { f } \cs_new:Npn \__fp_error:nnnn { \__msg_kernel_expandable_error:nnnnn { kernel } } \cs_generate_variant:Nn \__fp_error:nnnn { nnf, nff } \__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception } { The~FPU~exception~'#1'~is~not~known:~ that~trap~will~never~be~triggered. } { The~only~exceptions~to~which~traps~can~be~attached~are \\ \iow_indent:n { * ~ invalid_operation \\ * ~ division_by_zero \\ * ~ overflow \\ * ~ underflow } } \__msg_kernel_new:nnnn { kernel } { unknown-fpu-trap-type } { The~FPU~trap~type~'#2'~is~not~known. } { The~trap~type~must~be~one~of \\ \iow_indent:n { * ~ error \\ * ~ flag \\ * ~ none } } \__msg_kernel_new:nnn { kernel } { fp-flow } { An ~ #3 ~ occurred. } \__msg_kernel_new:nnn { kernel } { fp-flow-to } { #1 ~ #3 ed ~ to ~ #2 . } \__msg_kernel_new:nnn { kernel } { fp-zero-div } { Division~by~zero~in~ #1 (#2) } \__msg_kernel_new:nnn { kernel } { fp-zero-div-ii } { Division~by~zero~in~ (#1) #3 (#2) } \__msg_kernel_new:nnn { kernel } { fp-invalid } { Invalid~operation~ #1 (#2) } \__msg_kernel_new:nnn { kernel } { fp-invalid-ii } { Invalid~operation~ (#1) #3 (#2) } %% File: l3fp-round.dtx Copyright(C) 2011-2017 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_trunc:N { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_zero:NNN } \cs_new:Npn \__fp_parse_word_floor:N { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_ninf:NNN } \cs_new:Npn \__fp_parse_word_ceil:N { \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_pinf:NNN } \cs_new:Npn \__fp_parse_word_round:N #1#2 { \if_meaning:w + #2 \__fp_parse_round:Nw \__fp_round_to_pinf:NNN \else: \if_meaning:w 0 #2 \__fp_parse_round:Nw \__fp_round_to_zero:NNN \else: \if_meaning:w - #2 \__fp_parse_round:Nw \__fp_round_to_ninf:NNN \fi: \fi: \fi: \__fp_parse_function:NNN \__fp_round_o:Nw \__fp_round_to_nearest:NNN #1 #2 } \__debug:TF { \tl_gput_right:Nn \g__debug_deprecation_on_tl { \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_deprecation_error:Nw } \tl_gput_right:Nn \g__debug_deprecation_off_tl { \cs_set_eq:NN \__fp_parse_round:Nw \__fp_parse_round_no_error:Nw } \cs_new:Npn \__fp_parse_round_deprecation_error:Nw #1 #2 \__fp_round_to_nearest:NNN #3#4 { \__fp_error:nnfn { fp-deprecated } { round#4() } { \str_case:nn {#2} { { + } { ceil } { 0 } { trunc } { - } { floor } } } { } #2 #1 #3 } \cs_new:Npn \__fp_parse_round_no_error:Nw #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 } \cs_new_eq:NN \__fp_parse_round:Nw \__fp_parse_round_no_error:Nw } { \cs_new:Npn \__fp_parse_round:Nw #1 #2 \__fp_round_to_nearest:NNN #3#4 { #2 #1 #3 } } \int_const:Nn \c__fp_five_int { 5 } \cs_new:Npn \__fp_round_return_one: { \exp_after:wN 1 \exp_after:wN \exp_stop_f: \exp:w } \cs_new:Npn \__fp_round_to_ninf:NNN #1 #2 #3 { \if_meaning:w 2 #1 \if_int_compare:w #3 > 0 \exp_stop_f: \__fp_round_return_one: \fi: \fi: 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_zero:NNN #1 #2 #3 { 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_pinf:NNN #1 #2 #3 { \if_meaning:w 0 #1 \if_int_compare:w #3 > 0 \exp_stop_f: \__fp_round_return_one: \fi: \fi: 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_nearest:NNN #1 #2 #3 { \if_int_compare:w #3 > \c__fp_five_int \__fp_round_return_one: \else: \if_meaning:w 5 #3 \if_int_odd:w #2 \exp_stop_f: \__fp_round_return_one: \fi: \fi: \fi: 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_nearest_ninf:NNN #1 #2 #3 { \if_int_compare:w #3 > \c__fp_five_int \__fp_round_return_one: \else: \if_meaning:w 5 #3 \if_meaning:w 2 #1 \__fp_round_return_one: \fi: \fi: \fi: 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_nearest_zero:NNN #1 #2 #3 { \if_int_compare:w #3 > \c__fp_five_int \__fp_round_return_one: \fi: 0 \exp_stop_f: } \cs_new:Npn \__fp_round_to_nearest_pinf:NNN #1 #2 #3 { \if_int_compare:w #3 > \c__fp_five_int \__fp_round_return_one: \else: \if_meaning:w 5 #3 \if_meaning:w 0 #1 \__fp_round_return_one: \fi: \fi: \fi: 0 \exp_stop_f: } \cs_new_eq:NN \__fp_round:NNN \__fp_round_to_nearest:NNN \cs_new:Npn \__fp_round_s:NNNw #1 #2 #3 #4; { \exp_after:wN \__fp_round:NNN \exp_after:wN #1 \exp_after:wN #2 \__int_value:w \__int_eval:w \if_int_odd:w 0 \if_meaning:w 0 #3 1 \fi: \if_meaning:w 5 #3 1 \fi: \exp_stop_f: \if_int_compare:w \__int_eval:w #4 > 0 \exp_stop_f: 1 + \fi: \fi: #3 ; } \cs_new:Npn \__fp_round_digit:Nw #1 #2; { \if_int_odd:w \if_meaning:w 0 #1 1 \else: \if_meaning:w 5 #1 1 \else: 0 \fi: \fi: \exp_stop_f: \if_int_compare:w \__int_eval:w #2 > 0 \exp_stop_f: \__int_eval:w 1 + \fi: \fi: #1 } \cs_new_eq:NN \__fp_round_to_ninf_neg:NNN \__fp_round_to_pinf:NNN \cs_new:Npn \__fp_round_to_zero_neg:NNN #1 #2 #3 { \if_int_compare:w #3 > 0 \exp_stop_f: \__fp_round_return_one: \fi: 0 \exp_stop_f: } \cs_new_eq:NN \__fp_round_to_pinf_neg:NNN \__fp_round_to_ninf:NNN \cs_new_eq:NN \__fp_round_to_nearest_neg:NNN \__fp_round_to_nearest:NNN \cs_new_eq:NN \__fp_round_to_nearest_ninf_neg:NNN \__fp_round_to_nearest_pinf:NNN \cs_new:Npn \__fp_round_to_nearest_zero_neg:NNN #1 #2 #3 { \if_int_compare:w #3 < \c__fp_five_int \else: \__fp_round_return_one: \fi: 0 \exp_stop_f: } \cs_new_eq:NN \__fp_round_to_nearest_pinf_neg:NNN \__fp_round_to_nearest_ninf:NNN \cs_new_eq:NN \__fp_round_neg:NNN \__fp_round_to_nearest_neg:NNN \cs_new:Npn \__fp_round_o:Nw #1#2 @ { \if_case:w \__int_eval:w \__fp_array_count:n {#2} \__int_eval_end: \__fp_round_no_arg_o:Nw #1 \exp:w \or: \__fp_round:Nwn #1 #2 {0} \exp:w \or: \__fp_round:Nww #1 #2 \exp:w \else: \__fp_round:Nwww #1 #2 @ \exp:w \fi: \exp_after:wN \exp_end: } \cs_new:Npn \__fp_round_no_arg_o:Nw #1 { \cs_if_eq:NNTF #1 \__fp_round_to_nearest:NNN { \__fp_error:nnnn { fp-num-args } { round () } { 1 } { 3 } } { \__fp_error:nffn { fp-num-args } { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 } } \exp_after:wN \c_nan_fp } \cs_new:Npn \__fp_round:Nwww #1#2 ; #3 ; \s__fp \__fp_chk:w #4#5#6 ; #7 @ { \cs_if_eq:NNTF #1 \__fp_round_to_nearest:NNN { \tl_if_empty:nTF {#7} { \exp_args:Nc \__fp_round:Nww { __fp_round_to_nearest \if_meaning:w 0 #4 _zero \else: \if_case:w #5 \exp_stop_f: _pinf \or: \else: _ninf \fi: \fi: :NNN } #2 ; #3 ; } { \__fp_error:nnnn { fp-num-args } { round () } { 1 } { 3 } \exp_after:wN \c_nan_fp } } { \__fp_error:nffn { fp-num-args } { \__fp_round_name_from_cs:N #1 () } { 1 } { 2 } \exp_after:wN \c_nan_fp } } \cs_new:Npn \__fp_round_name_from_cs:N #1 { \cs_if_eq:NNTF #1 \__fp_round_to_zero:NNN { trunc } { \cs_if_eq:NNTF #1 \__fp_round_to_ninf:NNN { floor } { \cs_if_eq:NNTF #1 \__fp_round_to_pinf:NNN { ceil } { round } } } } \cs_new:Npn \__fp_round:Nww #1#2 ; #3 ; { \__fp_small_int:wTF #3; { \__fp_round:Nwn #1#2; } { \__fp_invalid_operation_tl_o:ff { \__fp_round_name_from_cs:N #1 } { \__fp_array_to_clist:n { #2; #3; } } } } \cs_new:Npn \__fp_round:Nwn #1 \s__fp \__fp_chk:w #2#3#4; #5 { \if_meaning:w 1 #2 \exp_after:wN \__fp_round_normal:NwNNnw \exp_after:wN #1 \__int_value:w #5 \else: \exp_after:wN \__fp_exp_after_o:w \fi: \s__fp \__fp_chk:w #2#3#4; } \cs_new:Npn \__fp_round_normal:NwNNnw #1#2 \s__fp \__fp_chk:w 1#3#4#5; { \__fp_decimate:nNnnnn { \c__fp_prec_int - #4 - #2 } \__fp_round_normal:NnnwNNnn #5 #1 #3 {#4} {#2} } \cs_new:Npn \__fp_round_normal:NnnwNNnn #1#2#3#4; #5#6 { \exp_after:wN \__fp_round_normal:NNwNnn \__int_value:w \__int_eval:w \if_int_compare:w #2 > 0 \exp_stop_f: 1 \__int_value:w #2 \exp_after:wN \__fp_round_pack:Nw \__int_value:w \__int_eval:w 1#3 + \else: \if_int_compare:w #3 > 0 \exp_stop_f: 1 \__int_value:w #3 + \fi: \fi: \exp_after:wN #5 \exp_after:wN #6 \use_none:nnnnnnn #3 #1 \__int_eval_end: 0000 0000 0000 0000 ; #6 } \cs_new:Npn \__fp_round_pack:Nw #1 { \if_meaning:w 2 #1 + 1 \fi: \__int_eval_end: } \cs_new:Npn \__fp_round_normal:NNwNnn #1 #2 { \if_meaning:w 0 #2 \exp_after:wN \__fp_round_special:NwwNnn \exp_after:wN #1 \fi: \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_round_normal_end:wwNnn ; #2 } \cs_new:Npn \__fp_round_normal_end:wwNnn #1;#2;#3#4#5 { \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w \__fp_sanitize:Nw #3 #4 ; #1 ; } \cs_new:Npn \__fp_round_special:NwwNnn #1#2;#3;#4#5#6 { \if_meaning:w 0 #1 \__fp_case_return:nw { \exp_after:wN \__fp_zero_fp:N \exp_after:wN #4 } \else: \exp_after:wN \__fp_round_special_aux:Nw \exp_after:wN #4 \__int_value:w \__int_eval:w 1 \if_meaning:w 1 #1 -#6 \else: +#5 \fi: \fi: ; } \cs_new:Npn \__fp_round_special_aux:Nw #1#2; { \exp_after:wN \__fp_exp_after_o:w \exp:w \exp_end_continue_f:w \__fp_sanitize:Nw #1#2; {1000}{0000}{0000}{0000}; } %% File: l3fp-parse.dtx Copyright (C) 2011-2017 The LaTeX3 Project \int_const:Nn \c__fp_prec_funcii_int { 16 } \int_const:Nn \c__fp_prec_func_int { 15 } \int_const:Nn \c__fp_prec_hatii_int { 14 } \int_const:Nn \c__fp_prec_hat_int { 13 } \int_const:Nn \c__fp_prec_not_int { 12 } \int_const:Nn \c__fp_prec_times_int { 10 } \int_const:Nn \c__fp_prec_plus_int { 9 } \int_const:Nn \c__fp_prec_comp_int { 7 } \int_const:Nn \c__fp_prec_and_int { 6 } \int_const:Nn \c__fp_prec_or_int { 5 } \int_const:Nn \c__fp_prec_quest_int { 4 } \int_const:Nn \c__fp_prec_colon_int { 3 } \int_const:Nn \c__fp_prec_comma_int { 2 } \int_const:Nn \c__fp_prec_paren_int { 1 } \int_const:Nn \c__fp_prec_end_int { 0 } \cs_new:Npn \__fp_parse_expand:w #1 { \exp_end_continue_f:w #1 } \cs_new:Npn \__fp_parse_return_semicolon:w #1 \fi: \__fp_parse_expand:w { \fi: ; #1 } \cs_new:Npx \__fp_type_from_scan:N #1 { \exp_not:N \exp_after:wN \exp_not:N \__fp_type_from_scan:w \exp_not:N \token_to_str:N #1 \exp_not:N \q_mark \tl_to_str:n { s__fp _? } \exp_not:N \q_mark \exp_not:N \q_stop } \use:x { \cs_new:Npn \exp_not:N \__fp_type_from_scan:w ##1 \tl_to_str:n { s__fp } ##2 \exp_not:N \q_mark ##3 \exp_not:N \q_stop {##2} } \cs_set_protected:Npn \__fp_tmp:w #1 #2 #3 { \cs_new:cpn { __fp_parse_digits_ #1 :N } ##1 { \if_int_compare:w 9 < 1 \token_to_str:N ##1 \exp_stop_f: \token_to_str:N ##1 \exp_after:wN #2 \exp:w \else: \__fp_parse_return_semicolon:w #3 ##1 \fi: \__fp_parse_expand:w } } \__fp_tmp:w {vii} \__fp_parse_digits_vi:N { 0000000 ; 7 } \__fp_tmp:w {vi} \__fp_parse_digits_v:N { 000000 ; 6 } \__fp_tmp:w {v} \__fp_parse_digits_iv:N { 00000 ; 5 } \__fp_tmp:w {iv} \__fp_parse_digits_iii:N { 0000 ; 4 } \__fp_tmp:w {iii} \__fp_parse_digits_ii:N { 000 ; 3 } \__fp_tmp:w {ii} \__fp_parse_digits_i:N { 00 ; 2 } \__fp_tmp:w {i} \__fp_parse_digits_:N { 0 ; 1 } \cs_new:Npn \__fp_parse_digits_:N { ; ; 0 } \cs_new:Npn \__fp_parse_one:Nw #1 #2 { \if_catcode:w \scan_stop: \exp_not:N #2 \exp_after:wN \if_meaning:w \exp_not:N #2 #2 \else: \exp_after:wN \reverse_if:N \fi: \if_meaning:w \scan_stop: #2 \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_one_fp:NN \else: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_one_register:NN \fi: \else: \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_one_digit:NN \else: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_one_other:NN \fi: \fi: #1 #2 } \cs_new:Npn \__fp_parse_one_fp:NN #1#2 { \cs:w __fp_exp_after \__fp_type_from_scan:N #2 _f:nw \cs_end: { \exp_after:wN \__fp_parse_infix:NN \exp_after:wN #1 \exp:w \__fp_parse_expand:w } #2 } \cs_new:Npn \__fp_exp_after_mark_f:nw #1 { \__msg_kernel_expandable_error:nn { kernel } { fp-early-end } \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1 } \cs_new:cpn { __fp_exp_after_?_f:nw } #1#2 { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#2} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w #1 } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_if_exist:NT #1 { \cs_gset:cpn { __fp_exp_after_?_f:nw } ##1##2 { \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w ##1 \str_if_eq:nnTF {##2} { \protect } { \cs_if_eq:NNTF ##2 #1 { \use_i:nn } { \use:n } { \__msg_kernel_expandable_error:nnn { kernel } { fp-robust-cmd } } } { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {##2} } } } } \exp_args:Nc \__fp_tmp:w { @unexpandable@protect } \cs_new:Npn \__fp_parse_one_register:NN #1#2 { \exp_after:wN \__fp_parse_infix_after_operand:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \if_meaning:w \box_wd:N #2 \__fp_parse_one_register_wd:w \fi: \if_meaning:w \box_ht:N #2 \__fp_parse_one_register_wd:w \fi: \if_meaning:w \box_dp:N #2 \__fp_parse_one_register_wd:w \fi: \exp_after:wN \__fp_parse_one_register_aux:Nw \exp_after:wN #2 \__int_value:w \exp_after:wN \__fp_parse_exponent:N \exp:w \__fp_parse_expand:w } \cs_new:Npx \__fp_parse_one_register_aux:Nw #1 { \exp_not:n { \exp_after:wN \use:nn \exp_after:wN \__fp_parse_one_register_auxii:wwwNw } \exp_not:N \exp_after:wN { \exp_not:N \tex_the:D #1 } ; \exp_not:N \__fp_parse_one_register_dim:ww \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_mu:www . \tl_to_str:n { pt } ; \exp_not:N \__fp_parse_one_register_int:www \exp_not:N \q_stop } \exp_args:Nno \use:nn { \cs_new:Npn \__fp_parse_one_register_auxii:wwwNw #1 . #2 } { \tl_to_str:n { pt } #3 ; #4#5 \q_stop } { #4 #1.#2; } \exp_args:Nno \use:nn { \cs_new:Npn \__fp_parse_one_register_mu:www #1 } { \tl_to_str:n { mu } ; #2 ; } { \__fp_parse_one_register_dim:ww #1 ; } \cs_new:Npn \__fp_parse_one_register_int:www #1; #2.; #3; { \__fp_parse:n { #1 e #3 } } \cs_new:Npn \__fp_parse_one_register_dim:ww #1; #2; { \exp_after:wN \__fp_from_dim_test:ww \__int_value:w #2 \exp_after:wN , \__int_value:w \__dim_eval:w #1 pt ; } \cs_new:Npn \__fp_parse_one_register_wd:w #1#2 \exp_after:wN #3#4 \__fp_parse_expand:w { #1 \exp_after:wN \__fp_parse_one_register_wd:Nw #4 \__fp_parse_expand:w e } \cs_new:Npn \__fp_parse_one_register_wd:Nw #1#2 ; { \exp_after:wN \__fp_from_dim_test:ww \exp_after:wN 0 \exp_after:wN , \__int_value:w \__dim_eval:w \exp_after:wN \use:n \exp_after:wN { \tex_the:D #1 #2 } ; } \cs_new:Npn \__fp_parse_one_digit:NN #1 { \exp_after:wN \__fp_parse_infix_after_operand:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \exp_after:wN \__fp_sanitize:wN \__int_value:w \__int_eval:w 0 \__fp_parse_trim_zeros:N } \cs_new:Npn \__fp_parse_one_other:NN #1 #2 { \if_int_compare:w \__int_eval:w ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 = 3 \exp_stop_f: \exp_after:wN \__fp_parse_word:Nw \exp_after:wN #1 \exp_after:wN #2 \exp:w \exp_after:wN \__fp_parse_letters:N \exp:w \else: \exp_after:wN \__fp_parse_prefix:NNN \exp_after:wN #1 \exp_after:wN #2 \cs:w __fp_parse_prefix_ \token_to_str:N #2 :Nw \exp_after:wN \cs_end: \exp:w \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_word:Nw #1#2; { \cs_if_exist_use:cF { __fp_parse_word_#2:N } { \cs_if_exist_use:cF { __fp_parse_caseless_ \str_fold_case:n {#2} :N } { \__msg_kernel_expandable_error:nnn { kernel } { unknown-fp-word } {#2} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN } } #1 } \cs_new:Npn \__fp_parse_letters:N #1 { \exp_end_continue_f:w \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1 0 \else: \__int_eval:w ( `#1 \if_int_compare:w `#1 > `Z - 32 \fi: ) / 26 \fi: = 3 \exp_stop_f: \exp_after:wN #1 \exp:w \exp_after:wN \__fp_parse_letters:N \exp:w \else: \__fp_parse_return_semicolon:w #1 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_prefix:NNN #1#2#3 { \if_meaning:w \scan_stop: #3 \exp_after:wN \__fp_parse_prefix_unknown:NNN \exp_after:wN #2 \fi: #3 #1 } \cs_new:Npn \__fp_parse_prefix_unknown:NNN #1#2#3 { \cs_if_exist:cTF { __fp_parse_infix_ \token_to_str:N #1 :N } { \__msg_kernel_expandable_error:nnn { kernel } { fp-missing-number } {#1} \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN #3 #1 } { \__msg_kernel_expandable_error:nnn { kernel } { fp-unknown-symbol } {#1} \__fp_parse_one:Nw #3 } } \cs_new:Npn \__fp_parse_trim_zeros:N #1 { \if:w 0 \exp_not:N #1 \exp_after:wN \__fp_parse_trim_zeros:N \exp:w \else: \if:w . \exp_not:N #1 \exp_after:wN \__fp_parse_strim_zeros:N \exp:w \else: \__fp_parse_trim_end:w #1 \fi: \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_trim_end:w #1 \fi: \fi: \__fp_parse_expand:w { \fi: \fi: \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: \exp_after:wN \__fp_parse_large:N \else: \exp_after:wN \__fp_parse_zero: \fi: #1 } \cs_new:Npn \__fp_parse_strim_zeros:N #1 { \if:w 0 \exp_not:N #1 - 1 \exp_after:wN \__fp_parse_strim_zeros:N \exp:w \else: \__fp_parse_strim_end:w #1 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_strim_end:w #1 \fi: \__fp_parse_expand:w { \fi: \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: \exp_after:wN \__fp_parse_small:N \else: \exp_after:wN \__fp_parse_zero: \fi: #1 } \cs_new:Npn \__fp_parse_zero: { \exp_after:wN ; \exp_after:wN 1 \__int_value:w \__fp_parse_exponent:N } \cs_new:Npn \__fp_parse_small:N #1 { \exp_after:wN \__fp_parse_pack_leading:NNNNNww \__int_value:w \__int_eval:w 1 \token_to_str:N #1 \exp_after:wN \__fp_parse_small_leading:wwNN \__int_value:w 1 \exp_after:wN \__fp_parse_digits_vii:N \exp:w \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_small_leading:wwNN 1 #1 ; #2; #3 #4 { #1 #2 \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww \exp_after:wN 0 \__int_value:w \__int_eval:w 1 \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f: \token_to_str:N #4 \exp_after:wN \__fp_parse_small_trailing:wwNN \__int_value:w 1 \exp_after:wN \__fp_parse_digits_vi:N \exp:w \else: 0000 0000 \__fp_parse_exponent:Nw #4 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_small_trailing:wwNN 1 #1 ; #2; #3 #4 { #1 #2 \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f: \token_to_str:N #4 \exp_after:wN \__fp_parse_small_round:NN \exp_after:wN #4 \exp:w \else: 0 \__fp_parse_exponent:Nw #4 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_pack_trailing:NNNNNNww #1 #2 #3#4#5#6 #7; #8 ; { \if_meaning:w 2 #2 + 1 \fi: ; #8 + #1 ; {#3#4#5#6} {#7}; } \cs_new:Npn \__fp_parse_pack_leading:NNNNNww #1 #2#3#4#5 #6; #7; { + #7 \if_meaning:w 2 #1 \__fp_parse_pack_carry:w \fi: ; 0 {#2#3#4#5} {#6} } \cs_new:Npn \__fp_parse_pack_carry:w \fi: ; 0 #1 { \fi: + 1 ; 0 {1000} } \cs_new:Npn \__fp_parse_large:N #1 { \exp_after:wN \__fp_parse_large_leading:wwNN \__int_value:w 1 \token_to_str:N #1 \exp_after:wN \__fp_parse_digits_vii:N \exp:w \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_large_leading:wwNN 1 #1 ; #2; #3 #4 { + \c__fp_half_prec_int - #3 \exp_after:wN \__fp_parse_pack_leading:NNNNNww \__int_value:w \__int_eval:w 1 #1 \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f: \exp_after:wN \__fp_parse_large_trailing:wwNN \__int_value:w 1 \token_to_str:N #4 \exp_after:wN \__fp_parse_digits_vi:N \exp:w \else: \if:w . \exp_not:N #4 \exp_after:wN \__fp_parse_small_leading:wwNN \__int_value:w 1 \cs:w __fp_parse_digits_ \__int_to_roman:w #3 :N \exp_after:wN \cs_end: \exp:w \else: #2 \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww \exp_after:wN 0 \__int_value:w 1 0000 0000 \__fp_parse_exponent:Nw #4 \fi: \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_large_trailing:wwNN 1 #1 ; #2; #3 #4 { \if_int_compare:w 9 < 1 \token_to_str:N #4 \exp_stop_f: \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww \exp_after:wN \c__fp_half_prec_int \__int_value:w \__int_eval:w 1 #1 \token_to_str:N #4 \exp_after:wN \__fp_parse_large_round:NN \exp_after:wN #4 \exp:w \else: \exp_after:wN \__fp_parse_pack_trailing:NNNNNNww \__int_value:w \__int_eval:w 7 - #3 \exp_stop_f: \__int_value:w \__int_eval:w 1 #1 \if:w . \exp_not:N #4 \exp_after:wN \__fp_parse_small_trailing:wwNN \__int_value:w 1 \cs:w __fp_parse_digits_ \__int_to_roman:w #3 :N \exp_after:wN \cs_end: \exp:w \else: #2 0 \__fp_parse_exponent:Nw #4 \fi: \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_round_loop:N #1 { \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: + 1 \if:w 0 \token_to_str:N #1 \exp_after:wN \__fp_parse_round_loop:N \exp:w \else: \exp_after:wN \__fp_parse_round_up:N \exp:w \fi: \else: \__fp_parse_return_semicolon:w 0 #1 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_round_up:N #1 { \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: + 1 \exp_after:wN \__fp_parse_round_up:N \exp:w \else: \__fp_parse_return_semicolon:w 1 #1 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_round_after:wN #1; #2 { + #2 \exp_after:wN ; \__int_value:w \__int_eval:w #1 + \__fp_parse_exponent:N } \cs_new:Npn \__fp_parse_small_round:NN #1#2 { \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f: + \exp_after:wN \__fp_round_s:NNNw \exp_after:wN 0 \exp_after:wN #1 \exp_after:wN #2 \__int_value:w \__int_eval:w \exp_after:wN \__fp_parse_round_after:wN \__int_value:w \__int_eval:w 0 * \__int_eval:w 0 \exp_after:wN \__fp_parse_round_loop:N \exp:w \else: \__fp_parse_exponent:Nw #2 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_large_round:NN #1#2 { \if_int_compare:w 9 < 1 \token_to_str:N #2 \exp_stop_f: + \exp_after:wN \__fp_round_s:NNNw \exp_after:wN 0 \exp_after:wN #1 \exp_after:wN #2 \__int_value:w \__int_eval:w \exp_after:wN \__fp_parse_large_round_aux:wNN \__int_value:w \__int_eval:w 1 \exp_after:wN \__fp_parse_round_loop:N \else: %^^A could be dot, or e, or other \exp_after:wN \__fp_parse_large_round_test:NN \exp_after:wN #1 \exp_after:wN #2 \fi: } \cs_new:Npn \__fp_parse_large_round_test:NN #1#2 { \if:w . \exp_not:N #2 \exp_after:wN \__fp_parse_small_round:NN \exp_after:wN #1 \exp:w \else: \__fp_parse_exponent:Nw #2 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_large_round_aux:wNN #1 ; #2 #3 { + #2 \exp_after:wN \__fp_parse_round_after:wN \__int_value:w \__int_eval:w #1 \if:w . \exp_not:N #3 + 0 * \__int_eval:w 0 \exp_after:wN \__fp_parse_round_loop:N \exp:w \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN ; \exp_after:wN 0 \exp_after:wN #3 \fi: } \cs_new:Npn \__fp_parse_exponent:Nw #1 #2 \__fp_parse_expand:w { \exp_after:wN ; \__int_value:w #2 \__fp_parse_exponent:N #1 } \cs_new:Npn \__fp_parse_exponent:N #1 { \if:w e \exp_not:N #1 \exp_after:wN \__fp_parse_exponent_aux:N \exp:w \else: 0 \__fp_parse_return_semicolon:w #1 \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_exponent_aux:N #1 { \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1 0 \else: `#1 \fi: > `9 \exp_stop_f: 0 \exp_after:wN ; \exp_after:wN e \else: \exp_after:wN \__fp_parse_exponent_sign:N \fi: #1 } \cs_new:Npn \__fp_parse_exponent_sign:N #1 { \if:w + \if:w - \exp_not:N #1 + \fi: \token_to_str:N #1 \exp_after:wN \__fp_parse_exponent_sign:N \exp:w \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN \__fp_parse_exponent_body:N \exp_after:wN #1 \fi: } \cs_new:Npn \__fp_parse_exponent_body:N #1 { \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: \token_to_str:N #1 \exp_after:wN \__fp_parse_exponent_digits:N \exp:w \else: \__fp_parse_exponent_keep:NTF #1 { \__fp_parse_return_semicolon:w #1 } { \exp_after:wN ; \exp:w } \fi: \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_exponent_digits:N #1 { \if_int_compare:w 9 < 1 \token_to_str:N #1 \exp_stop_f: \token_to_str:N #1 \exp_after:wN \__fp_parse_exponent_digits:N \exp:w \else: \__fp_parse_return_semicolon:w #1 \fi: \__fp_parse_expand:w } \prg_new_conditional:Npnn \__fp_parse_exponent_keep:N #1 { TF } { \if_catcode:w \scan_stop: \exp_not:N #1 \if_meaning:w \scan_stop: #1 \if_int_compare:w \__str_if_eq_x:nn { \s__fp } { \exp_not:N #1 } = 0 \exp_stop_f: 0 \__msg_kernel_expandable_error:nnn { kernel } { fp-after-e } { floating~point~ } \prg_return_true: \else: 0 \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} \prg_return_false: \fi: \else: \if_int_compare:w \__str_if_eq_x:nn { \__int_value:w #1 } { \tex_the:D #1 } = 0 \exp_stop_f: \__int_value:w #1 \else: 0 \__msg_kernel_expandable_error:nnn { kernel } { fp-after-e } { dimension~#1 } \fi: \prg_return_false: \fi: \else: 0 \__msg_kernel_expandable_error:nnn { kernel } { fp-missing } { exponent } \prg_return_true: \fi: } \cs_new_eq:cN { __fp_parse_prefix_+:Nw } \__fp_parse_one:Nw \cs_new:Npn \__fp_parse_apply_unary:NNNwN #1#2#3#4@#5 { #3 #2 #4 @ \exp:w \exp_end_continue_f:w #5 #1 } \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4 { \cs_new:cpn { __fp_parse_prefix_ #1 :Nw } ##1 { \exp_after:wN \__fp_parse_apply_unary:NNNwN \exp_after:wN ##1 \exp_after:wN #4 \exp_after:wN #3 \exp:w \if_int_compare:w #2 < ##1 \__fp_parse_operand:Nw ##1 \else: \__fp_parse_operand:Nw #2 \fi: \__fp_parse_expand:w } } \__fp_tmp:w - \c__fp_prec_not_int \__fp_set_sign_o:w 2 \__fp_tmp:w ! \c__fp_prec_not_int \__fp_not_o:w ? \cs_new:cpn { __fp_parse_prefix_.:Nw } #1 { \exp_after:wN \__fp_parse_infix_after_operand:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \exp_after:wN \__fp_sanitize:wN \__int_value:w \__int_eval:w 0 \__fp_parse_strim_zeros:N } \cs_new:cpn { __fp_parse_prefix_(:Nw } #1 { \exp_after:wN \__fp_parse_lparen_after:NwN \exp_after:wN #1 \exp:w \if_int_compare:w #1 = \c__fp_prec_funcii_int \__fp_parse_operand:Nw \c__fp_prec_comma_int \else: \__fp_parse_operand:Nw \c__fp_prec_paren_int \fi: \__fp_parse_expand:w } \cs_new:Npx \__fp_parse_lparen_after:NwN #1#2 @ #3 { \exp_not:N \token_if_eq_meaning:NNTF #3 \exp_not:c { __fp_parse_infix_):N } { \exp_not:N \__fp_exp_after_array_f:w #2 \s__fp_stop \exp_not:N \exp_after:wN \exp_not:N \__fp_parse_infix:NN \exp_not:N \exp_after:wN #1 \exp_not:N \exp:w \exp_not:N \__fp_parse_expand:w } { \exp_not:N \__msg_kernel_expandable_error:nnn { kernel } { fp-missing } { ) } #2 @ \exp_not:N \use_none:n #3 } } \cs_new:cpn { __fp_parse_prefix_):Nw } #1 { \if_int_compare:w #1 = \c__fp_prec_comma_int \else: \__msg_kernel_expandable_error:nnn { kernel } { fp-missing-number } { ) } \exp_after:wN \c_nan_fp \exp:w \exp_end_continue_f:w \fi: \__fp_parse_infix:NN #1 ) } \cs_set_protected:Npn \__fp_tmp:w #1 #2 { \cs_new:cpn { __fp_parse_word_#1:N } { \exp_after:wN #2 \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN } } \__fp_tmp:w { inf } \c_inf_fp \__fp_tmp:w { nan } \c_nan_fp \__fp_tmp:w { pi } \c_pi_fp \__fp_tmp:w { deg } \c_one_degree_fp \__fp_tmp:w { true } \c_one_fp \__fp_tmp:w { false } \c_zero_fp \cs_new_eq:NN \__fp_parse_caseless_inf:N \__fp_parse_word_inf:N \cs_new_eq:NN \__fp_parse_caseless_infinity:N \__fp_parse_word_inf:N \cs_new_eq:NN \__fp_parse_caseless_nan:N \__fp_parse_word_nan:N \cs_set_protected:Npn \__fp_tmp:w #1 #2 { \cs_new:cpn { __fp_parse_word_#1:N } { \__fp_exp_after_f:nw { \__fp_parse_infix:NN } \s__fp \__fp_chk:w 10 #2 ; } } \__fp_tmp:w {pt} { {1} {1000} {0000} {0000} {0000} } \__fp_tmp:w {in} { {2} {7227} {0000} {0000} {0000} } \__fp_tmp:w {pc} { {2} {1200} {0000} {0000} {0000} } \__fp_tmp:w {cm} { {2} {2845} {2755} {9055} {1181} } \__fp_tmp:w {mm} { {1} {2845} {2755} {9055} {1181} } \__fp_tmp:w {dd} { {1} {1070} {0085} {6496} {0630} } \__fp_tmp:w {cc} { {2} {1284} {0102} {7795} {2756} } \__fp_tmp:w {nd} { {1} {1066} {9783} {4645} {6693} } \__fp_tmp:w {nc} { {2} {1280} {3740} {1574} {8031} } \__fp_tmp:w {bp} { {1} {1003} {7500} {0000} {0000} } \__fp_tmp:w {sp} { {-4} {1525} {8789} {0625} {0000} } \tl_map_inline:nn { {em} {ex} } { \cs_new:cpn { __fp_parse_word_#1:N } { \exp_after:wN \__fp_from_dim_test:ww \exp_after:wN 0 \exp_after:wN , \__int_value:w \__dim_eval:w 1 #1 \exp_after:wN ; \exp:w \exp_end_continue_f:w \__fp_parse_infix:NN } } \cs_new:Npn \__fp_parse_unary_function:NNN #1#2#3 { \exp_after:wN \__fp_parse_apply_unary:NNNwN \exp_after:wN #3 \exp_after:wN #2 \exp_after:wN #1 \exp:w \__fp_parse_operand:Nw \c__fp_prec_func_int \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_function:NNN #1#2#3 { \exp_after:wN \__fp_parse_apply_unary:NNNwN \exp_after:wN #3 \exp_after:wN #2 \exp_after:wN #1 \exp:w \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w } \cs_new:Npn \__fp_parse:n #1 { \exp:w \exp_after:wN \__fp_parse_after:ww \exp:w \__fp_parse_operand:Nw \c__fp_prec_end_int \__fp_parse_expand:w #1 \s__fp_mark \__fp_parse_infix_end:N \s__fp_stop } \cs_new:Npn \__fp_parse_after:ww #1@ \__fp_parse_infix_end:N \s__fp_stop { \exp_end: #1 } \cs_new:Npn \__fp_parse_o:n #1 { \exp_after:wN \exp_after:wN \exp_after:wN \__fp_exp_after_o:w \__fp_parse:n {#1} } \cs_new:Npn \__fp_parse_operand:Nw #1 { \exp_end_continue_f:w \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \exp_after:wN \__fp_parse_one:Nw \exp_after:wN #1 \exp:w } \cs_new:Npn \__fp_parse_continue:NwN #1 #2 @ #3 { #3 #1 #2 @ } \cs_new:Npn \__fp_parse_apply_binary:NwNwN #1 #2@ #3 #4@ #5 { \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \cs:w __fp_#3_o:ww \cs_end: #2 #4 \exp:w \exp_end_continue_f:w #5 #1 } \cs_new:Npn \__fp_parse_infix_after_operand:NwN #1 #2; { \__fp_exp_after_f:nw { \__fp_parse_infix:NN #1 } #2; } \cs_new:Npn \__fp_parse_infix:NN #1 #2 { \if_catcode:w \scan_stop: \exp_not:N #2 \if_int_compare:w \__str_if_eq_x:nn { \s__fp_mark } { \exp_not:N #2 } = 0 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_infix_mark:NNN \else: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_infix_juxtapose:N \fi: \else: \if_int_compare:w \__int_eval:w ( `#2 \if_int_compare:w `#2 > `Z - 32 \fi: ) / 26 = 3 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_parse_infix_juxtapose:N \else: \exp_after:wN \__fp_parse_infix_check:NNN \cs:w __fp_parse_infix_ \token_to_str:N #2 :N \exp_after:wN \exp_after:wN \exp_after:wN \cs_end: \fi: \fi: #1 #2 } \cs_new:Npx \__fp_parse_infix_check:NNN #1#2#3 { \exp_not:N \if_meaning:w \scan_stop: #1 \exp_not:N \__msg_kernel_expandable_error:nnn { kernel } { fp-missing } { * } \exp_not:N \exp_after:wN \exp_not:c { __fp_parse_infix_*:N } \exp_not:N \exp_after:wN #2 \exp_not:N \exp_after:wN #3 \exp_not:N \else: \exp_not:N \exp_after:wN #1 \exp_not:N \exp_after:wN #2 \exp_not:N \exp:w \exp_not:N \exp_after:wN \exp_not:N \__fp_parse_expand:w \exp_not:N \fi: } \cs_new:Npn \__fp_parse_infix_mark:NNN #1#2#3 { #3 #1 } \cs_new:Npn \__fp_parse_infix_end:N #1 { @ \use_none:n \__fp_parse_infix_end:N } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_new:Npn #1 ##1 { \if_int_compare:w ##1 < \c__fp_prec_paren_int \__msg_kernel_expandable_error:nnn { kernel } { fp-extra } { ) } \exp_after:wN \__fp_parse_infix:NN \exp_after:wN ##1 \exp:w \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_):N } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_new:Npn #1 ##1 { \if_int_compare:w ##1 > \c__fp_prec_comma_int \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 \else: \if_int_compare:w ##1 < \c__fp_prec_comma_int \__fp_parse_infix_comma_error:w \fi: \exp_after:wN \__fp_parse_infix_comma:w \exp:w \__fp_parse_operand:Nw \c__fp_prec_comma_int \exp_after:wN \__fp_parse_expand:w \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_,:N } \cs_new:Npn \__fp_parse_infix_comma:w #1 @ { #1 @ \use_none:n } \cs_new:Npn \__fp_parse_infix_comma_error:w #1 \exp:w { \fi: \__msg_kernel_expandable_error:nn { kernel } { fp-extra-comma } \exp_after:wN @ \exp_after:wN \__fp_parse_apply_binary:NwNwN \exp_after:wN , \exp:w } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_new:Npn #1 ##1 { \if_meaning:w \s__fp ##1 \exp_after:wN \__fp_use_i_until_s:nw \exp_after:wN #1 \fi: \exp_after:wN \c_nan_fp ##1 } } \exp_args:Nc \__fp_tmp:w { __fp_,_o:ww } \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4 { \cs_new:Npn #1 ##1 { \if_int_compare:w ##1 < #3 \exp_after:wN @ \exp_after:wN \__fp_parse_apply_binary:NwNwN \exp_after:wN #2 \exp:w \__fp_parse_operand:Nw #4 \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_^:N } ^ \c__fp_prec_hatii_int \c__fp_prec_hat_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_/:N } / \c__fp_prec_times_int \c__fp_prec_times_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_mul:N } * \c__fp_prec_times_int \c__fp_prec_times_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_-:N } - \c__fp_prec_plus_int \c__fp_prec_plus_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_+:N } + \c__fp_prec_plus_int \c__fp_prec_plus_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_and:N } & \c__fp_prec_and_int \c__fp_prec_and_int \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_or:N } | \c__fp_prec_or_int \c__fp_prec_or_int \cs_new:cpn { __fp_parse_infix_(:N } #1 { \__fp_parse_infix_juxtapose:N #1 ( } \cs_new:Npn \__fp_parse_infix_juxtapose:N #1 { \if_int_compare:w #1 < \c__fp_prec_times_int \exp_after:wN @ \exp_after:wN \__fp_parse_apply_juxtapose:NwwN \exp:w \__fp_parse_operand:Nw \c__fp_prec_times_int \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN \__fp_parse_infix_juxtapose:N \fi: } \cs_new:Npn \__fp_parse_apply_juxtapose:NwwN #1 #2;#3@ #4;#5@ { \if_catcode:w ^ \tl_to_str:n { #3 #5 } ^ \else: \__fp_error:nffn { fp-invalid-ii } { \__fp_array_to_clist:n { #2; #3 } } { \__fp_array_to_clist:n { #4; #5 } } { } \fi: \__fp_parse_apply_binary:NwNwN #1 #2;@ * #4;@ } \cs_set_protected:Npn \__fp_tmp:w #1 { \cs_new:cpn { __fp_parse_infix_*:N } ##1##2 { \if:w * \exp_not:N ##2 \exp_after:wN #1 \exp_after:wN ##1 \else: \exp_after:wN \__fp_parse_infix_mul:N \exp_after:wN ##1 \exp_after:wN ##2 \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_^:N } \cs_set_protected:Npn \__fp_tmp:w #1#2#3 { \cs_new:Npn #1 ##1##2 { \if:w #2 \exp_not:N ##2 \exp_after:wN #1 \exp_after:wN ##1 \exp:w \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN #3 \exp_after:wN ##1 \exp_after:wN ##2 \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_|:N } | \__fp_parse_infix_or:N \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_&:N } & \__fp_parse_infix_and:N \cs_set_protected:Npn \__fp_tmp:w #1#2#3#4 { \cs_new:Npn #1 ##1 { \if_int_compare:w ##1 < \c__fp_prec_quest_int #4 \exp_after:wN @ \exp_after:wN #2 \exp:w \__fp_parse_operand:Nw #3 \exp_after:wN \__fp_parse_expand:w \else: \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN #1 \fi: } } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_?:N } \__fp_ternary:NwwN \c__fp_prec_quest_int { } \exp_args:Nc \__fp_tmp:w { __fp_parse_infix_::N } \__fp_ternary_auxii:NwwN \c__fp_prec_colon_int { \__msg_kernel_expandable_error:nnnn { kernel } { fp-missing } { ? } { ~for~?: } } \cs_new:cpn { __fp_parse_infix_<:N } #1 { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 < } \cs_new:cpn { __fp_parse_infix_=:N } #1 { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 = } \cs_new:cpn { __fp_parse_infix_>:N } #1 { \__fp_parse_compare:NNNNNNN #1 1 0 0 0 0 > } \cs_new:cpn { __fp_parse_infix_!:N } #1 { \exp_after:wN \__fp_parse_compare:NNNNNNN \exp_after:wN #1 \exp_after:wN 0 \exp_after:wN 1 \exp_after:wN 1 \exp_after:wN 1 \exp_after:wN 1 } \cs_new:Npn \__fp_parse_excl_error: { \__msg_kernel_expandable_error:nnnn { kernel } { fp-missing } { = } { ~after~!. } } \cs_new:Npn \__fp_parse_compare:NNNNNNN #1 { \if_int_compare:w #1 < \c__fp_prec_comp_int \exp_after:wN \__fp_parse_compare_auxi:NNNNNNN \exp_after:wN \__fp_parse_excl_error: \else: \exp_after:wN @ \exp_after:wN \use_none:n \exp_after:wN \__fp_parse_compare:NNNNNNN \fi: } \cs_new:Npn \__fp_parse_compare_auxi:NNNNNNN #1#2#3#4#5#6#7 { \if_case:w \__int_eval:w \exp_after:wN ` \token_to_str:N #7 - `< \__int_eval_end: \__fp_parse_compare_auxii:NNNNN #2#2#4#5#6 \or: \__fp_parse_compare_auxii:NNNNN #2#3#2#5#6 \or: \__fp_parse_compare_auxii:NNNNN #2#3#4#2#6 \or: \__fp_parse_compare_auxii:NNNNN #2#3#4#5#2 \else: #1 \__fp_parse_compare_end:NNNNw #3#4#5#6#7 \fi: } \cs_new:Npn \__fp_parse_compare_auxii:NNNNN #1#2#3#4#5 { \exp_after:wN \__fp_parse_compare_auxi:NNNNNNN \exp_after:wN \prg_do_nothing: \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 \exp_after:wN #5 \exp:w \exp_after:wN \__fp_parse_expand:w } \cs_new:Npn \__fp_parse_compare_end:NNNNw #1#2#3#4#5 \fi: { \fi: \exp_after:wN @ \exp_after:wN \__fp_parse_apply_compare:NwNNNNNwN \exp_after:wN \c_one_fp \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 \exp:w \__fp_parse_operand:Nw \c__fp_prec_comp_int \__fp_parse_expand:w #5 } \cs_new:Npn \__fp_parse_apply_compare:NwNNNNNwN #1 #2@ #3 #4#5#6#7 #8@ #9 { \if_int_odd:w \if_meaning:w \c_zero_fp #3 0 \else: \if_case:w \__fp_compare_back:ww #8 #2 \exp_stop_f: #5 \or: #6 \or: #7 \else: #4 \fi: \fi: \exp_stop_f: \exp_after:wN \__fp_parse_apply_compare_aux:NNwN \exp_after:wN \c_one_fp \else: \exp_after:wN \__fp_parse_apply_compare_aux:NNwN \exp_after:wN \c_zero_fp \fi: #1 #8 #9 } \cs_new:Npn \__fp_parse_apply_compare_aux:NNwN #1 #2 #3; #4 { \if_meaning:w \__fp_parse_compare:NNNNNNN #4 \exp_after:wN \__fp_parse_continue_compare:NNwNN \exp_after:wN #1 \exp_after:wN #2 \exp:w \exp_end_continue_f:w \__fp_exp_after_o:w #3; \exp:w \exp_end_continue_f:w \else: \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #2 \exp:w \exp_end_continue_f:w \exp_after:wN #1 \exp:w \exp_end_continue_f:w \fi: #4 #2 } \cs_new:Npn \__fp_parse_continue_compare:NNwNN #1#2 #3@ #4#5 { #4 #2 #3@ #1 } \cs_new:Npn \fp_function:Nw #1 { \exp_after:wN \__fp_function_apply:nw \exp_after:wN #1 \exp:w \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w } \cs_new_protected:Npn \fp_new_function:Npn #1#2# { \__fp_new_function:Ncfnn #1 { __fp_user_ \cs_to_str:N #1 } { \int_eval:n { \tl_count:n {#2} / 2 } } {#2} } \cs_new_protected:Npn \__fp_new_function:NNnnn #1#2#3#4#5 { \cs_new:Npn #1 { \exp_after:wN \__fp_function_apply:nw \exp_after:wN { \exp_after:wN \__fp_function_args:Nwn \exp_after:wN #2 \__int_value:w #3 \exp_after:wN ; \exp_after:wN } \exp:w \__fp_parse_operand:Nw \c__fp_prec_funcii_int \__fp_parse_expand:w } \cs_new:Npn #2 #4 {#5} } \cs_generate_variant:Nn \__fp_new_function:NNnnn { Ncf } \cs_new:Npn \__fp_function_args:Nwn #1#2; #3 { \int_compare:nNnTF { \tl_count:n {#3} } = {#2} { #1 #3 } { \__msg_kernel_expandable_error:nnnnn { kernel } { fp-num-args } { #1() } {#2} {#2} \c_nan_fp } } \cs_new:Npn \__fp_function_apply:nw #1#2 @ { \__fp_parse:n { \__fp_function_store:wwNwnn #2 \s__fp_mark \__fp_function_store:wwNwnn ; \s__fp_mark \__fp_function_store_end:wnnn \s__fp_stop { } { } {#1} } \s__fp_mark } \cs_new:Npn \__fp_function_store:wwNwnn #1; #2 \s__fp_mark #3#4 \s__fp_stop #5#6 { #3 #2 \s__fp_mark #3#4 \s__fp_stop { #5 #6 } { { #1; } } } \cs_new:Npn \__fp_function_store_end:wnnn #1 \s__fp_stop #2#3#4 { #4 {#2} } \__msg_kernel_new:nnn { kernel } { fp-deprecated } { '#1'~deprecated;~use~'#2' } \__msg_kernel_new:nnn { kernel } { unknown-fp-word } { Unknown~fp~word~#1. } \__msg_kernel_new:nnn { kernel } { fp-missing } { Missing~#1~inserted #2. } \__msg_kernel_new:nnn { kernel } { fp-extra } { Extra~#1~ignored. } \__msg_kernel_new:nnn { kernel } { fp-early-end } { Premature~end~in~fp~expression. } \__msg_kernel_new:nnn { kernel } { fp-after-e } { Cannot~use~#1 after~'e'. } \__msg_kernel_new:nnn { kernel } { fp-missing-number } { Missing~number~before~'#1'. } \__msg_kernel_new:nnn { kernel } { fp-unknown-symbol } { Unknown~symbol~#1~ignored. } \__msg_kernel_new:nnn { kernel } { fp-extra-comma } { Unexpected~comma:~extra~arguments~ignored. } \__msg_kernel_new:nnn { kernel } { fp-num-args } { #1~expects~between~#2~and~#3~arguments. } \cs_if_exist:cT { @unexpandable@protect } { \__msg_kernel_new:nnn { kernel } { fp-robust-cmd } { Robust~command~#1 invalid~in~fp~expression! } } %% File: l3fp-logic.dtx Copyright (C) 2011-2017 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_max:N { \__fp_parse_function:NNN \__fp_minmax_o:Nw 2 } \cs_new:Npn \__fp_parse_word_min:N { \__fp_parse_function:NNN \__fp_minmax_o:Nw 0 } \prg_new_eq_conditional:NNn \fp_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \fp_if_exist:c \cs_if_exist:c { TF , T , F , p } \prg_new_conditional:Npnn \fp_compare:n #1 { p , T , F , TF } { \exp_after:wN \__fp_compare_return:w \exp:w \exp_end_continue_f:w \__fp_parse:n {#1} } \cs_new:Npn \__fp_compare_return:w \s__fp \__fp_chk:w #1#2; { \if_meaning:w 0 #1 \prg_return_false: \else: \prg_return_true: \fi: } \prg_new_conditional:Npnn \fp_compare:nNn #1#2#3 { p , T , F , TF } { \if_int_compare:w \exp_after:wN \__fp_compare_aux:wn \exp:w \exp_end_continue_f:w \__fp_parse:n {#1} {#3} = \__int_eval:w `#2 - `= \__int_eval_end: \prg_return_true: \else: \prg_return_false: \fi: } \cs_new:Npn \__fp_compare_aux:wn #1; #2 { \exp_after:wN \__fp_compare_back:ww \exp:w \exp_end_continue_f:w \__fp_parse:n {#2} #1; } \cs_new:Npn \__fp_compare_back:ww \s__fp \__fp_chk:w #1 #2 #3; \s__fp \__fp_chk:w #4 #5 #6; { \__int_value:w \if_meaning:w 3 #1 \exp_after:wN \__fp_compare_nan:w \fi: \if_meaning:w 3 #4 \exp_after:wN \__fp_compare_nan:w \fi: \if_meaning:w 2 #5 - \fi: \if_meaning:w #2 #5 \if_meaning:w #1 #4 \if_meaning:w 1 #1 \__fp_compare_npos:nwnw #6; #3; \else: 0 \fi: \else: \if_int_compare:w #4 < #1 - \fi: 1 \fi: \else: \if_int_compare:w #1#4 = 0 \exp_stop_f: 0 \else: 1 \fi: \fi: \exp_stop_f: } \cs_new:Npn \__fp_compare_nan:w #1 \fi: \exp_stop_f: { 2 \exp_stop_f: } \cs_new:Npn \__fp_compare_npos:nwnw #1#2; #3#4; { \if_int_compare:w #1 = #3 \exp_stop_f: \__fp_compare_significand:nnnnnnnn #2 #4 \else: \if_int_compare:w #1 < #3 - \fi: 1 \fi: } \cs_new:Npn \__fp_compare_significand:nnnnnnnn #1#2#3#4#5#6#7#8 { \if_int_compare:w #1#2 = #5#6 \exp_stop_f: \if_int_compare:w #3#4 = #7#8 \exp_stop_f: 0 \else: \if_int_compare:w #3#4 < #7#8 - \fi: 1 \fi: \else: \if_int_compare:w #1#2 < #5#6 - \fi: 1 \fi: } \cs_new:Npn \fp_do_until:nn #1#2 { #2 \fp_compare:nF {#1} { \fp_do_until:nn {#1} {#2} } } \cs_new:Npn \fp_do_while:nn #1#2 { #2 \fp_compare:nT {#1} { \fp_do_while:nn {#1} {#2} } } \cs_new:Npn \fp_until_do:nn #1#2 { \fp_compare:nF {#1} { #2 \fp_until_do:nn {#1} {#2} } } \cs_new:Npn \fp_while_do:nn #1#2 { \fp_compare:nT {#1} { #2 \fp_while_do:nn {#1} {#2} } } \cs_new:Npn \fp_do_until:nNnn #1#2#3#4 { #4 \fp_compare:nNnF {#1} #2 {#3} { \fp_do_until:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \fp_do_while:nNnn #1#2#3#4 { #4 \fp_compare:nNnT {#1} #2 {#3} { \fp_do_while:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \fp_until_do:nNnn #1#2#3#4 { \fp_compare:nNnF {#1} #2 {#3} { #4 \fp_until_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \fp_while_do:nNnn #1#2#3#4 { \fp_compare:nNnT {#1} #2 {#3} { #4 \fp_while_do:nNnn {#1} #2 {#3} {#4} } } \cs_new:Npn \fp_step_function:nnnN #1#2#3 { \exp_after:wN \__fp_step:wwwN \exp:w \exp_end_continue_f:w \__fp_parse_o:n {#1} \exp:w \exp_end_continue_f:w \__fp_parse_o:n {#2} \exp:w \exp_end_continue_f:w \__fp_parse:n {#3} } \cs_generate_variant:Nn \fp_step_function:nnnN { nnnc } \cs_new:Npn \__fp_step:wwwN #1 ; \s__fp \__fp_chk:w #2#3#4 ; #5; #6 { \token_if_eq_meaning:NNTF #2 1 { \token_if_eq_meaning:NNTF #3 0 { \__fp_step:NnnnnN > } { \__fp_step:NnnnnN < } } { \token_if_eq_meaning:NNTF #2 0 { \__msg_kernel_expandable_error:nnn { kernel } { zero-step } {#6} } { \__fp_error:nnfn { fp-bad-step } { } { \fp_to_tl:n { \s__fp \__fp_chk:w #2#3#4 ; } } {#6} } \use_none:nnnnn } { #1 ; } { \c_nan_fp } { \s__fp \__fp_chk:w #2#3#4 ; } { #5 ; } #6 } \cs_new:Npn \__fp_step:NnnnnN #1#2#3#4#5#6 { \fp_compare:nNnTF {#2} = {#3} { \__fp_error:nffn { fp-tiny-step } { \fp_to_tl:n {#3} } { \fp_to_tl:n {#4} } {#6} } { \fp_compare:nNnF {#2} #1 {#5} { \exp_args:Nf #6 { \__fp_to_decimal_dispatch:w #2 } \__fp_step:NfnnnN #1 { \__fp_parse:n { #2 + #4 } } {#2} {#4} {#5} #6 } } } \cs_generate_variant:Nn \__fp_step:NnnnnN { Nf } \cs_new_protected:Npn \fp_step_inline:nnnn { \int_gincr:N \g__prg_map_int \exp_args:NNc \__fp_step:NNnnnn \cs_gset_protected:Npn { __prg_map_ \int_use:N \g__prg_map_int :w } } \cs_new_protected:Npn \fp_step_variable:nnnNn #1#2#3#4#5 { \int_gincr:N \g__prg_map_int \exp_args:NNc \__fp_step:NNnnnn \cs_gset_protected:Npx { __prg_map_ \int_use:N \g__prg_map_int :w } {#1} {#2} {#3} { \tl_set:Nn \exp_not:N #4 {##1} \exp_not:n {#5} } } \cs_new_protected:Npn \__fp_step:NNnnnn #1#2#3#4#5#6 { #1 #2 ##1 {#6} \fp_step_function:nnnN {#3} {#4} {#5} #2 \__prg_break_point:Nn \scan_stop: { \int_gdecr:N \g__prg_map_int } } \__msg_kernel_new:nnn { kernel } { fp-bad-step } { Invalid~step~size~#2~in~step~function~#3. } \__msg_kernel_new:nnn { kernel } { fp-tiny-step } { Tiny~step~size~(#1+#2=#1)~in~step~function~#3. } \cs_new:Npn \__fp_minmax_o:Nw #1#2 @ { \if_meaning:w 0 #1 \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN + \else: \exp_after:wN \__fp_minmax_loop:Nww \exp_after:wN - \fi: #2 \s__fp \__fp_chk:w 2 #1 \s__fp_exact ; \s__fp \__fp_chk:w { 3 \__fp_minmax_break_o:w } ; } \cs_new:Npn \__fp_minmax_loop:Nww #1 \s__fp \__fp_chk:w #2#3; \s__fp \__fp_chk:w #4#5; { \if_meaning:w 3 #4 \if_meaning:w 3 #2 \__fp_minmax_auxi:ww \else: \__fp_minmax_auxii:ww \fi: \else: \if_int_compare:w \__fp_compare_back:ww \s__fp \__fp_chk:w #4#5; \s__fp \__fp_chk:w #2#3; = #1 1 \exp_stop_f: \__fp_minmax_auxii:ww \else: \__fp_minmax_auxi:ww \fi: \fi: \__fp_minmax_loop:Nww #1 \s__fp \__fp_chk:w #2#3; \s__fp \__fp_chk:w #4#5; } \cs_new:Npn \__fp_minmax_auxi:ww #1 \fi: \fi: #2 \s__fp #3 ; \s__fp #4; { \fi: \fi: #2 \s__fp #3 ; } \cs_new:Npn \__fp_minmax_auxii:ww #1 \fi: \fi: #2 \s__fp #3 ; { \fi: \fi: #2 } \cs_new:Npn \__fp_minmax_break_o:w #1 \fi: \fi: #2 \s__fp #3; #4; { \fi: \__fp_exp_after_o:w \s__fp #3; } \cs_new:cpn { __fp_not_o:w } #1 \s__fp \__fp_chk:w #2#3; @ { \if_meaning:w 0 #2 \exp_after:wN \exp_after:wN \exp_after:wN \c_one_fp \else: \exp_after:wN \exp_after:wN \exp_after:wN \c_zero_fp \fi: } \group_begin: \char_set_catcode_letter:N & \char_set_catcode_letter:N | \cs_new:Npn \__fp_&_o:ww #1 \s__fp \__fp_chk:w #2#3; { \if_meaning:w 0 #2 #1 \__fp_and_return:wNw \s__fp \__fp_chk:w #2#3; \fi: \__fp_exp_after_o:w } \cs_new:Npn \__fp_|_o:ww { \__fp_&_o:ww \else: } \group_end: \cs_new:Npn \__fp_and_return:wNw #1; \fi: #2#3; { \fi: #2 #1; } \cs_new:Npn \__fp_ternary:NwwN #1 #2@ #3@ #4 { \if_meaning:w \__fp_parse_infix_::N #4 \__fp_ternary_loop:Nw #2 \s__fp \__fp_chk:w { \__fp_ternary_loop_break:w } ; \__fp_ternary_break_point:n { \exp_after:wN \__fp_ternary_auxi:NwwN } \exp_after:wN #1 \exp:w \exp_end_continue_f:w \__fp_exp_after_array_f:w #3 \s__fp_stop \exp_after:wN @ \exp:w \__fp_parse_operand:Nw \c__fp_prec_colon_int \__fp_parse_expand:w \else: \__msg_kernel_expandable_error:nnnn { kernel } { fp-missing } { : } { ~for~?: } \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \__fp_exp_after_array_f:w #3 \s__fp_stop \exp_after:wN #4 \exp_after:wN #1 \fi: } \cs_new:Npn \__fp_ternary_loop_break:w #1 \fi: #2 \__fp_ternary_break_point:n #3 { 0 = 0 \exp_stop_f: \fi: \exp_after:wN \__fp_ternary_auxii:NwwN } \cs_new:Npn \__fp_ternary_loop:Nw \s__fp \__fp_chk:w #1#2; { \if_int_compare:w #1 > 0 \exp_stop_f: \exp_after:wN \__fp_ternary_map_break: \fi: \__fp_ternary_loop:Nw } \cs_new:Npn \__fp_ternary_map_break: #1 \__fp_ternary_break_point:n #2 {#2} \cs_new:Npn \__fp_ternary_auxi:NwwN #1#2@#3@#4 { \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \__fp_exp_after_array_f:w #2 \s__fp_stop #4 #1 } \cs_new:Npn \__fp_ternary_auxii:NwwN #1#2@#3@#4 { \exp_after:wN \__fp_parse_continue:NwN \exp_after:wN #1 \exp:w \exp_end_continue_f:w \__fp_exp_after_array_f:w #3 \s__fp_stop #4 #1 } %% File: l3fp-basics.dtx Copyright (C) 2011-2014,2016,2017 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_abs:N { \__fp_parse_unary_function:NNN \__fp_set_sign_o:w 0 } \cs_new:Npn \__fp_parse_word_sign:N { \__fp_parse_unary_function:NNN \__fp_sign_o:w ? } \cs_new:Npn \__fp_parse_word_sqrt:N { \__fp_parse_unary_function:NNN \__fp_sqrt_o:w ? } \cs_new:cpx { __fp_-_o:ww } \s__fp { \exp_not:c { __fp_+_o:ww } \exp_not:n { \s__fp \__fp_neg_sign:N } } \cs_new:cpn { __fp_+_o:ww } \s__fp #1 \__fp_chk:w #2 #3 ; \s__fp \__fp_chk:w #4 #5 { \if_case:w \if_meaning:w #2 #4 #2 \else: \if_int_compare:w #2 > #4 \exp_stop_f: 3 \else: 4 \fi: \fi: \exp_stop_f: \exp_after:wN \__fp_add_zeros_o:Nww \__int_value:w \or: \exp_after:wN \__fp_add_normal_o:Nww \__int_value:w \or: \exp_after:wN \__fp_add_inf_o:Nww \__int_value:w \or: \__fp_case_return_i_o:ww \else: \exp_after:wN \__fp_add_return_ii_o:Nww \__int_value:w \fi: #1 #5 \s__fp \__fp_chk:w #2 #3 ; \s__fp \__fp_chk:w #4 #5 } \cs_new:Npn \__fp_add_return_ii_o:Nww #1 #2 ; \s__fp \__fp_chk:w #3 #4 { \__fp_exp_after_o:w \s__fp \__fp_chk:w #3 #1 } \cs_new:Npn \__fp_add_zeros_o:Nww #1 \s__fp \__fp_chk:w 0 #2 { \if_int_compare:w #2 #1 = 20 \exp_stop_f: \exp_after:wN \__fp_add_return_ii_o:Nww \else: \__fp_case_return_i_o:ww \fi: #1 \s__fp \__fp_chk:w 0 #2 } \cs_new:Npn \__fp_add_inf_o:Nww #1 \s__fp \__fp_chk:w 2 #2 #3; \s__fp \__fp_chk:w 2 #4 { \if_meaning:w #1 #2 \__fp_case_return_i_o:ww \else: \__fp_case_use:nw { \exp_last_unbraced:Nf \__fp_invalid_operation_o:Nww { \token_if_eq_meaning:NNTF #1 #4 + - } } \fi: \s__fp \__fp_chk:w 2 #2 #3; \s__fp \__fp_chk:w 2 #4 } \cs_new:Npn \__fp_add_normal_o:Nww #1 \s__fp \__fp_chk:w 1 #2 { \if_meaning:w #1#2 \exp_after:wN \__fp_add_npos_o:NnwNnw \else: \exp_after:wN \__fp_sub_npos_o:NnwNnw \fi: #2 } \cs_new:Npn \__fp_add_npos_o:NnwNnw #1#2#3 ; \s__fp \__fp_chk:w 1 #4 #5 { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w \if_int_compare:w #2 > #5 \exp_stop_f: #2 \exp_after:wN \__fp_add_big_i_o:wNww \__int_value:w - \else: #5 \exp_after:wN \__fp_add_big_ii_o:wNww \__int_value:w \fi: \__int_eval:w #5 - #2 ; #1 #3; } \cs_new:Npn \__fp_add_big_i_o:wNww #1; #2 #3; #4; { \__fp_decimate:nNnnnn {#1} \__fp_add_significand_o:NnnwnnnnN #4 #3 #2 } \cs_new:Npn \__fp_add_big_ii_o:wNww #1; #2 #3; #4; { \__fp_decimate:nNnnnn {#1} \__fp_add_significand_o:NnnwnnnnN #3 #4 #2 } \cs_new:Npn \__fp_add_significand_o:NnnwnnnnN #1 #2#3 #4; #5#6#7#8 { \exp_after:wN \__fp_add_significand_test_o:N \__int_value:w \__int_eval:w 1#5#6 + #2 \exp_after:wN \__fp_add_significand_pack:NNNNNNN \__int_value:w \__int_eval:w 1#7#8 + #3 ; #1 } \cs_new:Npn \__fp_add_significand_pack:NNNNNNN #1 #2#3#4#5#6#7 { \if_meaning:w 2 #1 + 1 \fi: ; #2 #3 #4 #5 #6 #7 ; } \cs_new:Npn \__fp_add_significand_test_o:N #1 { \if_meaning:w 2 #1 \exp_after:wN \__fp_add_significand_carry_o:wwwNN \else: \exp_after:wN \__fp_add_significand_no_carry_o:wwwNN \fi: } \cs_new:Npn \__fp_add_significand_no_carry_o:wwwNN #1; #2; #3#4 ; #5#6 { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1 #1 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1 #2 #3#4 + \__fp_round:NNN #6 #4 #5 \exp_after:wN ; } \cs_new:Npn \__fp_add_significand_carry_o:wwwNN #1; #2; #3#4; #5#6 { + 1 \exp_after:wN \__fp_basics_pack_weird_high:NNNNNNNNw \__int_value:w \__int_eval:w 1 1 #1 \exp_after:wN \__fp_basics_pack_weird_low:NNNNw \__int_value:w \__int_eval:w 1 #2#3 + \exp_after:wN \__fp_round:NNN \exp_after:wN #6 \exp_after:wN #3 \__int_value:w \__fp_round_digit:Nw #4 #5 ; \exp_after:wN ; } \cs_new:Npn \__fp_sub_npos_o:NnwNnw #1#2#3; \s__fp \__fp_chk:w 1 #4#5#6; { \if_case:w \__fp_compare_npos:nwnw {#2} #3; {#5} #6; \exp_stop_f: \exp_after:wN \__fp_sub_eq_o:Nnwnw \or: \exp_after:wN \__fp_sub_npos_i_o:Nnwnw \else: \exp_after:wN \__fp_sub_npos_ii_o:Nnwnw \fi: #1 {#2} #3; {#5} #6; } \cs_new:Npn \__fp_sub_eq_o:Nnwnw #1#2; #3; { \exp_after:wN \c_zero_fp } \cs_new:Npn \__fp_sub_npos_ii_o:Nnwnw #1 #2; #3; { \exp_after:wN \__fp_sub_npos_i_o:Nnwnw \__int_value:w \__fp_neg_sign:N #1 #3; #2; } \cs_new:Npn \__fp_sub_npos_i_o:Nnwnw #1 #2#3; #4#5; { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w #2 \if_int_compare:w #2 = #4 \exp_stop_f: \exp_after:wN \__fp_sub_back_near_o:nnnnnnnnN \else: \exp_after:wN \__fp_decimate:nNnnnn \exp_after:wN { \__int_value:w \__int_eval:w #2 - #4 - 1 \exp_after:wN } \exp_after:wN \__fp_sub_back_far_o:NnnwnnnnN \fi: #5 #3 #1 } \cs_new:Npn \__fp_sub_back_near_o:nnnnnnnnN #1#2#3#4 #5#6#7#8 #9 { \exp_after:wN \__fp_sub_back_near_after:wNNNNw \__int_value:w \__int_eval:w 10#5#6 - #1#2 - 11 \exp_after:wN \__fp_sub_back_near_pack:NNNNNNw \__int_value:w \__int_eval:w 11#7#8 - #3#4 \exp_after:wN ; } \cs_new:Npn \__fp_sub_back_near_pack:NNNNNNw #1#2#3#4#5#6#7 ; { + #1#2 ; {#3#4#5#6} {#7} ; } \cs_new:Npn \__fp_sub_back_near_after:wNNNNw 10 #1#2#3#4 #5 ; { \if_meaning:w 0 #1 \exp_after:wN \__fp_sub_back_shift:wnnnn \fi: ; {#1#2#3#4} {#5} } \cs_new:Npn \__fp_sub_back_shift:wnnnn ; #1#2 { \exp_after:wN \__fp_sub_back_shift_ii:ww \__int_value:w #1 #2 0 ; } \cs_new:Npn \__fp_sub_back_shift_ii:ww #1 0 ; #2#3 ; { \if_meaning:w @ #1 @ - 7 - \exp_after:wN \use_i:nnn \exp_after:wN \__fp_sub_back_shift_iii:NNNNNNNNw \__int_value:w #2#3 0 ~ 123456789; \else: - \__fp_sub_back_shift_iii:NNNNNNNNw #1 123456789; \fi: \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_sub_back_shift_iv:nnnnw \exp_after:wN ; \__int_value:w #1 ~ #2#3 0 ~ 0000 0000 0000 000 ; } \cs_new:Npn \__fp_sub_back_shift_iii:NNNNNNNNw #1#2#3#4#5#6#7#8#9; {#8} \cs_new:Npn \__fp_sub_back_shift_iv:nnnnw #1 ; #2 ; { ; #1 ; } \cs_new:Npn \__fp_sub_back_far_o:NnnwnnnnN #1 #2#3 #4; #5#6#7#8 { \if_case:w \if_int_compare:w 1 #2 = #5#6 \use_i:nnnn #7 \exp_stop_f: \if_int_compare:w #3 = \use_none:n #7#8 0 \exp_stop_f: 0 \else: \if_int_compare:w #3 > \use_none:n #7#8 0 - \fi: 1 \fi: \else: \if_int_compare:w 1 #2 > #5#6 \use_i:nnnn #7 - \fi: 1 \fi: \exp_stop_f: \exp_after:wN \__fp_sub_back_quite_far_o:wwNN \or: \exp_after:wN \__fp_sub_back_very_far_o:wwwwNN \else: \exp_after:wN \__fp_sub_back_not_far_o:wwwwNN \fi: #2 ~ #3 ; #5 #6 ~ #7 #8 ; #1 } \cs_new:Npn \__fp_sub_back_quite_far_o:wwNN #1; #2; #3#4 { \exp_after:wN \__fp_sub_back_quite_far_ii:NN \exp_after:wN #3 \exp_after:wN #4 } \cs_new:Npn \__fp_sub_back_quite_far_ii:NN #1#2 { \if_case:w \__fp_round_neg:NNN #2 0 #1 \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { ; {1000} {0000} {0000} {0000} ; } { - 1 ; {9999} {9999} {9999} {9999} ; } } \cs_new:Npn \__fp_sub_back_not_far_o:wwwwNN #1 ~ #2; #3 ~ #4; #5#6 { - 1 \exp_after:wN \__fp_sub_back_near_after:wNNNNw \__int_value:w \__int_eval:w 1#30 - #1 - 11 \exp_after:wN \__fp_sub_back_near_pack:NNNNNNw \__int_value:w \__int_eval:w 11 0000 0000 + #40 - #2 - \exp_after:wN \__fp_round_neg:NNN \exp_after:wN #6 \use_none:nnnnnnn #2 #5 \exp_after:wN ; } \cs_new:Npn \__fp_sub_back_very_far_o:wwwwNN #1#2#3#4#5#6#7 { \__fp_pack_eight:wNNNNNNNN \__fp_sub_back_very_far_ii_o:nnNwwNN { 0 #1#2#3 #4#5#6#7 } ; } \cs_new:Npn \__fp_sub_back_very_far_ii_o:nnNwwNN #1#2 ; #3 ; #4 ~ #5; #6#7 { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1#4 - #1 - 1 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 2#5 - #2 - \exp_after:wN \__fp_round_neg:NNN \exp_after:wN #7 \__int_value:w \if_int_odd:w \__int_eval:w #5 - #2 \__int_eval_end: 1 \else: 2 \fi: \__int_value:w \__fp_round_digit:Nw #3 #6 ; \exp_after:wN ; } \cs_new:cpn { __fp_*_o:ww } { \__fp_mul_cases_o:NnNnww * { - 2 + } \__fp_mul_npos_o:Nww { } } \cs_new:Npn \__fp_mul_cases_o:NnNnww #1#2#3#4 \s__fp \__fp_chk:w #5#6#7; \s__fp \__fp_chk:w #8#9 { \if_case:w \__int_eval:w \if_int_compare:w #5 #8 = 11 ~ 1 \else: \if_meaning:w 3 #8 3 \else: \if_meaning:w 3 #5 2 \else: \if_int_compare:w #5 #8 = 10 ~ 9 #2 - 2 \else: (#5 #2 #8) / 2 * 2 + 7 \fi: \fi: \fi: \fi: \if_meaning:w #6 #9 - 1 \fi: \__int_eval_end: \__fp_case_use:nw { #3 0 } \or: \__fp_case_use:nw { #3 2 } \or: \__fp_case_return_i_o:ww \or: \__fp_case_return_ii_o:ww \or: \__fp_case_return_o:Nww \c_zero_fp \or: \__fp_case_return_o:Nww \c_minus_zero_fp \or: \__fp_case_use:nw { \__fp_invalid_operation_o:Nww #1 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:Nww #1 } \or: \__fp_case_return_o:Nww \c_inf_fp \or: \__fp_case_return_o:Nww \c_minus_inf_fp #4 \fi: \s__fp \__fp_chk:w #5 #6 #7; \s__fp \__fp_chk:w #8 #9 } \cs_new:Npn \__fp_mul_npos_o:Nww #1 \s__fp \__fp_chk:w #2 #3 #4 #5 ; \s__fp \__fp_chk:w #6 #7 #8 #9 ; { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w #4 + #8 \__fp_mul_significand_o:nnnnNnnnn #5 #1 #9 } \cs_new:Npn \__fp_mul_significand_o:nnnnNnnnn #1#2#3#4 #5 #6#7#8#9 { \exp_after:wN \__fp_mul_significand_test_f:NNN \exp_after:wN #5 \__int_value:w \__int_eval:w 99990000 + #1*#6 + \exp_after:wN \__fp_mul_significand_keep:NNNNNw \__int_value:w \__int_eval:w 99990000 + #1*#7 + #2*#6 + \exp_after:wN \__fp_mul_significand_keep:NNNNNw \__int_value:w \__int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw \__int_value:w \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw \__int_value:w \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw \__int_value:w \__int_eval:w 99990000 + #3*#9 + #4*#8 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw \__int_value:w \__int_eval:w 100000000 + #4*#9 ; ; \exp_after:wN ; } \cs_new:Npn \__fp_mul_significand_drop:NNNNNw #1#2#3#4#5 #6; { #1#2#3#4#5 ; + #6 } \cs_new:Npn \__fp_mul_significand_keep:NNNNNw #1#2#3#4#5 #6; { #1#2#3#4#5 ; #6 ; } \cs_new:Npn \__fp_mul_significand_test_f:NNN #1 #2 #3 { \if_meaning:w 0 #3 \exp_after:wN \__fp_mul_significand_small_f:NNwwwN \else: \exp_after:wN \__fp_mul_significand_large_f:NwwNNNN \fi: #1 #3 } \cs_new:Npn \__fp_mul_significand_large_f:NwwNNNN #1 #2; #3; #4#5#6#7; + { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1#2 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1#3#4#5#6#7 + \exp_after:wN \__fp_round:NNN \exp_after:wN #1 \exp_after:wN #7 \__int_value:w \__fp_round_digit:Nw } \cs_new:Npn \__fp_mul_significand_small_f:NNwwwN #1 #2#3; #4#5; #6; + #7 { - 1 \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1#3#4 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1#5#6#7 + \exp_after:wN \__fp_round:NNN \exp_after:wN #1 \exp_after:wN #7 \__int_value:w \__fp_round_digit:Nw } \cs_new:cpn { __fp_/_o:ww } { \__fp_mul_cases_o:NnNnww / { - } \__fp_div_npos_o:Nww { \or: \__fp_case_use:nw { \__fp_division_by_zero_o:NNww \c_inf_fp / } \or: \__fp_case_use:nw { \__fp_division_by_zero_o:NNww \c_minus_inf_fp / } } } \cs_new:Npn \__fp_div_npos_o:Nww #1 \s__fp \__fp_chk:w 1 #2 #3 #4 ; \s__fp \__fp_chk:w 1 #5 #6 #7#8#9; { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w #3 - #6 \exp_after:wN \__fp_div_significand_i_o:wnnw \__int_value:w \__int_eval:w #7 \use_i:nnnn #8 + 1 ; #4 {#7}{#8}#9 ; #1 } \cs_new:Npn \__fp_div_significand_i_o:wnnw #1 ; #2#3 #4 ; { \exp_after:wN \__fp_div_significand_test_o:w \__int_value:w \__int_eval:w \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ; #2 #3 ; #4 { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_div_significand_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_div_significand_iii:wwnnnnn \__int_value:w #1 } } \cs_new:Npn \__fp_div_significand_calc:wwnnnnnnn 1#1 { \if_meaning:w 1 #1 \exp_after:wN \__fp_div_significand_calc_i:wwnnnnnnn \else: \exp_after:wN \__fp_div_significand_calc_ii:wwnnnnnnn \fi: } \cs_new:Npn \__fp_div_significand_calc_i:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9 { 1 1 #1 #9 \exp_after:wN ; \__int_value:w \__int_eval:w \c__fp_Bigg_leading_shift_int + #2 - #1 * #5 - #5#60 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int + #3 - #1 * #6 - #70 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int + #4 - #1 * #7 - #80 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_trailing_shift_int - #1 * #8 ; {#5}{#6}{#7}{#8} } \cs_new:Npn \__fp_div_significand_calc_ii:wwnnnnnnn #1; #2;#3#4 #5#6#7#8 #9 { 1 0 #1 #9 \exp_after:wN ; \__int_value:w \__int_eval:w \c__fp_Bigg_leading_shift_int + #2 - #1 * #5 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int + #3 - #1 * #6 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_middle_shift_int + #4 - #1 * #7 \exp_after:wN \__fp_pack_Bigg:NNNNNNw \__int_value:w \__int_eval:w \c__fp_Bigg_trailing_shift_int - #1 * #8 ; {#5}{#6}{#7}{#8} } \cs_new:Npn \__fp_div_significand_ii:wwn #1; #2;#3 { \exp_after:wN \__fp_div_significand_pack:NNN \__int_value:w \__int_eval:w \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn \__int_value:w \__int_eval:w 999999 + #2 #3 0 / #1 ; #2 #3 ; } \cs_new:Npn \__fp_div_significand_iii:wwnnnnn #1; #2;#3#4#5 #6#7 { 0 \exp_after:wN \__fp_div_significand_iv:wwnnnnnnn \__int_value:w \__int_eval:w ( 2 * #2 #3) / #6 #7 ; % <- P #2 ; {#3} {#4} {#5} {#6} {#7} } \cs_new:Npn \__fp_div_significand_iv:wwnnnnnnn #1; #2;#3#4#5 #6#7#8#9 { + 5 * #1 \exp_after:wN \__fp_div_significand_vi:Nw \__int_value:w \__int_eval:w -20 + 2*#2#3 - #1*#6#7 + \exp_after:wN \__fp_div_significand_v:NN \__int_value:w \__int_eval:w 199980 + 2*#4 - #1*#8 + \exp_after:wN \__fp_div_significand_v:NN \__int_value:w \__int_eval:w 200000 + 2*#5 - #1*#9 ; } \cs_new:Npn \__fp_div_significand_v:NN #1#2 { #1#2 \__int_eval_end: + } \cs_new:Npn \__fp_div_significand_vi:Nw #1#2; { \if_meaning:w 0 #1 \if_int_compare:w \__int_eval:w #2 > 0 + 1 \fi: \else: \if_meaning:w - #1 - \else: + \fi: 1 \fi: ; } \cs_new:Npn \__fp_div_significand_pack:NNN 1 #1 #2 { + #1 #2 ; } \cs_new:Npn \__fp_div_significand_test_o:w 10 #1 { \if_meaning:w 0 #1 \exp_after:wN \__fp_div_significand_small_o:wwwNNNNwN \else: \exp_after:wN \__fp_div_significand_large_o:wwwNNNNwN \fi: #1 } \cs_new:Npn \__fp_div_significand_small_o:wwwNNNNwN 0 #1; #2; #3; #4#5#6#7#8; #9 { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1 #1#2 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1 #3#4#5#6#7 + \__fp_round:NNN #9 #7 #8 \exp_after:wN ; } \cs_new:Npn \__fp_div_significand_large_o:wwwNNNNwN #1; #2; #3; #4#5#6#7#8; #9 { + 1 \exp_after:wN \__fp_basics_pack_weird_high:NNNNNNNNw \__int_value:w \__int_eval:w 1 #1 #2 \exp_after:wN \__fp_basics_pack_weird_low:NNNNw \__int_value:w \__int_eval:w 1 #3 #4 #5 #6 + \exp_after:wN \__fp_round:NNN \exp_after:wN #9 \exp_after:wN #6 \__int_value:w \__fp_round_digit:Nw #7 #8 ; \exp_after:wN ; } \cs_new:Npn \__fp_sqrt_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_meaning:w 0 #2 \__fp_case_return_same_o:w \fi: \if_meaning:w 2 #3 \__fp_case_use:nw { \__fp_invalid_operation_o:nw { sqrt } } \fi: \if_meaning:w 1 #2 \else: \__fp_case_return_same_o:w \fi: \__fp_sqrt_npos_o:w \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_sqrt_npos_o:w \s__fp \__fp_chk:w 1 0 #1#2#3#4#5; { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN 0 \__int_value:w \__int_eval:w \if_int_odd:w #1 \exp_stop_f: \exp_after:wN \__fp_sqrt_npos_auxi_o:wwnnN \fi: #1 / 2 \__fp_sqrt_Newton_o:wwn 56234133; 0; {#2#3} {#4#5} 0 } \cs_new:Npn \__fp_sqrt_npos_auxi_o:wwnnN #1 / 2 #2; 0; #3#4#5 { ( #1 + 1 ) / 2 \__fp_pack_eight:wNNNNNNNN \__fp_sqrt_npos_auxii_o:wNNNNNNNN ; 0 #3 #4 } \cs_new:Npn \__fp_sqrt_npos_auxii_o:wNNNNNNNN #1; #2#3#4#5#6#7#8#9 { \__fp_sqrt_Newton_o:wwn 17782794; 0; {#1} {#2#3#4#5#6#7#8#9} } \cs_new:Npn \__fp_sqrt_Newton_o:wwn #1; #2; #3 { \if_int_compare:w #1 = #2 \exp_stop_f: \exp_after:wN \__fp_sqrt_auxi_o:NNNNwnnN \__int_value:w \__int_eval:w 9999 9999 + \exp_after:wN \__fp_use_none_until_s:w \fi: \exp_after:wN \__fp_sqrt_Newton_o:wwn \__int_value:w \__int_eval:w (#1 + #3 * 1 0000 0000 / #1) / 2 ; #1; {#3} } \cs_new:Npn \__fp_sqrt_auxi_o:NNNNwnnN 1 #1#2#3#4#5; { \__fp_sqrt_auxii_o:NnnnnnnnN \__fp_sqrt_auxiii_o:wnnnnnnnn {#1#2#3#4} {#5} {2499} {9988} {7500} } \cs_new:Npn \__fp_sqrt_auxii_o:NnnnnnnnN #1 #2#3#4#5#6 #7#8#9 { \exp_after:wN #1 \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int + #7 - #2 * #2 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int - 2 * #2 * #3 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #8 - #3 * #3 - 2 * #2 * #4 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int - 2 * #3 * #4 - 2 * #2 * #5 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #9 000 0000 - #4 * #4 - 2 * #3 * #5 - 2 * #2 * #6 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int - 2 * #4 * #5 - 2 * #3 * #6 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int - #5 * #5 - 2 * #4 * #6 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int - 2 * #5 * #6 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_trailing_shift_int - #6 * #6 ; % ( - 257 ) * 5000 0000 / (#2#3 + 1) + 10 0000 0000 ; {#2}{#3}{#4}{#5}{#6} {#7}{#8}#9 } \cs_new:Npn \__fp_sqrt_auxiii_o:wnnnnnnnn #1; #2#3#4#5#6#7#8#9 { \if_int_compare:w #1 > 1 \exp_stop_f: \exp_after:wN \__fp_sqrt_auxiv_o:NNNNNw \__int_value:w \__int_eval:w (#1#2 %) \else: \if_int_compare:w #1#2 > 1 \exp_stop_f: \exp_after:wN \__fp_sqrt_auxv_o:NNNNNw \__int_value:w \__int_eval:w (#1#2#3 %) \else: \if_int_compare:w #1#2#3 > 1 \exp_stop_f: \exp_after:wN \__fp_sqrt_auxvi_o:NNNNNw \__int_value:w \__int_eval:w (#1#2#3#4 %) \else: \exp_after:wN \__fp_sqrt_auxvii_o:NNNNNw \__int_value:w \__int_eval:w (#1#2#3#4#5 %) \fi: \fi: \fi: } \cs_new:Npn \__fp_sqrt_auxiv_o:NNNNNw 1#1#2#3#4#5#6; { \__fp_sqrt_auxviii_o:nnnnnnn {#1#2#3#4#5#6} {00000000} } \cs_new:Npn \__fp_sqrt_auxv_o:NNNNNw 1#1#2#3#4#5#6; { \__fp_sqrt_auxviii_o:nnnnnnn {000#1#2#3#4#5} {#60000} } \cs_new:Npn \__fp_sqrt_auxvi_o:NNNNNw 1#1#2#3#4#5#6; { \__fp_sqrt_auxviii_o:nnnnnnn {0000000#1} {#2#3#4#5#6} } \cs_new:Npn \__fp_sqrt_auxvii_o:NNNNNw 1#1#2#3#4#5#6; { \if_int_compare:w #1#2 = 0 \exp_stop_f: \exp_after:wN \__fp_sqrt_auxx_o:Nnnnnnnn \fi: \__fp_sqrt_auxviii_o:nnnnnnn {00000000} {000#1#2#3#4#5} } \cs_new:Npn \__fp_sqrt_auxviii_o:nnnnnnn #1#2 #3#4#5#6#7 { \exp_after:wN \__fp_sqrt_auxix_o:wnwnw \__int_value:w \__int_eval:w #3 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w #1 + 1#4#5 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w #2 + 1#6#7 ; } \cs_new:Npn \__fp_sqrt_auxix_o:wnwnw #1; #2#3; #4#5; { \__fp_sqrt_auxii_o:NnnnnnnnN \__fp_sqrt_auxiii_o:wnnnnnnnn {#1}{#2}{#3}{#4}{#5} } \cs_new:Npn \__fp_sqrt_auxx_o:Nnnnnnnn #1#2#3 #4#5#6#7#8 { \exp_after:wN \__fp_sqrt_auxxi_o:wwnnN \__int_value:w \__int_eval:w (#8 + 2499) / 5000 * 5000 ; {#4} {#5} {#6} {#7} ; } \cs_new:Npn \__fp_sqrt_auxxi_o:wwnnN #1; #2; #3#4#5 { \__fp_sqrt_auxii_o:NnnnnnnnN \__fp_sqrt_auxxii_o:nnnnnnnnw #2 {#1} {#3} { #4 + 1 } #5 } \cs_new:Npn \__fp_sqrt_auxxii_o:nnnnnnnnw 0; #1#2#3#4#5#6#7#8 #9; { \if_int_compare:w #1#2 > 0 \exp_stop_f: \if_int_compare:w #1#2 = 1 \exp_stop_f: \if_int_compare:w #3#4 = 0 \exp_stop_f: \if_int_compare:w #5#6 = 0 \exp_stop_f: \if_int_compare:w #7#8 = 0 \exp_stop_f: \__fp_sqrt_auxxiii_o:w \fi: \fi: \fi: \fi: \exp_after:wN \__fp_sqrt_auxxiv_o:wnnnnnnnN \__int_value:w 9998 \else: \exp_after:wN \__fp_sqrt_auxxiv_o:wnnnnnnnN \__int_value:w 10000 \fi: ; } \cs_new:Npn \__fp_sqrt_auxxiii_o:w \fi: \fi: \fi: \fi: #1 \fi: ; { \fi: \fi: \fi: \fi: \fi: \__fp_sqrt_auxxiv_o:wnnnnnnnN 9999 ; } \cs_new:Npn \__fp_sqrt_auxxiv_o:wnnnnnnnN #1; #2#3#4#5#6 #7#8#9 { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1 0000 0000 + #2#3 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1 0000 0000 + #4#5 \if_int_compare:w #6 > #1 \exp_stop_f: + 1 \fi: + \exp_after:wN \__fp_round:NNN \exp_after:wN 0 \exp_after:wN 0 \__int_value:w \exp_after:wN \use_i:nn \exp_after:wN \__fp_round_digit:Nw \__int_value:w \__int_eval:w #6 + 19999 - #1 ; \exp_after:wN ; } \cs_new:Npn \__fp_sign_o:w ? \s__fp \__fp_chk:w #1#2; @ { \if_case:w #1 \exp_stop_f: \__fp_case_return_same_o:w \or: \exp_after:wN \__fp_sign_aux_o:w \or: \exp_after:wN \__fp_sign_aux_o:w \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #1 #2; } \cs_new:Npn \__fp_sign_aux_o:w \s__fp \__fp_chk:w #1 #2 #3 ; { \exp_after:wN \__fp_set_sign_o:w \exp_after:wN #2 \c_one_fp @ } \cs_new:Npn \__fp_set_sign_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \exp_after:wN \__fp_exp_after_o:w \exp_after:wN \s__fp \exp_after:wN \__fp_chk:w \exp_after:wN #2 \__int_value:w \if_case:w #3 \exp_stop_f: #1 \or: 1 \or: 0 \fi: \exp_stop_f: #4; } %% File: l3fp-extended.dtx Copyright (C) 2011-2017 The LaTeX3 Project \tl_const:Nn \c__fp_one_fixed_tl { {10000} {0000} {0000} {0000} {0000} {0000} ; } \cs_new:Npn \__fp_fixed_continue:wn #1; #2 { #2 #1; } \cs_new:Npn \__fp_fixed_add_one:wN #1#2; #3 { \exp_after:wN #3 \exp_after:wN { \__int_value:w \__int_eval:w \c__fp_myriad_int + #1 } #2 ; } \cs_new:Npn \__fp_fixed_div_myriad:wn #1#2#3#4#5#6; { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_leading_shift_int \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_trailing_shift_int + #1 ; {#2}{#3}{#4}{#5}; } \cs_new:Npn \__fp_fixed_mul_after:wwn #1; #2; #3 { #3 {#1} #2; } \cs_new:Npn \__fp_fixed_mul_short:wwn #1#2#3#4#5#6; #7#8#9; { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_leading_shift_int + #1*#7 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#8 + #2*#7 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#9 + #2*#8 + #3*#7 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #2*#9 + #3*#8 + #4*#7 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #3*#9 + #4*#8 + #5*#7 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_trailing_shift_int + #4*#9 + #5*#8 + #6*#7 + ( #5*#9 + #6*#8 + #6*#9 / \c__fp_myriad_int ) / \c__fp_myriad_int ; ; } \cs_new:Npn \__fp_fixed_div_int:wwN #1#2#3#4#5#6 ; #7 ; #8 { \exp_after:wN \__fp_fixed_div_int_after:Nw \exp_after:wN #8 \__int_value:w \__int_eval:w - 1 \__fp_fixed_div_int:wnN #1; {#7} \__fp_fixed_div_int_auxi:wnn #2; {#7} \__fp_fixed_div_int_auxi:wnn #3; {#7} \__fp_fixed_div_int_auxi:wnn #4; {#7} \__fp_fixed_div_int_auxi:wnn #5; {#7} \__fp_fixed_div_int_auxi:wnn #6; {#7} \__fp_fixed_div_int_auxii:wnn ; } \cs_new:Npn \__fp_fixed_div_int:wnN #1; #2 #3 { \exp_after:wN #3 \__int_value:w \__int_eval:w #1 / #2 - 1 ; {#2} {#1} } \cs_new:Npn \__fp_fixed_div_int_auxi:wnn #1; #2 #3 { + #1 \exp_after:wN \__fp_fixed_div_int_pack:Nw \__int_value:w \__int_eval:w 9999 \exp_after:wN \__fp_fixed_div_int:wnN \__int_value:w \__int_eval:w #3 - #1*#2 \__int_eval_end: } \cs_new:Npn \__fp_fixed_div_int_auxii:wnn #1; #2 #3 { + #1 + 2 ; } \cs_new:Npn \__fp_fixed_div_int_pack:Nw #1 #2; { + #1; {#2} } \cs_new:Npn \__fp_fixed_div_int_after:Nw #1 #2; { #1 {#2} } \cs_new:Npn \__fp_fixed_add:wwn { \__fp_fixed_add:Nnnnnwnn + } \cs_new:Npn \__fp_fixed_sub:wwn { \__fp_fixed_add:Nnnnnwnn - } \cs_new:Npn \__fp_fixed_add:Nnnnnwnn #1 #2#3#4#5 #6; #7#8 { \exp_after:wN \__fp_fixed_add_after:NNNNNwn \__int_value:w \__int_eval:w 9 9999 9998 + #2#3 #1 #7#8 \exp_after:wN \__fp_fixed_add_pack:NNNNNwn \__int_value:w \__int_eval:w 1 9999 9998 + #4#5 \__fp_fixed_add:nnNnnnwn #6 #1 } \cs_new:Npn \__fp_fixed_add:nnNnnnwn #1#2 #3 #4#5 #6#7 ; #8 { #3 #4#5 \exp_after:wN \__fp_fixed_add_pack:NNNNNwn \__int_value:w \__int_eval:w 2 0000 0000 #3 #6#7 + #1#2 ; {#8} ; } \cs_new:Npn \__fp_fixed_add_pack:NNNNNwn #1 #2#3#4#5 #6; #7 { + #1 ; {#7} {#2#3#4#5} {#6} } \cs_new:Npn \__fp_fixed_add_after:NNNNNwn 1 #1 #2#3#4#5 #6; #7 { #7 {#1#2#3#4#5} {#6} } \cs_new:Npn \__fp_fixed_mul:wwn #1#2#3#4 #5; #6#7#8#9 { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_leading_shift_int \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#6 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#7 + #2*#6 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#8 + #2*#7 + #3*#6 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #1*#9 + #2*#8 + #3*#7 + #4*#6 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_trailing_shift_int + #2*#9 + #3*#8 + #4*#7 + ( #3*#9 + #4*#8 + \__fp_fixed_mul:nnnnnnnw #5 {#6}{#7} {#1}{#2} } \cs_new:Npn \__fp_fixed_mul:nnnnnnnw #1#2 #3#4 #5#6 #7#8 ; { #1*#4 + #2*#3 + #5*#8 + #6*#7 ) / \c__fp_myriad_int + #1*#3 + #5*#7 ; ; } \cs_new:Npn \__fp_fixed_mul_add:wwwn #1; #2; #3#4#5#6#7#8; { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #3 #4 \__fp_fixed_mul_add:Nwnnnwnnn + + #5 #6 ; #2 ; #1 ; #2 ; + + #7 #8 ; ; } \cs_new:Npn \__fp_fixed_mul_sub_back:wwwn #1; #2; #3#4#5#6#7#8; { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + #3 #4 \__fp_fixed_mul_add:Nwnnnwnnn - + #5 #6 ; #2 ; #1 ; #2 ; - + #7 #8 ; ; } \cs_new:Npn \__fp_fixed_one_minus_mul:wwn #1; #2; { \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_big_leading_shift_int \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int + 1 0000 0000 \__fp_fixed_mul_add:Nwnnnwnnn - ; #2 ; #1 ; #2 ; - ; ; } \cs_new:Npn \__fp_fixed_mul_add:Nwnnnwnnn #1 #2; #3#4#5#6; #7#8#9 { #1 #7*#3 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int #1 #7*#4 #1 #8*#3 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int #1 #7*#5 #1 #8*#4 #1 #9*#3 #2 \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_middle_shift_int #1 \__fp_fixed_mul_add:nnnnwnnnn {#7}{#8}{#9} } \cs_new:Npn \__fp_fixed_mul_add:nnnnwnnnn #1#2#3#4#5; #6#7#8#9 { ( #1*#9 + #2*#8 + #3*#7 + #4*#6 ) \exp_after:wN \__fp_pack_big:NNNNNNw \__int_value:w \__int_eval:w \c__fp_big_trailing_shift_int \__fp_fixed_mul_add:nnnnwnnwN { #6 + #4*#7 + #3*#8 + #2*#9 + #1 } { #7 + #4*#8 + #3*#9 + #2 } {#1} #5; {#6} } \cs_new:Npn \__fp_fixed_mul_add:nnnnwnnwN #1#2 #3#4#5; #6#7#8; #9 { #9 (#4* #1 *#7) #9 (#5*#6+#4* #2 *#7+#3*#8) / \c__fp_myriad_int } \cs_new:Npn \__fp_ep_to_fixed:wwn #1,#2 { \exp_after:wN \__fp_ep_to_fixed_auxi:www \__int_value:w \__int_eval:w 1 0000 0000 + #2 \exp_after:wN ; \exp:w \exp_end_continue_f:w \prg_replicate:nn { 4 - \int_max:nn {#1} { -32 } } { 0 } ; } \cs_new:Npn \__fp_ep_to_fixed_auxi:www 1#1; #2; #3#4#5#6#7; { \__fp_pack_eight:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_ep_to_fixed_auxii:nnnnnnnwn ; #2 #1#3#4#5#6#7 0000 ! } \cs_new:Npn \__fp_ep_to_fixed_auxii:nnnnnnnwn #1#2#3#4#5#6#7; #8! #9 { #9 {#1#2}{#3}{#4}{#5}{#6}{#7}; } \cs_new:Npn \__fp_ep_to_ep:wwN #1,#2#3#4#5#6#7; #8 { \exp_after:wN #8 \__int_value:w \__int_eval:w #1 + 4 \exp_after:wN \use_i:nn \exp_after:wN \__fp_ep_to_ep_loop:N \__int_value:w \__int_eval:w 1 0000 0000 + #2 \__int_eval_end: #3#4#5#6#7 ; ; ! } \cs_new:Npn \__fp_ep_to_ep_loop:N #1 { \if_meaning:w 0 #1 - 1 \else: \__fp_ep_to_ep_end:www #1 \fi: \__fp_ep_to_ep_loop:N } \cs_new:Npn \__fp_ep_to_ep_end:www #1 \fi: \__fp_ep_to_ep_loop:N #2; #3! { \fi: \if_meaning:w ; #1 - 2 * \c__fp_max_exponent_int \__fp_ep_to_ep_zero:ww \fi: \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_use_i:ww , ; #1 #2 0000 0000 0000 0000 0000 0000 ; } \cs_new:Npn \__fp_ep_to_ep_zero:ww \fi: #1; #2; #3; { \fi: , {1000}{0000}{0000}{0000}{0000}{0000} ; } \cs_new:Npn \__fp_ep_compare:wwww #1,#2#3#4#5#6#7; { \__fp_ep_compare_aux:wwww {#1}{#2}{#3}{#4}{#5}; #6#7; } \cs_new:Npn \__fp_ep_compare_aux:wwww #1;#2;#3,#4#5#6#7#8#9; { \if_case:w \__fp_compare_npos:nwnw #1; {#3}{#4}{#5}{#6}{#7}; \exp_stop_f: \if_int_compare:w #2 = #8#9 \exp_stop_f: 0 \else: \if_int_compare:w #2 < #8#9 - \fi: 1 \fi: \or: 1 \else: -1 \fi: } \cs_new:Npn \__fp_ep_mul:wwwwn #1,#2; #3,#4; { \__fp_ep_to_ep:wwN #3,#4; \__fp_fixed_continue:wn { \__fp_ep_to_ep:wwN #1,#2; \__fp_ep_mul_raw:wwwwN } \__fp_fixed_continue:wn } \cs_new:Npn \__fp_ep_mul_raw:wwwwN #1,#2; #3,#4; #5 { \__fp_fixed_mul:wwn #2; #4; { \exp_after:wN #5 \__int_value:w \__int_eval:w #1 + #3 , } } \cs_new:Npn \__fp_ep_div:wwwwn #1,#2; #3,#4; { \__fp_ep_to_ep:wwN #1,#2; \__fp_fixed_continue:wn { \__fp_ep_to_ep:wwN #3,#4; \__fp_ep_div_esti:wwwwn } } \cs_new:Npn \__fp_ep_div_esti:wwwwn #1,#2#3; #4, { \exp_after:wN \__fp_ep_div_estii:wwnnwwn \__int_value:w \__int_eval:w 10 0000 0000 / ( #2 + 1 ) \exp_after:wN ; \__int_value:w \__int_eval:w #4 - #1 + 1 , {#2} #3; } \cs_new:Npn \__fp_ep_div_estii:wwnnwwn #1; #2,#3#4#5; #6; #7 { \exp_after:wN \__fp_ep_div_estiii:NNNNNwwwn \__int_value:w \__int_eval:w 10 0000 0000 - 1750 + #1 000 + (10 0000 0000 / #3 - #1) * (1000 - #4 / 10) ; {#3}{#4}#5; #6; { #7 #2, } } \cs_new:Npn \__fp_ep_div_estiii:NNNNNwwwn 1#1#2#3#4#5#6; #7; { \__fp_fixed_mul_short:wwn #7; {#1}{#2#3#4#5}{#6}; \__fp_ep_div_epsi:wnNNNNNn {#1#2#3#4}#5#6 \__fp_fixed_mul:wwn } \cs_new:Npn \__fp_ep_div_epsi:wnNNNNNn #1#2#3#4#5#6; { \exp_after:wN \__fp_ep_div_epsii:wwnNNNNNn \__int_value:w \__int_eval:w 1 9998 - #2 \exp_after:wN \__fp_ep_div_eps_pack:NNNNNw \__int_value:w \__int_eval:w 1 9999 9998 - #3#4 \exp_after:wN \__fp_ep_div_eps_pack:NNNNNw \__int_value:w \__int_eval:w 2 0000 0000 - #5#6 ; ; } \cs_new:Npn \__fp_ep_div_eps_pack:NNNNNw #1#2#3#4#5#6; { + #1 ; {#2#3#4#5} {#6} } \cs_new:Npn \__fp_ep_div_epsii:wwnNNNNNn 1#1; #2; #3#4#5#6#7#8 { \__fp_fixed_mul:wwn {0000}{#1}#2; {0000}{#1}#2; \__fp_fixed_add_one:wN \__fp_fixed_mul:wwn {10000} {#1} #2 ; { \__fp_fixed_mul_short:wwn {0000}{#1}#2; {#3}{#4#5#6#7}{#8000}; \__fp_fixed_div_myriad:wn \__fp_fixed_mul:wwn } \__fp_fixed_add:wwn {#3}{#4#5#6#7}{#8000}{0000}{0000}{0000}; } \cs_new:Npn \__fp_ep_isqrt:wwn #1,#2; { \__fp_ep_to_ep:wwN #1,#2; \__fp_ep_isqrt_auxi:wwn } \cs_new:Npn \__fp_ep_isqrt_auxi:wwn #1, { \exp_after:wN \__fp_ep_isqrt_auxii:wwnnnwn \__int_value:w \__int_eval:w \int_if_odd:nTF {#1} { (1 - #1) / 2 , 535 , { 0 } { } } { 1 - #1 / 2 , 168 , { } { 0 } } } \cs_new:Npn \__fp_ep_isqrt_auxii:wwnnnwn #1, #2, #3#4 #5#6; #7 { \__fp_ep_isqrt_esti:wwwnnwn #2, 0, #5, {#3} {#4} {#5} #6 ; { #7 #1 , } } \cs_new:Npn \__fp_ep_isqrt_esti:wwwnnwn #1, #2, #3, #4 { \if_int_compare:w #1 = #2 \exp_stop_f: \exp_after:wN \__fp_ep_isqrt_estii:wwwnnwn \fi: \exp_after:wN \__fp_ep_isqrt_esti:wwwnnwn \__int_value:w \__int_eval:w (#1 + 1 0050 0000 #4 / (#1 * #3)) / 2 , #1, #3, {#4} } \cs_new:Npn \__fp_ep_isqrt_estii:wwwnnwn #1, #2, #3, #4#5 { \exp_after:wN \__fp_ep_isqrt_estiii:NNNNNwwwn \__int_value:w \__int_eval:w 1000 0000 + #2 * #2 #5 * 5 \exp_after:wN , \__int_value:w \__int_eval:w 10000 + #2 ; } \cs_new:Npn \__fp_ep_isqrt_estiii:NNNNNwwwn 1#1#2#3#4#5#6, 1#7#8; #9; { \__fp_fixed_mul_short:wwn #9; {#1} {#2#3#4#5} {#600} ; \__fp_ep_isqrt_epsi:wN \__fp_fixed_mul_short:wwn {#7} {#80} {0000} ; } \cs_new:Npn \__fp_ep_isqrt_epsi:wN #1; { \__fp_fixed_sub:wwn {15000}{0000}{0000}{0000}{0000}{0000}; #1; \__fp_ep_isqrt_epsii:wwN #1; \__fp_ep_isqrt_epsii:wwN #1; \__fp_ep_isqrt_epsii:wwN #1; } \cs_new:Npn \__fp_ep_isqrt_epsii:wwN #1; #2; { \__fp_fixed_mul:wwn #1; #1; \__fp_fixed_mul_sub_back:wwwn #2; {15000}{0000}{0000}{0000}{0000}{0000}; \__fp_fixed_mul:wwn #1; } \cs_new:Npn \__fp_ep_to_float_o:wwN #1, { + \__int_eval:w #1 \__fp_fixed_to_float_o:wN } \cs_new:Npn \__fp_ep_inv_to_float_o:wwN #1,#2; { \__fp_ep_div:wwwwn 1,{1000}{0000}{0000}{0000}{0000}{0000}; #1,#2; \__fp_ep_to_float_o:wwN } \cs_new:Npn \__fp_fixed_inv_to_float_o:wN { \__fp_ep_inv_to_float_o:wwN 0, } \cs_new:Npn \__fp_fixed_to_float_rad_o:wN #1; { \__fp_fixed_mul:wwn #1; {5729}{5779}{5130}{8232}{0876}{7981}; { \__fp_ep_to_float_o:wwN 2, } } \cs_new:Npn \__fp_fixed_to_float_o:Nw #1#2; { \__fp_fixed_to_float_o:wN #2; #1 } \cs_new:Npn \__fp_fixed_to_float_o:wN #1#2#3#4#5#6; #7 { + \__int_eval:w \c__fp_block_int % for the 8-digit-at-the-start thing. \exp_after:wN \exp_after:wN \exp_after:wN \__fp_fixed_to_loop:N \exp_after:wN \use_none:n \__int_value:w \__int_eval:w 1 0000 0000 + #1 \exp_after:wN \__fp_use_none_stop_f:n \__int_value:w 1#2 \exp_after:wN \__fp_use_none_stop_f:n \__int_value:w 1#3#4 \exp_after:wN \__fp_use_none_stop_f:n \__int_value:w 1#5#6 \exp_after:wN ; \exp_after:wN ; } \cs_new:Npn \__fp_fixed_to_loop:N #1 { \if_meaning:w 0 #1 - 1 \exp_after:wN \__fp_fixed_to_loop:N \else: \exp_after:wN \__fp_fixed_to_loop_end:w \exp_after:wN #1 \fi: } \cs_new:Npn \__fp_fixed_to_loop_end:w #1 #2 ; { \if_meaning:w ; #1 \exp_after:wN \__fp_fixed_to_float_zero:w \else: \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_fixed_to_float_pack:ww \exp_after:wN ; \fi: #1 #2 0000 0000 0000 0000 ; } \cs_new:Npn \__fp_fixed_to_float_zero:w ; 0000 0000 0000 0000 ; { - 2 * \c__fp_max_exponent_int ; {0000} {0000} {0000} {0000} ; } \cs_new:Npn \__fp_fixed_to_float_pack:ww #1 ; #2#3 ; ; { \if_int_compare:w #2 > 4 \exp_stop_f: \exp_after:wN \__fp_fixed_to_float_round_up:wnnnnw \fi: ; #1 ; } \cs_new:Npn \__fp_fixed_to_float_round_up:wnnnnw ; #1#2#3#4 ; { \exp_after:wN \__fp_basics_pack_high:NNNNNw \__int_value:w \__int_eval:w 1 #1#2 \exp_after:wN \__fp_basics_pack_low:NNNNNw \__int_value:w \__int_eval:w 1 #3#4 + 1 ; } %% File: l3fp-expo.dtx Copyright (C) 2011-2017 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_exp:N { \__fp_parse_unary_function:NNN \__fp_exp_o:w ? } \cs_new:Npn \__fp_parse_word_ln:N { \__fp_parse_unary_function:NNN \__fp_ln_o:w ? } \tl_const:Nn \c__fp_ln_i_fixed_tl { {0000}{0000}{0000}{0000}{0000}{0000};} \tl_const:Nn \c__fp_ln_ii_fixed_tl { {6931}{4718}{0559}{9453}{0941}{7232};} \tl_const:Nn \c__fp_ln_iii_fixed_tl {{10986}{1228}{8668}{1096}{9139}{5245};} \tl_const:Nn \c__fp_ln_iv_fixed_tl {{13862}{9436}{1119}{8906}{1883}{4464};} \tl_const:Nn \c__fp_ln_vi_fixed_tl {{17917}{5946}{9228}{0550}{0081}{2477};} \tl_const:Nn \c__fp_ln_vii_fixed_tl {{19459}{1014}{9055}{3133}{0510}{5353};} \tl_const:Nn \c__fp_ln_viii_fixed_tl{{20794}{4154}{1679}{8359}{2825}{1696};} \tl_const:Nn \c__fp_ln_ix_fixed_tl {{21972}{2457}{7336}{2193}{8279}{0490};} \tl_const:Nn \c__fp_ln_x_fixed_tl {{23025}{8509}{2994}{0456}{8401}{7991};} \cs_new:Npn \__fp_ln_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_meaning:w 2 #3 \__fp_case_use:nw { \__fp_invalid_operation_o:nw { ln } } \fi: \if_case:w #2 \exp_stop_f: \__fp_case_use:nw { \__fp_division_by_zero_o:Nnw \c_minus_inf_fp { ln } } \or: \else: \__fp_case_return_same_o:w \fi: \__fp_ln_npos_o:w \s__fp \__fp_chk:w #2#3#4; } \cs_new:Npn \__fp_ln_npos_o:w \s__fp \__fp_chk:w 10#1#2#3; { %^^A todo: ln(1) should be "exact zero", not "underflow" \exp_after:wN \__fp_sanitize:Nw \__int_value:w % for the overall sign \if_int_compare:w #1 < 1 \exp_stop_f: 2 \else: 0 \fi: \exp_after:wN \exp_stop_f: \__int_value:w \__int_eval:w % for the exponent \__fp_ln_significand:NNNNnnnN #2#3 \__fp_ln_exponent:wn {#1} } \cs_new:Npn \__fp_ln_significand:NNNNnnnN #1#2#3#4 { \exp_after:wN \__fp_ln_x_ii:wnnnn \__int_value:w \if_case:w #1 \exp_stop_f: \or: \if_int_compare:w #2 < 4 \exp_stop_f: \__int_eval:w 10 - #2 \else: 6 \fi: \or: 4 \or: 3 \or: 2 \or: 2 \or: 2 \else: 1 \fi: ; { #1 #2 #3 #4 } } \cs_new:Npn \__fp_ln_x_ii:wnnnn #1; #2#3#4#5 { \exp_after:wN \__fp_ln_div_after:Nw \cs:w c__fp_ln_ \__int_to_roman:w #1 _fixed_tl \exp_after:wN \cs_end: \__int_value:w \exp_after:wN \__fp_ln_x_iv:wnnnnnnnn \__int_value:w \__int_eval:w \exp_after:wN \__fp_ln_x_iii_var:NNNNNw \__int_value:w \__int_eval:w 9999 9990 + #1*#2#3 + \exp_after:wN \__fp_ln_x_iii:NNNNNNw \__int_value:w \__int_eval:w 10 0000 0000 + #1*#4#5 ; {20000} {0000} {0000} {0000} } %^^A todo: reoptimize (a generalization attempt failed). \cs_new:Npn \__fp_ln_x_iii:NNNNNNw #1#2 #3#4#5#6 #7; { #1#2; {#3#4#5#6} {#7} } \cs_new:Npn \__fp_ln_x_iii_var:NNNNNw #1 #2#3#4#5 #6; { #1#2#3#4#5 + 1 ; {#1#2#3#4#5} {#6} } \cs_new:Npn \__fp_ln_x_iv:wnnnnnnnn #1; #2#3#4#5 #6#7#8#9 { \exp_after:wN \__fp_div_significand_pack:NNN \__int_value:w \__int_eval:w \__fp_ln_div_i:w #1 ; #6 #7 ; {#8} {#9} {#2} {#3} {#4} {#5} { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_ln_div_ii:wwn \__int_value:w #1 } { \exp_after:wN \__fp_ln_div_vi:wwn \__int_value:w #1 } } \cs_new:Npn \__fp_ln_div_i:w #1; { \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn \__int_value:w \__int_eval:w 999999 + 2 0000 0000 / #1 ; % Q1 } \cs_new:Npn \__fp_ln_div_ii:wwn #1; #2;#3 % y; B1;B2 <- for k=1 { \exp_after:wN \__fp_div_significand_pack:NNN \__int_value:w \__int_eval:w \exp_after:wN \__fp_div_significand_calc:wwnnnnnnn \__int_value:w \__int_eval:w 999999 + #2 #3 / #1 ; % Q2 #2 #3 ; } \cs_new:Npn \__fp_ln_div_vi:wwn #1; #2;#3#4#5 #6#7#8#9 %y;F1;F2F3F4x1x2x3x4 { \exp_after:wN \__fp_div_significand_pack:NNN \__int_value:w \__int_eval:w 1000000 + #2 #3 / #1 ; % Q6 } \cs_new:Npn \__fp_ln_div_after:Nw #1#2; { \if_meaning:w 0 #2 \exp_after:wN \__fp_ln_t_small:Nw \else: \exp_after:wN \__fp_ln_t_large:NNw \exp_after:wN - \fi: #1 } \cs_new:Npn \__fp_ln_t_small:Nw #1 #2; #3; #4; #5; #6; #7; { \exp_after:wN \__fp_ln_t_large:NNw \exp_after:wN + % \exp_after:wN #1 \__int_value:w \__int_eval:w 9999 - #2 \exp_after:wN ; \__int_value:w \__int_eval:w 9999 - #3 \exp_after:wN ; \__int_value:w \__int_eval:w 9999 - #4 \exp_after:wN ; \__int_value:w \__int_eval:w 9999 - #5 \exp_after:wN ; \__int_value:w \__int_eval:w 9999 - #6 \exp_after:wN ; \__int_value:w \__int_eval:w 1 0000 - #7 ; } \cs_new:Npn \__fp_ln_t_large:NNw #1 #2 #3; #4; #5; #6; #7; #8; { \exp_after:wN \__fp_ln_square_t_after:w \__int_value:w \__int_eval:w 9999 0000 + #3*#3 \exp_after:wN \__fp_ln_square_t_pack:NNNNNw \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#4 \exp_after:wN \__fp_ln_square_t_pack:NNNNNw \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#5 + #4*#4 \exp_after:wN \__fp_ln_square_t_pack:NNNNNw \__int_value:w \__int_eval:w 9999 0000 + 2*#3*#6 + 2*#4*#5 \exp_after:wN \__fp_ln_square_t_pack:NNNNNw \__int_value:w \__int_eval:w 1 0000 0000 + 2*#3*#7 + 2*#4*#6 + #5*#5 + (2*#3*#8 + 2*#4*#7 + 2*#5*#6) / 1 0000 % ; ; ; \exp_after:wN \__fp_ln_twice_t_after:w \__int_value:w \__int_eval:w -1 + 2*#3 \exp_after:wN \__fp_ln_twice_t_pack:Nw \__int_value:w \__int_eval:w 9999 + 2*#4 \exp_after:wN \__fp_ln_twice_t_pack:Nw \__int_value:w \__int_eval:w 9999 + 2*#5 \exp_after:wN \__fp_ln_twice_t_pack:Nw \__int_value:w \__int_eval:w 9999 + 2*#6 \exp_after:wN \__fp_ln_twice_t_pack:Nw \__int_value:w \__int_eval:w 9999 + 2*#7 \exp_after:wN \__fp_ln_twice_t_pack:Nw \__int_value:w \__int_eval:w 10000 + 2*#8 ; ; { \__fp_ln_c:NwNw #1 } #2 } \cs_new:Npn \__fp_ln_twice_t_pack:Nw #1 #2; { + #1 ; {#2} } \cs_new:Npn \__fp_ln_twice_t_after:w #1; { ;;; {#1} } \cs_new:Npn \__fp_ln_square_t_pack:NNNNNw #1 #2#3#4#5 #6; { + #1#2#3#4#5 ; {#6} } \cs_new:Npn \__fp_ln_square_t_after:w 1 0 #1#2#3 #4; { \__fp_ln_Taylor:wwNw {0#1#2#3} {#4} } \cs_new:Npn \__fp_ln_Taylor:wwNw { \__fp_ln_Taylor_loop:www 21 ; {0000}{0000}{0000}{0000}{0000}{0000} ; } \cs_new:Npn \__fp_ln_Taylor_loop:www #1; #2; #3; { \if_int_compare:w #1 = 1 \exp_stop_f: \__fp_ln_Taylor_break:w \fi: \exp_after:wN \__fp_fixed_div_int:wwN \c__fp_one_fixed_tl #1; \__fp_fixed_add:wwn #2; \__fp_fixed_mul:wwn #3; { \exp_after:wN \__fp_ln_Taylor_loop:www \__int_value:w \__int_eval:w #1 - 2 ; } #3; } \cs_new:Npn \__fp_ln_Taylor_break:w \fi: #1 \__fp_fixed_add:wwn #2#3; #4 ;; { \fi: \exp_after:wN \__fp_fixed_mul:wwn \exp_after:wN { \__int_value:w \__int_eval:w 10000 + #2 } #3; } \cs_new:Npn \__fp_ln_c:NwNw #1 #2; #3 { \if_meaning:w + #1 \exp_after:wN \exp_after:wN \exp_after:wN \__fp_fixed_sub:wwn \else: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_fixed_add:wwn \fi: #3 #2 ; } \cs_new:Npn \__fp_ln_exponent:wn #1; #2 { \if_case:w #2 \exp_stop_f: 0 \__fp_case_return:nw { \__fp_fixed_to_float_o:Nw 2 } \or: \exp_after:wN \__fp_ln_exponent_one:ww \__int_value:w \else: \if_int_compare:w #2 > 0 \exp_stop_f: \exp_after:wN \__fp_ln_exponent_small:NNww \exp_after:wN 0 \exp_after:wN \__fp_fixed_sub:wwn \__int_value:w \else: \exp_after:wN \__fp_ln_exponent_small:NNww \exp_after:wN 2 \exp_after:wN \__fp_fixed_add:wwn \__int_value:w - \fi: \fi: #2; #1; } \cs_new:Npn \__fp_ln_exponent_one:ww 1; #1; { 0 \exp_after:wN \__fp_fixed_sub:wwn \c__fp_ln_x_fixed_tl #1; \__fp_fixed_to_float_o:wN 0 } \cs_new:Npn \__fp_ln_exponent_small:NNww #1#2#3; #4#5#6#7#8#9; { 4 \exp_after:wN \__fp_fixed_mul:wwn \c__fp_ln_x_fixed_tl {#3}{0000}{0000}{0000}{0000}{0000} ; #2 {0000}{#4}{#5}{#6}{#7}{#8}; \__fp_fixed_to_float_o:wN #1 } \cs_new:Npn \__fp_exp_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_o:Nw \c_one_fp \or: \exp_after:wN \__fp_exp_normal_o:w \or: \if_meaning:w 0 #3 \exp_after:wN \__fp_case_return_o:Nw \exp_after:wN \c_inf_fp \else: \exp_after:wN \__fp_case_return_o:Nw \exp_after:wN \c_zero_fp \fi: \or: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2#3#4; } \cs_new:Npn \__fp_exp_normal_o:w \s__fp \__fp_chk:w 1#1 { \if_meaning:w 0 #1 \__fp_exp_pos_o:NNwnw + \__fp_fixed_to_float_o:wN \else: \__fp_exp_pos_o:NNwnw - \__fp_fixed_inv_to_float_o:wN \fi: } \cs_new:Npn \__fp_exp_pos_o:NNwnw #1#2#3 \fi: #4#5; { \fi: \if_int_compare:w #4 > \c__fp_max_exp_exponent_int \token_if_eq_charcode:NNTF + #1 { \__fp_exp_overflow:NN \__fp_overflow:w \c_inf_fp } { \__fp_exp_overflow:NN \__fp_underflow:w \c_zero_fp } \exp:w \else: \exp_after:wN \__fp_sanitize:Nw \exp_after:wN 0 \__int_value:w #1 \__int_eval:w \if_int_compare:w #4 < 0 \exp_stop_f: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { 0 \__fp_decimate:nNnnnn { - #4 } \__fp_exp_Taylor:Nnnwn } { \__fp_decimate:nNnnnn { \c__fp_prec_int - #4 } \__fp_exp_pos_large:NnnNwn } #5 {#4} #1 #2 0 \exp:w \fi: \exp_after:wN \exp_end: } \cs_new:Npn \__fp_exp_overflow:NN #1#2 { \exp_after:wN \exp_after:wN \exp_after:wN #1 \exp_after:wN #2 } \cs_new:Npn \__fp_exp_Taylor:Nnnwn #1#2#3 #4; #5 #6 { #6 \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_pack_twice_four:wNNNNNNNN \__fp_exp_Taylor_ii:ww ; #2#3#4 0000 0000 ; } \cs_new:Npn \__fp_exp_Taylor_ii:ww #1; #2; { \__fp_exp_Taylor_loop:www 10 ; #1 ; #1 ; \s__stop } \cs_new:Npn \__fp_exp_Taylor_loop:www #1; #2; #3; { \if_int_compare:w #1 = 1 \exp_stop_f: \exp_after:wN \__fp_exp_Taylor_break:Nww \fi: \__fp_fixed_div_int:wwN #3 ; #1 ; \__fp_fixed_add_one:wN \__fp_fixed_mul:wwn #2 ; { \exp_after:wN \__fp_exp_Taylor_loop:www \__int_value:w \__int_eval:w #1 - 1 ; #2 ; } } \cs_new:Npn \__fp_exp_Taylor_break:Nww #1 #2; #3 \s__stop { \__fp_fixed_add_one:wN #2 ; } \cs_new:Npn \__fp_exp_pos_large:NnnNwn #1#2#3 #4#5; #6 { \exp_after:wN \exp_after:wN \cs:w __fp_exp_large_ \__int_to_roman:w #6 :wN \exp_after:wN \cs_end: \exp_after:wN \c__fp_one_fixed_tl \__int_value:w #3 #4 \exp_stop_f: #5 00000 ; } \cs_new:Npn \__fp_exp_large:w #1 \or: #2 \fi: { \fi: \__fp_fixed_mul:wwn #1; } \cs_new:Npn \__fp_exp_large_v:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 4343 \__fp_exp_large:w {8806}{8182}{2566}{2921}{5872}{6150} \or: + 8686 \__fp_exp_large:w {7756}{0047}{2598}{6861}{0458}{3204} \or: + 13029 \__fp_exp_large:w {6830}{5723}{7791}{4884}{1932}{7351} \or: + 17372 \__fp_exp_large:w {6015}{5609}{3095}{3052}{3494}{7574} \or: + 21715 \__fp_exp_large:w {5297}{7951}{6443}{0315}{3251}{3576} \or: + 26058 \__fp_exp_large:w {4665}{6719}{0099}{3379}{5527}{2929} \or: + 30401 \__fp_exp_large:w {4108}{9724}{3326}{3186}{5271}{5665} \or: + 34744 \__fp_exp_large:w {3618}{6973}{3140}{0875}{3856}{4102} \or: + 39087 \__fp_exp_large:w {3186}{9209}{6113}{3900}{6705}{9685} \or: \fi: #1; \__fp_exp_large_iv:wN } \cs_new:Npn \__fp_exp_large_iv:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 435 \__fp_exp_large:w {1970}{0711}{1401}{7046}{9938}{8888} \or: + 869 \__fp_exp_large:w {3881}{1801}{9428}{4368}{5764}{8232} \or: + 1303 \__fp_exp_large:w {7646}{2009}{8905}{4704}{8893}{1073} \or: + 1738 \__fp_exp_large:w {1506}{3559}{7005}{0524}{9009}{7592} \or: + 2172 \__fp_exp_large:w {2967}{6283}{8402}{3667}{0689}{6630} \or: + 2606 \__fp_exp_large:w {5846}{4389}{5650}{2114}{7278}{5046} \or: + 3041 \__fp_exp_large:w {1151}{7900}{5080}{6878}{2914}{4154} \or: + 3475 \__fp_exp_large:w {2269}{1083}{0850}{6857}{8724}{4002} \or: + 3909 \__fp_exp_large:w {4470}{3047}{3316}{5442}{6408}{6591} \or: \fi: #1; \__fp_exp_large_iii:wN } \cs_new:Npn \__fp_exp_large_iii:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 44 \__fp_exp_large:w {2688}{1171}{4181}{6135}{4484}{1263} \or: + 87 \__fp_exp_large:w {7225}{9737}{6812}{5749}{2581}{7748} \or: + 131 \__fp_exp_large:w {1942}{4263}{9524}{1255}{9365}{8421} \or: + 174 \__fp_exp_large:w {5221}{4696}{8976}{4143}{9505}{8876} \or: + 218 \__fp_exp_large:w {1403}{5922}{1785}{2837}{4107}{3977} \or: + 261 \__fp_exp_large:w {3773}{0203}{0092}{9939}{8234}{0143} \or: + 305 \__fp_exp_large:w {1014}{2320}{5473}{5004}{5094}{5533} \or: + 348 \__fp_exp_large:w {2726}{3745}{7211}{2566}{5673}{6478} \or: + 391 \__fp_exp_large:w {7328}{8142}{2230}{7421}{7051}{8866} \or: \fi: #1; \__fp_exp_large_ii:wN } \cs_new:Npn \__fp_exp_large_ii:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 5 \__fp_exp_large:w {2202}{6465}{7948}{0671}{6516}{9579} \or: + 9 \__fp_exp_large:w {4851}{6519}{5409}{7902}{7796}{9107} \or: + 14 \__fp_exp_large:w {1068}{6474}{5815}{2446}{2146}{9905} \or: + 18 \__fp_exp_large:w {2353}{8526}{6837}{0199}{8540}{7900} \or: + 22 \__fp_exp_large:w {5184}{7055}{2858}{7072}{4640}{8745} \or: + 27 \__fp_exp_large:w {1142}{0073}{8981}{5684}{2836}{6296} \or: + 31 \__fp_exp_large:w {2515}{4386}{7091}{9167}{0062}{6578} \or: + 35 \__fp_exp_large:w {5540}{6223}{8439}{3510}{0525}{7117} \or: + 40 \__fp_exp_large:w {1220}{4032}{9431}{7840}{8020}{0271} \or: \fi: #1; \__fp_exp_large_i:wN } \cs_new:Npn \__fp_exp_large_i:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 1 \__fp_exp_large:w {2718}{2818}{2845}{9045}{2353}{6029} \or: + 1 \__fp_exp_large:w {7389}{0560}{9893}{0650}{2272}{3043} \or: + 2 \__fp_exp_large:w {2008}{5536}{9231}{8766}{7740}{9285} \or: + 2 \__fp_exp_large:w {5459}{8150}{0331}{4423}{9078}{1103} \or: + 3 \__fp_exp_large:w {1484}{1315}{9102}{5766}{0342}{1116} \or: + 3 \__fp_exp_large:w {4034}{2879}{3492}{7351}{2260}{8387} \or: + 4 \__fp_exp_large:w {1096}{6331}{5842}{8458}{5992}{6372} \or: + 4 \__fp_exp_large:w {2980}{9579}{8704}{1728}{2747}{4359} \or: + 4 \__fp_exp_large:w {8103}{0839}{2757}{5384}{0077}{1000} \or: \fi: #1; \__fp_exp_large_:wN } \cs_new:Npn \__fp_exp_large_:wN #1; #2 { \if_case:w #2 ~ \exp_after:wN \__fp_fixed_continue:wn \or: + 1 \__fp_exp_large:w {1105}{1709}{1807}{5647}{6248}{1171} \or: + 1 \__fp_exp_large:w {1221}{4027}{5816}{0169}{8339}{2107} \or: + 1 \__fp_exp_large:w {1349}{8588}{0757}{6003}{1039}{8374} \or: + 1 \__fp_exp_large:w {1491}{8246}{9764}{1270}{3178}{2485} \or: + 1 \__fp_exp_large:w {1648}{7212}{7070}{0128}{1468}{4865} \or: + 1 \__fp_exp_large:w {1822}{1188}{0039}{0508}{9748}{7537} \or: + 1 \__fp_exp_large:w {2013}{7527}{0747}{0476}{5216}{2455} \or: + 1 \__fp_exp_large:w {2225}{5409}{2849}{2467}{6045}{7954} \or: + 1 \__fp_exp_large:w {2459}{6031}{1115}{6949}{6638}{0013} \or: \fi: #1; \__fp_exp_large_after:wwn } \cs_new:Npn \__fp_exp_large_after:wwn #1; #2; #3 { \__fp_exp_Taylor:Nnnwn ? { } { } 0 #2; {} #3 \__fp_fixed_mul:wwn #1; } \cs_new:cpn { __fp_ \iow_char:N \^ _o:ww } \s__fp \__fp_chk:w #1#2#3; \s__fp \__fp_chk:w #4#5#6; { \if_meaning:w 0 #4 \__fp_case_return_o:Nw \c_one_fp \fi: \if_case:w #2 \exp_stop_f: \exp_after:wN \use_i:nn \or: \__fp_case_return_o:Nw \c_nan_fp \else: \exp_after:wN \__fp_pow_neg:www \exp:w \exp_end_continue_f:w \exp_after:wN \use:nn \fi: { \if_meaning:w 1 #1 \exp_after:wN \__fp_pow_normal_o:ww \else: \exp_after:wN \__fp_pow_zero_or_inf:ww \fi: \s__fp \__fp_chk:w #1#2#3; } { \s__fp \__fp_chk:w #4#5#6; \s__fp \__fp_chk:w #1#2#3; } \s__fp \__fp_chk:w #4#5#6; } \cs_new:Npn \__fp_pow_zero_or_inf:ww \s__fp \__fp_chk:w #1#2; \s__fp \__fp_chk:w #3#4 { \if_meaning:w 1 #4 \__fp_case_return_same_o:w \fi: \if_meaning:w #1 #4 \__fp_case_return_o:Nw \c_zero_fp \fi: \if_meaning:w 2 #1 \__fp_case_return_o:Nw \c_inf_fp \fi: \if_meaning:w 2 #3 \__fp_case_return_o:Nw \c_inf_fp \else: \__fp_case_use:nw { \__fp_division_by_zero_o:NNww \c_inf_fp ^ \s__fp \__fp_chk:w #1 #2 ; } \fi: \s__fp \__fp_chk:w #3#4 } \cs_new:Npn \__fp_pow_normal_o:ww \s__fp \__fp_chk:w 1 #1#2#3; \s__fp \__fp_chk:w #4#5 { \if_int_compare:w \__str_if_eq_x:nn { #2 #3 } { 1 {1000} {0000} {0000} {0000} } = 0 \exp_stop_f: \if_int_compare:w #4 #1 = 32 \exp_stop_f: \exp_after:wN \__fp_case_return_ii_o:ww \fi: \__fp_case_return_o:Nww \c_one_fp \fi: \if_case:w #4 \exp_stop_f: \or: \exp_after:wN \__fp_pow_npos_o:Nww \exp_after:wN #5 \or: \if_meaning:w 2 #5 \exp_after:wN \reverse_if:N \fi: \if_int_compare:w #2 > 0 \exp_stop_f: \exp_after:wN \__fp_case_return_o:Nww \exp_after:wN \c_inf_fp \else: \exp_after:wN \__fp_case_return_o:Nww \exp_after:wN \c_zero_fp \fi: \or: \__fp_case_return_ii_o:ww \fi: \s__fp \__fp_chk:w 1 #1 {#2} #3 ; \s__fp \__fp_chk:w #4 #5 } \cs_new:Npn \__fp_pow_npos_o:Nww #1 \s__fp \__fp_chk:w 1#2#3 { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN 0 \__int_value:w \if:w #1 \if_int_compare:w #3 > 0 \exp_stop_f: 0 \else: 2 \fi: \exp_after:wN \__fp_pow_npos_aux:NNnww \exp_after:wN + \exp_after:wN \__fp_fixed_to_float_o:wN \else: \exp_after:wN \__fp_pow_npos_aux:NNnww \exp_after:wN - \exp_after:wN \__fp_fixed_inv_to_float_o:wN \fi: {#3} } \cs_new:Npn \__fp_pow_npos_aux:NNnww #1#2#3#4#5; \s__fp \__fp_chk:w 1#6#7#8; { #1 \__int_eval:w \__fp_ln_significand:NNNNnnnN #4#5 \__fp_pow_exponent:wnN {#3} \__fp_fixed_mul:wwn #8 {0000}{0000} ; \__fp_pow_B:wwN #7; #1 #2 0 % fixed_to_float_o:wN } \cs_new:Npn \__fp_pow_exponent:wnN #1; #2 { \if_int_compare:w #2 > 0 \exp_stop_f: \exp_after:wN \__fp_pow_exponent:Nwnnnnnw % n\ln(10) - (-\ln(x)) \exp_after:wN + \else: \exp_after:wN \__fp_pow_exponent:Nwnnnnnw % -(|n|\ln(10) + (-\ln(x))) \exp_after:wN - \fi: #2; #1; } \cs_new:Npn \__fp_pow_exponent:Nwnnnnnw #1#2; #3#4#5#6#7#8; { %^^A todo: use that in ln. \exp_after:wN \__fp_fixed_mul_after:wwn \__int_value:w \__int_eval:w \c__fp_leading_shift_int \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int #1#2*23025 - #1 #3 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int #1 #2*8509 - #1 #4 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int #1 #2*2994 - #1 #5 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int #1 #2*0456 - #1 #6 \exp_after:wN \__fp_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_trailing_shift_int #1 #2*8401 - #1 #7 #1 ( #2*7991 - #8 ) / 1 0000 ; ; } \cs_new:Npn \__fp_pow_B:wwN #1#2#3#4#5#6; #7; { \if_int_compare:w #7 < 0 \exp_stop_f: \exp_after:wN \__fp_pow_C_neg:w \__int_value:w - \else: \if_int_compare:w #7 < 22 \exp_stop_f: \exp_after:wN \__fp_pow_C_pos:w \__int_value:w \else: \exp_after:wN \__fp_pow_C_overflow:w \__int_value:w \fi: \fi: #7 \exp_after:wN ; \__int_value:w \__int_eval:w 10 0000 + #1 \__int_eval_end: #2#3#4#5#6 0000 0000 0000 0000 0000 0000 ; %^^A todo: how many 0? } \cs_new:Npn \__fp_pow_C_overflow:w #1; #2; #3 { + 2 * \c__fp_max_exponent_int \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl } \cs_new:Npn \__fp_pow_C_neg:w #1 ; 1 { \exp_after:wN \exp_after:wN \exp_after:wN \__fp_pow_C_pack:w \prg_replicate:nn {#1} {0} } \cs_new:Npn \__fp_pow_C_pos:w #1; 1 { \__fp_pow_C_pos_loop:wN #1; } \cs_new:Npn \__fp_pow_C_pos_loop:wN #1; #2 { \if_meaning:w 0 #1 \exp_after:wN \__fp_pow_C_pack:w \exp_after:wN #2 \else: \if_meaning:w 0 #2 \exp_after:wN \__fp_pow_C_pos_loop:wN \__int_value:w \else: \exp_after:wN \__fp_pow_C_overflow:w \__int_value:w \fi: \__int_eval:w #1 - 1 \exp_after:wN ; \fi: } \cs_new:Npn \__fp_pow_C_pack:w { \exp_after:wN \__fp_exp_large_v:wN \c__fp_one_fixed_tl } \cs_new:Npn \__fp_pow_neg:www \s__fp \__fp_chk:w #1#2; #3; #4; { \if_case:w \__fp_pow_neg_case:w #4 ; \exp_after:wN \__fp_pow_neg_aux:wNN \or: \if_int_compare:w \__int_eval:w #1 / 2 = 1 \exp_stop_f: \__fp_invalid_operation_o:Nww ^ #3; #4; \exp:w \exp_end_continue_f:w \exp_after:wN \exp_after:wN \exp_after:wN \__fp_use_none_until_s:w \fi: \fi: \__fp_exp_after_o:w \s__fp \__fp_chk:w #1#2; } \cs_new:Npn \__fp_pow_neg_aux:wNN #1 \s__fp \__fp_chk:w #2#3 { \exp_after:wN \__fp_exp_after_o:w \exp_after:wN \s__fp \exp_after:wN \__fp_chk:w \exp_after:wN #2 \__int_value:w \__int_eval:w 2 - #3 \__int_eval_end: } \cs_new:Npn \__fp_pow_neg_case:w \s__fp \__fp_chk:w #1#2#3; { \if_case:w #1 \exp_stop_f: -1 \or: \__fp_pow_neg_case_aux:nnnnn #3 \or: -1 \else: 1 \fi: \exp_stop_f: } \cs_new:Npn \__fp_pow_neg_case_aux:nnnnn #1#2#3#4#5 { \if_int_compare:w #1 > \c__fp_prec_int -1 \else: \__fp_decimate:nNnnnn { \c__fp_prec_int - #1 } \__fp_pow_neg_case_aux:Nnnw {#2} {#3} {#4} {#5} \fi: } \cs_new:Npn \__fp_pow_neg_case_aux:Nnnw #1#2#3#4 ; { \if_meaning:w 0 #1 \if_int_odd:w #3 \exp_stop_f: 0 \else: -1 \fi: \else: 1 \fi: } %% File: l3fp-trig.dtx Copyright (C) 2011-2017 The LaTeX3 Project \tl_map_inline:nn { {acos} {acsc} {asec} {asin} {cos} {cot} {csc} {sec} {sin} {tan} } { \cs_new:cpx { __fp_parse_word_#1:N } { \exp_not:N \__fp_parse_unary_function:NNN \exp_not:c { __fp_#1_o:w } \exp_not:N \use_i:nn } \cs_new:cpx { __fp_parse_word_#1d:N } { \exp_not:N \__fp_parse_unary_function:NNN \exp_not:c { __fp_#1_o:w } \exp_not:N \use_ii:nn } } \cs_new:Npn \__fp_parse_word_acot:N { \__fp_parse_function:NNN \__fp_acot_o:Nw \use_i:nn } \cs_new:Npn \__fp_parse_word_acotd:N { \__fp_parse_function:NNN \__fp_acot_o:Nw \use_ii:nn } \cs_new:Npn \__fp_parse_word_atan:N { \__fp_parse_function:NNN \__fp_atan_o:Nw \use_i:nn } \cs_new:Npn \__fp_parse_word_atand:N { \__fp_parse_function:NNN \__fp_atan_o:Nw \use_ii:nn } \cs_new:Npn \__fp_sin_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_same_o:w \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww \__fp_ep_to_float_o:wwN #3 0 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { sin } { sind } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_cos_o:w #1 \s__fp \__fp_chk:w #2#3; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_o:Nw \c_one_fp \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww \__fp_ep_to_float_o:wwN 0 2 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { cos } { cosd } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3; } \cs_new:Npn \__fp_csc_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w #2 \exp_stop_f: \__fp_cot_zero_o:Nfw #3 { #1 { csc } { cscd } } \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww \__fp_ep_inv_to_float_o:wwN #3 0 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { csc } { cscd } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_sec_o:w #1 \s__fp \__fp_chk:w #2#3; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_o:Nw \c_one_fp \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_sin_series_o:NNwwww \__fp_ep_inv_to_float_o:wwN 0 2 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { sec } { secd } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3; } \cs_new:Npn \__fp_tan_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_same_o:w \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_tan_series_o:NNwwww 0 #3 1 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { tan } { tand } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_cot_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w #2 \exp_stop_f: \__fp_cot_zero_o:Nfw #3 { #1 { cot } { cotd } } \or: \__fp_case_use:nw { \__fp_trig:NNNNNwn #1 \__fp_tan_series_o:NNwwww 2 #3 3 } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { cot } { cotd } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_cot_zero_o:Nfw #1#2#3 \fi: { \fi: \token_if_eq_meaning:NNTF 0 #1 { \exp_args:NNf \__fp_division_by_zero_o:Nnw \c_inf_fp } { \exp_args:NNf \__fp_division_by_zero_o:Nnw \c_minus_inf_fp } {#2} } \cs_new:Npn \__fp_trig:NNNNNwn #1#2#3#4#5 \s__fp \__fp_chk:w 1#6#7#8; { \exp_after:wN #2 \exp_after:wN #3 \exp_after:wN #4 \__int_value:w \__int_eval:w #5 \exp_after:wN \exp_after:wN \exp_after:wN \exp_after:wN \if_int_compare:w #7 > #1 0 1 \exp_stop_f: #1 \__fp_trig_large:ww \__fp_trigd_large:ww \else: #1 \__fp_trig_small:ww \__fp_trigd_small:ww \fi: #7,#8{0000}{0000}; } \cs_new:Npn \__fp_trig_small:ww #1,#2; { \__fp_ep_to_fixed:wwn #1,#2; . #1,#2; } \cs_new:Npn \__fp_trigd_small:ww #1,#2; { \__fp_ep_mul_raw:wwwwN -1,{1745}{3292}{5199}{4329}{5769}{2369}; #1,#2; \__fp_trig_small:ww } \cs_new:Npn \__fp_trigd_large:ww #1, #2#3#4#5#6#7; { \exp_after:wN \__fp_pack_eight:wNNNNNNNN \exp_after:wN \__fp_pack_eight:wNNNNNNNN \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_pack_twice_four:wNNNNNNNN \exp_after:wN \__fp_trigd_large_auxi:nnnnwNNNN \exp_after:wN ; \exp:w \exp_end_continue_f:w \prg_replicate:nn { \int_max:nn { 22 - #1 } { 0 } } { 0 } #2#3#4#5#6#7 0000 0000 0000 ! } \cs_new:Npn \__fp_trigd_large_auxi:nnnnwNNNN #1#2#3#4#5; #6#7#8#9 { \exp_after:wN \__fp_trigd_large_auxii:wNw \__int_value:w \__int_eval:w #1 + #2 - (#1 + #2 - 4) / 9 * 9 \__int_eval_end: #3; #4; #5{#6#7#8#9}; } \cs_new:Npn \__fp_trigd_large_auxii:wNw #1; #2#3; { + (#1#2 - 4) / 9 * 2 \exp_after:wN \__fp_trigd_large_auxiii:www \__int_value:w \__int_eval:w #1#2 - (#1#2 - 4) / 9 * 9 \__int_eval_end: #3 ; } \cs_new:Npn \__fp_trigd_large_auxiii:www #1; #2; #3! { \if_int_compare:w #1 < 4500 \exp_stop_f: \exp_after:wN \__fp_use_i_until_s:nw \exp_after:wN \__fp_fixed_continue:wn \else: + 1 \fi: \__fp_fixed_sub:wwn {9000}{0000}{0000}{0000}{0000}{0000}; {#1}#2{0000}{0000}; { \__fp_trigd_small:ww 2, } } \cs_new:Npx \__fp_trig_inverse_two_pi: { \exp_not:n { \exp_after:wN \use_none:n \token_to_str:N } \cs:w , , ! 0000000000000000159154943091895335768883763372514362034459645740 ~ 4564487476673440588967976342265350901138027662530859560728427267 ~ 5795803689291184611457865287796741073169983922923996693740907757 ~ 3077746396925307688717392896217397661693362390241723629011832380 ~ 1142226997557159404618900869026739561204894109369378440855287230 ~ 9994644340024867234773945961089832309678307490616698646280469944 ~ 8652187881574786566964241038995874139348609983868099199962442875 ~ 5851711788584311175187671605465475369880097394603647593337680593 ~ 0249449663530532715677550322032477781639716602294674811959816584 ~ 0606016803035998133911987498832786654435279755070016240677564388 ~ 8495713108801221993761476813777647378906330680464579784817613124 ~ 2731406996077502450029775985708905690279678513152521001631774602 ~ 0924811606240561456203146484089248459191435211575407556200871526 ~ 6068022171591407574745827225977462853998751553293908139817724093 ~ 5825479707332871904069997590765770784934703935898280871734256403 ~ 6689511662545705943327631268650026122717971153211259950438667945 ~ 0376255608363171169525975812822494162333431451061235368785631136 ~ 3669216714206974696012925057833605311960859450983955671870995474 ~ 6510431623815517580839442979970999505254387566129445883306846050 ~ 7852915151410404892988506388160776196993073410389995786918905980 ~ 9373777206187543222718930136625526123878038753888110681406765434 ~ 0828278526933426799556070790386060352738996245125995749276297023 ~ 5940955843011648296411855777124057544494570217897697924094903272 ~ 9477021664960356531815354400384068987471769158876319096650696440 ~ 4776970687683656778104779795450353395758301881838687937766124814 ~ 9530599655802190835987510351271290432315804987196868777594656634 ~ 6221034204440855497850379273869429353661937782928735937843470323 ~ 0237145837923557118636341929460183182291964165008783079331353497 ~ 7909974586492902674506098936890945883050337030538054731232158094 ~ 3197676032283131418980974982243833517435698984750103950068388003 ~ 9786723599608024002739010874954854787923568261139948903268997427 ~ 0834961149208289037767847430355045684560836714793084567233270354 ~ 8539255620208683932409956221175331839402097079357077496549880868 ~ 6066360968661967037474542102831219251846224834991161149566556037 ~ 9696761399312829960776082779901007830360023382729879085402387615 ~ 5744543092601191005433799838904654921248295160707285300522721023 ~ 6017523313173179759311050328155109373913639645305792607180083617 ~ 9548767246459804739772924481092009371257869183328958862839904358 ~ 6866663975673445140950363732719174311388066383072592302759734506 ~ 0548212778037065337783032170987734966568490800326988506741791464 ~ 6835082816168533143361607309951498531198197337584442098416559541 ~ 5225064339431286444038388356150879771645017064706751877456059160 ~ 8716857857939226234756331711132998655941596890719850688744230057 ~ 5191977056900382183925622033874235362568083541565172971088117217 ~ 9593683256488518749974870855311659830610139214454460161488452770 ~ 2511411070248521739745103866736403872860099674893173561812071174 ~ 0478899368886556923078485023057057144063638632023685201074100574 ~ 8592281115721968003978247595300166958522123034641877365043546764 ~ 6456565971901123084767099309708591283646669191776938791433315566 ~ 5066981321641521008957117286238426070678451760111345080069947684 ~ 2235698962488051577598095339708085475059753626564903439445420581 ~ 7886435683042000315095594743439252544850674914290864751442303321 ~ 3324569511634945677539394240360905438335528292434220349484366151 ~ 4663228602477666660495314065734357553014090827988091478669343492 ~ 2737602634997829957018161964321233140475762897484082891174097478 ~ 2637899181699939487497715198981872666294601830539583275209236350 ~ 6853889228468247259972528300766856937583659722919824429747406163 ~ 8183113958306744348516928597383237392662402434501997809940402189 ~ 6134834273613676449913827154166063424829363741850612261086132119 ~ 9863346284709941839942742955915628333990480382117501161211667205 ~ 1912579303552929241134403116134112495318385926958490443846807849 ~ 0973982808855297045153053991400988698840883654836652224668624087 ~ 2540140400911787421220452307533473972538149403884190586842311594 ~ 6322744339066125162393106283195323883392131534556381511752035108 ~ 7459558201123754359768155340187407394340363397803881721004531691 ~ 8295194879591767395417787924352761740724605939160273228287946819 ~ 3649128949714953432552723591659298072479985806126900733218844526 ~ 7943350455801952492566306204876616134365339920287545208555344144 ~ 0990512982727454659118132223284051166615650709837557433729548631 ~ 2041121716380915606161165732000083306114606181280326258695951602 ~ 4632166138576614804719932707771316441201594960110632830520759583 ~ 4850305079095584982982186740289838551383239570208076397550429225 ~ 9847647071016426974384504309165864528360324933604354657237557916 ~ 1366324120457809969715663402215880545794313282780055246132088901 ~ 8742121092448910410052154968097113720754005710963406643135745439 ~ 9159769435788920793425617783022237011486424925239248728713132021 ~ 7667360756645598272609574156602343787436291321097485897150713073 ~ 9104072643541417970572226547980381512759579124002534468048220261 ~ 7342299001020483062463033796474678190501811830375153802879523433 ~ 4195502135689770912905614317878792086205744999257897569018492103 ~ 2420647138519113881475640209760554895793785141404145305151583964 ~ 2823265406020603311891586570272086250269916393751527887360608114 ~ 5569484210322407772727421651364234366992716340309405307480652685 ~ 0930165892136921414312937134106157153714062039784761842650297807 ~ 8606266969960809184223476335047746719017450451446166382846208240 ~ 8673595102371302904443779408535034454426334130626307459513830310 ~ 2293146934466832851766328241515210179422644395718121717021756492 ~ 1964449396532222187658488244511909401340504432139858628621083179 ~ 3939608443898019147873897723310286310131486955212620518278063494 ~ 5711866277825659883100535155231665984394090221806314454521212978 ~ 9734471488741258268223860236027109981191520568823472398358013366 ~ 0683786328867928619732367253606685216856320119489780733958419190 ~ 6659583867852941241871821727987506103946064819585745620060892122 ~ 8416394373846549589932028481236433466119707324309545859073361878 ~ 6290631850165106267576851216357588696307451999220010776676830946 ~ 9814975622682434793671310841210219520899481912444048751171059184 ~ 4139907889455775184621619041530934543802808938628073237578615267 ~ 7971143323241969857805637630180884386640607175368321362629671224 ~ 2609428540110963218262765120117022552929289655594608204938409069 ~ 0760692003954646191640021567336017909631872891998634341086903200 ~ 5796637103128612356988817640364252540837098108148351903121318624 ~ 7228181050845123690190646632235938872454630737272808789830041018 ~ 9485913673742589418124056729191238003306344998219631580386381054 ~ 2457893450084553280313511884341007373060595654437362488771292628 ~ 9807423539074061786905784443105274262641767830058221486462289361 ~ 9296692992033046693328438158053564864073184440599549689353773183 ~ 6726613130108623588021288043289344562140479789454233736058506327 ~ 0439981932635916687341943656783901281912202816229500333012236091 ~ 8587559201959081224153679499095448881099758919890811581163538891 ~ 6339402923722049848375224236209100834097566791710084167957022331 ~ 7897107102928884897013099533995424415335060625843921452433864640 ~ 3432440657317477553405404481006177612569084746461432976543900008 ~ 3826521145210162366431119798731902751191441213616962045693602633 ~ 6102355962140467029012156796418735746835873172331004745963339773 ~ 2477044918885134415363760091537564267438450166221393719306748706 ~ 2881595464819775192207710236743289062690709117919412776212245117 ~ 2354677115640433357720616661564674474627305622913332030953340551 ~ 3841718194605321501426328000879551813296754972846701883657425342 ~ 5016994231069156343106626043412205213831587971115075454063290657 ~ 0248488648697402872037259869281149360627403842332874942332178578 ~ 7750735571857043787379693402336902911446961448649769719434527467 ~ 4429603089437192540526658890710662062575509930379976658367936112 ~ 8137451104971506153783743579555867972129358764463093757203221320 ~ 2460565661129971310275869112846043251843432691552928458573495971 ~ 5042565399302112184947232132380516549802909919676815118022483192 ~ 5127372199792134331067642187484426215985121676396779352982985195 ~ 8545392106957880586853123277545433229161989053189053725391582222 ~ 9232597278133427818256064882333760719681014481453198336237910767 ~ 1255017528826351836492103572587410356573894694875444694018175923 ~ 0609370828146501857425324969212764624247832210765473750568198834 ~ 5641035458027261252285503154325039591848918982630498759115406321 ~ 0354263890012837426155187877318375862355175378506956599570028011 ~ 5841258870150030170259167463020842412449128392380525772514737141 ~ 2310230172563968305553583262840383638157686828464330456805994018 ~ 7001071952092970177990583216417579868116586547147748964716547948 ~ 8312140431836079844314055731179349677763739898930227765607058530 ~ 4083747752640947435070395214524701683884070908706147194437225650 ~ 2823145872995869738316897126851939042297110721350756978037262545 ~ 8141095038270388987364516284820180468288205829135339013835649144 ~ 3004015706509887926715417450706686888783438055583501196745862340 ~ 8059532724727843829259395771584036885940989939255241688378793572 ~ 7967951654076673927031256418760962190243046993485989199060012977 ~ 7469214532970421677817261517850653008552559997940209969455431545 ~ 2745856704403686680428648404512881182309793496962721836492935516 ~ 2029872469583299481932978335803459023227052612542114437084359584 ~ 9443383638388317751841160881711251279233374577219339820819005406 ~ 3292937775306906607415304997682647124407768817248673421685881509 ~ 9133422075930947173855159340808957124410634720893194912880783576 ~ 3115829400549708918023366596077070927599010527028150868897828549 ~ 4340372642729262103487013992868853550062061514343078665396085995 ~ 0058714939141652065302070085265624074703660736605333805263766757 ~ 2018839497277047222153633851135483463624619855425993871933367482 ~ 0422097449956672702505446423243957506869591330193746919142980999 ~ 3424230550172665212092414559625960554427590951996824313084279693 ~ 7113207021049823238195747175985519501864630940297594363194450091 ~ 9150616049228764323192129703446093584259267276386814363309856853 ~ 2786024332141052330760658841495858718197071242995959226781172796 ~ 4438853796763139274314227953114500064922126500133268623021550837 \cs_end: } \cs_new:Npn \__fp_trig_large:ww #1, #2#3#4#5#6; { \exp_after:wN \__fp_trig_large_auxi:wwwwww \__int_value:w \__int_eval:w (#1 - 32) / 64 \exp_after:wN , \__int_value:w \__int_eval:w (#1 - 4) / 8 \exp_after:wN , \__int_value:w #1 \__fp_trig_inverse_two_pi: ; {#2}{#3}{#4}{#5} ; } \cs_new:Npn \__fp_trig_large_auxi:wwwwww #1, #2, #3, #4! { \prg_replicate:nn {#1} { \__fp_trig_large_auxii:ww } \prg_replicate:nn { #2 - #1 * 8 } { \__fp_trig_large_auxiii:wNNNNNNNN } \prg_replicate:nn { #3 - #2 * 8 } { \__fp_trig_large_auxiv:wN } \prg_replicate:nn { 8 } { \__fp_pack_twice_four:wNNNNNNNN } \__fp_trig_large_auxv:www ; } \cs_new:Npn \__fp_trig_large_auxii:ww #1; #2 ~ { #1; } \cs_new:Npn \__fp_trig_large_auxiii:wNNNNNNNN #1; #2#3#4#5#6#7#8#9 { #1; } \cs_new:Npn \__fp_trig_large_auxiv:wN #1; #2 { #1; } \cs_new:Npn \__fp_trig_large_auxv:www #1; #2; #3; { \exp_after:wN \__fp_use_i_until_s:nw \exp_after:wN \__fp_trig_large_auxvii:w \__int_value:w \__int_eval:w \c__fp_leading_shift_int \prg_replicate:nn { 13 } { \__fp_trig_large_auxvi:wnnnnnnnn } + \c__fp_trailing_shift_int - \c__fp_middle_shift_int \__fp_use_i_until_s:nw ; #3 #1 ; ; } \cs_new:Npn \__fp_trig_large_auxvi:wnnnnnnnn #1; #2#3#4#5#6#7#8#9 { \exp_after:wN \__fp_trig_large_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int + #2*#9 + #3*#8 + #4*#7 + #5*#6 #1; {#2}{#3}{#4}{#5} {#7}{#8}{#9} } \cs_new:Npn \__fp_trig_large_pack:NNNNNw #1#2#3#4#5#6; { + #1#2#3#4#5 ; #6 } \cs_new:Npn \__fp_trig_large_auxvii:w #1#2#3 { \exp_after:wN \__fp_trig_large_auxviii:ww \__int_value:w \__int_eval:w (#1#2#3 - 62) / 125 ; #1#2#3 } \cs_new:Npn \__fp_trig_large_auxviii:ww #1; { + #1 \if_int_odd:w #1 \exp_stop_f: \exp_after:wN \__fp_trig_large_auxix:Nw \exp_after:wN - \else: \exp_after:wN \__fp_trig_large_auxix:Nw \exp_after:wN + \fi: } \cs_new:Npn \__fp_trig_large_auxix:Nw { \exp_after:wN \__fp_use_i_until_s:nw \exp_after:wN \__fp_trig_large_auxxi:w \__int_value:w \__int_eval:w \c__fp_leading_shift_int \prg_replicate:nn { 13 } { \__fp_trig_large_auxx:wNNNNN } + \c__fp_trailing_shift_int - \c__fp_middle_shift_int ; } \cs_new:Npn \__fp_trig_large_auxx:wNNNNN #1; #2 #3#4#5#6 { \exp_after:wN \__fp_trig_large_pack:NNNNNw \__int_value:w \__int_eval:w \c__fp_middle_shift_int #2 8 * #3#4#5#6 #1; #2 } \cs_new:Npn \__fp_trig_large_auxxi:w #1; { \exp_after:wN \__fp_ep_mul_raw:wwwwN \__int_value:w \__int_eval:w 0 \__fp_ep_to_ep_loop:N #1 ; ; ! 0,{7853}{9816}{3397}{4483}{0961}{5661}; \__fp_trig_small:ww } \cs_new:Npn \__fp_sin_series_o:NNwwww #1#2#3. #4; { \__fp_fixed_mul:wwn #4; #4; { \exp_after:wN \__fp_sin_series_aux_o:NNnwww \exp_after:wN #1 \__int_value:w \if_int_odd:w \__int_eval:w (#3 + 2) / 4 \__int_eval_end: #2 \else: \if_meaning:w #2 0 2 \else: 0 \fi: \fi: {#3} } } \cs_new:Npn \__fp_sin_series_aux_o:NNnwww #1#2#3 #4; #5,#6; { \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { % 1/18! \__fp_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0001}{5619}{2070}; #4;{0000}{0000}{0000}{0477}{9477}{3324}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0011}{4707}{4559}{7730}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{2087}{6756}{9878}{6810}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0027}{5573}{1922}{3985}{8907}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{2480}{1587}{3015}{8730}{1587}; \__fp_fixed_mul_sub_back:wwwn #4;{0013}{8888}{8888}{8888}{8888}{8889}; \__fp_fixed_mul_sub_back:wwwn #4;{0416}{6666}{6666}{6666}{6666}{6667}; \__fp_fixed_mul_sub_back:wwwn #4;{5000}{0000}{0000}{0000}{0000}{0000}; \__fp_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000}; { \__fp_fixed_continue:wn 0, } } { % 1/17! \__fp_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0028}{1145}{7254}; #4;{0000}{0000}{0000}{7647}{1637}{3182}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0160}{5904}{3836}{8216}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0002}{5052}{1083}{8544}{1719}; \__fp_fixed_mul_sub_back:wwwn #4;{0000}{0275}{5731}{9223}{9858}{9065}; \__fp_fixed_mul_sub_back:wwwn #4;{0001}{9841}{2698}{4126}{9841}{2698}; \__fp_fixed_mul_sub_back:wwwn #4;{0083}{3333}{3333}{3333}{3333}{3333}; \__fp_fixed_mul_sub_back:wwwn #4;{1666}{6666}{6666}{6666}{6666}{6667}; \__fp_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000}; { \__fp_ep_mul:wwwwn 0, } #5,#6; } { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #2 \__int_value:w \__int_eval:w #1 } #2 } \cs_new:Npn \__fp_tan_series_o:NNwwww #1#2#3. #4; { \__fp_fixed_mul:wwn #4; #4; { \exp_after:wN \__fp_tan_series_aux_o:Nnwww \__int_value:w \if_int_odd:w \__int_eval:w #3 / 2 \__int_eval_end: \exp_after:wN \reverse_if:N \fi: \if_meaning:w #1#2 2 \else: 0 \fi: {#3} } } \cs_new:Npn \__fp_tan_series_aux_o:Nnwww #1 #2 #3; #4,#5; { \__fp_fixed_mul_sub_back:wwwn {0000}{0000}{1527}{3493}{0856}{7059}; #3; {0000}{0159}{6080}{0274}{5257}{6472}; \__fp_fixed_mul_sub_back:wwwn #3; {0002}{4571}{2320}{0157}{2558}{8481}; \__fp_fixed_mul_sub_back:wwwn #3; {0115}{5830}{7533}{5397}{3168}{2147}; \__fp_fixed_mul_sub_back:wwwn #3; {1929}{8245}{6140}{3508}{7719}{2982}; \__fp_fixed_mul_sub_back:wwwn #3;{10000}{0000}{0000}{0000}{0000}{0000}; { \__fp_ep_mul:wwwwn 0, } #4,#5; { \__fp_fixed_mul_sub_back:wwwn {0000}{0007}{0258}{0681}{9408}{4706}; #3;{0000}{2343}{7175}{1399}{6151}{7670}; \__fp_fixed_mul_sub_back:wwwn #3;{0019}{2638}{4588}{9232}{8861}{3691}; \__fp_fixed_mul_sub_back:wwwn #3;{0536}{6357}{0691}{4344}{6852}{4252}; \__fp_fixed_mul_sub_back:wwwn #3;{5263}{1578}{9473}{6842}{1052}{6315}; \__fp_fixed_mul_sub_back:wwwn#3;{10000}{0000}{0000}{0000}{0000}{0000}; { \reverse_if:N \if_int_odd:w \__int_eval:w (#2 - 1) / 2 \__int_eval_end: \exp_after:wN \__fp_reverse_args:Nww \fi: \__fp_ep_div:wwwwn 0, } } { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w \__fp_ep_to_float_o:wwN } #1 } \cs_new:Npn \__fp_atan_o:Nw { \__fp_atan_dispatch_o:NNnNw \__fp_acotii_o:Nww \__fp_atanii_o:Nww { atan } } \cs_new:Npn \__fp_acot_o:Nw { \__fp_atan_dispatch_o:NNnNw \__fp_atanii_o:Nww \__fp_acotii_o:Nww { acot } } \cs_new:Npn \__fp_atan_dispatch_o:NNnNw #1#2#3#4#5@ { \if_case:w \__int_eval:w \__fp_array_count:n {#5} - 1 \__int_eval_end: \exp_after:wN #1 \exp_after:wN #4 \c_one_fp #5 \exp:w \or: #2 #4 #5 \exp:w \else: \__msg_kernel_expandable_error:nnnnn { kernel } { fp-num-args } { #3() } { 1 } { 2 } \exp_after:wN \c_nan_fp \exp:w \fi: \exp_after:wN \exp_end: } \cs_new:Npn \__fp_atanii_o:Nww #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5 { \if_meaning:w 3 #2 \__fp_case_return_i_o:ww \fi: \if_meaning:w 3 #5 \__fp_case_return_ii_o:ww \fi: \if_case:w \if_meaning:w #2 #5 \if_meaning:w 1 #2 10 \else: 0 \fi: \else: \if_int_compare:w #2 > #5 \exp_stop_f: 1 \else: 2 \fi: \fi: \exp_stop_f: \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 2 } \or: \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 4 } \or: \__fp_case_return:nw { \__fp_atan_inf_o:NNNw #1 #3 0 } \fi: \__fp_atan_normal_o:NNnwNnw #1 \s__fp \__fp_chk:w #2#3#4; \s__fp \__fp_chk:w #5 } \cs_new:Npn \__fp_acotii_o:Nww #1#2; #3; { \__fp_atanii_o:Nww #1#3; #2; } \cs_new:Npn \__fp_atan_inf_o:NNNw #1#2#3 \s__fp \__fp_chk:w #4#5#6; { \exp_after:wN \__fp_atan_combine_o:NwwwwwN \exp_after:wN #2 \__int_value:w \__int_eval:w \if_meaning:w 2 #5 7 - \fi: #3 \exp_after:wN ; \c__fp_one_fixed_tl {0000}{0000}{0000}{0000}{0000}{0000}; 0,{0000}{0000}{0000}{0000}{0000}{0000}; #1 } \cs_new_protected:Npn \__fp_atan_normal_o:NNnwNnw #1 \s__fp \__fp_chk:w 1#2#3#4; \s__fp \__fp_chk:w 1#5#6#7; { \__fp_atan_test_o:NwwNwwN #2 #3, #4{0000}{0000}; #5 #6, #7{0000}{0000}; #1 } \cs_new:Npn \__fp_atan_test_o:NwwNwwN #1#2,#3; #4#5,#6; { \exp_after:wN \__fp_atan_combine_o:NwwwwwN \exp_after:wN #1 \__int_value:w \__int_eval:w \if_meaning:w 2 #4 7 - \__int_eval:w \fi: \if_int_compare:w \__fp_ep_compare:wwww #2,#3; #5,#6; > 0 \exp_stop_f: 3 - \exp_after:wN \__fp_reverse_args:Nww \fi: \__fp_atan_div:wnwwnw #2,#3; #5,#6; } \cs_new:Npn \__fp_atan_div:wnwwnw #1,#2#3; #4,#5#6; { \if_int_compare:w \__int_eval:w 41421 * #5 < #2 000 \if_case:w \__int_eval:w #4 - #1 \__int_eval_end: 00 \or: 0 \fi: \exp_stop_f: \exp_after:wN \__fp_atan_near:wwwn \fi: 0 \__fp_ep_div:wwwwn #1,{#2}#3; #4,{#5}#6; \__fp_atan_auxi:ww } \cs_new:Npn \__fp_atan_near:wwwn 0 \__fp_ep_div:wwwwn #1,#2; #3, { 1 \__fp_ep_to_fixed:wwn #1 - #3, #2; \__fp_atan_near_aux:wwn } \cs_new:Npn \__fp_atan_near_aux:wwn #1; #2; { \__fp_fixed_add:wwn #1; #2; { \__fp_fixed_sub:wwn #2; #1; { \__fp_ep_div:wwwwn 0, } 0, } } \cs_new:Npn \__fp_atan_auxi:ww #1,#2; { \__fp_ep_to_fixed:wwn #1,#2; \__fp_atan_auxii:w #1,#2; } \cs_new:Npn \__fp_atan_auxii:w #1; { \__fp_fixed_mul:wwn #1; #1; { \__fp_atan_Taylor_loop:www 39 ; {0000}{0000}{0000}{0000}{0000}{0000} ; } ! #1; } \cs_new:Npn \__fp_atan_Taylor_loop:www #1; #2; #3; { \if_int_compare:w #1 = -1 \exp_stop_f: \__fp_atan_Taylor_break:w \fi: \exp_after:wN \__fp_fixed_div_int:wwN \c__fp_one_fixed_tl #1; \__fp_rrot:www \__fp_fixed_mul_sub_back:wwwn #2; #3; { \exp_after:wN \__fp_atan_Taylor_loop:www \__int_value:w \__int_eval:w #1 - 2 ; } #3; } \cs_new:Npn \__fp_atan_Taylor_break:w \fi: #1 \__fp_fixed_mul_sub_back:wwwn #2; #3 ! { \fi: ; #2 ; } \cs_new:Npn \__fp_atan_combine_o:NwwwwwN #1 #2; #3; #4; #5,#6; #7 { \exp_after:wN \__fp_sanitize:Nw \exp_after:wN #1 \__int_value:w \__int_eval:w \if_meaning:w 0 #2 \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { #5 \__fp_fixed_mul:wwn #3; #6; } { \__fp_fixed_mul:wwn #3; #4; { \exp_after:wN \__fp_atan_combine_aux:ww \__int_value:w \__int_eval:w #2 / 2 ; #2; } } { #7 \__fp_fixed_to_float_o:wN \__fp_fixed_to_float_rad_o:wN } #1 } \cs_new:Npn \__fp_atan_combine_aux:ww #1; #2; { \__fp_fixed_mul_short:wwn {7853}{9816}{3397}{4483}{0961}{5661}; {#1}{0000}{0000}; { \if_int_odd:w #2 \exp_stop_f: \exp_after:wN \__fp_fixed_sub:wwn \else: \exp_after:wN \__fp_fixed_add:wwn \fi: } } \cs_new:Npn \__fp_asin_o:w #1 \s__fp \__fp_chk:w #2#3; @ { \if_case:w #2 \exp_stop_f: \__fp_case_return_same_o:w \or: \__fp_case_use:nw { \__fp_asin_normal_o:NfwNnnnnw #1 { #1 { asin } { asind } } } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { asin } { asind } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3; } \cs_new:Npn \__fp_acos_o:w #1 \s__fp \__fp_chk:w #2#3; @ { \if_case:w #2 \exp_stop_f: \__fp_case_use:nw { \__fp_atan_inf_o:NNNw #1 0 4 } \or: \__fp_case_use:nw { \__fp_asin_normal_o:NfwNnnnnw #1 { #1 { acos } { acosd } } \__fp_reverse_args:Nww } \or: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { acos } { acosd } } } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3; } \cs_new:Npn \__fp_asin_normal_o:NfwNnnnnw #1#2#3 \s__fp \__fp_chk:w 1#4#5#6#7#8#9; { \if_int_compare:w #5 < 1 \exp_stop_f: \exp_after:wN \__fp_use_none_until_s:w \fi: \if_int_compare:w \__int_eval:w #5 + #6#7 + #8#9 = 1000 0001 ~ \exp_after:wN \__fp_use_none_until_s:w \fi: \__fp_use_i:ww \__fp_invalid_operation_o:fw {#2} \s__fp \__fp_chk:w 1#4{#5}{#6}{#7}{#8}{#9}; \__fp_asin_auxi_o:NnNww #1 {#3} #4 #5,{#6}{#7}{#8}{#9}{0000}{0000}; } \cs_new:Npn \__fp_asin_auxi_o:NnNww #1#2#3#4,#5; { \__fp_ep_to_fixed:wwn #4,#5; \__fp_asin_isqrt:wn \__fp_ep_mul:wwwwn #4,#5; \__fp_ep_to_ep:wwN \__fp_fixed_continue:wn { #2 \__fp_atan_test_o:NwwNwwN #3 } 0 1,{1000}{0000}{0000}{0000}{0000}{0000}; #1 } \cs_new:Npn \__fp_asin_isqrt:wn #1; { \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl #1; { \__fp_fixed_add_one:wN #1; \__fp_fixed_continue:wn { \__fp_ep_mul:wwwwn 0, } 0, } \__fp_ep_isqrt:wwn } \cs_new:Npn \__fp_acsc_o:w #1 \s__fp \__fp_chk:w #2#3#4; @ { \if_case:w \if_meaning:w 2 #2 #3 \fi: #2 \exp_stop_f: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { acsc } { acscd } } } \or: \__fp_case_use:nw { \__fp_acsc_normal_o:NfwNnw #1 { #1 { acsc } { acscd } } } \or: \__fp_case_return_o:Nw \c_zero_fp \or: \__fp_case_return_same_o:w \else: \__fp_case_return_o:Nw \c_minus_zero_fp \fi: \s__fp \__fp_chk:w #2 #3 #4; } \cs_new:Npn \__fp_asec_o:w #1 \s__fp \__fp_chk:w #2#3; @ { \if_case:w #2 \exp_stop_f: \__fp_case_use:nw { \__fp_invalid_operation_o:fw { #1 { asec } { asecd } } } \or: \__fp_case_use:nw { \__fp_acsc_normal_o:NfwNnw #1 { #1 { asec } { asecd } } \__fp_reverse_args:Nww } \or: \__fp_case_use:nw { \__fp_atan_inf_o:NNNw #1 0 4 } \else: \__fp_case_return_same_o:w \fi: \s__fp \__fp_chk:w #2 #3; } \cs_new:Npn \__fp_acsc_normal_o:NfwNnw #1#2#3 \s__fp \__fp_chk:w 1#4#5#6; { \int_compare:nNnTF {#5} < 1 { \__fp_invalid_operation_o:fw {#2} \s__fp \__fp_chk:w 1#4{#5}#6; } { \__fp_ep_div:wwwwn 1,{1000}{0000}{0000}{0000}{0000}{0000}; #5,#6{0000}{0000}; { \__fp_asin_auxi_o:NnNww #1 {#3} #4 } } } %% File: l3fp-convert.dtx Copyright(C) 2011-2017 The LaTeX3 Project \cs_new:Npn \__fp_trim_zeros:w #1 ; { \__fp_trim_zeros_loop:w #1 ; \__fp_trim_zeros_loop:w 0; \__fp_trim_zeros_dot:w .; \s__stop } \cs_new:Npn \__fp_trim_zeros_loop:w #1 0; #2 { #2 #1 ; #2 } \cs_new:Npn \__fp_trim_zeros_dot:w #1 .; { \__fp_trim_zeros_end:w #1 ; } \cs_new:Npn \__fp_trim_zeros_end:w #1 ; #2 \s__stop { #1 } \cs_new:Npn \fp_to_scientific:N #1 { \exp_after:wN \__fp_to_scientific_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_scientific:N { c } \cs_new:Npn \fp_to_scientific:n { \exp_after:wN \__fp_to_scientific_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } \cs_new:Npn \__fp_to_scientific_dispatch:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: \__fp_case_return:nw { 0.000000000000000e0 } \or: \exp_after:wN \__fp_to_scientific_normal:wnnnnn \or: \__fp_case_use:nw { \__fp_invalid_operation:nnw { \fp_to_scientific:N \c__fp_overflowing_fp } { fp_to_scientific } } \or: \__fp_case_use:nw { \__fp_invalid_operation:nnw { \fp_to_scientific:N \c_zero_fp } { fp_to_scientific } } \fi: \s__fp \__fp_chk:w #1 #2 } \cs_new:Npn \__fp_to_scientific_normal:wnnnnn \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ; { \exp_after:wN \__fp_to_scientific_normal:wNw \exp_after:wN e \__int_value:w \__int_eval:w #2 - 1 ; #3 #4 #5 #6 ; } \cs_new:Npn \__fp_to_scientific_normal:wNw #1 ; #2#3; { #2.#3 #1 } \cs_new:Npn \fp_to_decimal:N #1 { \exp_after:wN \__fp_to_decimal_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_decimal:N { c } \cs_new:Npn \fp_to_decimal:n { \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } \cs_new:Npn \__fp_to_decimal_dispatch:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: \__fp_case_return:nw { 0 } \or: \exp_after:wN \__fp_to_decimal_normal:wnnnnn \or: \__fp_case_use:nw { \__fp_invalid_operation:nnw { \fp_to_decimal:N \c__fp_overflowing_fp } { fp_to_decimal } } \or: \__fp_case_use:nw { \__fp_invalid_operation:nnw { 0 } { fp_to_decimal } } \fi: \s__fp \__fp_chk:w #1 #2 } \cs_new:Npn \__fp_to_decimal_normal:wnnnnn \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ; { \int_compare:nNnTF {#2} > 0 { \int_compare:nNnTF {#2} < \c__fp_prec_int { \__fp_decimate:nNnnnn { \c__fp_prec_int - #2 } \__fp_to_decimal_large:Nnnw } { \exp_after:wN \exp_after:wN \exp_after:wN \__fp_to_decimal_huge:wnnnn \prg_replicate:nn { #2 - \c__fp_prec_int } { 0 } ; } {#3} {#4} {#5} {#6} } { \exp_after:wN \__fp_trim_zeros:w \exp_after:wN 0 \exp_after:wN . \exp:w \exp_end_continue_f:w \prg_replicate:nn { - #2 } { 0 } #3#4#5#6 ; } } \cs_new:Npn \__fp_to_decimal_large:Nnnw #1#2#3#4; { \exp_after:wN \__fp_trim_zeros:w \__int_value:w \if_int_compare:w #2 > 0 \exp_stop_f: #2 \fi: \exp_stop_f: #3.#4 ; } \cs_new:Npn \__fp_to_decimal_huge:wnnnn #1; #2#3#4#5 { #2#3#4#5 #1 } \cs_new:Npn \fp_to_tl:N #1 { \exp_after:wN \__fp_to_tl_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_tl:N { c } \cs_new:Npn \fp_to_tl:n { \exp_after:wN \__fp_to_tl_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } \cs_new:Npn \__fp_to_tl_dispatch:w \s__fp \__fp_chk:w #1#2 { \if_meaning:w 2 #2 \exp_after:wN - \exp:w \exp_end_continue_f:w \fi: \if_case:w #1 \exp_stop_f: \__fp_case_return:nw { 0 } \or: \exp_after:wN \__fp_to_tl_normal:nnnnn \or: \__fp_case_return:nw { inf } \else: \__fp_case_return:nw { nan } \fi: } \cs_new:Npn \__fp_to_tl_normal:nnnnn #1 { \int_compare:nTF { -2 <= #1 <= \c__fp_prec_int } { \__fp_to_decimal_normal:wnnnnn } { \__fp_to_tl_scientific:wnnnnn } \s__fp \__fp_chk:w 1 0 {#1} } \cs_new:Npn \__fp_to_tl_scientific:wnnnnn \s__fp \__fp_chk:w 1 #1 #2 #3#4#5#6 ; { \exp_after:wN \__fp_to_tl_scientific:wNw \exp_after:wN e \__int_value:w \__int_eval:w #2 - 1 ; #3 #4 #5 #6 ; } \cs_new:Npn \__fp_to_tl_scientific:wNw #1 ; #2#3; { \__fp_trim_zeros:w #2.#3 ; #1 } \cs_new:Npn \fp_to_dim:N #1 { \fp_to_decimal:N #1 pt } \cs_generate_variant:Nn \fp_to_dim:N { c } \cs_new:Npn \fp_to_dim:n #1 { \fp_to_decimal:n {#1} pt } \cs_new:Npn \fp_to_int:N #1 { \exp_after:wN \__fp_to_int_dispatch:w #1 } \cs_generate_variant:Nn \fp_to_int:N { c } \cs_new:Npn \fp_to_int:n { \exp_after:wN \__fp_to_int_dispatch:w \exp:w \exp_end_continue_f:w \__fp_parse:n } \cs_new:Npn \__fp_to_int_dispatch:w #1; { \exp_after:wN \__fp_to_decimal_dispatch:w \exp:w \exp_end_continue_f:w \__fp_round:Nwn \__fp_round_to_nearest:NNN #1; { 0 } } \__debug_patch_args:nNNpn { { (#1) } } \cs_new:Npn \dim_to_fp:n #1 { \exp_after:wN \__fp_from_dim_test:ww \exp_after:wN 0 \exp_after:wN , \__int_value:w \etex_glueexpr:D #1 ; } \cs_new:Npn \__fp_from_dim_test:ww #1, #2 { \if_meaning:w 0 #2 \__fp_case_return:nw { \exp_after:wN \c_zero_fp } \else: \exp_after:wN \__fp_from_dim:wNw \__int_value:w \__int_eval:w #1 - 4 \if_meaning:w - #2 \exp_after:wN , \exp_after:wN 2 \__int_value:w \else: \exp_after:wN , \exp_after:wN 0 \__int_value:w #2 \fi: \fi: } \cs_new:Npn \__fp_from_dim:wNw #1,#2#3; { \__fp_pack_twice_four:wNNNNNNNN \__fp_from_dim:wNNnnnnnn ; #3 000 0000 00 {10}987654321; #2 {#1} } \cs_new:Npn \__fp_from_dim:wNNnnnnnn #1; #2#3#4#5#6#7#8#9 { \__fp_from_dim:wnnnnwNn #1 {#2#300} {0000} ; } \cs_new:Npn \__fp_from_dim:wnnnnwNn #1; #2#3#4#5#6; #7#8 { \__fp_mul_npos_o:Nww #7 \s__fp \__fp_chk:w 1 #7 {#5} #1 ; \s__fp \__fp_chk:w 1 0 {#8} {1525} {8789} {0625} {0000} ; \prg_do_nothing: } \cs_new_eq:NN \fp_use:N \fp_to_decimal:N \cs_generate_variant:Nn \fp_use:N { c } \cs_new_eq:NN \fp_eval:n \fp_to_decimal:n \cs_new:Npn \fp_abs:n #1 { \fp_to_decimal:n { abs \__fp_parse:n {#1} } } \cs_new:Npn \fp_max:nn #1#2 { \fp_to_decimal:n { max ( \__fp_parse:n {#1} , \__fp_parse:n {#2} ) } } \cs_new:Npn \fp_min:nn #1#2 { \fp_to_decimal:n { min ( \__fp_parse:n {#1} , \__fp_parse:n {#2} ) } } \cs_new:Npn \__fp_array_to_clist:n #1 { \tl_if_empty:nF {#1} { \__fp_expand:n { { \use_ii:nn } \__fp_array_to_clist_loop:Nw #1 { ? \__prg_break: } ; \__prg_break_point: } } } \cs_new:Npx \__fp_array_to_clist_loop:Nw #1#2; { \exp_not:N \use_none:n #1 \exp_not:N \exp_after:wN { \exp_not:N \exp_after:wN , \exp_not:N \exp_after:wN \c_space_tl \exp_not:N \exp:w \exp_not:N \exp_end_continue_f:w \exp_not:N \__fp_to_tl_dispatch:w #1 #2 ; } \exp_not:N \__fp_array_to_clist_loop:Nw } %% File: l3fp-random.dtx Copyright (C) 2016,2017 The LaTeX3 Project \cs_new:Npn \__fp_parse_word_rand:N { \__fp_parse_function:NNN \__fp_rand_o:Nw ? } \cs_new:Npn \__fp_parse_word_randint:N { \__fp_parse_function:NNN \__fp_randint_o:Nw ? } \cs_if_exist:NF \pdftex_uniformdeviate:D { \__msg_kernel_new:nnn { kernel } { fp-no-random } { Random~numbers~unavailable } \cs_new:Npn \__fp_rand_o:Nw ? #1 @ { \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } \exp_after:wN \c_nan_fp } \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw } \cs_if_exist:NT \pdftex_uniformdeviate:D { \cs_new:Npn \__fp_rand_uniform: { \pdftex_uniformdeviate:D \c__fp_rand_size_int } \int_const:Nn \c__fp_rand_size_int { 268 435 456 } \int_const:Nn \c__fp_rand_four_int { 268 430 000 } \int_const:Nn \c__fp_rand_eight_int { 200 000 000 } \cs_new:Npn \__fp_rand_myriads:n #1 { \__fp_rand_myriads_loop:nn #1 { ? \use_i_delimit_by_q_stop:nw \__fp_rand_myriads_last: } { ? \use_none_delimit_by_q_stop:w } \q_stop } \cs_new:Npn \__fp_rand_myriads_loop:nn #1#2 { \use_none:n #2 \exp_after:wN \__fp_rand_myriads_get:w \__int_value:w \__fp_rand_uniform: ; {#1}{#2} } \cs_new:Npn \__fp_rand_myriads_get:w #1 ; { \if_int_compare:w #1 < \c__fp_rand_eight_int \exp_after:wN \use_none:n \__int_value:w \__int_eval:w \c__fp_rand_eight_int + #1 \__int_eval_end: \exp_after:wN \use_i:nnn \else: \if_int_compare:w #1 < \c__fp_rand_four_int \exp_after:wN \use_none:nnnnn \__int_value:w \__int_eval:w \c__fp_rand_four_int + #1 \__int_eval_end: \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn \fi: \fi: \__fp_rand_myriads_loop:nn } \cs_new:Npn \__fp_rand_myriads_last: { \exp_after:wN \__fp_rand_myriads_last:w \__int_value:w \__fp_rand_uniform: ; } \cs_new:Npn \__fp_rand_myriads_last:w #1 ; { \if_int_compare:w #1 < \c__fp_rand_four_int \exp_after:wN \use_none:nnnnn \__int_value:w \__int_eval:w \c__fp_rand_four_int + #1 \__int_eval_end: \else: \exp_after:wN \__fp_rand_myriads_last: \fi: } \cs_new:Npn \__fp_rand_o:Nw ? #1 @ { \tl_if_empty:nTF {#1} { \__fp_rand_o: } { \__msg_kernel_expandable_error:nnnnn { kernel } { fp-num-args } { rand() } { 0 } { 0 } \exp_after:wN \c_nan_fp } } \cs_new:Npn \__fp_rand_o: { \__fp_parse_o:n { . \__fp_rand_myriads:n { xxxx } } } \cs_new:Npn \__fp_randint_o:Nw ? #1 @ { \if_case:w \__int_eval:w \__fp_array_count:n {#1} - 1 \__int_eval_end: \exp_after:wN \__fp_randint_e:w \c_one_fp #1 \or: \__fp_randint_e:w #1 \else: \__msg_kernel_expandable_error:nnnnn { kernel } { fp-num-args } { randint() } { 1 } { 2 } \exp_after:wN \c_nan_fp \exp:w \fi: \exp_after:wN \exp_end: } \cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3; { \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3; { \if_meaning:w 1 #1 \if_int_compare:w \use_i_delimit_by_q_stop:nw #3 \q_stop > \c__fp_prec_int 1 \exp_stop_f: \fi: \fi: } { 1 \exp_stop_f: } } \cs_new:Npn \__fp_randint_e:w #1; #2; { \if_case:w \__fp_randint_badarg:w #1; \__fp_randint_badarg:w #2; \fp_compare:nNnTF { #1; } > { #2; } { 1 } { 0 } \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__fp_randint_e:wnn \__fp_parse:n { #2; - #1; } { #1; } { #2; } \or: \__fp_invalid_operation_tl_o:ff { randint } { \__fp_array_to_clist:n { #1; #2; } } \exp:w \fi: } \cs_new:Npn \__fp_randint_e:wnn #1; { \exp_after:wN \__fp_randint_e:wwNnn \__int_value:w \__fp_rand_uniform: \exp_after:wN ; \exp:w \exp_end_continue_f:w \fp_compare:nNnTF { #1 ; } < \c__fp_rand_size_int { \fp_to_int:n { #1 ; + 1 } ; \__fp_randint_narrow_e:nnnn } { \fp_to_int:n { floor(#1 ; * 1e-8 + 1) } ; \__fp_randint_wide_e:nnnn } } \cs_new:Npn \__fp_randint_e:wwNnn #1 ; #2 ; { \exp_after:wN \__fp_randint_e:wwwNnn \__int_value:w \int_mod:nn {#1} {#2} ; #1 ; #2 ; } \cs_new:Npn \__fp_randint_e:wwwNnn #1 ; #2 ; #3 ; #4 { \int_compare:nNnTF { #2 - #1 + #3 } > \c__fp_rand_size_int { \exp_after:wN \__fp_randint_e:wwNnn \__int_value:w \__fp_rand_uniform: ; #3 ; #4 } { #4 {#1} {#3} } } \cs_new:Npn \__fp_randint_narrow_e:nnnn #1#2#3#4 { \__fp_parse_o:n { #3 + #1 } \exp:w } \cs_new:Npn \__fp_randint_wide_e:nnnn #1#2#3#4 { \exp_after:wN \exp_after:wN \exp_after:wN \__fp_randint_wide_e:wnnn \__fp_parse:n { #3 + #1e8 + \__fp_rand_myriads:n { xx } } {#2} {#3} {#4} } \cs_new:Npn \__fp_randint_wide_e:wnnn #1 ; #2#3#4 { \fp_compare:nNnTF { #1 ; } > {#4} { \exp_after:wN \__fp_randint_e:wwNnn \__int_value:w \__fp_rand_uniform: ; #2 ; \__fp_randint_wide_e:nnnn {#3} {#4} } { \__fp_exp_after_o:w #1 ; \exp:w } } } %% File: l3fp-assign.dtx Copyright (C) 2011-2017 The LaTeX3 project \cs_new_protected:Npn \fp_new:N #1 { \cs_new_eq:NN #1 \c_zero_fp } \cs_generate_variant:Nn \fp_new:N {c} \cs_new_protected:Npn \fp_set:Nn #1#2 { \tl_set:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_new_protected:Npn \fp_gset:Nn #1#2 { \tl_gset:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_new_protected:Npn \fp_const:Nn #1#2 { \tl_const:Nx #1 { \exp_not:f { \__fp_parse:n {#2} } } } \cs_generate_variant:Nn \fp_set:Nn {c} \cs_generate_variant:Nn \fp_gset:Nn {c} \cs_generate_variant:Nn \fp_const:Nn {c} \cs_new_eq:NN \fp_set_eq:NN \tl_set_eq:NN \cs_new_eq:NN \fp_gset_eq:NN \tl_gset_eq:NN \cs_generate_variant:Nn \fp_set_eq:NN { c , Nc , cc } \cs_generate_variant:Nn \fp_gset_eq:NN { c , Nc , cc } \cs_new_protected:Npn \fp_zero:N #1 { \fp_set_eq:NN #1 \c_zero_fp } \cs_new_protected:Npn \fp_gzero:N #1 { \fp_gset_eq:NN #1 \c_zero_fp } \cs_generate_variant:Nn \fp_zero:N { c } \cs_generate_variant:Nn \fp_gzero:N { c } \cs_new_protected:Npn \fp_zero_new:N #1 { \fp_if_exist:NTF #1 { \fp_zero:N #1 } { \fp_new:N #1 } } \cs_new_protected:Npn \fp_gzero_new:N #1 { \fp_if_exist:NTF #1 { \fp_gzero:N #1 } { \fp_new:N #1 } } \cs_generate_variant:Nn \fp_zero_new:N { c } \cs_generate_variant:Nn \fp_gzero_new:N { c } \cs_new_protected:Npn \fp_add:Nn { \__fp_add:NNNn \fp_set:Nn + } \cs_new_protected:Npn \fp_gadd:Nn { \__fp_add:NNNn \fp_gset:Nn + } \cs_new_protected:Npn \fp_sub:Nn { \__fp_add:NNNn \fp_set:Nn - } \cs_new_protected:Npn \fp_gsub:Nn { \__fp_add:NNNn \fp_gset:Nn - } \cs_new_protected:Npn \__fp_add:NNNn #1#2#3#4 { #1 #3 { #3 #2 \__fp_parse:n {#4} } } \cs_generate_variant:Nn \fp_add:Nn { c } \cs_generate_variant:Nn \fp_gadd:Nn { c } \cs_generate_variant:Nn \fp_sub:Nn { c } \cs_generate_variant:Nn \fp_gsub:Nn { c } \cs_new_protected:Npn \fp_show:N { \__fp_show:NN \tl_show:n } \cs_generate_variant:Nn \fp_show:N { c } \cs_new_protected:Npn \fp_log:N { \__fp_show:NN \tl_log:n } \cs_generate_variant:Nn \fp_log:N { c } \cs_new_protected:Npn \__fp_show:NN #1#2 { \__kernel_check_defined:NT #2 { \exp_args:Nx #1 { \token_to_str:N #2 = \fp_to_tl:N #2 } } } \cs_new_protected:Npn \fp_show:n { \msg_show_eval:Nn \fp_to_tl:n } \cs_new_protected:Npn \fp_log:n { \msg_log_eval:Nn \fp_to_tl:n } \fp_const:Nn \c_e_fp { 2.718 2818 2845 9045 } \fp_const:Nn \c_one_fp { 1 } \fp_const:Nn \c_pi_fp { 3.141 5926 5358 9793 } \fp_const:Nn \c_one_degree_fp { 0.0 1745 3292 5199 4330 } \fp_new:N \l_tmpa_fp \fp_new:N \l_tmpb_fp \fp_new:N \g_tmpa_fp \fp_new:N \g_tmpb_fp %% File l3sort.dtx (C) Copyright 2012-2017 The LaTeX3 Project \int_new:N \l__sort_length_int \int_new:N \l__sort_min_int \int_new:N \l__sort_top_int \int_new:N \l__sort_max_int \int_new:N \l__sort_true_max_int \int_new:N \l__sort_block_int \int_new:N \l__sort_begin_int \int_new:N \l__sort_end_int \int_new:N \l__sort_A_int \int_new:N \l__sort_B_int \int_new:N \l__sort_C_int \cs_new_protected:Npn \__sort_shrink_range: { \int_set:Nn \l__sort_A_int { \l__sort_true_max_int - \l__sort_min_int + 1 } \int_set:Nn \l__sort_block_int { \c_max_register_int / 2 } \__sort_shrink_range_loop: \int_set:Nn \l__sort_max_int { \int_compare:nNnTF { \l__sort_block_int * 3 / 2 } > \l__sort_A_int { \l__sort_min_int + ( \l__sort_A_int - 1 ) / 2 + \l__sort_block_int / 4 - 1 } { \l__sort_true_max_int - \l__sort_block_int / 2 } } } \cs_new_protected:Npn \__sort_shrink_range_loop: { \if_int_compare:w \l__sort_A_int < \l__sort_block_int \tex_divide:D \l__sort_block_int 2 \exp_stop_f: \exp_after:wN \__sort_shrink_range_loop: \fi: } \cs_new_protected:Npn \__sort_compute_range: { \int_set:Nn \l__sort_min_int { \tex_count:D 15 + 1 } \int_set:Nn \l__sort_true_max_int { \c_max_register_int + 1 } \__sort_shrink_range: \if_meaning:w \loctoks \tex_undefined:D \else: \if_meaning:w \loctoks \scan_stop: \else: \__sort_redefine_compute_range: \__sort_compute_range: \fi: \fi: } \cs_new_protected:Npn \__sort_redefine_compute_range: { \cs_if_exist:cTF { ver@elocalloc.sty } { \cs_gset_protected:Npn \__sort_compute_range: { \int_set:Nn \l__sort_min_int { \tex_count:D 265 } \int_set_eq:NN \l__sort_true_max_int \e@alloc@top \__sort_shrink_range: } } { \cs_gset_protected:Npn \__sort_compute_range: { \int_set:Nn \l__sort_min_int { \tex_count:D 265 } \int_set:Nn \l__sort_true_max_int { \tex_count:D 275 } \__sort_shrink_range: } } } \cs_if_exist:NT \loctoks { \__sort_redefine_compute_range: } \tl_map_inline:nn { \lastallocatedtoks \c_syst_last_allocated_toks } { \cs_if_exist:NT #1 { \cs_gset_protected:Npn \__sort_compute_range: { \int_set:Nn \l__sort_min_int { #1 + 1 } \int_set:Nn \l__sort_true_max_int { \c_max_register_int + 1 } \__sort_shrink_range: } } } \cs_new_protected:Npn \__sort_main:NNNnNn #1#2#3#4#5#6 { \group_begin: \__sort_disable_toksdef: \__sort_compute_range: \int_set_eq:NN \l__sort_top_int \l__sort_min_int #2 #5 { \if_int_compare:w \l__sort_top_int = \l__sort_max_int \__sort_too_long_error:NNw #3 #5 \fi: \tex_toks:D \l__sort_top_int {##1} \int_incr:N \l__sort_top_int } \int_set:Nn \l__sort_length_int { \l__sort_top_int - \l__sort_min_int } \cs_set:Npn \__sort_compare:nn ##1 ##2 { #6 } \int_set:Nn \l__sort_block_int { 1 } \__sort_level: \use:x { \group_end: #1 \exp_not:N #5 {#4} } } \cs_new_protected:Npn \seq_sort:Nn { \__sort_main:NNNnNn \tl_set:Nn \seq_map_inline:Nn \seq_map_break:n { \s__seq \__sort_toks:NN \exp_not:N \__seq_item:n } } \cs_generate_variant:Nn \seq_sort:Nn { c } \cs_new_protected:Npn \seq_gsort:Nn { \__sort_main:NNNnNn \tl_gset:Nn \seq_map_inline:Nn \seq_map_break:n { \s__seq \__sort_toks:NN \exp_not:N \__seq_item:n } } \cs_generate_variant:Nn \seq_gsort:Nn { c } \cs_new_protected:Npn \tl_sort:Nn { \__sort_main:NNNnNn \tl_set:Nn \tl_map_inline:Nn \tl_map_break:n { \__sort_toks:NN \prg_do_nothing: \prg_do_nothing: } } \cs_generate_variant:Nn \tl_sort:Nn { c } \cs_new_protected:Npn \tl_gsort:Nn { \__sort_main:NNNnNn \tl_gset:Nn \tl_map_inline:Nn \tl_map_break:n { \__sort_toks:NN \prg_do_nothing: \prg_do_nothing: } } \cs_generate_variant:Nn \tl_gsort:Nn { c } \cs_new_protected:Npn \clist_sort:Nn { \__sort_clist:NNn \tl_set:Nn } \cs_new_protected:Npn \clist_gsort:Nn { \__sort_clist:NNn \tl_gset:Nn } \cs_generate_variant:Nn \clist_sort:Nn { c } \cs_generate_variant:Nn \clist_gsort:Nn { c } \cs_new_protected:Npn \__sort_clist:NNn #1#2#3 { \clist_if_empty:NF #2 { \__sort_main:NNNnNn #1 \clist_map_inline:Nn \clist_map_break:n { \exp_last_unbraced:Nf \use_none:n { \__sort_toks:NN \exp_args:No \__clist_wrap_item:n } } #2 {#3} } } \cs_new:Npn \__sort_toks:NN #1#2 { \__sort_toks:NNw #1 #2 \l__sort_min_int ; } \cs_new:Npn \__sort_toks:NNw #1#2#3 ; { \if_int_compare:w #3 < \l__sort_top_int #1 #2 { \tex_the:D \tex_toks:D #3 } \exp_after:wN \__sort_toks:NNw \exp_after:wN #1 \exp_after:wN #2 \__int_value:w \__int_eval:w #3 + 1 \exp_after:wN ; \fi: } \cs_new_protected:Npn \__sort_level: { \if_int_compare:w \l__sort_block_int < \l__sort_length_int \l__sort_end_int \l__sort_min_int \__sort_merge_blocks: \tex_advance:D \l__sort_block_int \l__sort_block_int \exp_after:wN \__sort_level: \fi: } \cs_new_protected:Npn \__sort_merge_blocks: { \l__sort_begin_int \l__sort_end_int \tex_advance:D \l__sort_end_int \l__sort_block_int \if_int_compare:w \l__sort_end_int < \l__sort_top_int \l__sort_A_int \l__sort_end_int \tex_advance:D \l__sort_end_int \l__sort_block_int \if_int_compare:w \l__sort_end_int > \l__sort_top_int \l__sort_end_int \l__sort_top_int \fi: \l__sort_B_int \l__sort_A_int \l__sort_C_int \l__sort_top_int \__sort_copy_block: \int_decr:N \l__sort_A_int \int_decr:N \l__sort_B_int \int_decr:N \l__sort_C_int \exp_after:wN \__sort_merge_blocks_aux: \exp_after:wN \__sort_merge_blocks: \fi: } \cs_new_protected:Npn \__sort_copy_block: { \tex_toks:D \l__sort_C_int \tex_toks:D \l__sort_B_int \int_incr:N \l__sort_C_int \int_incr:N \l__sort_B_int \if_int_compare:w \l__sort_B_int = \l__sort_end_int \use_i:nn \fi: \__sort_copy_block: } \cs_new_protected:Npn \__sort_merge_blocks_aux: { \exp_after:wN \__sort_compare:nn \exp_after:wN { \tex_the:D \tex_toks:D \exp_after:wN \l__sort_A_int \exp_after:wN } \exp_after:wN { \tex_the:D \tex_toks:D \l__sort_C_int } \prg_do_nothing: \__sort_return_mark:N \__sort_return_mark:N \__sort_return_none_error: } \cs_new_protected:Npn \sort_return_same: #1 \__sort_return_mark:N { #1 \__sort_return_mark:N \__sort_return_two_error:w \__sort_return_same: } \cs_new_protected:Npn \sort_return_swapped: #1 \__sort_return_mark:N { #1 \__sort_return_mark:N \__sort_return_two_error:w \__sort_return_swapped: } \cs_new_protected:Npn \__sort_return_mark:N #1 { } \cs_new_protected:Npn \__sort_return_none_error: { \__msg_kernel_error:nnxx { kernel } { return-none } { \tex_the:D \tex_toks:D \l__sort_A_int } { \tex_the:D \tex_toks:D \l__sort_C_int } \__sort_return_same: } \cs_new_protected:Npn \__sort_return_two_error:w #1 \__sort_return_none_error: { \__msg_kernel_error:nn { kernel } { return-two } } \cs_new_protected:Npn \__sort_return_same: { \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int \int_decr:N \l__sort_B_int \int_decr:N \l__sort_C_int \if_int_compare:w \l__sort_C_int < \l__sort_top_int \use_i:nn \fi: \__sort_merge_blocks_aux: } \cs_new_protected:Npn \__sort_return_swapped: { \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_A_int \int_decr:N \l__sort_B_int \int_decr:N \l__sort_A_int \if_int_compare:w \l__sort_A_int < \l__sort_begin_int \__sort_merge_blocks_end: \use_i:nn \fi: \__sort_merge_blocks_aux: } \cs_new_protected:Npn \__sort_merge_blocks_end: { \tex_toks:D \l__sort_B_int \tex_toks:D \l__sort_C_int \int_decr:N \l__sort_B_int \int_decr:N \l__sort_C_int \if_int_compare:w \l__sort_B_int < \l__sort_begin_int \use_i:nn \fi: \__sort_merge_blocks_end: } \cs_new:Npn \tl_sort:nN #1#2 { \exp_not:f { \tl_if_blank:nF {#1} { \__sort_quick_prepare:Nnnn #2 { } { } #1 { \__prg_break_point: \__sort_quick_prepare_end:NNNnw } \q_stop } } } \cs_new:Npn \__sort_quick_prepare:Nnnn #1#2#3#4 { \__prg_break: #4 \__prg_break_point: \__sort_quick_prepare:Nnnn #1 { #2 #3 } { #1 {#4} } } \cs_new:Npn \__sort_quick_prepare_end:NNNnw #1#2#3#4#5 \q_stop { \__sort_quick_split:NnNn #4 \__sort_quick_end:nnTFNn { } \q_mark { \__sort_quick_cleanup:w \exp_stop_f: } \s__stop \q_stop } \cs_new:Npn \__sort_quick_cleanup:w #1 \s__stop \q_stop {#1} \cs_new:Npn \__sort_quick_split:NnNn #1#2#3#4 { #3 {#2} {#4} \__sort_quick_only_ii:NnnnnNn \__sort_quick_only_i:NnnnnNn \__sort_quick_single_end:nnnwnw { #3 {#4} } { } { } {#2} } \cs_new:Npn \__sort_quick_only_i:NnnnnNn #1#2#3#4#5#6#7 { #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_only_i:NnnnnNn \__sort_quick_only_i_end:nnnwnw { #6 {#7} } { #3 #2 } { } {#5} } \cs_new:Npn \__sort_quick_only_ii:NnnnnNn #1#2#3#4#5#6#7 { #6 {#5} {#7} \__sort_quick_only_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn \__sort_quick_only_ii_end:nnnwnw { #6 {#7} } { } { #4 #2 } {#5} } \cs_new:Npn \__sort_quick_split_i:NnnnnNn #1#2#3#4#5#6#7 { #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn \__sort_quick_split_end:nnnwnw { #6 {#7} } { #3 #2 } {#4} {#5} } \cs_new:Npn \__sort_quick_split_ii:NnnnnNn #1#2#3#4#5#6#7 { #6 {#5} {#7} \__sort_quick_split_ii:NnnnnNn \__sort_quick_split_i:NnnnnNn \__sort_quick_split_end:nnnwnw { #6 {#7} } {#3} { #4 #2 } {#5} } \cs_new:Npn \__sort_quick_end:nnTFNn #1#2#3#4#5#6 {#5} \cs_new:Npn \__sort_quick_single_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop { #5 {#3} #6 \q_stop } \cs_new:Npn \__sort_quick_only_i_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop { \__sort_quick_split:NnNn #1 \__sort_quick_end:nnTFNn { } \q_mark {#5} {#3} #6 \q_stop } \cs_new:Npn \__sort_quick_only_ii_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop { \__sort_quick_split:NnNn #2 \__sort_quick_end:nnTFNn { } \q_mark { #5 {#3} } #6 \q_stop } \cs_new:Npn \__sort_quick_split_end:nnnwnw #1#2#3#4 \q_mark #5#6 \q_stop { \__sort_quick_split:NnNn #2 \__sort_quick_end:nnTFNn { } \q_mark { \__sort_quick_split:NnNn #1 \__sort_quick_end:nnTFNn { } \q_mark {#5} {#3} } #6 \q_stop } \cs_new_protected:Npn \__sort_error: { \cs_set_eq:NN \__sort_merge_blocks_aux: \prg_do_nothing: \cs_set_eq:NN \__sort_merge_blocks: \prg_do_nothing: \cs_set_protected:Npn \__sort_level: \use:x ##1 { \group_end: } } \cs_new_protected:Npn \__sort_disable_toksdef: { \cs_set_eq:NN \toksdef \__sort_disabled_toksdef:n } \cs_new_protected:Npn \__sort_disabled_toksdef:n #1 { \__msg_kernel_error:nnx { kernel } { toksdef } { \token_to_str:N #1 } \__sort_error: \tex_toksdef:D #1 } \__msg_kernel_new:nnnn { kernel } { toksdef } { Allocation~of~\iow_char:N\\toks~registers~impossible~while~sorting. } { The~comparison~code~used~for~sorting~a~list~has~attempted~to~ define~#1~as~a~new~\iow_char:N\\toks~register~using~\iow_char:N\\newtoks~ or~a~similar~command.~The~list~will~not~be~sorted. } \cs_new_protected:Npn \__sort_too_long_error:NNw #1#2 \fi: { \fi: \__msg_kernel_error:nnxxx { kernel } { too-large } { \token_to_str:N #2 } { \int_eval:n { \l__sort_true_max_int - \l__sort_min_int } } { \int_eval:n { \l__sort_top_int - \l__sort_min_int } } #1 \__sort_error: } \__msg_kernel_new:nnnn { kernel } { too-large } { The~list~#1~is~too~long~to~be~sorted~by~TeX. } { TeX~has~#2~toks~registers~still~available:~ this~only~allows~to~sort~with~up~to~#3~ items.~All~extra~items~will~be~deleted. } \__msg_kernel_new:nnnn { kernel } { return-none } { The~comparison~code~did~not~return. } { When~sorting~a~list,~the~code~to~compare~items~#1~and~#2~ did~not~call~ \iow_char:N\\sort_return_same: ~nor~ \iow_char:N\\sort_return_swapped: .~ Exactly~one~of~these~should~be~called. } \__msg_kernel_new:nnnn { kernel } { return-two } { The~comparison~code~returned~multiple~times. } { When~sorting~a~list,~the~code~to~compare~items~called~ \iow_char:N\\sort_return_same: ~or~ \iow_char:N\\sort_return_swapped: ~multiple~times.~ Exactly~one~of~these~should~be~called. } \__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_same: } \cs_new_protected:Npn \sort_ordered: { \sort_return_same: } \__debug_deprecation:nnNNpn { 2018-12-31 } { \sort_return_swapped: } \cs_new_protected:Npn \sort_reversed: { \sort_return_swapped: } %% File: l3tl-build.dtx Copyright (C) 2011-2017 The LaTeX3 Project \int_new:N \l__tl_build_start_index_int \int_new:N \l__tl_build_index_int \tl_new:N \l__tl_build_result_tl \cs_new_protected:Npn \__tl_build_unpack: { \tl_put_right:Nx \l__tl_build_result_tl { \exp_after:wN \__tl_build_unpack_loop:w \int_use:N \l__tl_build_start_index_int ; \__prg_break_point: } } \cs_new:Npn \__tl_build_unpack_loop:w #1 ; { \if_int_compare:w #1 = \l__tl_build_index_int \exp_after:wN \__prg_break: \fi: \tex_the:D \tex_toks:D #1 \exp_stop_f: \exp_after:wN \__tl_build_unpack_loop:w \int_use:N \__int_eval:w #1 + 1 ; } \cs_new_protected:Npn \__tl_build:Nw { \__tl_build_aux:NNw \tl_set:Nn } \cs_new_protected:Npn \__tl_build_x:Nw { \__tl_build_aux:NNw \tl_set:Nx } \cs_new_protected:Npn \__tl_gbuild:Nw { \__tl_build_aux:NNw \tl_gset:Nn } \cs_new_protected:Npn \__tl_gbuild_x:Nw { \__tl_build_aux:NNw \tl_gset:Nx } \cs_new_protected:Npn \__tl_build_aux:NNw #1#2 { \group_begin: \cs_set:Npn \__tl_build_end_assignment:n { \group_end: #1 #2 } \int_zero:N \l__tl_build_start_index_int \int_zero:N \l__tl_build_index_int \tl_clear:N \l__tl_build_result_tl } \cs_new_protected:Npn \__tl_build_end: { \__tl_build_unpack: \exp_args:No \__tl_build_end_assignment:n \l__tl_build_result_tl } \cs_new_eq:NN \__tl_build_end_assignment:n \use_none:n \cs_new_protected:Npn \__tl_build_one:n #1 { \tex_toks:D \l__tl_build_index_int {#1} \int_incr:N \l__tl_build_index_int \if_int_compare:w \l__tl_build_index_int > \c_max_register_int \__tl_build_unpack: \l__tl_build_index_int \l__tl_build_start_index_int \fi: } \cs_new_protected:Npn \__tl_build_one:o #1 { \tex_toks:D \l__tl_build_index_int \exp_after:wN {#1} \int_incr:N \l__tl_build_index_int \if_int_compare:w \l__tl_build_index_int > \c_max_register_int \__tl_build_unpack: \l__tl_build_index_int \l__tl_build_start_index_int \fi: } \cs_new_protected:Npn \__tl_build_one:x #1 { \use:x { \__tl_build_one:n {#1} } } %% File: l3tl-analysis.dtx Copyright (C) 2011-2017 The LaTeX3 Project% \__scan_new:N \s__tl \tl_new:N \l__tl_analysis_internal_tl \cs_new_eq:NN \l__tl_analysis_token ? \cs_new_eq:NN \l__tl_analysis_char_token ? \int_new:N \l__tl_analysis_normal_int \int_new:N \l__tl_analysis_index_int \int_new:N \l__tl_analysis_nesting_int \int_new:N \l__tl_analysis_type_int \tl_new:N \g__tl_analysis_result_tl \cs_new:Npn \__tl_analysis_extract_charcode: { \exp_after:wN \__tl_analysis_extract_charcode_aux:w \token_to_meaning:N \l__tl_analysis_token } \cs_new:Npn \__tl_analysis_extract_charcode_aux:w #1 ~ #2 ~ { ` } \cs_new:Npn \__tl_analysis_cs_space_count:NN #1 #2 { \exp_after:wN #1 \__int_value:w \__int_eval:w 0 \exp_after:wN \__tl_analysis_cs_space_count:w \token_to_str:N #2 \fi: \__tl_analysis_cs_space_count_end:w ; ~ ! } \cs_new:Npn \__tl_analysis_cs_space_count:w #1 ~ { \if_false: #1 #1 \fi: + 1 \__tl_analysis_cs_space_count:w } \cs_new:Npn \__tl_analysis_cs_space_count_end:w ; #1 \fi: #2 ! { \exp_after:wN ; \__int_value:w \str_count_ignore_spaces:n {#1} ; } \cs_new_protected:Npn \__tl_analysis:n #1 { \group_begin: \group_align_safe_begin: \__tl_analysis_a:n {#1} \__tl_analysis_b:n {#1} \group_align_safe_end: \group_end: } \group_begin: \char_set_catcode_active:N \^^@ \cs_new_protected:Npn \__tl_analysis_disable:n #1 { \tex_lccode:D 0 = #1 \exp_stop_f: \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D } \cs_if_exist:NT \ptex_kanjiskip:D { \cs_gset_protected:Npn \__tl_analysis_disable:n #1 { \if_int_compare:w 256 > #1 \exp_stop_f: \tex_lccode:D 0 = #1 \exp_stop_f: \tex_lowercase:D { \tex_let:D ^^@ } \tex_undefined:D \fi: } } \group_end: \cs_new_protected:Npn \__tl_analysis_a:n #1 { \__tl_analysis_disable:n { 32 } \int_set:Nn \tex_escapechar:D { 92 } \int_zero:N \l__tl_analysis_normal_int \int_zero:N \l__tl_analysis_index_int \int_zero:N \l__tl_analysis_nesting_int \if_false: { \fi: \__tl_analysis_a_loop:w #1 } \int_decr:N \l__tl_analysis_index_int } \cs_new_protected:Npn \__tl_analysis_a_loop:w { \tex_futurelet:D \l__tl_analysis_token \__tl_analysis_a_type:w } \cs_new_protected:Npn \__tl_analysis_a_type:w { \l__tl_analysis_type_int = \if_meaning:w \l__tl_analysis_token \c_space_token 0 \else: \if_catcode:w \exp_not:N \l__tl_analysis_token \c_group_begin_token 1 \else: \if_catcode:w \exp_not:N \l__tl_analysis_token \c_group_end_token - 1 \else: 2 \fi: \fi: \fi: \exp_stop_f: \if_case:w \l__tl_analysis_type_int \exp_after:wN \__tl_analysis_a_space:w \or: \exp_after:wN \__tl_analysis_a_bgroup:w \or: \exp_after:wN \__tl_analysis_a_safe:N \else: \exp_after:wN \__tl_analysis_a_egroup:w \fi: } \cs_new_protected:Npn \__tl_analysis_a_space:w { \tex_afterassignment:D \__tl_analysis_a_space_test:w \exp_after:wN \cs_set_eq:NN \exp_after:wN \l__tl_analysis_char_token \token_to_str:N } \cs_new_protected:Npn \__tl_analysis_a_space_test:w { \if_meaning:w \l__tl_analysis_char_token \c_space_token \tex_toks:D \l__tl_analysis_index_int { \exp_not:n { ~ } } \__tl_analysis_a_store: \else: \int_incr:N \l__tl_analysis_normal_int \fi: \__tl_analysis_a_loop:w } \group_begin: \char_set_catcode_group_begin:N \^^@ % { \cs_new_protected:Npn \__tl_analysis_a_bgroup:w { \__tl_analysis_a_group:nw { \exp_after:wN ^^@ \if_false: } \fi: } } \char_set_catcode_group_end:N \^^@ \cs_new_protected:Npn \__tl_analysis_a_egroup:w { \__tl_analysis_a_group:nw { \if_false: { \fi: ^^@ } } % } \group_end: \cs_new_protected:Npn \__tl_analysis_a_group:nw #1 { \tex_lccode:D 0 = \__tl_analysis_extract_charcode: \scan_stop: \tex_lowercase:D { \tex_toks:D \l__tl_analysis_index_int {#1} } \if_int_compare:w \tex_lccode:D 0 = \tex_escapechar:D \int_set:Nn \tex_escapechar:D { 139 - \tex_escapechar:D } \fi: \__tl_analysis_disable:n { \tex_lccode:D 0 } \tex_futurelet:D \l__tl_analysis_token \__tl_analysis_a_group_aux:w } \cs_new_protected:Npn \__tl_analysis_a_group_aux:w { \if_meaning:w \l__tl_analysis_token \tex_undefined:D \exp_after:wN \__tl_analysis_a_safe:N \else: \exp_after:wN \__tl_analysis_a_group_auxii:w \fi: } \cs_new_protected:Npn \__tl_analysis_a_group_auxii:w { \tex_afterassignment:D \__tl_analysis_a_group_test:w \exp_after:wN \cs_set_eq:NN \exp_after:wN \l__tl_analysis_char_token \token_to_str:N } \cs_new_protected:Npn \__tl_analysis_a_group_test:w { \if_charcode:w \l__tl_analysis_token \l__tl_analysis_char_token \__tl_analysis_a_store: \else: \int_incr:N \l__tl_analysis_normal_int \fi: \__tl_analysis_a_loop:w } \cs_new_protected:Npn \__tl_analysis_a_store: { \tex_advance:D \l__tl_analysis_nesting_int \l__tl_analysis_type_int \if_int_compare:w \tex_lccode:D 0 = `\ \exp_stop_f: \tex_advance:D \l__tl_analysis_type_int \l__tl_analysis_type_int \fi: \tex_skip:D \l__tl_analysis_index_int = \l__tl_analysis_normal_int sp plus \l__tl_analysis_type_int sp \scan_stop: \int_incr:N \l__tl_analysis_index_int \int_zero:N \l__tl_analysis_normal_int \if_int_compare:w \l__tl_analysis_nesting_int = -1 \exp_stop_f: \cs_set_eq:NN \__tl_analysis_a_loop:w \scan_stop: \fi: } \cs_new_protected:Npn \__tl_analysis_a_safe:N #1 { \if_charcode:w \scan_stop: \exp_after:wN \use_none:n \token_to_str:N #1 \prg_do_nothing: \scan_stop: \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: { \__tl_analysis_disable:n { `#1 } \int_incr:N \l__tl_analysis_normal_int } { \__tl_analysis_cs_space_count:NN \__tl_analysis_a_cs:ww #1 } \__tl_analysis_a_loop:w } \cs_new_protected:Npn \__tl_analysis_a_cs:ww #1; #2; { \if_int_compare:w #1 > 0 \exp_stop_f: \tex_skip:D \l__tl_analysis_index_int = \__int_eval:w \l__tl_analysis_normal_int + 1 sp \scan_stop: \tex_advance:D \l__tl_analysis_index_int #1 \exp_stop_f: \else: \tex_advance:D \fi: \l__tl_analysis_normal_int #2 \exp_stop_f: } \cs_new_protected:Npn \__tl_analysis_b:n #1 { \tl_gset:Nx \g__tl_analysis_result_tl { \__tl_analysis_b_loop:w 0; #1 \__prg_break_point: } } \cs_new:Npn \__tl_analysis_b_loop:w #1; { \exp_after:wN \__tl_analysis_b_normals:ww \__int_value:w \tex_skip:D #1 ; #1 ; } \cs_new:Npn \__tl_analysis_b_normals:ww #1; { \if_int_compare:w #1 = 0 \exp_stop_f: \__tl_analysis_b_special:w \fi: \__tl_analysis_b_normal:wwN #1; } \cs_new:Npn \__tl_analysis_b_normal:wwN #1; #2; #3 { \exp_not:n { \exp_not:n { #3 } } \s__tl \if_charcode:w \scan_stop: \exp_after:wN \use_none:n \token_to_str:N #3 \prg_do_nothing: \scan_stop: \exp_after:wN \__tl_analysis_b_char:Nww \else: \exp_after:wN \__tl_analysis_b_cs:Nww \fi: #3 #1; #2; } \cs_new:Npx \__tl_analysis_b_char:Nww #1 { \exp_not:N \if_meaning:w #1 \exp_not:N \tex_undefined:D \token_to_str:N D \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_catcode_other_token \token_to_str:N C \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_catcode_letter_token \token_to_str:N B \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_math_toggle_token 3 \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_alignment_token 4 \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_math_superscript_token 7 \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_math_subscript_token 8 \exp_not:N \else: \exp_not:N \if_catcode:w #1 \c_space_token \token_to_str:N A \exp_not:N \else: 6 \exp_not:n { \fi: \fi: \fi: \fi: \fi: \fi: \fi: \fi: } \exp_not:N \__int_value:w `#1 \s__tl \exp_not:N \exp_after:wN \exp_not:N \__tl_analysis_b_normals:ww \exp_not:N \__int_value:w \exp_not:N \__int_eval:w - 1 + } \cs_new:Npn \__tl_analysis_b_cs:Nww #1 { 0 -1 \s__tl \__tl_analysis_cs_space_count:NN \__tl_analysis_b_cs_test:ww #1 } \cs_new:Npn \__tl_analysis_b_cs_test:ww #1 ; #2 ; #3 ; #4 ; { \exp_after:wN \__tl_analysis_b_normals:ww \__int_value:w \__int_eval:w \if_int_compare:w #1 = 0 \exp_stop_f: #3 \else: \tex_skip:D \__int_eval:w #4 + #1 \__int_eval_end: \fi: - #2 \exp_after:wN ; \__int_value:w \__int_eval:w #4 + #1 ; } \group_begin: \char_set_catcode_other:N A \cs_new:Npn \__tl_analysis_b_special:w \fi: \__tl_analysis_b_normal:wwN 0 ; #1 ; { \fi: \if_int_compare:w #1 = \l__tl_analysis_index_int \exp_after:wN \__prg_break: \fi: \tex_the:D \tex_toks:D #1 \s__tl \if_case:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f: \token_to_str:N A \or: 1 \or: 1 \else: 2 \fi: \if_int_odd:w \etex_gluestretch:D \tex_skip:D #1 \exp_stop_f: \exp_after:wN \__tl_analysis_b_special_char:wN \__int_value:w \else: \exp_after:wN \__tl_analysis_b_special_space:w \__int_value:w \fi: \__int_eval:w 1 + #1 \exp_after:wN ; \token_to_str:N } \group_end: \cs_new:Npn \__tl_analysis_b_special_char:wN #1 ; #2 { \__int_value:w `#2 \s__tl \__tl_analysis_b_loop:w #1 ; } \cs_new:Npn \__tl_analysis_b_special_space:w #1 ; ~ { 32 \s__tl \__tl_analysis_b_loop:w #1 ; } \cs_new_protected:Npn \__tl_analysis_map_inline:nn #1 { \__tl_analysis:n {#1} \int_gincr:N \g__prg_map_int \exp_args:Nc \__tl_analysis_map_inline_aux:Nn { __tl_analysis_map_inline_ \int_use:N \g__prg_map_int :wNw } } \cs_new_protected:Npn \__tl_analysis_map_inline_aux:Nn #1#2 { \cs_gset_protected:Npn #1 ##1 \s__tl ##2 ##3 \s__tl { \use_none:n ##2 #2 #1 } \exp_after:wN #1 \g__tl_analysis_result_tl \s__tl { ? \tl_map_break: } \s__tl \__prg_break_point:Nn \tl_map_break: { \int_gdecr:N \g__prg_map_int } } \cs_new_protected:Npn \tl_show_analysis:N #1 { \tl_if_exist:NTF #1 { \exp_args:No \__tl_analysis:n {#1} \msg_show:nnxxxx { LaTeX / kernel } { show-tl-analysis } { \token_to_str:N #1 } { \__tl_analysis_show: } { } { } } { \tl_show:N #1 } } \cs_new_protected:Npn \tl_show_analysis:n #1 { \__tl_analysis:n {#1} \msg_show:nnxxxx { LaTeX / kernel } { show-tl-analysis } { } { \__tl_analysis_show: } { } { } } \cs_new:Npn \__tl_analysis_show: { \exp_after:wN \__tl_analysis_show_loop:wNw \g__tl_analysis_result_tl \s__tl { ? \__prg_break: } \s__tl \__prg_break_point: } \cs_new:Npn \__tl_analysis_show_loop:wNw #1 \s__tl #2 #3 \s__tl { \use_none:n #2 \iow_newline: > \use:nn { ~ } { ~ } \if_int_compare:w "#2 = 0 \exp_stop_f: \exp_after:wN \__tl_analysis_show_cs:n \else: \if_int_compare:w "#2 = 13 \exp_stop_f: \exp_after:wN \exp_after:wN \exp_after:wN \__tl_analysis_show_active:n \else: \exp_after:wN \exp_after:wN \exp_after:wN \__tl_analysis_show_normal:n \fi: \fi: {#1} \__tl_analysis_show_loop:wNw } \cs_new:Npn \__tl_analysis_show_normal:n #1 { \exp_after:wN \token_to_str:N #1 ~ ( \exp_after:wN \token_to_meaning:N #1 ) } \cs_new:Npn \__tl_analysis_show_value:N #1 { \token_if_expandable:NF #1 { \token_if_chardef:NTF #1 \__prg_break: { } \token_if_mathchardef:NTF #1 \__prg_break: { } \token_if_dim_register:NTF #1 \__prg_break: { } \token_if_int_register:NTF #1 \__prg_break: { } \token_if_skip_register:NTF #1 \__prg_break: { } \token_if_toks_register:NTF #1 \__prg_break: { } \use_none:nnn \__prg_break_point: \use:n { \exp_after:wN = \tex_the:D #1 } } } \cs_new:Npn \__tl_analysis_show_cs:n #1 { \exp_args:No \__tl_analysis_show_long:nn {#1} { control~sequence= } } \cs_new:Npn \__tl_analysis_show_active:n #1 { \exp_args:No \__tl_analysis_show_long:nn {#1} { active~character= } } \cs_new:Npn \__tl_analysis_show_long:nn #1 { \__tl_analysis_show_long_aux:oofn { \token_to_str:N #1 } { \token_to_meaning:N #1 } { \__tl_analysis_show_value:N #1 } } \cs_new:Npn \__tl_analysis_show_long_aux:nnnn #1#2#3#4 { \int_compare:nNnTF { \str_count:n { #1 ~ ( #4 #2 #3 ) } } > { \l_iow_line_count_int - 3 } { \str_range:nnn { #1 ~ ( #4 #2 #3 ) } { 1 } { \l_iow_line_count_int - 3 - \str_count:N \c__tl_analysis_show_etc_str } \c__tl_analysis_show_etc_str } { #1 ~ ( #4 #2 #3 ) } } \cs_generate_variant:Nn \__tl_analysis_show_long_aux:nnnn { oof } \tl_const:Nx \c__tl_analysis_show_etc_str % ( { \token_to_str:N \ETC.) } \__msg_kernel_new:nnn { kernel } { show-tl-analysis } { The~token~list~ \tl_if_empty:nF {#1} { #1 ~ } \tl_if_empty:nTF {#2} { is~empty } { contains~the~tokens: #2 } } %% File: l3regex.dtx Copyright (C) 2011-2017 The LaTeX3 Project \cs_new_protected:Npn \__regex_standard_escapechar: { \int_set:Nn \tex_escapechar:D { `\\ } } \cs_new:Npn \__regex_toks_use:w { \tex_the:D \tex_toks:D } \cs_new_protected:Npn \__regex_toks_clear:N #1 { \tex_toks:D #1 { } } \cs_new_eq:NN \__regex_toks_set:Nn \tex_toks:D \cs_new_protected:Npn \__regex_toks_set:No #1 { \__regex_toks_set:Nn #1 \exp_after:wN } \cs_new_protected:Npn \__regex_toks_memcpy:NNn #1#2#3 { \prg_replicate:nn {#3} { \tex_toks:D #1 = \tex_toks:D #2 \int_incr:N #1 \int_incr:N #2 } } \cs_new_protected:Npn \__regex_toks_put_left:Nx #1#2 { \cs_set:Npx \__regex_tmp:w { #2 } \tex_toks:D #1 \exp_after:wN \exp_after:wN \exp_after:wN { \exp_after:wN \__regex_tmp:w \tex_the:D \tex_toks:D #1 } } \cs_new_protected:Npn \__regex_toks_put_right:Nx #1#2 { \cs_set:Npx \__regex_tmp:w {#2} \tex_toks:D #1 \exp_after:wN { \tex_the:D \tex_toks:D \exp_after:wN #1 \__regex_tmp:w } } \cs_new_protected:Npn \__regex_toks_put_right:Nn #1#2 { \tex_toks:D #1 \exp_after:wN { \tex_the:D \tex_toks:D #1 #2 } } \cs_new:Npn \__regex_curr_cs_to_str: { \exp_after:wN \exp_after:wN \exp_after:wN \cs_to_str:N \tex_the:D \tex_toks:D \l__regex_curr_pos_int } \cs_new:Npn \__regex_tmp:w { } \tl_new:N \l__regex_internal_a_tl \tl_new:N \l__regex_internal_b_tl \int_new:N \l__regex_internal_a_int \int_new:N \l__regex_internal_b_int \int_new:N \l__regex_internal_c_int \bool_new:N \l__regex_internal_bool \seq_new:N \l__regex_internal_seq \tl_new:N \g__regex_internal_tl \tl_const:Nn \c__regex_no_match_regex { \__regex_branch:n { \__regex_class:NnnnN \c_true_bool { } { 1 } { 0 } \c_true_bool } } \__intarray_new:Nn \g__regex_charcode_intarray { 65536 } \__intarray_new:Nn \g__regex_catcode_intarray { 65536 } \__intarray_new:Nn \g__regex_balance_intarray { 65536 } \int_new:N \l__regex_balance_int \tl_new:N \l__regex_cs_name_tl \int_const:Nn \c__regex_ascii_min_int { 0 } \int_const:Nn \c__regex_ascii_max_control_int { 31 } \int_const:Nn \c__regex_ascii_max_int { 127 } \int_const:Nn \c__regex_ascii_lower_int { `a - `A } \cs_new_protected:Npn \__regex_break_true:w #1 \__regex_break_point:TF #2 #3 {#2} \cs_new_protected:Npn \__regex_break_point:TF #1 #2 { #2 } \cs_new_protected:Npn \__regex_item_reverse:n #1 { #1 \__regex_break_point:TF { } \__regex_break_true:w } \cs_new_protected:Npn \__regex_item_caseful_equal:n #1 { \if_int_compare:w #1 = \l__regex_curr_char_int \exp_after:wN \__regex_break_true:w \fi: } \cs_new_protected:Npn \__regex_item_caseful_range:nn #1 #2 { \reverse_if:N \if_int_compare:w #1 > \l__regex_curr_char_int \reverse_if:N \if_int_compare:w #2 < \l__regex_curr_char_int \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w \fi: \fi: } \cs_new_protected:Npn \__regex_item_caseless_equal:n #1 { \if_int_compare:w #1 = \l__regex_curr_char_int \exp_after:wN \__regex_break_true:w \fi: \if_int_compare:w \l__regex_case_changed_char_int = \c_max_int \__regex_compute_case_changed_char: \fi: \if_int_compare:w #1 = \l__regex_case_changed_char_int \exp_after:wN \__regex_break_true:w \fi: } \cs_new_protected:Npn \__regex_item_caseless_range:nn #1 #2 { \reverse_if:N \if_int_compare:w #1 > \l__regex_curr_char_int \reverse_if:N \if_int_compare:w #2 < \l__regex_curr_char_int \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w \fi: \fi: \if_int_compare:w \l__regex_case_changed_char_int = \c_max_int \__regex_compute_case_changed_char: \fi: \reverse_if:N \if_int_compare:w #1 > \l__regex_case_changed_char_int \reverse_if:N \if_int_compare:w #2 < \l__regex_case_changed_char_int \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w \fi: \fi: } \cs_new_protected:Npn \__regex_compute_case_changed_char: { \int_set_eq:NN \l__regex_case_changed_char_int \l__regex_curr_char_int \if_int_compare:w \l__regex_curr_char_int > `Z \exp_stop_f: \if_int_compare:w \l__regex_curr_char_int > `z \exp_stop_f: \else: \if_int_compare:w \l__regex_curr_char_int < `a \exp_stop_f: \else: \int_sub:Nn \l__regex_case_changed_char_int { \c__regex_ascii_lower_int } \fi: \fi: \else: \if_int_compare:w \l__regex_curr_char_int < `A \exp_stop_f: \else: \int_add:Nn \l__regex_case_changed_char_int { \c__regex_ascii_lower_int } \fi: \fi: } \cs_new_eq:NN \__regex_item_equal:n ? \cs_new_eq:NN \__regex_item_range:nn ? \cs_new_protected:Npn \__regex_item_catcode: { " \if_case:w \l__regex_curr_catcode_int 1 \or: 4 \or: 10 \or: 40 \or: 100 \or: \or: 1000 \or: 4000 \or: 10000 \or: \or: 100000 \or: 400000 \or: 1000000 \or: 4000000 \else: 1*0 \fi: } \cs_new_protected:Npn \__regex_item_catcode:nT #1 { \if_int_odd:w \__int_eval:n { #1 / \__regex_item_catcode: } \exp_after:wN \use:n \else: \exp_after:wN \use_none:n \fi: } \cs_new_protected:Npn \__regex_item_catcode_reverse:nT #1#2 { \__regex_item_catcode:nT {#1} { \__regex_item_reverse:n {#2} } } \cs_new_protected:Npn \__regex_item_exact:nn #1#2 { \if_int_compare:w #1 = \l__regex_curr_catcode_int \if_int_compare:w #2 = \l__regex_curr_char_int \exp_after:wN \exp_after:wN \exp_after:wN \__regex_break_true:w \fi: \fi: } \cs_new_protected:Npn \__regex_item_exact_cs:n #1 { \int_compare:nNnTF \l__regex_curr_catcode_int = 0 { \tl_set:Nx \l__regex_internal_a_tl { \scan_stop: \__regex_curr_cs_to_str: \scan_stop: } \tl_if_in:noTF { \scan_stop: #1 \scan_stop: } \l__regex_internal_a_tl { \__regex_break_true:w } { } } { } } \cs_new_protected:Npn \__regex_item_cs:n #1 { \int_compare:nNnT \l__regex_curr_catcode_int = 0 { \group_begin: \tl_set:Nx \l__regex_cs_name_tl { \__regex_curr_cs_to_str: } \__regex_single_match: \__regex_disable_submatches: \__regex_build_for_cs:n {#1} \bool_set_eq:NN \l__regex_saved_success_bool \g__regex_success_bool \exp_args:NV \__regex_match:n \l__regex_cs_name_tl \if_meaning:w \c_true_bool \g__regex_success_bool \group_insert_after:N \__regex_break_true:w \fi: \bool_gset_eq:NN \g__regex_success_bool \l__regex_saved_success_bool \group_end: } } \cs_new_protected:Npn \__regex_prop_d: { \__regex_item_caseful_range:nn { `0 } { `9 } } \cs_new_protected:Npn \__regex_prop_h: { \__regex_item_caseful_equal:n { `\ } \__regex_item_caseful_equal:n { `\^^I } } \cs_new_protected:Npn \__regex_prop_s: { \__regex_item_caseful_equal:n { `\ } \__regex_item_caseful_equal:n { `\^^I } \__regex_item_caseful_equal:n { `\^^J } \__regex_item_caseful_equal:n { `\^^L } \__regex_item_caseful_equal:n { `\^^M } } \cs_new_protected:Npn \__regex_prop_v: { \__regex_item_caseful_range:nn { `\^^J } { `\^^M } } % lf, vtab, ff, cr \cs_new_protected:Npn \__regex_prop_w: { \__regex_item_caseful_range:nn { `a } { `z } \__regex_item_caseful_range:nn { `A } { `Z } \__regex_item_caseful_range:nn { `0 } { `9 } \__regex_item_caseful_equal:n { `_ } } \cs_new_protected:Npn \__regex_prop_N: { \__regex_item_reverse:n { \__regex_item_caseful_equal:n { `\^^J } } } \cs_new_protected:Npn \__regex_posix_alnum: { \__regex_posix_alpha: \__regex_posix_digit: } \cs_new_protected:Npn \__regex_posix_alpha: { \__regex_posix_lower: \__regex_posix_upper: } \cs_new_protected:Npn \__regex_posix_ascii: { \__regex_item_caseful_range:nn \c__regex_ascii_min_int \c__regex_ascii_max_int } \cs_new_eq:NN \__regex_posix_blank: \__regex_prop_h: \cs_new_protected:Npn \__regex_posix_cntrl: { \__regex_item_caseful_range:nn \c__regex_ascii_min_int \c__regex_ascii_max_control_int \__regex_item_caseful_equal:n \c__regex_ascii_max_int } \cs_new_eq:NN \__regex_posix_digit: \__regex_prop_d: \cs_new_protected:Npn \__regex_posix_graph: { \__regex_item_caseful_range:nn { `! } { `\~ } } \cs_new_protected:Npn \__regex_posix_lower: { \__regex_item_caseful_range:nn { `a } { `z } } \cs_new_protected:Npn \__regex_posix_print: { \__regex_item_caseful_range:nn { `\ } { `\~ } } \cs_new_protected:Npn \__regex_posix_punct: { \__regex_item_caseful_range:nn { `! } { `/ } \__regex_item_caseful_range:nn { `: } { `@ } \__regex_item_caseful_range:nn { `[ } { `` } \__regex_item_caseful_range:nn { `\{ } { `\~ } } \cs_new_protected:Npn \__regex_posix_space: { \__regex_item_caseful_equal:n { `\ } \__regex_item_caseful_range:nn { `\^^I } { `\^^M } } \cs_new_protected:Npn \__regex_posix_upper: { \__regex_item_caseful_range:nn { `A } { `Z } } \cs_new_eq:NN \__regex_posix_word: \__regex_prop_w: \cs_new_protected:Npn \__regex_posix_xdigit: { \__regex_posix_digit: \__regex_item_caseful_range:nn { `A } { `F } \__regex_item_caseful_range:nn { `a } { `f } } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_escape_use:nnnn \__tl_build:Nw \l__regex_internal_a_tl \__tl_build_one:n { \__debug_trace_pop:nnN { regex } { 1 } \__regex_escape_use:nnnn } \use_none:nn } { } \cs_new_protected:Npn \__regex_escape_use:nnnn #1#2#3#4 { \__tl_build:Nw \l__regex_internal_a_tl \cs_set:Npn \__regex_escape_unescaped:N ##1 { #1 } \cs_set:Npn \__regex_escape_escaped:N ##1 { #2 } \cs_set:Npn \__regex_escape_raw:N ##1 { #3 } \__regex_standard_escapechar: \tl_gset:Nx \g__regex_internal_tl { \__str_to_other_fast:n {#4} } \tl_set:Nx \l__regex_internal_b_tl { \exp_after:wN \__regex_escape_loop:N \g__regex_internal_tl { break } \__prg_break_point: } \__tl_build_one:o \l__regex_internal_b_tl \__tl_build_end: \l__regex_internal_a_tl } \cs_new:Npn \__regex_escape_loop:N #1 { \cs_if_exist_use:cF { __regex_escape_\token_to_str:N #1:w } { \__regex_escape_unescaped:N #1 } \__regex_escape_loop:N } \cs_new:cpn { __regex_escape_ \c_backslash_str :w } \__regex_escape_loop:N #1 { \cs_if_exist_use:cF { __regex_escape_/\token_to_str:N #1:w } { \__regex_escape_escaped:N #1 } \__regex_escape_loop:N } \cs_new_eq:NN \__regex_escape_unescaped:N ? \cs_new_eq:NN \__regex_escape_escaped:N ? \cs_new_eq:NN \__regex_escape_raw:N ? \cs_new_eq:NN \__regex_escape_break:w \__prg_break: \cs_new:cpn { __regex_escape_/break:w } { \if_false: { \fi: } \__msg_kernel_error:nn { kernel } { trailing-backslash } \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: } \cs_new:cpn { __regex_escape_~:w } { } \cs_new:cpx { __regex_escape_/a:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^G } \cs_new:cpx { __regex_escape_/t:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^I } \cs_new:cpx { __regex_escape_/n:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^J } \cs_new:cpx { __regex_escape_/f:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^L } \cs_new:cpx { __regex_escape_/r:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^M } \cs_new:cpx { __regex_escape_/e:w } { \exp_not:N \__regex_escape_raw:N \iow_char:N \^^[ } \cs_new:cpn { __regex_escape_/x:w } \__regex_escape_loop:N { \exp_after:wN \__regex_escape_x_end:w \__int_value:w "0 \__regex_escape_x_test:N } \cs_new:Npn \__regex_escape_x_end:w #1 ; { \int_compare:nNnTF {#1} > \c_max_char_int { \if_false: { \fi: } \__tl_build_one:o \l__regex_internal_b_tl \__msg_kernel_error:nnx { kernel } { x-overflow } {#1} \tl_set:Nx \l__regex_internal_b_tl { \if_false: } \fi: } { \exp_last_unbraced:Nf \__regex_escape_raw:N { \char_generate:nn {#1} { 12 } } } } \cs_new:Npn \__regex_escape_x_test:N #1 { \str_if_eq_x:nnTF {#1} { break } { ; } { \if_charcode:w \c_space_token #1 \exp_after:wN \__regex_escape_x_test:N \else: \exp_after:wN \__regex_escape_x_testii:N \exp_after:wN #1 \fi: } } \cs_new:Npn \__regex_escape_x_testii:N #1 { \if_charcode:w \c_left_brace_str #1 \exp_after:wN \__regex_escape_x_loop:N \else: \__regex_hexadecimal_use:NTF #1 { \exp_after:wN \__regex_escape_x:N } { ; \exp_after:wN \__regex_escape_loop:N \exp_after:wN #1 } \fi: } \cs_new:Npn \__regex_escape_x:N #1 { \str_if_eq_x:nnTF {#1} { break } { ; } { \__regex_hexadecimal_use:NTF #1 { ; \__regex_escape_loop:N } { ; \__regex_escape_loop:N #1 } } } \cs_new:Npn \__regex_escape_x_loop:N #1 { \str_if_eq_x:nnTF {#1} { break } { ; \__regex_escape_x_loop_error:n { } {#1} } { \__regex_hexadecimal_use:NTF #1 { \__regex_escape_x_loop:N } { \token_if_eq_charcode:NNTF \c_space_token #1 { \__regex_escape_x_loop:N } { ; \exp_after:wN \token_if_eq_charcode:NNTF \c_right_brace_str #1 { \__regex_escape_loop:N } { \__regex_escape_x_loop_error:n {#1} } } } } } \cs_new:Npn \__regex_escape_x_loop_error:n #1 { \if_false: { \fi: } \__tl_build_one:o \l__regex_internal_b_tl \__msg_kernel_error:nnx { kernel } { x-missing-rbrace } {#1} \tl_set:Nx \l__regex_internal_b_tl { \if_false: } \fi: \__regex_escape_loop:N #1 } \prg_new_conditional:Npnn \__regex_hexadecimal_use:N #1 { TF } { \if_int_compare:w 1 < "1 \token_to_str:N #1 \exp_stop_f: #1 \prg_return_true: \else: \if_case:w \__int_eval:n { \exp_after:wN ` \token_to_str:N #1 - `a } A \or: B \or: C \or: D \or: E \or: F \else: \prg_return_false: \exp_after:wN \use_none:n \fi: \prg_return_true: \fi: } \prg_new_conditional:Npnn \__regex_char_if_special:N #1 { TF } { \if_int_compare:w `#1 > `Z \exp_stop_f: \if_int_compare:w `#1 > `z \exp_stop_f: \if_int_compare:w `#1 < \c__regex_ascii_max_int \prg_return_true: \else: \prg_return_false: \fi: \else: \if_int_compare:w `#1 < `a \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: \fi: \else: \if_int_compare:w `#1 > `9 \exp_stop_f: \if_int_compare:w `#1 < `A \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: \else: \if_int_compare:w `#1 < `0 \exp_stop_f: \if_int_compare:w `#1 < `\ \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: \else: \prg_return_false: \fi: \fi: \fi: } \prg_new_conditional:Npnn \__regex_char_if_alphanumeric:N #1 { TF } { \if_int_compare:w `#1 > `Z \exp_stop_f: \if_int_compare:w `#1 > `z \exp_stop_f: \prg_return_false: \else: \if_int_compare:w `#1 < `a \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: \fi: \else: \if_int_compare:w `#1 > `9 \exp_stop_f: \if_int_compare:w `#1 < `A \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: \else: \if_int_compare:w `#1 < `0 \exp_stop_f: \prg_return_false: \else: \prg_return_true: \fi: \fi: \fi: } \int_new:N \l__regex_group_level_int \int_new:N \l__regex_mode_int \int_const:Nn \c__regex_cs_in_class_mode_int { -6 } \int_const:Nn \c__regex_cs_mode_int { -2 } \int_const:Nn \c__regex_outer_mode_int { 0 } \int_const:Nn \c__regex_catcode_mode_int { 2 } \int_const:Nn \c__regex_class_mode_int { 3 } \int_const:Nn \c__regex_catcode_in_class_mode_int { 6 } \int_new:N \l__regex_catcodes_int \int_new:N \l__regex_default_catcodes_int \bool_new:N \l__regex_catcodes_bool \int_const:Nn \c__regex_catcode_C_int { "1 } \int_const:Nn \c__regex_catcode_B_int { "4 } \int_const:Nn \c__regex_catcode_E_int { "10 } \int_const:Nn \c__regex_catcode_M_int { "40 } \int_const:Nn \c__regex_catcode_T_int { "100 } \int_const:Nn \c__regex_catcode_P_int { "1000 } \int_const:Nn \c__regex_catcode_U_int { "4000 } \int_const:Nn \c__regex_catcode_D_int { "10000 } \int_const:Nn \c__regex_catcode_S_int { "100000 } \int_const:Nn \c__regex_catcode_L_int { "400000 } \int_const:Nn \c__regex_catcode_O_int { "1000000 } \int_const:Nn \c__regex_catcode_A_int { "4000000 } \int_const:Nn \c__regex_all_catcodes_int { "5515155 } \cs_new_eq:NN \l__regex_internal_regex \c__regex_no_match_regex \seq_new:N \l__regex_show_prefix_seq \int_new:N \l__regex_show_lines_int \cs_new_protected:Npn \__regex_get_digits:NTFw #1#2#3#4#5 { \__regex_if_raw_digit:NNTF #4 #5 { #1 = #5 \__regex_get_digits_loop:nw {#2} } { #3 #4 #5 } } \cs_new:Npn \__regex_get_digits_loop:nw #1#2#3 { \__regex_if_raw_digit:NNTF #2 #3 { #3 \__regex_get_digits_loop:nw {#1} } { \scan_stop: #1 #2 #3 } } \prg_new_conditional:Npnn \__regex_if_raw_digit:NN #1#2 { TF } { \if_meaning:w \__regex_compile_raw:N #1 \if_int_compare:w 1 < 1 #2 \exp_stop_f: \prg_return_true: \else: \prg_return_false: \fi: \else: \prg_return_false: \fi: } \cs_new:Npn \__regex_if_in_class:TF { \if_int_odd:w \l__regex_mode_int \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: } \cs_new:Npn \__regex_if_in_cs:TF { \if_int_odd:w \l__regex_mode_int \exp_after:wN \use_ii:nn \else: \if_int_compare:w \l__regex_mode_int < \c__regex_outer_mode_int \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn \else: \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn \fi: \fi: } \cs_new:Npn \__regex_if_in_class_or_catcode:TF { \if_int_odd:w \l__regex_mode_int \exp_after:wN \use_i:nn \else: \if_int_compare:w \l__regex_mode_int > \c__regex_outer_mode_int \exp_after:wN \exp_after:wN \exp_after:wN \use_i:nn \else: \exp_after:wN \exp_after:wN \exp_after:wN \use_ii:nn \fi: \fi: } \cs_new:Npn \__regex_if_within_catcode:TF { \if_int_compare:w \l__regex_mode_int > \c__regex_outer_mode_int \exp_after:wN \use_i:nn \else: \exp_after:wN \use_ii:nn \fi: } \cs_new_protected:Npn \__regex_chk_c_allowed:T { \if_int_compare:w \l__regex_mode_int = \c__regex_outer_mode_int \exp_after:wN \use:n \else: \if_int_compare:w \l__regex_mode_int = \c__regex_class_mode_int \exp_after:wN \exp_after:wN \exp_after:wN \use:n \else: \__msg_kernel_error:nn { kernel } { c-bad-mode } \exp_after:wN \exp_after:wN \exp_after:wN \use_none:n \fi: \fi: } \cs_new_protected:Npn \__regex_mode_quit_c: { \if_int_compare:w \l__regex_mode_int = \c__regex_catcode_mode_int \int_set_eq:NN \l__regex_mode_int \c__regex_outer_mode_int \else: \if_int_compare:w \l__regex_mode_int = \c__regex_catcode_in_class_mode_int \int_set_eq:NN \l__regex_mode_int \c__regex_class_mode_int \fi: \fi: } \cs_new_protected:Npn \__regex_compile:w { \__tl_build_x:Nw \l__regex_internal_regex \int_zero:N \l__regex_group_level_int \int_set_eq:NN \l__regex_default_catcodes_int \c__regex_all_catcodes_int \int_set_eq:NN \l__regex_catcodes_int \l__regex_default_catcodes_int \cs_set:Npn \__regex_item_equal:n { \__regex_item_caseful_equal:n } \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseful_range:nn } \__tl_build_one:n { \__regex_branch:n { \if_false: } \fi: } } \cs_new_protected:Npn \__regex_compile_end: { \__regex_if_in_class:TF { \__msg_kernel_error:nn { kernel } { missing-rbrack } \use:c { __regex_compile_]: } \prg_do_nothing: \prg_do_nothing: } { } \if_int_compare:w \l__regex_group_level_int > 0 \exp_stop_f: \__msg_kernel_error:nnx { kernel } { missing-rparen } { \int_use:N \l__regex_group_level_int } \prg_replicate:nn { \l__regex_group_level_int } { \__tl_build_one:n { \if_false: { \fi: } \if_false: { \fi: } { 1 } { 0 } \c_true_bool } \__tl_build_end: \__tl_build_one:o \l__regex_internal_regex } \fi: \__tl_build_one:n { \if_false: { \fi: } } \__tl_build_end: } \cs_new_protected:Npn \__regex_compile:n #1 { \__regex_compile:w \__regex_standard_escapechar: \int_set_eq:NN \l__regex_mode_int \c__regex_outer_mode_int \__regex_escape_use:nnnn { \__regex_char_if_special:NTF ##1 \__regex_compile_special:N \__regex_compile_raw:N ##1 } { \__regex_char_if_alphanumeric:NTF ##1 \__regex_compile_escaped:N \__regex_compile_raw:N ##1 } { \__regex_compile_raw:N ##1 } { #1 } \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \int_compare:nNnT \l__regex_mode_int = \c__regex_catcode_mode_int { \__msg_kernel_error:nn { kernel } { c-trailing } } \int_compare:nNnT \l__regex_mode_int < \c__regex_outer_mode_int { \__msg_kernel_error:nn { kernel } { c-missing-rbrace } \__regex_compile_end_cs: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: \prg_do_nothing: } \__regex_compile_end: } \cs_new_protected:Npn \__regex_compile_special:N #1 { \cs_if_exist_use:cF { __regex_compile_#1: } { \__regex_compile_raw:N #1 } } \cs_new_protected:Npn \__regex_compile_escaped:N #1 { \cs_if_exist_use:cF { __regex_compile_/#1: } { \__regex_compile_raw:N #1 } } \cs_new_protected:Npn \__regex_compile_one:x #1 { \__regex_mode_quit_c: \__regex_if_in_class:TF { } { \__tl_build_one:n { \__regex_class:NnnnN \c_true_bool { \if_false: } \fi: } } \__tl_build_one:x { \if_int_compare:w \l__regex_catcodes_int < \c__regex_all_catcodes_int \__regex_item_catcode:nT { \int_use:N \l__regex_catcodes_int } { \exp_not:N \exp_not:n {#1} } \else: \exp_not:N \exp_not:n {#1} \fi: } \int_set_eq:NN \l__regex_catcodes_int \l__regex_default_catcodes_int \__regex_if_in_class:TF { } { \__regex_compile_quantifier:w } } \cs_new_protected:Npn \__regex_compile_abort_tokens:n #1 { \use:x { \exp_args:No \tl_map_function:nN { \tl_to_str:n {#1} } \__regex_compile_raw:N } } \cs_generate_variant:Nn \__regex_compile_abort_tokens:n { x } \cs_new_protected:Npn \__regex_compile_quantifier:w #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_compile_special:N { \cs_if_exist_use:cF { __regex_compile_quantifier_#2:w } { \__regex_compile_quantifier_none: #1 #2 } } { \__regex_compile_quantifier_none: #1 #2 } } \cs_new_protected:Npn \__regex_compile_quantifier_none: { \__tl_build_one:n { \if_false: { \fi: } { 1 } { 0 } \c_false_bool } } \cs_new_protected:Npn \__regex_compile_quantifier_abort:xNN #1#2#3 { \__regex_compile_quantifier_none: \__msg_kernel_warning:nnxx { kernel } { invalid-quantifier } {#1} {#3} \__regex_compile_abort_tokens:x {#1} #2 #3 } \cs_new_protected:Npn \__regex_compile_quantifier_lazyness:nnNN #1#2#3#4 { \str_if_eq:nnTF { #3 #4 } { \__regex_compile_special:N ? } { \__tl_build_one:n { \if_false: { \fi: } { #1 } { #2 } \c_true_bool } } { \__tl_build_one:n { \if_false: { \fi: } { #1 } { #2 } \c_false_bool } #3 #4 } } \cs_new_protected:cpn { __regex_compile_quantifier_?:w } { \__regex_compile_quantifier_lazyness:nnNN { 0 } { 1 } } \cs_new_protected:cpn { __regex_compile_quantifier_*:w } { \__regex_compile_quantifier_lazyness:nnNN { 0 } { -1 } } \cs_new_protected:cpn { __regex_compile_quantifier_+:w } { \__regex_compile_quantifier_lazyness:nnNN { 1 } { -1 } } \cs_new_protected:cpn { __regex_compile_quantifier_ \c_left_brace_str :w } { \__regex_get_digits:NTFw \l__regex_internal_a_int { \__regex_compile_quantifier_braced_auxi:w } { \__regex_compile_quantifier_abort:xNN { \c_left_brace_str } } } \cs_new_protected:Npn \__regex_compile_quantifier_braced_auxi:w #1#2 { \str_case_x:nnF { #1 #2 } { { \__regex_compile_special:N \c_right_brace_str } { \exp_args:No \__regex_compile_quantifier_lazyness:nnNN { \int_use:N \l__regex_internal_a_int } { 0 } } { \__regex_compile_special:N , } { \__regex_get_digits:NTFw \l__regex_internal_b_int { \__regex_compile_quantifier_braced_auxiii:w } { \__regex_compile_quantifier_braced_auxii:w } } } { \__regex_compile_quantifier_abort:xNN { \c_left_brace_str \int_use:N \l__regex_internal_a_int } #1 #2 } } \cs_new_protected:Npn \__regex_compile_quantifier_braced_auxii:w #1#2 { \str_if_eq_x:nnTF { #1 #2 } { \__regex_compile_special:N \c_right_brace_str } { \exp_args:No \__regex_compile_quantifier_lazyness:nnNN { \int_use:N \l__regex_internal_a_int } { -1 } } { \__regex_compile_quantifier_abort:xNN { \c_left_brace_str \int_use:N \l__regex_internal_a_int , } #1 #2 } } \cs_new_protected:Npn \__regex_compile_quantifier_braced_auxiii:w #1#2 { \str_if_eq_x:nnTF { #1 #2 } { \__regex_compile_special:N \c_right_brace_str } { \if_int_compare:w \l__regex_internal_a_int > \l__regex_internal_b_int \__msg_kernel_error:nnxx { kernel } { backwards-quantifier } { \int_use:N \l__regex_internal_a_int } { \int_use:N \l__regex_internal_b_int } \int_zero:N \l__regex_internal_b_int \else: \int_sub:Nn \l__regex_internal_b_int \l__regex_internal_a_int \fi: \exp_args:Noo \__regex_compile_quantifier_lazyness:nnNN { \int_use:N \l__regex_internal_a_int } { \int_use:N \l__regex_internal_b_int } } { \__regex_compile_quantifier_abort:xNN { \c_left_brace_str \int_use:N \l__regex_internal_a_int , \int_use:N \l__regex_internal_b_int } #1 #2 } } \cs_new_protected:Npn \__regex_compile_raw_error:N #1 { \__msg_kernel_error:nnx { kernel } { bad-escape } {#1} \__regex_compile_raw:N #1 } \cs_new_protected:Npn \__regex_compile_raw:N #1#2#3 { \__regex_if_in_class:TF { \str_if_eq:nnTF {#2#3} { \__regex_compile_special:N - } { \__regex_compile_range:Nw #1 } { \__regex_compile_one:x { \__regex_item_equal:n { \__int_value:w `#1 ~ } } #2 #3 } } { \__regex_compile_one:x { \__regex_item_equal:n { \__int_value:w `#1 ~ } } #2 #3 } } \prg_new_protected_conditional:Npnn \__regex_if_end_range:NN #1#2 { TF } { \if_meaning:w \__regex_compile_raw:N #1 \prg_return_true: \else: \if_meaning:w \__regex_compile_special:N #1 \if_charcode:w ] #2 \prg_return_false: \else: \prg_return_true: \fi: \else: \prg_return_false: \fi: \fi: } \cs_new_protected:Npn \__regex_compile_range:Nw #1#2#3 { \__regex_if_end_range:NNTF #2 #3 { \if_int_compare:w `#1 > `#3 \exp_stop_f: \__msg_kernel_error:nnxx { kernel } { range-backwards } {#1} {#3} \else: \__tl_build_one:x { \if_int_compare:w `#1 = `#3 \exp_stop_f: \__regex_item_equal:n \else: \__regex_item_range:nn { \__int_value:w `#1 ~ } \fi: { \__int_value:w `#3 ~ } } \fi: } { \__msg_kernel_warning:nnxx { kernel } { range-missing-end } {#1} { \c_backslash_str #3 } \__tl_build_one:x { \__regex_item_equal:n { \__int_value:w `#1 ~ } \__regex_item_equal:n { \__int_value:w `- ~ } } #2#3 } } \cs_new_protected:cpx { __regex_compile_.: } { \exp_not:N \__regex_if_in_class:TF { \__regex_compile_raw:N . } { \__regex_compile_one:x \exp_not:c { __regex_prop_.: } } } \cs_new_protected:cpn { __regex_prop_.: } { \if_int_compare:w \l__regex_curr_char_int > - 2 \exp_stop_f: \exp_after:wN \__regex_break_true:w \fi: } \cs_set_protected:Npn \__regex_tmp:w #1#2 { \cs_new_protected:cpx { __regex_compile_/#1: } { \__regex_compile_one:x \exp_not:c { __regex_prop_#1: } } \cs_new_protected:cpx { __regex_compile_/#2: } { \__regex_compile_one:x { \__regex_item_reverse:n \exp_not:c { __regex_prop_#1: } } } } \__regex_tmp:w d D \__regex_tmp:w h H \__regex_tmp:w s S \__regex_tmp:w v V \__regex_tmp:w w W \cs_new_protected:cpn { __regex_compile_/N: } { \__regex_compile_one:x \__regex_prop_N: } \cs_new_protected:Npn \__regex_compile_anchor:NF #1#2 { \__regex_if_in_class_or_catcode:TF {#2} { \__tl_build_one:n { \__regex_assertion:Nn \c_true_bool { \__regex_anchor:N #1 } } } } \cs_set_protected:Npn \__regex_tmp:w #1#2 { \cs_new_protected:cpn { __regex_compile_/#1: } { \__regex_compile_anchor:NF #2 { \__regex_compile_raw_error:N #1 } } } \__regex_tmp:w A \l__regex_min_pos_int \__regex_tmp:w G \l__regex_start_pos_int \__regex_tmp:w Z \l__regex_max_pos_int \__regex_tmp:w z \l__regex_max_pos_int \cs_set_protected:Npn \__regex_tmp:w #1#2 { \cs_new_protected:cpn { __regex_compile_#1: } { \__regex_compile_anchor:NF #2 { \__regex_compile_raw:N #1 } } } \exp_args:Nx \__regex_tmp:w { \iow_char:N \^ } \l__regex_min_pos_int \exp_args:Nx \__regex_tmp:w { \iow_char:N \$ } \l__regex_max_pos_int \cs_new_protected:cpn { __regex_compile_/b: } { \__regex_if_in_class_or_catcode:TF { \__regex_compile_raw_error:N b } { \__tl_build_one:n { \__regex_assertion:Nn \c_true_bool { \__regex_b_test: } } } } \cs_new_protected:cpn { __regex_compile_/B: } { \__regex_if_in_class_or_catcode:TF { \__regex_compile_raw_error:N B } { \__tl_build_one:n { \__regex_assertion:Nn \c_false_bool { \__regex_b_test: } } } } \cs_new_protected:cpn { __regex_compile_]: } { \__regex_if_in_class:TF { \if_int_compare:w \l__regex_mode_int > \c__regex_catcode_in_class_mode_int \__tl_build_one:n { \if_false: { \fi: } } \fi: \tex_advance:D \l__regex_mode_int - 15 \exp_stop_f: \tex_divide:D \l__regex_mode_int 13 \exp_stop_f: \if_int_odd:w \l__regex_mode_int \else: \exp_after:wN \__regex_compile_quantifier:w \fi: } { \__regex_compile_raw:N ] } } \cs_new_protected:cpn { __regex_compile_[: } { \__regex_if_in_class:TF { \__regex_compile_class_posix_test:w } { \__regex_if_within_catcode:TF { \exp_after:wN \__regex_compile_class_catcode:w \int_use:N \l__regex_catcodes_int ; } { \__regex_compile_class_normal:w } } } \cs_new_protected:Npn \__regex_compile_class_normal:w { \__regex_compile_class:TFNN { \__regex_class:NnnnN \c_true_bool } { \__regex_class:NnnnN \c_false_bool } } \cs_new_protected:Npn \__regex_compile_class_catcode:w #1; { \if_int_compare:w \l__regex_mode_int = \c__regex_catcode_mode_int \__tl_build_one:n { \__regex_class:NnnnN \c_true_bool { \if_false: } \fi: } \fi: \int_set_eq:NN \l__regex_catcodes_int \l__regex_default_catcodes_int \__regex_compile_class:TFNN { \__regex_item_catcode:nT {#1} } { \__regex_item_catcode_reverse:nT {#1} } } \cs_new_protected:Npn \__regex_compile_class:TFNN #1#2#3#4 { \l__regex_mode_int = \__int_value:w \l__regex_mode_int 3 \exp_stop_f: \str_if_eq:nnTF { #3 #4 } { \__regex_compile_special:N ^ } { \__tl_build_one:n { #2 { \if_false: } \fi: } \__regex_compile_class:NN } { \__tl_build_one:n { #1 { \if_false: } \fi: } \__regex_compile_class:NN #3 #4 } } \cs_new_protected:Npn \__regex_compile_class:NN #1#2 { \token_if_eq_charcode:NNTF #2 ] { \__regex_compile_raw:N #2 } { #1 #2 } } \cs_new_protected:Npn \__regex_compile_class_posix_test:w #1#2 { \token_if_eq_meaning:NNT \__regex_compile_special:N #1 { \str_case:nn { #2 } { : { \__regex_compile_class_posix:NNNNw } = { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { = } } . { \__msg_kernel_warning:nnx { kernel } { posix-unsupported } { . } } } } \__regex_compile_raw:N [ #1 #2 } \cs_new_protected:Npn \__regex_compile_class_posix:NNNNw #1#2#3#4#5#6 { \str_if_eq:nnTF { #5 #6 } { \__regex_compile_special:N ^ } { \bool_set_false:N \l__regex_internal_bool \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_class_posix_loop:w } { \bool_set_true:N \l__regex_internal_bool \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_class_posix_loop:w #5 #6 } } \cs_new:Npn \__regex_compile_class_posix_loop:w #1#2 { \token_if_eq_meaning:NNTF \__regex_compile_raw:N #1 { #2 \__regex_compile_class_posix_loop:w } { \if_false: { \fi: } \__regex_compile_class_posix_end:w #1 #2 } } \cs_new_protected:Npn \__regex_compile_class_posix_end:w #1#2#3#4 { \str_if_eq:nnTF { #1 #2 #3 #4 } { \__regex_compile_special:N : \__regex_compile_special:N ] } { \cs_if_exist:cTF { __regex_posix_ \l__regex_internal_a_tl : } { \__regex_compile_one:x { \bool_if:NF \l__regex_internal_bool \__regex_item_reverse:n \exp_not:c { __regex_posix_ \l__regex_internal_a_tl : } } } { \__msg_kernel_warning:nnx { kernel } { posix-unknown } { \l__regex_internal_a_tl } \__regex_compile_abort_tokens:x { [: \bool_if:NF \l__regex_internal_bool { ^ } \l__regex_internal_a_tl :] } } } { \__msg_kernel_error:nnxx { kernel } { posix-missing-close } { [: \l__regex_internal_a_tl } { #2 #4 } \__regex_compile_abort_tokens:x { [: \l__regex_internal_a_tl } #1 #2 #3 #4 } } \cs_new_protected:Npn \__regex_compile_group_begin:N #1 { \__tl_build_one:n { #1 { \if_false: } \fi: } \__regex_mode_quit_c: \__tl_build:Nw \l__regex_internal_regex \int_set_eq:NN \l__regex_default_catcodes_int \l__regex_catcodes_int \int_incr:N \l__regex_group_level_int \__tl_build_one:n { \__regex_branch:n { \if_false: } \fi: } } \cs_new_protected:Npn \__regex_compile_group_end: { \if_int_compare:w \l__regex_group_level_int > 0 \exp_stop_f: \__tl_build_one:n { \if_false: { \fi: } } \__tl_build_end: \int_set_eq:NN \l__regex_catcodes_int \l__regex_default_catcodes_int \__tl_build_one:o \l__regex_internal_regex \exp_after:wN \__regex_compile_quantifier:w \else: \__msg_kernel_warning:nn { kernel } { extra-rparen } \exp_after:wN \__regex_compile_raw:N \exp_after:wN ) \fi: } \cs_new_protected:cpn { __regex_compile_(: } { \__regex_if_in_class:TF { \__regex_compile_raw:N ( } { \__regex_compile_lparen:w } } \cs_new_protected:Npn \__regex_compile_lparen:w #1#2#3#4 { \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ? } { \cs_if_exist_use:cF { __regex_compile_special_group_\token_to_str:N #4 :w } { \__msg_kernel_warning:nnx { kernel } { special-group-unknown } { (? #4 } \__regex_compile_group_begin:N \__regex_group:nnnN \__regex_compile_raw:N ? #3 #4 } } { \__regex_compile_group_begin:N \__regex_group:nnnN #1 #2 #3 #4 } } \cs_new_protected:cpn { __regex_compile_|: } { \__regex_if_in_class:TF { \__regex_compile_raw:N | } { \__tl_build_one:n { \if_false: { \fi: } \__regex_branch:n { \if_false: } \fi: } } } \cs_new_protected:cpn { __regex_compile_): } { \__regex_if_in_class:TF { \__regex_compile_raw:N ) } { \__regex_compile_group_end: } } \cs_new_protected:cpn { __regex_compile_special_group_::w } { \__regex_compile_group_begin:N \__regex_group_no_capture:nnnN } \cs_new_protected:cpn { __regex_compile_special_group_|:w } { \__regex_compile_group_begin:N \__regex_group_resetting:nnnN } \cs_new_protected:Npn \__regex_compile_special_group_i:w #1#2 { \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ) } { \cs_set:Npn \__regex_item_equal:n { \__regex_item_caseless_equal:n } \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseless_range:nn } } { \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?i #2 } \__regex_compile_raw:N ( \__regex_compile_raw:N ? \__regex_compile_raw:N i #1 #2 } } \cs_new_protected:cpn { __regex_compile_special_group_-:w } #1#2#3#4 { \str_if_eq:nnTF { #1 #2 #3 #4 } { \__regex_compile_raw:N i \__regex_compile_special:N ) } { \cs_set:Npn \__regex_item_equal:n { \__regex_item_caseful_equal:n } \cs_set:Npn \__regex_item_range:nn { \__regex_item_caseful_range:nn } } { \__msg_kernel_warning:nnx { kernel } { unknown-option } { (?-#2#4 } \__regex_compile_raw:N ( \__regex_compile_raw:N ? \__regex_compile_raw:N - #1 #2 #3 #4 } } \cs_new_protected:cpn { __regex_compile_/c: } { \__regex_chk_c_allowed:T { \__regex_compile_c_test:NN } } \cs_new_protected:Npn \__regex_compile_c_test:NN #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_compile_raw:N { \int_if_exist:cTF { c__regex_catcode_#2_int } { \int_set_eq:Nc \l__regex_catcodes_int { c__regex_catcode_#2_int } \l__regex_mode_int = \if_case:w \l__regex_mode_int \c__regex_catcode_mode_int \else: \c__regex_catcode_in_class_mode_int \fi: \token_if_eq_charcode:NNT C #2 { \__regex_compile_c_C:NN } } } { \cs_if_exist_use:cF { __regex_compile_c_#2:w } } { \__msg_kernel_error:nnx { kernel } { c-missing-category } {#2} #1 #2 } } \cs_new_protected:Npn \__regex_compile_c_C:NN #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_compile_special:N { \token_if_eq_charcode:NNTF #2 . { \use_none:n } { \token_if_eq_charcode:NNF #2 ( } % ) } { \use:n } { \__msg_kernel_error:nnn { kernel } { c-C-invalid } {#2} } #1 #2 } \cs_new_protected:cpn { __regex_compile_c_[:w } #1#2 { \l__regex_mode_int = \if_case:w \l__regex_mode_int \c__regex_catcode_mode_int \else: \c__regex_catcode_in_class_mode_int \fi: \int_zero:N \l__regex_catcodes_int \str_if_eq:nnTF { #1 #2 } { \__regex_compile_special:N ^ } { \bool_set_false:N \l__regex_catcodes_bool \__regex_compile_c_lbrack_loop:NN } { \bool_set_true:N \l__regex_catcodes_bool \__regex_compile_c_lbrack_loop:NN #1 #2 } } \cs_new_protected:Npn \__regex_compile_c_lbrack_loop:NN #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_compile_raw:N { \int_if_exist:cTF { c__regex_catcode_#2_int } { \exp_args:Nc \__regex_compile_c_lbrack_add:N { c__regex_catcode_#2_int } \__regex_compile_c_lbrack_loop:NN } } { \token_if_eq_charcode:NNTF #2 ] { \__regex_compile_c_lbrack_end: } } { \__msg_kernel_error:nnx { kernel } { c-missing-rbrack } {#2} \__regex_compile_c_lbrack_end: #1 #2 } } \cs_new_protected:Npn \__regex_compile_c_lbrack_add:N #1 { \if_int_odd:w \__int_eval:n { \l__regex_catcodes_int / #1 } \else: \int_add:Nn \l__regex_catcodes_int {#1} \fi: } \cs_new_protected:Npn \__regex_compile_c_lbrack_end: { \if_meaning:w \c_false_bool \l__regex_catcodes_bool \int_set:Nn \l__regex_catcodes_int { \c__regex_all_catcodes_int - \l__regex_catcodes_int } \fi: } \cs_new_protected:cpn { __regex_compile_c_ \c_left_brace_str :w } { \__regex_compile:w \__regex_disable_submatches: \l__regex_mode_int = \if_case:w \l__regex_mode_int \c__regex_cs_mode_int \else: \c__regex_cs_in_class_mode_int \fi: } \flag_new:n { __regex_cs } \cs_new_protected:cpn { __regex_compile_ \c_right_brace_str : } { \__regex_if_in_cs:TF { \__regex_compile_end_cs: } { \exp_after:wN \__regex_compile_raw:N \c_right_brace_str } } \cs_new_protected:Npn \__regex_compile_end_cs: { \__regex_compile_end: \flag_clear:n { __regex_cs } \tl_set:Nx \l__regex_internal_a_tl { \exp_after:wN \__regex_compile_cs_aux:Nn \l__regex_internal_regex \q_nil \q_nil \q_recursion_stop } \exp_args:Nx \__regex_compile_one:x { \flag_if_raised:nTF { __regex_cs } { \__regex_item_cs:n { \exp_not:o \l__regex_internal_regex } } { \__regex_item_exact_cs:n { \tl_tail:N \l__regex_internal_a_tl } } } } \cs_new:Npn \__regex_compile_cs_aux:Nn #1#2 { \cs_if_eq:NNTF #1 \__regex_branch:n { \scan_stop: \__regex_compile_cs_aux:NNnnnN #2 \q_nil \q_nil \q_nil \q_nil \q_nil \q_nil \q_recursion_stop \__regex_compile_cs_aux:Nn } { \quark_if_nil:NF #1 { \flag_raise:n { __regex_cs } } \use_none_delimit_by_q_recursion_stop:w } } \cs_new:Npn \__regex_compile_cs_aux:NNnnnN #1#2#3#4#5#6 { \bool_lazy_all:nTF { { \cs_if_eq_p:NN #1 \__regex_class:NnnnN } {#2} { \tl_if_head_eq_meaning_p:nN {#3} \__regex_item_caseful_equal:n } { \int_compare_p:nNn { \tl_count:n {#3} } = { 2 } } { \int_compare_p:nNn {#5} = { 0 } } } { \prg_replicate:nn {#4} { \char_generate:nn { \use_ii:nn #3 } {12} } \__regex_compile_cs_aux:NNnnnN } { \quark_if_nil:NF #1 { \flag_raise:n { __regex_cs } \use_i_delimit_by_q_recursion_stop:nw } \use_none_delimit_by_q_recursion_stop:w } } \cs_new_protected:cpn { __regex_compile_/u: } #1#2 { \__regex_if_in_class_or_catcode:TF { \__regex_compile_raw_error:N u #1 #2 } { \str_if_eq_x:nnTF {#1#2} { \__regex_compile_special:N \c_left_brace_str } { \tl_set:Nx \l__regex_internal_a_tl { \if_false: } \fi: \__regex_compile_u_loop:NN } { \__msg_kernel_error:nn { kernel } { u-missing-lbrace } \__regex_compile_raw:N u #1 #2 } } } \cs_new:Npn \__regex_compile_u_loop:NN #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_compile_raw:N { #2 \__regex_compile_u_loop:NN } { \token_if_eq_meaning:NNTF #1 \__regex_compile_special:N { \exp_after:wN \token_if_eq_charcode:NNTF \c_right_brace_str #2 { \if_false: { \fi: } \__regex_compile_u_end: } { #2 \__regex_compile_u_loop:NN } } { \if_false: { \fi: } \__msg_kernel_error:nnx { kernel } { u-missing-rbrace } {#2} \__regex_compile_u_end: #1 #2 } } } \cs_new_protected:Npn \__regex_compile_u_end: { \tl_set:Nv \l__regex_internal_a_tl { \l__regex_internal_a_tl } \if_int_compare:w \l__regex_mode_int = \c__regex_outer_mode_int \__regex_compile_u_not_cs: \else: \__regex_compile_u_in_cs: \fi: } \cs_new_protected:Npn \__regex_compile_u_in_cs: { \tl_gset:Nx \g__regex_internal_tl { \exp_args:No \__str_to_other_fast:n { \l__regex_internal_a_tl } } \__tl_build_one:x { \tl_map_function:NN \g__regex_internal_tl \__regex_compile_u_in_cs_aux:n } } \cs_new:Npn \__regex_compile_u_in_cs_aux:n #1 { \__regex_class:NnnnN \c_true_bool { \__regex_item_caseful_equal:n { \__int_value:w `#1 } } { 1 } { 0 } \c_false_bool } \cs_new_protected:Npn \__regex_compile_u_not_cs: { \exp_args:No \__tl_analysis_map_inline:nn { \l__regex_internal_a_tl } { \__tl_build_one:n { \__regex_class:NnnnN \c_true_bool { \if_int_compare:w "##2 = 0 \exp_stop_f: \__regex_item_exact_cs:n { \exp_after:wN \cs_to_str:N ##1 } \else: \__regex_item_exact:nn { \__int_value:w "##2 } { ##3 } \fi: } { 1 } { 0 } \c_false_bool } } } \cs_new_protected:cpn { __regex_compile_/K: } { \int_compare:nNnTF \l__regex_mode_int = \c__regex_outer_mode_int { \__tl_build_one:n { \__regex_command_K: } } { \__regex_compile_raw_error:N K } } \cs_new_protected:Npn \__regex_show:N #1 { \__tl_build:Nw \l__regex_internal_a_tl \cs_set_protected:Npn \__regex_branch:n { \seq_pop_right:NN \l__regex_show_prefix_seq \l__regex_internal_a_tl \__regex_show_one:n { +-branch } \seq_put_right:No \l__regex_show_prefix_seq \l__regex_internal_a_tl \use:n } \cs_set_protected:Npn \__regex_group:nnnN { \__regex_show_group_aux:nnnnN { } } \cs_set_protected:Npn \__regex_group_no_capture:nnnN { \__regex_show_group_aux:nnnnN { ~(no~capture) } } \cs_set_protected:Npn \__regex_group_resetting:nnnN { \__regex_show_group_aux:nnnnN { ~(resetting) } } \cs_set_eq:NN \__regex_class:NnnnN \__regex_show_class:NnnnN \cs_set_protected:Npn \__regex_command_K: { \__regex_show_one:n { reset~match~start~(\iow_char:N\\K) } } \cs_set_protected:Npn \__regex_assertion:Nn ##1##2 { \__regex_show_one:n { \bool_if:NF ##1 { negative~ } assertion:~##2 } } \cs_set:Npn \__regex_b_test: { word~boundary } \cs_set_eq:NN \__regex_anchor:N \__regex_show_anchor_to_str:N \cs_set_protected:Npn \__regex_item_caseful_equal:n ##1 { \__regex_show_one:n { char~code~\int_eval:n{##1} } } \cs_set_protected:Npn \__regex_item_caseful_range:nn ##1##2 { \__regex_show_one:n { range~[\int_eval:n{##1}, \int_eval:n{##2}] } } \cs_set_protected:Npn \__regex_item_caseless_equal:n ##1 { \__regex_show_one:n { char~code~\int_eval:n{##1}~(caseless) } } \cs_set_protected:Npn \__regex_item_caseless_range:nn ##1##2 { \__regex_show_one:n { Range~[\int_eval:n{##1}, \int_eval:n{##2}]~(caseless) } } \cs_set_protected:Npn \__regex_item_catcode:nT { \__regex_show_item_catcode:NnT \c_true_bool } \cs_set_protected:Npn \__regex_item_catcode_reverse:nT { \__regex_show_item_catcode:NnT \c_false_bool } \cs_set_protected:Npn \__regex_item_reverse:n { \__regex_show_scope:nn { Reversed~match } } \cs_set_protected:Npn \__regex_item_exact:nn ##1##2 { \__regex_show_one:n { char~##2,~catcode~##1 } } \cs_set_eq:NN \__regex_item_exact_cs:n \__regex_show_item_exact_cs:n \cs_set_protected:Npn \__regex_item_cs:n { \__regex_show_scope:nn { control~sequence } } \cs_set:cpn { __regex_prop_.: } { \__regex_show_one:n { any~token } } \seq_clear:N \l__regex_show_prefix_seq \__regex_show_push:n { ~ } \cs_if_exist_use:N #1 \__tl_build_end: } \cs_new_protected:Npn \__regex_show_one:n #1 { \int_incr:N \l__regex_show_lines_int \__tl_build_one:x { \exp_not:N \iow_newline: \seq_map_function:NN \l__regex_show_prefix_seq \use:n #1 } } \cs_new_protected:Npn \__regex_show_push:n #1 { \seq_put_right:Nx \l__regex_show_prefix_seq { #1 ~ } } \cs_new_protected:Npn \__regex_show_pop: { \seq_pop_right:NN \l__regex_show_prefix_seq \l__regex_internal_a_tl } \cs_new_protected:Npn \__regex_show_scope:nn #1#2 { \__regex_show_one:n {#1} \__regex_show_push:n { ~ } #2 \__regex_show_pop: } \cs_new_protected:Npn \__regex_show_group_aux:nnnnN #1#2#3#4#5 { \__regex_show_one:n { ,-group~begin #1 } \__regex_show_push:n { | } \use_ii:nn #2 \__regex_show_pop: \__regex_show_one:n { `-group~end \__regex_msg_repeated:nnN {#3} {#4} #5 } } \cs_set:Npn \__regex_show_class:NnnnN #1#2#3#4#5 { \__tl_build:Nw \l__regex_internal_a_tl \int_zero:N \l__regex_show_lines_int \__regex_show_push:n {~} #2 \exp_last_unbraced:Nf \int_case:nnF { \l__regex_show_lines_int } { {0} { \__tl_build_end: \__regex_show_one:n { \bool_if:NTF #1 { Fail } { Pass } } } {1} { \__tl_build_end: \bool_if:NTF #1 { #2 \__tl_build_one:n { \__regex_msg_repeated:nnN {#3} {#4} #5 } } { \__regex_show_one:n { Don't~match~\__regex_msg_repeated:nnN {#3} {#4} #5 } \__tl_build_one:o \l__regex_internal_a_tl } } } { \__tl_build_end: \__regex_show_one:n { \bool_if:NTF #1 { M } { Don't~m } atch \__regex_msg_repeated:nnN {#3} {#4} #5 } \__tl_build_one:o \l__regex_internal_a_tl } } \cs_new:Npn \__regex_show_anchor_to_str:N #1 { anchor~at~ \str_case:nnF { #1 } { { \l__regex_min_pos_int } { start~(\iow_char:N\\A) } { \l__regex_start_pos_int } { start~of~match~(\iow_char:N\\G) } { \l__regex_max_pos_int } { end~(\iow_char:N\\Z) } } { } } \cs_new_protected:Npn \__regex_show_item_catcode:NnT #1#2 { \seq_set_split:Nnn \l__regex_internal_seq { } { CBEMTPUDSLOA } \seq_set_filter:NNn \l__regex_internal_seq \l__regex_internal_seq { \int_if_odd_p:n { #2 / \int_use:c { c__regex_catcode_##1_int } } } \__regex_show_scope:nn { categories~ \seq_map_function:NN \l__regex_internal_seq \use:n , ~ \bool_if:NF #1 { negative~ } class } } \cs_new_protected:Npn \__regex_show_item_exact_cs:n #1 { \seq_set_split:Nnn \l__regex_internal_seq { \scan_stop: } {#1} \seq_set_map:NNn \l__regex_internal_seq \l__regex_internal_seq { \iow_char:N\\##1 } \__regex_show_one:n { control~sequence~ \seq_use:Nn \l__regex_internal_seq { ~or~ } } } \int_new:N \l__regex_min_state_int \int_set:Nn \l__regex_min_state_int { 1 } \int_new:N \l__regex_max_state_int \int_new:N \l__regex_left_state_int \int_new:N \l__regex_right_state_int \seq_new:N \l__regex_left_state_seq \seq_new:N \l__regex_right_state_seq \int_new:N \l__regex_capturing_group_int \cs_new_protected:Npn \__regex_build:n #1 { \__regex_compile:n {#1} \__regex_build:N \l__regex_internal_regex } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_build:N } { \__regex_trace_states:n { 2 } \__debug_trace_pop:nnN { regex } { 1 } \__regex_build:N } \cs_new_protected:Npn \__regex_build:N #1 { \__regex_standard_escapechar: \int_zero:N \l__regex_capturing_group_int \int_set_eq:NN \l__regex_max_state_int \l__regex_min_state_int \__regex_build_new_state: \__regex_build_new_state: \__regex_toks_put_right:Nn \l__regex_left_state_int { \__regex_action_start_wildcard: } \__regex_group:nnnN {#1} { 1 } { 0 } \c_false_bool \__regex_toks_put_right:Nn \l__regex_right_state_int { \__regex_action_success: } } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_build_for_cs:n } { \__regex_trace_states:n { 2 } \__debug_trace_pop:nnN { regex } { 1 } \__regex_build_for_cs:n } \cs_new_protected:Npn \__regex_build_for_cs:n #1 { \int_set_eq:NN \l__regex_max_state_int \l__regex_min_state_int \__regex_build_new_state: \__regex_build_new_state: \__regex_push_lr_states: #1 \__regex_pop_lr_states: \__regex_toks_put_right:Nn \l__regex_right_state_int { \if_int_compare:w \l__regex_curr_pos_int = \l__regex_max_pos_int \exp_after:wN \__regex_action_success: \fi: } } \cs_new_protected:Npn \__regex_push_lr_states: { \seq_push:No \l__regex_left_state_seq { \int_use:N \l__regex_left_state_int } \seq_push:No \l__regex_right_state_seq { \int_use:N \l__regex_right_state_int } } \cs_new_protected:Npn \__regex_pop_lr_states: { \seq_pop:NN \l__regex_left_state_seq \l__regex_internal_a_tl \int_set:Nn \l__regex_left_state_int \l__regex_internal_a_tl \seq_pop:NN \l__regex_right_state_seq \l__regex_internal_a_tl \int_set:Nn \l__regex_right_state_int \l__regex_internal_a_tl } \cs_new_protected:Npn \__regex_build_transition_left:NNN #1#2#3 { \__regex_toks_put_left:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } } \cs_new_protected:Npn \__regex_build_transition_right:nNn #1#2#3 { \__regex_toks_put_right:Nx #2 { #1 { \int_eval:n { #3 - #2 } } } } \__debug_patch:nnNNpn { \__debug_trace:nnx { regex } { 2 } { regex~new~state~ L=\int_use:N \l__regex_left_state_int ~ -> ~ R=\int_use:N \l__regex_right_state_int ~ -> ~ M=\int_use:N \l__regex_max_state_int ~ -> ~ \int_eval:n { \l__regex_max_state_int + 1 } } } { } \cs_new_protected:Npn \__regex_build_new_state: { \__regex_toks_clear:N \l__regex_max_state_int \int_set_eq:NN \l__regex_left_state_int \l__regex_right_state_int \int_set_eq:NN \l__regex_right_state_int \l__regex_max_state_int \int_incr:N \l__regex_max_state_int } \cs_new_protected:Npn \__regex_build_transitions_lazyness:NNNNN #1#2#3#4#5 { \__regex_build_new_state: \__regex_toks_put_right:Nx \l__regex_left_state_int { \if_meaning:w \c_true_bool #1 #2 { \int_eval:n { #3 - \l__regex_left_state_int } } #4 { \int_eval:n { #5 - \l__regex_left_state_int } } \else: #4 { \int_eval:n { #5 - \l__regex_left_state_int } } #2 { \int_eval:n { #3 - \l__regex_left_state_int } } \fi: } } \cs_new_protected:Npn \__regex_class:NnnnN #1#2#3#4#5 { \cs_set:Npx \__regex_tests_action_cost:n ##1 { \exp_not:n { \exp_not:n {#2} } \bool_if:NTF #1 { \__regex_break_point:TF { \__regex_action_cost:n {##1} } { } } { \__regex_break_point:TF { } { \__regex_action_cost:n {##1} } } } \if_case:w - #4 \exp_stop_f: \__regex_class_repeat:n {#3} \or: \__regex_class_repeat:nN {#3} #5 \else: \__regex_class_repeat:nnN {#3} {#4} #5 \fi: } \cs_new:Npn \__regex_tests_action_cost:n { \__regex_action_cost:n } \cs_new_protected:Npn \__regex_class_repeat:n #1 { \prg_replicate:nn {#1} { \__regex_build_new_state: \__regex_build_transition_right:nNn \__regex_tests_action_cost:n \l__regex_left_state_int \l__regex_right_state_int } } \cs_new_protected:Npn \__regex_class_repeat:nN #1#2 { \if_int_compare:w #1 = 0 \exp_stop_f: \__regex_build_transitions_lazyness:NNNNN #2 \__regex_action_free:n \l__regex_right_state_int \__regex_tests_action_cost:n \l__regex_left_state_int \else: \__regex_class_repeat:n {#1} \int_set_eq:NN \l__regex_internal_a_int \l__regex_left_state_int \__regex_build_transitions_lazyness:NNNNN #2 \__regex_action_free:n \l__regex_right_state_int \__regex_action_free:n \l__regex_internal_a_int \fi: } \cs_new_protected:Npn \__regex_class_repeat:nnN #1#2#3 { \__regex_class_repeat:n {#1} \int_set:Nn \l__regex_internal_a_int { \l__regex_max_state_int + #2 - 1 } \prg_replicate:nn { #2 } { \__regex_build_transitions_lazyness:NNNNN #3 \__regex_action_free:n \l__regex_internal_a_int \__regex_tests_action_cost:n \l__regex_right_state_int } } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_group_aux:nnnnN } { \__debug_trace_pop:nnN { regex } { 1 } \__regex_group_aux:nnnnN } \cs_new_protected:Npn \__regex_group_aux:nnnnN #1#2#3#4#5 { \if_int_compare:w #3 = 0 \exp_stop_f: \__regex_build_new_state: \__regex_build_transition_right:nNn \__regex_action_free_group:n \l__regex_left_state_int \l__regex_right_state_int \fi: \__regex_build_new_state: \__regex_push_lr_states: #2 \__regex_pop_lr_states: \if_case:w - #4 \exp_stop_f: \__regex_group_repeat:nn {#1} {#3} \or: \__regex_group_repeat:nnN {#1} {#3} #5 \else: \__regex_group_repeat:nnnN {#1} {#3} {#4} #5 \fi: } \cs_new_protected:Npn \__regex_group:nnnN #1 { \exp_args:No \__regex_group_aux:nnnnN { \int_use:N \l__regex_capturing_group_int } { \int_incr:N \l__regex_capturing_group_int #1 } } \cs_new_protected:Npn \__regex_group_no_capture:nnnN { \__regex_group_aux:nnnnN { -1 } } \cs_new_protected:Npn \__regex_group_resetting:nnnN #1 { \__regex_group_aux:nnnnN { -1 } { \exp_args:Noo \__regex_group_resetting_loop:nnNn { \int_use:N \l__regex_capturing_group_int } { \int_use:N \l__regex_capturing_group_int } #1 { ?? \__prg_break:n } { } \__prg_break_point: } } \cs_new_protected:Npn \__regex_group_resetting_loop:nnNn #1#2#3#4 { \use_none:nn #3 { \int_set:Nn \l__regex_capturing_group_int {#1} } \int_set:Nn \l__regex_capturing_group_int {#2} #3 {#4} \exp_args:Nf \__regex_group_resetting_loop:nnNn { \int_max:nn {#1} { \l__regex_capturing_group_int } } {#2} } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_branch:n } { \__debug_trace_pop:nnN { regex } { 1 } \__regex_branch:n } \cs_new_protected:Npn \__regex_branch:n #1 { \__regex_build_new_state: \seq_get:NN \l__regex_left_state_seq \l__regex_internal_a_tl \int_set:Nn \l__regex_left_state_int \l__regex_internal_a_tl \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_left_state_int \l__regex_right_state_int #1 \seq_get:NN \l__regex_right_state_seq \l__regex_internal_a_tl \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_right_state_int \l__regex_internal_a_tl } \cs_new_protected:Npn \__regex_group_repeat:nn #1#2 { \if_int_compare:w #2 = 0 \exp_stop_f: \int_set:Nn \l__regex_max_state_int { \l__regex_left_state_int - 1 } \__regex_build_new_state: \else: \__regex_group_repeat_aux:n {#2} \__regex_group_submatches:nNN {#1} \l__regex_internal_a_int \l__regex_right_state_int \__regex_build_new_state: \fi: } \cs_new_protected:Npn \__regex_group_submatches:nNN #1#2#3 { \if_int_compare:w #1 > - 1 \exp_stop_f: \__regex_toks_put_left:Nx #2 { \__regex_action_submatch:n { #1 < } } \__regex_toks_put_left:Nx #3 { \__regex_action_submatch:n { #1 > } } \fi: } \cs_new_protected:Npn \__regex_group_repeat_aux:n #1 { \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_right_state_int \l__regex_max_state_int \int_set_eq:NN \l__regex_internal_a_int \l__regex_left_state_int \int_set_eq:NN \l__regex_internal_b_int \l__regex_max_state_int \if_int_compare:w \__int_eval:n {#1} > 1 \exp_stop_f: \int_set:Nn \l__regex_internal_c_int { ( #1 - 1 ) * ( \l__regex_internal_b_int - \l__regex_internal_a_int ) } \int_add:Nn \l__regex_right_state_int { \l__regex_internal_c_int } \int_add:Nn \l__regex_max_state_int { \l__regex_internal_c_int } \__regex_toks_memcpy:NNn \l__regex_internal_b_int \l__regex_internal_a_int \l__regex_internal_c_int \fi: } \cs_new_protected:Npn \__regex_group_repeat:nnN #1#2#3 { \if_int_compare:w #2 = 0 \exp_stop_f: \__regex_group_submatches:nNN {#1} \l__regex_left_state_int \l__regex_right_state_int \int_set:Nn \l__regex_internal_a_int { \l__regex_left_state_int - 1 } \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_right_state_int \l__regex_internal_a_int \__regex_build_new_state: \if_meaning:w \c_true_bool #3 \__regex_build_transition_left:NNN \__regex_action_free:n \l__regex_internal_a_int \l__regex_right_state_int \else: \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_internal_a_int \l__regex_right_state_int \fi: \else: \__regex_group_repeat_aux:n {#2} \__regex_group_submatches:nNN {#1} \l__regex_internal_a_int \l__regex_right_state_int \if_meaning:w \c_true_bool #3 \__regex_build_transition_right:nNn \__regex_action_free_group:n \l__regex_right_state_int \l__regex_internal_a_int \else: \__regex_build_transition_left:NNN \__regex_action_free_group:n \l__regex_right_state_int \l__regex_internal_a_int \fi: \__regex_build_new_state: \fi: } \cs_new_protected:Npn \__regex_group_repeat:nnnN #1#2#3#4 { \__regex_group_submatches:nNN {#1} \l__regex_left_state_int \l__regex_right_state_int \__regex_group_repeat_aux:n { #2 + #3 } \if_meaning:w \c_true_bool #4 \int_set_eq:NN \l__regex_left_state_int \l__regex_max_state_int \prg_replicate:nn { #3 } { \int_sub:Nn \l__regex_left_state_int { \l__regex_internal_b_int - \l__regex_internal_a_int } \__regex_build_transition_left:NNN \__regex_action_free:n \l__regex_left_state_int \l__regex_max_state_int } \else: \prg_replicate:nn { #3 - 1 } { \int_sub:Nn \l__regex_right_state_int { \l__regex_internal_b_int - \l__regex_internal_a_int } \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_right_state_int \l__regex_max_state_int } \if_int_compare:w #2 = 0 \exp_stop_f: \int_set:Nn \l__regex_right_state_int { \l__regex_left_state_int - 1 } \else: \int_sub:Nn \l__regex_right_state_int { \l__regex_internal_b_int - \l__regex_internal_a_int } \fi: \__regex_build_transition_right:nNn \__regex_action_free:n \l__regex_right_state_int \l__regex_max_state_int \fi: \__regex_build_new_state: } \cs_new_protected:Npn \__regex_assertion:Nn #1#2 { \__regex_build_new_state: \__regex_toks_put_right:Nx \l__regex_left_state_int { \exp_not:n {#2} \__regex_break_point:TF \bool_if:NF #1 { { } } { \__regex_action_free:n { \int_eval:n { \l__regex_right_state_int - \l__regex_left_state_int } } } \bool_if:NT #1 { { } } } } \cs_new_protected:Npn \__regex_anchor:N #1 { \if_int_compare:w #1 = \l__regex_curr_pos_int \exp_after:wN \__regex_break_true:w \fi: } \cs_new_protected:Npn \__regex_b_test: { \group_begin: \int_set_eq:NN \l__regex_curr_char_int \l__regex_last_char_int \__regex_prop_w: \__regex_break_point:TF { \group_end: \__regex_item_reverse:n \__regex_prop_w: } { \group_end: \__regex_prop_w: } } \cs_new_protected:Npn \__regex_command_K: { \__regex_build_new_state: \__regex_toks_put_right:Nx \l__regex_left_state_int { \__regex_action_submatch:n { 0< } \bool_set_true:N \l__regex_fresh_thread_bool \__regex_action_free:n { \int_eval:n { \l__regex_right_state_int - \l__regex_left_state_int } } \bool_set_false:N \l__regex_fresh_thread_bool } } \int_new:N \l__regex_min_pos_int \int_new:N \l__regex_max_pos_int \int_new:N \l__regex_curr_pos_int \int_new:N \l__regex_start_pos_int \int_new:N \l__regex_success_pos_int \int_new:N \l__regex_curr_char_int \int_new:N \l__regex_curr_catcode_int \int_new:N \l__regex_last_char_int \int_new:N \l__regex_case_changed_char_int \int_new:N \l__regex_curr_state_int \prop_new:N \l__regex_curr_submatches_prop \prop_new:N \l__regex_success_submatches_prop \int_new:N \l__regex_step_int \int_new:N \l__regex_min_active_int \int_new:N \l__regex_max_active_int \__intarray_new:Nn \g__regex_state_active_intarray { 65536 } \__intarray_new:Nn \g__regex_thread_state_intarray { 65536 } \tl_new:N \l__regex_every_match_tl \bool_new:N \l__regex_fresh_thread_bool \bool_new:N \l__regex_empty_success_bool \cs_new_eq:NN \__regex_if_two_empty_matches:F \use:n \bool_new:N \g__regex_success_bool \bool_new:N \l__regex_saved_success_bool \bool_new:N \l__regex_match_success_bool \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_match:n \__debug_trace:nnx { regex } { 1 } { analyzing~query~token~list } } { \__debug_trace_pop:nnN { regex } { 1 } \__regex_match:n } \cs_new_protected:Npn \__regex_match:n #1 { \int_zero:N \l__regex_balance_int \int_set:Nn \l__regex_curr_pos_int { 2 * \l__regex_max_state_int } \__regex_query_set:nnn { } { -1 } { -2 } \int_set_eq:NN \l__regex_min_pos_int \l__regex_curr_pos_int \__tl_analysis_map_inline:nn {#1} { \__regex_query_set:nnn {##1} {"##2} {##3} } \int_set_eq:NN \l__regex_max_pos_int \l__regex_curr_pos_int \__regex_query_set:nnn { } { -1 } { -2 } \__regex_match_init: \__regex_match_once: } \__debug_patch:nnNNpn { \__debug_trace:nnx { regex } { 1 } { initializing } } { } \cs_new_protected:Npn \__regex_match_init: { \bool_gset_false:N \g__regex_success_bool \int_step_inline:nnnn \l__regex_min_state_int { 1 } { \l__regex_max_state_int - 1 } { \__intarray_gset_fast:Nnn \g__regex_state_active_intarray {##1} { 1 } } \int_set_eq:NN \l__regex_min_active_int \l__regex_max_state_int \int_zero:N \l__regex_step_int \int_set_eq:NN \l__regex_success_pos_int \l__regex_min_pos_int \int_set:Nn \l__regex_min_submatch_int { 2 * \l__regex_max_state_int } \int_set_eq:NN \l__regex_submatch_int \l__regex_min_submatch_int \bool_set_false:N \l__regex_empty_success_bool } \cs_new_protected:Npn \__regex_match_once: { \if_meaning:w \c_true_bool \l__regex_empty_success_bool \cs_set:Npn \__regex_if_two_empty_matches:F { \int_compare:nNnF \l__regex_start_pos_int = \l__regex_curr_pos_int } \else: \cs_set_eq:NN \__regex_if_two_empty_matches:F \use:n \fi: \int_set_eq:NN \l__regex_start_pos_int \l__regex_success_pos_int \bool_set_false:N \l__regex_match_success_bool \prop_clear:N \l__regex_curr_submatches_prop \int_set_eq:NN \l__regex_max_active_int \l__regex_min_active_int \__regex_store_state:n { \l__regex_min_state_int } \int_set:Nn \l__regex_curr_pos_int { \l__regex_start_pos_int - 1 } \__regex_query_get: \__regex_match_loop: \l__regex_every_match_tl } \cs_new_protected:Npn \__regex_single_match: { \tl_set:Nn \l__regex_every_match_tl { \bool_gset_eq:NN \g__regex_success_bool \l__regex_match_success_bool } } \cs_new_protected:Npn \__regex_multi_match:n #1 { \tl_set:Nn \l__regex_every_match_tl { \if_meaning:w \c_true_bool \l__regex_match_success_bool \bool_gset_true:N \g__regex_success_bool #1 \exp_after:wN \__regex_match_once: \fi: } } \cs_new_protected:Npn \__regex_match_loop: { \int_add:Nn \l__regex_step_int { 2 } \int_incr:N \l__regex_curr_pos_int \int_set_eq:NN \l__regex_last_char_int \l__regex_curr_char_int \int_set_eq:NN \l__regex_case_changed_char_int \c_max_int \__regex_query_get: \use:x { \int_set_eq:NN \l__regex_max_active_int \l__regex_min_active_int \int_step_function:nnnN { \l__regex_min_active_int } { 1 } { \l__regex_max_active_int - 1 } \__regex_match_one_active:n } \__prg_break_point: \bool_set_false:N \l__regex_fresh_thread_bool %^^A was arg of break_point:n \if_int_compare:w \l__regex_max_active_int > \l__regex_min_active_int \if_int_compare:w \l__regex_curr_pos_int < \l__regex_max_pos_int \exp_after:wN \exp_after:wN \exp_after:wN \__regex_match_loop: \fi: \fi: } \cs_new:Npn \__regex_match_one_active:n #1 { \__regex_use_state_and_submatches:nn { \__intarray_item_fast:Nn \g__regex_thread_state_intarray {#1} } { \__regex_toks_use:w #1 } } \cs_new_protected:Npn \__regex_query_set:nnn #1#2#3 { \__intarray_gset_fast:Nnn \g__regex_charcode_intarray { \l__regex_curr_pos_int } {#3} \__intarray_gset_fast:Nnn \g__regex_catcode_intarray { \l__regex_curr_pos_int } {#2} \__intarray_gset_fast:Nnn \g__regex_balance_intarray { \l__regex_curr_pos_int } { \l__regex_balance_int } \__regex_toks_set:Nn \l__regex_curr_pos_int {#1} \int_incr:N \l__regex_curr_pos_int \if_case:w #2 \exp_stop_f: \or: \int_incr:N \l__regex_balance_int \or: \int_decr:N \l__regex_balance_int \fi: } \cs_new_protected:Npn \__regex_query_get: { \l__regex_curr_char_int = \__intarray_item_fast:Nn \g__regex_charcode_intarray { \l__regex_curr_pos_int } \scan_stop: \l__regex_curr_catcode_int = \__intarray_item_fast:Nn \g__regex_catcode_intarray { \l__regex_curr_pos_int } \scan_stop: } \__debug_patch:nnNNpn { \__debug_trace:nnx { regex } { 2 } { state~\int_use:N \l__regex_curr_state_int } } { } \cs_new_protected:Npn \__regex_use_state: { \__intarray_gset_fast:Nnn \g__regex_state_active_intarray { \l__regex_curr_state_int } { \l__regex_step_int } \__regex_toks_use:w \l__regex_curr_state_int \__intarray_gset_fast:Nnn \g__regex_state_active_intarray { \l__regex_curr_state_int } { \l__regex_step_int + 1 } } \cs_new_protected:Npn \__regex_use_state_and_submatches:nn #1 #2 { \int_set:Nn \l__regex_curr_state_int {#1} \if_int_compare:w \__intarray_item_fast:Nn \g__regex_state_active_intarray { \l__regex_curr_state_int } < \l__regex_step_int \tl_set:Nn \l__regex_curr_submatches_prop {#2} \exp_after:wN \__regex_use_state: \fi: \scan_stop: } \cs_new_protected:Npn \__regex_action_start_wildcard: { \bool_set_true:N \l__regex_fresh_thread_bool \__regex_action_free:n {1} \bool_set_false:N \l__regex_fresh_thread_bool \__regex_action_cost:n {0} } \cs_new_protected:Npn \__regex_action_free:n { \__regex_action_free_aux:nn { > \l__regex_step_int \else: } } \cs_new_protected:Npn \__regex_action_free_group:n { \__regex_action_free_aux:nn { < \l__regex_step_int } } \cs_new_protected:Npn \__regex_action_free_aux:nn #1#2 { \use:x { \int_add:Nn \l__regex_curr_state_int {#2} \exp_not:n { \if_int_compare:w \__intarray_item_fast:Nn \g__regex_state_active_intarray { \l__regex_curr_state_int } #1 \exp_after:wN \__regex_use_state: \fi: } \int_set:Nn \l__regex_curr_state_int { \int_use:N \l__regex_curr_state_int } \tl_set:Nn \exp_not:N \l__regex_curr_submatches_prop { \exp_not:o \l__regex_curr_submatches_prop } } } \cs_new_protected:Npn \__regex_action_cost:n #1 { \exp_args:No \__regex_store_state:n { \__int_value:w \__int_eval:n { \l__regex_curr_state_int + #1 } } } \cs_new_protected:Npn \__regex_store_state:n #1 { \__regex_store_submatches: \__intarray_gset_fast:Nnn \g__regex_thread_state_intarray { \l__regex_max_active_int } {#1} \int_incr:N \l__regex_max_active_int } \cs_new_protected:Npn \__regex_store_submatches: { \__regex_toks_set:No \l__regex_max_active_int { \l__regex_curr_submatches_prop } } \cs_new_protected:Npn \__regex_disable_submatches: { \cs_set_protected:Npn \__regex_store_submatches: { } \cs_set_protected:Npn \__regex_action_submatch:n ##1 { } } \cs_new_protected:Npn \__regex_action_submatch:n #1 { \prop_put:Nno \l__regex_curr_submatches_prop {#1} { \int_use:N \l__regex_curr_pos_int } } \cs_new_protected:Npn \__regex_action_success: { \__regex_if_two_empty_matches:F { \bool_set_true:N \l__regex_match_success_bool \bool_set_eq:NN \l__regex_empty_success_bool \l__regex_fresh_thread_bool \int_set_eq:NN \l__regex_success_pos_int \l__regex_curr_pos_int \prop_set_eq:NN \l__regex_success_submatches_prop \l__regex_curr_submatches_prop \__prg_break: } } \int_new:N \l__regex_replacement_csnames_int \tl_new:N \l__regex_replacement_category_tl \seq_new:N \l__regex_replacement_category_seq \tl_new:N \l__regex_balance_tl \cs_new:Npn \__regex_replacement_balance_one_match:n #1 { - \__regex_submatch_balance:n {#1} } \cs_new:Npn \__regex_replacement_do_one_match:n #1 { \__regex_query_range:nn { \__intarray_item_fast:Nn \g__regex_submatch_prev_intarray {#1} } { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray {#1} } } \cs_new:Npn \__regex_replacement_exp_not:N #1 { \exp_not:n {#1} } \cs_new:Npn \__regex_query_range:nn #1#2 { \exp_after:wN \__regex_query_range_loop:ww \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; \__prg_break_point: } \cs_new:Npn \__regex_query_range_loop:ww #1 ; #2 ; { \if_int_compare:w #1 < #2 \exp_stop_f: \else: \exp_after:wN \__prg_break: \fi: \__regex_toks_use:w #1 \exp_stop_f: \exp_after:wN \__regex_query_range_loop:ww \__int_value:w \__int_eval:w #1 + 1 ; #2 ; } \cs_new:Npn \__regex_query_submatch:n #1 { \__regex_query_range:nn { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray {#1} } { \__intarray_item_fast:Nn \g__regex_submatch_end_intarray {#1} } } \cs_new_protected:Npn \__regex_submatch_balance:n #1 { \__int_eval:n { \int_compare:nNnTF { \__intarray_item_fast:Nn \g__regex_submatch_end_intarray {#1} } = 0 { 0 } { \__intarray_item_fast:Nn \g__regex_balance_intarray { \__intarray_item_fast:Nn \g__regex_submatch_end_intarray {#1} } } - \int_compare:nNnTF { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray {#1} } = 0 { 0 } { \__intarray_item_fast:Nn \g__regex_balance_intarray { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray {#1} } } } } \__debug_patch:nnNNpn { \__debug_trace_push:nnN { regex } { 1 } \__regex_replacement:n } { \__debug_trace_pop:nnN { regex } { 1 } \__regex_replacement:n } \cs_new_protected:Npn \__regex_replacement:n #1 { \__tl_build:Nw \l__regex_internal_a_tl \int_zero:N \l__regex_balance_int \tl_clear:N \l__regex_balance_tl \__regex_escape_use:nnnn { \if_charcode:w \c_right_brace_str ##1 \__regex_replacement_rbrace:N \else: \__regex_replacement_normal:n \fi: ##1 } { \__regex_replacement_escaped:N ##1 } { \__regex_replacement_normal:n ##1 } {#1} \prg_do_nothing: \prg_do_nothing: \if_int_compare:w \l__regex_replacement_csnames_int > 0 \exp_stop_f: \__msg_kernel_error:nnx { kernel } { replacement-missing-rbrace } { \int_use:N \l__regex_replacement_csnames_int } \__tl_build_one:x { \prg_replicate:nn \l__regex_replacement_csnames_int \cs_end: } \fi: \seq_if_empty:NF \l__regex_replacement_category_seq { \__msg_kernel_error:nnx { kernel } { replacement-missing-rparen } { \seq_count:N \l__regex_replacement_category_seq } \seq_clear:N \l__regex_replacement_category_seq } \cs_gset:Npx \__regex_replacement_balance_one_match:n ##1 { + \int_use:N \l__regex_balance_int \l__regex_balance_tl - \__regex_submatch_balance:n {##1} } \__tl_build_end: \exp_args:No \__regex_replacement_aux:n \l__regex_internal_a_tl } \cs_new_protected:Npn \__regex_replacement_aux:n #1 { \cs_set:Npn \__regex_replacement_do_one_match:n ##1 { \__regex_query_range:nn { \__intarray_item_fast:Nn \g__regex_submatch_prev_intarray {##1} } { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray {##1} } #1 } } \cs_new_protected:Npn \__regex_replacement_normal:n #1 { \tl_if_empty:NTF \l__regex_replacement_category_tl { \__tl_build_one:n {#1} } { % ( \token_if_eq_charcode:NNTF #1 ) { \seq_pop:NN \l__regex_replacement_category_seq \l__regex_replacement_category_tl } { \use:c { __regex_replacement_c_ \l__regex_replacement_category_tl :w } \__regex_replacement_normal:n {#1} } } } \cs_new_protected:Npn \__regex_replacement_escaped:N #1 { \cs_if_exist_use:cF { __regex_replacement_#1:w } { \if_int_compare:w 1 < 1#1 \exp_stop_f: \__regex_replacement_put_submatch:n {#1} \else: \exp_args:No \__regex_replacement_normal:n { \token_to_str:N #1 } \fi: } } \cs_new_protected:Npn \__regex_replacement_put_submatch:n #1 { \if_int_compare:w #1 < \l__regex_capturing_group_int \__tl_build_one:n { \__regex_query_submatch:n { #1 + ##1 } } \if_int_compare:w \l__regex_replacement_csnames_int = 0 \exp_stop_f: \tl_put_right:Nn \l__regex_balance_tl { + \__regex_submatch_balance:n { \__int_eval:n { #1+##1 } } } \fi: \fi: } \cs_new_protected:Npn \__regex_replacement_g:w #1#2 { \str_if_eq_x:nnTF { #1#2 } { \__regex_replacement_normal:n \c_left_brace_str } { \l__regex_internal_a_int = \__regex_replacement_g_digits:NN } { \__regex_replacement_error:NNN g #1 #2 } } \cs_new:Npn \__regex_replacement_g_digits:NN #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_replacement_normal:n { \if_int_compare:w 1 < 1#2 \exp_stop_f: #2 \exp_after:wN \use_i:nnn \exp_after:wN \__regex_replacement_g_digits:NN \else: \exp_stop_f: \exp_after:wN \__regex_replacement_error:NNN \exp_after:wN g \fi: } { \exp_stop_f: \if_meaning:w \__regex_replacement_rbrace:N #1 \exp_args:No \__regex_replacement_put_submatch:n { \int_use:N \l__regex_internal_a_int } \exp_after:wN \use_none:nn \else: \exp_after:wN \__regex_replacement_error:NNN \exp_after:wN g \fi: } #1 #2 } \cs_new_protected:Npn \__regex_replacement_c:w #1#2 { \token_if_eq_meaning:NNTF #1 \__regex_replacement_normal:n { \exp_after:wN \token_if_eq_charcode:NNTF \c_left_brace_str #2 { \__regex_replacement_cu_aux:Nw \__regex_replacement_exp_not:N } { \cs_if_exist:cTF { __regex_replacement_c_#2:w } { \__regex_replacement_cat:NNN #2 } { \__regex_replacement_error:NNN c #1#2 } } } { \__regex_replacement_error:NNN c #1#2 } } \cs_new_protected:Npn \__regex_replacement_cu_aux:Nw #1 { \if_case:w \l__regex_replacement_csnames_int \__tl_build_one:n { \exp_not:n { \exp_after:wN #1 \cs:w } } \else: \__tl_build_one:n { \exp_not:n { \exp_after:wN \tl_to_str:V \cs:w } } \fi: \int_incr:N \l__regex_replacement_csnames_int } \cs_new_protected:Npn \__regex_replacement_u:w #1#2 { \str_if_eq_x:nnTF { #1#2 } { \__regex_replacement_normal:n \c_left_brace_str } { \__regex_replacement_cu_aux:Nw \exp_not:V } { \__regex_replacement_error:NNN u #1#2 } } \cs_new_protected:Npn \__regex_replacement_rbrace:N #1 { \if_int_compare:w \l__regex_replacement_csnames_int > 0 \exp_stop_f: \__tl_build_one:n \cs_end: \int_decr:N \l__regex_replacement_csnames_int \else: \__regex_replacement_normal:n {#1} \fi: } \cs_new_protected:Npn \__regex_replacement_cat:NNN #1#2#3 { \token_if_eq_meaning:NNTF \prg_do_nothing: #3 { \__msg_kernel_error:nn { kernel } { replacement-catcode-end } } { \int_compare:nNnTF { \l__regex_replacement_csnames_int } > 0 { \__msg_kernel_error:nnnn { kernel } { replacement-catcode-in-cs } {#1} {#3} #2 #3 } { \str_if_eq:nnTF { #2 #3 } { \__regex_replacement_normal:n ( } % ) { \seq_push:NV \l__regex_replacement_category_seq \l__regex_replacement_category_tl \tl_set:Nn \l__regex_replacement_category_tl {#1} } { \token_if_eq_meaning:NNT #2 \__regex_replacement_escaped:N { \__regex_char_if_alphanumeric:NTF #3 { \__msg_kernel_error:nnnn { kernel } { replacement-catcode-escaped } {#1} {#3} } { } } \use:c { __regex_replacement_c_#1:w } #2 #3 } } } } \group_begin: \cs_new_protected:Npn \__regex_replacement_char:nNN #1#2#3 { \tex_lccode:D 0 = `#3 \scan_stop: \tex_lowercase:D { \__tl_build_one:n {#1} } } \char_set_catcode_active:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_A:w { \__regex_replacement_char:nNN { \exp_not:n { \exp_not:N ^^@ } } } \char_set_catcode_group_begin:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_B:w { \if_int_compare:w \l__regex_replacement_csnames_int = 0 \exp_stop_f: \int_incr:N \l__regex_balance_int \fi: \__regex_replacement_char:nNN { \exp_not:n { \exp_after:wN ^^@ \if_false: } \fi: } } } \cs_new_protected:Npn \__regex_replacement_c_C:w #1#2 { \__tl_build_one:n { \exp_not:N \exp_not:N \exp_not:c {#2} } } \char_set_catcode_math_subscript:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_D:w { \__regex_replacement_char:nNN { ^^@ } } \char_set_catcode_group_end:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_E:w { \if_int_compare:w \l__regex_replacement_csnames_int = 0 \exp_stop_f: \int_decr:N \l__regex_balance_int \fi: \__regex_replacement_char:nNN { \exp_not:n { \if_false: { \fi: ^^@ } } } \char_set_catcode_letter:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_L:w { \__regex_replacement_char:nNN { ^^@ } } \char_set_catcode_math_toggle:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_M:w { \__regex_replacement_char:nNN { ^^@ } } \char_set_catcode_other:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_O:w { \__regex_replacement_char:nNN { ^^@ } } \char_set_catcode_parameter:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_P:w { \__regex_replacement_char:nNN { \exp_not:n { \exp_not:n { ^^@^^@^^@^^@ } } } } \cs_new_protected:Npn \__regex_replacement_c_S:w #1#2 { \if_int_compare:w `#2 = 0 \exp_stop_f: \__msg_kernel_error:nn { kernel } { replacement-null-space } \fi: \tex_lccode:D `\ = `#2 \scan_stop: \tex_lowercase:D { \__tl_build_one:n {~} } } \char_set_catcode_alignment:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_T:w { \__regex_replacement_char:nNN { ^^@ } } \char_set_catcode_math_superscript:N \^^@ \cs_new_protected:Npn \__regex_replacement_c_U:w { \__regex_replacement_char:nNN { ^^@ } } \group_end: \cs_new_protected:Npn \__regex_replacement_error:NNN #1#2#3 { \__msg_kernel_error:nnx { kernel } { replacement-#1 } {#3} #2 #3 } \cs_new_protected:Npn \regex_new:N #1 { \cs_new_eq:NN #1 \c__regex_no_match_regex } \regex_new:N \l_tmpa_regex \regex_new:N \l_tmpb_regex \regex_new:N \g_tmpa_regex \regex_new:N \g_tmpb_regex \cs_new_protected:Npn \regex_set:Nn #1#2 { \__regex_compile:n {#2} \tl_set_eq:NN #1 \l__regex_internal_regex } \cs_new_protected:Npn \regex_gset:Nn #1#2 { \__regex_compile:n {#2} \tl_gset_eq:NN #1 \l__regex_internal_regex } \cs_new_protected:Npn \regex_const:Nn #1#2 { \__regex_compile:n {#2} \tl_const:Nx #1 { \exp_not:o \l__regex_internal_regex } } \cs_new_protected:Npn \regex_show:n #1 { \__regex_compile:n {#1} \__regex_show:N \l__regex_internal_regex \msg_show:nnxxxx { LaTeX / kernel } { show-regex } { \tl_to_str:n {#1} } { } { \l__regex_internal_a_tl } { } } \cs_new_protected:Npn \regex_show:N #1 { \__kernel_check_defined:NT #1 { \__regex_show:N #1 \msg_show:nnxxxx { LaTeX / kernel } { show-regex } { } { \token_to_str:N #1 } { \l__regex_internal_a_tl } { } } } \prg_new_protected_conditional:Npnn \regex_match:nn #1#2 { T , F , TF } { \__regex_if_match:nn { \__regex_build:n {#1} } {#2} \__regex_return: } \prg_new_protected_conditional:Npnn \regex_match:Nn #1#2 { T , F , TF } { \__regex_if_match:nn { \__regex_build:N #1 } {#2} \__regex_return: } \cs_new_protected:Npn \regex_count:nnN #1 { \__regex_count:nnN { \__regex_build:n {#1} } } \cs_new_protected:Npn \regex_count:NnN #1 { \__regex_count:nnN { \__regex_build:N #1 } } \cs_set_protected:Npn \__regex_tmp:w #1#2#3 { \cs_new_protected:Npn #2 ##1 { #1 { \__regex_build:n {##1} } } \cs_new_protected:Npn #3 ##1 { #1 { \__regex_build:N ##1 } } \prg_new_protected_conditional:Npnn #2 ##1##2##3 { T , F , TF } { #1 { \__regex_build:n {##1} } {##2} ##3 \__regex_return: } \prg_new_protected_conditional:Npnn #3 ##1##2##3 { T , F , TF } { #1 { \__regex_build:N ##1 } {##2} ##3 \__regex_return: } } \__regex_tmp:w \__regex_extract_once:nnN \regex_extract_once:nnN \regex_extract_once:NnN \__regex_tmp:w \__regex_extract_all:nnN \regex_extract_all:nnN \regex_extract_all:NnN \__regex_tmp:w \__regex_replace_once:nnN \regex_replace_once:nnN \regex_replace_once:NnN \__regex_tmp:w \__regex_replace_all:nnN \regex_replace_all:nnN \regex_replace_all:NnN \__regex_tmp:w \__regex_split:nnN \regex_split:nnN \regex_split:NnN \int_new:N \l__regex_match_count_int \flag_new:n { __regex_begin } \flag_new:n { __regex_end } \int_new:N \l__regex_min_submatch_int \int_new:N \l__regex_submatch_int \int_new:N \l__regex_zeroth_submatch_int \__intarray_new:Nn \g__regex_submatch_prev_intarray { 65536 } \__intarray_new:Nn \g__regex_submatch_begin_intarray { 65536 } \__intarray_new:Nn \g__regex_submatch_end_intarray { 65536 } \cs_new_protected:Npn \__regex_return: { \if_meaning:w \c_true_bool \g__regex_success_bool \prg_return_true: \else: \prg_return_false: \fi: } \cs_new_protected:Npn \__regex_if_match:nn #1#2 { \group_begin: \__regex_disable_submatches: \__regex_single_match: #1 \__regex_match:n {#2} \group_end: } \cs_new_protected:Npn \__regex_count:nnN #1#2#3 { \group_begin: \__regex_disable_submatches: \int_zero:N \l__regex_match_count_int \__regex_multi_match:n { \int_incr:N \l__regex_match_count_int } #1 \__regex_match:n {#2} \exp_args:NNNo \group_end: \int_set:Nn #3 { \int_use:N \l__regex_match_count_int } } \cs_new_protected:Npn \__regex_extract_once:nnN #1#2#3 { \group_begin: \__regex_single_match: #1 \__regex_match:n {#2} \__regex_extract: \__regex_group_end_extract_seq:N #3 } \cs_new_protected:Npn \__regex_extract_all:nnN #1#2#3 { \group_begin: \__regex_multi_match:n { \__regex_extract: } #1 \__regex_match:n {#2} \__regex_group_end_extract_seq:N #3 } \cs_new_protected:Npn \__regex_split:nnN #1#2#3 { \group_begin: \__regex_multi_match:n { \if_int_compare:w \l__regex_start_pos_int < \l__regex_success_pos_int \__regex_extract: \__intarray_gset_fast:Nnn \g__regex_submatch_prev_intarray { \l__regex_zeroth_submatch_int } { 0 } \__intarray_gset_fast:Nnn \g__regex_submatch_end_intarray { \l__regex_zeroth_submatch_int } { \__intarray_item_fast:Nn \g__regex_submatch_begin_intarray { \l__regex_zeroth_submatch_int } } \__intarray_gset_fast:Nnn \g__regex_submatch_begin_intarray { \l__regex_zeroth_submatch_int } { \l__regex_start_pos_int } \fi: } #1 \__regex_match:n {#2} \__intarray_gset_fast:Nnn \g__regex_submatch_prev_intarray { \l__regex_submatch_int } { 0 } \__intarray_gset_fast:Nnn \g__regex_submatch_end_intarray { \l__regex_submatch_int } { \l__regex_max_pos_int } \__intarray_gset_fast:Nnn \g__regex_submatch_begin_intarray { \l__regex_submatch_int } { \l__regex_start_pos_int } \int_incr:N \l__regex_submatch_int \if_meaning:w \c_true_bool \l__regex_empty_success_bool \if_int_compare:w \l__regex_start_pos_int = \l__regex_max_pos_int \int_decr:N \l__regex_submatch_int \fi: \fi: \__regex_group_end_extract_seq:N #3 } \cs_new_protected:Npn \__regex_group_end_extract_seq:N #1 { \cs_set_eq:NN \__seq_item:n \scan_stop: \flag_clear:n { __regex_begin } \flag_clear:n { __regex_end } \tl_set:Nx \l__regex_internal_a_tl { \s__seq \int_step_function:nnnN { \l__regex_min_submatch_int } { 1 } { \l__regex_submatch_int - 1 } \__regex_extract_seq_aux:n } \int_compare:nNnF { \flag_height:n { __regex_begin } + \flag_height:n { __regex_end } } = 0 { \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } { splitting~or~extracting~submatches } { \flag_height:n { __regex_end } } { \flag_height:n { __regex_begin } } } \use:x { \group_end: \tl_set:Nn \exp_not:N #1 { \l__regex_internal_a_tl } } } \cs_new:Npn \__regex_extract_seq_aux:n #1 { \__seq_item:n { \exp_after:wN \__regex_extract_seq_aux:ww \__int_value:w \__regex_submatch_balance:n {#1} ; #1; } } \cs_new:Npn \__regex_extract_seq_aux:ww #1; #2; { \if_int_compare:w #1 < 0 \exp_stop_f: \flag_raise:n { __regex_end } \prg_replicate:nn {-#1} { \exp_not:n { { \if_false: } \fi: } } \fi: \__regex_query_submatch:n {#2} \if_int_compare:w #1 > 0 \exp_stop_f: \flag_raise:n { __regex_begin } \prg_replicate:nn {#1} { \exp_not:n { \if_false: { \fi: } } } \fi: } \cs_new_protected:Npn \__regex_extract: { \if_meaning:w \c_true_bool \g__regex_success_bool \int_set_eq:NN \l__regex_zeroth_submatch_int \l__regex_submatch_int \prg_replicate:nn \l__regex_capturing_group_int { \__intarray_gset_fast:Nnn \g__regex_submatch_begin_intarray { \l__regex_submatch_int } { 0 } \__intarray_gset_fast:Nnn \g__regex_submatch_end_intarray { \l__regex_submatch_int } { 0 } \__intarray_gset_fast:Nnn \g__regex_submatch_prev_intarray { \l__regex_submatch_int } { 0 } \int_incr:N \l__regex_submatch_int } \prop_map_inline:Nn \l__regex_success_submatches_prop { \if_int_compare:w ##1 - 1 \exp_stop_f: \exp_after:wN \__regex_extract_e:wn \__int_value:w \else: \exp_after:wN \__regex_extract_b:wn \__int_value:w \fi: \__int_eval:w \l__regex_zeroth_submatch_int + ##1 {##2} } \__intarray_gset_fast:Nnn \g__regex_submatch_prev_intarray { \l__regex_zeroth_submatch_int } { \l__regex_start_pos_int } \fi: } \cs_new_protected:Npn \__regex_extract_b:wn #1 < #2 { \__intarray_gset_fast:Nnn \g__regex_submatch_begin_intarray {#1} {#2} } \cs_new_protected:Npn \__regex_extract_e:wn #1 > #2 { \__intarray_gset_fast:Nnn \g__regex_submatch_end_intarray {#1} {#2} } \cs_new_protected:Npn \__regex_replace_once:nnN #1#2#3 { \group_begin: \__regex_single_match: #1 \__regex_replacement:n {#2} \exp_args:No \__regex_match:n { #3 } \if_meaning:w \c_false_bool \g__regex_success_bool \group_end: \else: \__regex_extract: \int_set:Nn \l__regex_balance_int { \__regex_replacement_balance_one_match:n { \l__regex_zeroth_submatch_int } } \tl_set:Nx \l__regex_internal_a_tl { \__regex_replacement_do_one_match:n { \l__regex_zeroth_submatch_int } \__regex_query_range:nn { \__intarray_item_fast:Nn \g__regex_submatch_end_intarray { \l__regex_zeroth_submatch_int } } { \l__regex_max_pos_int } } \__regex_group_end_replace:N #3 \fi: } \cs_new_protected:Npn \__regex_replace_all:nnN #1#2#3 { \group_begin: \__regex_multi_match:n { \__regex_extract: } #1 \__regex_replacement:n {#2} \exp_args:No \__regex_match:n {#3} \int_set:Nn \l__regex_balance_int { 0 \int_step_function:nnnN { \l__regex_min_submatch_int } \l__regex_capturing_group_int { \l__regex_submatch_int - 1 } \__regex_replacement_balance_one_match:n } \tl_set:Nx \l__regex_internal_a_tl { \int_step_function:nnnN { \l__regex_min_submatch_int } \l__regex_capturing_group_int { \l__regex_submatch_int - 1 } \__regex_replacement_do_one_match:n \__regex_query_range:nn \l__regex_start_pos_int \l__regex_max_pos_int } \__regex_group_end_replace:N #3 } \cs_new_protected:Npn \__regex_group_end_replace:N #1 { \if_int_compare:w \l__regex_balance_int = 0 \exp_stop_f: \else: \__msg_kernel_error:nnxxx { kernel } { result-unbalanced } { replacing } { \int_max:nn { - \l__regex_balance_int } { 0 } } { \int_max:nn { \l__regex_balance_int } { 0 } } \fi: \use:x { \group_end: \tl_set:Nn \exp_not:N #1 { \if_int_compare:w \l__regex_balance_int < 0 \exp_stop_f: \prg_replicate:nn { - \l__regex_balance_int } { { \if_false: } \fi: } \fi: \l__regex_internal_a_tl \if_int_compare:w \l__regex_balance_int > 0 \exp_stop_f: \prg_replicate:nn { \l__regex_balance_int } { \if_false: { \fi: } } \fi: } } } \__msg_kernel_new:nnnn { kernel } { trailing-backslash } { Trailing~escape~character~'\iow_char:N\\'. } { A~regular~expression~or~its~replacement~text~ends~with~ the~escape~character~'\iow_char:N\\'.~It~will~be~ignored. } \__msg_kernel_new:nnnn { kernel } { x-missing-rbrace } { Missing~closing~brace~in~'\iow_char:N\\x'~hexadecimal~sequence. } { You~wrote~something~like~ '\iow_char:N\\x\{...#1'.~ The~closing~brace~is~missing. } \__msg_kernel_new:nnnn { kernel } { x-overflow } { Character~code~'#1'~too~large~in~'\iow_char:N\\x'~hexadecimal~sequence. } { You~wrote~something~like~ '\iow_char:N\\x\{\int_to_Hex:n{#1}\}'.~ The~character~code~#1~is~larger~than~ the~maximum~value~\int_use:N \c_max_char_int. } \__msg_kernel_new:nnnn { kernel } { invalid-quantifier } { Braced~quantifier~'#1'~may~not~be~followed~by~'#2'. } { The~character~'#2'~is~invalid~in~the~braced~quantifier~'#1'.~ The~only~valid~quantifiers~are~'*',~'?',~'+',~'{}',~ '{,}'~and~'{,}',~optionally~followed~by~'?'. } \__msg_kernel_new:nnnn { kernel } { missing-rbrack } { Missing~right~bracket~inserted~in~regular~expression. } { LaTeX~was~given~a~regular~expression~where~a~character~class~ was~started~with~'[',~but~the~matching~']'~is~missing. } \__msg_kernel_new:nnnn { kernel } { missing-rparen } { Missing~right~ \int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } ~ inserted~in~regular~expression. } { LaTeX~was~given~a~regular~expression~with~\int_eval:n {#1} ~ more~left~parentheses~than~right~parentheses. } \__msg_kernel_new:nnnn { kernel } { extra-rparen } { Extra~right~parenthesis~ignored~in~regular~expression. } { LaTeX~came~across~a~closing~parenthesis~when~no~submatch~group~ was~open.~The~parenthesis~will~be~ignored. } \__msg_kernel_new:nnnn { kernel } { bad-escape } { Invalid~escape~'\iow_char:N\\#1'~ \__regex_if_in_cs:TF { within~a~control~sequence. } { \__regex_if_in_class:TF { in~a~character~class. } { following~a~category~test. } } } { The~escape~sequence~'\iow_char:N\\#1'~may~not~appear~ \__regex_if_in_cs:TF { within~a~control~sequence~test~introduced~by~ '\iow_char:N\\c\iow_char:N\{'. } { \__regex_if_in_class:TF { within~a~character~class~ } { following~a~category~test~such~as~'\iow_char:N\\cL'~ } because~it~does~not~match~exactly~one~character. } } \__msg_kernel_new:nnnn { kernel } { range-missing-end } { Invalid~end-point~for~range~'#1-#2'~in~character~class. } { The~end-point~'#2'~of~the~range~'#1-#2'~may~not~serve~as~an~ end-point~for~a~range:~alphanumeric~characters~should~not~be~ escaped,~and~non-alphanumeric~characters~should~be~escaped. } \__msg_kernel_new:nnnn { kernel } { range-backwards } { Range~'[#1-#2]'~out~of~order~in~character~class. } { In~ranges~of~characters~'[x-y]'~appearing~in~character~classes,~ the~first~character~code~must~not~be~larger~than~the~second.~ Here,~'#1'~has~character~code~\int_eval:n {`#1},~while~ '#2'~has~character~code~\int_eval:n {`#2}. } \__msg_kernel_new:nnnn { kernel } { c-bad-mode } { Invalid~nested~'\iow_char:N\\c'~escape~in~regular~expression. } { The~'\iow_char:N\\c'~escape~cannot~be~used~within~ a~control~sequence~test~'\iow_char:N\\c{...}'.~ To~combine~several~category~tests,~use~'\iow_char:N\\c[...]'. } \__msg_kernel_new:nnnn { kernel } { c-C-invalid } { '\iow_char:N\\cC'~should~be~followed~by~'.'~or~'(',~not~'#1'. } { The~'\iow_char:N\\cC'~construction~restricts~the~next~item~to~be~a~ control~sequence~or~the~next~group~to~be~made~of~control~sequences.~ It~only~makes~sense~to~follow~it~by~'.'~or~by~a~group. } \__msg_kernel_new:nnnn { kernel } { c-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\c'~escape. } { LaTeX~was~given~a~regular~expression~where~a~ '\iow_char:N\\c\iow_char:N\{...'~construction~was~not~ended~ with~a~closing~brace~'\iow_char:N\}'. } \__msg_kernel_new:nnnn { kernel } { c-missing-rbrack } { Missing~right~bracket~inserted~for~'\iow_char:N\\c'~escape. } { A~construction~'\iow_char:N\\c[...'~appears~in~a~ regular~expression,~but~the~closing~']'~is~not~present. } \__msg_kernel_new:nnnn { kernel } { c-missing-category } { Invalid~character~'#1'~following~'\iow_char:N\\c'~escape. } { In~regular~expressions,~the~'\iow_char:N\\c'~escape~sequence~ may~only~be~followed~by~a~left~brace,~a~left~bracket,~or~a~ capital~letter~representing~a~character~category,~namely~ one~of~'ABCDELMOPSTU'. } \__msg_kernel_new:nnnn { kernel } { c-trailing } { Trailing~category~code~escape~'\iow_char:N\\c'... } { A~regular~expression~ends~with~'\iow_char:N\\c'~followed~ by~a~letter.~It~will~be~ignored. } \__msg_kernel_new:nnnn { kernel } { u-missing-lbrace } { Missing~left~brace~following~'\iow_char:N\\u'~escape. } { The~'\iow_char:N\\u'~escape~sequence~must~be~followed~by~ a~brace~group~with~the~name~of~the~variable~to~use. } \__msg_kernel_new:nnnn { kernel } { u-missing-rbrace } { Missing~right~brace~inserted~for~'\iow_char:N\\u'~escape. } { LaTeX~ \str_if_eq_x:nnTF { } {#2} { reached~the~end~of~the~string~ } { encountered~an~escaped~alphanumeric~character '\iow_char:N\\#2'~ } when~parsing~the~argument~of~an~'\iow_char:N\\u\iow_char:N\{...\}'~escape. } \__msg_kernel_new:nnnn { kernel } { posix-unsupported } { POSIX~collating~element~'[#1 ~ #1]'~not~supported. } { The~'[.foo.]'~and~'[=bar=]'~syntaxes~have~a~special~meaning~ in~POSIX~regular~expressions.~This~is~not~supported~by~LaTeX.~ Maybe~you~forgot~to~escape~a~left~bracket~in~a~character~class? } \__msg_kernel_new:nnnn { kernel } { posix-unknown } { POSIX~class~'[:#1:]'~unknown. } { '[:#1:]'~is~not~among~the~known~POSIX~classes~ '[:alnum:]',~'[:alpha:]',~'[:ascii:]',~'[:blank:]',~ '[:cntrl:]',~'[:digit:]',~'[:graph:]',~'[:lower:]',~ '[:print:]',~'[:punct:]',~'[:space:]',~'[:upper:]',~ '[:word:]',~and~'[:xdigit:]'. } \__msg_kernel_new:nnnn { kernel } { posix-missing-close } { Missing~closing~':]'~for~POSIX~class. } { The~POSIX~syntax~'#1'~must~be~followed~by~':]',~not~'#2'. } \__msg_kernel_new:nnnn { kernel } { result-unbalanced } { Missing~brace~inserted~when~#1. } { LaTeX~was~asked~to~do~some~regular~expression~operation,~ and~the~resulting~token~list~would~not~have~the~same~number~ of~begin-group~and~end-group~tokens.~Braces~were~inserted:~ #2~left,~#3~right. } \__msg_kernel_new:nnnn { kernel } { unknown-option } { Unknown~option~'#1'~for~regular~expressions. } { The~only~available~option~is~'case-insensitive',~toggled~by~ '(?i)'~and~'(?-i)'. } \__msg_kernel_new:nnnn { kernel } { special-group-unknown } { Unknown~special~group~'#1~...'~in~a~regular~expression. } { The~only~valid~constructions~starting~with~'(?'~are~ '(?:~...~)',~'(?|~...~)',~'(?i)',~and~'(?-i)'. } \__msg_kernel_new:nnnn { kernel } { replacement-c } { Misused~'\iow_char:N\\c'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~ can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~ or~a~brace~group,~not~by~'#1'. } \__msg_kernel_new:nnnn { kernel } { replacement-u } { Misused~'\iow_char:N\\u'~command~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\u'~escape~sequence~ must~be~~followed~by~a~brace~group~holding~the~name~of~the~ variable~to~use. } \__msg_kernel_new:nnnn { kernel } { replacement-g } { Missing~brace~for~the~'\iow_char:N\\g'~construction~ in~a~replacement~text. } { In~the~replacement~text~for~a~regular~expression~search,~ submatches~are~represented~either~as~'\iow_char:N \\g{dd..d}',~ or~'\\d',~where~'d'~are~single~digits.~Here,~a~brace~is~missing. } \__msg_kernel_new:nnnn { kernel } { replacement-catcode-end } { Missing~character~for~the~'\iow_char:N\\c'~ construction~in~a~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~ can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~representing~ the~character~category.~Then,~a~character~must~follow.~LaTeX~ reached~the~end~of~the~replacement~when~looking~for~that. } \__msg_kernel_new:nnnn { kernel } { replacement-catcode-escaped } { Escaped~letter~or~digit~after~category~code~in~replacement~text. } { In~a~replacement~text,~the~'\iow_char:N\\c'~escape~sequence~ can~be~followed~by~one~of~the~letters~'ABCDELMOPSTU'~representing~ the~character~category.~Then,~a~character~must~follow,~not~ '\iow_char:N\\#2'. } \__msg_kernel_new:nnnn { kernel } { replacement-catcode-in-cs } { Category~code~'\iow_char:N\\c#1#3'~ignored~inside~ '\iow_char:N\\c\{...\}'~in~a~replacement~text. } { In~a~replacement~text,~the~category~codes~of~the~argument~of~ '\iow_char:N\\c\{...\}'~are~ignored~when~building~the~control~ sequence~name. } \__msg_kernel_new:nnnn { kernel } { replacement-null-space } { TeX~cannot~build~a~space~token~with~character~code~0. } { You~asked~for~a~character~token~with~category~space,~ and~character~code~0,~for~instance~through~ '\iow_char:N\\cS\iow_char:N\\x00'.~ This~specific~case~is~impossible~and~will~be~replaced~ by~a~normal~space. } \__msg_kernel_new:nnnn { kernel } { replacement-missing-rbrace } { Missing~right~brace~inserted~in~replacement~text. } { There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~ missing~right~\int_compare:nTF { #1 = 1 } { brace } { braces } . } \__msg_kernel_new:nnnn { kernel } { replacement-missing-rparen } { Missing~right~parenthesis~inserted~in~replacement~text. } { There~ \int_compare:nTF { #1 = 1 } { was } { were } ~ #1~ missing~right~\int_compare:nTF { #1 = 1 } { parenthesis } { parentheses } . } \__msg_kernel_new:nnn { kernel } { show-regex } { >~Compiled~regex~ \tl_if_empty:nTF {#1} { variable~ #2 } { {#1} } : #3 } \cs_new:Npn \__regex_msg_repeated:nnN #1#2#3 { \str_if_eq_x:nnF { #1 #2 } { 1 0 } { , ~ repeated ~ \int_case:nnF {#2} { { -1 } { #1~or~more~times,~\bool_if:NTF #3 { lazy } { greedy } } { 0 } { #1~times } } { between~#1~and~\int_eval:n {#1+#2}~times,~ \bool_if:NTF #3 { lazy } { greedy } } } } \__debug:TF { \cs_new_protected:Npn \__debug_trace_push:nnN #1#2#3 { \__debug_trace:nnx {#1} {#2} { entering~ \token_to_str:N #3 } } \cs_new_protected:Npn \__debug_trace_pop:nnN #1#2#3 { \__debug_trace:nnx {#1} {#2} { leaving~ \token_to_str:N #3 } } \cs_new_protected:Npn \__debug_trace:nnx #1#2#3 { \int_compare:nNnF { \int_use:c { g__debug_trace_#1_int } } < {#2} { \iow_term:x { Trace:~#3 } } } } { } \int_new:N \g__debug_trace_regex_int \__debug:TF { \cs_new_protected:Npn \__regex_trace_states:n #1 { \int_step_inline:nnnn \l__regex_min_state_int { 1 } { \l__regex_max_state_int - 1 } { \__debug_trace:nnx { regex } {#1} { \iow_char:N \\toks ##1 = { \__regex_toks_use:w ##1 } } } } } { } %% File: l3box.dtx Copyright (C) 2005-2017 The LaTeX3 Project \cs_new_protected:Npn \box_new:N #1 { \__chk_if_free_cs:N #1 \cs:w newbox \cs_end: #1 } \cs_generate_variant:Nn \box_new:N { c } \cs_new_protected:Npn \box_clear:N #1 { \box_set_eq:NN #1 \c_empty_box } \cs_new_protected:Npn \box_gclear:N #1 { \box_gset_eq:NN #1 \c_empty_box } \cs_generate_variant:Nn \box_clear:N { c } \cs_generate_variant:Nn \box_gclear:N { c } \cs_new_protected:Npn \box_clear_new:N #1 { \box_if_exist:NTF #1 { \box_clear:N #1 } { \box_new:N #1 } } \cs_new_protected:Npn \box_gclear_new:N #1 { \box_if_exist:NTF #1 { \box_gclear:N #1 } { \box_new:N #1 } } \cs_generate_variant:Nn \box_clear_new:N { c } \cs_generate_variant:Nn \box_gclear_new:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq:NN #1#2 { \tex_setbox:D #1 \tex_copy:D #2 } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_copy:D #2 } \cs_generate_variant:Nn \box_set_eq:NN { c , Nc , cc } \cs_generate_variant:Nn \box_gset_eq:NN { c , Nc , cc } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_eq_clear:NN #1#2 { \tex_setbox:D #1 \tex_box:D #2 } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_eq_clear:NN #1#2 { \tex_global:D \tex_setbox:D #1 \tex_box:D #2 } \cs_generate_variant:Nn \box_set_eq_clear:NN { c , Nc , cc } \cs_generate_variant:Nn \box_gset_eq_clear:NN { c , Nc , cc } \prg_new_eq_conditional:NNn \box_if_exist:N \cs_if_exist:N { TF , T , F , p } \prg_new_eq_conditional:NNn \box_if_exist:c \cs_if_exist:c { TF , T , F , p } \cs_new_eq:NN \box_ht:N \tex_ht:D \cs_new_eq:NN \box_dp:N \tex_dp:D \cs_new_eq:NN \box_wd:N \tex_wd:D \cs_generate_variant:Nn \box_ht:N { c } \cs_generate_variant:Nn \box_dp:N { c } \cs_generate_variant:Nn \box_wd:N { c } \cs_new_protected:Npn \box_set_dp:Nn #1#2 { \box_dp:N #1 \__dim_eval:n {#2} } \cs_new_protected:Npn \box_set_ht:Nn #1#2 { \box_ht:N #1 \__dim_eval:n {#2} } \cs_new_protected:Npn \box_set_wd:Nn #1#2 { \box_wd:N #1 \__dim_eval:n {#2} } \cs_generate_variant:Nn \box_set_ht:Nn { c } \cs_generate_variant:Nn \box_set_dp:Nn { c } \cs_generate_variant:Nn \box_set_wd:Nn { c } \cs_new_eq:NN \box_use_drop:N \tex_box:D \cs_new_eq:NN \box_use:N \tex_copy:D \cs_generate_variant:Nn \box_use_drop:N { c } \cs_generate_variant:Nn \box_use:N { c } \cs_new_protected:Npn \box_move_left:nn #1#2 { \tex_moveleft:D \__dim_eval:n {#1} #2 } \cs_new_protected:Npn \box_move_right:nn #1#2 { \tex_moveright:D \__dim_eval:n {#1} #2 } \cs_new_protected:Npn \box_move_up:nn #1#2 { \tex_raise:D \__dim_eval:n {#1} #2 } \cs_new_protected:Npn \box_move_down:nn #1#2 { \tex_lower:D \__dim_eval:n {#1} #2 } \cs_new_eq:NN \if_hbox:N \tex_ifhbox:D \cs_new_eq:NN \if_vbox:N \tex_ifvbox:D \cs_new_eq:NN \if_box_empty:N \tex_ifvoid:D \prg_new_conditional:Npnn \box_if_horizontal:N #1 { p , T , F , TF } { \if_hbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Npnn \box_if_vertical:N #1 { p , T , F , TF } { \if_vbox:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \box_if_horizontal:N { c } { p , T , F , TF } \prg_generate_conditional_variant:Nnn \box_if_vertical:N { c } { p , T , F , TF } \prg_new_conditional:Npnn \box_if_empty:N #1 { p , T , F , TF } { \if_box_empty:N #1 \prg_return_true: \else: \prg_return_false: \fi: } \prg_generate_conditional_variant:Nnn \box_if_empty:N { c } { p , T , F , TF } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \box_set_to_last:N #1 { \tex_setbox:D #1 \tex_lastbox:D } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \box_gset_to_last:N #1 { \tex_global:D \tex_setbox:D #1 \tex_lastbox:D } \cs_generate_variant:Nn \box_set_to_last:N { c } \cs_generate_variant:Nn \box_gset_to_last:N { c } \box_new:N \c_empty_box \box_new:N \l_tmpa_box \box_new:N \l_tmpb_box \box_new:N \g_tmpa_box \box_new:N \g_tmpb_box \cs_new_protected:Npn \box_show:N #1 { \box_show:Nnn #1 \c_max_int \c_max_int } \cs_generate_variant:Nn \box_show:N { c } \cs_new_protected:Npn \box_show:Nnn #1#2#3 { \__box_show:NNff 1 #1 { \int_eval:n {#2} } { \int_eval:n {#3} } } \cs_generate_variant:Nn \box_show:Nnn { c } \cs_new_protected:Npn \box_log:N #1 { \box_log:Nnn #1 \c_max_int \c_max_int } \cs_generate_variant:Nn \box_log:N { c } \cs_new_protected:Npn \box_log:Nnn { \exp_args:No \__box_log:nNnn { \tex_the:D \etex_interactionmode:D } } \cs_new_protected:Npn \__box_log:nNnn #1#2#3#4 { \int_set:Nn \etex_interactionmode:D { 0 } \__box_show:NNff 0 #2 { \int_eval:n {#3} } { \int_eval:n {#4} } \int_set:Nn \etex_interactionmode:D {#1} } \cs_generate_variant:Nn \box_log:Nnn { c } \cs_new_protected:Npn \__box_show:NNnn #1#2#3#4 { \box_if_exist:NTF #2 { \group_begin: \int_set:Nn \tex_showboxbreadth:D {#3} \int_set:Nn \tex_showboxdepth:D {#4} \int_set:Nn \tex_tracingonline:D {#1} \int_set:Nn \tex_errorcontextlines:D { -1 } \tex_showbox:D \use:n {#2} \group_end: } { \__msg_kernel_error:nnx { kernel } { variable-not-defined } { \token_to_str:N #2 } } } \cs_generate_variant:Nn \__box_show:NNnn { NNff } \cs_new_protected:Npn \hbox:n #1 { \tex_hbox:D \scan_stop: { \group_begin: #1 \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D { \group_begin: #2 \group_end: } } \cs_generate_variant:Nn \hbox_set:Nn { c } \cs_generate_variant:Nn \hbox_gset:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set_to_wd:Nnn #1#2#3 { \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2} { \group_begin: #3 \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset_to_wd:Nnn #1#2#3 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2} { \group_begin: #3 \group_end: } } \cs_generate_variant:Nn \hbox_set_to_wd:Nnn { c } \cs_generate_variant:Nn \hbox_gset_to_wd:Nnn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set:Nw #1 { \tex_setbox:D #1 \tex_hbox:D \c_group_begin_token \group_begin: } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D \c_group_begin_token \group_begin: } \cs_generate_variant:Nn \hbox_set:Nw { c } \cs_generate_variant:Nn \hbox_gset:Nw { c } \cs_new_protected:Npn \hbox_set_end: { \group_end: \c_group_end_token } \cs_new_eq:NN \hbox_gset_end: \hbox_set_end: \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \hbox_set_to_wd:Nnw #1#2 { \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2} \c_group_begin_token \group_begin: } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \hbox_gset_to_wd:Nnw #1#2 { \tex_global:D \tex_setbox:D #1 \tex_hbox:D to \__dim_eval:n {#2} \c_group_begin_token \group_begin: } \cs_generate_variant:Nn \hbox_set_to_wd:Nnw { c } \cs_generate_variant:Nn \hbox_gset_to_wd:Nnw { c } \cs_new_protected:Npn \hbox_to_wd:nn #1#2 { \tex_hbox:D to \__dim_eval:n {#1} { \group_begin: #2 \group_end: } } \cs_new_protected:Npn \hbox_to_zero:n #1 { \tex_hbox:D to \c_zero_dim { \group_begin: #1 \group_end: } } \cs_new_protected:Npn \hbox_overlap_left:n #1 { \hbox_to_zero:n { \tex_hss:D #1 } } \cs_new_protected:Npn \hbox_overlap_right:n #1 { \hbox_to_zero:n { #1 \tex_hss:D } } \cs_new_eq:NN \hbox_unpack:N \tex_unhcopy:D \cs_new_eq:NN \hbox_unpack_clear:N \tex_unhbox:D \cs_generate_variant:Nn \hbox_unpack:N { c } \cs_generate_variant:Nn \hbox_unpack_clear:N { c } \cs_new_protected:Npn \vbox:n #1 { \tex_vbox:D { \group_begin: #1 \par \group_end: } } \cs_new_protected:Npn \vbox_top:n #1 { \tex_vtop:D { \group_begin: #1 \par \group_end: } } \cs_new_protected:Npn \vbox_to_ht:nn #1#2 { \tex_vbox:D to \__dim_eval:n {#1} { \group_begin: #2 \par \group_end: } } \cs_new_protected:Npn \vbox_to_zero:n #1 { \tex_vbox:D to \c_zero_dim { \group_begin: #1 \par \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_vbox:D { \group_begin: #2 \par \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D { \group_begin: #2 \par \group_end: } } \cs_generate_variant:Nn \vbox_set:Nn { c } \cs_generate_variant:Nn \vbox_gset:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_top:Nn #1#2 { \tex_setbox:D #1 \tex_vtop:D { \group_begin: #2 \par \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset_top:Nn #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vtop:D { \group_begin: #2 \par \group_end: } } \cs_generate_variant:Nn \vbox_set_top:Nn { c } \cs_generate_variant:Nn \vbox_gset_top:Nn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3 { \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2} { \group_begin: #3 \par \group_end: } } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset_to_ht:Nnn #1#2#3 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2} { \group_begin: #3 \par \group_end: } } \cs_generate_variant:Nn \vbox_set_to_ht:Nnn { c } \cs_generate_variant:Nn \vbox_gset_to_ht:Nnn { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set:Nw #1 { \tex_setbox:D #1 \tex_vbox:D \c_group_begin_token \group_begin: } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset:Nw #1 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D \c_group_begin_token \group_begin: } \cs_generate_variant:Nn \vbox_set:Nw { c } \cs_generate_variant:Nn \vbox_gset:Nw { c } \cs_new_protected:Npn \vbox_set_end: { \par \group_end: \c_group_end_token } \cs_new_eq:NN \vbox_gset_end: \vbox_set_end: \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_to_ht:Nnw #1#2 { \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2} \c_group_begin_token \group_begin: } \__debug_patch:nnNNpn { \__debug_chk_var_global:N #1 } { } \cs_new_protected:Npn \vbox_gset_to_ht:Nnw #1#2 { \tex_global:D \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:n {#2} \c_group_begin_token \group_begin: } \cs_generate_variant:Nn \vbox_set_to_ht:Nnw { c } \cs_generate_variant:Nn \vbox_gset_to_ht:Nnw { c } \cs_new_eq:NN \vbox_unpack:N \tex_unvcopy:D \cs_new_eq:NN \vbox_unpack_clear:N \tex_unvbox:D \cs_generate_variant:Nn \vbox_unpack:N { c } \cs_generate_variant:Nn \vbox_unpack_clear:N { c } \__debug_patch:nnNNpn { \__debug_chk_var_local:N #1 } { } \cs_new_protected:Npn \vbox_set_split_to_ht:NNn #1#2#3 { \tex_setbox:D #1 \tex_vsplit:D #2 to \__dim_eval:n {#3} } \fp_new:N \l__box_angle_fp \fp_new:N \l__box_cos_fp \fp_new:N \l__box_sin_fp \dim_new:N \l__box_top_dim \dim_new:N \l__box_bottom_dim \dim_new:N \l__box_left_dim \dim_new:N \l__box_right_dim \dim_new:N \l__box_top_new_dim \dim_new:N \l__box_bottom_new_dim \dim_new:N \l__box_left_new_dim \dim_new:N \l__box_right_new_dim \box_new:N \l__box_internal_box \cs_new_protected:Npn \box_rotate:Nn #1#2 { \hbox_set:Nn #1 { \fp_set:Nn \l__box_angle_fp {#2} \fp_set:Nn \l__box_sin_fp { sind ( \l__box_angle_fp ) } \fp_set:Nn \l__box_cos_fp { cosd ( \l__box_angle_fp ) } \__box_rotate:N #1 } } \cs_new_protected:Npn \__box_rotate:N #1 { \dim_set:Nn \l__box_top_dim { \box_ht:N #1 } \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 } \dim_set:Nn \l__box_right_dim { \box_wd:N #1 } \dim_zero:N \l__box_left_dim \fp_compare:nNnTF \l__box_sin_fp > \c_zero_fp { \fp_compare:nNnTF \l__box_cos_fp > \c_zero_fp { \__box_rotate_quadrant_one: } { \__box_rotate_quadrant_two: } } { \fp_compare:nNnTF \l__box_cos_fp < \c_zero_fp { \__box_rotate_quadrant_three: } { \__box_rotate_quadrant_four: } } \hbox_set:Nn \l__box_internal_box { \box_use:N #1 } \hbox_set:Nn \l__box_internal_box { \tex_kern:D -\l__box_left_new_dim \hbox:n { \driver_box_use_rotate:Nn \l__box_internal_box \l__box_angle_fp } } \box_set_ht:Nn \l__box_internal_box { \l__box_top_new_dim } \box_set_dp:Nn \l__box_internal_box { -\l__box_bottom_new_dim } \box_set_wd:Nn \l__box_internal_box { \l__box_right_new_dim - \l__box_left_new_dim } \box_use_drop:N \l__box_internal_box } \cs_new_protected:Npn \__box_rotate_x:nnN #1#2#3 { \dim_set:Nn #3 { \fp_to_dim:n { \l__box_cos_fp * \dim_to_fp:n {#1} - \l__box_sin_fp * \dim_to_fp:n {#2} } } } \cs_new_protected:Npn \__box_rotate_y:nnN #1#2#3 { \dim_set:Nn #3 { \fp_to_dim:n { \l__box_sin_fp * \dim_to_fp:n {#1} + \l__box_cos_fp * \dim_to_fp:n {#2} } } } \cs_new_protected:Npn \__box_rotate_quadrant_one: { \__box_rotate_y:nnN \l__box_right_dim \l__box_top_dim \l__box_top_new_dim \__box_rotate_y:nnN \l__box_left_dim \l__box_bottom_dim \l__box_bottom_new_dim \__box_rotate_x:nnN \l__box_left_dim \l__box_top_dim \l__box_left_new_dim \__box_rotate_x:nnN \l__box_right_dim \l__box_bottom_dim \l__box_right_new_dim } \cs_new_protected:Npn \__box_rotate_quadrant_two: { \__box_rotate_y:nnN \l__box_right_dim \l__box_bottom_dim \l__box_top_new_dim \__box_rotate_y:nnN \l__box_left_dim \l__box_top_dim \l__box_bottom_new_dim \__box_rotate_x:nnN \l__box_right_dim \l__box_top_dim \l__box_left_new_dim \__box_rotate_x:nnN \l__box_left_dim \l__box_bottom_dim \l__box_right_new_dim } \cs_new_protected:Npn \__box_rotate_quadrant_three: { \__box_rotate_y:nnN \l__box_left_dim \l__box_bottom_dim \l__box_top_new_dim \__box_rotate_y:nnN \l__box_right_dim \l__box_top_dim \l__box_bottom_new_dim \__box_rotate_x:nnN \l__box_right_dim \l__box_bottom_dim \l__box_left_new_dim \__box_rotate_x:nnN \l__box_left_dim \l__box_top_dim \l__box_right_new_dim } \cs_new_protected:Npn \__box_rotate_quadrant_four: { \__box_rotate_y:nnN \l__box_left_dim \l__box_top_dim \l__box_top_new_dim \__box_rotate_y:nnN \l__box_right_dim \l__box_bottom_dim \l__box_bottom_new_dim \__box_rotate_x:nnN \l__box_left_dim \l__box_bottom_dim \l__box_left_new_dim \__box_rotate_x:nnN \l__box_right_dim \l__box_top_dim \l__box_right_new_dim } \fp_new:N \l__box_scale_x_fp \fp_new:N \l__box_scale_y_fp \cs_new_protected:Npn \box_resize_to_wd_and_ht_plus_dp:Nnn #1#2#3 { \hbox_set:Nn #1 { \__box_resize_set_corners:N #1 \fp_set:Nn \l__box_scale_x_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } } \fp_set:Nn \l__box_scale_y_fp { \dim_to_fp:n {#3} / \dim_to_fp:n { \l__box_top_dim - \l__box_bottom_dim } } \__box_resize:N #1 } } \cs_generate_variant:Nn \box_resize_to_wd_and_ht_plus_dp:Nnn { c } \cs_new_protected:Npn \__box_resize_set_corners:N #1 { \dim_set:Nn \l__box_top_dim { \box_ht:N #1 } \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 } \dim_set:Nn \l__box_right_dim { \box_wd:N #1 } \dim_zero:N \l__box_left_dim } \cs_new_protected:Npn \__box_resize:N #1 { \__box_resize:NNN \l__box_right_new_dim \l__box_scale_x_fp \l__box_right_dim \__box_resize:NNN \l__box_bottom_new_dim \l__box_scale_y_fp \l__box_bottom_dim \__box_resize:NNN \l__box_top_new_dim \l__box_scale_y_fp \l__box_top_dim \__box_resize_common:N #1 } \cs_new_protected:Npn \__box_resize:NNN #1#2#3 { \dim_set:Nn #1 { \fp_to_dim:n { \fp_abs:n { #2 } * \dim_to_fp:n { #3 } } } } \cs_new_protected:Npn \box_resize_to_ht:Nn #1#2 { \hbox_set:Nn #1 { \__box_resize_set_corners:N #1 \fp_set:Nn \l__box_scale_y_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_top_dim } } \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp \__box_resize:N #1 } } \cs_generate_variant:Nn \box_resize_to_ht:Nn { c } \cs_new_protected:Npn \box_resize_to_ht_plus_dp:Nn #1#2 { \hbox_set:Nn #1 { \__box_resize_set_corners:N #1 \fp_set:Nn \l__box_scale_y_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_top_dim - \l__box_bottom_dim } } \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp \__box_resize:N #1 } } \cs_generate_variant:Nn \box_resize_to_ht_plus_dp:Nn { c } \cs_new_protected:Npn \box_resize_to_wd:Nn #1#2 { \hbox_set:Nn #1 { \__box_resize_set_corners:N #1 \fp_set:Nn \l__box_scale_x_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } } \fp_set_eq:NN \l__box_scale_y_fp \l__box_scale_x_fp \__box_resize:N #1 } } \cs_generate_variant:Nn \box_resize_to_wd:Nn { c } \cs_new_protected:Npn \box_resize_to_wd_and_ht:Nnn #1#2#3 { \hbox_set:Nn #1 { \__box_resize_set_corners:N #1 \fp_set:Nn \l__box_scale_x_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \l__box_right_dim } } \fp_set:Nn \l__box_scale_y_fp { \dim_to_fp:n {#3} / \dim_to_fp:n { \l__box_top_dim } } \__box_resize:N #1 } } \cs_generate_variant:Nn \box_resize_to_wd_and_ht:Nnn { c } \cs_new_protected:Npn \box_scale:Nnn #1#2#3 { \hbox_set:Nn #1 { \fp_set:Nn \l__box_scale_x_fp {#2} \fp_set:Nn \l__box_scale_y_fp {#3} \__box_scale_aux:N #1 } } \cs_generate_variant:Nn \box_scale:Nnn { c } \cs_new_protected:Npn \__box_scale_aux:N #1 { \dim_set:Nn \l__box_top_dim { \box_ht:N #1 } \dim_set:Nn \l__box_bottom_dim { -\box_dp:N #1 } \dim_set:Nn \l__box_right_dim { \box_wd:N #1 } \dim_zero:N \l__box_left_dim \dim_set:Nn \l__box_top_new_dim { \fp_abs:n { \l__box_scale_y_fp } \l__box_top_dim } \dim_set:Nn \l__box_bottom_new_dim { \fp_abs:n { \l__box_scale_y_fp } \l__box_bottom_dim } \dim_set:Nn \l__box_right_new_dim { \fp_abs:n { \l__box_scale_x_fp } \l__box_right_dim } \__box_resize_common:N #1 } \cs_new_protected:Npn \box_autosize_to_wd_and_ht:Nnn #1#2#3 { \__box_autosize:Nnnn #1 {#2} {#3} { \box_ht:N #1 } } \cs_generate_variant:Nn \box_autosize_to_wd_and_ht:Nnn { c } \cs_new_protected:Npn \box_autosize_to_wd_and_ht_plus_dp:Nnn #1#2#3 { \__box_autosize:Nnnn #1 {#2} {#3} { \box_ht:N #1 + \box_dp:N #1 } } \cs_generate_variant:Nn \box_autosize_to_wd_and_ht_plus_dp:Nnn { c } \cs_new_protected:Npn \__box_autosize:Nnnn #1#2#3#4 { \hbox_set:Nn #1 { \fp_set:Nn \l__box_scale_x_fp { ( #2 ) / \box_wd:N #1 } \fp_set:Nn \l__box_scale_y_fp { ( #3 ) / ( #4 ) } \fp_compare:nNnTF \l__box_scale_x_fp > \l__box_scale_y_fp { \fp_set_eq:NN \l__box_scale_x_fp \l__box_scale_y_fp } { \fp_set_eq:NN \l__box_scale_y_fp \l__box_scale_x_fp } \__box_scale_aux:N #1 } } \cs_new_protected:Npn \__box_resize_common:N #1 { \hbox_set:Nn \l__box_internal_box { \driver_box_use_scale:Nnn #1 \l__box_scale_x_fp \l__box_scale_y_fp } \fp_compare:nNnTF \l__box_scale_y_fp > \c_zero_fp { \box_set_ht:Nn \l__box_internal_box { \l__box_top_new_dim } \box_set_dp:Nn \l__box_internal_box { -\l__box_bottom_new_dim } } { \box_set_dp:Nn \l__box_internal_box { \l__box_top_new_dim } \box_set_ht:Nn \l__box_internal_box { -\l__box_bottom_new_dim } } \fp_compare:nNnTF \l__box_scale_x_fp < \c_zero_fp { \hbox_to_wd:nn { \l__box_right_new_dim } { \tex_kern:D \l__box_right_new_dim \box_use_drop:N \l__box_internal_box \tex_hss:D } } { \box_set_wd:Nn \l__box_internal_box { \l__box_right_new_dim } \hbox:n { \tex_kern:D \c_zero_dim \box_use_drop:N \l__box_internal_box \tex_hss:D } } } \__debug_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:Nnn } \cs_new_protected:Npn \box_resize:Nnn { \box_resize_to_wd_and_ht_plus_dp:Nnn } \__debug_deprecation:nnNNpn { 2018-12-31 } { \box_resize_to_wd_and_ht_plus_dp:cnn } \cs_new_protected:Npn \box_resize:cnn { \box_resize_to_wd_and_ht_plus_dp:cnn } \__debug_deprecation:nnNNpn { 2018-12-31 } { \box_use_clear:N } \cs_new_protected:Npn \box_use_clear:N { \box_use_drop:N } \__debug_deprecation:nnNNpn { 2018-12-31 } { \box_use_clear:c } \cs_new_protected:Npn \box_use_clear:c { \box_use_drop:c } %% File: l3coffins.dtx Copyright(C) 2010-2017 The LaTeX3 Project \box_new:N \l__coffin_internal_box \dim_new:N \l__coffin_internal_dim \tl_new:N \l__coffin_internal_tl \prop_const_from_keyval:Nn \c__coffin_corners_prop { tl = { 0pt } { 0pt } , tr = { 0pt } { 0pt } , bl = { 0pt } { 0pt } , br = { 0pt } { 0pt } , } \prop_const_from_keyval:Nn \c__coffin_poles_prop { l = { 0pt } { 0pt } { 0pt } { 1000pt } , hc = { 0pt } { 0pt } { 0pt } { 1000pt } , r = { 0pt } { 0pt } { 0pt } { 1000pt } , b = { 0pt } { 0pt } { 1000pt } { 0pt } , vc = { 0pt } { 0pt } { 1000pt } { 0pt } , t = { 0pt } { 0pt } { 1000pt } { 0pt } , B = { 0pt } { 0pt } { 1000pt } { 0pt } , H = { 0pt } { 0pt } { 1000pt } { 0pt } , T = { 0pt } { 0pt } { 1000pt } { 0pt } , } \fp_new:N \l__coffin_slope_x_fp \fp_new:N \l__coffin_slope_y_fp \bool_new:N \l__coffin_error_bool \dim_new:N \l__coffin_offset_x_dim \dim_new:N \l__coffin_offset_y_dim \tl_new:N \l__coffin_pole_a_tl \tl_new:N \l__coffin_pole_b_tl \dim_new:N \l__coffin_x_dim \dim_new:N \l__coffin_y_dim \dim_new:N \l__coffin_x_prime_dim \dim_new:N \l__coffin_y_prime_dim \prg_new_conditional:Npnn \coffin_if_exist:N #1 { p , T , F , TF } { \cs_if_exist:NTF #1 { \cs_if_exist:cTF { l__coffin_poles_ \__int_value:w #1 _prop } { \prg_return_true: } { \prg_return_false: } } { \prg_return_false: } } \prg_generate_conditional_variant:Nnn \coffin_if_exist:N { c } { p , T , F , TF } \cs_new_protected:Npn \__coffin_if_exist:NT #1#2 { \coffin_if_exist:NTF #1 { #2 } { \__msg_kernel_error:nnx { kernel } { unknown-coffin } { \token_to_str:N #1 } } } \cs_new_protected:Npn \coffin_clear:N #1 { \__coffin_if_exist:NT #1 { \box_clear:N #1 \__coffin_reset_structure:N #1 } } \cs_generate_variant:Nn \coffin_clear:N { c } \cs_new_protected:Npn \coffin_new:N #1 { \box_new:N #1 \debug_suspend: \prop_clear_new:c { l__coffin_corners_ \__int_value:w #1 _prop } \prop_clear_new:c { l__coffin_poles_ \__int_value:w #1 _prop } \prop_gset_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop } \c__coffin_corners_prop \prop_gset_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop } \c__coffin_poles_prop \debug_resume: } \cs_generate_variant:Nn \coffin_new:N { c } \cs_new_protected:Npn \hcoffin_set:Nn #1#2 { \__coffin_if_exist:NT #1 { \hbox_set:Nn #1 { \color_ensure_current: #2 } \__coffin_reset_structure:N #1 \__coffin_update_poles:N #1 \__coffin_update_corners:N #1 } } \cs_generate_variant:Nn \hcoffin_set:Nn { c } \cs_new_protected:Npn \vcoffin_set:Nnn #1#2#3 { \__coffin_if_exist:NT #1 { \vbox_set:Nn #1 { \dim_set:Nn \tex_hsize:D {#2} \dim_set_eq:NN \linewidth \tex_hsize:D \dim_set_eq:NN \columnwidth \tex_hsize:D #3 } \__coffin_reset_structure:N #1 \__coffin_update_poles:N #1 \__coffin_update_corners:N #1 \vbox_set_top:Nn \l__coffin_internal_box { \vbox_unpack:N #1 } \__coffin_set_pole:Nnx #1 { T } { { 0pt } { \dim_eval:n { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } } { 1000pt } { 0pt } } \box_clear:N \l__coffin_internal_box } } \cs_generate_variant:Nn \vcoffin_set:Nnn { c } \cs_new_protected:Npn \hcoffin_set:Nw #1 { \__coffin_if_exist:NT #1 { \hbox_set:Nw #1 \color_ensure_current: \cs_set_protected:Npn \hcoffin_set_end: { \hbox_set_end: \__coffin_reset_structure:N #1 \__coffin_update_poles:N #1 \__coffin_update_corners:N #1 } } } \cs_new_protected:Npn \hcoffin_set_end: { } \cs_generate_variant:Nn \hcoffin_set:Nw { c } \cs_new_protected:Npn \vcoffin_set:Nnw #1#2 { \__coffin_if_exist:NT #1 { \vbox_set:Nw #1 \dim_set:Nn \tex_hsize:D {#2} \dim_set_eq:NN \linewidth \tex_hsize:D \dim_set_eq:NN \columnwidth \tex_hsize:D \cs_set_protected:Npn \vcoffin_set_end: { \vbox_set_end: \__coffin_reset_structure:N #1 \__coffin_update_poles:N #1 \__coffin_update_corners:N #1 \vbox_set_top:Nn \l__coffin_internal_box { \vbox_unpack:N #1 } \__coffin_set_pole:Nnx #1 { T } { { 0pt } { \dim_eval:n { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } } { 1000pt } { 0pt } } \box_clear:N \l__coffin_internal_box } } } \cs_new_protected:Npn \vcoffin_set_end: { } \cs_generate_variant:Nn \vcoffin_set:Nnw { c } \cs_new_protected:Npn \coffin_set_eq:NN #1#2 { \__coffin_if_exist:NT #1 { \box_set_eq:NN #1 #2 \__coffin_set_eq_structure:NN #1 #2 } } \cs_generate_variant:Nn \coffin_set_eq:NN { c , Nc , cc } \coffin_new:N \c_empty_coffin \debug_suspend: \hbox_set:Nn \c_empty_coffin { } \debug_resume: \coffin_new:N \l__coffin_aligned_coffin \coffin_new:N \l__coffin_aligned_internal_coffin \coffin_new:N \l_tmpa_coffin \coffin_new:N \l_tmpb_coffin \cs_new_eq:NN \coffin_dp:N \box_dp:N \cs_new_eq:NN \coffin_dp:c \box_dp:c \cs_new_eq:NN \coffin_ht:N \box_ht:N \cs_new_eq:NN \coffin_ht:c \box_ht:c \cs_new_eq:NN \coffin_wd:N \box_wd:N \cs_new_eq:NN \coffin_wd:c \box_wd:c \cs_new_protected:Npn \__coffin_get_pole:NnN #1#2#3 { \prop_get:cnNF { l__coffin_poles_ \__int_value:w #1 _prop } {#2} #3 { \__msg_kernel_error:nnxx { kernel } { unknown-coffin-pole } {#2} { \token_to_str:N #1 } \tl_set:Nn #3 { { 0pt } { 0pt } { 0pt } { 0pt } } } } \cs_new_protected:Npn \__coffin_reset_structure:N #1 { \prop_set_eq:cN { l__coffin_corners_ \__int_value:w #1 _prop } \c__coffin_corners_prop \prop_set_eq:cN { l__coffin_poles_ \__int_value:w #1 _prop } \c__coffin_poles_prop } \cs_new_protected:Npn \__coffin_set_eq_structure:NN #1#2 { \prop_set_eq:cc { l__coffin_corners_ \__int_value:w #1 _prop } { l__coffin_corners_ \__int_value:w #2 _prop } \prop_set_eq:cc { l__coffin_poles_ \__int_value:w #1 _prop } { l__coffin_poles_ \__int_value:w #2 _prop } } \cs_new_protected:Npn \__coffin_gset_eq_structure:NN #1#2 { \prop_gset_eq:cc { l__coffin_corners_ \__int_value:w #1 _prop } { l__coffin_corners_ \__int_value:w #2 _prop } \prop_gset_eq:cc { l__coffin_poles_ \__int_value:w #1 _prop } { l__coffin_poles_ \__int_value:w #2 _prop } } \cs_new_protected:Npn \coffin_set_horizontal_pole:Nnn #1#2#3 { \__coffin_if_exist:NT #1 { \__coffin_set_pole:Nnx #1 {#2} { { 0pt } { \dim_eval:n {#3} } { 1000pt } { 0pt } } } } \cs_new_protected:Npn \coffin_set_vertical_pole:Nnn #1#2#3 { \__coffin_if_exist:NT #1 { \__coffin_set_pole:Nnx #1 {#2} { { \dim_eval:n {#3} } { 0pt } { 0pt } { 1000pt } } } } \cs_new_protected:Npn \__coffin_set_pole:Nnn #1#2#3 { \prop_put:cnn { l__coffin_poles_ \__int_value:w #1 _prop } {#2} {#3} } \cs_generate_variant:Nn \coffin_set_horizontal_pole:Nnn { c } \cs_generate_variant:Nn \coffin_set_vertical_pole:Nnn { c } \cs_generate_variant:Nn \__coffin_set_pole:Nnn { Nnx } \cs_new_protected:Npn \__coffin_update_corners:N #1 { \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { tl } { { 0pt } { \dim_eval:n { \box_ht:N #1 } } } \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { tr } { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } } \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { bl } { { 0pt } { \dim_eval:n { -\box_dp:N #1 } } } \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } { br } { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { -\box_dp:N #1 } } } } \cs_new_protected:Npn \__coffin_update_poles:N #1 { \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { hc } { { \dim_eval:n { 0.5 \box_wd:N #1 } } { 0pt } { 0pt } { 1000pt } } \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { r } { { \dim_eval:n { \box_wd:N #1 } } { 0pt } { 0pt } { 1000pt } } \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { vc } { { 0pt } { \dim_eval:n { ( \box_ht:N #1 - \box_dp:N #1 ) / 2 } } { 1000pt } { 0pt } } \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { t } { { 0pt } { \dim_eval:n { \box_ht:N #1 } } { 1000pt } { 0pt } } \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } { b } { { 0pt } { \dim_eval:n { -\box_dp:N #1 } } { 1000pt } { 0pt } } } \cs_new_protected:Npn \__coffin_calculate_intersection:Nnn #1#2#3 { \__coffin_get_pole:NnN #1 {#2} \l__coffin_pole_a_tl \__coffin_get_pole:NnN #1 {#3} \l__coffin_pole_b_tl \bool_set_false:N \l__coffin_error_bool \exp_last_two_unbraced:Noo \__coffin_calculate_intersection:nnnnnnnn \l__coffin_pole_a_tl \l__coffin_pole_b_tl \bool_if:NT \l__coffin_error_bool { \__msg_kernel_error:nn { kernel } { no-pole-intersection } \dim_zero:N \l__coffin_x_dim \dim_zero:N \l__coffin_y_dim } } \cs_new_protected:Npn \__coffin_calculate_intersection:nnnnnnnn #1#2#3#4#5#6#7#8 { \dim_compare:nNnTF {#3} = { \c_zero_dim } { \dim_set:Nn \l__coffin_x_dim {#1} \dim_compare:nNnTF {#7} = \c_zero_dim { \bool_set_true:N \l__coffin_error_bool } { \dim_compare:nNnTF {#8} = \c_zero_dim { \dim_set:Nn \l__coffin_y_dim {#6} } { \__coffin_calculate_intersection_aux:nnnnnN {#1} {#5} {#6} {#7} {#8} \l__coffin_y_dim } } } { \dim_compare:nNnTF {#4} = \c_zero_dim { \dim_set:Nn \l__coffin_y_dim {#2} \dim_compare:nNnTF {#8} = { \c_zero_dim } { \bool_set_true:N \l__coffin_error_bool } { \dim_compare:nNnTF {#7} = \c_zero_dim { \dim_set:Nn \l__coffin_x_dim {#5} } { \__coffin_calculate_intersection_aux:nnnnnN {#2} {#6} {#5} {#8} {#7} \l__coffin_x_dim } } } { \dim_compare:nNnTF {#7} = \c_zero_dim { \dim_set:Nn \l__coffin_x_dim {#5} \__coffin_calculate_intersection_aux:nnnnnN {#5} {#1} {#2} {#3} {#4} \l__coffin_y_dim } { \dim_compare:nNnTF {#8} = \c_zero_dim { \dim_set:Nn \l__coffin_y_dim {#6} \__coffin_calculate_intersection_aux:nnnnnN {#6} {#2} {#1} {#4} {#3} \l__coffin_x_dim } { \fp_set:Nn \l__coffin_slope_x_fp { \dim_to_fp:n {#4} / \dim_to_fp:n {#3} } \fp_set:Nn \l__coffin_slope_y_fp { \dim_to_fp:n {#8} / \dim_to_fp:n {#7} } \fp_compare:nNnTF \l__coffin_slope_x_fp = \l__coffin_slope_y_fp { \bool_set_true:N \l__coffin_error_bool } { \dim_set:Nn \l__coffin_x_dim { \fp_to_dim:n { ( \dim_to_fp:n {#1} * \l__coffin_slope_x_fp - ( \dim_to_fp:n {#5} * \l__coffin_slope_y_fp ) - \dim_to_fp:n {#2} + \dim_to_fp:n {#6} ) / ( \l__coffin_slope_x_fp - \l__coffin_slope_y_fp ) } } \__coffin_calculate_intersection_aux:nnnnnN { \l__coffin_x_dim } {#5} {#6} {#8} {#7} \l__coffin_y_dim } } } } } } \cs_new_protected:Npn \__coffin_calculate_intersection_aux:nnnnnN #1#2#3#4#5#6 { \dim_set:Nn #6 { \fp_to_dim:n { \dim_to_fp:n {#4} * ( \dim_to_fp:n {#1} - \dim_to_fp:n {#2} ) / \dim_to_fp:n {#5} + \dim_to_fp:n {#3} } } } \cs_new_protected:Npn \coffin_join:NnnNnnnn #1#2#3#4#5#6#7#8 { \__coffin_align:NnnNnnnnN #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin \hbox_set:Nn \l__coffin_aligned_coffin { \dim_compare:nNnT { \l__coffin_offset_x_dim } < \c_zero_dim { \tex_kern:D -\l__coffin_offset_x_dim } \hbox_unpack:N \l__coffin_aligned_coffin \dim_set:Nn \l__coffin_internal_dim { \l__coffin_offset_x_dim - \box_wd:N #1 + \box_wd:N #4 } \dim_compare:nNnT \l__coffin_internal_dim < \c_zero_dim { \tex_kern:D -\l__coffin_internal_dim } } \__coffin_reset_structure:N \l__coffin_aligned_coffin \prop_clear:c { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _ prop } \__coffin_update_poles:N \l__coffin_aligned_coffin \dim_compare:nNnTF \l__coffin_offset_x_dim < \c_zero_dim { \__coffin_offset_poles:Nnn #1 { -\l__coffin_offset_x_dim } { 0pt } \__coffin_offset_poles:Nnn #4 { 0pt } { \l__coffin_offset_y_dim } \__coffin_offset_corners:Nnn #1 { -\l__coffin_offset_x_dim } { 0pt } \__coffin_offset_corners:Nnn #4 { 0pt } { \l__coffin_offset_y_dim } } { \__coffin_offset_poles:Nnn #1 { 0pt } { 0pt } \__coffin_offset_poles:Nnn #4 { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim } \__coffin_offset_corners:Nnn #1 { 0pt } { 0pt } \__coffin_offset_corners:Nnn #4 { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim } } \__coffin_update_vertical_poles:NNN #1 #4 \l__coffin_aligned_coffin \coffin_set_eq:NN #1 \l__coffin_aligned_coffin } \cs_generate_variant:Nn \coffin_join:NnnNnnnn { c , Nnnc , cnnc } \cs_new_protected:Npn \coffin_attach:NnnNnnnn #1#2#3#4#5#6#7#8 { \__coffin_align:NnnNnnnnN #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin \box_set_ht:Nn \l__coffin_aligned_coffin { \box_ht:N #1 } \box_set_dp:Nn \l__coffin_aligned_coffin { \box_dp:N #1 } \box_set_wd:Nn \l__coffin_aligned_coffin { \box_wd:N #1 } \__coffin_reset_structure:N \l__coffin_aligned_coffin \prop_set_eq:cc { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _prop } { l__coffin_corners_ \__int_value:w #1 _prop } \__coffin_update_poles:N \l__coffin_aligned_coffin \__coffin_offset_poles:Nnn #1 { 0pt } { 0pt } \__coffin_offset_poles:Nnn #4 { \l__coffin_offset_x_dim } { \l__coffin_offset_y_dim } \__coffin_update_vertical_poles:NNN #1 #4 \l__coffin_aligned_coffin \coffin_set_eq:NN #1 \l__coffin_aligned_coffin } \cs_new_protected:Npn \coffin_attach_mark:NnnNnnnn #1#2#3#4#5#6#7#8 { \__coffin_align:NnnNnnnnN #1 {#2} {#3} #4 {#5} {#6} {#7} {#8} \l__coffin_aligned_coffin \box_set_ht:Nn \l__coffin_aligned_coffin { \box_ht:N #1 } \box_set_dp:Nn \l__coffin_aligned_coffin { \box_dp:N #1 } \box_set_wd:Nn \l__coffin_aligned_coffin { \box_wd:N #1 } \box_set_eq:NN #1 \l__coffin_aligned_coffin } \cs_generate_variant:Nn \coffin_attach:NnnNnnnn { c , Nnnc , cnnc } \cs_new_protected:Npn \__coffin_align:NnnNnnnnN #1#2#3#4#5#6#7#8#9 { \__coffin_calculate_intersection:Nnn #4 {#5} {#6} \dim_set:Nn \l__coffin_x_prime_dim { \l__coffin_x_dim } \dim_set:Nn \l__coffin_y_prime_dim { \l__coffin_y_dim } \__coffin_calculate_intersection:Nnn #1 {#2} {#3} \dim_set:Nn \l__coffin_offset_x_dim { \l__coffin_x_dim - \l__coffin_x_prime_dim + #7 } \dim_set:Nn \l__coffin_offset_y_dim { \l__coffin_y_dim - \l__coffin_y_prime_dim + #8 } \hbox_set:Nn \l__coffin_aligned_internal_coffin { \box_use:N #1 \tex_kern:D -\box_wd:N #1 \tex_kern:D \l__coffin_offset_x_dim \box_move_up:nn { \l__coffin_offset_y_dim } { \box_use:N #4 } } \coffin_set_eq:NN #9 \l__coffin_aligned_internal_coffin } \cs_new_protected:Npn \__coffin_offset_poles:Nnn #1#2#3 { \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop } { \__coffin_offset_pole:Nnnnnnn #1 {##1} ##2 {#2} {#3} } } \cs_new_protected:Npn \__coffin_offset_pole:Nnnnnnn #1#2#3#4#5#6#7#8 { \dim_set:Nn \l__coffin_x_dim { #3 + #7 } \dim_set:Nn \l__coffin_y_dim { #4 + #8 } \tl_if_in:nnTF {#2} { - } { \tl_set:Nn \l__coffin_internal_tl { {#2} } } { \tl_set:Nn \l__coffin_internal_tl { { #1 - #2 } } } \exp_last_unbraced:NNo \__coffin_set_pole:Nnx \l__coffin_aligned_coffin { \l__coffin_internal_tl } { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } {#5} {#6} } } \cs_new_protected:Npn \__coffin_offset_corners:Nnn #1#2#3 { \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_offset_corner:Nnnnn #1 {##1} ##2 {#2} {#3} } } \cs_new_protected:Npn \__coffin_offset_corner:Nnnnn #1#2#3#4#5#6 { \prop_put:cnx { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _prop } { #1 - #2 } { { \dim_eval:n { #3 + #5 } } { \dim_eval:n { #4 + #6 } } } } \cs_new_protected:Npn \__coffin_update_vertical_poles:NNN #1#2#3 { \__coffin_get_pole:NnN #3 { #1 -T } \l__coffin_pole_a_tl \__coffin_get_pole:NnN #3 { #2 -T } \l__coffin_pole_b_tl \exp_last_two_unbraced:Noo \__coffin_update_T:nnnnnnnnN \l__coffin_pole_a_tl \l__coffin_pole_b_tl #3 \__coffin_get_pole:NnN #3 { #1 -B } \l__coffin_pole_a_tl \__coffin_get_pole:NnN #3 { #2 -B } \l__coffin_pole_b_tl \exp_last_two_unbraced:Noo \__coffin_update_B:nnnnnnnnN \l__coffin_pole_a_tl \l__coffin_pole_b_tl #3 } \cs_new_protected:Npn \__coffin_update_T:nnnnnnnnN #1#2#3#4#5#6#7#8#9 { \dim_compare:nNnTF {#2} < {#6} { \__coffin_set_pole:Nnx #9 { T } { { 0pt } {#6} { 1000pt } { 0pt } } } { \__coffin_set_pole:Nnx #9 { T } { { 0pt } {#2} { 1000pt } { 0pt } } } } \cs_new_protected:Npn \__coffin_update_B:nnnnnnnnN #1#2#3#4#5#6#7#8#9 { \dim_compare:nNnTF {#2} < {#6} { \__coffin_set_pole:Nnx #9 { B } { { 0pt } {#2} { 1000pt } { 0pt } } } { \__coffin_set_pole:Nnx #9 { B } { { 0pt } {#6} { 1000pt } { 0pt } } } } \cs_new_protected:Npn \coffin_typeset:Nnnnn #1#2#3#4#5 { \mode_leave_vertical: \__coffin_align:NnnNnnnnN \c_empty_coffin { H } { l } #1 {#2} {#3} {#4} {#5} \l__coffin_aligned_coffin \box_use_drop:N \l__coffin_aligned_coffin } \cs_generate_variant:Nn \coffin_typeset:Nnnnn { c } \coffin_new:N \l__coffin_display_coffin \coffin_new:N \l__coffin_display_coord_coffin \coffin_new:N \l__coffin_display_pole_coffin \prop_new:N \l__coffin_display_handles_prop \prop_put:Nnn \l__coffin_display_handles_prop { tl } { { b } { r } { -1 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { thc } { { b } { hc } { 0 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { tr } { { b } { l } { 1 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { vcl } { { vc } { r } { -1 } { 0 } } \prop_put:Nnn \l__coffin_display_handles_prop { vchc } { { vc } { hc } { 0 } { 0 } } \prop_put:Nnn \l__coffin_display_handles_prop { vcr } { { vc } { l } { 1 } { 0 } } \prop_put:Nnn \l__coffin_display_handles_prop { bl } { { t } { r } { -1 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { bhc } { { t } { hc } { 0 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { br } { { t } { l } { 1 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Tl } { { t } { r } { -1 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Thc } { { t } { hc } { 0 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Tr } { { t } { l } { 1 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Hl } { { vc } { r } { -1 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Hhc } { { vc } { hc } { 0 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Hr } { { vc } { l } { 1 } { 1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Bl } { { b } { r } { -1 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Bhc } { { b } { hc } { 0 } { -1 } } \prop_put:Nnn \l__coffin_display_handles_prop { Br } { { b } { l } { 1 } { -1 } } \dim_new:N \l__coffin_display_offset_dim \dim_set:Nn \l__coffin_display_offset_dim { 2pt } \dim_new:N \l__coffin_display_x_dim \dim_new:N \l__coffin_display_y_dim \prop_new:N \l__coffin_display_poles_prop \tl_new:N \l__coffin_display_font_tl \tl_set:Nn \l__coffin_display_font_tl { \sffamily \tiny } \cs_new_protected:Npn \coffin_mark_handle:Nnnn #1#2#3#4 { \hcoffin_set:Nn \l__coffin_display_pole_coffin { \color {#4} \rule { 1pt } { 1pt } } \coffin_attach_mark:NnnNnnnn #1 {#2} {#3} \l__coffin_display_pole_coffin { hc } { vc } { 0pt } { 0pt } \hcoffin_set:Nn \l__coffin_display_coord_coffin { \color {#4} \l__coffin_display_font_tl ( \tl_to_str:n { #2 , #3 } ) } \prop_get:NnN \l__coffin_display_handles_prop { #2 #3 } \l__coffin_internal_tl \quark_if_no_value:NTF \l__coffin_internal_tl { \prop_get:NnN \l__coffin_display_handles_prop { #3 #2 } \l__coffin_internal_tl \quark_if_no_value:NTF \l__coffin_internal_tl { \coffin_attach_mark:NnnNnnnn #1 {#2} {#3} \l__coffin_display_coord_coffin { l } { vc } { 1pt } { 0pt } } { \exp_last_unbraced:No \__coffin_mark_handle_aux:nnnnNnn \l__coffin_internal_tl #1 {#2} {#3} } } { \exp_last_unbraced:No \__coffin_mark_handle_aux:nnnnNnn \l__coffin_internal_tl #1 {#2} {#3} } } \cs_new_protected:Npn \__coffin_mark_handle_aux:nnnnNnn #1#2#3#4#5#6#7 { \coffin_attach_mark:NnnNnnnn #5 {#6} {#7} \l__coffin_display_coord_coffin {#1} {#2} { #3 \l__coffin_display_offset_dim } { #4 \l__coffin_display_offset_dim } } \cs_generate_variant:Nn \coffin_mark_handle:Nnnn { c } \cs_new_protected:Npn \coffin_display_handles:Nn #1#2 { \hcoffin_set:Nn \l__coffin_display_pole_coffin { \color {#2} \rule { 1pt } { 1pt } } \prop_set_eq:Nc \l__coffin_display_poles_prop { l__coffin_poles_ \__int_value:w #1 _prop } \__coffin_get_pole:NnN #1 { H } \l__coffin_pole_a_tl \__coffin_get_pole:NnN #1 { T } \l__coffin_pole_b_tl \tl_if_eq:NNT \l__coffin_pole_a_tl \l__coffin_pole_b_tl { \prop_remove:Nn \l__coffin_display_poles_prop { T } } \__coffin_get_pole:NnN #1 { B } \l__coffin_pole_b_tl \tl_if_eq:NNT \l__coffin_pole_a_tl \l__coffin_pole_b_tl { \prop_remove:Nn \l__coffin_display_poles_prop { B } } \coffin_set_eq:NN \l__coffin_display_coffin #1 \prop_map_inline:Nn \l__coffin_display_poles_prop { \prop_remove:Nn \l__coffin_display_poles_prop {##1} \__coffin_display_handles_aux:nnnnnn {##1} ##2 {#2} } \box_use_drop:N \l__coffin_display_coffin } \cs_new_protected:Npn \__coffin_display_handles_aux:nnnnnn #1#2#3#4#5#6 { \prop_map_inline:Nn \l__coffin_display_poles_prop { \bool_set_false:N \l__coffin_error_bool \__coffin_calculate_intersection:nnnnnnnn {#2} {#3} {#4} {#5} ##2 \bool_if:NF \l__coffin_error_bool { \dim_set:Nn \l__coffin_display_x_dim { \l__coffin_x_dim } \dim_set:Nn \l__coffin_display_y_dim { \l__coffin_y_dim } \__coffin_display_attach:Nnnnn \l__coffin_display_pole_coffin { hc } { vc } { 0pt } { 0pt } \hcoffin_set:Nn \l__coffin_display_coord_coffin { \color {#6} \l__coffin_display_font_tl ( \tl_to_str:n { #1 , ##1 } ) } \prop_get:NnN \l__coffin_display_handles_prop { #1 ##1 } \l__coffin_internal_tl \quark_if_no_value:NTF \l__coffin_internal_tl { \prop_get:NnN \l__coffin_display_handles_prop { ##1 #1 } \l__coffin_internal_tl \quark_if_no_value:NTF \l__coffin_internal_tl { \__coffin_display_attach:Nnnnn \l__coffin_display_coord_coffin { l } { vc } { 1pt } { 0pt } } { \exp_last_unbraced:No \__coffin_display_handles_aux:nnnn \l__coffin_internal_tl } } { \exp_last_unbraced:No \__coffin_display_handles_aux:nnnn \l__coffin_internal_tl } } } } \cs_new_protected:Npn \__coffin_display_handles_aux:nnnn #1#2#3#4 { \__coffin_display_attach:Nnnnn \l__coffin_display_coord_coffin {#1} {#2} { #3 \l__coffin_display_offset_dim } { #4 \l__coffin_display_offset_dim } } \cs_generate_variant:Nn \coffin_display_handles:Nn { c } \cs_new_protected:Npn \__coffin_display_attach:Nnnnn #1#2#3#4#5 { \__coffin_calculate_intersection:Nnn #1 {#2} {#3} \dim_set:Nn \l__coffin_x_prime_dim { \l__coffin_x_dim } \dim_set:Nn \l__coffin_y_prime_dim { \l__coffin_y_dim } \dim_set:Nn \l__coffin_offset_x_dim { \l__coffin_display_x_dim - \l__coffin_x_prime_dim + #4 } \dim_set:Nn \l__coffin_offset_y_dim { \l__coffin_display_y_dim - \l__coffin_y_prime_dim + #5 } \hbox_set:Nn \l__coffin_aligned_coffin { \box_use:N \l__coffin_display_coffin \tex_kern:D -\box_wd:N \l__coffin_display_coffin \tex_kern:D \l__coffin_offset_x_dim \box_move_up:nn { \l__coffin_offset_y_dim } { \box_use:N #1 } } \box_set_ht:Nn \l__coffin_aligned_coffin { \box_ht:N \l__coffin_display_coffin } \box_set_dp:Nn \l__coffin_aligned_coffin { \box_dp:N \l__coffin_display_coffin } \box_set_wd:Nn \l__coffin_aligned_coffin { \box_wd:N \l__coffin_display_coffin } \box_set_eq:NN \l__coffin_display_coffin \l__coffin_aligned_coffin } \cs_new_protected:Npn \coffin_show_structure:N { \__coffin_show_structure:NN \msg_show:nnxxxx } \cs_generate_variant:Nn \coffin_show_structure:N { c } \cs_new_protected:Npn \coffin_log_structure:N { \__coffin_show_structure:NN \msg_log:nnxxxx } \cs_generate_variant:Nn \coffin_log_structure:N { c } \cs_new_protected:Npn \__coffin_show_structure:NN #1#2 { \__coffin_if_exist:NT #2 { #1 { LaTeX / kernel } { show-coffin } { \token_to_str:N #2 } { \iow_newline: >~ ht ~=~ \dim_eval:n { \coffin_ht:N #2 } \iow_newline: >~ dp ~=~ \dim_eval:n { \coffin_dp:N #2 } \iow_newline: >~ wd ~=~ \dim_eval:n { \coffin_wd:N #2 } } { \prop_map_function:cN { l__coffin_poles_ \int_eval:n {#2} _prop } \msg_show_item_unbraced:nn } { } } } \__msg_kernel_new:nnnn { kernel } { no-pole-intersection } { No~intersection~between~coffin~poles. } { \c__msg_coding_error_text_tl LaTeX~was~asked~to~find~the~intersection~between~two~poles,~ but~they~do~not~have~a~unique~meeting~point:~ the~value~(0~pt,~0~pt)~will~be~used. } \__msg_kernel_new:nnnn { kernel } { unknown-coffin } { Unknown~coffin~'#1'. } { The~coffin~'#1'~was~never~defined. } \__msg_kernel_new:nnnn { kernel } { unknown-coffin-pole } { Pole~'#1'~unknown~for~coffin~'#2'. } { \c__msg_coding_error_text_tl LaTeX~was~asked~to~find~a~typesetting~pole~for~a~coffin,~ but~either~the~coffin~does~not~exist~or~the~pole~name~is~wrong. } \__msg_kernel_new:nnn { kernel } { show-coffin } { Size~of~coffin~#1 : #2 \\ Poles~of~coffin~#1 : #3 . } %% File: l3color.dtx Copyright(C) 2011,2012,2014,2016,2017 The LaTeX3 Project \cs_new_eq:NN \color_group_begin: \group_begin: \cs_new_protected:Npn \color_group_end: { \par \group_end: } \cs_new_protected:Npn \color_ensure_current: { \__driver_color_pickup:N \l__color_current_tl \__driver_color_select:V \l__color_current_tl \group_insert_after:N \__driver_color_reset: } \tl_new:N \l__color_current_tl \tl_set:Nn \l__color_current_tl { gray~0 } %% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project \str_const:Nx \c_sys_jobname_str { \tex_jobname:D } \int_const:Nn \c_sys_minute_int { \int_mod:nn { \tex_time:D } { 60 } } \int_const:Nn \c_sys_hour_int { \int_div_truncate:nn { \tex_time:D } { 60 } } \int_const:Nn \c_sys_day_int { \tex_day:D } \int_const:Nn \c_sys_month_int { \tex_month:D } \int_const:Nn \c_sys_year_int { \tex_year:D } \clist_map_inline:nn { lua , pdf , p , up , xe } { \cs_new_eq:cN { sys_if_engine_ #1 tex:T } \use_none:n \cs_new_eq:cN { sys_if_engine_ #1 tex:F } \use:n \cs_new_eq:cN { sys_if_engine_ #1 tex:TF } \use_ii:nn \cs_new_eq:cN { sys_if_engine_ #1 tex_p: } \c_false_bool } \cs_if_exist:NT \luatex_luatexversion:D { \cs_gset_eq:NN \sys_if_engine_luatex:T \use:n \cs_gset_eq:NN \sys_if_engine_luatex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_luatex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_luatex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { luatex } } \cs_if_exist:NT \pdftex_pdftexversion:D { \cs_gset_eq:NN \sys_if_engine_pdftex:T \use:n \cs_gset_eq:NN \sys_if_engine_pdftex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_pdftex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_pdftex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { pdftex } } \cs_if_exist:NT \ptex_kanjiskip:D { \bool_lazy_and:nnTF { \cs_if_exist_p:N \uptex_disablecjktoken:D } { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } } { \cs_gset_eq:NN \sys_if_engine_uptex:T \use:n \cs_gset_eq:NN \sys_if_engine_uptex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_uptex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_uptex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { uptex } } { \cs_gset_eq:NN \sys_if_engine_ptex:T \use:n \cs_gset_eq:NN \sys_if_engine_ptex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_ptex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_ptex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { ptex } } } \cs_if_exist:NT \xetex_XeTeXversion:D { \cs_gset_eq:NN \sys_if_engine_xetex:T \use:n \cs_gset_eq:NN \sys_if_engine_xetex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_xetex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_xetex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { xetex } } \int_compare:nNnTF { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 } { \cs_new_eq:NN \sys_if_output_dvi:T \use_none:n \cs_new_eq:NN \sys_if_output_dvi:F \use:n \cs_new_eq:NN \sys_if_output_dvi:TF \use_ii:nn \cs_new_eq:NN \sys_if_output_dvi_p: \c_false_bool \cs_new_eq:NN \sys_if_output_pdf:T \use:n \cs_new_eq:NN \sys_if_output_pdf:F \use_none:n \cs_new_eq:NN \sys_if_output_pdf:TF \use_i:nn \cs_new_eq:NN \sys_if_output_pdf_p: \c_true_bool \str_const:Nn \c_sys_output_str { pdf } } { \cs_new_eq:NN \sys_if_output_dvi:T \use:n \cs_new_eq:NN \sys_if_output_dvi:F \use_none:n \cs_new_eq:NN \sys_if_output_dvi:TF \use_i:nn \cs_new_eq:NN \sys_if_output_dvi_p: \c_true_bool \cs_new_eq:NN \sys_if_output_pdf:T \use_none:n \cs_new_eq:NN \sys_if_output_pdf:F \use:n \cs_new_eq:NN \sys_if_output_pdf:TF \use_ii:nn \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool \str_const:Nn \c_sys_output_str { dvi } } %% File: l3deprecation.dtx (C) Copyright 2017 The LaTeX3 Project \cs_new_protected:Npn \__deprecation_error:Nnn #1#2#3 { \etex_protected:D \tex_outer:D \tex_edef:D #1 { \exp_not:N \__msg_kernel_expandable_error:nnnnn { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } \exp_not:N \__msg_kernel_error:nnxxx { kernel } { deprecated-command } { \tl_to_str:n {#3} } { \token_to_str:N #1 } { \tl_to_str:n {#2} } } } \__deprecation_error:Nnn \c_job_name_tl { \c_sys_jobname_str } { 2017-01-01 } \__deprecation_error:Nnn \dim_case:nnn { \dim_case:nnF } { 2015-07-14 } \__deprecation_error:Nnn \int_case:nnn { \int_case:nnF } { 2015-07-14 } \__deprecation_error:Nnn \int_from_binary:n { \int_from_bin:n } { 2016-01-05 } \__deprecation_error:Nnn \int_from_hexadecimal:n { \int_from_hex:n } { 2016-01-05 } \__deprecation_error:Nnn \int_from_octal:n { \int_from_oct:n } { 2016-01-05 } \__deprecation_error:Nnn \int_to_binary:n { \int_to_bin:n } { 2016-01-05 } \__deprecation_error:Nnn \int_to_hexadecimal:n { \int_to_hex:n } { 2016-01-05 } \__deprecation_error:Nnn \int_to_octal:n { \int_to_oct:n } { 2016-01-05 } \__deprecation_error:Nnn \luatex_if_engine_p: { \sys_if_engine_luatex_p: } { 2017-01-01 } \__deprecation_error:Nnn \luatex_if_engine:F { \sys_if_engine_luatex:F } { 2017-01-01 } \__deprecation_error:Nnn \luatex_if_engine:T { \sys_if_engine_luatex:T } { 2017-01-01 } \__deprecation_error:Nnn \luatex_if_engine:TF { \sys_if_engine_luatex:TF } { 2017-01-01 } \__deprecation_error:Nnn \pdftex_if_engine_p: { \sys_if_engine_pdftex_p: } { 2017-01-01 } \__deprecation_error:Nnn \pdftex_if_engine:F { \sys_if_engine_pdftex:F } { 2017-01-01 } \__deprecation_error:Nnn \pdftex_if_engine:T { \sys_if_engine_pdftex:T } { 2017-01-01 } \__deprecation_error:Nnn \pdftex_if_engine:TF { \sys_if_engine_pdftex:TF } { 2017-01-01 } \__deprecation_error:Nnn \prop_get:cn { \prop_item:cn } { 2016-01-05 } \__deprecation_error:Nnn \prop_get:Nn { \prop_item:Nn } { 2016-01-05 } \__deprecation_error:Nnn \quark_if_recursion_tail_break:N { } { 2015-07-14 } \__deprecation_error:Nnn \quark_if_recursion_tail_break:n { }{ 2015-07-14 } \__deprecation_error:Nnn \scan_align_safe_stop: { protected~commands } { 2017-01-01 } \__deprecation_error:Nnn \str_case:nnn { \str_case:nnF } { 2015-07-14 } \__deprecation_error:Nnn \str_case:onn { \str_case:onF } { 2015-07-14 } \__deprecation_error:Nnn \str_case_x:nnn { \str_case_x:nnF } { 2015-07-14 } \__deprecation_error:Nnn \tl_case:cnn { \tl_case:cnF } { 2015-07-14 } \__deprecation_error:Nnn \tl_case:Nnn { \tl_case:NnF } { 2015-07-14 } \__deprecation_error:Nnn \xetex_if_engine_p: { \sys_if_engine_xetex_p: } { 2017-01-01 } \__deprecation_error:Nnn \xetex_if_engine:F { \sys_if_engine_xetex:F } { 2017-01-01 } \__deprecation_error:Nnn \xetex_if_engine:T { \sys_if_engine_xetex:T } { 2017-01-01 } \__deprecation_error:Nnn \xetex_if_engine:TF { \sys_if_engine_xetex:TF } { 2017-01-01 } \__debug:TF { \tl_gput_right:Nn \g__debug_deprecation_on_tl { \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx { \__msg_kernel_error:nnxxxx } } \tl_gput_right:Nn \g__debug_deprecation_off_tl { \cs_set_protected:Npn \__cs_generate_variant_loop_warning:nnxxxx { \__msg_kernel_warning:nnxxxx } } } { } %% File: l3candidates.dtx Copyright (C) 2012-2017 The LaTeX3 Project \cs_new_protected:Npx \mode_leave_vertical: { \cs_if_exist:NTF \pdftex_quitvmode:D { \pdftex_quitvmode:D } { \exp_not:n { \if_mode_vertical: \exp_after:wN \tex_indent:D \fi: } } } \cs_new_protected:Npn \box_clip:N #1 { \hbox_set:Nn #1 { \driver_box_use_clip:N #1 } } \cs_generate_variant:Nn \box_clip:N { c } \cs_new_protected:Npn \box_trim:Nnnnn #1#2#3#4#5 { \hbox_set:Nn \l__box_internal_box { \tex_kern:D - \__dim_eval:n {#2} \box_use:N #1 \tex_kern:D - \__dim_eval:n {#4} } \dim_compare:nNnTF { \box_dp:N #1 } > {#3} { \hbox_set:Nn \l__box_internal_box { \box_move_down:nn \c_zero_dim { \box_use:N \l__box_internal_box } } \box_set_dp:Nn \l__box_internal_box { \box_dp:N #1 - (#3) } } { \hbox_set:Nn \l__box_internal_box { \box_move_down:nn { (#3) - \box_dp:N #1 } { \box_use:N \l__box_internal_box } } \box_set_dp:Nn \l__box_internal_box \c_zero_dim } \dim_compare:nNnTF { \box_ht:N \l__box_internal_box } > {#5} { \hbox_set:Nn \l__box_internal_box { \box_move_up:nn \c_zero_dim { \box_use:N \l__box_internal_box } } \box_set_ht:Nn \l__box_internal_box { \box_ht:N \l__box_internal_box - (#5) } } { \hbox_set:Nn \l__box_internal_box { \box_move_up:nn { (#5) - \box_ht:N \l__box_internal_box } { \box_use:N \l__box_internal_box } } \box_set_ht:Nn \l__box_internal_box \c_zero_dim } \box_set_eq:NN #1 \l__box_internal_box } \cs_generate_variant:Nn \box_trim:Nnnnn { c } \cs_new_protected:Npn \box_viewport:Nnnnn #1#2#3#4#5 { \hbox_set:Nn \l__box_internal_box { \tex_kern:D - \__dim_eval:n {#2} \box_use:N #1 \tex_kern:D \__dim_eval:n { #4 - \box_wd:N #1 } } \dim_compare:nNnTF {#3} < \c_zero_dim { \hbox_set:Nn \l__box_internal_box { \box_move_down:nn \c_zero_dim { \box_use:N \l__box_internal_box } } \box_set_dp:Nn \l__box_internal_box { - \__dim_eval:n {#3} } } { \hbox_set:Nn \l__box_internal_box { \box_move_down:nn {#3} { \box_use:N \l__box_internal_box } } \box_set_dp:Nn \l__box_internal_box \c_zero_dim } \dim_compare:nNnTF {#5} > \c_zero_dim { \hbox_set:Nn \l__box_internal_box { \box_move_up:nn \c_zero_dim { \box_use:N \l__box_internal_box } } \box_set_ht:Nn \l__box_internal_box { (#5) \dim_compare:nNnT {#3} > \c_zero_dim { - (#3) } } } { \hbox_set:Nn \l__box_internal_box { \box_move_up:nn { - \__dim_eval:n {#5} } { \box_use:N \l__box_internal_box } } \box_set_ht:Nn \l__box_internal_box \c_zero_dim } \box_set_eq:NN #1 \l__box_internal_box } \cs_generate_variant:Nn \box_viewport:Nnnnn { c } \cs_new:Npn \clist_rand_item:n #1 { \exp_args:Nf \__clist_rand_item:nn { \clist_count:n {#1} } {#1} } \cs_new:Npn \__clist_rand_item:nn #1#2 { \int_compare:nNnF {#1} = 0 { \clist_item:nn {#2} { \int_rand:nn { 1 } {#1} } } } \cs_new:Npn \clist_rand_item:N #1 { \clist_if_empty:NF #1 { \clist_item:Nn #1 { \int_rand:nn { 1 } { \clist_count:N #1 } } } } \cs_generate_variant:Nn \clist_rand_item:N { c } \fp_new:N \l__coffin_sin_fp \fp_new:N \l__coffin_cos_fp \prop_new:N \l__coffin_bounding_prop \dim_new:N \l__coffin_bounding_shift_dim \dim_new:N \l__coffin_left_corner_dim \dim_new:N \l__coffin_right_corner_dim \dim_new:N \l__coffin_bottom_corner_dim \dim_new:N \l__coffin_top_corner_dim \cs_new_protected:Npn \coffin_rotate:Nn #1#2 { \fp_set:Nn \l__coffin_sin_fp { sind ( #2 ) } \fp_set:Nn \l__coffin_cos_fp { cosd ( #2 ) } \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_rotate_corner:Nnnn #1 {##1} ##2 } \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop } { \__coffin_rotate_pole:Nnnnnn #1 {##1} ##2 } \__coffin_set_bounding:N #1 \prop_map_inline:Nn \l__coffin_bounding_prop { \__coffin_rotate_bounding:nnn {##1} ##2 } \__coffin_find_corner_maxima:N #1 \__coffin_find_bounding_shift: \box_rotate:Nn #1 {#2} \hbox_set:Nn \l__coffin_internal_box { \tex_kern:D \__dim_eval:n { \l__coffin_bounding_shift_dim - \l__coffin_left_corner_dim } \box_move_down:nn { \l__coffin_bottom_corner_dim } { \box_use:N #1 } } \box_set_ht:Nn \l__coffin_internal_box { \l__coffin_top_corner_dim - \l__coffin_bottom_corner_dim } \box_set_dp:Nn \l__coffin_internal_box { 0 pt } \box_set_wd:Nn \l__coffin_internal_box { \l__coffin_right_corner_dim - \l__coffin_left_corner_dim } \hbox_set:Nn #1 { \box_use:N \l__coffin_internal_box } \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_shift_corner:Nnnn #1 {##1} ##2 } \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop } { \__coffin_shift_pole:Nnnnnn #1 {##1} ##2 } } \cs_generate_variant:Nn \coffin_rotate:Nn { c } \cs_new_protected:Npn \__coffin_set_bounding:N #1 { \prop_put:Nnx \l__coffin_bounding_prop { tl } { { 0 pt } { \dim_eval:n { \box_ht:N #1 } } } \prop_put:Nnx \l__coffin_bounding_prop { tr } { { \dim_eval:n { \box_wd:N #1 } } { \dim_eval:n { \box_ht:N #1 } } } \dim_set:Nn \l__coffin_internal_dim { -\box_dp:N #1 } \prop_put:Nnx \l__coffin_bounding_prop { bl } { { 0 pt } { \dim_use:N \l__coffin_internal_dim } } \prop_put:Nnx \l__coffin_bounding_prop { br } { { \dim_eval:n { \box_wd:N #1 } } { \dim_use:N \l__coffin_internal_dim } } } \cs_new_protected:Npn \__coffin_rotate_bounding:nnn #1#2#3 { \__coffin_rotate_vector:nnNN {#2} {#3} \l__coffin_x_dim \l__coffin_y_dim \prop_put:Nnx \l__coffin_bounding_prop {#1} { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } } } \cs_new_protected:Npn \__coffin_rotate_corner:Nnnn #1#2#3#4 { \__coffin_rotate_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2} { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } } } \cs_new_protected:Npn \__coffin_rotate_pole:Nnnnnn #1#2#3#4#5#6 { \__coffin_rotate_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim \__coffin_rotate_vector:nnNN {#5} {#6} \l__coffin_x_prime_dim \l__coffin_y_prime_dim \__coffin_set_pole:Nnx #1 {#2} { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } { \dim_use:N \l__coffin_x_prime_dim } { \dim_use:N \l__coffin_y_prime_dim } } } \cs_new_protected:Npn \__coffin_rotate_vector:nnNN #1#2#3#4 { \dim_set:Nn #3 { \fp_to_dim:n { \dim_to_fp:n {#1} * \l__coffin_cos_fp - \dim_to_fp:n {#2} * \l__coffin_sin_fp } } \dim_set:Nn #4 { \fp_to_dim:n { \dim_to_fp:n {#1} * \l__coffin_sin_fp + \dim_to_fp:n {#2} * \l__coffin_cos_fp } } } \cs_new_protected:Npn \__coffin_find_corner_maxima:N #1 { \dim_set:Nn \l__coffin_top_corner_dim { -\c_max_dim } \dim_set:Nn \l__coffin_right_corner_dim { -\c_max_dim } \dim_set:Nn \l__coffin_bottom_corner_dim { \c_max_dim } \dim_set:Nn \l__coffin_left_corner_dim { \c_max_dim } \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_find_corner_maxima_aux:nn ##2 } } \cs_new_protected:Npn \__coffin_find_corner_maxima_aux:nn #1#2 { \dim_set:Nn \l__coffin_left_corner_dim { \dim_min:nn { \l__coffin_left_corner_dim } {#1} } \dim_set:Nn \l__coffin_right_corner_dim { \dim_max:nn { \l__coffin_right_corner_dim } {#1} } \dim_set:Nn \l__coffin_bottom_corner_dim { \dim_min:nn { \l__coffin_bottom_corner_dim } {#2} } \dim_set:Nn \l__coffin_top_corner_dim { \dim_max:nn { \l__coffin_top_corner_dim } {#2} } } \cs_new_protected:Npn \__coffin_find_bounding_shift: { \dim_set:Nn \l__coffin_bounding_shift_dim { \c_max_dim } \prop_map_inline:Nn \l__coffin_bounding_prop { \__coffin_find_bounding_shift_aux:nn ##2 } } \cs_new_protected:Npn \__coffin_find_bounding_shift_aux:nn #1#2 { \dim_set:Nn \l__coffin_bounding_shift_dim { \dim_min:nn { \l__coffin_bounding_shift_dim } {#1} } } \cs_new_protected:Npn \__coffin_shift_corner:Nnnn #1#2#3#4 { \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _ prop } {#2} { { \dim_eval:n { #3 - \l__coffin_left_corner_dim } } { \dim_eval:n { #4 - \l__coffin_bottom_corner_dim } } } } \cs_new_protected:Npn \__coffin_shift_pole:Nnnnnn #1#2#3#4#5#6 { \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _ prop } {#2} { { \dim_eval:n { #3 - \l__coffin_left_corner_dim } } { \dim_eval:n { #4 - \l__coffin_bottom_corner_dim } } {#5} {#6} } } \fp_new:N \l__coffin_scale_x_fp \fp_new:N \l__coffin_scale_y_fp \dim_new:N \l__coffin_scaled_total_height_dim \dim_new:N \l__coffin_scaled_width_dim \cs_new_protected:Npn \coffin_resize:Nnn #1#2#3 { \fp_set:Nn \l__coffin_scale_x_fp { \dim_to_fp:n {#2} / \dim_to_fp:n { \coffin_wd:N #1 } } \fp_set:Nn \l__coffin_scale_y_fp { \dim_to_fp:n {#3} / \dim_to_fp:n { \coffin_ht:N #1 + \coffin_dp:N #1 } } \box_resize_to_wd_and_ht_plus_dp:Nnn #1 {#2} {#3} \__coffin_resize_common:Nnn #1 {#2} {#3} } \cs_generate_variant:Nn \coffin_resize:Nnn { c } \cs_new_protected:Npn \__coffin_resize_common:Nnn #1#2#3 { \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_scale_corner:Nnnn #1 {##1} ##2 } \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop } { \__coffin_scale_pole:Nnnnnn #1 {##1} ##2 } \fp_compare:nNnT \l__coffin_scale_x_fp < \c_zero_fp { \prop_map_inline:cn { l__coffin_corners_ \__int_value:w #1 _prop } { \__coffin_x_shift_corner:Nnnn #1 {##1} ##2 } \prop_map_inline:cn { l__coffin_poles_ \__int_value:w #1 _prop } { \__coffin_x_shift_pole:Nnnnnn #1 {##1} ##2 } } } \cs_new_protected:Npn \coffin_scale:Nnn #1#2#3 { \fp_set:Nn \l__coffin_scale_x_fp {#2} \fp_set:Nn \l__coffin_scale_y_fp {#3} \box_scale:Nnn #1 { \l__coffin_scale_x_fp } { \l__coffin_scale_y_fp } \dim_set:Nn \l__coffin_internal_dim { \coffin_ht:N #1 + \coffin_dp:N #1 } \dim_set:Nn \l__coffin_scaled_total_height_dim { \fp_abs:n { \l__coffin_scale_y_fp } \l__coffin_internal_dim } \dim_set:Nn \l__coffin_scaled_width_dim { -\fp_abs:n { \l__coffin_scale_x_fp } \coffin_wd:N #1 } \__coffin_resize_common:Nnn #1 { \l__coffin_scaled_width_dim } { \l__coffin_scaled_total_height_dim } } \cs_generate_variant:Nn \coffin_scale:Nnn { c } \cs_new_protected:Npn \__coffin_scale_vector:nnNN #1#2#3#4 { \dim_set:Nn #3 { \fp_to_dim:n { \dim_to_fp:n {#1} * \l__coffin_scale_x_fp } } \dim_set:Nn #4 { \fp_to_dim:n { \dim_to_fp:n {#2} * \l__coffin_scale_y_fp } } } \cs_new_protected:Npn \__coffin_scale_corner:Nnnn #1#2#3#4 { \__coffin_scale_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2} { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } } } \cs_new_protected:Npn \__coffin_scale_pole:Nnnnnn #1#2#3#4#5#6 { \__coffin_scale_vector:nnNN {#3} {#4} \l__coffin_x_dim \l__coffin_y_dim \__coffin_set_pole:Nnx #1 {#2} { { \dim_use:N \l__coffin_x_dim } { \dim_use:N \l__coffin_y_dim } {#5} {#6} } } \cs_new_protected:Npn \__coffin_x_shift_corner:Nnnn #1#2#3#4 { \prop_put:cnx { l__coffin_corners_ \__int_value:w #1 _prop } {#2} { { \dim_eval:n { #3 + \box_wd:N #1 } } {#4} } } \cs_new_protected:Npn \__coffin_x_shift_pole:Nnnnnn #1#2#3#4#5#6 { \prop_put:cnx { l__coffin_poles_ \__int_value:w #1 _prop } {#2} { { \dim_eval:n { #3 + \box_wd:N #1 } } {#4} {#5} {#6} } } \cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2 { \__file_get_details:nnN {#1} { mdfivesum } {#2} } \cs_new_protected:Npn \file_get_size:nN #1#2 { \__file_get_details:nnN {#1} { size } {#2} } \cs_new_protected:Npn \file_get_timestamp:nN #1#2 { \__file_get_details:nnN {#1} { moddate } {#2} } \cs_new_protected:Npn \__file_get_details:nnN #1#2#3 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_set:Nx #3 { \use:c { pdftex_file #2 :D } \exp_after:wN { \l__file_full_name_str } } } \cs_if_exist:NTF \luatex_directlua:D { \cs_set_protected:Npn \__file_get_details:nnN #1#2#3 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_set:Nx #3 { \lua_now_x:n { l3kernel.file#2 ( " \lua_escape_x:n { \l__file_full_name_str } " ) } } } } { \cs_set_protected:Npn \file_get_mdfive_hash:nN #1#2 { \file_get_full_name:nN {#1} \l__file_full_name_str \tl_set:Nx #2 { \pdftex_mdfivesum:D file \exp_after:wN { \l__file_full_name_str } } } \cs_if_exist:NT \xetex_XeTeXversion:D { \cs_set_protected:Npn \__file_get_details:nnN #1#2#3 { \tl_clear:N #3 \__msg_kernel_error:nnx { kernel } { xetex-primitive-not-available } { \exp_not:c { pdffile #2 } } } } } \__msg_kernel_new:nnnn { kernel } { xetex-primitive-not-available } { Primitive~\token_to_str:N #1 not~available } { XeTeX~does~not~currently~provide~functionality~equivalent~to~the~ \token_to_str:N #1 primitive. } \cs_new_protected:Npn \file_if_exist_input:n #1 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NF \l__file_full_name_str { \__file_input:V \l__file_full_name_str } } \cs_new_protected:Npn \file_if_exist_input:nF #1#2 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str {#2} { \__file_input:V \l__file_full_name_str } } \__debug_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nTF and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nTF #1#2#3 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str {#3} { #2 \__file_input:V \l__file_full_name_str } } \__debug_deprecation:nnNNpn { 2017-12-31 } { \file_if_exist:nT and~ \file_input:n } \cs_new_protected:Npn \file_if_exist_input:nT #1#2 { \file_get_full_name:nN {#1} \l__file_full_name_str \str_if_empty:NF \l__file_full_name_str { #2 \__file_input:V \l__file_full_name_str } } \cs_new_protected:Npn \file_input_stop: { \tex_endinput:D } \cs_if_exist:NTF \pdftex_uniformdeviate:D { \__debug_patch_args:nNNpn { { \__debug_chk_expr:nNnN {#1} \__int_eval:w { } \int_rand:nn } { \__debug_chk_expr:nNnN {#2} \__int_eval:w { } \int_rand:nn } } \cs_new:Npn \int_rand:nn #1#2 { \exp_after:wN \__int_rand:ww \__int_value:w \__int_eval:w #1 \exp_after:wN ; \__int_value:w \__int_eval:w #2 ; } \cs_new:Npn \__int_rand:ww #1; #2; { \int_compare:nNnTF {#1} > {#2} { \__msg_kernel_expandable_error:nnnn { kernel } { backward-range } {#1} {#2} \__int_rand:ww #2; #1; } { \int_compare:nNnTF {#1} > 0 { \int_compare:nNnTF { #2 - #1 } < \c__fp_rand_size_int } { \int_compare:nNnTF {#2} < { #1 + \c__fp_rand_size_int } } { \exp_args:Nf \__int_rand_narrow:nn { \int_eval:n { #2 - #1 + 1 } } {#1} } { \fp_to_int:n { randint(#1,#2) } } } } \cs_new:Npn \__int_rand_narrow:nn { \exp_args:No \__int_rand_narrow:nnn { \pdftex_uniformdeviate:D \c__fp_rand_size_int } } \cs_new:Npn \__int_rand_narrow:nnn #1#2 { \exp_args:Nf \__int_rand_narrow:nnnn { \int_mod:nn {#1} {#2} } {#1} {#2} } \cs_new:Npn \__int_rand_narrow:nnnn #1#2#3#4 { \int_compare:nNnTF { #2 - #1 + #3 } > \c__fp_rand_size_int { \__int_rand_narrow:nn {#3} {#4} } { \int_eval:n { #4 + #1 } } } } { \cs_new:Npn \int_rand:nn #1#2 { \__msg_kernel_expandable_error:nn { kernel } { fp-no-random } \int_eval:n {#1} } } \cs_if_exist:NT \pdftex_uniformdeviate:D { \__msg_kernel_new:nnn { kernel } { backward-range } { Bounds~ordered~backwards~in~\int_rand:nn {#1}~{#2}. } } \cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6 { \exp_args:Nf \__msg_expandable_error_module:nn { \exp_args:Nf \tl_to_str:n { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} } } {#1} } \cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5 { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } } \cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4 { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } } \cs_new:Npn \msg_expandable_error:nnn #1#2#3 { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } } \cs_new:Npn \msg_expandable_error:nn #1#2 { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } } \cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff } \cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff } \cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff } \cs_generate_variant:Nn \msg_expandable_error:nnn { nnf } \cs_new:Npn \__msg_expandable_error_module:nn #1#2 { \exp_after:wN \exp_after:wN \exp_after:wN \use_none_delimit_by_q_stop:w \use:n { \::error ! ~ #2 : ~ #1 } \q_stop } \cs_new_protected:Npn \msg_show_eval:Nn #1#2 { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n } \cs_new_protected:Npn \msg_log_eval:Nn #1#2 { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n } \cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } } \cs_new:Npx \msg_show_item:n #1 { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } } \cs_new:Npx \msg_show_item_unbraced:n #1 { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} } \cs_new:Npx \msg_show_item:nn #1#2 { \iow_newline: > \use:nn { ~ } { ~ } \exp_not:N \tl_to_str:n { {#1} } \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } \exp_not:N \tl_to_str:n { {#2} } } \cs_new:Npx \msg_show_item_unbraced:nn #1#2 { \iow_newline: > \use:nn { ~ } { ~ } \exp_not:N \tl_to_str:n {#1} \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ } \exp_not:N \tl_to_str:n {#2} } \__debug_patch:nnNNpn { \__debug_chk_var_scope:NN c #1 } { } \cs_new_protected:Npn \bool_const:Nn #1#2 { \__chk_if_free_cs:N #1 \tex_global:D \tex_chardef:D #1 = \bool_if_p:n {#2} } \cs_generate_variant:Nn \bool_const:Nn { c } \cs_new:Npn \prop_count:N #1 { \int_eval:n { 0 \prop_map_function:NN #1 \__prop_count:nn } } \cs_new:Npn \__prop_count:nn #1#2 { + 1 } \cs_generate_variant:Nn \prop_count:N { c } \cs_new:Npn \prop_map_tokens:Nn #1#2 { \exp_last_unbraced:Nno \__prop_map_tokens:nwwn {#2} #1 \__prop_pair:wn \q_recursion_tail \s__prop { } \__prg_break_point:Nn \prop_map_break: { } } \cs_new:Npn \__prop_map_tokens:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 { \if_meaning:w \q_recursion_tail #3 \exp_after:wN \prop_map_break: \fi: \use:n {#1} {#3} {#4} \__prop_map_tokens:nwwn {#1} } \cs_generate_variant:Nn \prop_map_tokens:Nn { c } \cs_new:Npn \prop_rand_key_value:N { \__prop_rand:NN \__prop_rand:nNn } \cs_new:Npn \__prop_rand:nNn #1#2#3 { \exp_not:n { {#1} {#3} } } \cs_new:Npn \__prop_rand:NN #1#2 { \prop_if_empty:NTF #2 { } { \exp_after:wN \__prop_rand_item:Nw \exp_after:wN #1 \__int_value:w \int_rand:nn { 1 } { \prop_count:N #2 } #2 \q_stop } } \cs_new:Npn \__prop_rand_item:Nw #1#2 \s__prop \__prop_pair:wn #3 \s__prop #4 { \int_compare:nNnF {#2} > 1 { \use_i_delimit_by_q_stop:nw { #1 {#3} \exp_not:n {#4} } } \exp_after:wN \__prop_rand_item:Nw \exp_after:wN #1 \__int_value:w \int_eval:n { #2 - 1 } \s__prop } \cs_generate_variant:Nn \prop_rand_key_value:N { c } \cs_new:Npn \seq_mapthread_function:NNN #1#2#3 { \exp_after:wN \__seq_mapthread_function:wNN #2 \q_stop #1 #3 } \cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \q_stop #2#3 { \exp_after:wN \__seq_mapthread_function:wNw #2 \q_stop #3 #1 { ? \__prg_break: } { } \__prg_break_point: } \cs_new:Npn \__seq_mapthread_function:wNw \s__seq #1 \q_stop #2 { \__seq_mapthread_function:Nnnwnn #2 #1 { ? \__prg_break: } { } \q_stop } \cs_new:Npn \__seq_mapthread_function:Nnnwnn #1#2#3#4 \q_stop #5#6 { \use_none:n #2 \use_none:n #5 #1 {#3} {#6} \__seq_mapthread_function:Nnnwnn #1 #4 \q_stop } \cs_generate_variant:Nn \seq_mapthread_function:NNN { Nc , c , cc } \cs_new_protected:Npn \seq_set_filter:NNn { \__seq_set_filter:NNNn \tl_set:Nx } \cs_new_protected:Npn \seq_gset_filter:NNn { \__seq_set_filter:NNNn \tl_gset:Nx } \cs_new_protected:Npn \__seq_set_filter:NNNn #1#2#3#4 { \__seq_push_item_def:n { \bool_if:nT {#4} { \__seq_wrap_item:n {##1} } } #1 #2 { #3 } \__seq_pop_item_def: } \cs_new_protected:Npn \seq_set_map:NNn { \__seq_set_map:NNNn \tl_set:Nx } \cs_new_protected:Npn \seq_gset_map:NNn { \__seq_set_map:NNNn \tl_gset:Nx } \cs_new_protected:Npn \__seq_set_map:NNNn #1#2#3#4 { \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} } #1 #2 { #3 } \__seq_pop_item_def: } \cs_new:Npn \seq_rand_item:N #1 { \seq_if_empty:NF #1 { \seq_item:Nn #1 { \int_rand:nn { 1 } { \seq_count:N #1 } } } } \cs_generate_variant:Nn \seq_rand_item:N { c } \cs_new_protected:Npn \seq_const_from_clist:Nn #1#2 { \tl_const:Nx #1 { \s__seq \clist_map_function:nN {#2} \__seq_wrap_item:n } } \cs_generate_variant:Nn \seq_const_from_clist:Nn { c } \cs_new:Npn \skip_split_finite_else_action:nnNN #1#2#3#4 { \skip_if_finite:nTF {#1} { #3 = \etex_gluestretch:D #1 \scan_stop: #4 = \etex_glueshrink:D #1 \scan_stop: } { #3 = \c_zero_skip #4 = \c_zero_skip #2 } } \cs_if_exist:NTF \pdftex_uniformdeviate:D { \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF } { \prg_return_true: } } { \prg_new_conditional:Npnn \sys_if_rand_exist: { p , T , F , TF } { \prg_return_false: } } \cs_new:Npn \sys_rand_seed: { \tex_the:D \pdftex_randomseed:D } \cs_if_exist:NF \pdftex_randomseed:D { \cs_set:Npn \sys_rand_seed: { 0 } } \cs_new_protected:Npn \sys_gset_rand_seed:n #1 { \pdftex_setrandomseed:D \__int_eval:n {#1} } \int_const:Nn \c_sys_shell_escape_int { \sys_if_engine_luatex:TF { \luatex_directlua:D { tex.sprint((status.shell_escape~or~os.execute()) .. " ") } } { \pdftex_shellescape:D } } \prg_new_conditional:Nnn \sys_if_shell: { p , T , F , TF } { \if_int_compare:w \c_sys_shell_escape_int = 0 ~ \prg_return_false: \else: \prg_return_true: \fi: } \prg_new_conditional:Nnn \sys_if_shell_unrestricted: { p , T , F , TF } { \if_int_compare:w \c_sys_shell_escape_int = 1 ~ \prg_return_true: \else: \prg_return_false: \fi: } \prg_new_conditional:Nnn \sys_if_shell_restricted: { p , T , F , TF } { \if_int_compare:w \c_sys_shell_escape_int = 2 ~ \prg_return_true: \else: \prg_return_false: \fi: } \sys_if_engine_luatex:F { \int_const:Nn \c__sys_shell_stream_int { 18 } } \sys_if_engine_luatex:TF { \cs_new_protected:Npn \sys_shell_now:n #1 { \luatex_directlua:D { os.execute(" \luatex_luaescapestring:D { \etex_detokenize:D {#1} } ") } } } { \cs_new_protected:Npn \sys_shell_now:n #1 { \iow_now:Nn \c__sys_shell_stream_int { #1 } } } \cs_generate_variant:Nn \sys_shell_now:n { x } \sys_if_engine_luatex:TF { \cs_new_protected:Npn \sys_shell_shipout:n #1 { \luatex_latelua:D { os.execute(" \luatex_luaescapestring:D { \etex_detokenize:D {#1} } ") } } } { \cs_new_protected:Npn \sys_shell_shipout:n #1 { \iow_shipout:Nn \c__sys_shell_stream_int { #1 } } } \cs_generate_variant:Nn \sys_shell_shipout:n { x } \prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF } { \tl_if_head_is_N_type:nTF {#1} { \__tl_if_empty_return:o { \use_none:n #1 } } { \tl_if_empty:nTF {#1} { \prg_return_false: } { \__tl_if_empty_return:o { \exp:w \exp_end_continue_f:w #1 } } } } \cs_new:Npn \tl_reverse_tokens:n #1 { \etex_unexpanded:D \exp_after:wN { \exp:w \__tl_act:NNNnn \__tl_reverse_normal:nN \__tl_reverse_group:nn \__tl_reverse_space:n { } {#1} } } \cs_new:Npn \__tl_reverse_group:nn #1 { \__tl_act_group_recurse:Nnn \__tl_act_reverse_output:n { \tl_reverse_tokens:n } } \cs_new:Npn \__tl_act_group_recurse:Nnn #1#2#3 { \exp_args:Nf #1 { \exp_after:wN \exp_after:wN \exp_after:wN { #2 {#3} } } } \cs_new:Npn \tl_count_tokens:n #1 { \int_eval:n { \__tl_act:NNNnn \__tl_act_count_normal:nN \__tl_act_count_group:nn \__tl_act_count_space:n { } {#1} } } \cs_new:Npn \__tl_act_count_normal:nN #1 #2 { 1 + } \cs_new:Npn \__tl_act_count_space:n #1 { 1 + } \cs_new:Npn \__tl_act_count_group:nn #1 #2 { 2 + \tl_count_tokens:n {#2} + } \cs_new_protected:Npn \tl_set_from_file:Nnn { \__tl_set_from_file:NNnn \tl_set:Nn } \cs_new_protected:Npn \tl_gset_from_file:Nnn { \__tl_set_from_file:NNnn \tl_gset:Nn } \cs_generate_variant:Nn \tl_set_from_file:Nnn { c } \cs_generate_variant:Nn \tl_gset_from_file:Nnn { c } \cs_new_protected:Npn \__tl_set_from_file:NNnn #1#2#3#4 { \file_get_full_name:nN {#4} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str { \__file_missing:n {#4} } { \group_begin: \exp_args:No \etex_everyeof:D { \c__tl_rescan_marker_tl \exp_not:N } #3 \scan_stop: \exp_after:wN \__tl_from_file_do:w \exp_after:wN \prg_do_nothing: \tex_input:D \l__file_full_name_str \scan_stop: \exp_args:NNNo \group_end: #1 #2 \l__tl_internal_a_tl } } \exp_args:Nno \use:nn { \cs_new_protected:Npn \__tl_from_file_do:w #1 } { \c__tl_rescan_marker_tl } { \tl_set:No \l__tl_internal_a_tl {#1} } \cs_new_protected:Npn \tl_set_from_file_x:Nnn { \__tl_set_from_file_x:NNnn \tl_set:Nn } \cs_new_protected:Npn \tl_gset_from_file_x:Nnn { \__tl_set_from_file_x:NNnn \tl_gset:Nn } \cs_generate_variant:Nn \tl_set_from_file_x:Nnn { c } \cs_generate_variant:Nn \tl_gset_from_file_x:Nnn { c } \cs_new_protected:Npn \__tl_set_from_file_x:NNnn #1#2#3#4 { \file_get_full_name:nN {#4} \l__file_full_name_str \str_if_empty:NTF \l__file_full_name_str { \__file_missing:n {#4} } { \group_begin: \etex_everyeof:D { \exp_not:N } #3 \scan_stop: \tl_set:Nx \l__tl_internal_a_tl { \tex_input:D \l__file_full_name_str \c_space_token } \exp_args:NNNo \group_end: #1 #2 \l__tl_internal_a_tl } } \cs_generate_variant:Nn \tl_if_head_eq_catcode:nNTF { o } \cs_new:Npn \tl_lower_case:n { \__tl_change_case:nnn { lower } { } } \cs_new:Npn \tl_upper_case:n { \__tl_change_case:nnn { upper } { } } \cs_new:Npn \tl_mixed_case:n { \__tl_change_case:nnn { mixed } { } } \cs_new:Npn \tl_lower_case:nn { \__tl_change_case:nnn { lower } } \cs_new:Npn \tl_upper_case:nn { \__tl_change_case:nnn { upper } } \cs_new:Npn \tl_mixed_case:nn { \__tl_change_case:nnn { mixed } } \cs_new:Npn \__tl_change_case:nnn #1#2#3 { \etex_unexpanded:D \exp_after:wN { \exp:w \__tl_change_case_aux:nnn {#1} {#2} {#3} } } \cs_new:Npn \__tl_change_case_aux:nnn #1#2#3 { \group_align_safe_begin: \__tl_change_case_loop:wnn #3 \q_recursion_tail \q_recursion_stop {#1} {#2} \__tl_change_case_result:n { } } \cs_new:Npn \__tl_change_case_loop:wnn #1 \q_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__tl_change_case_N_type:Nwnn } { \tl_if_head_is_group:nTF {#1} { \__tl_change_case_group:nwnn } { \__tl_change_case_space:wnn } } #1 \q_recursion_stop } \cs_new:Npn \__tl_change_case_output:nwn #1#2 \__tl_change_case_result:n #3 { #2 \__tl_change_case_result:n { #3 #1 } } \cs_generate_variant:Nn \__tl_change_case_output:nwn { V , o , v , f } \cs_new:Npn \__tl_change_case_end:wn #1 \__tl_change_case_result:n #2 { \group_align_safe_end: \exp_end: #2 } \cs_new:Npn \__tl_change_case_group:nwnn #1#2 \q_recursion_stop #3#4 { \use:c { __tl_change_case_group_ #3 : nnnn } {#1} {#2} {#3} {#4} } \cs_new:Npn \__tl_change_case_group_lower:nnnn #1#2#3#4 { \__tl_change_case_output:own { \exp_after:wN { \exp:w \__tl_change_case_aux:nnn {#3} {#4} {#1} } } \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4} } \cs_new_eq:NN \__tl_change_case_group_upper:nnnn \__tl_change_case_group_lower:nnnn \cs_new:Npn \__tl_change_case_group_mixed:nnnn #1#2#3#4 { \__tl_change_case_output:own { \exp_after:wN { \exp:w \__tl_change_case_aux:nnn {#3} {#4} {#1} } } \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } {#4} } \exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_space:wnn \c_space_tl { \__tl_change_case_output:nwn { ~ } \__tl_change_case_loop:wnn } \cs_new:Npn \__tl_change_case_N_type:Nwnn #1#2 \q_recursion_stop { \quark_if_recursion_tail_stop_do:Nn #1 { \__tl_change_case_end:wn } \exp_after:wN \__tl_change_case_N_type:NNNnnn \exp_after:wN #1 \l_tl_case_change_math_tl \q_recursion_tail ? \q_recursion_stop {#2} } \cs_new:Npn \__tl_change_case_N_type:NNNnnn #1#2#3 { \quark_if_recursion_tail_stop_do:Nn #2 { \__tl_change_case_N_type:Nnnn #1 } \token_if_eq_meaning:NNTF #1 #2 { \use_i_delimit_by_q_recursion_stop:nw { \__tl_change_case_math:NNNnnn #1 #3 \__tl_change_case_loop:wnn } } { \__tl_change_case_N_type:NNNnnn #1 } } \cs_new:Npn \__tl_change_case_math:NNNnnn #1#2#3#4 { \__tl_change_case_output:nwn {#1} \__tl_change_case_math_loop:wNNnn #4 \q_recursion_stop #2 #3 } \cs_new:Npn \__tl_change_case_math_loop:wNNnn #1 \q_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__tl_change_case_math:NwNNnn } { \tl_if_head_is_group:nTF {#1} { \__tl_change_case_math_group:nwNNnn } { \__tl_change_case_math_space:wNNnn } } #1 \q_recursion_stop } \cs_new:Npn \__tl_change_case_math:NwNNnn #1#2 \q_recursion_stop #3#4 { \token_if_eq_meaning:NNTF \q_recursion_tail #1 { \__tl_change_case_end:wn } { \__tl_change_case_output:nwn {#1} \token_if_eq_meaning:NNTF #1 #3 { #4 #2 \q_recursion_stop } { \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop #3#4 } } } \cs_new:Npn \__tl_change_case_math_group:nwNNnn #1#2 \q_recursion_stop { \__tl_change_case_output:nwn { {#1} } \__tl_change_case_math_loop:wNNnn #2 \q_recursion_stop } \exp_last_unbraced:NNo \cs_new:Npn \__tl_change_case_math_space:wNNnn \c_space_tl { \__tl_change_case_output:nwn { ~ } \__tl_change_case_math_loop:wNNnn } \cs_new:Npn \__tl_change_case_N_type:Nnnn #1#2#3#4 { \token_if_cs:NTF #1 { \__tl_change_case_cs_letterlike:Nn #1 {#3} } { \use:c { __tl_change_case_char_ #3 :Nnn } #1 {#3} {#4} } \__tl_change_case_loop:wnn #2 \q_recursion_stop {#3} {#4} } \cs_new:Npn \__tl_change_case_char_lower:Nnn #1#2#3 { \cs_if_exist_use:cF { __tl_change_case_ #2 _ #3 :Nnw } { \use_ii:nn } #1 { \use:c { __tl_change_case_ #2 _ sigma:Nnw } #1 { \__tl_change_case_char:nN {#2} #1 } } } \cs_new_eq:NN \__tl_change_case_char_upper:Nnn \__tl_change_case_char_lower:Nnn \cs_new:Npn \__tl_change_case_char_mixed:Nnn #1#2#3 { \__tl_change_case_mixed_switch:w \cs_if_exist_use:cF { __tl_change_case_mixed_ #3 :Nnw } { \cs_if_exist_use:cF { __tl_change_case_upper_ #3 :Nnw } { \use_ii:nn } } #1 { \__tl_change_case_mixed_skip:N #1 } } \cs_if_exist:NTF \utex_char:D { \cs_new:Npn \__tl_change_case_char:nN #1#2 { \__tl_change_case_char_auxi:nN {#1} #2 } } { \cs_new:Npn \__tl_change_case_char:nN #1#2 { \int_compare:nNnTF { `#2 } > { "80 } { \int_compare:nNnTF { `#2 } < { "E0 } { \__tl_change_case_char_UTFviii:nNNN {#1} #2 } { \int_compare:nNnTF { `#2 } < { "F0 } { \__tl_change_case_char_UTFviii:nNNNN {#1} #2 } { \__tl_change_case_char_UTFviii:nNNNNN {#1} #2 } } } { \__tl_change_case_char_auxi:nN {#1} #2 } } } \cs_new:Npn \__tl_change_case_char_auxi:nN #1#2 { \use:c { __tl_change_case_char_ #1 :N } #2 } \cs_new:Npn \__tl_change_case_char_lower:N #1 { \__tl_change_case_output:fwn { \cs_if_exist_use:cF { c__unicode_lower_ \token_to_str:N #1 _tl } { \__tl_change_case_char_auxii:nN { lower } #1 } } } \cs_new:Npn \__tl_change_case_char_upper:N #1 { \__tl_change_case_output:fwn { \cs_if_exist_use:cF { c__unicode_upper_ \token_to_str:N #1 _tl } { \__tl_change_case_char_auxii:nN { upper } #1 } } } \cs_new:Npn \__tl_change_case_char_mixed:N #1 { \cs_if_exist:cTF { c__unicode_mixed_ \token_to_str:N #1 _tl } { \__tl_change_case_output:fwn { \tl_use:c { c__unicode_mixed_ \token_to_str:N #1 _tl } } } { \__tl_change_case_char_upper:N #1 } } \cs_if_exist:NTF \utex_char:D { \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2 { \int_compare:nNnTF { \use:c { __tl_lookup_ #1 :N } #2 } = { 0 } { \exp_stop_f: #2 } { \char_generate:nn { \use:c { __tl_lookup_ #1 :N } #2 } { \char_value_catcode:n { \use:c { __tl_lookup_ #1 :N } #2 } } } } \cs_new_protected:Npn \__tl_lookup_lower:N #1 { \tex_lccode:D `#1 } \cs_new_protected:Npn \__tl_lookup_upper:N #1 { \tex_uccode:D `#1 } \cs_new_eq:NN \__tl_lookup_mixed:N \__tl_lookup_upper:N } { \cs_new:Npn \__tl_change_case_char_auxii:nN #1#2 { \exp_stop_f: #2 } \cs_new:Npn \__tl_change_case_char_UTFviii:nNNN #1#2#3#4 { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4} #3 } \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNN #1#2#3#4#5 { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5} #3 } \cs_new:Npn \__tl_change_case_char_UTFviii:nNNNNN #1#2#3#4#5#6 { \__tl_change_case_char_UTFviii:nnN {#1} {#2#4#5#6} #3 } \cs_new:Npn \__tl_change_case_char_UTFviii:nnN #1#2#3 { \cs_if_exist:cTF { c__unicode_ #1 _ \tl_to_str:n {#2} _tl } { \__tl_change_case_output:vwn { c__unicode_ #1 _ \tl_to_str:n {#2} _tl } } { \__tl_change_case_output:nwn {#2} } #3 } } \cs_new:Npn \__tl_change_case_cs_letterlike:Nn #1#2 { \str_if_eq:nnTF {#2} { mixed } { \__tl_change_case_cs_letterlike:NnN #1 { upper } \__tl_change_case_mixed_switch:w } { \__tl_change_case_cs_letterlike:NnN #1 {#2} \prg_do_nothing: } } \cs_new:Npn \__tl_change_case_cs_letterlike:NnN #1#2#3 { \cs_if_exist:cTF { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl } { \__tl_change_case_output:vwn { c__tl_change_case_ #2 _ \token_to_str:N #1 _tl } #3 } { \cs_if_exist:cTF { c__tl_change_case_ \str_if_eq:nnTF {#2} { lower } { upper } { lower } _ \token_to_str:N #1 _tl } { \__tl_change_case_output:nwn {#1} #3 } { \exp_after:wN \__tl_change_case_cs_accents:NN \exp_after:wN #1 \l_tl_case_change_accents_tl \q_recursion_tail \q_recursion_stop } } } \cs_new:Npn \__tl_change_case_cs_accents:NN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \__tl_change_case_cs:N #1 } \str_if_eq:nnTF {#1} {#2} { \use_i_delimit_by_q_recursion_stop:nw { \__tl_change_case_output:nwn {#1} } } { \__tl_change_case_cs_accents:NN #1 } } \cs_new:Npn \__tl_change_case_cs:N #1 { \str_if_eq:nnTF {#1} { \protect } { \__tl_change_case_protect:wNN } \exp_after:wN \__tl_change_case_cs:NN \exp_after:wN #1 \l_tl_case_change_exclude_tl \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__tl_change_case_cs:NN #1#2 { \quark_if_recursion_tail_stop_do:Nn #2 { \__tl_change_case_cs_expand:Nnw #1 { \__tl_change_case_output:nwn {#1} } } \str_if_eq:nnTF {#1} {#2} { \use_i_delimit_by_q_recursion_stop:nw { \__tl_change_case_cs:NNn #1 } } { \__tl_change_case_cs:NN #1 } } \cs_new:Npn \__tl_change_case_cs:NNn #1#2#3 { \__tl_change_case_output:nwn { #1 {#3} } #2 } \cs_new:Npn \__tl_change_case_protect:wNN #1 \q_recursion_stop #2 #3 { \__tl_change_case_output:nwn { \protect #3 } #2 } \cs_new:Npn \__tl_change_case_if_expandable:NTF #1 { \token_if_expandable:NTF #1 { \bool_lazy_any:nTF { { \token_if_eq_meaning_p:NN \q_recursion_tail #1 } { \token_if_protected_macro_p:N #1 } { \token_if_protected_long_macro_p:N #1 } } { \use_ii:nn } { \use_i:nn } } { \use_ii:nn } } \cs_new:Npn \__tl_change_case_cs_expand:Nnw #1#2 { \__tl_change_case_if_expandable:NTF #1 { \__tl_change_case_cs_expand:NN #1 } { #2 } } \cs_new:Npn \__tl_change_case_cs_expand:NN #1#2 { \exp_after:wN #2 #1 } \cs_new:Npn \__tl_change_case_mixed_skip:N #1 { \exp_after:wN \__tl_change_case_mixed_skip:NN \exp_after:wN #1 \l_tl_mixed_case_ignore_tl \q_recursion_tail \q_recursion_stop } \cs_new:Npn \__tl_change_case_mixed_skip:NN #1#2 { \quark_if_recursion_tail_stop_do:nn {#2} { \__tl_change_case_char:nN { mixed } #1 } \int_compare:nNnT { `#1 } = { `#2 } { \use_i_delimit_by_q_recursion_stop:nw { \__tl_change_case_output:nwn {#1} \__tl_change_case_mixed_skip_tidy:Nwn } } \__tl_change_case_mixed_skip:NN #1 } \cs_new:Npn \__tl_change_case_mixed_skip_tidy:Nwn #1#2 \q_recursion_stop #3 { \__tl_change_case_loop:wnn #2 \q_recursion_stop { mixed } } \cs_new:Npn \__tl_change_case_mixed_switch:w #1 \__tl_change_case_loop:wnn #2 \q_recursion_stop #3 { #1 \__tl_change_case_loop:wnn #2 \q_recursion_stop { lower } } \cs_new:Npn \__tl_change_case_lower_sigma:Nnw #1#2#3#4 \q_recursion_stop { \int_compare:nNnTF { `#1 } = { "03A3 } { \__tl_change_case_output:fwn { \__tl_change_case_lower_sigma:w #4 \q_recursion_stop } } {#2} #3 #4 \q_recursion_stop } \cs_new:Npn \__tl_change_case_lower_sigma:w #1 \q_recursion_stop { \tl_if_head_is_N_type:nTF {#1} { \__tl_change_case_lower_sigma:Nw #1 \q_recursion_stop } { \c__unicode_final_sigma_tl } } \cs_new:Npn \__tl_change_case_lower_sigma:Nw #1#2 \q_recursion_stop { \__tl_change_case_if_expandable:NTF #1 { \exp_after:wN \__tl_change_case_lower_sigma:w #1 #2 \q_recursion_stop } { \token_if_letter:NTF #1 { \c__unicode_std_sigma_tl } { \c__unicode_final_sigma_tl } } } \cs_new_eq:NN \__tl_change_case_upper_sigma:Nnw \use_ii:nn \cs_if_exist:NTF \utex_char:D { \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2 { \int_compare:nNnTF { `#1 } = { "0049 } { \__tl_change_case_lower_tr_auxi:Nw } { \int_compare:nNnTF { `#1 } = { "0130 } { \__tl_change_case_output:nwn { i } } {#2} } } \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2 \q_recursion_stop { \tl_if_head_is_N_type:nTF {#2} { \__tl_change_case_lower_tr_auxii:Nw #2 \q_recursion_stop } { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl } #1 #2 \q_recursion_stop } \cs_new:Npn \__tl_change_case_lower_tr_auxii:Nw #1#2 \q_recursion_stop { \__tl_change_case_if_expandable:NTF #1 { \exp_after:wN \__tl_change_case_lower_tr_auxi:Nw #1 #2 \q_recursion_stop } { \bool_lazy_or:nnTF { \token_if_cs_p:N #1 } { ! \int_compare_p:nNn { `#1 } = { "0307 } } { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl } { \__tl_change_case_output:nwn { i } \use_i:nn } } } } { \cs_new:Npn \__tl_change_case_lower_tr:Nnw #1#2 { \int_compare:nNnTF { `#1 } = { "0049 } { \__tl_change_case_output:Vwn \c__unicode_dotless_i_tl } { \int_compare:nNnTF { `#1 } = { 196 } { \__tl_change_case_lower_tr_auxi:Nw #1 {#2} } {#2} } } \cs_new:Npn \__tl_change_case_lower_tr_auxi:Nw #1#2#3#4 { \int_compare:nNnTF { `#4 } = { 176 } { \__tl_change_case_output:nwn { i } #3 } { #2 #3 #4 } } } \cs_new:Npn \__tl_change_case_upper_tr:Nnw #1#2 { \int_compare:nNnTF { `#1 } = { "0069 } { \__tl_change_case_output:Vwn \c__unicode_dotted_I_tl } {#2} } \cs_new_eq:NN \__tl_change_case_lower_az:Nnw \__tl_change_case_lower_tr:Nnw \cs_new_eq:NN \__tl_change_case_upper_az:Nnw \__tl_change_case_upper_tr:Nnw \cs_new:Npn \__tl_change_case_lower_lt:Nnw #1 { \exp_args:Nf \__tl_change_case_lower_lt:nNnw { \str_case:nVF #1 \c__unicode_accents_lt_tl \exp_stop_f: } #1 } \cs_new:Npn \__tl_change_case_lower_lt:nNnw #1#2 { \tl_if_blank:nTF {#1} { \exp_args:Nf \__tl_change_case_lower_lt:nnw { \int_case:nnF {`#2} { { "0049 } i { "004A } j { "012E } \c__unicode_i_ogonek_tl } \exp_stop_f: } } { \__tl_change_case_output:nwn {#1} \use_none:n } } \cs_new:Npn \__tl_change_case_lower_lt:nnw #1#2 { \tl_if_blank:nTF {#1} {#2} { \__tl_change_case_output:nwn {#1} \__tl_change_case_lower_lt:Nw } } \cs_new:Npn \__tl_change_case_lower_lt:Nw #1#2 \q_recursion_stop { \tl_if_head_is_N_type:nT {#2} { \__tl_change_case_lower_lt:NNw } #1 #2 \q_recursion_stop } \cs_new:Npn \__tl_change_case_lower_lt:NNw #1#2#3 \q_recursion_stop { \__tl_change_case_if_expandable:NTF #2 { \exp_after:wN \__tl_change_case_lower_lt:Nw \exp_after:wN #1 #2 #3 \q_recursion_stop } { \bool_lazy_and:nnT { ! \token_if_cs_p:N #2 } { \bool_lazy_any_p:n { { \int_compare_p:nNn { `#2 } = { "0300 } } { \int_compare_p:nNn { `#2 } = { "0301 } } { \int_compare_p:nNn { `#2 } = { "0303 } } } } { \__tl_change_case_output:Vwn \c__unicode_dot_above_tl } #1 #2#3 \q_recursion_stop } } \cs_new:Npn \__tl_change_case_upper_lt:Nnw #1 { \exp_args:Nf \__tl_change_case_upper_lt:nnw { \int_case:nnF {`#1} { { "0069 } I { "006A } J { "012F } \c__unicode_I_ogonek_tl } \exp_stop_f: } } \cs_new:Npn \__tl_change_case_upper_lt:nnw #1#2 { \tl_if_blank:nTF {#1} {#2} { \__tl_change_case_output:nwn {#1} \__tl_change_case_upper_lt:Nw } } \cs_new:Npn \__tl_change_case_upper_lt:Nw #1#2 \q_recursion_stop { \tl_if_head_is_N_type:nT {#2} { \__tl_change_case_upper_lt:NNw } #1 #2 \q_recursion_stop } \cs_new:Npn \__tl_change_case_upper_lt:NNw #1#2#3 \q_recursion_stop { \__tl_change_case_if_expandable:NTF #2 { \exp_after:wN \__tl_change_case_upper_lt:Nw \exp_after:wN #1 #2 #3 \q_recursion_stop } { \bool_lazy_and:nnTF { ! \token_if_cs_p:N #2 } { \int_compare_p:nNn { `#2 } = { "0307 } } { #1 } { #1 #2 } #3 \q_recursion_stop } } \cs_new:cpn { __tl_change_case_upper_de-alt:Nnw } #1#2 { \int_compare:nNnTF { `#1 } = { 223 } { \__tl_change_case_output:Vwn \c__unicode_upper_Eszett_tl } {#2} } \cs_new:Npn \__unicode_codepoint_to_UTFviii:n #1 { \exp_args:Nf \__unicode_codepoint_to_UTFviii_auxi:n { \int_eval:n {#1} } } \cs_new:Npn \__unicode_codepoint_to_UTFviii_auxi:n #1 { \if_int_compare:w #1 > "80 ~ \if_int_compare:w #1 < "800 ~ 2 \__unicode_codepoint_to_UTFviii_auxii:Nnn C {#1} { 64 } \__unicode_codepoint_to_UTFviii_auxiii:n {#1} \else: \if_int_compare:w #1 < "10000 ~ 3 \__unicode_codepoint_to_UTFviii_auxii:Nnn E {#1} { 64 * 64 } \__unicode_codepoint_to_UTFviii_auxiii:n {#1} \__unicode_codepoint_to_UTFviii_auxiii:n { \int_div_truncate:nn {#1} { 64 } } \else: 4 \__unicode_codepoint_to_UTFviii_auxii:Nnn F {#1} { 64 * 64 * 64 } \__unicode_codepoint_to_UTFviii_auxiii:n { \int_div_truncate:nn {#1} { 64 * 64 } } \__unicode_codepoint_to_UTFviii_auxiii:n { \int_div_truncate:nn {#1} { 64 } } \__unicode_codepoint_to_UTFviii_auxiii:n {#1} \fi: \fi: \else: 1 {#1} \fi: } \cs_new:Npn \__unicode_codepoint_to_UTFviii_auxii:Nnn #1#2#3 { { \int_eval:n { "#10 + \int_div_truncate:nn {#2} {#3} } } } \cs_new:Npn \__unicode_codepoint_to_UTFviii_auxiii:n #1 { { \int_eval:n { \int_mod:nn {#1} { 64 } + 128 } } } \cs_if_exist:NTF \utex_char:D { \tl_const:Nx \c__unicode_std_sigma_tl { \utex_char:D "03C3 ~ } \tl_const:Nx \c__unicode_final_sigma_tl { \utex_char:D "03C2 ~ } \tl_const:Nx \c__unicode_accents_lt_tl { \utex_char:D "00CC ~ { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0300 ~ } \utex_char:D "00CD ~ { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0301 ~ } \utex_char:D "0128 ~ { \utex_char:D "0069 ~ \utex_char:D "0307 ~ \utex_char:D "0303 ~ } } \tl_const:Nx \c__unicode_dot_above_tl { \utex_char:D "0307 ~ } \tl_const:Nx \c__unicode_upper_Eszett_tl { \utex_char:D "1E9E ~ } } { \tl_const:Nn \c__unicode_std_sigma_tl { } \tl_const:Nn \c__unicode_final_sigma_tl { } \tl_const:Nn \c__unicode_accents_lt_tl { } \tl_const:Nn \c__unicode_dot_above_tl { } \tl_const:Nn \c__unicode_upper_Eszett_tl { } } \group_begin: \cs_if_exist:NTF \utex_char:D { \cs_set_protected:Npn \__tl_tmp:w #1#2 { \tl_const:Nx #1 { \utex_char:D "#2 ~ } } } { \cs_set_protected:Npn \__tl_tmp:w #1#2 { \group_begin: \cs_set_protected:Npn \__tl_tmp:w ##1##2##3 { \tl_const:Nx #1 { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {##2} { 13 } \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {##3} { 13 } } } \tl_set:Nx \l__tl_internal_a_tl { \__unicode_codepoint_to_UTFviii:n {"#2} } \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl \group_end: } } \__tl_tmp:w \c__unicode_dotless_i_tl { 0131 } \__tl_tmp:w \c__unicode_dotted_I_tl { 0130 } \__tl_tmp:w \c__unicode_i_ogonek_tl { 012F } \__tl_tmp:w \c__unicode_I_ogonek_tl { 012E } \group_end: \group_begin: \bool_lazy_or:nnT { \sys_if_engine_pdftex_p: } { \sys_if_engine_uptex_p: } { \cs_set_protected:Npn \__tl_loop:nn #1#2 { \quark_if_recursion_tail_stop:n {#1} \tl_set:Nx \l__tl_internal_a_tl { \__unicode_codepoint_to_UTFviii:n {"#1} \__unicode_codepoint_to_UTFviii:n {"#2} } \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl \__tl_loop:nn } \cs_set_protected:Npn \__tl_tmp:w #1#2#3#4#5#6 { \tl_const:cx { c__unicode_lower_ \char_generate:nn {#2} { 12 } \char_generate:nn {#3} { 12 } _tl } { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {#5} { 13 } \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {#6} { 13 } } \tl_const:cx { c__unicode_upper_ \char_generate:nn {#5} { 12 } \char_generate:nn {#6} { 12 } _tl } { \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {#2} { 13 } \exp_after:wN \exp_after:wN \exp_after:wN \exp_not:N \__char_generate:nn {#3} { 13 } } } \__tl_loop:nn { 00C0 } { 00E0 } { 00C2 } { 00E2 } { 00C3 } { 00E3 } { 00C4 } { 00E4 } { 00C5 } { 00E5 } { 00C6 } { 00E6 } { 00C7 } { 00E7 } { 00C8 } { 00E8 } { 00C9 } { 00E9 } { 00CA } { 00EA } { 00CB } { 00EB } { 00CC } { 00EC } { 00CD } { 00ED } { 00CE } { 00EE } { 00CF } { 00EF } { 00D0 } { 00F0 } { 00D1 } { 00F1 } { 00D2 } { 00F2 } { 00D3 } { 00F3 } { 00D4 } { 00F4 } { 00D5 } { 00F5 } { 00D6 } { 00F6 } { 00D8 } { 00F8 } { 00D9 } { 00F9 } { 00DA } { 00FA } { 00DB } { 00FB } { 00DC } { 00FC } { 00DD } { 00FD } { 00DE } { 00FE } { 0100 } { 0101 } { 0102 } { 0103 } { 0104 } { 0105 } { 0106 } { 0107 } { 0108 } { 0109 } { 010A } { 010B } { 010C } { 010D } { 010E } { 010F } { 0110 } { 0111 } { 0112 } { 0113 } { 0114 } { 0115 } { 0116 } { 0117 } { 0118 } { 0119 } { 011A } { 011B } { 011C } { 011D } { 011E } { 011F } { 0120 } { 0121 } { 0122 } { 0123 } { 0124 } { 0125 } { 0128 } { 0129 } { 012A } { 012B } { 012C } { 012D } { 012E } { 012F } { 0132 } { 0133 } { 0134 } { 0135 } { 0136 } { 0137 } { 0139 } { 013A } { 013B } { 013C } { 013E } { 013F } { 0141 } { 0142 } { 0143 } { 0144 } { 0145 } { 0146 } { 0147 } { 0148 } { 014A } { 014B } { 014C } { 014D } { 014E } { 014F } { 0150 } { 0151 } { 0152 } { 0153 } { 0154 } { 0155 } { 0156 } { 0157 } { 0158 } { 0159 } { 015A } { 015B } { 015C } { 015D } { 015E } { 015F } { 0160 } { 0161 } { 0162 } { 0163 } { 0164 } { 0165 } { 0168 } { 0169 } { 016A } { 016B } { 016C } { 016D } { 016E } { 016F } { 0170 } { 0171 } { 0172 } { 0173 } { 0174 } { 0175 } { 0176 } { 0177 } { 0178 } { 00FF } { 0179 } { 017A } { 017B } { 017C } { 017D } { 017E } { 01CD } { 01CE } { 01CF } { 01D0 } { 01D1 } { 01D2 } { 01D3 } { 01D4 } { 01E2 } { 01E3 } { 01E6 } { 01E7 } { 01E8 } { 01E9 } { 01EA } { 01EB } { 01F4 } { 01F5 } { 0218 } { 0219 } { 021A } { 021B } \q_recursion_tail ? \q_recursion_stop \cs_set_protected:Npn \__tl_tmp:w #1#2#3 { \group_begin: \cs_set_protected:Npn \__tl_tmp:w ##1##2##3 { \tl_const:cx { c__unicode_ #3 _ \char_generate:nn {##2} { 12 } \char_generate:nn {##3} { 12 } _tl } {#2} } \tl_set:Nx \l__tl_internal_a_tl { \__unicode_codepoint_to_UTFviii:n { "#1 } } \exp_after:wN \__tl_tmp:w \l__tl_internal_a_tl \group_end: } \__tl_tmp:w { 00DF } { SS } { upper } \__tl_tmp:w { 00DF } { Ss } { mixed } \__tl_tmp:w { 0131 } { I } { upper } } \group_end: \group_begin: \cs_set_protected:Npn \__tl_change_case_setup:NN #1#2 { \quark_if_recursion_tail_stop:N #1 \tl_const:cn { c__tl_change_case_lower_ \token_to_str:N #1 _tl } { #2 } \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N #2 _tl } { #1 } \__tl_change_case_setup:NN } \__tl_change_case_setup:NN \AA \aa \AE \ae \DH \dh \DJ \dj \IJ \ij \L \l \NG \ng \O \o \OE \oe \SS \ss \TH \th \q_recursion_tail ? \q_recursion_stop \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \i _tl } { I } \tl_const:cn { c__tl_change_case_upper_ \token_to_str:N \j _tl } { J } \group_end: \tl_new:N \l_tl_case_change_accents_tl \tl_set:Nn \l_tl_case_change_accents_tl { \" \' \. \^ \` \~ \c \H \k \r \t \u \v } \cs_new:Npn \__tl_change_case_mixed_nl:Nnw #1 { \bool_lazy_or:nnTF { \int_compare_p:nNn { `#1 } = { `i } } { \int_compare_p:nNn { `#1 } = { `I } } { \__tl_change_case_output:nwn { I } \__tl_change_case_mixed_nl:Nw } } \cs_new:Npn \__tl_change_case_mixed_nl:Nw #1#2 \q_recursion_stop { \tl_if_head_is_N_type:nT {#2} { \__tl_change_case_mixed_nl:NNw } #1 #2 \q_recursion_stop } \cs_new:Npn \__tl_change_case_mixed_nl:NNw #1#2#3 \q_recursion_stop { \__tl_change_case_if_expandable:NTF #2 { \exp_after:wN \__tl_change_case_mixed_nl:Nw \exp_after:wN #1 #2 #3 \q_recursion_stop } { \bool_lazy_and:nnTF { ! ( \token_if_cs_p:N #2 ) } { \bool_lazy_or_p:nn { \int_compare_p:nNn { `#2 } = { `j } } { \int_compare_p:nNn { `#2 } = { `J } } } { \__tl_change_case_output:nwn { J } #1 } { #1 #2 } #3 \q_recursion_stop } } \tl_new:N \l_tl_case_change_math_tl \tl_set:Nn \l_tl_case_change_math_tl { $ $ \( \) } \tl_new:N \l_tl_case_change_exclude_tl \tl_set:Nn \l_tl_case_change_exclude_tl { \cite \ensuremath \label \ref } \tl_new:N \l_tl_mixed_case_ignore_tl \tl_set:Nx \l_tl_mixed_case_ignore_tl { ( % ) [ % ] \cs_to_str:N \{ % \} ` - } \cs_new:Npn \tl_rand_item:n #1 { \tl_if_blank:nF {#1} { \tl_item:nn {#1} { \int_rand:nn { 1 } { \tl_count:n {#1} } } } } \cs_new:Npn \tl_rand_item:N { \exp_args:No \tl_rand_item:n } \cs_generate_variant:Nn \tl_rand_item:N { c } \cs_new:Npn \tl_range:Nnn { \exp_args:No \tl_range:nnn } \cs_generate_variant:Nn \tl_range:Nnn { c } \cs_new:Npn \tl_range:nnn { \__tl_range:Nnnn \__tl_range:w } \cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn } \cs_generate_variant:Nn \tl_range_braced:Nnn { c } \cs_new:Npn \tl_range_braced:nnn { \__tl_range:Nnnn \__tl_range_braced:w } \cs_new:Npn \tl_range_unbraced:Nnn { \exp_args:No \tl_range_unbraced:nnn } \cs_generate_variant:Nn \tl_range_unbraced:Nnn { c } \cs_new:Npn \tl_range_unbraced:nnn { \__tl_range:Nnnn \__tl_range_unbraced:w } \cs_new:Npn \__tl_range:Nnnn #1#2#3#4 { \tl_head:f { \exp_args:Nf \__tl_range:nnnNn { \tl_count:n {#2} } {#3} {#4} #1 {#2} } } \cs_new:Npn \__tl_range:nnnNn #1#2#3 { \exp_args:Nff \__tl_range:nnNn { \exp_args:Nf \__tl_range_normalize:nn { \int_eval:n { #2 - 1 } } {#1} } { \exp_args:Nf \__tl_range_normalize:nn { \int_eval:n {#3} } {#1} } } \cs_new:Npn \__tl_range:nnNn #1#2#3#4 { \if_int_compare:w #2 > #1 \exp_stop_f: \else: \exp_after:wN { \exp_after:wN } \fi: \exp_after:wN #3 \__int_value:w \__int_eval:w #2 - #1 \exp_after:wN ; \exp_after:wN { \exp:w \__tl_range_skip:w #1 ; { } #4 } } \cs_new:Npn \__tl_range_skip:w #1 ; #2 { \if_int_compare:w #1 > 0 \exp_stop_f: \exp_after:wN \__tl_range_skip:w \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ; \else: \exp_after:wN \exp_end: \fi: } \cs_new:Npn \__tl_range_braced:w #1 ; #2 { \__tl_range_collect_braced:w #1 ; { } #2 } \cs_new:Npn \__tl_range_unbraced:w #1 ; #2 { \__tl_range_collect_unbraced:w #1 ; { } #2 } \cs_new:Npn \__tl_range_collect_braced:w #1 ; #2#3 { \if_int_compare:w #1 > 1 \exp_stop_f: \exp_after:wN \__tl_range_collect_braced:w \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ; \fi: { #2 {#3} } } \cs_new:Npn \__tl_range_collect_unbraced:w #1 ; #2#3 { \if_int_compare:w #1 > 1 \exp_stop_f: \exp_after:wN \__tl_range_collect_unbraced:w \__int_value:w \__int_eval:w #1 - 1 \exp_after:wN ; \fi: { #2 #3 } } \cs_new:Npn \__tl_range:w #1 ; #2 { \exp_args:Nf \__tl_range_collect:nn { \__tl_range_skip_spaces:n {#2} } {#1} } \cs_new:Npn \__tl_range_skip_spaces:n #1 { \tl_if_head_is_space:nTF {#1} { \exp_args:Nf \__tl_range_skip_spaces:n {#1} } { { } #1 } } \cs_new:Npn \__tl_range_collect:nn #1#2 { \int_compare:nNnTF {#2} = 0 {#1} { \exp_args:No \tl_if_head_is_space:nTF { \use_none:n #1 } { \exp_args:Nf \__tl_range_collect:nn { \__tl_range_collect_space:nw #1 } {#2} } { \__tl_range_collect:ff { \exp_args:No \tl_if_head_is_N_type:nTF { \use_none:n #1 } { \__tl_range_collect_N:nN } { \__tl_range_collect_group:nn } #1 } { \int_eval:n { #2 - 1 } } } } } \cs_new:Npn \__tl_range_collect_space:nw #1 ~ { { #1 ~ } } \cs_new:Npn \__tl_range_collect_N:nN #1#2 { { #1 #2 } } \cs_new:Npn \__tl_range_collect_group:nn #1#2 { { #1 {#2} } } \cs_generate_variant:Nn \__tl_range_collect:nn { ff } \cs_new:Npn \__tl_range_normalize:nn #1#2 { \int_eval:n { \if_int_compare:w #1 < 0 \exp_stop_f: \if_int_compare:w #1 < -#2 \exp_stop_f: 0 \else: #1 + #2 + 1 \fi: \else: \if_int_compare:w #1 < #2 \exp_stop_f: #1 \else: #2 \fi: \fi: } } \group_begin: \char_set_catcode_active:N * \char_set_lccode:nn { `* } { `\ } \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } } \group_end: \group_begin: \cs_set_protected:Npn \__peek_tmp:w #1 \q_stop { \cs_new_protected:Npn \__peek_execute_branches_N_type: { \if_int_odd:w \if_catcode:w \exp_not:N \l_peek_token { 0 \exp_stop_f: \fi: \if_catcode:w \exp_not:N \l_peek_token } 0 \exp_stop_f: \fi: \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi: 1 \exp_stop_f: \exp_after:wN \__peek_N_type:w \token_to_meaning:N \l_peek_token \q_mark \__peek_N_type_aux:nnw #1 \q_mark \use_none_delimit_by_q_stop:w \q_stop \exp_after:wN \__peek_true:w \else: \exp_after:wN \__peek_false:w \fi: } \cs_new_protected:Npn \__peek_N_type:w ##1 #1 ##2 \q_mark ##3 { ##3 {##1} {##2} } } \exp_after:wN \__peek_tmp:w \tl_to_str:n { outer } \q_stop \group_end: \cs_new_protected:Npn \__peek_N_type_aux:nnw #1 #2 #3 \fi: { \fi: \tl_if_in:noTF {#1} { \tl_to_str:n {ma} } { \__peek_true:w } { \tl_if_empty:nTF {#2} { \__peek_true:w } { \__peek_false:w } } } \cs_new_protected:Npn \peek_N_type:TF { \__peek_token_generic:NNTF \__peek_execute_branches_N_type: \scan_stop: } \cs_new_protected:Npn \peek_N_type:T { \__peek_token_generic:NNT \__peek_execute_branches_N_type: \scan_stop: } \cs_new_protected:Npn \peek_N_type:F { \__peek_token_generic:NNF \__peek_execute_branches_N_type: \scan_stop: } %% File: l3luatex.dtx Copyright (C) 2010-2017 The LaTeX3 Project \cs_new:Npn \lua_now_x:n #1 { \luatex_directlua:D {#1} } \cs_new:Npn \lua_now:n #1 { \lua_now_x:n { \exp_not:n {#1} } } \cs_new_protected:Npn \lua_shipout_x:n #1 { \luatex_latelua:D {#1} } \cs_new_protected:Npn \lua_shipout:n #1 { \lua_shipout_x:n { \exp_not:n {#1} } } \cs_new:Npn \lua_escape_x:n #1 { \luatex_luaescapestring:D {#1} } \cs_new:Npn \lua_escape:n #1 { \lua_escape_x:n { \exp_not:n {#1} } } \sys_if_engine_luatex:F { \clist_map_inline:nn { \lua_now_x:n , \lua_now:n , \lua_escape_x:n , \lua_escape:n } { \cs_set:Npn #1 ##1 { \__msg_kernel_expandable_error:nnn { kernel } { luatex-required } { #1 } } } \clist_map_inline:nn { \lua_shipout_x:n , \lua_shipout:n } { \cs_set_protected:Npn #1 ##1 { \__msg_kernel_error:nnn { kernel } { luatex-required } { #1 } } } } \__msg_kernel_new:nnnn { kernel } { luatex-required } { LuaTeX~engine~not~in~use!~Ignoring~#1. } { The~feature~you~are~using~is~only~available~ with~the~LuaTeX~engine.~LaTeX3~ignored~'#1'. } %% %% %% End of file `expl3-code.tex'.