diff options
author | Karl Berry <karl@freefriends.org> | 2014-08-26 17:33:09 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2014-08-26 17:33:09 +0000 |
commit | 6c4cd2ab2f8d1ebe3a051d700c3005d73eefe04c (patch) | |
tree | 16833d474c6532347c42dee6b34fa77aed22eca6 /Master | |
parent | 097e7dc0afa442be238a967b292237470680626e (diff) |
l3 (26aug14)
git-svn-id: svn://tug.org/texlive/trunk@35045 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
93 files changed, 8172 insertions, 5256 deletions
diff --git a/Master/texmf-dist/doc/latex/l3build/l3build.pdf b/Master/texmf-dist/doc/latex/l3build/l3build.pdf Binary files differindex 168045d665d..63bfb8b5ddb 100644 --- a/Master/texmf-dist/doc/latex/l3build/l3build.pdf +++ b/Master/texmf-dist/doc/latex/l3build/l3build.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3sort/l3sort.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3sort/l3sort.pdf Binary files differindex d4ad8b432b0..315081f5795 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3sort/l3sort.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3sort/l3sort.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3flag.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3flag.pdf Binary files differindex 0b9def6b734..bb16fedfae2 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3flag.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3flag.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3regex.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3regex.pdf Binary files differindex 110b4c9c025..ec45c294198 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3regex.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3regex.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf Binary files differindex 160f3b7dcc5..605e59dbd58 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-convert.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-expl.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-expl.pdf Binary files differindex ae5ec1eea55..fdb00dd13c2 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-expl.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-expl.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf Binary files differindex 00f6250a229..34183011036 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-analysis.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-analysis.pdf Binary files differindex cccd6b551e5..71681ced6f0 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-analysis.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-analysis.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-build.pdf b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-build.pdf Binary files differindex 242919c7672..77ada7c0531 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-build.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/l3str/l3tl-build.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf Binary files differindex fbcb9e9c036..3ef681117bc 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf Binary files differindex e10e3800aa8..e01f50f5657 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf diff --git a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf Binary files differindex 8c17fdcac80..888882996a0 100644 --- a/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf +++ b/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf Binary files differindex 0c0f8955ce8..2ffc291ed75 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf Binary files differindex 3efb7007362..3b391fd5d72 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf Binary files differindex d2b27d0067c..ed7e408654c 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf Binary files differindex d9b9e70d169..ac3555e62f5 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf Binary files differindex 2748f45670f..c4cf35c9417 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf diff --git a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf Binary files differindex b900e31b2ee..2557f31f90d 100644 --- a/Master/texmf-dist/doc/latex/l3kernel/source3.pdf +++ b/Master/texmf-dist/doc/latex/l3kernel/source3.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf Binary files differindex 855659d5e4c..0d6718d367f 100644 --- a/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/l3keys2e/l3keys2e.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf Binary files differindex 12c19fd9dd5..cbd602b0792 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xfrac/xfrac.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf Binary files differindex 4fbd3b7fc4d..7413ca6f611 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xparse/xparse.pdf diff --git a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf Binary files differindex 7976e6ca839..4367cbef9ff 100644 --- a/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf +++ b/Master/texmf-dist/doc/latex/l3packages/xtemplate/xtemplate.pdf diff --git a/Master/texmf-dist/source/latex/l3build/l3build.dtx b/Master/texmf-dist/source/latex/l3build/l3build.dtx index c24304f0f68..615aabb1db5 100644 --- a/Master/texmf-dist/source/latex/l3build/l3build.dtx +++ b/Master/texmf-dist/source/latex/l3build/l3build.dtx @@ -39,8 +39,8 @@ \RequirePackage{expl3} \def\ExplFileName{l3build} \def\ExplFileDescription{L3 Regression test suite} -\def\ExplFileDate{2014/07/19} -\def\ExplFileVersion{5240} +\def\ExplFileDate{2014/08/25} +\def\ExplFileVersion{5378} \documentclass[full]{l3doc} \renewcommand\partname{Part} \usepackage{multicol,needspace} @@ -80,7 +80,7 @@ \luavarset{maindir} {"."}{The top level directory for this module or bundle.} \luavarset{supportdir} {maindir .. "/support"} {Where copies of files to support check/doc compilation are stored.} \luavarset{testfiledir} {maindir .. "/testfiles"} {Where the tests are.} -\luavarset{testsupdir} {testfiledir .. "/support"} {Where support files for the tests are.} +\luavarset{testsuppdir} {testfiledir .. "/support"} {Where support files for the tests are.} \luavarseparator \luavarset{localdir} {maindir .. "/build/local"} {Generated folder where support files are placed to allow \enquote{sandboxed} \TeX{} runs.} \luavarset{testdir} {maindir .. "/build/test"} {Generated folder where tests are run.} @@ -115,7 +115,7 @@ \luavarset{typesetdeps} {\{~\}} {\dots for typesetting docs.} \luavarset{unpackdeps} {\{~\}} {\dots for unpacking.} \luavarseparator -\luavarset{checkengines}{\{"pdftex", "xetex", "luatex"\}} {Engines to check with \texttt{checklvt} by default.} +\luavarset{checkengines}{\{"pdftex", "xetex", "luatex"\}} {Engines to check with \texttt{check} by default.} \luavarset{stdengine} {"pdtex"} {Engine to generate \texttt{.tlg} file from.} \luavarset{checkformat} {"latex"} {Format to use for tests.} \luavarseparator @@ -274,12 +274,12 @@ % In the working directory of a bundle or module, the following commands can be executed: % \begin{itemize}[noitemsep]\ttfamily % \item check -% \item checklvt \meta{name} [\meta{engine}] +% \item check \meta{name} [\meta{engine}] % \item cmdcheck % \item clean % \item doc % \item install -% \item savetlg \meta{name} [\meta{engine}] +% \item save \meta{name} [\meta{engine}] % \item unpack % \end{itemize} % These commands are described below. @@ -295,7 +295,7 @@ % \begin{itemize} % \item all \var{installfiles} after unpacking; % \item all \var{checkfiles} after unpacking; -% \item any files in the directory \var{testsupdir}; +% \item any files in the directory \var{testsuppdir}; % \item any files that match \var{checksuppfiles} in the \var{supportdir}. % \end{itemize} % This range of possibilities allow sensible defaults but significant flexibility for defining your own test setups. @@ -305,14 +305,14 @@ % The format used for tests can be altered by setting \var{checkformat}: the default setting \texttt{latex} means that tests are run using \emph{e.g.}~\texttt{pdflatex}, whereas setting to \texttt{plain} will run tests using \emph{e.g.}~\texttt{pdftex}. % (Currently, this should be one of \texttt{latex} or \texttt{plain}.) % To perform the check, the engine typesets each test \var{checkruns} times. -% More detail on this in the documentation on |savetlg|. +% More detail on this in the documentation on |save|. % Options passed to the binary are defined in the variable \var{checkopts}. % % By default, |texmf| trees are searched for input files when checking. This can be disabled by setting \var{checksearch} to |false|: isolation provides confidence that the tests cannot accidentally be running with incorrect files installed in the main distribution or |hometexmf|. % \end{buildcmd} % % -% \begin{buildcmd}{checklvt \meta{name} [\meta{engine}]} +% \begin{buildcmd}{check \meta{name} [\meta{engine}]} % Checks only the test \texttt{\meta{name}.lvt} with optionally specified \meta{engine} (one of |pdftex|, |xetex|, or |luatex|). % If an \meta{engine} is not specified, all three engines are checked (or those defined by the |checkengines| variable if changed from the default). % \end{buildcmd} @@ -392,8 +392,8 @@ % \end{buildcmd} % % -% \begin{buildcmd}{savetlg \meta{name} [\meta{engine}]} -% This command runs through the same execution as |checklvt| for a specific test \texttt{\meta{name}.lvt} with optional \texttt{\meta{engine}}. +% \begin{buildcmd}{save \meta{name} [\meta{engine}]} +% This command runs through the same execution as |check| for a specific test \texttt{\meta{name}.lvt} with optional \texttt{\meta{engine}}. % If no \meta{engine} is specific, this command saves the output of the test to a |.tlg| file. % This file is then used in all subsequent checks against the \texttt{\meta{name}.lvt} test. % @@ -596,7 +596,7 @@ % Additional customisations to this driver can be included in a local |regression-test.cfg| file, which will be loaded automatically if found. % % The macros loaded by |regression-test.tex| set up the test system and provide a number of commands to aid the production of a structured test suite. -% The basis of the test suite is to output material into the |.log| file, from which a normalised test output (|.tlg|) file is produced by the build command |savetlg|. +% The basis of the test suite is to output material into the |.log| file, from which a normalised test output (|.tlg|) file is produced by the build command |save|. % A number of commands are provided for this; they are all written in uppercase to help avoid possible conflicts with other package commands. % % \subsection{Metadata and structural commands} @@ -609,7 +609,7 @@ % The desired format can be indicated with \cs{FORMAT}\marg{format name}, and any packages or classes loaded can be indicated with % % \noindent\hspace*{2\parindent} \cs{CLASS}\oarg{options}\marg{class name, version}\par -% \noindent\hspace*{2\parindent} \cs{PACKAGE}\oarg{options}\marg{class name, version} +% \noindent\hspace*{2\parindent} \cs{PACKAGE}\oarg{options}\marg{package name, version} % % \noindent These do not provide information that is useful for automated checking; after all, packages change their version numbers frequently. % Rather, including this information in a test indicates the conditions under which the test was definitely known to pass at a certain time in the past. diff --git a/Master/texmf-dist/source/latex/l3build/l3build.lua b/Master/texmf-dist/source/latex/l3build/l3build.lua index 02a6f8c066c..9e6bd7d8c59 100644 --- a/Master/texmf-dist/source/latex/l3build/l3build.lua +++ b/Master/texmf-dist/source/latex/l3build/l3build.lua @@ -17,20 +17,43 @@ --]] -- Version information: should be identical to that in l3build.dtx -release_date = "2014/07/19" -release_ver = "5240" +release_date = "2014/08/25" +release_ver = "5378" + +-- "module" is a deprecated function in Lua 5.2: as we want the name +-- for other purposes, and it should eventually be 'free', simply +-- remove the built-in +if type (module) == "function" then + module = nil +end -- Ensure the module and bundle exist module = module or "" bundle = bundle or "" +-- Sanity check +if module == "" and bundle == "" then + if string.match (arg[0], ".*l3build%.lua$") then + print ( + "\n" .. + "Error: Call l3build using a configuration file, not directly.\n" + ) + else + print ( + "\n" .. + "Error: Specify either bundle or module in configuration script.\n" + ) + end + os.exit (1) +end + -- Directory structure for the build system -- Use Unix-style path separators maindir = maindir or "." -- Substructure for tests and support files testfiledir = testfiledir or "testfiles" -- Set to "" to cancel any tests -testsupdir = testsupdir or testfiledir .. "/support" +testsuppdir = testsuppdir or testfiledir .. "/support" supportdir = supportdir or maindir .. "/support" -- Structure within a development area @@ -64,7 +87,7 @@ cleanfiles = cleanfiles or {"*.pdf", "*.zip"} excludefiles = excludefiles or {"*~"} -- Any Emacs stuff installfiles = installfiles or {"*.sty"} sourcefiles = sourcefiles or {"*.dtx", "*.ins"} -- Files to copy for unpacking -txtfiles = txtfiles or {"*.markdown"} +txtfiles = txtfiles or {"*.md", "*.markdown"} typesetfiles = typesetfiles or {"*.dtx"} typesetsuppfiles = typesetsuppfiles or { } unpackfiles = unpackfiles or {"*.ins"} -- Files to actually unpack @@ -378,9 +401,9 @@ function checkinit () for _,i in ipairs (checkfiles) do cp (i, unpackdir, testdir) end - if direxists (testsupdir) then - for _,i in ipairs (filelist (testsupdir)) do - cp (i, testsupdir, testdir) + if direxists (testsuppdir) then + for _,i in ipairs (filelist (testsuppdir)) do + cp (i, testsuppdir, testdir) end end for _,i in ipairs (checksuppfiles) do @@ -441,6 +464,10 @@ function formatlog (logfile, newfile) line = string.gsub (line, string.match (logfile, ".*/(.*)%" .. logext .. "$"), "") -- Zap ./ at begin of filename line = string.gsub (line, "%(%.%/", "(") + -- Zap paths if places other than 'here' are accessible + if checksearch then + line = string.gsub (line, "%(.*/([%w-]+%.[%w-]+)%s*$", "(../%1") + end -- XeTeX knows only the smaller set of dimension units line = string.gsub ( line, "cm, mm, dd, cc, bp, or sp", "cm, mm, dd, cc, nd, nc, bp, or sp" @@ -463,6 +490,12 @@ function formatlog (logfile, newfile) for i = 1, 31, 1 do line = string.gsub (line, string.char (i), "^^" .. string.char (64 + i)) end + -- Minor LuaTeX difference: it does not include parentheses in one message + line = string.gsub ( + line, + "%(If you're confused by all this, try typing `I}' now%.%)", + "If you're confused by all this, try typing `I}' now." + ) -- Minor LuaTeX bug: it prints an extra "'" in one message: add enough -- context to hopefully hit only the bug line = string.gsub ( @@ -524,6 +557,7 @@ function runcheck (name, engine, hide) end local errorlevel = 0 for _,i in ipairs (checkengines) do + cp (name .. tlgext, testfiledir, testdir) runtest (name, i, hide) local testname = name .. "." .. i local difffile = testdir .. "/" .. testname .. os_diffext @@ -593,30 +627,40 @@ end help = help or function () print "" if testfiledir ~= "" then - print " build check - run automated check system " + print " build check - run all automated tests for all engines" end if module ~= "" and testfiledir ~= "" then - print " build checklvt <name> - check one test file <name> for all engines" - print " build checklvt <name> <engine> - check one test file <name> for <engine> " + print " build check <name> - check one test file <name> for all engines" + print " build check <name> <engine> - check one test file <name> for <engine> " end - print " build clean - clean out directory tree " + print " build clean - clean out directory tree " if next (cmdchkfiles) ~= nil then - print " build cmdcheck - check commands documented are defined " + print " build cmdcheck - check commands documented are defined " end if module == "" or bundle == "" then - print " build ctan - create CTAN-ready archive " + print " build ctan - create CTAN-ready archive " end - print " build doc - runs all documentation files " - print " build install - install files in local texmf tree " + print " build doc - runs all documentation files " + print " build install - install files in local texmf tree " if module ~= "" and testfiledir ~= "" then - print " build savetlg <name> - save test log for <name> for all engines " - print " build savetlg <name> <engine> - save test log for <name> for <engine> " + print " build save <name> - save test log for <name> for all engines " + print " build save <name> <engine> - save test log for <name> for <engine> " end - print " build unpack - extract packages " + print " build unpack - extract packages " print "" end -function check () +function check (name, engine) + local errorlevel = 0 + if name then + errorlevel = checklvt (name, engine) + else + errorlevel = checkall () + end + return (errorlevel) +end + +function checkall () local errorlevel = 0 if testfiledir ~= "" and direxists (testfiledir) then checkinit () @@ -630,11 +674,7 @@ function check () end end if errorlevel ~= 0 then - print ("\n Check failed with difference files") - for _,i in ipairs (filelist (testdir, "*" .. os_diffext)) do - print (" - " .. testdir .. "/" .. i) - end - print ("") + checkdiff () else print ("\n All checks passed\n") end @@ -643,23 +683,33 @@ function check () end function checklvt (name, engine) - local engine = engine or stdengine if testexists (name) then checkinit () print ("Running checks on " .. name) - runcheck (name, engine) - if fileexists (testdir .. "/" .. name .. "." .. engine .. os_diffext) then - print (" Check fails with diff file") - print ( - " " .. testdir .. "/" .. name .. "." .. engine .. os_diffext) + local errorlevel = runcheck (name, engine) + if errorlevel ~= 0 then + checkdiff () else - print (" Check passes") + if engine then + print (" Check passes") + else + print ("\n All checks passed\n") + end end else print ("Test \"" .. name .. "\" not set up!") end end +-- A short auxiliary to print the list of differences for check +function checkdiff () + print ("\n Check failed with difference files") + for _,i in ipairs (filelist (testdir, "*" .. os_diffext)) do + print (" - " .. testdir .. "/" .. i) + end + print ("") +end + -- Remove all generated files function clean () -- To make sure that distribdir never contains any stray subdirs, @@ -745,7 +795,9 @@ function ctan (standalone) errorlevel = allmodules ("bundlecheck") end if errorlevel == 0 then + rmdir (ctandir) mkdir (ctandir .. "/" .. bundle) + rmdir (tdsdir) mkdir (tdsdir) if standalone then errorlevel = bundlectan () @@ -892,7 +944,7 @@ function install () end end -function savetlg (name, engine) +function save (name, engine) local tlgfile = name .. (engine and ("." .. engine) or "") .. tlgext local newfile = name .. "." .. (engine or stdengine) .. logext if fileexists (testfiledir .. "/" .. name .. lvtext) then @@ -999,13 +1051,7 @@ function stdmain (target, file, engine) elseif target == "doc" then doc () elseif target == "check" and testfiledir ~= "" then - check () - elseif target == "checklvt" and testfiledir ~= "" then - if file then - checklvt (file, engine) - else - help () - end + check (file, engine) elseif target == "clean" then clean () elseif target == "cmdcheck" and next (cmdchkfiles) ~= nil then @@ -1014,9 +1060,9 @@ function stdmain (target, file, engine) ctan (true) elseif target == "install" then install () - elseif target == "savetlg" and testfiledir ~= "" then + elseif target == "save" and testfiledir ~= "" then if file then - savetlg (file, engine) + save (file, engine) else help () end diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx index b4a8b10be1a..ecccb6e8986 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sort/l3sort.dtx @@ -1,6 +1,6 @@ % \iffalse % -%% File l3sort.dtx (C) Copyright 2012 The LaTeX3 Project +%% File l3sort.dtx (C) Copyright 2012,2014 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 @@ -35,8 +35,22 @@ %% % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: l3sort.dtx 4623 2013-12-14 13:53:40Z bruno $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3sort}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3sort will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3sort.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental sorting functions} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx index 57a2aed221e..f64f8643cc0 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3flag.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -%% File: l3flag.dtx Copyright (C) 2011-2012 The LaTeX3 Project +%% File: l3flag.dtx Copyright (C) 2011-2012,2104 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 @@ -34,8 +34,22 @@ %% ----------------------------------------------------------------------- % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: l3flag.dtx 4745 2014-05-06 10:41:27Z joseph $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3flag}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3flag will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3flag.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental flags} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx index 182e09b4e51..d306b577aac 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3regex.dtx @@ -34,8 +34,22 @@ %% ----------------------------------------------------------------------- % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: l3regex.dtx 5218 2014-07-17 14:23:10Z bruno $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3regex}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3regex will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3regex.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental regular expressions} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx index 9305a8fe07c..89f34666730 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-expl.dtx @@ -34,10 +34,24 @@ %% ----------------------------------------------------------------------- % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: l3str-expl.dtx 5226 2014-07-18 18:08:01Z joseph $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3str}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3str will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3str-expl.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental strings} -\def\ExplSyntaxName{l3str} +\def\ExplFileName{l3str} %</driver|package> %<*driver> \documentclass[full]{l3doc} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx index a64e2937d12..7f4504cb2de 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3tl-build.dtx @@ -34,8 +34,22 @@ %% ----------------------------------------------------------------------- % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: l3tl-build.dtx 4745 2014-05-06 10:41:27Z joseph $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3tl-build}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3tl-build will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3tl-build.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental token list construction} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index f22931ea3b9..f162ca679e2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -36,8 +36,22 @@ %% % %<*driver|package> -\RequirePackage{xparse} -\GetIdInfo$Id: l3galley.dtx 4728 2014-05-04 13:25:37Z joseph $ +% The version of expl3 required is tested as early as possible, as +% some really old versions do not define \ProvidesExplPackage. +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} +%<package> {} +%<package> {% +%<package> \PackageError{l3galley}{Support package l3kernel too old} +%<package> {% +%<package> Please install an up to date version of l3kernel\MessageBreak +%<package> using your TeX package manager or from CTAN.\MessageBreak +%<package> \MessageBreak +%<package> Loading l3galley will abort!% +%<package> }% +%<package> \endinput +%<package> } +\GetIdInfo$Id: l3galley.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental galley code} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index b1dda9c1990..23d50b46d5f 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -36,8 +36,8 @@ %% % %<*driver|package> -\RequirePackage{expl3} -\GetIdInfo$Id: xgalley.dtx 4728 2014-05-04 13:25:37Z joseph $ +\RequirePackage{xparse} +\GetIdInfo$Id: xgalley.dtx 5375 2014-08-25 10:17:29Z joseph $ {L3 Experimental galley} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 254a560cea4..3b53a382d18 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -36,8 +36,8 @@ %<*driver|generic|package> \def\ExplFileName{expl3} \def\ExplFileDescription{L3 programming layer} -\def\ExplFileDate{2014/07/20} -\def\ExplFileVersion{5241} +\def\ExplFileDate{2014/08/25} +\def\ExplFileVersion{5378} %</driver|generic|package> %<*driver> \documentclass[full]{l3doc} @@ -1425,7 +1425,7 @@ % as there is otherwise a potential issue with \pkg{(x)color}: see % \url{http://groups.google.com/group/comp.text.tex/msg/c9de8913c756ef4c}. % \begin{macrocode} -\str_if_eq:nVTF { latex2e } \l__expl_driver_tl +\str_if_eq:VnTF \l__expl_driver_tl { latex2e } { \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } } \__msg_kernel_new:nnnn { box } { clipping-not-available } @@ -1569,7 +1569,15 @@ \def\next {% \PackageInfo{expl3}{Switching from generic to LaTeX2e loader} - \endinput \RequirePackage{expl3} +% \end{macrocode} +% The \cs{relax} stops \cs{RequirePackage} from scanning for a date +% argument. Putting \tn{endinput} \emph{after} loading the package is +% crucial, as otherwise \tn{endinput} will close the file +% \file{expl3.sty} at the end of its first line: indeed, as long as +% \file{expl3.sty} is open it is impossible to close the file +% \file{expl3-generic.tex}. +% \begin{macrocode} + \RequirePackage{expl3} \relax \endinput } \fi \expandafter\endgroup @@ -1720,4 +1728,4 @@ % % \end{implementation} % -% \PrintIndex
\ No newline at end of file +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index 9a6b87ce213..cd79e4469d9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -35,7 +35,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3alloc.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3alloc.dtx 5363 2014-08-24 19:57:56Z joseph $ {L3 Register allocation} \begin{document} \DocInput{\jobname.dtx} @@ -68,22 +68,23 @@ % format. Under \LaTeX{}, the \pkg{etex} package is used for allocation % management. % -% This module provides the basic mechanism for allocating \TeX{}s +% This module provides the basic mechanism for allocating \TeX{}'s % registers. While designing this we have to take into account the % following characteristics: % \begin{itemize} % \item |\box255| is reserved for use in the output routine, so it % should not be allocated otherwise. -% \item \TeX{} can load up 256 hyphenation patterns (registers -% \tn{language} 0--255), -% \item \TeX{} can load no more than 16 math families, -% \item \TeX{} supports no more than 16 I/O streams for reading -% (\tn{read}) and 16 I/O streams for writing (\tn{write}), -% \item \TeX{} supports no more than 256 inserts. +% \item \TeX{} can load up $256$ hyphenation patterns (registers +% \tn{language} $0$ to $255$), +% \item \TeX{} can load no more than $16$ math families, +% \item \TeX{} supports no more than $16$ I/O streams for reading +% (\tn{read}) and $16$ I/O streams for writing (\tn{write}), +% \item \TeX{} supports no more than $256$ inserts. % \item The other registers (\tn{count}, \tn{dimen}, \tn{skip}, -% \tn{muskip}, \tn{box}, and \tn{toks}) range from 0 to 32767 -% (65535 for \LuaTeX{}), but registers numbered above 255 are -% accessed somewhat less efficiently. +% \tn{muskip}, \tn{box}, and \tn{toks}) range from $0$ to $32\,767$ +% ($65\,535$ for \LuaTeX{}), but registers numbered above $255$ are +% accessed somewhat less efficiently (except in \LuaTeX{}, where access +% is \enquote[flat}). % \item Registers could be allocated both globally and locally; the % use of registers could also be global or local. Here we % provide support for globally allocated registers for both @@ -143,7 +144,8 @@ % \end{macrocode} % % \begin{macro}[int]{\@@_new:nnnN} -% Shorthand for defining new register types and their allocators: +% Shorthand for defining new register types and their allocators: creates +% the appropriate variables and the allocator function itself. % \begin{macrocode} \cs_new_protected:Npn \@@_new:nnnN #1#2#3#4 { @@ -160,8 +162,8 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_setup_type:nnn #1#2#3 { - \tl_new:c { g__ #1 _allocation_tl } - \tl_set:cx { g__ #1 _allocation_tl } { \int_eval:n {#2} } + \tl_new:c { g__ #1 _allocation_tl } + \tl_gset:cx { g__ #1 _allocation_tl } { \int_eval:n {#2} } \tl_const:cx { c__ #1 _allocation_max_tl } { \int_eval:n {#3} } } % \end{macrocode} @@ -185,10 +187,10 @@ \luatex_if_engine:TF { \@@_new:nnnN { box } \c_zero \c_max_register_int \tex_chardef:D } { \@@_new:nnnN { box } \c_zero \c_max_register_int \tex_mathchardef:D } -\@@_new:nnnN { dim } \c_zero \c_max_register_int \tex_dimendef:D -\@@_new:nnnN { int } { 11 } \c_max_register_int \tex_countdef:D -\@@_new:nnnN { muskip } \c_zero \c_max_register_int \tex_muskipdef:D -\@@_new:nnnN { skip } \c_zero \c_max_register_int \tex_skipdef:D +\@@_new:nnnN { dim } \c_zero \c_max_register_int \tex_dimendef:D +\@@_new:nnnN { int } { 11 } \c_max_register_int \tex_countdef:D +\@@_new:nnnN { muskip } \c_zero \c_max_register_int \tex_muskipdef:D +\@@_new:nnnN { skip } \c_zero \c_max_register_int \tex_skipdef:D % \end{macrocode} % \end{macro} % @@ -198,22 +200,21 @@ % \begin{macrocode} \@@_new:nnnN { insert } { 221 } { 254 } \tex_chardef:D % \end{macrocode} -% Reserve a gap in the \texttt{dim}, \texttt{int} and \texttt{skip} lists. -% (An inline token list mapping would read better here, but this does not -% work until \texttt{int} allocation is available!) +% Reserve a gap in the \texttt{box}, \texttt{dim}, \texttt{int} and +% \texttt{skip} lists. (An inline token list mapping would read better here, +% but this does not work until \texttt{int} allocation is available!) Note +% that \texttt{box255} is reserved by \TeX{} itself (\LuaTeX{} does make +% this alterable, but that doesn't really do much for us so we ignore +% that!) % \begin{macrocode} -\tl_const:Nn \c__dim_allocation_reserve_begin_tl { 221 } -\tl_const:Nn \c__dim_allocation_reserve_end_tl { 255 } -\tl_const:Nn \c__int_allocation_reserve_begin_tl { 221 } -\tl_const:Nn \c__int_allocation_reserve_end_tl { 255 } +\tl_const:Nn \c__box_allocation_reserve_begin_tl { 221 } +\tl_const:Nn \c__box_allocation_reserve_end_tl { 255 } +\tl_const:Nn \c__dim_allocation_reserve_begin_tl { 221 } +\tl_const:Nn \c__dim_allocation_reserve_end_tl { 254 } +\tl_const:Nn \c__int_allocation_reserve_begin_tl { 221 } +\tl_const:Nn \c__int_allocation_reserve_end_tl { 254 } \tl_const:Nn \c__skip_allocation_reserve_begin_tl { 221 } -\tl_const:Nn \c__skip_allocation_reserve_end_tl { 255 } -% \end{macrocode} -% Reserve a space in the \texttt{box} list: box~255 is special in addition -% to dealing with inserts, so the end point here is different. -% \begin{macrocode} -\tl_const:Nn \c__box_allocation_reserve_begin_tl { 221 } -\tl_const:Nn \c__box_allocation_reserve_end_tl { 255 } +\tl_const:Nn \c__skip_allocation_reserve_end_tl { 254 } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index b36707ccc97..ab565a10ab7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3basics.dtx 5187 2014-07-09 12:02:17Z will $ +\GetIdInfo$Id: l3basics.dtx 5364 2014-08-24 20:19:24Z joseph $ {L3 Basic definitions} %</driver|package> %<*driver> @@ -202,7 +202,7 @@ % other argument specifiers in your function names, but they do not handle % expansion for you. You should define the base function and then use % \cs{cs_generate_variant:Nn} to generate custom variants as described in -% Section~\ref{sec:l3expan:defining-variants}. +% Section~\ref{sec:l3expan:variants-method}. % % \subsection{Defining new functions using parameter text} % \label{sec:l3basics:defining-new-function-1} @@ -1125,7 +1125,7 @@ % prefix primitive conditionals with |\if_|. % % \begin{function}[EXP] -% {\if_true:, \if_false:, \or:, \else:, \fi:, \reverse_if:N} +% {\if_true:, \if_false:, \else:, \fi:, \reverse_if:N} % \begin{syntax} % "\if_true:" <true code> "\else:" <false code> "\fi:" \\ % "\if_false:" <true code> "\else:" <false code> "\fi:" \\ @@ -1134,8 +1134,8 @@ % "\if_true:" always executes <true code>, while "\if_false:" always % executes <false code>. "\reverse_if:N" reverses any two-way primitive % conditional. "\else:" and "\fi:" delimit the branches of the -% conditional. "\or:" is used in case switches, see \pkg{l3int} -% for more. +% conditional. The function "\or:" is documented in \pkg{l3int} and +% used in case switches. % \begin{texnote} % These are equivalent to their corresponding \TeX\ primitive % conditionals; \cs{reverse_if:N} is \eTeX's \tn{unless}. @@ -1441,7 +1441,6 @@ % \subsection{Defining some constants} % % \begin{variable}{\c_minus_one, \c_zero, \c_sixteen} -% \begin{variable}{\c_six, \c_seven, \c_twelve} % We need the constants \cs{c_minus_one} and \cs{c_sixteen} now for % writing information to the log and the terminal and \cs{c_zero} % which is used by some functions in the \textsf{l3alloc} module. The @@ -1450,9 +1449,8 @@ % \cs{tex_mathchardef:D}. For other constants the \textsf{l3int} module is % required but it can't be used until the allocation has been set % up properly! The actual allocation mechanism is in -% \textsf{l3alloc} and as \TeX{} wants to reserve count registers -% 0--9, the first available one is~10 so we use that for -% \cs{c_minus_one}. +% \pkg{l3alloc}, and works such that the first available count register +% is $10$. % \begin{macrocode} %<*package> \tex_let:D \c_minus_one \m@ne @@ -1463,12 +1461,8 @@ %</initex> \tex_chardef:D \c_sixteen = 16 ~ \tex_chardef:D \c_zero = 0 ~ -\tex_chardef:D \c_six = 6 ~ -\tex_chardef:D \c_seven = 7 ~ -\tex_chardef:D \c_twelve = 12 ~ % \end{macrocode} % \end{variable} -% \end{variable} % % \begin{variable}{\c_max_register_int} % This is here as this particular integer is needed both in package @@ -1882,7 +1876,8 @@ % version. The |p| form is only valid for expandable tests, we check % for that by making sure that the second argument is empty. % \begin{macrocode} -\cs_set_protected:Npn \__prg_generate_p_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 +\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 @@ -1898,17 +1893,20 @@ { \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 +\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 \c_zero \use:n \use_none:n } } -\cs_set_protected:Npn \__prg_generate_F_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 +\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 \c_zero { } } } -\cs_set_protected:Npn \__prg_generate_TF_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 +\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 \c_zero } @@ -1918,11 +1916,12 @@ % % \begin{macro}{\prg_set_eq_conditional:NNn,\prg_new_eq_conditional:NNn} % \begin{macro}[aux]{\__prg_set_eq_conditional:NNNn} -% The setting-equal functions. Split the two functions and feed a -% first auxiliary \Arg{name_1} \Arg{signature_1} \meta{boolean_1} +% The setting-equal functions. Split both functions and feed +% \Arg{name_1} \Arg{signature_1} \meta{boolean_1} % \Arg{name_2} \Arg{signature_2} \meta{boolean_2} % \meta{copying~function} \meta{conditions} |,| \cs{q_recursion_tail} % |,| \cs{q_recursion_stop} +% to a first auxiliary. % \begin{macrocode} \cs_set_protected_nopar:Npn \prg_set_eq_conditional:NNn { \__prg_set_eq_conditional:NNNn \cs_set_eq:cc } @@ -2303,10 +2302,12 @@ % If an internal error occurs before \LaTeX3 has loaded \pkg{l3msg} then % the code should issue a usable if terse error message and halt. This % can only happen if a coding error is made by the team, so this is -% a reasonable response. +% a reasonable response. Setting the \tn{newlinechar} is needed, to +% turn |^^J| into a proper line break in plain \TeX{}. % \begin{macrocode} \cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4 { + \tex_newlinechar:D = `\^^J \tex_relax:D \tex_errmessage:D { !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J @@ -2697,9 +2698,9 @@ % \subsection{Using the signature to define functions} % % We can now combine some of the tools we have to provide a simple -% interface for defining functions. We define some simpler functions -% with user interface |\cs_set:Nn \foo_bar:nn {#1,#2}|, \emph{i.e.}, the -% number of arguments is read from the signature. +% interface for defining functions, where the number of arguments is +% read from the signature. For instance, +% |\cs_set:Nn \foo_bar:nn {#1,#2}|. % % \begin{macro} % { diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 4ff6c7dd5cf..38c88835fab 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -44,12 +44,12 @@ % keyword together! % % At this stage, no test has taken place for the \eTeX{} extensions, and -% so using \cs{protected} could give an error. To avoid that, it is used +% so using \tn{protected} could give an error. To avoid that, it is used % by csname: if it's not available, the bootstrap code will bail out at % the point of testing for the necessary primitives, while if it is available % then \cs{GetIdInfo} and so on will be properly protected. All of this is -% then done in a group to avoid leaving \cs{protected} about as equivalent -% to \cs{relax} if the extensions are unavailable. +% then done in a group to avoid leaving \tn{protected} about as equivalent +% to \tn{relax} if the extensions are unavailable. % \begin{macrocode} \begingroup \csname protected\endcsname\gdef\GetIdInfo @@ -78,7 +78,7 @@ \def\ExplFileDescription{#2}% \def\ExplFileName{[unknown name]}% \def\ExplFileExtension{[unknown extension]}% - \def\ExplFileDate{-1}% + \def\ExplFileVersion{-1}% }% \else \def\tempa @@ -145,7 +145,7 @@ % \end{macro} % \end{macro} % \end{macro} -\GetIdInfo$Id: l3bootstrap.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3bootstrap.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Bootstrap code} %</driver|package> %<*driver> @@ -205,9 +205,10 @@ % |\RequirePackage{expl3}| \\ % \cs{ProvidesExplPackage} \Arg{package} \Arg{date} \Arg{version} \Arg{description} % \end{syntax} -% These functions act broadly in the same way as the \LaTeXe{} kernel -% functions \cs{ProvidesPackage}, \cs{ProvidesClass} and -% \cs{ProvidesFile}. However, they also implicitly switch +% These functions act broadly in the same way as the corresponding +% \LaTeXe{} kernel +% functions \tn{ProvidesPackage}, \tn{ProvidesClass} and +% \tn{ProvidesFile}. However, they also implicitly switch % \cs{ExplSyntaxOn} for the remainder of the code with the file. At the % end of the file, \cs{ExplSyntaxOff} will be called to reverse this. % (This is the same concept as \LaTeXe{} provides in turning on @@ -294,7 +295,7 @@ %</initex> % \end{macrocode} % -% \subsection{The \cs{pdfstrcmp} primitive with \XeTeX{} and \LuaTeX{}} +% \subsection{The \tn{pdfstrcmp} primitive with \XeTeX{} and \LuaTeX{}} % % Only \pdfTeX{} has a primitive called \tn{pdfstrcmp}. The \XeTeX{} % version is just \tn{strcmp}, so there is some shuffling to do. As @@ -306,7 +307,7 @@ \fi % \end{macrocode} % -% If \LuaTeX{} is in use then no primitive \cs{(pdf)strcmp} is available. +% If \LuaTeX{} is in use then no primitive \tn{pdfstrcmp} is available. % However, it can be emulated using some Lua code. In earlier versions of % the code, the \pkg{pdftexcmds} package was loaded to do this task. However, % that raises some issues in \enquote{generic} (it fails with Con\TeX{}t @@ -367,7 +368,7 @@ % \subsection{Engine requirements} % % The code currently requires functionality equivalent to \tn{pdfstrcmp} -% in addition to \eTeX{}. This is picked up by testing for the \cs{pdfstrcmp} +% in addition to \eTeX{}. This is picked up by testing for the \tn{pdfstrcmp} % primitive or a version of \LuaTeX{} capable of emulating it. % \begin{macrocode} \begingroup @@ -388,11 +389,11 @@ \expandafter\ifx\csname directlua\endcsname\relax \else \ifnum\luatexversion<36 % + \newlinechar`\^^J\relax %<*initex> \def\LineBreak{^^J}% \edef\next {% - \newlinechar`\noexpand\^^J\relax \errhelp {% \LongText @@ -410,13 +411,11 @@ \def\LineBreak{\noexpand\MessageBreak}% \expandafter\ifx\csname PackageError\endcsname\relax \def\LineBreak{^^J}% - \begingroup - \def\PackageError#1#2#3% - {% - \endgroup - \errhelp{#3}% - \errmessage{#1 Error: #2!} - }% + \def\PackageError#1#2#3% + {% + \errhelp{#3}% + \errmessage{#1 Error: #2!} + }% \fi \edef\next {% @@ -440,19 +439,19 @@ % been around since 1997 in the \pkg{etex} package. % % Loading this support is delayed until here as we are now sure that the -% \eTeX{} extensions and \cs{pdfstrcmp} or equivalent are available. Thus +% \eTeX{} extensions and \tn{pdfstrcmp} or equivalent are available. Thus % there is no danger of an \enquote{uncontrolled} error if the engine % requirements are not met. % % For \LaTeX{} only, load \pkg{etex} as otherwise we are likely to get into % trouble with registers. Some inserts are reserved also as these have to -% be from the standard pool. Note that \cs{reserveinserts} is \cs{outer} +% be from the standard pool. Note that \tn{reserveinserts} is \tn{outer} % and so is accessed here by csname. In earlier versions, loading \pkg{etex} -% was done directly and so \cs{reserveinserts} appeared in the code: this -% then required a \cs{relax} after \cs{RequirePackage} to prevent an error +% was done directly and so \tn{reserveinserts} appeared in the code: this +% then required a \tn{relax} after \tn{RequirePackage} to prevent an error % with \enquote{unsafe} definitions as seen for example with \pkg{capoptions}. -% The optional loading here is done using a group and \cs{ifx} test as we -% are not quite in the position to have a single name for \cs{pdfstrcmp} just +% The optional loading here is done using a group and \tn{ifx} test as we +% are not quite in the position to have a single name for \tn{pdfstrcmp} just % yet. % \begin{macrocode} %<*package> diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index 3ca5609396d..3bfbeb053ec 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3box.dtx 4974 2014-05-31 18:28:43Z mittelba $ +\GetIdInfo$Id: l3box.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental boxes} %</driver|package> %<*driver> @@ -753,8 +753,10 @@ % \begin{macro}[pTF]{\box_if_exist:N, \box_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -921,7 +923,7 @@ % % \subsection{Viewing box contents} % -% \TeX{}'s \tn{tex_showbox:D} is not really that helpful in many cases, and +% \TeX{}'s \tn{showbox} is not really that helpful in many cases, and % it is also inconsistent with other \LaTeX3{} \texttt{show} functions as it % does not actually shows material in the terminal. So we provide a richer % set of functionality. @@ -967,7 +969,7 @@ % \begin{macro}[aux]{\@@_show:NNnn} % The internal auxiliary to actually do the output uses a group to deal % with breadth and depth values. The \cs{use:n} here gives better output -% appearance. Setting \tn{tex_tracingonline:D} is used to control what +% appearance. Setting \tn{tracingonline} is used to control what % appears in the terminal. % \begin{macrocode} \cs_new_protected:Npn \@@_show:NNnn #1#2#3#4 @@ -1001,7 +1003,8 @@ % \begin{macro}{\hbox_gset:Nn,\hbox_gset:cn} % \testfile* % \begin{macrocode} -\cs_new_protected:Npn \hbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_hbox:D {#2} } +\cs_new_protected:Npn \hbox_set:Nn #1#2 + { \tex_setbox:D #1 \tex_hbox:D {#2} } \cs_new_protected:Npn \hbox_gset:Nn { \tex_global:D \hbox_set:Nn } \cs_generate_variant:Nn \hbox_set:Nn { c } \cs_generate_variant:Nn \hbox_gset:Nn { c } @@ -1164,7 +1167,10 @@ % Storing material in a vertical box with a specified height. % \begin{macrocode} \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3 - { \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end: { #3 \par } } + { + \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end: + { #3 \par } + } \cs_new_protected:Npn \vbox_gset_to_ht:Nnn { \tex_global:D \vbox_set_to_ht:Nnn } \cs_generate_variant:Nn \vbox_set_to_ht:Nnn { c } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index f722c6f0a1d..38558ff9325 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3candidates.dtx 5232 2014-07-18 19:32:54Z joseph $ +\GetIdInfo$Id: l3candidates.dtx 5366 2014-08-24 21:35:03Z bruno $ {L3 Experimental additions to l3kernel} %</driver|package> %<*driver> @@ -97,13 +97,32 @@ % mailing list. This way it becomes easier to coordinate any updates necessary without a issues % for the users of your package. % \item Discussing and understanding use cases for a particular addition or concept also helps to -% ensure that we provide the right interfaces in the final version so please give us feedback +% ensure that we provide the right interfaces in the final version so please give us feedback % if you consider a certain candidate function useful (or not). % \end{itemize} % We only add functions in this space if we consider them being serious candidates for a final inclusion % into the kernel. However, real use sometimes leads to better ideas, so functions from this module are % \textbf{not necessarily stable} and we may have to adjust them! % +% \section{Additions to \pkg{l3basics}} +% +% \begin{function}[added = 2014-08-22]{\cs_log:N, \cs_log:c} +% \begin{syntax} +% \cs{cs_log:N} \meta{control sequence} +% \end{syntax} +% Writes the definition of the \meta{control sequence} in the log +% file. See also \cs{cs_show:N} which displays the result in the +% terminal. +% \end{function} +% +% \begin{function}{\__kernel_register_log:N, \__kernel_register_log:c} +% \begin{syntax} +% \cs{__kernel_register_log:N} \meta{register} +% \end{syntax} +% Used to write the contents of a \TeX{} register to the log file in a +% form similar to \cs{__kernel_register_show:N}. +% \end{function} +% % \section{Additions to \pkg{l3box}} % % \subsection{Affine transformations} @@ -142,7 +161,7 @@ % The updated \meta{box} will be an hbox, irrespective of the nature % of the \meta{box} before the resizing is applied. A negative size will % cause the material in the \meta{box} to be reversed in direction, but the -% reference point of the \meta{box} will be unchanged. +% reference point of the \meta{box} will be unchanged. % Thus negative $y$-sizes will result in a box with depth dependent on the % height of the original box and height dependent on the depth of the original. % The resizing applies within the current \TeX{} group level. @@ -176,7 +195,7 @@ % The updated \meta{box} will be an hbox, irrespective of the nature % of the \meta{box} before the resizing is applied. A negative size will % cause the material in the \meta{box} to be reversed in direction, but the -% reference point of the \meta{box} will be unchanged. +% reference point of the \meta{box} will be unchanged. % Thus negative $y$-sizes will result in a box a depth dependent on the % height of the original box a height dependent on the depth. % The resizing applies within the current \TeX{} group level. @@ -309,6 +328,24 @@ % correctly. % \end{variable} % +% \section{Additions to \pkg{l3clist}} +% +% \begin{function}[added = 2014-08-22]{\clist_log:N, \clist_log:c} +% \begin{syntax} +% \cs{clist_log:N} \meta{comma list} +% \end{syntax} +% Writes the entries in the \meta{comma list} in the log file. See +% also \cs{clist_show:N} which displays the result in the terminal. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\clist_log:n} +% \begin{syntax} +% \cs{clist_log:n} \Arg{tokens} +% \end{syntax} +% Writes the entries in the comma list in the log file. See also +% \cs{clist_show:n} which displays the result in the terminal. +% \end{function} +% % \section{Additions to \pkg{l3coffins}} % % \begin{function}{\coffin_resize:Nnn, \coffin_resize:cnn} @@ -338,6 +375,18 @@ % respectively. The two scale factors should be given as real numbers. % \end{function} % +% \begin{function}[added = 2014-08-22] +% {\coffin_log_structure:N, \coffin_log_structure:c} +% \begin{syntax} +% \cs{coffin_log_structure:N} \meta{coffin} +% \end{syntax} +% This function writes the structural information about the +% \meta{coffin} in the log file. The width, height and depth of the +% typeset material are given, along with the location of all of the +% poles of the coffin. See also \cs{coffin_show_structure:N} which +% displays the result in the terminal. +% \end{function} +% % \section{Additions to \pkg{l3file}} % % \begin{function}[TF, added = 2014-07-02]{\file_if_exist_input:n} @@ -348,7 +397,7 @@ % Searches for \meta{file name} using the current \TeX{} search % path and the additional paths controlled by % \cs{file_path_include:n}). If found, inserts the \meta{true code} then -% reads in the file as additional \LaTeX{} source as described for +% reads in the file as additional \LaTeX{} source as described for % \cs{file_input:n}. Note that \cs{file_if_exist_input:n} does not raise % an error if the file is not found, in contrast to \cs{file_input:n}. % \end{function} @@ -436,6 +485,113 @@ % \end{texnote} % \end{function} % +% \begin{function}[added = 2014-08-22] +% {\ior_log_streams:, \iow_log_streams:} +% \begin{syntax} +% \cs{ior_log_streams:} +% \cs{iow_log_streams:} +% \end{syntax} +% Writes in the log file a list of the file names associated with each +% open stream: intended for tracking down problems. +% \end{function} +% +% \section{Additions to \pkg{l3fp}} +% +% \begin{function}[added = 2014-08-22]{\fp_log:N, \fp_log:c, \fp_log:n} +% \begin{syntax} +% \cs{fp_log:N} \meta{fp~var} +% \cs{fp_log:n} \Arg{floating point expression} +% \end{syntax} +% Evaluates the \meta{floating point expression} and writes the +% result in the log file. +% \end{function} +% +% \section{Additions to \pkg{l3int}} +% +% \begin{function}[added = 2014-08-22]{\int_log:N, \int_log:c} +% \begin{syntax} +% \cs{int_log:N} \meta{integer} +% \end{syntax} +% Writes the value of the \meta{integer} in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\int_log:n} +% \begin{syntax} +% \cs{int_log:n} \Arg{integer expression} +% \end{syntax} +% Writes the result of evaluating the \meta{integer expression} +% in the log file. +% \end{function} +% +% \section{Additions to \pkg{l3keys}} +% +% \begin{function}[added = 2014-08-22]{\keys_log:nn} +% \begin{syntax} +% \cs{keys_log:nn} \Arg{module} \Arg{key} +% \end{syntax} +% Writes in the log file the function which is used to actually +% implement a \meta{key} for a \meta{module}. +% \end{function} +% +% \section{Additions to \pkg{l3msg}} +% +% \begin{function}[added = 2014-08-22]{\__msg_log:nnn} +% \begin{syntax} +% \cs{__msg_log:nnn} \Arg{module} \Arg{message} \Arg{arg one} +% \end{syntax} +% Writes the \meta{message} from \meta{module} in the log file without +% formatting. Used in messages which print complex variable contents +% completely. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\__msg_log_variable:Nnn} +% \begin{syntax} +% \cs{__msg_log_variable:Nnn} \meta{variable} \Arg{type} \Arg{formatted content} +% \end{syntax} +% Writes the \meta{formatted content} of the \meta{variable} of +% \meta{type} in the log file. The \meta{formatted content} will be +% processed as the first argument in a call to \cs{iow_wrap:nnnN}, +% hence |\\|, \verb*|\ | and other formatting sequences can be used. +% Once expanded and processed, the \meta{formatted content} must +% either be empty or contain |>|; everything until the first |>| will +% be removed. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\__msg_log_wrap:n} +% \begin{syntax} +% \cs{__msg_log_wrap:n} \Arg{formatted text} +% \end{syntax} +% Writes the \meta{formatted text} in the log file. After expansion, +% unless it is empty, the \meta{formatted text} must contain |>|, +% and the part of \meta{formatted text} before the first |>| is +% removed. Failure to do so causes low-level \TeX{} errors. +% \end{function} +% +% \begin{function}[added = 2014-08-22] +% {\__msg_log_value:n, \__msg_log_value:x} +% \begin{syntax} +% \cs{__msg_log_value:n} \Arg{tokens} +% \end{syntax} +% Writes \verb*|> |\meta{tokens}|.| in the log file. +% \end{function} +% +% \section{Additions to \pkg{l3prg}} +% +% \begin{function}[added = 2014-08-22]{\bool_log:N, \bool_log:c} +% \begin{syntax} +% \cs{bool_log:N} \meta{boolean} +% \end{syntax} +% Writes the logical truth of the \meta{boolean} in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\bool_log:n} +% \begin{syntax} +% \cs{bool_log:n} \Arg{boolean expression} +% \end{syntax} +% Writes the logical truth of the \meta{boolean expression} in the log +% file. +% \end{function} +% % \section{Additions to \pkg{l3prop}} % % \begin{function}[rEXP] @@ -456,6 +612,13 @@ % arguments. For that specific task, \cs{prop_item:Nn} is faster. % \end{function} % +% \begin{function}[added = 2014-08-12]{\prop_log:N, \prop_log:c} +% \begin{syntax} +% \cs{prop_log:N} \meta{property list} +% \end{syntax} +% Writes the entries in the \meta{property list} in the log file. +% \end{function} +% % \section{Additions to \pkg{l3seq}} % % \begin{function}[rEXP] @@ -509,6 +672,13 @@ % \end{texnote} % \end{function} % +% \begin{function}[added = 2014-08-12]{\seq_log:N, \seq_log:c} +% \begin{syntax} +% \cs{seq_log:N} \meta{sequence} +% \end{syntax} +% Writes the entries in the \meta{sequence} in the log file. +% \end{function} +% % \section{Additions to \pkg{l3skip}} % % \begin{function}{\skip_split_finite_else_action:nnNN} @@ -525,6 +695,51 @@ % warning message of some sort. % \end{function} % +% \begin{function}[added = 2014-08-22]{\dim_log:N, \dim_log:c} +% \begin{syntax} +% \cs{dim_log:N} \meta{dimension} +% \end{syntax} +% Writes the value of the \meta{dimension} in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\dim_log:n} +% \begin{syntax} +% \cs{dim_log:n} \Arg{dimension expression} +% \end{syntax} +% Writes the result of evaluating the \meta{dimension expression} +% in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\skip_log:N, \skip_log:c} +% \begin{syntax} +% \cs{skip_log:N} \meta{skip} +% \end{syntax} +% Writes the value of the \meta{skip} in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\skip_log:n} +% \begin{syntax} +% \cs{skip_log:n} \Arg{skip expression} +% \end{syntax} +% Writes the result of evaluating the \meta{skip expression} +% in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\muskip_log:N, \muskip_log:c} +% \begin{syntax} +% \cs{muskip_log:N} \meta{muskip} +% \end{syntax} +% Writes the value of the \meta{muskip} in the log file. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\muskip_log:n} +% \begin{syntax} +% \cs{muskip_log:n} \Arg{muskip expression} +% \end{syntax} +% Writes the result of evaluating the \meta{muskip expression} +% in the log file. +% \end{function} +% % \section{Additions to \pkg{l3tl}} % % \begin{function}[EXP,pTF]{\tl_if_single_token:n} @@ -620,7 +835,7 @@ % \begin{verbatim} % SOME~TEXT~{$y = mx + c$}~WITH~{Protection} % \end{verbatim} -% +% % `Mixed' case conversion may be regarded informally as converting the first % character of the \meta{tokens} to upper case and the rest to lower case. % However, the process is more complex than this as there are some cases @@ -640,7 +855,7 @@ % describe this as `title case', but that in English title case applies % on a word-by-word basis. The `mixed' case implemented here is a lower % level concept needed for both `title' and `sentence' casing of text.) -% +% % As is generally true for \pkg{expl3}, these functions are designed to % work with engine-native input only. As such, when used with \pdfTeX{} % \emph{only} the characters \texttt{a}--\texttt{zA}--\texttt{Z} are @@ -652,7 +867,7 @@ % interpret the input to a case change but not generate the correct output % (for example in the mapping i to I-dot in Turkish): in these cases the % input is left unchanged. -% +% % Context-sensitive mappings are enabled: language-dependent cases are % discussed below. The \enquote{final sigma} rule for Greek letters is % enabled and active for all inputs. It is implemented here in a modified @@ -660,7 +875,7 @@ % performance and expandability. Thus a capital sigma will map to a % final-sigma if it is followed by a space or one of the characters: ^^A{[( % |!'),.:;?]}|. (Feedback on this area is very welcome.) -% +% % Language-sensitive conversions are enabled using the \meta{language} % argument, and follow Unicode Consortium guidelines. Currently, the % languages recognised for special handling are as follows. @@ -683,7 +898,7 @@ % retains two separate letters, thus this transformation \emph{is} % available using \pdfTeX{}. % \end{itemize} -% +% % Creating additional context-sensitive mappings requires knowledge % of the underlying mapping implementation used here. The team are happy % to add these to the kernel where they are well-documented @@ -716,6 +931,22 @@ % argument. % \end{function} % +% \begin{function}[added = 2014-08-22]{\tl_log:N, \tl_log:c} +% \begin{syntax} +% \cs{tl_log:N} \meta{tl~var} +% \end{syntax} +% Writes the content of the \meta{tl~var} in the log file. See also +% \cs{tl_show:N} which displays the result in the terminal. +% \end{function} +% +% \begin{function}[added = 2014-08-22]{\tl_log:n} +% \begin{syntax} +% \cs{tl_log:n} \meta{token list} +% \end{syntax} +% Writes the \meta{token list} in the log file. See also +% \cs{tl_show:n} which displays the result in the terminal. +% \end{function} +% % \section{Additions to \pkg{l3tokens}} % % \begin{function}{\char_set_active:Npn, \char_set_active:Npx} @@ -796,6 +1027,54 @@ %<*initex|package> % \end{macrocode} % +% \subsection{Additions to \pkg{l3basics}} +% +% \begin{macrocode} +%<@@=cs> +% \end{macrocode} +% +% \begin{macro}{\cs_log:N, \cs_log:c} +% The same as \cs{cs_show:N} and \cs{cs_show:c}, but using +% \cs{__msg_log_wrap:n} instead of \cs{__msg_show_variable:n}. +% \begin{macrocode} +\group_begin: + \tex_lccode:D `? = `: \scan_stop: + \tex_catcode:D `? = 12 \scan_stop: +\tex_lowercase:D + { + \group_end: + \cs_new_protected:Npn \cs_log:N #1 + { + \__msg_log_wrap:n + { + > ~ \token_to_str:N #1 = + \exp_after:wN \@@_show:www \cs_meaning:N #1 + \use_none:nn ? \prg_do_nothing: + } + } + } +\cs_new_protected_nopar:Npn \cs_log:c + { \group_begin: \exp_args:NNc \group_end: \cs_log:N } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\__kernel_register_log:N, \__kernel_register_log:c} +% Check that the variable exists, then write its name and value to the +% log file. +% \begin{macrocode} +\cs_new_protected:Npn \__kernel_register_log:N #1 + { + \cs_if_exist:NTF #1 + { \__msg_log_value:x { \token_to_str:N #1 = \tex_the:D #1 } } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \__kernel_register_log:N { c } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3box}} % % \begin{macrocode} @@ -1359,7 +1638,10 @@ \dim_compare:nNnTF { \box_ht:N \l_@@_internal_box } > {#5} { \hbox_set:Nn \l_@@_internal_box - { \box_move_up:nn \c_zero_dim { \box_use:N \l_@@_internal_box } } + { + \box_move_up:nn \c_zero_dim + { \box_use:N \l_@@_internal_box } + } \box_set_ht:Nn \l_@@_internal_box { \box_ht:N \l_@@_internal_box - (#5) } } @@ -1407,7 +1689,10 @@ \dim_compare:nNnTF {#5} > \c_zero_dim { \hbox_set:Nn \l_@@_internal_box - { \box_move_up:nn \c_zero_dim { \box_use:N \l_@@_internal_box } } + { + \box_move_up:nn \c_zero_dim + { \box_use:N \l_@@_internal_box } + } \box_set_ht:Nn \l_@@_internal_box { #5 @@ -1429,6 +1714,29 @@ % \end{macrocode} % \end{macro} % +% \subsection{Additions to \pkg{l3clist}} +% +% \begin{macrocode} +%<@@=clist> +% \end{macrocode} +% +% \begin{macro}{\clist_log:N, \clist_log:c, \clist_log:n} +% Same as \cs{clist_show:N} but using \cs{__msg_log_variable:Nnn}. +% \begin{macrocode} +\cs_new_protected:Npn \clist_log:N #1 + { + \__msg_log_variable:Nnn #1 { clist } + { \clist_map_function:NN #1 \__msg_show_item:n } + } +\cs_new_protected:Npn \clist_log:n #1 + { + \clist_set:Nn \l_@@_internal_clist {#1} + \clist_log:N \l_@@_internal_clist + } +\cs_generate_variant:Nn \clist_log:N { c } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3coffins}} % % \begin{macrocode} @@ -1889,6 +2197,28 @@ % \end{macro} % \end{macro} % +% \subsection{Coffin diagnostics} +% +% \begin{macro}{\coffin_log_structure:N, \coffin_log_structure:c} +% Same as \cs{coffin_show_structure:N}, but using +% \cs{__msg_log_variable:Nnn}. +% \begin{macrocode} +\cs_new_protected:Npn \coffin_log_structure:N #1 + { + \@@_if_exist:NT #1 + { + \__msg_log_variable:Nnn #1 { coffins } + { + \prop_map_function:cN + { l_@@_poles_ \__int_value:w #1 _prop } + \__msg_show_item_unbraced:nn + } + } + } +\cs_generate_variant:Nn \coffin_log_structure:N { c } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3file}} % % \begin{macrocode} @@ -1909,7 +2239,7 @@ \file_if_exist:nT {#1} { #2 - \@@_input:V \l_@@_internal_name_tl + \@@_input:V \l_@@_internal_name_tl } } \cs_new_protected:Npn \file_if_exist_input:nF #1 @@ -1922,7 +2252,7 @@ \file_if_exist:nTF {#1} { #2 - \@@_input:V \l_@@_internal_name_tl + \@@_input:V \l_@@_internal_name_tl } } % \end{macrocode} @@ -1988,6 +2318,197 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\ior_log_streams:} +% \begin{macro}[aux]{\@@_log_streams:Nn} +% Same as \cs{ior_list_streams:}, but with \cs{__msg_log:nnn} and +% \cs{__msg_log_wrap:n}. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \ior_log_streams: + { \@@_log_streams:Nn \g_@@_streams_prop { input } } +\cs_new_protected:Npn \@@_log_streams:Nn #1#2 + { + \__msg_log:nnn { LaTeX / kernel } + { \prop_if_empty:NTF #1 { show-no-stream } { show-open-streams } } + {#2} + \__msg_log_wrap:n + { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%<@@=iow> +% \end{macrocode} +% +% \begin{macro}{\iow_log_streams:} +% \begin{macro}[aux]{\@@_log_streams:Nn} +% Same as \cs{iow_list_streams:}, but with \cs{__msg_log:nnn} and +% \cs{__msg_log_wrap:n}. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \iow_log_streams: + { \@@_log_streams:Nn \g_@@_streams_prop { output } } +\cs_new_protected:Npn \@@_log_streams:Nn #1#2 + { + \__msg_log:nnn { LaTeX / kernel } + { \prop_if_empty:NTF #1 { show-no-stream } { show-open-streams } } + {#2} + \__msg_log_wrap:n + { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Additions to \pkg{l3fp}} +% +% \begin{macrocode} +%<@@=fp> +% \end{macrocode} +% +% \begin{macro}{\fp_log:N, \fp_log:c, \fp_log:n} +% Same as \cs{fp_show:N} but using \cs{__msg_log_value:x} since we +% know that the result is short. +% \begin{macrocode} +\cs_new_protected:Npn \fp_log:N #1 + { + \fp_if_exist:NTF #1 + { \__msg_log_value:x { \token_to_str:N #1 = \fp_to_tl:N #1 } } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \fp_log:n #1 + { \__msg_log_value:x { \fp_to_tl:n {#1} } } +\cs_generate_variant:Nn \fp_log:N { c } +% \end{macrocode} +% \end{macro} +% +% \subsection{Additions to \pkg{l3int}} +% +% \begin{macro}{\int_log:N, \int_log:c} +% Simple copies. +% \begin{macrocode} +\cs_new_eq:NN \int_log:N \__kernel_register_log:N +\cs_new_eq:NN \int_log:c \__kernel_register_log:c +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\int_log:n} +% Use \cs{__msg_log_value:x}. +% \begin{macrocode} +\cs_new_protected:Npn \int_log:n #1 + { \__msg_log_value:x { \int_eval:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \subsection{Additions to \pkg{l3keys}} +% +% \begin{macrocode} +%<@@=keys> +% \end{macrocode} +% +% \begin{macro}{\keys_log:nn} +% See \cs{keys_show:nn} but using \cs{cs_log:c} instead of +% \cs{show:c}. +% \begin{macrocode} +\cs_new_protected:Npn \keys_log:nn #1#2 + { \cs_log:c { \c_@@_code_root_tl #1 / \tl_to_str:n {#2} } } +% \end{macrocode} +% \end{macro} +% +% \subsection{Additions to \pkg{l3msg}} +% +% \begin{macrocode} +%<@@=msg> +% \end{macrocode} +% +% \begin{macro}[int]{\@@_log:nnn} +% Print the text of a message to the terminal without formatting: +% short cuts around \cs{iow_wrap:nnnN}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_log:nnn #1#2#3 + { + \iow_wrap:nnnN + { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} { } { } { } } + { } { } \iow_log:n + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_log_variable:Nnn, \@@_log_wrap:n} +% \begin{macro}[aux]{\@@_log:n} +% This is a direct analogue of \cs{@@_show_variable:Nnn}, but writing +% to the log file instead of the terminal. It is important to pass to +% \cs{iow_wrap:nnnN} the whole text that will be written in the log, +% including the trailing period, as it would otherwise not be +% formatted correctly. Note that we detect the case where nothing +% would be shown, and add |>~| at the start: this is safe unless lines +% are less than $3$~characters long. +% \begin{macrocode} +\cs_new_protected:Npn \@@_log_variable:Nnn #1#2#3 + { + \cs_if_exist:NTF #1 + { + \@@_log:nnn { LaTeX / kernel } { show- #2 } {#1} + \@@_log_wrap:n {#3} + } + { + \@@_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \@@_log_wrap:n #1 + { \iow_wrap:nnnN { #1 . } { } { } \@@_log:n } +\cs_new_protected:Npn \@@_log:n #1 + { \iow_log:x { \tl_if_single:nT {#1} { > ~ } #1 } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[int]{\@@_log_value:n, \@@_log_value:x} +% Write the tokens |#1| to the log file without line wrapping but with +% a formatting similar to what is done by the commands which show +% material to the terminal. +% \begin{macrocode} +\cs_new_protected:Npn \@@_log_value:n #1 + { \iow_log:n { >~ #1 . } } +\cs_generate_variant:Nn \@@_log_value:n { x } +% \end{macrocode} +% \end{macro} +% +% \subsection{Additions to \pkg{l3prg}} +% +% \begin{macrocode} +%<@@=bool> +% \end{macrocode} +% +% \begin{macro}{\bool_log:N, \bool_log:c, \bool_log:n} +% \begin{macro}[aux]{\@@_to_word:n} +% Writes in the log file the truth value of the boolean, as +% \texttt{true} or \texttt{false}. We use \cs{__msg_log_value:x}. +% \begin{macrocode} +\cs_new_protected:Npn \bool_log:N #1 + { + \bool_if_exist:NTF #1 + { + \__msg_log_value:x + { \token_to_str:N #1 = \@@_to_word:n {#1} } + } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \bool_log:n #1 + { \__msg_log_value:x { \@@_to_word:n {#1} } } +\cs_new:Npn \@@_to_word:n #1 { \bool_if:nTF {#1} { true } { false } } +\cs_generate_variant:Nn \bool_log:N { c } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \subsection{Additions to \pkg{l3prop}} % % \begin{macrocode} @@ -2023,6 +2544,18 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\prop_log:N, \prop_log:c} +% Same as \cs{prop_show:N} but using \cs{__msg_log_variable:Nnn}. +% \begin{macrocode} +\cs_new_protected:Npn \prop_log:N #1 + { + \__msg_log_variable:Nnn #1 { prop } + { \prop_map_function:NN #1 \__msg_show_item:nn } + } +\cs_generate_variant:Nn \prop_log:N { c } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3seq}} % % \begin{macrocode} @@ -2039,7 +2572,7 @@ % \@@_mapthread_function:wNN, \@@_mapthread_function:wNw, % \@@_mapthread_function:Nnnwnn % } -% The idea here is to first expand both sequences, adding the +% The idea is to first expand both sequences, adding the % usual |{ ? \__prg_break: } { }| to the end of each one. This is % most conveniently done in two steps using an auxiliary function. % The mapping then throws away the first tokens of |#2| and |#5|, @@ -2121,6 +2654,18 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\seq_log:N, \seq_log:c} +% Same as \cs{seq_show:N} but using \cs{__msg_show_variable:Nnn}. +% \begin{macrocode} +\cs_new_protected:Npn \seq_log:N #1 + { + \__msg_log_variable:Nnn #1 { seq } + { \seq_map_function:NN #1 \__msg_show_item:n } + } +\cs_generate_variant:Nn \seq_log:N { c } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3skip}} % % \begin{macrocode} @@ -2151,6 +2696,36 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\dim_log:N, \dim_log:c, \dim_log:n} +% Diagnostics. +% \begin{macrocode} +\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 #1 + { \__msg_log_value:x { \dim_eval:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\skip_log:N, \skip_log:c, \skip_log:n} +% Diagnostics. +% \begin{macrocode} +\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 #1 + { \__msg_log_value:x { \skip_eval:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\muskip_log:N, \muskip_log:c, \muskip_log:n} +% Diagnostics. +% \begin{macrocode} +\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 #1 + { \__msg_log_value:x { \muskip_eval:n {#1} } } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3tl}} % % \begin{macrocode} @@ -2158,17 +2733,23 @@ % \end{macrocode} % % \begin{macro}[EXP,pTF]{\tl_if_single_token:n} -% There are four cases: empty token list, token list starting with -% a normal token, with a brace group, or with a space token. -% If the token list starts with a normal token, remove it -% and check for emptiness. Otherwise, compare with a single -% space, only case where we have a single token. +% There are four cases: empty token list, token list starting with a +% normal token, with a brace group, or with a space token. If the +% token list starts with a normal token, remove it and check for +% emptiness. For the next case, an empty token list is not a single +% token. Finally, we have a non-empty token list starting with a +% space or a brace group. Applying \texttt{f}-expansion yields an +% empty result if and only if the token list is a single space. % \begin{macrocode} \prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF } { \tl_if_head_is_N_type:nTF {#1} - { \__str_if_eq_x_return:nn { \exp_not:o { \use_none:n #1 } } { } } - { \__str_if_eq_x_return:nn { \exp_not:n {#1} } { ~ } } + { \@@_if_empty_return:o { \use_none:n #1 } } + { + \tl_if_empty:nTF {#1} + { \prg_return_false: } + { \@@_if_empty_return:o { \tex_romannumeral:D -`0 #1 } } + } } % \end{macrocode} % \end{macro} @@ -2310,7 +2891,10 @@ \cs_new:Npn \@@_act_case_group:nn #1 #2 { \exp_after:wN \@@_act_output:n \exp_after:wN - { \exp_after:wN { \tex_romannumeral:D \@@_act_case_aux:nn {#1} {#2} } } + { + \exp_after:wN + { \tex_romannumeral:D \@@_act_case_aux:nn {#1} {#2} } + } } % \end{macrocode} % \end{macro} @@ -2436,14 +3020,14 @@ % in \cs{@@_act:NNNnn}. Thus the idea is to use a loop which is will grab % the entire token list plus a quark: the latter is used as an end marker and % to avoid any brace stripping. Depending on the nature of the first item -% in the grabbed argument, it can eithsrprocessed as a single token, +% in the grabbed argument, it can either processed as a single token, % treated as a group or treated as a space (the latter requires special % treatment). In contrast to \cs{@@_act:NNNnn}, there is no need for this % process to be \texttt{f}-type expandable: things are done using only % \texttt{x}-type requirements. Also, for \enquote{normal} tokens there is % a bit more work to do here: to allow selection of case matches using % character code, it's important that control sequences are filtered out -% before doing the lookup. +% before doing the lookup. % \begin{macrocode} \cs_new:Npn \@@_change_case:nnn #1#2#3 { @@ -2497,7 +3081,7 @@ \cs_new:Npn \__tl_change_case_char:NNNNNNNNn #1#2#3#4#5#6#7#8#9 { \exp_args:NNv \str_case:nnF #8 - { c_@@_ #9 _ #6 _ #7 _tl } + { c_@@_ #9 _ #6 _X_ #7 _tl } { \exp_not:N #8 } } % \end{macrocode} @@ -2526,13 +3110,13 @@ % a small number of chars. As this may have to be extended over time to other % cases, the easiest handling is offered by using the numerical values for % these chars. -% \begin{macrocode} +% \begin{macrocode} \cs_new:Npn \@@_change_case_lower_sigma:Nw #1#2 \q_recursion_stop { \token_if_cs:NTF #1 { \c_@@_std_sigma_tl } { - \exp_after:wN \@@_change_case_lower_sigma_loop:Nw + \exp_after:wN \@@_change_case_lower_sigma_loop:Nw \exp_after:wN #1 \c_@@_after_final_sigma_clist , \q_recursion_tail , \q_recursion_stop } @@ -2609,12 +3193,14 @@ #1 {#2} { \exp_after:wN \@@_mixed_case_skip:Nwn \exp_after:wN #1 - \c__tl_mixed_skip_clist , \q_recursion_tail , \q_recursion_stop + \c__tl_mixed_skip_clist , \q_recursion_tail , + \q_recursion_stop { \exp_args:NNV \str_case:nnF #1 \c_@@_mixed_exceptions_tl { \exp_after:wN \@@_change_case_char:NNNNNNNNn - \int_use:N \__int_eval:w 1000000 + `#1 \__int_eval_end: + \int_use:N + \__int_eval:w 1000000 + `#1 \__int_eval_end: #1 { upper } } } @@ -2767,7 +3353,7 @@ } % \end{macrocode} % Grab the next char and see if it is one of the accents used in Lithuanian: -% if it is, add the dot-above char into the output. +% if it is, add the dot-above char into the output. % \begin{macrocode} \cs_new:Npn \@@_change_case_lower_lt:Nw #1#2 \q_recursion_stop { @@ -2788,7 +3374,7 @@ % The test required here is for a dot-above char after an I, J or I-ogonek. % If there is one, it's removed using \cs{use_i:nn} (which preserves the % loop and discards the char). -% \begin{macrocode} +% \begin{macrocode} \cs_new:Npn \@@_change_case_upper_lt:Nnn #1#2#3 { #3 @@ -2796,7 +3382,7 @@ { \tl_if_head_is_N_type_p:n {#2} && - ( + ( \int_compare_p:nNn { `#1 } = { "0069 } || \int_compare_p:nNn { `#1 } = { "006A } || \int_compare_p:nNn { `#1 } = { "012F } @@ -2851,6 +3437,31 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\tl_log:N, \tl_log:c} +% Showing token list variables in the log file is done after checking +% that the variable is defined. +% \begin{macrocode} +\cs_new_protected:Npn \tl_log:N #1 + { + \tl_if_exist:NTF #1 + { \cs_log:N #1 } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \tl_log:N { c } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tl_log:n} +% The same as \cs{tl_show:n} but using \cs{__msg_log_wrap:n}. +% \begin{macrocode} +\cs_new_protected:Npn \tl_log:n #1 + { \__msg_log_wrap:n { > ~ \tl_to_str:n {#1} } } +% \end{macrocode} +% \end{macro} +% % \subsection{Additions to \pkg{l3tokens}} % % \begin{macrocode} @@ -2954,9 +3565,9 @@ \cs_new_protected_nopar:Npn \peek_N_type:TF { \@@_token_generic:NNTF \@@_execute_branches_N_type: \scan_stop: } \cs_new_protected_nopar:Npn \peek_N_type:T - { \@@_token_generic:NNT \@@_execute_branches_N_type: \scan_stop: } + { \@@_token_generic:NNT \@@_execute_branches_N_type: \scan_stop: } \cs_new_protected_nopar:Npn \peek_N_type:F - { \@@_token_generic:NNF \@@_execute_branches_N_type: \scan_stop: } + { \@@_token_generic:NNF \@@_execute_branches_N_type: \scan_stop: } % \end{macrocode} % \end{macro} % \end{macro} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index d0389fc311c..edd55416b41 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -39,7 +39,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3clist.dtx 5237 2014-07-19 15:09:54Z bruno $ +\GetIdInfo$Id: l3clist.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Comma separated lists} %</driver|package> %<*driver> @@ -311,7 +311,7 @@ % Leaves the items in the \meta{comma list} in the input stream in % reverse order. Braces and spaces are preserved by this process. % \begin{texnote} -% The result is returned within \tn{exp_not:n}, which means that the +% The result is returned within \tn{unexpanded}, which means that the % comma list will not expand further when appearing in an % \texttt{x}-type argument expansion. % \end{texnote} @@ -900,8 +900,10 @@ % \begin{macro}[pTF]{\clist_if_exist:N, \clist_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -1374,8 +1376,10 @@ % \UnitTested % Simple copies from the token list variable material. % \begin{macrocode} -\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_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 } % \end{macrocode} % \end{macro} % @@ -1692,7 +1696,10 @@ \q_stop { } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } + { + \__msg_kernel_expandable_error:nnn + { kernel } { bad-variable } {#1} + } } \cs_generate_variant:Nn \clist_use:Nnnn { c } \cs_new:Npn \@@_use:wwn #1 , #2 , #3 { \exp_not:n { #1 #3 #2 } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index c81c35070d3..ac62507f29b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3coffins.dtx 4899 2014-05-28 20:13:51Z joseph $ +\GetIdInfo$Id: l3coffins.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Coffin code layer} %</driver|package> %<*driver> @@ -590,7 +590,10 @@ \@@_set_pole:Nnx #1 { T } { { 0 pt } - { \dim_eval:n { \box_ht:N #1 - \box_ht:N \l_@@_internal_box } } + { + \dim_eval:n + { \box_ht:N #1 - \box_ht:N \l_@@_internal_box } + } { 1000 pt } { 0 pt } } @@ -654,7 +657,8 @@ { { 0 pt } { - \dim_eval:n { \box_ht:N #1 - \box_ht:N \l_@@_internal_box } + \dim_eval:n + { \box_ht:N #1 - \box_ht:N \l_@@_internal_box } } { 1000 pt } { 0 pt } @@ -1063,7 +1067,8 @@ % Thus |#4| and |#5| should be the directions of the pole while % |#2| and |#3| are co-ordinates. % \begin{macrocode} -\cs_new_protected:Npn \@@_calculate_intersection_aux:nnnnnN #1#2#3#4#5#6 +\cs_new_protected:Npn \@@_calculate_intersection_aux:nnnnnN + #1#2#3#4#5#6 { \dim_set:Nn #6 { @@ -1122,7 +1127,7 @@ % \begin{macrocode} \@@_reset_structure:N \l_@@_aligned_coffin \prop_clear:c - { l_@@_corners_ \__int_value:w \l_@@_aligned_coffin _ prop } + { l_@@_corners_ \__int_value:w \l_@@_aligned_coffin _ prop } \@@_update_poles:N \l_@@_aligned_coffin % \end{macrocode} % The structures of the parent coffins are now transferred to the new diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx index ea0dd4d2799..ed538b5ecce 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3color.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3color.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental color support} %</driver|package> %<*driver> @@ -146,7 +146,10 @@ } { \cs_if_exist:NT \set@color - { \cs_set_protected_nopar:Npn \color_ensure_current: { \set@color } } + { + \cs_set_protected_nopar:Npn \color_ensure_current: + { \set@color } + } } } %</package> diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 34acef1916e..b781ba9d199 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -64,8 +64,8 @@ Do not distribute a modified version of this file. \fi %</driver> % -% Need to protect the file metadata for any modules that load l3doc. -% This is restored after "\ProvideExplClass" below. +% Need to protect the file metadata for any modules that load +% \cls{l3doc}. This is restored after \cs{ProvideExplClass} below. % \begin{macrocode} %<class>\let \filenameOld \ExplFileName %<class>\let \filedateOld \ExplFileDate @@ -75,10 +75,7 @@ Do not distribute a modified version of this file. % %<*driver|class> \RequirePackage{expl3,xparse,calc} -%</driver|class> -% -%<*driver|class> -\GetIdInfo$Id: l3doc.dtx 5204 2014-07-15 09:56:33Z mittelba $ +\GetIdInfo$Id: l3doc.dtx 5353 2014-08-23 01:23:51Z bruno $ {L3 Experimental documentation class} %</driver|class> % @@ -92,7 +89,8 @@ Do not distribute a modified version of this file. \end{document} %</driver> % -% This isn't included in the typeset documentation because it's a bit ugly: +% This isn't included in the typeset documentation because it's a bit +% ugly: %<*class> \ProvidesExplClass {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} @@ -103,7 +101,7 @@ Do not distribute a modified version of this file. %</class> % \fi % -% \title{The \pkg{l3doc} class\thanks{This file +% \title{The \cls{l3doc} class\thanks{This file % has version number v\ExplFileVersion, last % revised \ExplFileDate.}} % \author{\Team} @@ -116,106 +114,105 @@ Do not distribute a modified version of this file. % % \section{Introduction} % -% This is an ad-hoc class for documenting the \pkg{expl3} bundle, -% a collection of modules or packages that make up \LaTeX3's programming -% environment. Eventually it will replace the "ltxdoc" class for \LaTeX3, -% but not before the good ideas in \pkg{hypdoc}, \cls{xdoc2}, \pkg{docmfp}, and -% \cls{gmdoc} are incorporated. +% This is an ad-hoc class for documenting the \pkg{expl3} bundle, a +% collection of modules or packages that make up \LaTeX3's programming +% environment. Eventually it will replace the \cls{ltxdoc} class for +% \LaTeX3, but not before the good ideas in \pkg{hypdoc}, \cls{xdoc2}, +% \pkg{docmfp}, and \cls{gmdoc} are incorporated. % -% \textbf{It is much less stable than the main \pkg{expl3} packages. Use at own risk!} +% \textbf{It is much less stable than the main \pkg{expl3} packages. +% Use at own risk!} % -% It is written as a `self-contained' docstrip file: executing -% "latex l3doc.dtx" -% will generate the "l3doc.cls" file and typeset this -% documentation; execute "tex l3doc.dtx" to only generate the ".cls" file. +% It is written as a \enquote{self-contained} docstrip file: executing +% |latex l3doc.dtx| will generate the \file{l3doc.cls} file and typeset +% this documentation; execute |tex l3doc.dtx| to only generate +% \file{l3doc.cls}. % % \section{Features of other packages} % -% This class builds on the \pkg{ltxdoc} class and the \pkg{doc} package, but -% in the time since they were originally written some -% improvements and replacements have appeared that we would like to use as +% This class builds on the \pkg{ltxdoc} class and the \pkg{doc} package, +% but in the time since they were originally written some improvements +% and replacements have appeared that we would like to use as % inspiration. % % These packages or classes are \pkg{hypdoc}, \pkg{docmfp}, \pkg{gmdoc}, -% and \pkg{xdoc}. I have summarised them below in order to work out what -% sort of features we should aim at a minimum for \pkg{l3doc}. +% and \pkg{xdoc}. I have summarised them below in order to work out +% what sort of features we should aim at a minimum for \pkg{l3doc}. % % \subsection{The \pkg{hypdoc} package} % -% This package provides hyperlink support for the \pkg{doc} package. I have -% included it in this list to remind me that cross-referencing between -% documentation and implementation of methods is not very good. (E.g., it -% would be nice to be able to automatically hyperlink the documentation for -% a function from its implementation and vice-versa.) +% This package provides hyperlink support for the \pkg{doc} package. I +% have included it in this list to remind me that cross-referencing +% between documentation and implementation of methods is not very +% good. (\emph{E.g.}, it would be nice to be able to automatically +% hyperlink the documentation for a function from its implementation and +% vice-versa.) % % \subsection{The \pkg{docmfp} package} % % \begin{itemize} -% \item Provides "\DescribeRoutine" and the "routine" environment (etc.) -% for MetaFont and MetaPost code. -% \item Provides "\DescribeVariable" and the "variable" environment (etc.) -% for more general code. -% \item Provides "\Describe" and the "Code" environment (etc.) as a -% generalisation of the above two instantiations. -% \item Small tweaks to the DocStrip system to aid non-\LaTeX\ use. +% \item Provides \cs{DescribeRoutine} and the \env{routine} +% environment (\emph{etc.}) for MetaFont and MetaPost code. +% \item Provides \cs{DescribeVariable} and the \env{variable} +% environment (\emph{etc.}) for more general code. +% \item Provides \cs{Describe} and the \env{Code} environment +% (\emph{etc.}) as a generalisation of the above two +% instantiations. +% \item Small tweaks to the DocStrip system to aid non-\LaTeX{} use. % \end{itemize} % % \subsection{The \pkg{xdoc2} package} % % \begin{itemize} -% \item Two-sided printing. -% \item "\NewMacroEnvironment", "\NewDescribeEnvironment"; similar idea -% to \pkg{docmfp} but more comprehensive. -% \item Tons of small improvements. +% \item Two-sided printing. +% \item \cs{NewMacroEnvironment}, \cs{NewDescribeEnvironment}; similar +% idea to \pkg{docmfp} but more comprehensive. +% \item Tons of small improvements. % \end{itemize} % % \subsection{The \pkg{gmdoc} package} % % Radical re-implementation of \pkg{doc} as a package or class. % \begin{itemize} -% \item Requires no "\begin{macrocode}" blocks! -% \item Automatically inserts "\begin{macro}" blocks! -% \item And a whole bunch of other little things. +% \item Requires no |\begin{macrocode}| blocks! +% \item Automatically inserts |\begin{macro}| blocks! +% \item And a whole bunch of other little things. % \end{itemize} % % \section{Problems \& Todo} % % Problems at the moment: % (1)~not flexible in the types of things that can be documented; -% (2)~no obvious link between the "\begin{function}" environment for -% documenting things to the "\begin{macro}" function that's used +% (2)~no obvious link between the |\begin{function}| environment for +% documenting things to the |\begin{macro}| function that's used % analogously in the implementation. % -% The "macro" should probably be renamed to "function" when it is used within -% an implementation section. But they should have the same syntax before that happens! +% The \env{macro} should probably be renamed to \env{function} when it +% is used within an implementation section. But they should have the +% same syntax before that happens! % -% Furthermore, we need another `layer' of documentation commands to -% account for `user-macro' as opposed to `code-functions'; the \pkg{expl3} -% functions should be documented differently, probably, to the \pkg{xparse} -% user macros (at least in terms of indexing). +% Furthermore, we need another \enquote{layer} of documentation commands +% to account for \enquote{user-macro} as opposed to +% \enquote{code-functions}; the \pkg{expl3} functions should be +% documented differently, probably, to the \pkg{xparse} user macros (at +% least in terms of indexing). % % In no particular order, a list of things to do: % \begin{itemize} -% \item Rename \env{function}/\env{macro} environments to better describe -% their use. -% \item Generalise \env{function}/\env{macro} for documenting `other things', -% such as environment names, package options, even keyval options. -% \item New function like "\part" but for files (remove awkward `File' as "\partname"). -% \item Something better to replace "\StopEventually"; I'm thinking two -% environments \env{documentation} and \env{implementation} that can -% conditionally typeset/ignore their material. -% (This has been implemented but needs further consideration.) -% \item Hyperlink documentation and implementation of macros (see -% the \textsc{dtx} file of \pkg{svn-multi} v2 as an example). -% This is partially done, now, but should be improved. -% \end{itemize} -% -% \section{Bugs} -% -% \begin{itemize} -% \item Spaces are ignored entirely within \env{function} and \env{macro} -% arguments. This is just waiting for a convenient space-trimming -% macro in \pkg{expl3}. +% \item Rename \env{function}/\env{macro} environments to better +% describe their use. +% \item Generalise \env{function}/\env{macro} for documenting +% \enquote{other things}, such as environment names, package +% options, even keyval options. +% \item New function like \tn{part} but for files (remove awkward +% \enquote{File} as \tn{partname}). +% \item Something better to replace \cs{StopEventually}; I'm thinking +% two environments \env{documentation} and \env{implementation} that +% can conditionally typeset/ignore their material. (This has been +% implemented but needs further consideration.) +% \item Hyperlink documentation and implementation of macros (see the +% \textsc{dtx} file of \pkg{svn-multi} v2 as an example). This is +% partially done, now, but should be improved. % \end{itemize} % % \section{Documentation} @@ -223,30 +220,32 @@ Do not distribute a modified version of this file. % \subsection{Configuration} % % Before class options are processed, \pkg{l3doc} loads a configuration -% file "l3doc.cfg" if it exists, allowing you to customise the behaviour of -% the class without having to change the documentation source files. +% file \file{l3doc.cfg} if it exists, allowing you to customise the +% behaviour of the class without having to change the documentation +% source files. % -% For example, to produce documentation on letter-sized paper instead of the -% default A4 size, create |l3doc.cfg| and include the line +% For example, to produce documentation on letter-sized paper instead of +% the default A4 size, create \file{l3doc.cfg} and include the line % \begin{verbatim} % \PassOptionsToClass{letterpaper}{l3doc} % \end{verbatim} % % By default, \pkg{l3doc} selects the |T1| font encoding and loads the -% Latin Modern fonts. -% To prevent this, use the class option |cm-default|. +% Latin Modern fonts. To prevent this, use the class option +% |cm-default|. % % \subsection{Partitioning documentation and implementation} % -% \pkg{doc} uses the "\OnlyDocumentation"/"\AlsoImplementation" macros -% to guide the use of "\StopEventually{}", which is intended to be placed -% to partition the documentation and implementation within a single DTX file. +% \pkg{doc} uses the \cs{OnlyDocumentation}/\cs{AlsoImplementation} +% macros to guide the use of \cs{StopEventually}|{}|, which is intended +% to be placed to partition the documentation and implementation within +% a single \file{.dtx} file. % % This isn't very flexible, since it assumes that we \emph{always} want -% to print the documentation. For the \pkg{expl3} sources, I wanted to be -% be able to input DTX files in two modes: only displaying the documentation, -% and only displaying the implementation. For example: -% +% to print the documentation. For the \pkg{expl3} sources, I wanted to +% be be able to input \file{.dtx} files in two modes: only displaying +% the documentation, and only displaying the implementation. For +% example: % \begin{verbatim} % \DisableImplementation % \DocInput{l3basics,l3prg,...} @@ -256,139 +255,237 @@ Do not distribute a modified version of this file. % \end{verbatim} % % The idea being that the entire \pkg{expl3} bundle can be documented, -% with the implementation included at the back. Now, this isn't perfect, -% but it's a start. +% with the implementation included at the back. Now, this isn't +% perfect, but it's a start. +% +% Use |\begin{documentation}...\end{documentation}| around the +% documentation, and |\begin{implementation}...\end{implementation}| +% around the implementation. The +% \cs{EnableDocumentation}/\cs{EnableImplementation} will cause them to +% be typeset when the \file{.dtx} file is \cs{DocInput}; use +% \cs{DisableDocumentation}/\cs{DisableImplementation} to omit the +% contents of those environments. +% +% Note that \cs{DocInput} now takes comma-separated arguments, and +% \cs{DocInputAgain} can be used to re-input all \file{.dtx} files +% previously input in this way. +% +% \subsection{General text markup} +% +% Many of the commands in this section come from \pkg{ltxdoc} with some +% improvements. +% +% \begin{function}{\cmd, \cs} +% \begin{syntax} +% \cmd{\cmd} \oarg{options} \meta{control sequence}\\ +% \cs{cs} \oarg{options} \marg{csname} +% \end{syntax} +% These commands are provided to typeset control sequences. +% |\cmd\foo| produces \enquote{\cmd\foo} and |\cs{foo}| produces the +% same (\enquote{\cs{foo}}). In general, \cs{cs} is more robust since +% it doesn't rely on catcodes being \enquote{correct} and is therefore +% recommended. +% +% These commands are aware of the |@@| \pkg{l3docstrip} syntax and +% will replace such instances correctly in the typeset documentation. +% This only happens after a |%<@@=|\meta{module}|>| declaration. +% +% Additionally, commands can be used in the argument of \cs{cs}. For +% instance, |\cs{\meta{name}:\meta{signature}}| produces +% \cs{\meta{name}:\meta{signature}}. +% +% The \meta{options} are a key--value list which can contain the +% following keys: +% \begin{itemize} +% \item |index=|\meta{module}: the \meta{csname} will be indexed in +% the list of commands from the \meta{module}; the \meta{module} +% can in particular be |TeX| for \enquote{\TeX{} and \LaTeXe{}} +% commands, or empty for commands which should be placed in the +% main index. By default, the \meta{module} is deduced +% automatically from the command name. +% \item |replace| is a boolean key (\texttt{true} by default) which +% indicates whether to replace |@@| as \pkg{l3docstrip} does. +% \end{itemize} +% \end{function} +% +% \begin{function}{\tn} +% \begin{syntax} +% \cs{tn} \oarg{options} \marg{csname} +% \end{syntax} +% Analoguous to \cs{cs} but intended for \enquote{traditional} \TeX{} +% or \LaTeXe{} commands; they will be indexed accordingly. This is in +% fact equivalent to \cs{cs} |[index=TeX, replace=false,| +% \meta{options}|]| \Arg{csname}. +% \end{function} % -% Use "\begin{documentation}...\end{documentation}" around the documentation, -% and "\begin{implementation}...\end{implementation}" around the implementation. -% The "\EnableDocumentation"/"\EnableImplementation" will cause them to be typeset -% when the DTX file is "\DocInput"; use "\DisableDocumentation"/"\DisableImplementation" -% to omit the contents of those environments. +% \begin{function}{\meta} +% \begin{syntax} +% \cs{meta} \Arg{name} +% \end{syntax} +% \cs{meta} typesets the \meta{name} italicised in \meta{angle +% brackets}. Within a \env{function} environment or similar, angle +% brackets |<...>| are set up to be a shorthand for |\meta{...}|. +% +% This function has additional functionality over its \pkg{ltxdoc} +% versions; underscores can be used to subscript material as in math +% mode. For example, |\meta{arg_{xy}}| produces +% \enquote{\meta{arg_{xy}}}. +% \end{function} % -% Note that "\DocInput" now takes comma-separated arguments, and "\DocInputAgain" -% can be used to re-input all DTX files previously input in this way. +% \begin{function}{\Arg, \marg, \oarg, \parg} +% \begin{syntax} +% |\Arg| \Arg{name} +% \end{syntax} +% Typesets the \meta{name} as for \cs{meta} and wraps it in braces. +% +% The \cs{marg}/\cs{oarg}/\cs{parg} versions follow from \pkg{ltxdoc} +% in being used for \enquote{mandatory} or \enquote{optional} or +% \enquote{picture} brackets as per \LaTeXe{} syntax. +% \end{function} +% +% \begin{function}{\file, \env, \pkg, \cls} +% \begin{syntax} +% \cs{pkg} \Arg{name} +% \end{syntax} +% These all take one argument and are intended to be used as semantic +% commands for representing files, environments, package names, and +% class names, respectively. +% \end{function} % % \subsection{Describing functions in the documentation} % % \DescribeEnv{function} % \DescribeEnv{syntax} -% Two heavily-used environments are defined to describe the syntax -% of \textsf{expl3} functions and variables. +% Two heavily-used environments are defined to describe the syntax of +% \pkg{expl3} functions and variables. % \begin{framed} -% \vspace{-\baselineskip} +% \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}{ \function_one , \function_two: } +% \begin{function}{\function_one:, \function_two:} % \begin{syntax} -% "\foo_bar:" \Arg{meta} <test_1> +% |\foo_bar:| \Arg{meta} \meta{test_1} % \end{syntax} -% <description> +% \meta{description} % \end{function} % \end{verbatim} -% \hrulefill -% \par -% \hspace*{0.25\textwidth} -% \begin{minipage}{0.5\textwidth} -% \begin{function}{ \function_one: , \function_two: } -% \begin{syntax} -% "\foo_bar:" \Arg{meta} <test_1> -% \end{syntax} -% <description> -% \end{function} -% \end{minipage} +% \hrulefill +% \par +% \hspace*{0.25\textwidth} +% \begin{minipage}{0.5\textwidth} +% \begin{function}{\function_one:, \function_two:} +% \begin{syntax} +% |\foo_bar:| \Arg{meta} \meta{test_1} +% \end{syntax} +% \meta{description} +% \end{function} +% \end{minipage} % \end{framed} % -% Function environments take an optional argument to indicate whether the function(s) it -% describes are expandable or restricted-expandable or defined in conditional forms. Use "EXP", "rEXP", "TF", or "pTF" -% for this; note that "pTF" implies "EXP" since predicates must always be expandable. -% As an example: +% Function environments take an optional argument to indicate whether +% the function(s) it describes are expandable or restricted-expandable +% or defined in conditional forms. Use |EXP|, |rEXP|, |TF|, or |pTF| for +% this; note that |pTF| implies |EXP| since predicates must always be +% expandable. As an example: % \begin{framed} -% \vspace{-\baselineskip} +% \vspace{-\baselineskip} % \begin{verbatim} -% \begin{function}[pTF]{ \cs_if_exist:N } +% \begin{function}[pTF]{\cs_if_exist:N} % \begin{syntax} -% "\cs_if_exist_p:N" <cs> +% \cs{cs_if_exist_p:N} \meta{cs} % \end{syntax} -% <description> +% \meta{description} % \end{function} % \end{verbatim} -% \hrulefill -% \par -% \hspace*{0.25\textwidth} -% \begin{minipage}{0.5\textwidth} -% \begin{function}[pTF]{ \cs_if_exist:N } -% \begin{syntax} -% "\cs_if_exist_p:N" <cs> -% \end{syntax} -% <description> -% \end{function} -% \end{minipage} +% \hrulefill +% \par +% \hspace*{0.25\textwidth} +% \begin{minipage}{0.5\textwidth} +% \begin{function}[pTF]{\cs_if_exist:N} +% \begin{syntax} +% \cs{cs_if_exist_p:N} \meta{cs} +% \end{syntax} +% \meta{description} +% \end{function} +% \end{minipage} % \end{framed} % % \DescribeEnv{variable} -% If you are documenting a variable instead of a function, use the "variable" environment instead; it behaves identically to the "function" environment above. +% If you are documenting a variable instead of a function, use the +% \env{variable} environment instead; it behaves identically to the +% \env{function} environment above. +% +% \DescribeEnv{texnote} +% This environment is used to call out sections within \env{function} +% and similar that are only of interest to seasoned \TeX{} developers. % % \subsection{Describing functions in the implementation} % % \DescribeEnv{macro} -% The well-used environment from \LaTeXe\ for marking up the implementation -% of macros/functions remains the \env{macro} environment. -% Some changes in \pkg{l3doc}: it now accepts comma-separated lists -% of functions, to avoid a very large number of consecutive "\end{macro}" -% statements. +% The well-used environment from \LaTeXe{} for marking up the +% implementation of macros/functions remains the \env{macro} +% environment. Some changes in \pkg{l3doc}: it now accepts +% comma-separated lists of functions, to avoid a very large number of +% consecutive |\end{macro}| statements. % \begin{verbatim} -% % \begin{macro}{\foo:N,\foo:c} +% % \begin{macro}{\foo:N, \foo:c} % % \begin{macrocode} % ... code for \foo:N and \foo:c ... % % \end{macrocode} % % \end{macro} % \end{verbatim} -% If you are documenting an auxiliary macro, it's generally not necessary -% to highlight it as much and you also don't need to check it for, say, -% having a test function and having a documentation chunk earlier in a "function" -% environment. In this case, write "\begin{macro}[aux]" and it will be -% marked as such; its margin call-out will be printed in grey. +% If you are documenting an auxiliary macro, it's generally not +% necessary to highlight it as much and you also don't need to check it +% for, say, having a test function and having a documentation chunk +% earlier in a \env{function} environment. In this case, write +% |\begin{macro}[aux]| and it will be marked as such; its margin +% call-out will be printed in grey. % % Similarly, an internal package function still requires documentation -% but usually will not be documented for users to see; these can be marked -% as such with "\begin{macro}[internal]". +% but usually will not be documented for users to see; these can be +% marked as such with |\begin{macro}[int]|. % % For documenting \pkg{expl3}-type conditionals, you may also pass this -% environment a "TF" option (and omit it from the function name) to denote that -% the function is provided with "T", "F", and "TF" suffixes. -% A similar "pTF" option will print both "TF" and "_p" predicate forms. +% environment a |TF| option (and omit it from the function name) to +% denote that the function is provided with |T|, |F|, and |TF| suffixes. +% A similar |pTF| option will print both |TF| and |_p| predicate forms. % % % \DescribeMacro{\TestFiles} -% \cs{TestFiles}\marg{list of files} is used to indicate which test files -% are used for the current code; they will be printed in the documentation. +% \cs{TestFiles}\marg{list of files} is used to indicate which test +% files are used for the current code; they will be printed in the +% documentation. % % \DescribeMacro{\UnitTested} -% Within a "macro" environment, it is a good idea to mark whether a unit test has -% been created for the commands it defines. This is indicated by writing \cs{UnitTested} -% anywhere within "\begin{macro}" \dots "\end{macro}". -% -% If the class option "checktest" is enabled, then it is an \emph{error} to have a -% "macro" environment without a \cs{testfile} file. This is intended for large packages such -% as \pkg{expl3} that should have absolutely comprehensive tests suites and whose authors -% may not always be as sharp at adding new tests with new code as they should be. +% Within a \env{macro} environment, it is a good idea to mark whether a +% unit test has been created for the commands it defines. This is +% indicated by writing \cs{UnitTested} anywhere within |\begin{macro}| +% \dots |\end{macro}|. +% +% If the class option |checktest| is enabled, then it is an \emph{error} +% to have a \env{macro} environment without a call to +% \file{Testfiles}. This is intended for large packages such as +% \pkg{expl3} that should have absolutely comprehensive tests suites and +% whose authors may not always be as sharp at adding new tests with new +% code as they should be. % % \DescribeMacro{\TestMissing} -% If a function is missing a test, this may be flagged by writing (as many times as needed) -% \cs{TestMissing}\marg{explanation of test required}. -% These missing tests will be summarised in the listing printed at the end of the -% compilation run. +% If a function is missing a test, this may be flagged by writing (as +% many times as needed) \cs{TestMissing} \marg{explanation of test +% required}. These missing tests will be summarised in the listing +% printed at the end of the compilation run. % % \DescribeEnv{variable} -% When documenting variable definitions, use the "variable" environment instead. -% It will, here, behave identically to the "macro" environment, except that if the class -% option "checktest" is enabled, variables will not be required to have a test file. +% When documenting variable definitions, use the \env{variable} +% environment instead. It will, here, behave identically to the +% \env{macro} environment, except that if the class option |checktest| +% is enabled, variables will not be required to have a test file. % % \DescribeEnv{arguments} -% Within a \env{macro} environment, you may use the \env{arguments} environment -% to describe the arguments taken by the function(s). It behaves -% like a modified enumerate environment. +% Within a \env{macro} environment, you may use the \env{arguments} +% environment to describe the arguments taken by the function(s). It +% behaves like a modified enumerate environment. % \begin{verbatim} -% % \begin{macro}{\foo:nn,\foo:VV} +% % \begin{macro}{\foo:nn, \foo:VV} % % \begin{arguments} % % \item Name of froozle to be frazzled % % \item Name of muble to be jubled @@ -402,14 +499,14 @@ Do not distribute a modified version of this file. % % \subsection{Keeping things consistent} % -% Whenever a function is either documented or defined with \env{function} -% and \env{macro} respectively, its name is stored in a sequence for later -% processing. +% Whenever a function is either documented or defined with +% \env{function} and \env{macro} respectively, its name is stored in a +% sequence for later processing. % -% At the end of the document (i.e., after the \textsc{dtx} file has finished -% processing), the list of names is analysed to check whether all defined -% functions have been documented and vice versa. The results are printed -% in the console output. +% At the end of the document (\emph{i.e.}, after the \file{.dtx} file +% has finished processing), the list of names is analysed to check +% whether all defined functions have been documented and vice versa. The +% results are printed in the console output. % % If you need to do more serious work with these lists of names, take a % look at the implementation for the data structures and methods used to @@ -417,40 +514,40 @@ Do not distribute a modified version of this file. % % \subsection{Documenting templates} % -% The following macros are provided for documenting templates; might -% end up being something completely different but who knows. +% The following macros are provided for documenting templates; might end +% up being something completely different but who knows. % \begin{quote}\parskip=0pt\obeylines -% "\begin{TemplateInterfaceDescription}" \Arg{template type name} -% " \TemplateArgument{none}{---}" -% \textsc{or one or more of these:} -% " \TemplateArgument" \Arg{arg no} \Arg{meaning} -% \textsc{and} -% "\TemplateSemantics" -% " " \meta{text describing the template type semantics} -% "\end{TemplateInterfaceDescription}" +% |\begin{TemplateInterfaceDescription}| \Arg{template type name} +% | \TemplateArgument{none}{---}| +% \textsc{or one or more of these:} +% | \TemplateArgument| \Arg{arg no} \Arg{meaning} +% \textsc{and} +% |\TemplateSemantics| +% | | \meta{text describing the template type semantics} +% |\end{TemplateInterfaceDescription}| % \end{quote} % % \begin{quote}\parskip=0pt\obeylines -% "\begin{TemplateDescription}" \Arg{template type name} \Arg{name} -% \textsc{one or more of these:} -% " \TemplateKey" \marg{key name} \marg{type of key} -% " "\marg{textual description of meaning} -% " "\marg{default value if any} -% \textsc{and} -% "\TemplateSemantics" -% " " \meta{text describing special additional semantics of the template} -% "\end{TemplateDescription}" +% |\begin{TemplateDescription}| \Arg{template type name} \Arg{name} +% \textsc{one or more of these:} +% | \TemplateKey| \marg{key name} \marg{type of key} +% | |\marg{textual description of meaning} +% | |\marg{default value if any} +% \textsc{and} +% |\TemplateSemantics| +% | | \meta{text describing special additional semantics of the template} +% |\end{TemplateDescription}| % \end{quote} % % \begin{quote}\parskip=0pt\obeylines -% "\begin{InstanceDescription}" \oarg{text to specify key column width (optional)} -% \hfill\marg{template type name}\marg{instance name}\marg{template name} -% \textsc{one or more of these:} -% " \InstanceKey" \marg{key name} \marg{value} -% \textsc{and} -% "\InstanceSemantics" -% " " \meta{text describing the result of this instance} -% "\end{InstanceDescription}" +% |\begin{InstanceDescription}| \oarg{text to specify key column width (optional)} +% \hfill\marg{template type name}\marg{instance name}\marg{template name} +% \textsc{one or more of these:} +% | \InstanceKey| \marg{key name} \marg{value} +% \textsc{and} +% |\InstanceSemantics| +% | | \meta{text describing the result of this instance} +% |\end{InstanceDescription}| % \end{quote} % % \end{documentation} @@ -467,113 +564,523 @@ Do not distribute a modified version of this file. %<@@=codedoc> % \end{macrocode} % +% \subsection{Variants and helpers} +% +% \begin{macro} +% { +% \tl_count:f, +% \tl_greplace_all:Nxn, +% \tl_if_head_eq_charcode:oNTF, +% \tl_if_head_eq_charcode:oNT, +% \tl_if_head_eq_charcode:oNF, +% \tl_if_in:NoTF, +% \tl_if_in:NoT, +% \tl_if_in:NoF, +% \tl_remove_all:Nx, +% \tl_replace_all:Nxn, +% \tl_replace_all:Nnx, +% \tl_replace_all:Non, +% \tl_replace_all:Nno, +% \tl_replace_once:Noo, +% \prop_get:NxNTF, +% \prop_put:Nxn, +% \prop_gput:NVx, +% } +% A few missing variants. +% \begin{macrocode} +\cs_generate_variant:Nn \tl_count:n { f } +\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { o } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF { o } +\cs_generate_variant:Nn \tl_if_in:NnTF { No } +\cs_generate_variant:Nn \tl_if_in:NnT { No } +\cs_generate_variant:Nn \tl_if_in:NnF { No } +\cs_generate_variant:Nn \tl_remove_all:Nn { Nx } +\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx , Nnx, No , Nno } +\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo } +\cs_generate_variant:Nn \prop_get:NnNTF { Nx } +\cs_generate_variant:Nn \prop_put:Nnn { Nx } +\cs_generate_variant:Nn \prop_gput:Nnn { NVx } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\@@_replace_at_at:N} +% \begin{macro}[aux]{\@@_replace_at_at_aux:Nn} +% If there is no \meta{module~name}, do nothing. Otherwise replace +% all other-|@| by letter-|@| and all other-|_| by letter-|_|, then +% replace |_@@| by |__|\meta{module~name} and |@@| by +% |__|\meta{module~name} too. The result contains |_| with category +% code letter because this is what the |macrocode| environment +% expects. Other use cases can apply \cs{tl_to_str:n} if needed. +% Note that we include spaces between the +% |@| in the code below, since it is also processed through the same +% replacement rules. +% \begin{macrocode} +\cs_new_protected:Npn \@@_replace_at_at:N #1 + { + \tl_if_empty:NF \g_@@_module_name_tl + { + \exp_args:NNo \@@_replace_at_at_aux:Nn + #1 \g_@@_module_name_tl + } + } +\cs_new_protected:Npn \@@_replace_at_at_aux:Nn #1#2 + { + \tl_replace_all:Non #1 { \token_to_str:N @ } { @ } + \tl_replace_all:Non #1 { \token_to_str:N _ } { _ } + \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 } + \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[aux]{\@@_verb_get_seq:nN} +% The argument~|#1| is given with catcodes $10$ (space), $12$ (other) +% and $13$ (active). Turn active characters to other. Remove any +% \enquote{\%} character at the beginning of a line. Remove tabs and +% newlines. Finally, convert |_@@| and |@@| to |__|\meta{module name} +% (if it is non-empty). At this point, \cs{l_@@_tmpa_tl} contains a +% comma-delimited list of names, where |@| and~|_| have category code +% letter. Turn it to a string, parse it as a comma-delimited list, +% and turn the result into a sequence of function/macro names. +% \begin{macrocode} +\cs_new_protected:Npn \@@_verb_get_seq:nN #1#2 + { + \tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:n {#1} } + \tl_remove_all:Nx \l_@@_tmpa_tl + { \iow_char:N \^^M \iow_char:N \% } + \tl_remove_all:Nx \l_@@_tmpa_tl { \tl_to_str:n { ^ ^ A } } + \tl_remove_all:Nx \l_@@_tmpa_tl { \iow_char:N \^^I } + \tl_remove_all:Nx \l_@@_tmpa_tl { \iow_char:N \^^M } + \@@_replace_at_at:N \l_@@_tmpa_tl + \exp_args:NNx \seq_set_from_clist:Nn #2 + { \tl_to_str:N \l_@@_tmpa_tl } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux,rEXP] +% {\@@_signature_base_form:n, \@@_signature_base_form_aux:n} +% Expands to the \enquote{base form} of the signature. For instance, +% given |noxcfvV| it would obtain |nnnNnnn|, or given |ow| it would +% obtain |nw|. The loop stops at the first token that is not +% recognized. +% \begin{macrocode} +\cs_new:Npn \@@_signature_base_form:n #1 + { \@@_signature_base_form_aux:n #1 \c_empty_tl } +\cs_new:Npn \@@_signature_base_form_aux:n #1 + { + \str_case:nnTF {#1} + { + { N } { N } + { c } { N } + { n } { n } + { o } { n } + { f } { n } + { x } { n } + { V } { n } + { v } { n } + } + { \@@_signature_base_form_aux:n } + {#1} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux]{\@@_predicate_from_base:N} +% Get predicate from a function's base name. This \enquote{works} for +% functions with no signature too. +% \begin{macrocode} +\cs_new:Npn \@@_predicate_from_base:N #1 + { + \__cs_get_function_name:N #1 _p: + \__cs_get_function_signature:N #1 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\CodedocUseCs} +% To implement commands which can be used in bookmarks and moving +% arguments, it appears necessary to have an analogue of \cs{use:c} +% using only user-level category codes, or to make all auxiliaries +% user-level. +% \begin{macrocode} +\cs_new_protected:Npn \CodedocUseCs #1 { \use:c { \tl_to_str:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[int]{\CodedocUnexpandedTokens} +% \begin{macro}[aux]{\CodedocUnexpandedTokens } +% \begin{macro}[aux]{\@@_exp_not:n} +% Function used as \cs{CodedocUnexpandedTokens} \meta{junk} +% \Arg{argument}. The braces are necessary, and \meta{junk}, ignored, +% must not contain braces. When used in a typesetting context, the +% function calls an auxiliary (whose name has a trailing space) which +% leaves the \meta{argument} in the input stream. When used in an +% \texttt{x}-expansion context instead, the auxiliary does not expand, +% and \cs{@@_exp_not:n} \Arg{argument} expands to itself. If this is +% written into a file and read back, the result has the original form +% \cs{CodedocUnexpandedTokens} \meta{junk} \Arg{argument}. +% \begin{macrocode} +\cs_new:Npn \CodedocUnexpandedTokens #1 # + { \use:c { CodedocUnexpandedTokens ~ } \@@_exp_not:n } +\cs_new_protected:cpn { CodedocUnexpandedTokens ~ } #1#2 {#2} +\cs_new:Npn \@@_exp_not:n #1 { \exp_not:n { \@@_exp_not:n {#1} } } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% % \subsection{Variables} % +% \begin{variable}{\g_docinput_clist} +% The list of files which have been input through \cs{DocInput}. +% \begin{macrocode} +\clist_new:N \g_docinput_clist +% \end{macrocode} +% \end{variable} +% +% \begin{variable}{\g_doc_functions_seq, \g_doc_macros_seq} +% All functions documented through \env{function}, and all macros +% introduced through \env{macro}. They can be compared to see what +% documentation or code is missing. +% \begin{macrocode} +\seq_new:N \g_doc_functions_seq +\seq_new:N \g_doc_macros_seq +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_output_coffin} +% The \env{function} environment is typeset by combining coffins +% containing various pieces (function names, description, \emph{etc.}) +% into this coffin. +% \begin{macrocode} +\coffin_new:N \l_@@_output_coffin +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int] +% {\l_@@_names_coffin, \l_@@_descr_coffin, \l_@@_syntax_coffin} +% These coffins contain respectively the list of function names +% (argument of the \env{function} environment), the text between +% |\begin{function}| and |\end{function}|, and the syntax given in the +% \env{syntax} environment. % \begin{macrocode} -\coffin_new:N \l_@@_output_box \coffin_new:N \l_@@_names_coffin \coffin_new:N \l_@@_descr_coffin \coffin_new:N \l_@@_syntax_coffin +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\g_@@_syntax_box} +% The contents of the \env{syntax} environment are typeset in this box +% before being transferred to \cs{l_@@_syntax_coffin}. +% \begin{macrocode} \box_new:N \g_@@_syntax_box +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int]{\l_@@_long_name_bool, \l_@@_trial_width_dim} +% The boolean \cs{l_@@_long_name_bool} is \texttt{true} if the width +% \cs{l_@@_trial_width_dim} of the coffin \cs{l_@@_names_coffin} +% (containing the current function names) is bigger than the space +% available in the margin. +% \begin{macrocode} \bool_new:N \l_@@_long_name_bool -\bool_new:N \g_@@_implementation_bool \dim_new:N \l_@@_trial_width_dim -\tl_new:N \l_@@_macro_tl -\int_new:N \l_@@_macro_int -\int_new:N \g_@@_nested_macro_int -%\int_new:N \c@CodelineNo -\prop_new:N \g_@@_missing_tests_prop -\clist_new:N \g_docinput_clist -\tl_new:N \l_@@_at_replaced_macro_tl % \end{macrocode} +% \end{variable} % +% \begin{variable}[int]{\l_@@_nested_macro_int} +% The nesting of \env{macro} environments (this is now~$0$ outside a +% \env{macro} environment). % \begin{macrocode} -\seq_new:N \g_@@_testfiles_seq -\seq_new:N \g_doc_functions_seq -\seq_new:N \g_doc_macros_seq +\int_new:N \l_@@_nested_macro_int +% \end{macrocode} +% \end{variable} +% +% \begin{variable}[int] +% { +% \l_@@_macro_tested_bool, +% \g_@@_missing_tests_prop, +% \g_@@_not_tested_seq, +% \g_@@_testfiles_seq, +% } +% A boolean describing whether the current macro has tests, and some +% global structures which contain information about test files and +% which tests are missing. +% \begin{macrocode} +\bool_new:N \l_@@_macro_tested_bool +\prop_new:N \g_@@_missing_tests_prop \seq_new:N \g_@@_not_tested_seq +\seq_new:N \g_@@_testfiles_seq % \end{macrocode} +% \end{variable} % -% For function/macro environments: +% \begin{variable}[aux] +% { +% \l_@@_macro_internal_bool, +% \l_@@_macro_aux_bool, +% \l_@@_macro_TF_bool, +% \l_@@_macro_pTF_bool, +% \l_@@_macro_EXP_bool, +% \l_@@_macro_rEXP_bool, +% \l_@@_macro_var_bool, +% } +% Contain information about some options of function/macro +% environments: % \begin{macrocode} -\bool_new:N \l_@@_meta_TF_bool -\bool_new:N \l_@@_meta_pTF_bool -\bool_new:N \l_@@_meta_EXP_bool -\bool_new:N \l_@@_meta_rEXP_bool \bool_new:N \l_@@_macro_internal_bool \bool_new:N \l_@@_macro_aux_bool \bool_new:N \l_@@_macro_TF_bool \bool_new:N \l_@@_macro_pTF_bool +\bool_new:N \l_@@_macro_EXP_bool +\bool_new:N \l_@@_macro_rEXP_bool \bool_new:N \l_@@_macro_var_bool % \end{macrocode} +% \end{variable} % -% For package options: +% \begin{variable}[aux] +% { +% \g_@@_lmodern_bool, +% \g_@@_checkfunc_bool, +% \g_@@_checktest_bool, +% } +% Information about package options. % \begin{macrocode} -\bool_new:N \g_@@_full_bool \bool_new:N \g_@@_lmodern_bool \bool_new:N \g_@@_checkfunc_bool \bool_new:N \g_@@_checktest_bool % \end{macrocode} +% \end{variable} % -% Temporaries: +% \begin{variable}[int]{\l_@@_tmpa_tl, \l_@@_tmpb_tl, \l_@@_tmpa_int} +% Some temporary variables. % \begin{macrocode} -\seq_new:N \g_@@_tmpa_seq \tl_new:N \l_@@_tmpa_tl \tl_new:N \l_@@_tmpb_tl \int_new:N \l_@@_tmpa_int % \end{macrocode} +% \end{variable} % -% Other: +% \begin{variable}[int]{\l_@@_functions_block_prop} +% Contains information about the functions to typeset and their +% variants. % \begin{macrocode} -\bool_new:N \l_@@_tested_bool +\prop_new:N \l_@@_functions_block_prop % \end{macrocode} +% \end{variable} % +% \begin{variable}[int]{\l_@@_function_input_seq, \l_@@_macro_input_seq} +% Both the \env{function} and the \env{macro} environments read their +% argument verbatim, then remove percent signs (at the beginning of +% lines), tabs and new lines, convert |_@@| and |@@| by +% |__|\meta{module name} if appropriate, and interpret the result as a +% comma list, which they store in these two sequences. +% \begin{macrocode} +\seq_new:N \l_@@_function_input_seq +\seq_new:N \l_@@_macro_input_seq +% \end{macrocode} +% \end{variable} % +% \begin{variable}[int]{\c_@@_backslash_tl, \c_@@_backslash_token} +% A single backslash, as a token list, or as an implicit character +% token. +% \begin{macrocode} +\tl_const:Nx \c_@@_backslash_tl { \iow_char:N \\ } +\exp_last_unbraced:NNo + \cs_new_eq:NN \c_@@_backslash_token { \c_@@_backslash_tl } +% \end{macrocode} +% \end{variable} % -% \subsection{Options and configuration} +% \begin{variable}[int]{\g_@@_function_name_prefix_tl} +% The \enquote{prefix} of the current function is a backslash if the +% function starts with it, and otherwise is empty. +% \begin{macrocode} +\tl_new:N \g_@@_function_name_prefix_tl +% \end{macrocode} +% \end{variable} +% +% \begin{variable} +% {\l_@@_index_macro_tl, \l_@@_index_key_tl, \l_@@_index_module_tl} +% When analyzing a control sequence found within a \env{macrocode} +% environment, \cs{l_@@_index_macro_tl} holds the control sequence +% (partially a string), \cs{l_@@_index_key_tl} holds what will be used +% as a sort key in the index, and \cs{l_@@_index_module_tl} is the +% subindex in which the control sequence will be listed. +% \begin{macrocode} +\tl_new:N \l_@@_index_macro_tl +\tl_new:N \l_@@_index_key_tl +\tl_new:N \l_@@_index_module_tl +% \end{macrocode} +% \end{variable} % +% \begin{variable}{\g_@@_module_name_tl} +% The module name, set when reading a line |<@@=|\meta{module}|>|. % \begin{macrocode} -\DeclareOption{a5paper}{\@latexerr{Option not supported}{}} +\tl_new:N \g_@@_module_name_tl % \end{macrocode} +% \end{variable} % +% \begin{variable}{\c_@@_iow_rule_tl, \c_@@_iow_midrule_tl} +% $40$~equal signs. +% \begin{macrocode} +\tl_const:Nn \c_@@_iow_rule_tl + { ======================================== } +\tl_const:Nn \c_@@_iow_mid_rule_tl + { -------------------------------------- } +% \end{macrocode} +% \end{variable} % +% \begin{variable} +% {\l_@@_macro_box, \l_@@_macro_index_box, \l_@@_macro_int} +% A vertical box in which the names given to the macro environment are +% typeset, a horizontal box in which we store the targets created by +% indexing commands, and the number of macros so far (including those +% from surrounding \env{macro} environments). % \begin{macrocode} -\DeclareOption{full}{ \bool_set_true:N \g_@@_full_bool } -\DeclareOption{onlydoc}{ \bool_set_false:N \g_@@_full_bool } +\box_new:N \l_@@_macro_index_box +\box_new:N \l_@@_macro_box +\int_new:N \l_@@_macro_int % \end{macrocode} +% \end{variable} % +% \begin{variable}[int] +% { +% \l_@@_cmd_tl, +% \l_@@_cmd_index_tl, +% \l_@@_cmd_replace_bool, +% } +% Variables used to control the behaviour of \cs{cmd}, \cs{cs} and +% \cs{tn}. % \begin{macrocode} -\DeclareOption{check}{ \bool_set_true:N \g_@@_checkfunc_bool } -\DeclareOption{nocheck}{ \bool_set_false:N \g_@@_checkfunc_bool } +\tl_new:N \l_@@_cmd_tl +\tl_new:N \l_@@_cmd_index_tl +\bool_new:N \l_@@_cmd_replace_bool % \end{macrocode} +% \end{variable} % +% \begin{variable}{\l_@@_in_implementation_bool} +% This boolean is \texttt{true} within the \env{implementation} +% environment, and \texttt{false} anywhere else. % \begin{macrocode} -\DeclareOption{checktest}{ \bool_set_true:N \g_@@_checktest_bool } -\DeclareOption{nochecktest}{ \bool_set_false:N \g_@@_checktest_bool } +\bool_new:N \l_@@_in_implementation_bool % \end{macrocode} +% \end{variable} % +% \begin{variable} +% { +% \g_@@_typeset_documentation_bool, +% \g_@@_typeset_implementation_bool +% } +% These booleans control whether the documentation/implementation +% should be typeset. By default both should be. % \begin{macrocode} -\DeclareOption{cm-default}{ \bool_set_false:N \g_@@_lmodern_bool } -\DeclareOption{lm-default}{ \bool_set_true:N \g_@@_lmodern_bool } +\bool_new:N \g_@@_typeset_documentation_bool +\bool_new:N \g_@@_typeset_implementation_bool +\bool_set_true:N \g_@@_typeset_documentation_bool +\bool_set_true:N \g_@@_typeset_implementation_bool % \end{macrocode} +% \end{variable} % +% \begin{variable}{\g_@@_base_name_tl, \l_@@_variants_prop} +% The name of the macro which is being documented (without its +% signature), and a property list mapping base forms of variants to +% all variants which have the same base form. % \begin{macrocode} -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ExecuteOptions{full,a4paper,nocheck,nochecktest,lm-default} +\tl_new:N \g_@@_base_name_tl +\prop_new:N \l_@@_variants_prop % \end{macrocode} +% \end{variable} % -% Input a local configuration file, if it exists, with a message to the console that this has happened. Since we distribute a cfg file with the class, this should usually always be true. Therefore, check for \cs{ExplMakeTitle} (defined in `our' cfg file) and only output the informational message if it's not found. +% \begin{variable}[int]{\l_@@_no_label_bool} +% This boolean prevents the insertions of \tn{label}s in a +% \env{function} environment. This is only useful when a function's +% documentation appears multiple times, for instance in +% \file{source3body.tex} some examples repeat the documentation from +% actual functions. +% \begin{macrocode} +\bool_new:N \l_@@_no_label_bool +% \end{macrocode} +% \end{variable} % +% \begin{macro}[aux]{\@@_tmpa:w, \@@_tmpb:w} +% Auxiliary macros for temporary use. % \begin{macrocode} -\msg_new:nnn {l3doc} {input-cfg} - { - Local~config~file~l3doc.cfg~loaded. - } -\file_if_exist:nT {l3doc.cfg} - { - \file_input:n {l3doc.cfg} - \msg_info:nn {l3doc} {input-cfg} - } +\cs_new_eq:NN \@@_tmpa:w ? +\cs_new_eq:NN \@@_tmpb:w ? +% \end{macrocode} +% \end{macro} +% +% Bruno: can I delete this next line? +% \begin{macrocode} +% \int_new:N \c@CodelineNo +% \end{macrocode} +% +% \subsection{Options and configuration} +% +% \begin{macrocode} +\DeclareOption { a5paper } { \@latexerr { Option~not~supported } { } } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption { full } + { + \bool_gset_true:N \g_@@_typeset_documentation_bool + \bool_gset_true:N \g_@@_typeset_implementation_bool + } +\DeclareOption { onlydoc } + { + \bool_gset_true:N \g_@@_typeset_documentation_bool + \bool_gset_false:N \g_@@_typeset_implementation_bool + } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption { check } + { \bool_gset_true:N \g_@@_checkfunc_bool } +\DeclareOption { nocheck } + { \bool_gset_false:N \g_@@_checkfunc_bool } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption { checktest } + { \bool_gset_true:N \g_@@_checktest_bool } +\DeclareOption { nochecktest } + { \bool_gset_false:N \g_@@_checktest_bool } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption { cm-default } + { \bool_gset_false:N \g_@@_lmodern_bool } +\DeclareOption { lm-default } + { \bool_gset_true:N \g_@@_lmodern_bool } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption* { \PassOptionsToClass { \CurrentOption } { article } } +\ExecuteOptions { full, a4paper, nocheck, nochecktest, lm-default } +% \end{macrocode} +% +% Input a local configuration file, if it exists, with a message to the +% console that this has happened. Since we distribute a \file{.cfg} file +% with the class, this should usually always be true. Therefore, check +% for \cs{ExplMakeTitle} (defined in \enquote{our} \file{.cfg} file) and +% only output the informational message if it's not found. +% +% \begin{macrocode} +\msg_new:nnn { l3doc } { input-cfg } + { Local~config~file~l3doc.cfg~loaded. } +\file_if_exist:nT { l3doc.cfg } + { + \file_input:nT { l3doc.cfg } + { + \cs_if_exist:cF { ExplMakeTitle } + { \msg_info:nn { l3doc } { input-cfg } } + } + } % \end{macrocode} % % \begin{macrocode} @@ -609,29 +1116,19 @@ Do not distribute a modified version of this file. \raggedbottom % \end{macrocode} % -% -% I've never worked out why the verbatim environment adds extra space in dtx documents. -% Fix it with fancyvrb: -% \begin{macrocode} -\fvset{gobble=2} -\cs_set_eq:NN \verbatim \Verbatim -\cs_set_eq:NN \endverbatim \endVerbatim -% \end{macrocode} -% +% Depending on the option, load the package \pkg{lmodern} to set the +% font. Then replace the italic typewriter font with the oblique shape +% instead; the former makes my skin crawl. (Will, Aug 2011) % \begin{macrocode} \bool_if:NT \g_@@_lmodern_bool - { - \RequirePackage[T1]{fontenc} - \RequirePackage{lmodern} -% \end{macrocode} -% Now replace the italic typewriter font with the oblique shape instead; -% the former makes my skin crawl. (Will, Aug 2011) -% \begin{macrocode} - \group_begin: - \ttfamily - \DeclareFontShape{T1}{lmtt}{m}{it}{<->ec-lmtto10}{} - \group_end: - } + { + \RequirePackage[T1]{fontenc} + \RequirePackage{lmodern} + \group_begin: + \ttfamily + \DeclareFontShape{T1}{lmtt}{m}{it}{<->ec-lmtto10}{} + \group_end: + } % \end{macrocode} % % Must be last, as usual. @@ -639,91 +1136,128 @@ Do not distribute a modified version of this file. \RequirePackage{hypdoc} % \end{macrocode} % -% \subsection{Configuration} +% \subsection{Configuration and tweaks} % % \begin{macro}{\MakePrivateLetters} +% A few more letters are \enquote{private} in a \LaTeX3 programming +% environment. % \begin{macrocode} -\cs_set_nopar:Npn \MakePrivateLetters - { - \char_set_catcode_letter:N \@ - \char_set_catcode_letter:N \_ - \char_set_catcode_letter:N \: - } +\cs_gset_nopar:Npn \MakePrivateLetters + { + \char_set_catcode_letter:N \@ + \char_set_catcode_letter:N \_ + \char_set_catcode_letter:N \: + } % \end{macrocode} % \end{macro} % +% \begin{macro}{CodelineNo} +% Some configurations which have to do with line numbering. % \begin{macrocode} \setcounter{StandardModuleDepth}{1} \@addtoreset{CodelineNo}{part} \tl_replace_once:Nnn \theCodelineNo - { \HDorg@theCodelineNo } - { \textcolor[gray]{0.5} { \sffamily\tiny\arabic{CodelineNo} } } + { \HDorg@theCodelineNo } + { \textcolor[gray]{0.5} { \sffamily\tiny\arabic{CodelineNo} } } % \end{macrocode} +% \end{macro} % -% +% \begin{macro}{\verbatim, \endverbatim} +% In \file{.dtx} documents, the \env{verbatim} environment adds extra +% space because it only removes the first \enquote{\%} sign, and not +% the indentation (typically a space). Fix it with \pkg{fancyvrb}: +% \begin{macrocode} +\fvset{gobble=2} +\cs_gset_eq:NN \verbatim \Verbatim +\cs_gset_eq:NN \endverbatim \endVerbatim +% \end{macrocode} +% \end{macro} % % \subsection{Design} % % Increase the text width slightly so that width the standard fonts -% 72 columns of code may appear in a |macrocode| environment. -% Increase the marginpar width slightly, for long command names. -% And increase the left margin by a similar amount. +% 72~columns of code may appear in a \env{macrocode} environment. +% Increase the marginpar width slightly, for long command names. And +% increase the left margin by a similar amount. % \begin{macrocode} \setlength \textwidth { 385pt } \addtolength \marginparwidth { 30pt } \addtolength \oddsidemargin { 20pt } \addtolength \evensidemargin { 20pt } % \end{macrocode} -% (These were introduced when "article" was the documentclass, but -% I've left them here for now to remind me to do something about them -% later.) +% (These were introduced when \cls{article} was the documentclass, but +% I've left them here for now to remind me to do something about them +% later.) % -% Customise lists: +% \begin{macro}{\list} +% \begin{macro}[aux]{\@@_oldlist:nn} +% Customise lists. % \begin{macrocode} -\cs_set_eq:NN \@@_oldlist:nn \list -\cs_set_nopar:Npn \list #1 #2 { \@@_oldlist:nn {#1} { #2 \listparindent\z@ } } +\cs_new_eq:NN \@@_oldlist:nn \list +\cs_gset_nopar:Npn \list #1 #2 + { \@@_oldlist:nn {#1} { #2 \dim_zero:N \listparindent } } \setlength \parindent { 2em } \setlength \itemindent { 0pt } \setlength \parskip { 0pt plus 3pt minus 0pt } % \end{macrocode} +% \end{macro} +% \end{macro} % -% Customise TOC (as we have so many sections). Different design and/or -% structure is called for ): +% \begin{macro}{\partname} +% Use \enquote{File} as a name in Part titles. % \begin{macrocode} -\@addtoreset{section}{part} -\cs_set_nopar:Npn \l@section #1#2 - { - \ifnum \c@tocdepth >\z@ - \addpenalty\@secpenalty - \addvspace{1.0em \@plus\p@} - \setlength\@tempdima{2.5em} % was 1.5em - \begingroup - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - \leavevmode \bfseries - \advance\leftskip\@tempdima - \hskip -\leftskip - #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par - \endgroup - \fi - } -\cs_set_nopar:Npn\l@subsection{\@dottedtocline{2}{2.5em}{2.3em}} % #2 = 1.5em +\tl_gset:Nn \partname {File} % \end{macrocode} +% \end{macro} % +% \begin{macro}{\l@section, \l@subsection} +% Customise the table of contents (as we have so many sections). +% Different design and/or structure is called for). +% \begin{macrocode} +\@addtoreset{section}{part} +\cs_gset_nopar:Npn \l@section #1#2 + { + \ifnum \c@tocdepth >\z@ + \addpenalty\@secpenalty + \addvspace{1.0em \@plus\p@} + \setlength\@tempdima{2.5em} % was 1.5em + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par + \endgroup + \fi + } +\cs_gset_nopar:Npn \l@subsection + { \@dottedtocline{2}{2.5em}{2.3em} } % #2 = 1.5em +% \end{macrocode} +% \end{macro} % % \subsection{Text markup} % -% Make "|" and |"| be `short verb' characters, but not in -% the document preamble, where an active character may interfere -% with packages that are loaded. +% Make "|" and |"| be \enquote{short verb} characters, but not in the +% document preamble, where an active character may interfere with +% packages that are loaded. Remove these short-hands at the end of the +% document before reading the \file{.aux} file, as they may appear in +% labels (for instance, \pkg{l3fp} documents an operation "||"). % \begin{macrocode} \AtBeginDocument - { - \MakeShortVerb \" - \MakeShortVerb \| - } + { + \MakeShortVerb \" + \MakeShortVerb \| + } +\AtEndDocument + { + \DeleteShortVerb \" + \DeleteShortVerb \| + } % \end{macrocode} % +% \begin{macro}{\eTeX, \IniTeX, \Lua, \LuaTeX, \pdfTeX, \XeTeX} +% Some commands for logos. % \begin{macrocode} \providecommand*\eTeX{\hologo{eTeX}} \providecommand*\IniTeX{\hologo{iniTeX}} @@ -732,1180 +1266,1379 @@ Do not distribute a modified version of this file. \providecommand*\pdfTeX{\hologo{pdfTeX}} \providecommand*\XeTeX{\hologo{XeTeX}} % \end{macrocode} +% \end{macro} % -% \begin{macro}{\cmd,\cs} -% |\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving -% arguments. |\cs{foo}| also prints |\foo|, for those who prefer that -% syntax. There is a bit of shuffling around to make sure that |_| -% has the catcode that \cs{doc_replace_at_at:N} expects, without -% rescanning the whole argument. For that we store in -% \cs{l_@@_tmpb_tl} a single underscore with the current catcode, -% then replace all such underscores by letter underscores in |#1| -% (stored in the |tmpa| token list). After calling -% \cs{doc_replace_at_at:N}, we replace the underscores back to their -% old meaning before using the token list. -% \begin{macrocode} -\DeclareDocumentCommand \cmd {m} { \@@_cmd:n { #1 } } -\DeclareDocumentCommand \cs {m} { \@@_cs:n { #1 } } -% \end{macrocode} -% -% This is |\cmd{\foo}| and |\cs{foo}|: \cmd\foo\ and \cs{foo}. -% \begin{macrocode} -\cs_new:Npn \@@_cmd:n #1 { \cs{ \expandafter \@@_cmd_to_cs:w \string#1 } } -\cs_set_nopar:Npn \@@_cmd_to_cs:w #1#2 { \char\number`#2\relax } +% \begin{macro}{\cmd, \cs, \tn} +% To work within bookmarks, these commands must be expandable. They +% rely on a common auxiliary \cs{@@_cmd:nn} which receives as +% arguments the options and some tokens whose string representation +% starts with a backslash (to support cases such as |\cs{pkg_\ldots}|, +% we do not turn the whole argument into a string). +% \begin{macrocode} +\DeclareExpandableDocumentCommand \cmd { O{} m } + { \@@_cmd:no {#1} { \token_to_str:N #2 } } +\DeclareExpandableDocumentCommand \cs { O{} m } + { \@@_cmd:no {#1} { \c_@@_backslash_tl #2 } } +\DeclareExpandableDocumentCommand \tn { O{} m } + { + \@@_cmd:no + { index = TeX , replace = false , #1 } + { \c_@@_backslash_tl #2 } + } % \end{macrocode} +% \end{macro} % +% \begin{macro}{\meta} +% To work within a bookmark, this command must be expandable. % \begin{macrocode} -\cs_new:Npn \@@_cs:n #1 - { - \tl_set_rescan:Nnn \l_@@_tmpb_tl { } { _ } - \tl_set:Nn \l_@@_tmpa_tl {#1} - \tl_replace_all:NVn \l_@@_tmpa_tl \l_@@_tmpb_tl { _ } - \@@_replace_at_at:N \l_@@_tmpa_tl - \tl_replace_all:NnV \l_@@_tmpa_tl { _ } \l_@@_tmpb_tl - \texttt { \char`\\ \tl_use:N \l_@@_tmpa_tl} - } -\cs_generate_variant:Nn \tl_replace_all:Nnn { NV , NnV } +\DeclareExpandableDocumentCommand { \meta } { m } + { \@@_meta:n {#1} } % \end{macrocode} % \end{macro} % -% \begin{macro}{\marg,\oarg,\parg} -% |\marg{text}| prints \marg{text}, `mandatory argument'.\\ -% |\oarg{text}| prints \oarg{text}, `optional argument'.\\ -% |\parg{te,xt}| prints \parg{te,xt}, `picture mode argument'. +% \begin{macro}{\Arg, \marg, \oarg, \parg} +% |\marg{text}| prints \marg{text}, \enquote{mandatory argument}.\\ +% |\oarg{text}| prints \oarg{text}, \enquote{optional argument}.\\ +% |\parg{te,xt}| prints \parg{te,xt}, \enquote{picture mode argument}. +% Finally, \cs{Arg} is the same as \cs{marg}. % \begin{macrocode} -\providecommand\marg[1]{ \texttt{\char`\{} \meta{#1} \texttt{\char`\}} } +\newcommand\Arg[1] + { \texttt{\char`\{} \meta{#1} \texttt{\char`\}} } +\providecommand\marg[1]{ \Arg{#1} } \providecommand\oarg[1]{ \texttt[ \meta{#1} \texttt] } \providecommand\parg[1]{ \texttt( \meta{#1} \texttt) } % \end{macrocode} % \end{macro} % -% \begin{macro}{\file,\env,\pkg,\cls} -% This list may change\dots this is just my preference for markup. +% \begin{macro}{\file, \env, \pkg, \cls} +% This list may change\dots this is just my preference for markup. % \begin{macrocode} -\cs_set_eq:NN \file \nolinkurl +\DeclareRobustCommand \file {\nolinkurl} \DeclareRobustCommand \env {\texttt} \DeclareRobustCommand \pkg {\textsf} \DeclareRobustCommand \cls {\textsf} % \end{macrocode} % \end{macro} % -% \begin{environment}{texnote} +% \begin{macro}{\EnableDocumentation, \EnableImplementation} +% \begin{macro}{\DisableDocumentation, \DisableImplementation} +% Control whether to typeset the documentation/implementation or not. +% These simply set two switches. % \begin{macrocode} -\newenvironment{texnote} - { - \endgraf - \vspace{3mm} - \small\textbf{\TeX~hackers~note:} - } - { - \vspace{3mm} - } +\NewDocumentCommand \EnableDocumentation { } + { \bool_gset_true:N \g_@@_typeset_documentation_bool } +\NewDocumentCommand \EnableImplementation { } + { \bool_gset_true:N \g_@@_typeset_implementation_bool } +\NewDocumentCommand \DisableDocumentation { } + { \bool_gset_false:N \g_@@_typeset_documentation_bool } +\NewDocumentCommand \DisableImplementation { } + { \bool_gset_false:N \g_@@_typeset_implementation_bool } % \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{environment}{documentation} +% \begin{environment}{implementation} +% If the documentation/implementation should be typeset, then simply +% set the boolean \cs{l_@@_in_implementation_bool} which indicates +% whether we are within the implementation section. Otherwise use +% \cs{comment} (and a paired \cs{endcomment}). +% \begin{macrocode} +\NewDocumentEnvironment { documentation } { } + { + \bool_if:NTF \g_@@_typeset_documentation_bool + { \bool_set_false:N \l_@@_in_implementation_bool } + { \comment } + } + { \bool_if:NF \g_@@_typeset_documentation_bool { \endcomment } } +\NewDocumentEnvironment { implementation } { } + { + \bool_if:NTF \g_@@_typeset_implementation_bool + { \bool_set_true:N \l_@@_in_implementation_bool } + { \comment } + } + { \bool_if:NF \g_@@_typeset_implementation_bool { \endcomment } } +% \end{macrocode} +% \end{environment} % \end{environment} % -% \begin{macro}{\tn} -% As \cs{cs}. Use this to mark up all \TeX\ and \LaTeXe\ commands; they -% then end up together in the index. TODO: hyperlinks in the index entries. +% \begin{environment}{variable} +% The \env{variable} environment behaves as a \env{function} or +% \env{macro} environment depending on the part of the document. % \begin{macrocode} -\DeclareDocumentCommand \tn {m} - { - \texttt { \char`\\ #1 } - \index - { - TeX~and~LaTeX2e~commands\actualchar - \string\TeX{}~and~\string\LaTeXe{}~commands:\levelchar - #1\actualchar{\string\ttfamily\string\bslash{}#1} - } - } +\DeclareDocumentEnvironment { variable } { O{} +v } + { + \bool_if:NTF \l_@@_in_implementation_bool + { \@@_macro:nnw { var , #1 } {#2} } + { \@@_function:nnw {#1} {#2} } + } + { + \bool_if:NTF \l_@@_in_implementation_bool + { \@@_macro_end: } + { \@@_function_end: } + } % \end{macrocode} -% \end{macro} +% \end{environment} % -% \begin{environment}{documentation} -% \begin{environment}{implementation} -% \begin{macro}{\EnableDocumentation,\EnableImplementation} -% \begin{macro}{\DisableDocumentation,\DisableImplementation} -% \begin{macrocode} -\cs_new:Npn \@@_implementation: - { - \DeclareDocumentCommand {\variable} { O{} } { \@@_macro:n { var , ##1 } } - \cs_set_eq:NN \endvariable \endmacro - } -\cs_new:Npn \@@_docu: - { - \cs_set_eq:NN \variable \variabledoc - \cs_set_eq:NN \endvariable \endvariabledoc - } -\AtEndOfPackage{\@@_docu:} -\newenvironment{documentation}{\@@_docu:}{} -\newenvironment{implementation}{\@@_implementation:}{} -% \end{macrocode} -% -% \begin{macrocode} -\NewDocumentCommand \EnableDocumentation {} - { - \renewenvironment{documentation}{\@@_docu:}{} - } -\NewDocumentCommand \EnableImplementation {} - { - \renewenvironment{implementation}{\@@_implementation:}{} - } -\NewDocumentCommand \DisableDocumentation {} - { - \cs_set_eq:NN \documentation \comment - \cs_set_eq:NN \enddocumentation \endcomment - } -\NewDocumentCommand \DisableImplementation {} - { - \cs_set_eq:NN \implementation \comment - \cs_set_eq:NN \endimplementation \endcomment - } +% \begin{environment}{function} +% \begin{environment}{macro} +% Environment for documenting function(s), and environment for +% documenting the implementation of a macro. +% \begin{macrocode} +\DeclareDocumentEnvironment { function } { O{} +v } + { \@@_function:nnw {#1} {#2} } + { \@@_function_end: } +\DeclareDocumentEnvironment { macro } { O{} +v } + { \@@_macro:nnw {#1} {#2} } + { \@@_macro_end: } % \end{macrocode} -% \end{macro} -% \end{macro} % \end{environment} % \end{environment} % +% \begin{environment}{syntax} +% Syntax block placed next to the list of functions to illustrate +% their use. TODO: test that the \env{syntax} environment is only +% used inside the \env{function} environment, and that it only appears +% once. +% \begin{macrocode} +\NewDocumentEnvironment { syntax } { } + { \@@_syntax:w } + { + \@@_syntax_end: + \ignorespacesafterend + } +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{texnote} +% Used to describe information destined to \TeX{} experts only. +% \begin{macrocode} +\NewDocumentEnvironment { texnote } { } + { + \endgraf + \vspace{3mm} + \small\textbf{\TeX~hackers~note:} + } + { + \vspace{3mm} + } +% \end{macrocode} +% \end{environment} +% % \begin{environment}{arguments} -% This environment is designed to be used within a \env{macro} environment -% to describe the arguments of the macro/function. -% \begin{macrocode} -\newenvironment{arguments} - { - \enumerate[ - nolistsep, - label=\texttt{\#\arabic*}~:, - labelsep=*, - ] - } - { - \endenumerate - } +% This environment is designed to be used within a \env{macro} +% environment to describe the arguments of the macro/function. +% \begin{macrocode} +\NewDocumentEnvironment { arguments } { } + { + \enumerate [ + nolistsep , + label = \texttt{\#\arabic*} ~ : , + labelsep = * , + ] + } + { + \endenumerate + } % \end{macrocode} % \end{environment} % +% \subsubsection{Implementing text markup} +% +% Keys for \cs{cmd}, \cs{cs} and \cs{tn}. % \begin{macrocode} -\keys_define:nn { l3doc/function } - { - TF .code:n = - { - \bool_gset_true:N \l_@@_meta_TF_bool - } , - EXP .code:n = - { - \bool_gset_true:N \l_@@_meta_EXP_bool - \bool_gset_false:N \l_@@_meta_rEXP_bool - } , - rEXP .code:n = - { - \bool_gset_false:N \l_@@_meta_EXP_bool - \bool_gset_true:N \l_@@_meta_rEXP_bool - } , - pTF .code:n = - { - \bool_gset_true:N \l_@@_meta_pTF_bool - \bool_gset_true:N \l_@@_meta_TF_bool - \bool_gset_true:N \l_@@_meta_EXP_bool - } , - added .tl_set:N = \l_@@_date_added_tl , - updated .tl_set:N = \l_@@_date_updated_tl , - tested .code:n = { } , - } +\keys_define:nn { l3doc/cmd } + { + index .tl_set:N = \l_@@_cmd_index_tl , + replace .bool_set:N = \l_@@_cmd_replace_bool , + } % \end{macrocode} % +% \begin{macro}[int]{\@@_cmd:nn, \@@_cmd:no} +% \begin{macro}[aux]{\@@_cmd_aux:nn} +% Within a |pdfstring|, use the second argument directly. Otherwise +% call \cs{@@_cmd_aux:nn}: the indirection through +% \cs{CodedocUnexpandedTokens} and \cs{CodedocUseCs} makes things +% work when they pass through a +% file. Apply the key--value \meta{options}~|#1| after setting some +% default values. Then (unless |replace=false|) replace |@@| in~|#2|, +% which is a bit tricky: the |_| must be given the catcode expected by +% \cs{@@_replace_at_at:N}, but should be reverted to their original +% catcode (normally active, needed for line-breaking) without +% rescanning the whole argument. Then typeset the command in +% \tn{verbatim@font}, after turning it to harmless characters if +% needed (and keeping the underscore breakable); in any case, spaces +% must be turned into \tn{@xobeysp}. Finally, produce an index entry. +% \begin{macrocode} +\cs_new:Npn \@@_cmd:nn #1#2 + { + \texorpdfstring + { + \CodedocUnexpandedTokens + { \CodedocUseCs { @@_cmd_aux:nn } {#1} {#2} } + } + {#2} + } +\cs_generate_variant:Nn \@@_cmd:nn { no } +\cs_new_protected:Npn \@@_cmd_aux:nn #1#2 + { + \bool_set_true:N \l_@@_cmd_replace_bool + \tl_set:Nn \l_@@_cmd_index_tl { \q_no_value } + \keys_set:nn { l3doc/cmd } {#1} + \tl_set:No \l_@@_cmd_tl { \token_to_str:N #2 } + \bool_if:NT \l_@@_cmd_replace_bool + { + \tl_set_rescan:Nnn \l_@@_tmpb_tl { } { _ } + \tl_replace_all:Non \l_@@_cmd_tl \l_@@_tmpb_tl { _ } + \@@_replace_at_at:N \l_@@_cmd_tl + \tl_replace_all:Nno \l_@@_cmd_tl { _ } \l_@@_tmpb_tl + } + \mode_if_math:T { \mbox } + { + \verbatim@font + \int_compare:nNnF + { \tl_count:N \l_@@_cmd_tl } + < { \tl_count:f { \tl_to_str:N \l_@@_cmd_tl } } + { + \tl_set:Nx \l_@@_cmd_tl { \tl_to_str:N \l_@@_cmd_tl } + \tl_replace_all:Non \l_@@_cmd_tl + { \token_to_str:N _ } { \_ } + } + \tl_replace_all:Nnn \l_@@_cmd_tl { ~ } { \@xobeysp } + \l_@@_cmd_tl + } + \exp_args:No \@@_key_get:n { \l_@@_cmd_tl } + \quark_if_no_value:NF \l_@@_cmd_index_tl + { \tl_set_eq:NN \l_@@_index_module_tl \l_@@_cmd_index_tl } + \@@_special_index_module:ooon + { \l_@@_index_key_tl } + { \l_@@_index_macro_tl } + { \l_@@_index_module_tl } + { } + } +% \end{macrocode} +% \end{macro} +% \end{macro} % -% \begin{environment}{function} -% \begin{environment}{variabledoc} -% Environment for documenting function(s). -% Stick the function names in a box. -% Allow |<...>| to be used as markup for |\meta{...}|. -% Ignore spaces and sanitize with catcodes before reading argument. -% \begin{macrocode} -\char_set_catcode_active:N \< -\DeclareDocumentEnvironment {function} { O{} } - { - - \par\bigskip\noindent - \phantomsection - - \coffin_clear:N \l_@@_descr_coffin - \box_gclear:N \g_@@_syntax_box - \coffin_clear:N \l_@@_syntax_coffin - \coffin_clear:N \l_@@_names_coffin - - \bool_set_false:N \l_@@_meta_TF_bool - \bool_set_false:N \l_@@_meta_pTF_bool - \bool_set_false:N \l_@@_meta_EXP_bool - \bool_set_false:N \l_@@_meta_rEXP_bool - - \keys_set:nn { l3doc/function } {#1} - - \char_set_active_eq:NN < \@@_open_meta:w - - \group_begin: - \MakePrivateLetters - \char_set_catcode_other:N \| - \char_set_catcode_space:N \~ - \char_set_catcode_ignore:N \ % space - \char_set_catcode_ignore:N \^^M - \char_set_catcode_ignore:N \^^I - \exp_after:wN - \group_end: - \@@_function:n - } - { - \vcoffin_set_end: - \hcoffin_set:Nn \l_@@_syntax_coffin { \box_use:N \g_@@_syntax_box } -% \end{macrocode} -% \cs{g_@@_syntax_box} is defined in the syntax environment. -% \begin{macrocode} - \bool_if:NTF \l_@@_long_name_bool - { - \coffin_join:NnnNnnnn - \l_@@_output_box {hc} {vc} - \l_@@_syntax_coffin {l} {T} - {0pt} {0pt} - \coffin_join:NnnNnnnn - \l_@@_output_box {l} {t} - \l_@@_names_coffin {r} {t} - {-\marginparsep} {0pt} - \coffin_join:NnnNnnnn - \l_@@_output_box {l} {b} - \l_@@_descr_coffin {l} {t} - {0.75\marginparwidth + \marginparsep} {-\medskipamount} - - \coffin_typeset:Nnnnn \l_@@_output_box {\l_@@_descr_coffin-l} {\l_@@_descr_coffin-t} {0pt} {0pt} - } - { - \coffin_join:NnnNnnnn - \l_@@_output_box {hc} {vc} - \l_@@_syntax_coffin {l} {t} - {0pt} {0pt} - \coffin_join:NnnNnnnn - \l_@@_output_box {l} {b} - \l_@@_descr_coffin {l} {t} - {0pt} {-\medskipamount} - \coffin_join:NnnNnnnn - \l_@@_output_box {l} {t} - \l_@@_names_coffin {r} {t} - {-\marginparsep} {0pt} - - \coffin_typeset:Nnnnn - \l_@@_output_box {\l_@@_syntax_coffin-l} {\l_@@_syntax_coffin-T} - {0pt} {0pt} - } - \par - \allowbreak - } -\char_set_catcode_other:N \< -\cs_set_eq:NN \variabledoc \function -\cs_set_eq:NN \endvariabledoc \endfunction -% \end{macrocode} -% -% -% \begin{macro}{\@@_function:n} -% \begin{arguments} -% \item Comma-separated list of functions; -% input has already been sanitised by catcode changes before reading -% the argument. -% \end{arguments} -% \begin{macrocode} -\cs_set_nopar:Npn \@@_function:n #1 - { - - \tl_set:Nn \l_@@_function_input_tl {#1} - - \dim_zero:N \l_@@_trial_width_dim - \hcoffin_set:Nn \l_@@_names_coffin { \function_typeset:n {#1} } - \dim_set:Nn \l_@@_trial_width_dim { \box_wd:N \l_@@_names_coffin } - - \bool_set:Nn \l_@@_long_name_bool - { \dim_compare_p:nNn \l_@@_trial_width_dim > \marginparwidth } - - \vcoffin_set:Nnw \l_@@_descr_coffin {\textwidth} - \noindent\ignorespaces - } -\cs_gset_nopar:Npn \function_typeset:n #1 %^^A todo: use "\cs_new:Npn" here - { - \tl_gclear:N \g_@@_macro_tl - - % populate "\l_@@_functions_block_prop" with info on the functions present: - % with a hack as we don't currently read verbatim and that means that - % \q_recursion_tail is an issue! - \str_if_eq:nnTF {#1} { \q_recursion_tail } +% \begin{macro} +% { +% \@@_meta:n, +% \@@_meta_aux:n, +% \@@_ensuremath_sb:n, +% \@@_meta_original:n +% } +% Store |#1| in \cs{l_@@_tmpa_tl} and replaces every underscore, +% regardless of its category (\enquote{math toggle}, +% \enquote{alignment}, \enquote{superscript}, \enquote{subscript}, +% \enquote{letter}, \enquote{other}, or \enquote{active}) by +% \cs{@@_ensuremath_sb:n} (which creates math subscripts), then runs +% the code used for \tn{meta} in \pkg{doc.sty}. +% \begin{macrocode} +\cs_new:Npn \@@_meta:n #1 + { + \texorpdfstring + { + \CodedocUnexpandedTokens + { \CodedocUseCs { @@_meta_aux:n } {#1} } + } + { < #1 > } + } +\cs_new_protected:Npn \@@_meta_aux:n #1 + { + \tl_set:Nn \l_@@_tmpa_tl {#1} + \tl_map_inline:nn + { { 3 } { 4 } { 7 } { 8 } { 11 } { 12 } { 13 } } + { + \tl_set_rescan:Nnn \l_@@_tmpb_tl + { \char_set_catcode:nn { `_ } {##1} } { _ } + \tl_replace_all:Non \l_@@_tmpa_tl \l_@@_tmpb_tl + { \@@_ensuremath_sb:n } + } + \exp_args:NV \@@_meta_original:n \l_@@_tmpa_tl + } +\cs_new_protected:Npn \@@_ensuremath_sb:n #1 + { \ensuremath { \sb {#1} } } +\cs_new_protected:Npn \@@_meta_original:n #1 + { + \ensuremath \langle + \mode_if_math:T { \nfss@text } { - \prop_put:Nxx \l_@@_functions_block_prop - { \cs_to_str:N \q_recursion_tail } - { { -1 } { } } + \meta@font@select + \edef \meta@hyphen@restore + { \hyphenchar \the \font \the \hyphenchar \font } + \hyphenchar \font \m@ne + \language \l@nohyphenation + #1 \/ + \meta@hyphen@restore } - { \clist_map_function:nN {#1} \@@_parse_functions:n } - - \small\ttfamily - \begin{tabular}{ @{} l @{} r @{} } - \toprule - \prop_map_function:NN \l_@@_functions_block_prop \@@_typeset_functions:nn - \@@_typeset_dates: - \bottomrule - \end{tabular} - \normalfont\normalsize - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_parse_functions:n} -% The idea here is to populate "\l_@@_functions_block_prop" with information -% about the functions being typeset and their variants. -% The property list uses a specific format: the keys contained are the function `names' (stripped of signature) with values specified by a comma-separated list containing two brace groups per item: -% \begin{center} -% |> {my_function} => {| \Arg{Nargs_1} \Arg{sig_1} |,| \Arg{Nargs_2} \Arg{sig_2} |, ... }| -% \end{center} -% This somewhat arcane syntax is chosen to distinguish between all variants of control sequence that may be being documented here. (With or without \textsf{expl3} function syntax.) + \ensuremath \rangle + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The \env{function} environment} +% % \begin{macrocode} -\prop_new:N \l_@@_functions_block_prop -\cs_generate_variant:Nn \prop_put:Nnn {Nxx} -\cs_new:Nn \@@_parse_functions:n - { - \exp_args:Nxx \tl_if_head_eq_charcode:nNTF { \token_to_str:N #1 } {\cs_to_str:N \\} - { - \tl_gset_eq:NN \l_@@_function_name_prefix_tl \@backslashchar - % for the weird functions named "\::N" and so on: - \exp_args:Nx \tl_if_head_eq_charcode:nNTF { \cs_to_str:N #1 } { : } - { - % again, no variants: - \prop_put:Nxx \l_@@_functions_block_prop { \cs_to_str:N #1 } { {-1} {} } - } - { - % finally, for regular old csnames: - \exp_args:NNf \prop_get:NnNTF - \l_@@_functions_block_prop - { \__cs_get_function_name:N #1 } \l_@@_tmpb_tl - { - \prop_put:Nxx \l_@@_functions_block_prop - { \__cs_get_function_name:N #1 } - { - \l_@@_tmpb_tl , - {\__cs_count_signature:N #1} - {\__cs_get_function_signature:N #1} - } - } - { - \prop_put:Nxx \l_@@_functions_block_prop - { \__cs_get_function_name:N #1 } +\keys_define:nn { l3doc/function } + { + TF .code:n = + { + \bool_set_true:N \l_@@_macro_TF_bool + } , + EXP .code:n = + { + \bool_set_true:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + } , + rEXP .code:n = + { + \bool_set_false:N \l_@@_macro_EXP_bool + \bool_set_true:N \l_@@_macro_rEXP_bool + } , + pTF .code:n = + { + \bool_set_true:N \l_@@_macro_pTF_bool + \bool_set_true:N \l_@@_macro_TF_bool + \bool_set_true:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + } , + added .tl_set:N = \l_@@_date_added_tl , + updated .tl_set:N = \l_@@_date_updated_tl , + tested .code:n = { } , + no-label .bool_set:N = \l_@@_no_label_bool , + } +% \end{macrocode} +% +% +% \begin{macro}[int]{\@@_function:nnw} +% \begin{arguments} +% \item Key--value list. +% \item Comma-separated list of functions; input has already been +% sanitised by catcode changes before reading the argument. +% \end{arguments} +% \begin{macro}[int]{\@@_function_end:} +% Make sure any paragraph is finished, and similar safe practices at +% the beginning of an environment which will typeset material. +% Initialize some variables. Parse the key--value list. Clean up the +% list of functions, then go through them to extract some data. After +% this, typeset the function names in the coffin +% \cs{l_@@_names_coffin} and measure it to know if it fits in the +% margin. Finally, start a vertical coffin for the main part of the +% environment. This coffin stops when the environment ends, then all +% the pieces are assembled into a single coffin, which is typeset. +% \begin{macrocode} +\cs_new_protected:Npn \@@_function:nnw #1#2 + { + \@@_function_typeset_start: + \@@_function_init: + \keys_set:nn { l3doc/function } {#1} + \@@_verb_get_seq:nN {#2} \l_@@_function_input_seq + \@@_function_parse: + \@@_function_typeset: + \@@_function_descr_start:w + } +\cs_new_protected_nopar:Npn \@@_function_end: + { + \@@_function_descr_stop: + \@@_function_assemble: + \@@_function_typeset_stop: + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[aux] +% {\@@_function_typeset_start:, \@@_function_typeset_stop:} +% At the start of the \env{function} environment, before performing +% any assignment, close the last paragraph, and set up the typesetting +% scene. Further code typesets a coffin, so we end the paragraph and +% allow a page break. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_function_typeset_start: + { + \par \bigskip \noindent + \phantomsection + } +\cs_new_protected_nopar:Npn \@@_function_typeset_stop: + { + \par + \allowbreak + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux]{\@@_function_init:} +% Allow |<...>| to be used as markup for |\meta{...}|. Clear various +% variables. +% \begin{macrocode} +\cs_new_protected:Npn \@@_function_init: + { + \coffin_clear:N \l_@@_descr_coffin + \box_gclear:N \g_@@_syntax_box + \coffin_clear:N \l_@@_syntax_coffin + \coffin_clear:N \l_@@_names_coffin + \bool_set_false:N \l_@@_macro_TF_bool + \bool_set_false:N \l_@@_macro_pTF_bool + \bool_set_false:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + \bool_set_false:N \l_@@_no_label_bool + \char_set_active:Npn < ##1 > { \meta {##1} } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux] +% { +% \@@_function_parse:, +% \@@_function_parse_one:n, +% \@@_function_parse_cs_aux:nnN +% } +% The idea here is to populate \cs{l_@@_functions_block_prop} with +% information about the functions being typeset and their variants. +% The property list uses a specific format: the keys contained are the +% function \enquote{names} (stripped of signature) with values +% specified by a comma-separated list of (braced) signatures: +% \begin{center} +% |> {my_function} => {| \meta{sig_1} |,| \meta{sig_2} |, ... }| +% \end{center} +% In the case where the function has no signature (no colon), we use +% a \meta{sig} equal to \cs{scan_stop:}. +% This somewhat arcane syntax is chosen to distinguish between all +% variants of control sequence that may be being documented +% here. (With or without \pkg{expl3} function syntax.) +% +% If |#1| does not start with |\| then the \enquote{name prefix} is +% empty and we store \cs{scan_stop:} as the value for the key |#1|, not +% bothering with variants. If instead |#1| starts with |\| then the +% \enquote{name prefix} is |\| and we omit the first character of |#1| +% subsequently. If the next character is |:| then we have one of the +% weird functions named |\::N| and so on, and we ignore variants, +% putting \cs{scan_stop:} directly as the value for the key |::N|. +% Otherwise, we have a regular control sequence, which we decompose +% using \cs{@@_function_parse_cs_aux:nnN}. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_function_parse: + { + \seq_map_function:NN + \l_@@_function_input_seq + \@@_function_parse_one:n + } +\cs_new_protected:Npn \@@_function_parse_one:n #1 + { + \tl_if_head_eq_charcode:nNTF {#1} \c_@@_backslash_token + { + \tl_gset_eq:NN \g_@@_function_name_prefix_tl \c_@@_backslash_tl + \exp_args:No \tl_if_head_eq_charcode:nNTF { \use_none:n #1 } : { - {\__cs_count_signature:N #1} - {\__cs_get_function_signature:N #1} + \prop_put:Nxn \l_@@_functions_block_prop + { \use_none:n #1 } { \scan_stop: } } - } - } - } + { + \exp_args:Nc \__cs_split_function:NN { \use_none:n #1 } + \@@_function_parse_cs_aux:nnN + } + } + { + \tl_gclear:N \g_@@_function_name_prefix_tl + \prop_put:Nnn \l_@@_functions_block_prop {#1} { \scan_stop: } + } + } +\cs_new_protected:Npn \@@_function_parse_cs_aux:nnN #1#2#3 + { + \prop_get:NnNF + \l_@@_functions_block_prop {#1} \l_@@_tmpb_tl + { \tl_clear:N \l_@@_tmpb_tl } + \prop_put:Nnx \l_@@_functions_block_prop {#1} + { + \l_@@_tmpb_tl , + \bool_if:NTF #3 { {#2} } { \scan_stop: } + } + } % \end{macrocode} -% False branch for keys and things that aren't actually csnames: +% \end{macro} +% +% \begin{macro}[aux]{\@@_function_typeset:} +% Typeset in the coffin \cs{l_@@_names_coffin} the functions listed in +% \cs{l_@@_functions_block_prop} and the relevant dates, then set +% \cs{l_@@_long_name_bool} to be \texttt{true} if this coffin is +% larger than the available width in the margin. The function +% \cs{@@_typeset_names:} is quite involved hence given later. % \begin{macrocode} - { - % for now don't bother splitting into variants: - \tl_gclear:N \l_@@_function_name_prefix_tl - \prop_put:Nxx \l_@@_functions_block_prop { \tl_to_str:n {#1} } { {-1} {} } - } - } +\cs_new_protected_nopar:Npn \@@_function_typeset: + { + \dim_zero:N \l_@@_trial_width_dim + \hcoffin_set:Nn \l_@@_names_coffin { \@@_typeset_names: } + \dim_set:Nn \l_@@_trial_width_dim + { \box_wd:N \l_@@_names_coffin } + \bool_set:Nn \l_@@_long_name_bool + { \dim_compare_p:nNn \l_@@_trial_width_dim > \marginparwidth } + } % \end{macrocode} % \end{macro} -% \end{environment} -% \end{environment} % +% \begin{macro}[aux] +% {\@@_function_descr_start:w, \@@_function_descr_stop:} +% The last step in \cs{@@_function:nnw} (the beginning of a +% \env{function} environment) is to open a coffin which will capture +% the description of the function, namely the body of the +% \env{function} environment. This is closed by \cs{@@_function_end:} +% (the end of a \env{function} environment). +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_function_descr_start:w + { + \vcoffin_set:Nnw \l_@@_descr_coffin { \textwidth } + \noindent \ignorespaces + } +\cs_new_protected_nopar:Npn \@@_function_descr_stop: + { \vcoffin_set_end: } +% \end{macrocode} +% \end{macro} % -% \begin{macro}{\@@_typeset_functions:nn} -% \begin{arguments} -% \item Function/macro/variable name (stripped of signature in the first case, if any) -% \item Comma-list containing information about the signature variants being documented (if any) -% \end{arguments} -% \begin{macrocode} -\cs_new:Nn \@@_typeset_functions:nn - { - \clist_gset:Nn \l_@@_variants_clist {#2} - \clist_gpop:NN \l_@@_variants_clist \l_@@_tmpb_tl - \exp_args:Nc \@@_typeset_functions_aux:N - { - #1 - \int_compare:nT { \exp_after:wN \use_i:nn \l_@@_tmpb_tl > -1 } {:} - \int_compare:nT { \exp_after:wN \use_i:nn \l_@@_tmpb_tl > 0 } - { \exp_after:wN \use_ii:nn \l_@@_tmpb_tl } - } - \\ - } - -\cs_new_nopar:Nn \@@_typeset_functions_aux:N - { - \bool_if:NT \l_@@_meta_pTF_bool - { - \tl_set:Nx \l_@@_pTF_name_tl - { \l_@@_function_name_prefix_tl \@@_predicate_from_base:N #1 } - \@@_special_main_index:o { \l_@@_pTF_name_tl } - \seq_gput_right:Nx \g_doc_functions_seq - { \tl_to_str:N \l_@@_pTF_name_tl } - \tl_set:Nx \l_@@_pTF_name_tl { \@@_predicate_from_base:N #1 } - } - - \tl_set:Nx \l_@@_tmpa_tl - { - \l_@@_function_name_prefix_tl - \cs_to_str:N #1 - \bool_if:NT \l_@@_meta_TF_bool { \tl_to_str:n {TF} } - } - \@@_special_main_index:o { \l_@@_tmpa_tl } - \seq_gput_right:No \g_doc_functions_seq { \l_@@_tmpa_tl } - - \bool_if:NTF \l_@@_meta_pTF_bool - { - \bool_gset_false:N \l_@@_meta_TF_bool - \exp_args:Nc \@@_typeset_function_block:N { \l_@@_pTF_name_tl } - \bool_gset_true:N \l_@@_meta_TF_bool - - \\ - \@@_typeset_function_block:N #1 - } - { - \exp_args:Nx \tl_if_head_eq_charcode:nNTF { \exp_after:wN \use_none:n \token_to_str:N #1 } {:} - { \@@_show_macro_unusual:N #1 } - { \@@_typeset_function_block:N #1 } - } -} +% \begin{macro}[aux]{\@@_function_assemble:} +% The box \cs{g_@@_syntax_box} contains the contents of the syntax +% environment if it was used. Now that we have all the pieces, join +% together the syntax coffin, the names coffin, and the description +% coffin. The relative positions depend on whether the names coffin +% fits in the margin. Then typeset the combination. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_function_assemble: + { + \hcoffin_set:Nn \l_@@_syntax_coffin + { \box_use:N \g_@@_syntax_box } + \bool_if:NTF \l_@@_long_name_bool + { + \coffin_join:NnnNnnnn + \l_@@_output_coffin {hc} {vc} + \l_@@_syntax_coffin {l} {T} + {0pt} {0pt} + \coffin_join:NnnNnnnn + \l_@@_output_coffin {l} {t} + \l_@@_names_coffin {r} {t} + {-\marginparsep} {0pt} + \coffin_join:NnnNnnnn + \l_@@_output_coffin {l} {b} + \l_@@_descr_coffin {l} {t} + {0.75\marginparwidth + \marginparsep} {-\medskipamount} + \coffin_typeset:Nnnnn \l_@@_output_coffin + {\l_@@_descr_coffin-l} {\l_@@_descr_coffin-t} + {0pt} {0pt} + } + { + \coffin_join:NnnNnnnn + \l_@@_output_coffin {hc} {vc} + \l_@@_syntax_coffin {l} {t} + {0pt} {0pt} + \coffin_join:NnnNnnnn + \l_@@_output_coffin {l} {b} + \l_@@_descr_coffin {l} {t} + {0pt} {-\medskipamount} + \coffin_join:NnnNnnnn + \l_@@_output_coffin {l} {t} + \l_@@_names_coffin {r} {t} + {-\marginparsep} {0pt} + \coffin_typeset:Nnnnn \l_@@_output_coffin + {\l_@@_syntax_coffin-l} {\l_@@_syntax_coffin-T} + {0pt} {0pt} + } + } % \end{macrocode} % \end{macro} % -% \begin{macro}[internal]{\@@_typeset_function_block:N} +% \begin{macro}[aux]{\@@_typeset_names:} +% This function builds the \cs{l_@@_names_coffin} by typesetting the +% function names (with variants) and the relevant dates in a +% \env{tabular} environment. The use of rules \tn{toprule}, +% \tn{midrule} and \tn{bottomrule} requires whatever lies between the +% last |\\| and the rule to be expandable, making our lives a bit +% complicated. % \begin{macrocode} -\cs_set_nopar:Nn \@@_typeset_function_block:N - { - \tl_gset:Nx \l_@@_function_name_tl { \__cs_get_function_name:N #1 } - \tl_gset:Nx \l_@@_function_sig_tl { \__cs_get_function_signature:N #1 } - \tl_gset:Nx \g_@@_macro_tl { \l_@@_function_name_prefix_tl \l_@@_function_name_tl } - - \@@_typeset_function_basename:N #1 - \bool_if:NT \l_@@_meta_TF_bool { \@@_typeset_TF: } - \@@_typeset_expandability: - \clist_if_empty:NF \l_@@_variants_clist { \@@_typeset_variants: } - \bool_if:NT \g_@@_full_bool { \@@_label_function:N #1 } - } +\cs_new_protected_nopar:Npn \@@_typeset_names: + { + \small\ttfamily + \begin{tabular} { @{} l @{} r @{} } + \toprule + \@@_typeset_functions: + \@@_typeset_dates: + \bottomrule + \end{tabular} + \normalfont\normalsize + } % \end{macrocode} +% \end{macro} % +% \begin{macro}[aux]{\@@_typeset_functions:} +% \begin{macro}[aux] +% {\@@_typeset_functions_auxi:nn, \@@_typeset_functions_auxii:nn} +% \begin{arguments} +% \item Function/macro/variable name (stripped of signature in the +% first case, if any) +% \item Comma-list containing information about the signature +% variants being documented (if any) +% \end{arguments} +% The mapping to \cs{l_@@_functions_block_prop} cannot use +% \cs{prop_map_inline:Nn} because the code following |\\| would not be +% expandable, thus breaking \tn{bottomrule}. The loop goes as +% follows: go through the list of variants |#2|, and collect them by +% \enquote{base form} in a \cs{l_@@_variants_prop} whose keys are the +% base form and whose values are the variants which can be obtained +% from that base form using \cs{cs_generate_variant:Nn}. Then start a +% nested loop through these base forms, calling +% \cs{@@_typeset_functions_auxii:nn}. This auxiliary does not care +% about the base form. It stores the variants it receives in +% \cs{g_@@_variants_clist}, remove the first, which will be displayed +% more prominently, and reconstructs its actual name, passing it to +% the \cs{@@_typeset_functions_auxiii:N} auxiliary. +% +% Braces around |##1| are crucial since this item can be empty. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_typeset_functions: + { + \prop_map_function:NN \l_@@_functions_block_prop + \@@_typeset_functions_auxi:nn + } +\cs_new_protected:Npn \@@_typeset_functions_auxi:nn #1#2 + { + \tl_gset:Nn \g_@@_base_name_tl {#1} + \prop_clear:N \l_@@_variants_prop + \clist_map_inline:nn {#2} + { + \tl_set:Nx \l_@@_tmpa_tl + { \@@_signature_base_form:n {##1} } + \prop_get:NoNTF \l_@@_variants_prop + \l_@@_tmpa_tl \l_@@_tmpb_tl + { \tl_put_right:Nn \l_@@_tmpb_tl { , {##1} } } + { \tl_set:Nn \l_@@_tmpb_tl { {##1} } } + \prop_put:Noo \l_@@_variants_prop + \l_@@_tmpa_tl \l_@@_tmpb_tl + } + \prop_map_function:NN \l_@@_variants_prop + \@@_typeset_functions_auxii:nn + } +\cs_new_protected:Npn \@@_typeset_functions_auxii:nn #1#2 + { + \clist_gset:Nn \g_@@_variants_clist {#2} + \clist_gpop:NN \g_@@_variants_clist \l_@@_tmpb_tl + \exp_args:Nc \@@_typeset_functions_auxiii:N + { + \g_@@_base_name_tl + \exp_last_unbraced:Nf \token_if_eq_meaning:NNF + { \tl_head:f { \l_@@_tmpb_tl ? } } + \scan_stop: + { : \l_@@_tmpb_tl } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}[aux]{\@@_typeset_functions_auxiii:N} % \begin{macrocode} -\cs_set:Nn \@@_typeset_function_basename:N - { \l_@@_function_name_prefix_tl \cs_to_str:N #1 } +\cs_new_protected:Npn \@@_typeset_functions_auxiii:N #1 + { + \bool_if:NT \l_@@_macro_pTF_bool + { + \tl_set:Nx \l_@@_pTF_name_tl + { \@@_predicate_from_base:N #1 } + \@@_function_index:x { \l_@@_pTF_name_tl } + } + \@@_function_index:x + { + \cs_to_str:N #1 + \bool_if:NT \l_@@_macro_TF_bool { \tl_to_str:n {TF} } + } + \bool_if:NT \l_@@_macro_pTF_bool + { + \exp_args:Nc \@@_typeset_function_block:NN + { \l_@@_pTF_name_tl } \c_false_bool + } + \@@_typeset_function_block:NN #1 \l_@@_macro_TF_bool + } +\cs_new_protected:Npn \@@_function_index:x #1 + { + \tl_set:Nx \l_@@_tmpa_tl + { \g_@@_function_name_prefix_tl #1 } + \seq_gput_right:No \g_doc_functions_seq { \l_@@_tmpa_tl } + \@@_special_index:on { \l_@@_tmpa_tl } { usage } + } % \end{macrocode} +% \end{macro} % +% \begin{macro}[internal]{\@@_typeset_function_block:NN} +% The first argument is a control sequence, the second a boolean which +% controls whether to typeset |TF| or not. % \begin{macrocode} -\cs_set:Nn \@@_typeset_expandability: - { - & - \bool_if:NT \l_@@_meta_EXP_bool - { - \hspace{\tabcolsep} - \hyperlink{expstar} {$\star$} - } - \bool_if:NT \l_@@_meta_rEXP_bool - { - \hspace{\tabcolsep} - \hyperlink{rexpstar} {\ding{73}} % hollow star - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_set:Nn \@@_typeset_variants: - { - \\ - \@@_typeset_aux:n \g_@@_macro_tl : - \int_compare:nTF { \clist_count:N \l_@@_variants_clist == 1 } - { \exp_after:wN \use_ii:nn \l_@@_variants_clist } - { - \textrm( - \clist_pop:NN \l_@@_variants_clist \l_@@_tmpb_tl - \exp_after:wN \use_ii:nn \l_@@_tmpb_tl - \clist_map_inline:Nn \l_@@_variants_clist {\textrm| \use_ii:nn ##1} - \textrm) - } - \bool_if:NT \l_@@_meta_TF_bool { \@@_typeset_TF: } - & - \bool_if:NT \l_@@_meta_EXP_bool - { - \hspace{\tabcolsep} - \hyperlink{expstar} {$\star$} - } - \bool_if:NT \l_@@_meta_rEXP_bool - { - \hspace{\tabcolsep} - \hyperlink{rexpstar} {\ding{73}} % hollow star - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_set:Nn \@@_label_function:N - { - \tl_set:Nx \l_@@_tmpa_tl { \l_@@_function_name_prefix_tl \cs_to_str:N #1 } - \exp_args:NNf \tl_replace_all:Nnn \l_@@_tmpa_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_remove_all:Nn \l_@@_tmpa_tl {\@backslashchar} - \exp_args:Nx \label {doc/function//\l_@@_tmpa_tl} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}[aux]{\@@_show_macro_unusual:N} -% This is for the case when the function is one of the weird ones like \cs{::N}. -% \begin{macrocode} -\cs_set_nopar:Nn \@@_show_macro_unusual:N - { - \tl_gset:Nx \g_@@_macro_tl { \token_to_str:N #1} - \token_to_str:N #1 & - - \exp_args:NNf \tl_replace_all:Nnn \g_@@_macro_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_replace_all:Nnn \g_@@_macro_tl {\@backslashchar} {} - \bool_if:NT \g_@@_full_bool - { - \exp_args:Nx \label { doc/function//\g_@@_macro_tl } - } - } +\cs_new_protected:Npn \@@_typeset_function_block:NN #1#2 + { + \@@_function_label:x + { \g_@@_function_name_prefix_tl \cs_to_str:N #1 } + \g_@@_function_name_prefix_tl \cs_to_str:N #1 + \bool_if:NT #2 { \@@_typeset_TF: } + \@@_typeset_expandability: + \clist_if_empty:NF \g_@@_variants_clist + { \@@_typeset_variant_list:NN #1#2 } + \\ + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_typeset_expandability: + { + & + \bool_if:NT \l_@@_macro_EXP_bool + { + \hspace{\tabcolsep} + \hyperlink{expstar} {$\star$} + } + \bool_if:NT \l_@@_macro_rEXP_bool + { + \hspace{\tabcolsep} + \hyperlink{rexpstar} {\ding{73}} % hollow star + } + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_typeset_variant_list:NN #1#2 + { + \\ + \@@_typeset_aux:n + { + \g_@@_function_name_prefix_tl + \__cs_get_function_name:N #1 + } + : + \int_compare:nTF { \clist_count:N \g_@@_variants_clist == 1 } + { \clist_use:Nn \g_@@_variants_clist { } } + { + \textrm( + \clist_use:Nn \g_@@_variants_clist { \textrm| } + \textrm) + } + \bool_if:NT #2 { \@@_typeset_TF: } + \@@_typeset_expandability: + } +% \end{macrocode} +% +% TODO: understand whether we need one more boolean to only +% put labels if the whole document is typeset. +% \begin{macrocode} +\cs_new_protected:Npn \@@_function_label:n #1 + { + % \bool_if:NT \g_@@_typeset_implementation_bool + % { + \bool_if:NF \l_@@_no_label_bool + { + \@@_get_hyper_target:nN {#1} \l_@@_tmpa_tl + \exp_args:No \label { \l_@@_tmpa_tl } + } + % } + } +\cs_generate_variant:Nn \@@_function_label:n { x } % \end{macrocode} % \end{macro} % % \begin{macro}[internal]{\@@_typeset_dates:} -% To display metadata for when functions are added/modified. +% To display metadata for when functions are added/modified. +% This function must be expandable since it produces rules for use in +% alignments. % \begin{macrocode} -\cs_set:Nn \@@_typeset_dates: - { - \bool_if:nF { \tl_if_empty_p:N \l_@@_date_added_tl && - \tl_if_empty_p:N \l_@@_date_updated_tl } - { \midrule } - - \tl_if_empty:NF \l_@@_date_added_tl - { - \multicolumn{2}{@{}r@{}} - { \scriptsize New:\,\l_@@_date_added_tl } \\ - } +\cs_new_nopar:Npn \@@_typeset_dates: + { + \bool_if:nF + { + \tl_if_empty_p:N \l_@@_date_added_tl && + \tl_if_empty_p:N \l_@@_date_updated_tl + } + { \midrule } + \tl_if_empty:NF \l_@@_date_added_tl + { + \multicolumn { 2 } { @{} r @{} } + { \scriptsize New: \, \l_@@_date_added_tl } \\ + } - \tl_if_empty:NF \l_@@_date_updated_tl - { - \multicolumn{2}{@{}r@{}} - { \scriptsize Updated:\,\l_@@_date_updated_tl } \\ - } - } + \tl_if_empty:NF \l_@@_date_updated_tl + { + \multicolumn { 2 } { @{} r @{} } + { \scriptsize Updated: \, \l_@@_date_updated_tl } \\ + } + } % \end{macrocode} % \end{macro} % -% \begin{environment}{syntax} -% Syntax block placed next to the list of functions to illustrate their use. +% \begin{macro}[aux]{\@@_syntax:w, \@@_syntax_end:} +% Implement the \env{syntax} environment. % \begin{macrocode} -\newenvironment{syntax} - { - \small\ttfamily - \bool_if:NTF \l_@@_long_name_bool - { - \hbox_gset:Nw \g_@@_syntax_box - \arrayrulecolor{white} - \begin{tabular}{@{}l@{}} - \toprule - \begin{minipage} - { \textwidth+0.75\marginparwidth-\l_@@_trial_width_dim } - } - { - \hbox_gset:Nw \g_@@_syntax_box - \arrayrulecolor{white} - \begin{tabular}{@{}l@{}} - \toprule - \begin{minipage}{ \textwidth } - } - \raggedright - \obeyspaces\obeylines - } - { - \end{minipage} - \end{tabular} - \arrayrulecolor{black} - \hbox_set_end: - \ignorespacesafterend - } -% \end{macrocode} -% \end{environment} -% -% \begin{macro}{\@@_ensuremath_sb:n} -% \begin{macrocode} -\cs_new:Npn \@@_ensuremath_sb:n #1 - { - \ensuremath{\sb{#1}} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_open_meta:w,\@@_close_meta:n} -% \begin{macrocode} -\cs_set_eq:NN \@@_meta:n \meta -\cs_set:Npn \meta - { - \group_begin: - \char_set_active_eq:NN _ \@@_ensuremath_sb:n - \@@_close_meta:n - } -\cs_new:Npn \@@_open_meta:w - { - \group_begin: - \char_set_active_eq:NN _ \@@_ensuremath_sb:n - \@@_close_meta:w - } -\cs_new:Npn \Arg - { - \texttt{ \char`\{ } - \group_begin: - \char_set_active_eq:NN _ \@@_ensuremath_sb:n - \@@_close_Arg:n - } -\cs_new_nopar:Npn \@@_close_meta:n #1 { \@@_meta:n {#1} \group_end: } -\cs_new_nopar:Npn \@@_close_meta:w #1> { \@@_meta:n {#1} \group_end: } -\cs_new_nopar:Npn \@@_close_Arg:n #1 - { - \@@_meta:n {#1} - \group_end: - \texttt{ \char`\} } - } +\dim_new:N \l_@@_syntax_dim +\cs_new_protected:Npn \@@_syntax:w + { + \dim_set:Nn \l_@@_syntax_dim + { + \textwidth + \bool_if:NT \l_@@_long_name_bool + { + 0.75 \marginparwidth - \l_@@_trial_width_dim } + } + \hbox_gset:Nw \g_@@_syntax_box + \small \ttfamily + \arrayrulecolor{white} + \begin{tabular} { @{} l @{} } + \toprule + \begin{minipage}{\l_@@_syntax_dim} + \raggedright + \obeyspaces + \obeylines + } +\cs_new_protected:Npn \@@_syntax_end: + { + \end{minipage} + \end{tabular} + \arrayrulecolor{black} + \hbox_gset_end: + } % \end{macrocode} % \end{macro} % -% \begin{environment}{macro} -% We want to extend the old definition to allow comma-separated lists of -% macros, rather than one at a time. +% \subsubsection{The \env{macro} environment} % -% Keyval: +% Keyval for the \env{macro} environment. TODO: use +% |.value_forbidden:|. TODO: provide document command for talking about +% keys. % \begin{macrocode} \keys_define:nn { l3doc/macro } - { - aux .code:n = - { \bool_set_true:N \l_@@_macro_aux_bool } , - internal .code:n = - { \bool_set_true:N \l_@@_macro_internal_bool } , - int .code:n = - { \bool_set_true:N \l_@@_macro_internal_bool } , - var .code:n = - { \bool_set_true:N \l_@@_macro_var_bool } , - TF .code:n = - { \bool_set_true:N \l_@@_macro_TF_bool } , - pTF .code:n = - { \bool_set_true:N \l_@@_macro_pTF_bool } , - tested .code:n = - { } , - EXP .code:n = {} , % TODO - rEXP .code:n = {} , % TODO - added .code:n = {} , % TODO - updated .code:n = {} , % TODO - } -% \end{macrocode} -% -% \begin{macrocode} -\RenewDocumentCommand { \macro } { O{} } { \@@_macro:n {#1} } -\cs_new_protected:Npn \@@_macro:n #1 - { - - \int_compare:nNnTF \currentgrouplevel=2 - { \int_gzero:N \g_@@_nested_macro_int } - { \int_incr:N \g_@@_nested_macro_int } - - \bool_set_false:N \l_@@_macro_aux_bool - \bool_set_false:N \l_@@_macro_internal_bool - \bool_set_false:N \l_@@_macro_TF_bool - \bool_set_false:N \l_@@_macro_pTF_bool - \bool_set_false:N \l_@@_macro_var_bool - \bool_set_false:N \l_@@_tested_bool - - \cs_set_eq:NN \@@_macroname_prefix:n \use:n - \cs_set_eq:NN \@@_macroname_suffix: \c_empty_tl - - \keys_set:nn { l3doc/macro } {#1} - - \cs_set_eq:NN \testfile \@@_print_testfile:n - - \peek_meaning_ignore_spaces:NTF \c_group_begin_token - { - \group_begin: - \MakePrivateLetters - \char_set_catcode_letter:N \\ - \char_set_catcode_ignore:N \ % space - \char_set_catcode_ignore:N \^^M - \char_set_catcode_ignore:N \^^I - \@@_macro_aux:n - } - { - \@@_macro_verbatim:w - } - } -\NewDocumentCommand {\@@_macro_verbatim:w} {v} - { - \group_begin: % pretty useless - \@@_macro_aux:n {#1} - } -% \end{macrocode} -% After changing the catcodes, parse the arguments: -% \begin{macrocode} -\clist_new:N \l_@@_macro_input_clist -\cs_new_nopar:Npn \@@_macro_aux:n #1 - { - \group_end: - \clist_set:Nn \l_@@_macro_input_clist {#1} - \bool_if:NTF \l_@@_macro_pTF_bool - { - \clist_map_inline:Nn \l_@@_macro_input_clist - { - \exp_args:Nx \@@_macro_single:n { \@@_predicate_from_base:w ##1 \q_nil } - } - \bool_set_true:N \l_@@_macro_TF_bool - \clist_map_function:NN \l_@@_macro_input_clist \@@_macro_single:n - \bool_set_false:N \l_@@_macro_TF_bool - } - { \clist_map_function:NN \l_@@_macro_input_clist \@@_macro_single:n } - } + { + aux .code:n = + { \bool_set_true:N \l_@@_macro_aux_bool } , + internal .code:n = + { \bool_set_true:N \l_@@_macro_internal_bool } , + int .code:n = + { \bool_set_true:N \l_@@_macro_internal_bool } , + var .code:n = + { \bool_set_true:N \l_@@_macro_var_bool } , + TF .code:n = + { \bool_set_true:N \l_@@_macro_TF_bool } , + pTF .code:n = + { + \bool_set_true:N \l_@@_macro_TF_bool + \bool_set_true:N \l_@@_macro_pTF_bool + \bool_set_true:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + } , + EXP .code:n = + { + \bool_set_true:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + } , + rEXP .code:n = + { + \bool_set_false:N \l_@@_macro_EXP_bool + \bool_set_true:N \l_@@_macro_rEXP_bool + } , + tested .code:n = + { + \bool_set_true:N \l_@@_macro_tested_bool + } , + added .code:n = {} , % TODO + updated .code:n = {} , % TODO + } % \end{macrocode} % -% \end{environment} +% \begin{macro}[int]{\@@_macro:nnw} +% The arguments are a key--value list of \meta{options} and a +% comma-list of \meta{names}, read verbatim by \pkg{xparse}. First +% initialize some variables before applying the \meta{options}, then +% parse the \meta{names} to get a sequence of macro names, then apply +% \cs{@@_macro_single:n} to each (this step is more subtle than +% \cs{seq_map_function:NN} because of |TF|/|pTF|). Finally typeset +% the macro names in the margin. +% \begin{macrocode} +\cs_new_protected:Npn \@@_macro:nnw #1#2 + { + \@@_macro_init: + \keys_set:nn { l3doc/macro } {#1} + \@@_verb_get_seq:nN {#2} \l_@@_macro_input_seq + \@@_macro_map:N \@@_macro_single:n + \@@_macro_typeset: + } +% \end{macrocode} +% \end{macro} % +% \begin{macro}[aux]{\@@_macro_init:} +% The booleans hold various key--value options, +% \cs{l_@@_nested_macro_int} counts the number of \env{macro} +% environments around the current point (is $0$ outside). % \begin{macrocode} -\cs_set:Nn \@@_predicate_from_base:N - { - \__cs_get_function_name:N #1 _p: \__cs_get_function_signature:N #1 - } -\cs_set:Npn \@@_predicate_from_base:w #1 : #2 \q_nil - { - #1 _p: #2 - } -% \end{macrocode} -% -% \begin{environment}{doc_macro_single} -% Let's start to mess around with "doc"'s "macro" environment. See \file{doc.dtx} -% for a full explanation of the original environment. It's -% rather \emph{enthusiastically} commented. -% \begin{arguments} -% \item Macro/function/whatever name; input has already been sanitised. -% \end{arguments} -% \cs{l_@@_at_replaced_macro_tl} stores the macro name after -% replacement of |@@|. -% \begin{macrocode} -\cs_set_nopar:Npn \@@_macro_single:n #1 - { - \int_incr:N \l_@@_macro_int - - \tl_set:Nx \l_@@_at_replaced_macro_tl { \token_to_str:N #1 } - \@@_replace_at_at:N \l_@@_at_replaced_macro_tl - \tl_set_eq:NN \saved@macroname \l_@@_at_replaced_macro_tl - - \topsep\MacroTopsep - \trivlist - \cs_set_nopar:Npn \makelabel ##1 { \llap{##1} } - \if@inlabel - \cs_set_eq:NN \@tempa \@empty - \count@ \macro@cnt - \loop \ifnum\count@>\z@ - \cs_set_nopar:Npx \@tempa{\@tempa\hbox{\strut}} - \advance\count@\m@ne - \repeat - \cs_set_nopar:Npx \makelabel ##1 - { - \llap{\vtop to\baselineskip {\@tempa\hbox{##1}\vss}} - } - \advance \macro@cnt \@ne - \else - \macro@cnt \@ne - \fi - - \bool_if:NT \l_@@_macro_aux_bool - { - \cs_set_eq:NN \@@_macroname_prefix:n \@@_typeset_aux:n - } - \bool_if:NT \l_@@_macro_TF_bool - { - \cs_set_eq:NN \@@_macroname_suffix: \@@_typeset_TF: - } - - \bool_if:NF \l_@@_macro_aux_bool - { - \tl_gset:Nx \l_@@_macro_tl { \tl_to_str:N \l_@@_at_replaced_macro_tl } - \exp_args:NNf \tl_greplace_all:Nnn \l_@@_macro_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_greplace_all:Nnn \l_@@_macro_tl {\@backslashchar} {} - } - - \use:x - { - \exp_not:N \item [ \exp_not:N \@@_print_macroname:n { - \tl_to_str:N \l_@@_at_replaced_macro_tl - }] - } - \int_gincr:N \c@CodelineNo - - \bool_if:NF \l_@@_macro_aux_bool - { - \bool_if:NTF \l_@@_macro_TF_bool - { - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l_@@_at_replaced_macro_tl \tl_to_str:n {TF} } - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l_@@_at_replaced_macro_tl \tl_to_str:n {T } } - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l_@@_at_replaced_macro_tl \tl_to_str:n { F} } - } - { - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l_@@_at_replaced_macro_tl } - } - } - \bool_if:NTF \l_@@_macro_TF_bool - { - \exp_args:Nx \SpecialMainIndex{ \tl_to_str:N \l_@@_at_replaced_macro_tl TF}\nobreak - \exp_args:Nx \DoNotIndex{ \tl_to_str:N \l_@@_at_replaced_macro_tl TF} - } - { - \exp_args:Nx \SpecialMainIndex{ \tl_to_str:N \l_@@_at_replaced_macro_tl }\nobreak - \exp_args:Nx \DoNotIndex{ \tl_to_str:N \l_@@_at_replaced_macro_tl } - } - - \int_gdecr:N \c@CodelineNo - \ignorespaces - } +\cs_new_protected_nopar:Npn \@@_macro_init: + { + \int_incr:N \l_@@_nested_macro_int + \bool_set_false:N \l_@@_macro_aux_bool + \bool_set_false:N \l_@@_macro_internal_bool + \bool_set_false:N \l_@@_macro_TF_bool + \bool_set_false:N \l_@@_macro_pTF_bool + \bool_set_false:N \l_@@_macro_EXP_bool + \bool_set_false:N \l_@@_macro_rEXP_bool + \bool_set_false:N \l_@@_macro_var_bool + \bool_set_false:N \l_@@_macro_tested_bool + \cs_set_eq:NN \testfile \@@_print_testfile:n + \box_clear:N \l_@@_macro_index_box + \vbox_set:Nn \l_@@_macro_box + { + \hbox:n { \strut } + \vskip \int_eval:n { \l_@@_macro_int - 1 } \baselineskip + } + } % \end{macrocode} +% \end{macro} % -% \begin{macro}{\@@_print_macroname:n} +% \begin{macro}[aux]{\@@_macro_map:N} +% Applies |#1| to all macros. In the |pTF| case, this means going +% twice through the sequence \cs{l_@@_macro_input_seq}, once for the +% predicates and once for the |TF| variants. +% \begin{macrocode} +\cs_new_protected:Npn \@@_macro_map:N #1 + { + \bool_if:NT \l_@@_macro_pTF_bool + { + \bool_set_false:N \l_@@_macro_TF_bool + \seq_map_inline:Nn \l_@@_macro_input_seq + { + \tl_set:Nn \l_@@_tmpa_tl {##1} + \tl_replace_once:Noo \l_@@_tmpa_tl + { \tl_to_str:n { : } } { \tl_to_str:n { _p: } } + \exp_args:No #1 \l_@@_tmpa_tl + } + \bool_set_true:N \l_@@_macro_TF_bool + } + \seq_map_function:NN \l_@@_macro_input_seq #1 + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux]{\@@_macro_typeset:} +% This calls |\makelabel{}| % \begin{macrocode} -\tl_clear:N \l_@@_macro_tl -\cs_set_nopar:Npn \@@_print_macroname:n #1 - { - \strut - \HD@target - \int_compare:nTF { \tl_count:n {#1} <= 28 } - { \MacroFont } { \MacroLongFont } +\cs_new_protected_nopar:Npn \@@_macro_typeset: + { + \topsep\MacroTopsep + \trivlist + \cs_set:Npn \makelabel ##1 + { + \llap + { + \hbox_unpack_clear:N \l_@@_macro_index_box + \vtop to \baselineskip + { + \vbox_unpack_clear:N \l_@@_macro_box + \vss + } + } + } + \item [ ] + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_macro_single:n} +% Let's start to mess around with \cls{doc}'s \env{macro} environment. +% See \file{doc.dtx} for a full explanation of the original +% environment. It's rather \emph{enthusiastically} commented. +% \begin{arguments} +% \item Macro/function/whatever name; input has already been +% sanitised. +% \end{arguments} +% The assignment to \cs{saved@macroname} is used by \pkg{doc}'s +% \cs{changes} mechanism. +% \begin{macrocode} +\cs_new_protected:Npn \@@_macro_single:n #1 + { + \tl_set:Nn \saved@macroname {#1} - % INEFFICIENT: (!) - \exp_args:NNx \seq_if_in:NnTF \g_doc_functions_seq - { #1 \bool_if:NT \l_@@_macro_TF_bool { \tl_to_str:n {TF} } } - { - \hyperref [doc/function//\l_@@_macro_tl] - } - { \use:n } - { - \@@_macroname_prefix:n {#1} \@@_macroname_suffix: \ % space! - } - } + \@@_macro_typeset_one:n {#1} + \exp_args:Nx \@@_macro_index:n + { + #1 + \bool_if:NT \l_@@_macro_TF_bool { \tl_to_str:n { TF } } + } + } +\cs_new_protected:Npn \@@_macro_index:n #1 + { + \bool_if:NF \l_@@_macro_aux_bool + { \seq_gput_right:Nn \g_doc_macros_seq {#1} } + \hbox_set:Nn \l_@@_macro_index_box + { + % This box only contains targets... it seems inefficient. + \hbox_unpack_clear:N \l_@@_macro_index_box + \int_gincr:N \c@CodelineNo + \@@_special_index:nn {#1} { main } + \DoNotIndex {#1} + \int_gdecr:N \c@CodelineNo + } + } % \end{macrocode} % \end{macro} -% \end{environment} % -% \begin{macro}{\MacroLongFont} +% \begin{macro}[aux]{\@@_macro_typeset_one:n} +% For a long time, \cls{l3doc} collected the macro names as labels in +% the first items of nested \tn{trivlist}, but these were not closed +% properly with \tn{endtrivlist}. Also, it interacted in surprising +% ways with \pkg{hyperref} targets. Now, we collect typeset macro +% names by hand in the box \cs{l_@@_macro_box}. Note the space |\ |. % \begin{macrocode} -\providecommand \MacroLongFont - { - \fontfamily{lmtt}\fontseries{lc}\small - } +\cs_new_protected:Npn \@@_macro_typeset_one:n #1 + { + \vbox_set:Nn \l_@@_macro_box + { + \vbox_unpack_clear:N \l_@@_macro_box + \hbox { \llap { \@@_print_macroname:n {#1} \ } } + } + \int_incr:N \l_@@_macro_int + } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_typeset_TF:,\@@_typeset_aux:n} -% Used by \cs{doc_macro_single} and \cs{doc_showmacro_aux_ii:w} to typeset -% conditionals and auxiliary functions. +% \begin{macro}{\@@_print_macroname:n} % \begin{macrocode} -\cs_set_nopar:Npn \@@_typeset_TF: - { - \hyperlink{explTF} - { - \color{black} - \itshape TF - \makebox[0pt][r] - { - \color{red} - \underline { \phantom{\itshape TF} \kern-0.1em } - } - } - } -\cs_set_nopar:Npn \@@_typeset_aux:n #1 - { - { \color[gray]{0.7} #1 } - } +\cs_new_protected:Npn \@@_print_macroname:n #1 + { + \strut + \HD@target + + % TODO: INEFFICIENT(!) + \exp_args:NNx \seq_if_in:NnTF \g_doc_functions_seq + { #1 \bool_if:NT \l_@@_macro_TF_bool { \tl_to_str:n {TF} } } + { + \@@_get_hyper_target:nN {#1} \l_@@_tmpa_tl + \exp_last_unbraced:NNo \hyperref [ \l_@@_tmpa_tl ] + } + { \use:n } + { + \int_compare:nTF { \tl_count:n {#1} <= 28 } + { \MacroFont } { \MacroLongFont } + \@@_macroname_prefix:n {#1} \@@_macroname_suffix: + } + } +\cs_new_protected:Npn \@@_macroname_prefix:n #1 + { + \bool_if:NTF \l_@@_macro_aux_bool + { \@@_typeset_aux:n {#1} } {#1} + } +\cs_new_protected_nopar:Npn \@@_macroname_suffix: + { \bool_if:NTF \l_@@_macro_TF_bool { \@@_typeset_TF: } { } } % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_print_testfile:n} -% Used to show that a macro has a test, somewhere. +% \begin{macro}{\MacroLongFont} % \begin{macrocode} -\DeclareDocumentCommand \@@_print_testfile:n {m} - { - \bool_set_true:N \l_@@_tested_bool - \tl_if_eq:nnF {#1} {*} - { - \seq_if_in:NnF \g_@@_testfiles_seq {#1} - { - \seq_gput_right:Nn \g_@@_testfiles_seq {#1} - \par - \@@_print_testfile_aux:n {#1} - } - } - } +\providecommand \MacroLongFont + { + \fontfamily{lmtt}\fontseries{lc}\small + } % \end{macrocode} -% Text for displaying: +% \end{macro} +% +% \begin{macro}{\@@_print_testfile:n, \@@_print_testfile_aux:n} +% Used to show that a macro has a test, somewhere. % \begin{macrocode} +\cs_new_protected:Npn \@@_print_testfile:n #1 + { + \bool_set_true:N \l_@@_macro_tested_bool + \tl_if_eq:nnF {#1} {*} + { + \seq_if_in:NnF \g_@@_testfiles_seq {#1} + { + \seq_gput_right:Nn \g_@@_testfiles_seq {#1} + \par + \@@_print_testfile_aux:n {#1} + } + } + } \cs_new_protected:Npn \@@_print_testfile_aux:n #1 - { - \footnotesize - ( - \textit{ - The~ test~ suite~ for~ this~ command,~ - and~ others~ in~ this~ file,~ is~ \textsf{#1} - }. - )\par - } + { + \footnotesize + ( + \textit + { + The~ test~ suite~ for~ this~ command,~ + and~ others~ in~ this~ file,~ is~ \textsf{#1} + }. + )\par + } % \end{macrocode} % \end{macro} % % \begin{macro}{\TestFiles} % \begin{macrocode} \DeclareDocumentCommand \TestFiles {m} - { - \par - {\itshape - The~ following~ test~ files~ are~ used~ for~ this~ code:~ \textsf{#1}. + { + \par + \textit + { + The~ following~ test~ files~ are~ + used~ for~ this~ code:~ \textsf{#1}. + } + \par \ignorespaces } - \par\ignorespaces - } % \end{macrocode} % \end{macro} % % \begin{macro}{\UnitTested} % \begin{macrocode} -\DeclareDocumentCommand \UnitTested {} { \testfile* } +\DeclareDocumentCommand \UnitTested { } { \testfile* } % \end{macrocode} % \end{macro} % % \begin{macro}{\TestMissing} -% Note: There \cs{l_@@_macro_input_clist} may contain unconverted |@@|. -% \begin{macrocode} -\cs_generate_variant:Nn \prop_gput:Nnn {NVx} -\DeclareDocumentCommand \TestMissing {m} - { - \prop_if_in:NVTF \g_@@_missing_tests_prop \l_@@_macro_input_clist - { - \prop_get:NVN \g_@@_missing_tests_prop \l_@@_macro_input_clist \l_@@_tmpa_tl - \prop_gput:NVx \g_@@_missing_tests_prop \l_@@_macro_input_clist - { - *~ \l_@@_tmpa_tl - ^^J \exp_not:n {\space\space\space\space\space\space} - *~ #1 - } - } - { \prop_gput:NVn \g_@@_missing_tests_prop \l_@@_macro_input_clist {#1} } - } +% \begin{macrocode} +\DeclareDocumentCommand \TestMissing { m } + { \@@_test_missing:n {#1} } % \end{macrocode} % \end{macro} % -% \begin{variable}{\g_@@_module_name_tl} -% \begin{macro}[internal]{\@@_replace_at_at:N} -% \begin{macrocode} -\tl_new:N \g_@@_module_name_tl -\cs_new_protected:Npn \@@_replace_at_at:N #1 - { - \tl_if_empty:NF \g_@@_module_name_tl - { - \tl_replace_all:Non #1 { \token_to_str:N @ } { @ } - \tl_replace_all:Non #1 { \token_to_str:N _ } { _ } -% \end{macrocode} -% To make the search-and-replace work, in the source of l3doc -% itself the \verb|@@| search string needs to be protected from -% replacement by l3docstrip! This is easy to do by adding a space. +% \begin{macro}[aux]{\@@_test_missing:n} +% Keys in \cs{g_@@_missing_tests_prop} are lists of macros given as +% arguments of one \env{macro} environment. Values are comma lists of +% filenames (Bruno thinks). % \begin{macrocode} - \tl_replace_all:Nox #1 { _@ @ } { __ \g_@@_module_name_tl } - \tl_replace_all:Nox #1 { @ @ } { __ \g_@@_module_name_tl } - } - } -\cs_generate_variant:Nn \tl_replace_all:Nnn { Non, Nox } +\cs_new_protected:Npn \@@_test_missing:n #1 + { + \tl_set:Nx \l_@@_tmpb_tl + { \seq_use:Nn \l_@@_macro_input_seq { , } } + \prop_if_in:NVTF \g_@@_missing_tests_prop \l_@@_tmpb_tl + { + \prop_get:NVN \g_@@_missing_tests_prop \l_@@_tmpb_tl + \l_@@_tmpa_tl + } + { \tl_clear:N \l_@@_tmpa_tl } + \clist_set:Nx \l_@@_tmpa_clist { \l_@@_tmpa_tl , #1 } + \prop_gput:NVV \g_@@_missing_tests_prop \l_@@_tmpb_tl + \l_@@_tmpa_clist + } % \end{macrocode} % \end{macro} -% \end{variable} % -% \begin{macro}{\endmacro} -% The \cs{doc_endmacro_wrap_each:N} puts each item of the sequence |#1| -% in \cs{texttt} font and with a trailing TF if needed. This should -% go inline in the definition of \cs{endmacro}, but somehow the |#| -% doesn't go through some \LaTeXe{} internals. -% \begin{macrocode} -\cs_new_protected:Nn \@@_endmacro_build_seq:N - { - \seq_gclear:N #1 - \clist_map_inline:Nn \l_@@_macro_input_clist - { - \tl_set:Nn \l_@@_tmpa_tl {##1} - \@@_replace_at_at:N \l_@@_tmpa_tl - \seq_gput_right:No #1 { \l_@@_tmpa_tl } - } - } -\cs_set_protected:Nn \@@_endmacro_wrap_each:N - { - \bool_if:NTF \l_@@_macro_TF_bool - { \seq_gset_map:NNn #1 #1 { \exp_not:N \texttt { ##1 TF } } } - { \seq_gset_map:NNn #1 #1 { \exp_not:N \texttt { ##1 } } } - } -\cs_set:Nn \@@_texttt_comma:n {\,,~\texttt{#1}} -\cs_set:Npn \endmacro - { - \int_compare:nT { \g_@@_nested_macro_int < 1 } - { - \par\nobreak\noindent{\footnotesize(\emph{ - End~ definition~ for~ - \@@_endmacro_build_seq:N \g_@@_tmpa_seq - \@@_endmacro_wrap_each:N \g_@@_tmpa_seq - \int_compare:nTF { \seq_count:N \g_@@_tmpa_seq <= 3 } +% \begin{macro}[aux]{\@@_macro_end:} +% It is too late for anyone to declare a test file for this macro, so +% we can check now whether the macro is tested. If the \env{macro} +% environment which is being ended is the outermost one, then wrap +% each macro in \tn{texttt} (with the addition of |TF| if relevant) +% and typeset two informations: that this ends the definition of some +% macros, and that they are documented on some page. +% \begin{macrocode} +\cs_new_protected:Npn \@@_macro_end: + { + \endtrivlist + \@@_macro_end_check_tested: + \int_compare:nNnT \l_@@_nested_macro_int = 1 { - \seq_use:Nnnn \g_@@_tmpa_seq - { \,~and~ } { \,,~ } { \,,~and~ } - \@. + \@@_macro_end_style:n + { + \@@_print_end_definition: + \@@_print_documented: + } } - { \seq_item:Nn \g_@@_tmpa_seq {1}\,~and~others. } - + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux]{\@@_macro_end_check_tested:} +% If the |checktest| option was issued and the macro is not an +% auxiliary nor a variable (and it does not have a test), then add it +% to the sequence of non-tested macros. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_macro_end_check_tested: + { \bool_if:nT { - !\l_@@_macro_aux_bool && - !\l_@@_macro_internal_bool && - \int_compare_p:n {\g_@@_nested_macro_int<1} + \g_@@_checktest_bool && + ! \l_@@_macro_aux_bool && + ! \l_@@_macro_var_bool && + ! \l_@@_macro_tested_bool } { - \int_compare:nNnTF \l_@@_macro_int=1 {~This~} {~These~} - \bool_if:NTF \l_@@_macro_var_bool{variable}{function} - \int_compare:nNnTF \l_@@_macro_int=1 {~is~}{s~are~} - documented~on~page~ - \exp_args:Nx\pageref{doc/function//\l_@@_macro_tl}. - } - })\par} - } - - \bool_if:nT - { - \g_@@_checktest_bool && - !( \l_@@_macro_aux_bool || \l_@@_macro_var_bool ) && - !\l_@@_tested_bool - } - { - \seq_gput_right:Nx \g_@@_not_tested_seq - { - \seq_use:Nnnn \g_@@_tmpa_seq { , } { , } { , } - \bool_if:NT \l_@@_macro_pTF_bool {~(pTF)} - \bool_if:NT \l_@@_macro_TF_bool {~(TF)} + \seq_gput_right:Nx \g_@@_not_tested_seq + { + \seq_use:Nn \l_@@_macro_input_seq { , } + \bool_if:NTF \l_@@_macro_pTF_bool {~(pTF)} + { \bool_if:NT \l_@@_macro_TF_bool {~(TF)} } + } } - } - } + } % \end{macrocode} % \end{macro} % -% \begin{environment}{macrocode} -% \begin{macro}[aux]{\@@_xmacro_code:n} -% Hook into the \texttt{macrocode} environment in a dirty way: -% \cs{xmacro@code} is responsible for grabbing (and tokenizing) the -% body of the environment. Redefine it to pass what it grabs to -% \cs{doc_xparse_code:n}. This new macro replaces all |@@| by the -% appropriate module name. One exceptional case is the -% |<@@=|\meta{module}|>| lines themselves, where |@@| should not be -% modified. Actually, we search for such lines, to set the module -% name automatically. We need to be careful: no |<@@=| should appear -% as such in the code below since \pkg{l3doc} is also typeset using -% this code. +% \begin{macro}[aux]{\@@_macro_end_style:n} +% Style for the extra information at the end of a top-level +% \env{macro} environment. % \begin{macrocode} -\group_begin: - \char_set_catcode_escape:N \/ - \char_set_catcode_other:N \^^A - \char_set_catcode_active:N \^^S - \char_set_catcode_active:N \^^B - \char_set_catcode_other:N \^^L - \char_set_catcode_other:N \^^R - \char_set_lccode:nn { `\^^A } { `\% } - \char_set_lccode:nn { `\^^S } { `\ } - \char_set_lccode:nn { `\^^B } { `\\ } - \char_set_lccode:nn { `\^^L } { `\{ } - \char_set_lccode:nn { `\^^R } { `\} } - \tl_to_lowercase:n - { +\cs_new_protected:Npn \@@_macro_end_style:n #1 + { + \nobreak \noindent + { \footnotesize ( \emph{#1} ) \par } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux] +% { +% \@@_print_end_definition:, +% \@@_macro_end_wrap_items:N, +% \@@_print_documented: +% } +% Surround each item by \tn{texttt} and |TF| if needed, replacing |_| +% by \tn{_} as well. Then list the +% macro names through \cs{seq_use:Nnnn}, unless there are too many. +% Finally, if the macro is neither auxiliary nor internal, add a link +% to where it is documented. +% \begin{macrocode} +\cs_new_protected:Npn \@@_macro_end_wrap_items:N #1 + { + \bool_if:NT \l_@@_macro_TF_bool + { \seq_set_map:NNn #1 #1 { ##1 TF } } + \seq_set_map:NNn #1 #1 + { + \exp_not:n + { + \tl_set:Nn \l_@@_tmpa_tl {##1} + \tl_replace_all:Non \l_@@_tmpa_tl + { \token_to_str:N _ } { \_ } + \texttt { \l_@@_tmpa_tl } + } + } + } +\cs_new_protected_nopar:Npn \@@_print_end_definition: + { + \group_begin: + \@@_macro_end_wrap_items:N \l_@@_macro_input_seq + End~ definition~ for~ + \int_compare:nTF { \seq_count:N \l_@@_macro_input_seq <= 3 } + { + \seq_use:Nnnn \l_@@_macro_input_seq + { \,~and~ } { \,,~ } { \,,~and~ } + \@. + } + { \seq_item:Nn \l_@@_macro_input_seq {1}\,~and~others. } \group_end: - \cs_set_protected:Npn \xmacro@code - #1 ^^A ^^S^^S^^S^^S ^^Bend ^^Lmacrocode^^R - { \@@_xmacro_code:n {#1} /end{macrocode} } - } -\group_begin: - \char_set_catcode_active:N \< - \char_set_catcode_active:N \> - \cs_new_protected:Npn \@@_xmacro_code:n #1 - { - \tl_if_in:nnTF {#1} { < @ @ = } - { \@@_xmacro_code:w #1 \q_stop } - { - \tl_set:Nn \l_@@_tmpa_tl {#1} - \@@_replace_at_at:N \l_@@_tmpa_tl - \tl_use:N \l_@@_tmpa_tl - } - } - \cs_new_protected:Npn \@@_xmacro_code:w #1 < @ @ = #2 > #3 \q_stop - { - \tl_set:Nn \l_@@_tmpa_tl {#1} - \@@_replace_at_at:N \l_@@_tmpa_tl - - \tl_gset:Nn \g_@@_module_name_tl {#2} - \tl_put_right:Nn \l_@@_tmpa_tl { < @ @ = #2 > } - - \tl_set:Nn \l_@@_tmpb_tl {#3} - \@@_replace_at_at:N \l_@@_tmpb_tl - \tl_put_right:No \l_@@_tmpa_tl { \l_@@_tmpb_tl } - - \tl_use:N \l_@@_tmpa_tl - } -\group_end: + } +\cs_new_protected_nopar:Npn \@@_print_documented: + { + \bool_if:nT + { + ! \l_@@_macro_aux_bool && + ! \l_@@_macro_internal_bool + } + { + \int_set:Nn \l_@@_tmpa_int + { \seq_count:N \l_@@_macro_input_seq } + \int_compare:nNnTF \l_@@_tmpa_int = 1 {~This~} {~These~} + \bool_if:NTF \l_@@_macro_var_bool {variable} {function} + \int_compare:nNnTF \l_@@_tmpa_int = 1 {~is~} {s~are~} + documented~on~page~ + \exp_args:Nx \@@_get_hyper_target:nN + { \seq_item:Nn \l_@@_macro_input_seq { 1 } } + \l_@@_tmpa_tl + \exp_args:Nx \pageref { \l_@@_tmpa_tl } . + } + } % \end{macrocode} % \end{macro} -% \end{environment} +% +% \subsubsection{Common between \env{macro} and \env{function}} +% +% \begin{macro}{\@@_typeset_TF:, \@@_typeset_aux:n} +% Used by \cs{@@_macro_single:n} and in the \env{function} environment +% to typeset conditionals and auxiliary functions. +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_typeset_TF: + { + \hyperlink{explTF} + { + \color{black} + \itshape TF + \makebox[0pt][r] + { + \color{red} + \underline { \phantom{\itshape TF} \kern-0.1em } + } + } + } +\cs_new_protected:Npn \@@_typeset_aux:n #1 + { + { \color[gray]{0.7} #1 } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_get_hyper_target:nN} +% Create a \pkg{hyperref} anchor from a macro name~|#1| and stores it +% in the token list variable~|#2|. For instance, |\prg_replicate:nn| +% gives |doc/function//prg/replicate:nn|. +% \begin{macrocode} +\cs_new_protected:Npn \@@_get_hyper_target:nN #1#2 + { + \tl_set:Nx #2 + { + \tl_to_str:n {#1} + \bool_if:NT \l_@@_macro_TF_bool { \tl_to_str:n {TF} } + } + \tl_replace_all:Nxn #2 { \iow_char:N \_ } { / } + \tl_remove_all:Nx #2 { \iow_char:N \\ } + \tl_put_left:Nn #2 { doc/function// } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Misc} % % \begin{macro}{\DescribeOption} -% For describing package options. Due to Joseph Wright. -% Name/usage might change soon. +% For describing package options. Due to Joseph Wright. Name/usage +% might change soon. % \begin{macrocode} \newcommand*{\DescribeOption} - { - \leavevmode - \@bsphack - \begingroup - \MakePrivateLetters - \Describe@Option - } + { + \leavevmode + \@bsphack + \begingroup + \MakePrivateLetters + \Describe@Option + } % \end{macrocode} % % \begin{macrocode} \newcommand*{\Describe@Option}[1] - { - \endgroup - \marginpar{ - \raggedleft - \PrintDescribeEnv{#1} + { + \endgroup + \marginpar{ + \raggedleft + \PrintDescribeEnv{#1} + } + \SpecialOptionIndex{#1} + \@esphack + \ignorespaces } - \SpecialOptionIndex{#1} - \@esphack - \ignorespaces - } % \end{macrocode} % % \begin{macrocode} \newcommand*{\SpecialOptionIndex}[1] - { - \@bsphack - \begingroup - \HD@target - \let\HDorg@encapchar\encapchar - \edef\encapchar usage - { - \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage} - } - \index - { - #1\actualchar{\protect\ttfamily#1}~(option) - \encapchar usage - } - \index - { - options:\levelchar#1\actualchar{\protect\ttfamily#1} - \encapchar usage - } - \endgroup - \@esphack - } + { + \@bsphack + \begingroup + \HD@target + \let\HDorg@encapchar\encapchar + \edef\encapchar usage + { + \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage} + } + \index + { + #1\actualchar{\protect\ttfamily#1}~(option) + \encapchar usage + } + \index + { + options:\levelchar#1\actualchar{\protect\ttfamily#1} + \encapchar usage + } + \endgroup + \@esphack + } % \end{macrocode} % \end{macro} % @@ -1914,52 +2647,51 @@ Do not distribute a modified version of this file. % % \begin{environment}{danger} % \begin{environment}{ddanger} -% \begin{syntax} -% |\begin{[d]danger}|\\ -% dangerous code\\ -% |\end{[d]danger}| -% \end{syntax} -% -% \begin{danger} -% Provides a danger bend, as known from the \TeX{}book. -% \end{danger} -% The actual character from the font |manfnt|: +% \begin{syntax} +% |\begin{[d]danger}|\\ +% dangerous code\\ +% |\end{[d]danger}| +% \end{syntax} +% \begin{danger} +% Provides a danger bend, as known from the \TeX{}book. +% \end{danger} +% The actual character from the font |manfnt|: % \begin{macrocode} -\font\manual=manfnt -\cs_set_nopar:Npn \dbend { {\manual\char127} } +\font \manual = manfnt \scan_stop: +\cs_gset_nopar:Npn \dbend { {\manual\char127} } % \end{macrocode} % -% Defines the single danger bend. Use it whenever there is a feature in your -% package that might be tricky to use. -% FIXME: Has to be fixed when in combination with a macro-definition. +% Defines the single danger bend. Use it whenever there is a feature in +% your package that might be tricky to use. FIXME: Has to be fixed when +% in combination with a macro-definition. % \begin{macrocode} \newenvironment {danger} - { - \begin{trivlist}\item[]\noindent - \begingroup\hangindent=2pc\hangafter=-2 - \cs_set_nopar:Npn \par{\endgraf\endgroup} - \hbox to0pt{\hskip-\hangindent\dbend\hfill}\ignorespaces - } - { - \par\end{trivlist} - } + { + \begin{trivlist}\item[]\noindent + \begingroup\hangindent=2pc\hangafter=-2 + \cs_set_nopar:Npn \par{\endgraf\endgroup} + \hbox to0pt{\hskip-\hangindent\dbend\hfill}\ignorespaces + } + { + \par\end{trivlist} + } % \end{macrocode} % % \begin{ddanger} -% Use the double danger bend if there is something which could cause serious -% problems when used in a wrong way. Better the normal user does not know -% about such things. +% Use the double danger bend if there is something which could cause +% serious problems when used in a wrong way. Better the normal user +% does not know about such things. % \end{ddanger} % \begin{macrocode} \newenvironment {ddanger} - { - \begin{trivlist}\item[]\noindent - \begingroup\hangindent=3.5pc\hangafter=-2 - \cs_set_nopar:Npn \par{\endgraf\endgroup} - \hbox to0pt{\hskip-\hangindent\dbend\kern2pt\dbend\hfill}\ignorespaces - }{ - \par\end{trivlist} - } + { + \begin{trivlist}\item[]\noindent + \begingroup\hangindent=3.5pc\hangafter=-2 + \cs_set_nopar:Npn \par{\endgraf\endgroup} + \hbox to0pt{\hskip-\hangindent\dbend\kern2pt\dbend\hfill}\ignorespaces + }{ + \par\end{trivlist} + } % \end{macrocode} % \end{environment} % \end{environment} @@ -1968,65 +2700,65 @@ Do not distribute a modified version of this file. % % \begin{macrocode} \newenvironment{TemplateInterfaceDescription}[1] - { - \subsection{The~object~type~`#1'} - \begingroup - \@beginparpenalty\@M - \description - \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par} - \def\TemplateSemantics - { - \enddescription\endgroup - \subsubsection*{Semantics:} - } - } - { - \par\bigskip - } + { + \subsection{The~object~type~`#1'} + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par} + \def\TemplateSemantics + { + \enddescription\endgroup + \subsubsection*{Semantics:} + } + } + { + \par\bigskip + } % \end{macrocode} % % \begin{macrocode} \newenvironment{TemplateDescription}[2] { - \subsection{The~template~`#2'~(object~type~#1)} - \subsubsection*{Attributes:} - \begingroup - \@beginparpenalty\@M - \description - \def\TemplateKey##1##2##3##4 - { - \item[##1~(##2)]##3% - \ifx\TemplateKey##4\TemplateKey\else + \subsection{The~template~`#2'~(object~type~#1)} + \subsubsection*{Attributes:} + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateKey##1##2##3##4 + { + \item[##1~(##2)]##3% + \ifx\TemplateKey##4\TemplateKey\else % \hskip0ptplus3em\penalty-500\hskip 0pt plus 1filll Default:~##4% - \hfill\penalty500\hbox{}\hfill Default:~##4% - \nobreak\hskip-\parfillskip\hskip0pt\relax - \fi - \par - } - \def\TemplateSemantics - { - \enddescription\endgroup - \subsubsection*{Semantics~\&~Comments:} - } + \hfill\penalty500\hbox{}\hfill Default:~##4% + \nobreak\hskip-\parfillskip\hskip0pt\relax + \fi + \par + } + \def\TemplateSemantics + { + \enddescription\endgroup + \subsubsection*{Semantics~\&~Comments:} + } } - {\par\bigskip} + { \par \bigskip } % \end{macrocode} % % \begin{macrocode} \newenvironment{InstanceDescription}[4][xxxxxxxxxxxxxxx] { - \subsubsection{The~instance~`#3'~(template~#2/#4)} - \subsubsection*{Attribute~values:} - \begingroup - \@beginparpenalty\@M - \def\InstanceKey##1##2{\>\textbf{##1}\>##2\\} - \def\InstanceSemantics{\endtabbing\endgroup - \vskip-30pt\vskip0pt - \subsubsection*{Layout~description~\&~Comments:}} - \tabbing - xxxx\=#1\=\kill + \subsubsection{The~instance~`#3'~(template~#2/#4)} + \subsubsection*{Attribute~values:} + \begingroup + \@beginparpenalty\@M + \def\InstanceKey##1##2{\>\textbf{##1}\>##2\\} + \def\InstanceSemantics{\endtabbing\endgroup + \vskip-30pt\vskip0pt + \subsubsection*{Layout~description~\&~Comments:}} + \tabbing + xxxx\=#1\=\kill } - {\par\bigskip} + { \par \bigskip } % \end{macrocode} % % \subsection{Inheriting doc} @@ -2034,186 +2766,251 @@ Do not distribute a modified version of this file. % Code here is taken from \pkg{doc}, stripped of comments and translated % into \pkg{expl3} syntax. New features are added in various places. % -% \begin{macro}{\StopEventually,\Finale,\AlsoImplementation,\OnlyDescription} -% \begin{macrocode} -\cs_set_nopar:Npn \AlsoImplementation - { - \bool_set_true:N \g_@@_implementation_bool - \cs_set:Npn \StopEventually ##1 - { - \@bsphack - \cs_gset_nopar:Npn \Finale { ##1 \check@checksum } - \init@checksum - \@esphack - } - } -\AlsoImplementation -\cs_set_nopar:Npn \OnlyDescription - { - \@bsphack - \bool_set_false:N \g_@@_implementation_bool - \cs_set:Npn \StopEventually ##1 { ##1 \endinput } - \@esphack - } -\cs_set_eq:NN \Finale \relax +% \begin{macro} +% {\StopEventually, \Finale, \AlsoImplementation, \OnlyDescription} +% \begin{variable}[aux]{\g_@@_finale_tl} +% TODO: remove these four commands altogether, document that it is +% better to use the \env{documentation} and \env{implementation} +% environments. +% \begin{macrocode} +\DeclareDocumentCommand \OnlyDescription { } + { \bool_gset_false:N \g_@@_typeset_implementation_bool } +\DeclareDocumentCommand \AlsoImplementation { } + { \bool_gset_true:N \g_@@_typeset_implementation_bool } +\DeclareDocumentCommand \StopEventually { m } + { + \bool_if:NTF \g_@@_typeset_implementation_bool + { + \@bsphack + \tl_gset:Nn \g_@@_finale_tl { #1 \check@checksum } + \init@checksum + \@esphack + } + { #1 \endinput } + } +\DeclareDocumentCommand \Finale { } + { \tl_use:N \g_@@_finale_tl } +\tl_new:N \g_@@_finale_tl % \end{macrocode} +% \end{variable} % \end{macro} % +% \begin{macro}[aux]{\@@_input:n} +% Inputting a file, with some setup: the module name should be empty +% before the first |<@@=|\meta{module}|>| line in the file. % \begin{macrocode} -\cs_set_nopar:Npn \partname{File} +\cs_new_protected:Npn \@@_input:n #1 + { + \tl_gclear:N \g_@@_module_name_tl + \MakePercentIgnore + \input{#1} + \MakePercentComment + } % \end{macrocode} +% \end{macro} % % \begin{macro}{\DocInput} -% From \pkg{doc}. Now accepts comma-list input (who has commas in filenames?). +% Modified from \pkg{doc} to accept comma-list input (who has commas +% in filenames?). % \begin{macrocode} -\cs_set:Npn \DocInput #1 - { - \clist_map_inline:nn {#1} - { - \clist_put_right:Nn \g_docinput_clist {##1} - \tl_gclear:N \g_@@_module_name_tl - \MakePercentIgnore - \input{##1} - \MakePercentComment - } - } +\DeclareDocumentCommand \DocInput { m } + { + \clist_map_inline:nn {#1} + { + \clist_put_right:Nn \g_docinput_clist {##1} + \@@_input:n {##1} + } + } % \end{macrocode} % \end{macro} % % \begin{macro}{\DocInputAgain} -% Uses "\g_docinput_clist" to re-input whatever's already been "\DocInput"-ed until now. -% May be used multiple times. +% Uses \cs{g_docinput_clist} to re-input whatever's already been +% \tn{DocInput}-ed until now. May be used multiple times. % \begin{macrocode} -\cs_set:Npn \DocInputAgain - { - \clist_map_inline:Nn \g_docinput_clist - { - \MakePercentIgnore - \tl_gclear:N \g_@@_module_name_tl - \input{##1} - \MakePercentComment - } - } +\DeclareDocumentCommand \DocInputAgain { } + { \clist_map_function:NN \g_docinput_clist \@@_input:n } % \end{macrocode} % \end{macro} % % \begin{macro}{\DocInclude} -% More or less exactly the same as |\include|, but uses |\DocInput| -% on a |dtx| file, not |\input| on a |tex| file. -% \begin{macrocode} -\cs_set_nopar:Npn \partname{File} -% \end{macrocode} -% -% \begin{macrocode} -\newcommand*{\DocInclude}[1] - { - \relax\clearpage - \docincludeaux - \IfFileExists{#1.fdd} - { \cs_set_nopar:Npn \currentfile{#1.fdd} } - { \cs_set_nopar:Npn \currentfile{#1.dtx} } - \ifnum\@auxout=\@partaux - \@latexerr{\string\include\space cannot~be~nested}\@eha - \else - \@docinclude #1 - \fi - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_set_nopar:Npn \@docinclude #1 - { - \clearpage - \immediate\write\@mainaux{\string\@input{#1.aux}} - \@tempswatrue - \if@partsw - \@tempswafalse - \cs_set_nopar:Npx \@tempb{#1} - \@for\@tempa:=\@partlist\do - { - \ifx\@tempa\@tempb\@tempswatrue\fi - } - \fi - \if@tempswa - \cs_set_eq:NN \@auxout\@partaux - \immediate\openout\@partaux #1.aux - \immediate\write\@partaux{\relax} - \cs_set_eq:NN \@ltxdoc@PrintIndex\PrintIndex - \cs_set_eq:NN \PrintIndex\relax - \cs_set_eq:NN \@ltxdoc@PrintChanges\PrintChanges - \cs_set_eq:NN \PrintChanges\relax - \cs_set_eq:NN \@ltxdoc@theglossary\theglossary - \cs_set_eq:NN \@ltxdoc@endtheglossary\endtheglossary - \part{\currentfile} - { - \cs_set_eq:NN \ttfamily\relax - \cs_gset_nopar:Npx \filekey{\filekey, \thepart={\ttfamily\currentfile}} - } - \DocInput{\currentfile} - \cs_set_eq:NN \PrintIndex\@ltxdoc@PrintIndex - \cs_set_eq:NN \PrintChanges\@ltxdoc@PrintChanges - \cs_set_eq:NN \theglossary\@ltxdoc@theglossary - \cs_set_eq:NN \endtheglossary\@ltxdoc@endtheglossary +% More or less exactly the same as \tn{include}, but uses +% \tn{DocInput} on a \file{.dtx} file, not \tn{input} on a \file{.tex} +% file. +% +% \begin{macrocode} +\NewDocumentCommand \DocInclude { m } + { + \relax\clearpage + \docincludeaux + \IfFileExists{#1.fdd} + { \cs_set_nopar:Npn \currentfile{#1.fdd} } + { \cs_set_nopar:Npn \currentfile{#1.dtx} } + \int_compare:nNnTF \@auxout = \@partaux + { \@latexerr{\string\include\space cannot~be~nested}\@eha } + { \@docinclude #1 } + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_gset:Npn \@docinclude #1 + { \clearpage - \@writeckpt{#1} - \immediate\closeout\@partaux - \else - \@nameuse{cp@#1} - \fi - \cs_set_eq:NN \@auxout\@mainaux - } + \immediate\write\@mainaux{\string\@input{#1.aux}} + \@tempswatrue + \if@partsw + \@tempswafalse + \cs_set_nopar:Npx \@tempb{#1} + \@for\@tempa:=\@partlist\do + { + \ifx\@tempa\@tempb\@tempswatrue\fi + } + \fi + \if@tempswa + \cs_set_eq:NN \@auxout \@partaux + \immediate\openout\@partaux #1.aux + \immediate\write\@partaux{\relax} + \cs_set_eq:NN \@ltxdoc@PrintIndex \PrintIndex + \cs_set_eq:NN \PrintIndex \relax + \cs_set_eq:NN \@ltxdoc@PrintChanges \PrintChanges + \cs_set_eq:NN \PrintChanges \relax + \cs_set_eq:NN \@ltxdoc@theglossary \theglossary + \cs_set_eq:NN \@ltxdoc@endtheglossary \endtheglossary + \part{\currentfile} + { + \cs_set_eq:NN \ttfamily\relax + \cs_gset_nopar:Npx \filekey + { \filekey, \thepart = { \ttfamily \currentfile } } + } + \DocInput{\currentfile} + \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex + \cs_set_eq:NN \PrintChanges \@ltxdoc@PrintChanges + \cs_set_eq:NN \theglossary \@ltxdoc@theglossary + \cs_set_eq:NN \endtheglossary \@ltxdoc@endtheglossary + \clearpage + \@writeckpt{#1} + \immediate \closeout \@partaux + \else + \@nameuse{cp@#1} + \fi + \cs_set_eq:NN \@auxout \@mainaux + } % \end{macrocode} % % \begin{macrocode} -\cs_gset_nopar:Npn \codeline@wrindex #1 - { - \immediate\write\@indexfile - { - \string\indexentry{#1} - { \filesep \int_use:N \c@CodelineNo } - } - } +\cs_gset:Npn \codeline@wrindex #1 + { + \immediate\write\@indexfile + { + \string\indexentry{#1} + { \filesep \int_use:N \c@CodelineNo } + } + } +\tl_gclear:N \filesep % \end{macrocode} % \end{macro} % +% \begin{macro}{\docincludeaux} % \begin{macrocode} -\cs_set_eq:NN \filesep \@empty +\cs_gset_nopar:Npn \docincludeaux + { + \tl_set:Nn \thepart { \alphalph { part } } + \tl_set:Nn \filesep { \thepart - } + \cs_set_eq:NN \filekey \use_none:n + \tl_gput_right:Nn \index@prologue + { + \cs_gset_nopar:Npn \@oddfoot + { + \parbox { \textwidth } + { + \strut \footnotesize + \raggedright { \bfseries File~Key: } ~ \filekey + } + } + \cs_set_eq:NN \@evenfoot \@oddfoot + } + \cs_gset_eq:NN \docincludeaux \relax + \cs_gset_nopar:Npn \@oddfoot + { + \cs_if_exist:cTF { ver @ \currentfile } + { File~\thepart :~{\ttfamily\currentfile}~ } + { + \GetFileInfo{\currentfile} + File~\thepart :~{\ttfamily\filename}~ + Date:~\ExplFileDate\ % space + Version~\ExplFileVersion + } + \hfill \thepage + } + \cs_set_eq:NN \@evenfoot \@oddfoot + } % \end{macrocode} +% \end{macro} % -% \begin{macro}{\docincludeaux} +% \subsubsection{The \env{macrocode} environment} +% +% \begin{macro}[aux]{\xmacro@code, \@@_xmacro_code:n, \@@_xmacro_code:w} +% Hook into the \texttt{macrocode} environment in a dirty way: +% \tn{xmacro@code} is responsible for grabbing (and tokenizing) the +% body of the environment. Redefine it to pass what it grabs to +% \cs{@@_xmacro_code:n}. This new macro replaces all |@@| by the +% appropriate module name. One exceptional case is the +% |<@@=|\meta{module}|>| lines themselves, where |@@| should not be +% modified. Actually, we search for such lines, to set the module +% name automatically. We need to be careful: no |<@@=| should appear +% as such in the code below since \pkg{l3doc} is also typeset using +% this code. +% TODO: right now, in a line containing |<@@=|\meta{module}|>|, the +% |@@| are replaced (using different values of the \meta{module} +% before and after the assignment). Is this a waste? % \begin{macrocode} -\cs_set_nopar:Npn \docincludeaux - { - \cs_set_nopar:Npn \thepart {\alphalph{part}} - \cs_set_nopar:Npn \filesep {\thepart-} - \cs_set_eq:NN \filekey\@gobble - \g@addto@macro\index@prologue - { - \cs_gset_nopar:Npn\@oddfoot - { - \parbox{\textwidth} - { - \strut\footnotesize - \raggedright{\bfseries File~Key:}~\filekey - } - } - \cs_set_eq:NN \@evenfoot\@oddfoot - } - \cs_gset_eq:NN \docincludeaux\relax - \cs_gset_nopar:Npn\@oddfoot - { - \expandafter\ifx\csname ver@\currentfile\endcsname\relax - File~\thepart :~{\ttfamily\currentfile}~ - \else - \GetFileInfo{\currentfile} - File~\thepart :~{\ttfamily\filename}~ - Date:~\ExplFileDate\ % space - Version~\ExplFileVersion - \fi - \hfill\thepage - } - \cs_set_eq:NN \@evenfoot \@oddfoot - } +\group_begin: + \char_set_catcode_escape:N \/ + \char_set_catcode_other:N \^^A + \char_set_catcode_active:N \^^S + \char_set_catcode_active:N \^^B + \char_set_catcode_other:N \^^L + \char_set_catcode_other:N \^^R + \char_set_lccode:nn { `\^^A } { `\% } + \char_set_lccode:nn { `\^^S } { `\ } + \char_set_lccode:nn { `\^^B } { `\\ } + \char_set_lccode:nn { `\^^L } { `\{ } + \char_set_lccode:nn { `\^^R } { `\} } + \tl_to_lowercase:n + { + \group_end: + \cs_set_protected:Npn \xmacro@code + #1 ^^A ^^S^^S^^S^^S ^^Bend ^^Lmacrocode^^R + { \@@_xmacro_code:n {#1} /end{macrocode} } + } +\group_begin: + \char_set_catcode_active:N \< + \char_set_catcode_active:N \> + \cs_new_protected:Npn \@@_xmacro_code:n #1 + { + \tl_if_in:nnTF {#1} { < @ @ = } + { \@@_xmacro_code:w #1 \q_stop } + { + \tl_set:Nn \l_@@_tmpa_tl {#1} + \@@_replace_at_at:N \l_@@_tmpa_tl + \tl_use:N \l_@@_tmpa_tl + } + } + \cs_new_protected:Npn \@@_xmacro_code:w #1 < @ @ = #2 > #3 \q_stop + { + \tl_set:Nn \l_@@_tmpa_tl {#1} + \@@_replace_at_at:N \l_@@_tmpa_tl + + \tl_gset:Nn \g_@@_module_name_tl {#2} + \tl_put_right:Nn \l_@@_tmpa_tl { < @ @ = #2 > } + + \tl_set:Nn \l_@@_tmpb_tl {#3} + \@@_replace_at_at:N \l_@@_tmpb_tl + \tl_put_right:No \l_@@_tmpa_tl { \l_@@_tmpb_tl } + + \tl_use:N \l_@@_tmpa_tl + } +\group_end: % \end{macrocode} % \end{macro} % @@ -2226,195 +3023,433 @@ Do not distribute a modified version of this file. % \end{macrocode} % % \begin{macrocode} -\cs_new_nopar:Npn \@@_show_functions_defined: - { - \bool_if:nT { \g_@@_implementation_bool && \g_@@_checkfunc_bool } - { - \typeout{ ======================================== ^^J } - \iow_open:Nn \g_@@_func_iow { \c_job_name_tl .cmds } - - \tl_clear:N \l_@@_tmpa_tl - \seq_map_inline:Nn \g_doc_functions_seq - { - \seq_if_in:NnT \g_doc_macros_seq {##1} - { - \tl_put_right:Nn \l_@@_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g_@@_func_iow { > ~ ##1 } - } - } - - \@@_functions_typeout:n - { - Functions~both~documented~and~defined:^^J - (In~order~of~being~documented) - } - - \seq_map_inline:Nn \g_doc_functions_seq - { - \seq_if_in:NnF \g_doc_macros_seq {##1} - { - \tl_put_right:Nn \l_@@_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g_@@_func_iow { ! ~ ##1} - } - } - \@@_functions_typeout:n { Functions~documented~but~not~defined: } +\tl_new:N \l_@@_doc_def_tl +\tl_new:N \l_@@_doc_undef_tl +\tl_new:N \l_@@_undoc_def_tl +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_show_functions_defined: + { + \bool_if:nT + { \g_@@_typeset_implementation_bool && \g_@@_checkfunc_bool } + { + \iow_term:x { \c_@@_iow_separator_tl \iow_newline: } + \iow_open:Nn \g_@@_func_iow { \c_job_name_tl .cmds } - \seq_map_inline:Nn \g_doc_macros_seq - { - \seq_if_in:NnF \g_doc_functions_seq {##1} - { - \tl_put_right:Nn \l_@@_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g_@@_func_iow { ? ~ ##1} - } - } - \@@_functions_typeout:n { Functions~defined~but~not~documented: } + \tl_clear:N \l_@@_doc_def_tl + \tl_clear:N \l_@@_doc_undef_tl + \tl_clear:N \l_@@_undoc_def_tl + \seq_map_inline:Nn \g_doc_functions_seq + { + \seq_if_in:NnTF \g_doc_macros_seq {##1} + { + \tl_put_right:Nx \l_@@_doc_def_tl + { ##1 \iow_newline: } + \iow_now:Nn \g_@@_func_iow { > ~ ##1 } + } + { + \tl_put_right:Nx \l_@@_doc_undef_tl + { ##1 \iow_newline: } + \iow_now:Nn \g_@@_func_iow { ! ~ ##1 } + } + } + \seq_map_inline:Nn \g_doc_macros_seq + { + \seq_if_in:NnF \g_doc_functions_seq {##1} + { + \tl_put_right:Nx \l_@@_undoc_def_tl + { ##1 \iow_newline: } + \iow_now:Nn \g_@@_func_iow { ? ~ ##1 } + } + } + \@@_functions_typeout:nN + { + Functions~both~documented~and~defined: \iow_newline: + (In~order~of~being~documented) + } + \l_@@_doc_def_tl + \@@_functions_typeout:nN + { Functions~documented~but~not~defined: } + \l_@@_doc_undef_tl + \@@_functions_typeout:nN + { Functions~defined~but~not~documented: } + \l_@@_undoc_def_tl - \iow_close:N \g_@@_func_iow - \typeout{ ======================================== } + \iow_close:N \g_@@_func_iow + \iow_term:x { \c_@@_iow_separator_tl } + } } -} -\AtEndDocument{ \@@_show_functions_defined: } +\AtEndDocument { \@@_show_functions_defined: } % \end{macrocode} % +% TODO: use \cs{iow_term:x}. % \begin{macrocode} -\cs_set_nopar:Npn \@@_functions_typeout:n #1 - { - \tl_if_empty:NF \l_@@_tmpa_tl - { - \typeout - { - -------------------------------------- ^^J #1 ^^J - -------------------------------------- ^^J \l_@@_tmpa_tl - } - \tl_clear:N \l_@@_tmpa_tl - } - } +\cs_new_protected:Npn \@@_functions_typeout:nN #1#2 + { + \tl_if_empty:NF #2 + { + \typeout + { + \c_@@_iow_midrule_tl \iow_newline: + #1 \iow_newline: + \c_@@_iow_midrule_tl \iow_newline: + #2 + } + \tl_clear:N #2 + } + } % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \@@_show_not_tested: - { - \bool_if:NT \g_@@_checktest_bool - { - \bool_if:nT { !(\seq_if_empty_p:N \g_@@_not_tested_seq) || - !(\prop_if_empty_p:N \g_@@_missing_tests_prop) } - { - \tl_clear:N \l_@@_tmpa_tl - \prop_if_empty:NF \g_@@_missing_tests_prop - { - \tl_put_right:Nn \l_@@_tmpa_tl - { - ^^J^^JThe~ following~ macro(s)~ have~ incomplete~ tests:^^J - } - \prop_map_inline:Nn \g_@@_missing_tests_prop - { - \tl_put_right:Nn \l_@@_tmpa_tl - {^^J\space\space\space\space ##1 - ^^J\space\space\space\space\space\space ##2} - } - } - \seq_if_empty:NF \g_@@_not_tested_seq - { - \tl_put_right:Nn \l_@@_tmpa_tl - { - ^^J^^J - The~ following~ macro(s)~ do~ not~ have~ any~ tests:^^J - } - \seq_map_inline:Nn \g_@@_not_tested_seq - { - \clist_map_inline:nn {##1} - { - \tl_put_right:Nn \l_@@_tmpa_tl {^^J\space\space\space\space ####1} - } - } - \int_set:Nn \l_tmpa_int {\etex_interactionmode:D} - \errorstopmode - \ClassError{l3doc}{\l_@@_tmpa_tl}{} - \int_set:Nn \etex_interactionmode:D {\l_tmpa_int} - } - } - } - } -\AtEndDocument{ \@@_show_not_tested: } +\cs_new_protected_nopar:Npn \@@_show_not_tested: + { + \bool_if:NT \g_@@_checktest_bool + { + \tl_clear:N \l_@@_tmpa_tl + \prop_if_empty:NF \g_@@_missing_tests_prop + { + \cs_set:Npn \@@_tmpa:w ##1##2 + { + \iow_newline: + \space\space\space\space \exp_not:n {##1} + \clist_map_function:nN {##2} \@@_tmpb:w + } + \cs_set:Npn \@@_tmpb:w ##1 + { + \iow_newline: + \space\space\space\space\space\space * ~ ##1 + } + \tl_put_right:Nx \l_@@_tmpa_tl + { + \iow_newline: \iow_newline: + The~ following~ macro(s)~ have~ incomplete~ tests: + \iow_newline: + \prop_map_function:NN + \g_@@_missing_tests_prop \@@_tmpa:w + } + } + \seq_if_empty:NF \g_@@_not_tested_seq + { + \cs_set:Npn \@@_tmpa:w ##1 + { \clist_map_function:nN {##1} \@@_tmpb:w } + \cs_set:Npn \@@_tmpb:w ##1 + { + \iow_newline: + \space\space\space\space ##1 + } + \tl_put_right:Nx \l_@@_tmpa_tl + { + \iow_newline: + \iow_newline: + The~ following~ macro(s)~ do~ not~ have~ any~ tests: + \iow_newline: + \seq_map_function:NN + \g_@@_not_tested_seq \@@_tmpa:w + } + } + \tl_if_empty:NF \l_@@_tmpa_tl + { + \int_set:Nn \l_@@_tmpa_int { \etex_interactionmode:D } + \errorstopmode + \ClassError { l3doc } { \l_@@_tmpa_tl } { } + \int_set:Nn \etex_interactionmode:D { \l_@@_tmpa_int } + } + } + } +\AtEndDocument { \@@_show_not_tested: } % \end{macrocode} % % \subsection{Indexing} % +% \subsubsection{Userspace commands} +% % Fix index (for now): % \begin{macrocode} -\g@addto@macro\theindex{\MakePrivateLetters} -\cs_set:Npn \verbatimchar {&} +\g@addto@macro \theindex { \MakePrivateLetters } +\cs_gset:Npn \verbatimchar {&} % \end{macrocode} % % \begin{macrocode} -\setcounter{IndexColumns}{2} +\setcounter { IndexColumns } { 2 } % \end{macrocode} % -% Set up the Index to use "\part" +% Set up the Index to use \tn{part} % \begin{macrocode} \IndexPrologue - { - \part*{Index} - \markboth{Index}{Index} - \addcontentsline{toc}{part}{Index} - The~italic~numbers~denote~the~pages~where~the~ - corresponding~entry~is~described,~ - numbers~underlined~point~to~the~definition,~ - all~others~indicate~the~places~where~it~is~used. - } + { + \part*{Index} + \markboth{Index}{Index} + \addcontentsline{toc}{part}{Index} + The~italic~numbers~denote~the~pages~where~the~ + corresponding~entry~is~described,~ + numbers~underlined~point~to~the~definition,~ + all~others~indicate~the~places~where~it~is~used. + } % \end{macrocode} % +% \begin{macro}{\SpecialIndex} +% An attempt at affecting how commands which appear within the +% \env{macrocode} environment are treated in the index. +% \begin{macrocode} +\cs_gset_protected:Npn \SpecialIndex #1 + { + \@bsphack + \@@_special_index:nn {#1} { } + \@esphack + } +% \end{macrocode} +% \end{macro} % -% \begin{macro}{\@@_special_main_index:n,\@@_special_main_index:o, \@@_special_main_index:x} -% Heiko's replacement to play nicely with |hypdoc|: % \begin{macrocode} - -\cs_set_nopar:Npn \@@_special_main_index:n #1 - { - \HD@target - \index - { - \@gobble#1 - \actualchar - \string\verb\quotechar*\verbatimchar#1\verbatimchar - \encapchar - hdclindex{\the\c@HD@hypercount}{usage} - } - } -\cs_generate_variant:Nn \@@_special_main_index:n { o , x } +\msg_new:nnn { l3doc } { print-index-howto } + { + Generate~the~index~by~executing\\ + \iow_indent:n + { makeindex~-s~gind.ist~-o~\c_job_name_tl.ind~\c_job_name_tl.idx } + } +\tl_gput_right:Nn \PrintIndex + { \AtEndDocument { \msg_info:nn { l3doc } { print-index-howto } } } +% \end{macrocode} +% +% \subsubsection{Internal index commands} +% +% \begin{macro}[int]{\it@is@a} +% The index of one-character commands within the \env{macrocode} +% environment is produced using \tn{it@is@a} \meta{char}. Alter that +% command. +% \begin{macrocode} +\cs_gset_protected:Npn \it@is@a #1 + { + \use:x + { + \@@_special_index_module:nnnn + { \quotechar #1 } + { \quotechar \bslash \quotechar #1 } + { } + { } + } + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}[aux]{\@@_special_index:nn} +% \begin{macrocode} +\cs_new_protected:Npn \@@_special_index:nn #1#2 + { + \@@_key_get:n {#1} + \@@_special_index_module:ooon + { \l_@@_index_key_tl } + { \l_@@_index_macro_tl } + { \l_@@_index_module_tl } + {#2} + } +\cs_generate_variant:Nn \@@_special_index:nn { o } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { +% \@@_special_index_module:nnnn, +% \@@_special_index_module:ooon, +% \@@_special_index_aux:nnnnn, +% \@@_special_index_aux:onnnn, +% \@@_special_index_set:Nn, +% } +% Remotely based on Heiko's replacement to play nicely with +% \pkg{hypdoc}. We use \tn{verb} or a \tn{verbatim@font} construction +% depending on whether the number of tokens in |#2| is equal to its +% number of characters. +% \begin{macrocode} +\tl_new:N \l_@@_index_escaped_macro_tl +\cs_new_protected:Npn \@@_special_index_module:nnnn #1#2#3#4 + { + \use:x + { + \exp_not:n { \@@_special_index_aux:nnnnn {#1} {#2} } + \str_case_x:nnF {#3} + { + { } { { } { } } + { TeX } + { + { TeX~and~LaTeX2e~commands } + { \string\TeX{}~and~\string\LaTeXe{}~commands: } + } + } + { { #3~commands } { \string\pkg{#3}~commands: } } + } + {#4} + } +\cs_generate_variant:Nn \@@_special_index_module:nnnn { ooo } +\cs_new_protected:Npn \@@_special_index_aux:nnnnn #1#2#3#4#5 + { + \HD@target + \@@_special_index_set:Nn \l_@@_index_escaped_macro_tl {#2} + \index + { + \tl_if_empty:nF { #3 #4 } + { #3 \actualchar #4 \levelchar } + #1 + \actualchar + { + \token_to_str:N \verbatim@font \c_space_tl + \l_@@_index_escaped_macro_tl + } + \encapchar + hdclindex{\the\c@HD@hypercount}{#5} + } + } +\cs_generate_variant:Nn \@@_special_index_aux:nnnnn { o } +\cs_new_protected:Npn \@@_special_index_set:Nn #1#2 + { + \tl_set:Nx #1 { \tl_to_str:n {#2} } + \int_compare:nNnTF { \tl_count:n {#2} } < { \tl_count:N #1 } + { + \tl_set:Nn #1 {#2} + \tl_replace_all:Non #1 + { \c_@@_backslash_tl } + { \token_to_str:N \bslash \c_space_tl } + } + { + \exp_args:Nx \tl_map_inline:nn + { \tl_to_str:N \verbatimchar \token_to_str:N _ } + { + \tl_replace_all:Nnn #1 {##1} + { + \verbatimchar \c_@@_backslash_tl ##1 + \token_to_str:N \verb \quotechar * \verbatimchar + } + } + \tl_map_inline:nn { \actualchar \encapchar \levelchar } + { + \tl_replace_all:Nxn #1 + { \tl_to_str:N ##1 } { \quotechar \tl_to_str:N ##1 } + } + \tl_set:Nx #1 + { + \token_to_str:N \verb \quotechar * \verbatimchar + #1 \verbatimchar + } + } + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Finding sort-key and module} +% +% \begin{macro}[aux]{\@@_key_get:n} +% Sets \cs{l_@@_index_macro_tl}, \cs{l_@@_index_key_tl}, and +% \cs{l_@@_index_module_tl} from |#1|. The \cs{l_@@_index_macro_tl} +% contains~|#1| directly. The starting point for the \meta{key} is +% |#1| as a string. If it the first character is a backslash, remove +% it. Then recognize |expl| functions and variables by the presence +% of |:| or~|_| and \TeX{}/\LaTeXe{} commands by the presence of~|@|. +% For |expl| names, we call \cs{@@_key_expl:}, which is responsible +% for removing some characters and finding the module name, while for +% \TeX{}/\LaTeXe{} commands the module name is |TeX|, and others have +% an empty module name. The function \cs{@@_key_expl:} detects a +% leading~|.| and removes it (key property), and otherwise does the +% following: if the second character is~|_| and the first is as well, +% then remove both (internal |expl| function); if the second character +% is~|_| but the first is not (the case of an |expl| variable), then +% remove both and remove a subsequent~|_| character (for internal +% variables). In all cases, call \cs{@@_key_get_module:}, which sets +% \cs{l_@@_index_module_tl} by removing anything after |_| or~|:| in +% \cs{l_@@_index_key_tl}. +% \begin{macrocode} +\cs_new_protected:Npn \@@_key_get:n #1 + { + \tl_set:Nn \l_@@_index_macro_tl {#1} + \tl_set:Nx \l_@@_index_key_tl { \tl_to_str:n {#1} } + \tl_clear:N \l_@@_index_module_tl + \tl_if_head_eq_charcode:oNT + { \l_@@_index_key_tl } \c_@@_backslash_token + { \@@_key_pop: } + \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N : } + { \@@_key_expl: } + { + \tl_if_in:NoTF \l_@@_index_key_tl { \token_to_str:N _ } + { \@@_key_expl: } + { + \tl_if_in:NoT \l_@@_index_key_tl { \token_to_str:N @ } + { \tl_set:Nn \l_@@_index_module_tl { TeX } } + } + } + } +\cs_new_protected_nopar:Npn \@@_key_pop: + { + \tl_set:Nx \l_@@_index_key_tl + { \tl_tail:N \l_@@_index_key_tl } + } +\cs_new_protected_nopar:Npn \@@_key_expl: + { + \tl_if_head_eq_charcode:oNTF { \l_@@_index_key_tl } . + { \@@_key_pop: } + { + \exp_args:Nx \tl_if_head_eq_charcode:nNT + { \exp_args:No \str_tail:n \l_@@_index_key_tl } _ + { + \tl_if_head_eq_charcode:oNTF { \l_@@_index_key_tl } _ + { + \@@_key_pop: + \@@_key_pop: + } + { + \@@_key_pop: + \@@_key_pop: + \tl_if_head_eq_charcode:oNT { \l_@@_index_key_tl } _ + { \@@_key_pop: } + } + } + } + \@@_key_get_module: + } % \end{macrocode} % \end{macro} % +% \begin{macro}[aux]{\@@_key_get_module:, \@@_key_get_module_aux:n} +% Sets \cs{l_@@_index_module_tl} from \cs{l_@@_index_key_tl}, by +% removing anything after |:| or |_|, taking care of not expanding the +% rest for cases such as |\cs{\meta{name}:\meta{signature}}|. % \begin{macrocode} -\msg_new:nnn {l3doc} {print-index-howto} - { - Generate~the~index~by~executing\\ - \iow_indent:n { makeindex~-s~gind.ist~-o~\c_job_name_tl .ind~\c_job_name_tl .idx } - } -\tl_gput_right:Nn \PrintIndex { \AtEndDocument{ \msg_info:nn {l3doc} {print-index-howto} } } +\cs_new_protected_nopar:Npn \@@_key_get_module: + { + \tl_set_eq:NN \l_@@_index_module_tl \l_@@_index_key_tl + \exp_args:No \@@_key_get_module_aux:n { \token_to_str:N : } + \exp_args:No \@@_key_get_module_aux:n { \token_to_str:N _ } + } +\cs_new_protected:Npn \@@_key_get_module_aux:n #1 + { + \cs_set:Npn \@@_tmpa:w ##1 #1 ##2 \q_stop { \exp_not:n {##1} } + \tl_set:Nx \l_@@_index_module_tl + { \exp_after:wN \@@_tmpa:w \l_@@_index_module_tl #1 \q_stop } + } % \end{macrocode} +% \end{macro} % % \subsection{Change history} % -% Set the change history to use "\part". -% Allow control names to be hyphenated in here... +% Set the change history to use \tn{part}. +% Allow control names to be hyphenated in here\dots % \begin{macrocode} \GlossaryPrologue - { - \part*{Change~History} - {\GlossaryParms\ttfamily\hyphenchar\font=`\-} - \markboth{Change~History}{Change~History} - \addcontentsline{toc}{part}{Change~History} - } + { + \part*{Change~History} + {\GlossaryParms\ttfamily\hyphenchar\font=`\-} + \markboth{Change~History}{Change~History} + \addcontentsline{toc}{part}{Change~History} + } % \end{macrocode} % % \begin{macrocode} -\msg_new:nnn {l3doc} {print-changes-howto} - { - Generate~the~change~list~by~executing\\ - \iow_indent:n { makeindex~-s~gglo.ist~-o~\c_job_name_tl .gls~\c_job_name_tl .glo } - } -\tl_gput_right:Nn \PrintChanges { \AtEndDocument{ \msg_info:nn {l3doc} {print-changes-howto} } } +\msg_new:nnn { l3doc } { print-changes-howto } + { + Generate~the~change~list~by~executing\\ + \iow_indent:n + { makeindex~-s~gglo.ist~-o~\c_job_name_tl.gls~\c_job_name_tl.glo } + } +\tl_gput_right:Nn \PrintChanges + { \AtEndDocument { \msg_info:nn { l3doc } { print-changes-howto } } } % \end{macrocode} % %^^A The standard \changes command modified slightly to better cope with @@ -2440,18 +3475,18 @@ Do not distribute a modified version of this file. % \subsection{Default configuration} % % \begin{macrocode} -\bool_if:NTF \g_@@_full_bool - { - \RecordChanges - \CodelineIndex - \EnableCrossrefs - \AlsoImplementation - } - { - \CodelineNumbered - \DisableCrossrefs - \OnlyDescription - } +\bool_if:NTF \g_@@_typeset_implementation_bool + { + \RecordChanges + \CodelineIndex + \EnableCrossrefs + \AlsoImplementation + } + { + \CodelineNumbered + \DisableCrossrefs + \OnlyDescription + } % \end{macrocode} % % @@ -2461,10 +3496,10 @@ Do not distribute a modified version of this file. % % \subsection{Internal macros for \LaTeX3 sources} % -% These definitions are only used by the \LaTeX3 documentation; -% they are not necessary for third-party users of l3doc. -% In time this will be broken into a separate package that is specifically -% loaded in the various expl3 modules, etc. +% These definitions are only used by the \LaTeX3 documentation; they are +% not necessary for third-party users of \cls{l3doc}. In time this will +% be broken into a separate package that is specifically loaded in the +% various \pkg{expl3} modules, \emph{etc.} % % \begin{macrocode} %<*cfg> @@ -2472,49 +3507,48 @@ Do not distribute a modified version of this file. % % The Guilty Parties. % \begin{macrocode} -\tl_new:N \Team -\tl_set:Nn \Team - { - The~\LaTeX3~Project\thanks - { - Frank~Mittelbach,~Denys~Duchier,~Chris~Rowley,~ - Rainer~Sch\"opf,~Johannes~Braams,~Michael~Downes,~ - David~Carlisle,~Alan~Jeffrey,~Morten~H\o{}gholm,~Thomas~Lotze,~ - Javier~Bezos,~Will~Robertson,~Joseph~Wright,~Bruno~Le~Floch - } - } +\tl_const:Nn \Team + { + The~\LaTeX3~Project\thanks + { + Frank~Mittelbach,~Denys~Duchier,~Chris~Rowley,~ + Rainer~Sch\"opf,~Johannes~Braams,~Michael~Downes,~ + David~Carlisle,~Alan~Jeffrey,~Morten~H\o{}gholm,~Thomas~Lotze,~ + Javier~Bezos,~Will~Robertson,~Joseph~Wright,~Bruno~Le~Floch + } + } % \end{macrocode} % % \begin{macrocode} \NewDocumentCommand{\ExplMakeTitle}{mm} - { - \title - { - The~\pkg{#1}~package \\ #2 - \thanks - { - This~file~describes~v\ExplFileVersion,~ - last~revised~\ExplFileDate. - } - } - \author - { - The~\LaTeX3~Project\thanks{E-mail:~ - \href{mailto:latex-l@listserv.uni-heidelberg.de} - {latex-l@listserv.uni-heidelberg.de}} - } - \date{Released~\ExplFileDate} - \maketitle - } + { + \title + { + The~\pkg{#1}~package \\ #2 + \thanks + { + This~file~describes~v\ExplFileVersion,~ + last~revised~\ExplFileDate. + } + } + \author + { + The~\LaTeX3~Project\thanks{E-mail:~ + \href{mailto:latex-l@listserv.uni-heidelberg.de} + {latex-l@listserv.uni-heidelberg.de}} + } + \date{Released~\ExplFileDate} + \maketitle + } % \end{macrocode} % % \subsection{Text extras} % % \begin{macrocode} -\DeclareDocumentCommand\ie{}{\emph{i.e.}} -\DeclareDocumentCommand\eg{}{\emph{e.g.}} -\DeclareDocumentCommand\Ie{}{\emph{I.e.}} -\DeclareDocumentCommand\Eg{}{\emph{E.g.}} +\DeclareDocumentCommand \ie { } { \emph{i.e.} } +\DeclareDocumentCommand \eg { } { \emph{e.g.} } +\DeclareDocumentCommand \Ie { } { \emph{I.e.} } +\DeclareDocumentCommand \Eg { } { \emph{E.g.} } % \end{macrocode} % % \subsection{Math extras} @@ -2523,14 +3557,14 @@ Do not distribute a modified version of this file. % % \begin{macrocode} \AtBeginDocument - { - \clist_map_inline:nn - { - asin, acos, atan, acot, - asinh, acosh, atanh, acoth, round, floor, ceil - } - { \exp_args:Nc \DeclareMathOperator{#1}{#1} } - } + { + \clist_map_inline:nn + { + asin, acos, atan, acot, + asinh, acosh, atanh, acoth, round, floor, ceil + } + { \exp_args:Nc \DeclareMathOperator{#1}{#1} } + } % \end{macrocode} % % \begin{macro}{\nan} @@ -2546,14 +3580,14 @@ Do not distribute a modified version of this file. % % \subsection{Makeindex configuration} % -% The makeindex style "l3doc.ist" is used in place of the usual -% "gind.ist" to ensure that I is used in the sequence I J K -% not I II II, which would be the default makeindex behaviour. +% The makeindex style \file{l3doc.ist} is used in place of the usual +% \file{gind.ist} to ensure that |I| is used in the sequence |I J K| not +% |I II II|, which would be the default makeindex behaviour. % % Will: Do we need this? % % Frank: at the moment we do not distribute or generate this file. -% gind.ist is used instead. +% \file{gind.ist} is used instead. % % \begin{macrocode} %<*docist> @@ -2588,179 +3622,192 @@ page_precedence "rnaA" % \section{Testing} % % \begin{function}{foo} -% \begin{syntax} -% "\foo" <something_n> \Arg{something_1} -% \end{syntax} -% Does <something_1> with <something_n> +% \begin{syntax} +% |\foo| \meta{something_n} \Arg{something_1} +% \end{syntax} +% Does \meta{something_1} with \meta{something_n} % \end{function} % % \begin{function}{.bool_set:N} -% blah +% blah % \end{function} % -% \ExplSyntaxOn \cs_set_eq:NN \c_alignment_token @ \ExplSyntaxOff -% \begin{variabledoc} +% \begin{variable} % { % \c_alignment_token, % } -% \end{variabledoc} -% \ExplSyntaxOn \cs_set_eq:NN \c_alignment_token & \ExplSyntaxOff -% -% \begin{function}[added=2011-09-06]{\example_foo:N,\example_foo:c} -% \begin{syntax} -% "\example_foo:N" <arg_1> -% "\example_foo:c" \Arg{arg_1} -% \end{syntax} -% <0123456789> +% \end{variable} +% +% \begin{function}[added=2011-09-06]{\example_foo:N, \example_foo:c} +% \begin{syntax} +% |\example_foo:N| <arg_1> +% |\example_foo:c| \Arg{arg_1} +% \end{syntax} +% <0123456789> % \end{function} % -% \begin{function}[added=2011-09-06]{ \foo , \fooo: , \foooo:n , \foooo:x , \fooooo:n , \fooooo:c , \fooooo:x } -% \begin{syntax} -% "\example_foo:N" <arg_1> -% \end{syntax} -% <0123456789> +% \begin{function}[added=2011-09-06] +% {\foo, \fooo:, \foooo:n, \foooo:x, \fooooo:n, \fooooo:c, \fooooo:x} +% \begin{syntax} +% |\example_foo:N| \meta{arg_1} +% \end{syntax} +% \meta{0123456789} % \end{function} % -% \begin{function}[TF]{\foo:N , \foo_if:c } -% Test. +% \begin{function}[TF]{\foo:N, \foo_if:c} +% Test. % \end{function} -% \begin{function}[TF,EXP]{\foo:N , \foo_if:c } -% Test. +% \begin{function}[TF,EXP]{\foo:N, \foo_if:c} +% Test. % \end{function} % % \begin{function}[added=2011-09-06,EXP]{\fffoo:N} -% Test. +% Test. % \end{function} % \begin{function}[added=2011-09-06,updated=2011-09-07,EXP]{\fffoo:N} -% Test. +% Test. % \end{function} % \begin{function}[updated=2011-09-06,EXP]{\fffoo:N} -% Test. +% Test. % \end{function} % \begin{function}[TF]{\ffffoo:N} -% Test. +% Test. % \end{function} % \begin{function}[pTF]{\ffoo:N} -% \lipsum[6] +% \lipsum[6] % \end{function} -% \begin{function}[pTF]{\ffoo:N,\ffoo:c,\ffoo:V} -% \lipsum[6] +% \begin{function}[pTF]{\ffoo:N, \ffoo:c, \ffoo:V} +% \lipsum[6] % \end{function} -% \begin{function}[pTF]{\ffoo:N,\ffoo:c} -% \lipsum[6] +% \begin{function}[pTF]{\ffoo:N, \ffoo:c} +% \lipsum[6] % \end{function} % % % \begin{function}[TF]{\ffffoo_with_very_very_very_long_name:N} -% \lipsum[1] +% \lipsum[1] % \end{function} % -% \begin{function}[TF]{\ffffoo_with_very_very_very_long_name:N,\ffffoo_with_very_very_very_long_name:c,\ffffoo_with_very_very_very_long_name:V} -% \lipsum[1] +% \begin{function}[TF] +% { +% \ffffoo_with_very_very_very_long_name:N, +% \ffffoo_with_very_very_very_long_name:c, +% \ffffoo_with_very_very_very_long_name:V +% } +% \lipsum[1] % \end{function} % -% \begin{function}[TF]{\ffffoo_with_very_very_very_long_name:N,\ffffoo_with_very_very_very_long_name:c,\ffffoo_with_very_very_very_long_name:V} -% \begin{syntax} -% this is how you use it -% \end{syntax} -% \lipsum[1] +% \begin{function}[TF] +% { +% \ffffoo_with_very_very_very_long_name:N, +% \ffffoo_with_very_very_very_long_name:c, +% \ffffoo_with_very_very_very_long_name:V +% } +% \begin{syntax} +% this is how you use it +% \end{syntax} +% \lipsum[1] % \end{function} % -% \begin{function}[TF]{\ffffoo_with_very_very_very_long_name:N,\ffffoo_with_very_very_very_long_name:V} -% \begin{syntax} -% this is how you use it -% \end{syntax} -% \lipsum[1] +% \begin{function}[TF] +% { +% \ffffoo_with_very_very_very_long_name:N, +% \ffffoo_with_very_very_very_long_name:V +% } +% \begin{syntax} +% this is how you use it +% \end{syntax} +% \lipsum[1] % \end{function} % % \bigskip\bigskip % -% \begin{macro}[aux]{ \foo_aux: } -% Testing `aux' option. +% \begin{macro}[aux]{\foo_aux:} +% Testing the \enquote{aux} option. % \end{macro} % -% \begin{macro}[TF]{ \foo_if:c } -% Testing `TF' option. +% \begin{macro}[TF]{\foo_if:c} +% Testing the \enquote{TF} option. % \end{macro} -% \begin{macro}[TF]{ \foo_if:c, \fooo_if:n } -% Testing `TF' option. +% \begin{macro}[TF]{\foo_if:c, \fooo_if:n} +% Testing the \enquote{TF} option. % \end{macro} % % \begin{macro}[pTF]{ \foo_if:d } -% Testing `pTF' option. +% Testing the \enquote{pTF} option. % \end{macro} % -% \begin{macro}[internal]{ \test_internal: } -% Testing `internal' option. +% \begin{macro}[internal]{\test_internal:} +% Testing the \enquote{internal} option. % \end{macro} % % \bigskip\bigskip % % \begin{macro}{\aaaa_bbbb_cccc_dddd_eeee_ffff_gggg_hhhh} -% Long macro names need to be printed in a shorter font. +% Long macro names need to be printed in a shorter font. % \begin{macrocode} % \end{macrocode} % \end{macro} % % \begin{function}{\::N} -% this is (no longer) weird +% This is (no longer) weird. % \end{function} % % \begin{macro}{\::N} -% this is (no longer) weird +% This is (no longer) weird. % \end{macro} % -% -% % \begin{function}[EXP]{\foo}\end{function} % \begin{function}[rEXP]{\foo}\end{function} % -% here is some verbatim text: +% Here is some verbatim text: % \begin{verbatim} % a & B # c % \end{verbatim} -% without overriding this with fancyvrb there would be extraneous whitespace. -% -% \begin{macro}{\c_minus_one, -% \c_zero, -% \c_one, -% \c_two, -% \c_three, -% \c_four, -% \c_five, -% \c_six, -% \c_seven, -% \c_eight, -% \c_nine, -% \c_ten, -% \c_eleven, -% \c_sixteen, -% \c_thirty_two, -% \c_hundred_one, -% \c_twohundred_fifty_five, -% \c_twohundred_fifty_six, -% \c_thousand, -% \c_ten_thousand, -% \c_ten_thousand_one} -% \begin{arguments} -% \item name -% \item parameters -% \end{arguments} -% Another test. -% \end{macro} -% +% without overriding this with \pkg{fancyvrb} there would be extraneous +% whitespace. % +% \begin{macro} +% { +% \c_minus_one, +% \c_zero, +% \c_one, +% \c_two, +% \c_three, +% \c_four, +% \c_five, +% \c_six, +% \c_seven, +% \c_eight, +% \c_nine, +% \c_ten, +% \c_eleven, +% \c_sixteen, +% \c_thirty_two, +% \c_hundred_one, +% \c_twohundred_fifty_five, +% \c_twohundred_fifty_six, +% \c_thousand, +% \c_ten_thousand, +% \c_ten_thousand_one +% } +% \begin{arguments} +% \item name +% \item parameters +% \end{arguments} +% Another test. +% \end{macro} % % % \subsection{Macros} % \raggedright % \ExplSyntaxOn -% \seq_map_inline:Nn \g_doc_macros_seq { `\texttt{#1}' \quad } +% \seq_map_inline:Nn \g_doc_macros_seq { \texttt{\enquote{#1}} \quad } % \ExplSyntaxOff % % \subsection{Functions} % \ExplSyntaxOn -% \seq_map_inline:Nn \g_doc_functions_seq { `\texttt{#1}' \quad } +% \seq_map_inline:Nn \g_doc_functions_seq { \texttt{\enquote{#1}} \quad } % \ExplSyntaxOff % % \end{implementation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index 941400bb69a..b3efcd434c9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3drivers.dtx 5203 2014-07-15 08:59:02Z joseph $ +\GetIdInfo$Id: l3drivers.dtx 5308 2014-08-20 01:22:39Z bruno $ {L3 Experimental drivers} %</driver|package> %<*driver> @@ -270,7 +270,7 @@ % concept is general enough to use a single function. However, it is % important to remember this is a convenient shortcut: the arguments will % be driver-specific. Note that these functions set the transformation matrix -% to the current position: contrast with \cs{\@@_literal_direct:n}. +% to the current position: contrast with \cs{@@_literal_direct:n}. % \begin{macrocode} \cs_new_protected:Npn \@@_literal:n #1 %<*dvipdfmx|xdvipdfmx> @@ -302,7 +302,7 @@ % \end{macro} % % \begin{macro}[int]{\@@_literal_direct:n} -% Even \enquote{lower level} than \cs{\@@_literal:n}, these commands do +% Even \enquote{lower level} than \cs{@@_literal:n}, these commands do % not set the transformation matrix but simply dump the driver code directly % into the output. In the \texttt{(x)dvipdfmx} case this two-part keyword % is documented (\emph{cf.}~|literal| alone). diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index 658d8e1861c..701a2ab6b02 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3expan.dtx 5146 2014-06-16 13:12:18Z joseph $ +\GetIdInfo$Id: l3expan.dtx 5349 2014-08-22 21:46:59Z bruno $ {L3 Argument expansion} %</driver|package> %<*driver> @@ -117,7 +117,7 @@ % \cs{cs_generate_variant:Nn}, described next. % % \section{Methods for defining variants} -% \label{sec:l3expan:defining-variants} +% \label{sec:l3expan:variants-method} % % \begin{function}[updated = 2013-07-09]{\cs_generate_variant:Nn} % \begin{syntax} @@ -585,8 +585,8 @@ % \cs{function:f} \meta{tokens} \cs{exp_stop_f:} \meta{more tokens} % \end{syntax} % This function terminates an \texttt{f}-type expansion. Thus if -% a function \cs{function:f} starts an \texttt{f}-type expansion -% and all of \meta{tokens} are expandable \cs{exp_stop:f} will +% a function |\function:f| starts an \texttt{f}-type expansion +% and all of \meta{tokens} are expandable \cs{exp_stop_f:} will % terminate the expansion of tokens even if \meta{more tokens} % are also expandable. The function itself is an implicit space % token. Inside an \texttt{x}-type expansion, it will retain its diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index a6a43277ac0..bded1318cdc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3file.dtx 5188 2014-07-09 12:02:22Z will $ +\GetIdInfo$Id: l3file.dtx 5369 2014-08-24 22:41:47Z bruno $ {L3 File and I/O operations} %</driver|package> %<*driver> @@ -353,6 +353,13 @@ % at the point where the function is used but \emph{not} when the % resulting tokens are written to the \meta{stream} % (\emph{cf.}~\cs{iow_shipout_x:Nn}). +% \begin{texnote} +% When using \pkg{expl3} with a format other than \LaTeX{}, new line +% characters inserted using \cs{iow_newline:} or using the +% line-wrapping code \cs{iow_wrap:nnnN} will not be recognized in +% the argument of \cs{iow_shipout:Nn}. This may lead to the +% insertion of additionnal unwanted line-breaks. +% \end{texnote} % \end{function} % % \begin{function}[updated = 2012-09-08]{\iow_shipout_x:Nn, \iow_shipout_x:Nx, \iow_shipout_x:cn, \iow_shipout_x:cx} @@ -367,6 +374,11 @@ % the page building process (such as the page number integer). % \begin{texnote} % This is a wrapper around the \TeX{} primitive \tn{write}. +% When using \pkg{expl3} with a format other than \LaTeX{}, new line +% characters inserted using \cs{iow_newline:} or using the +% line-wrapping code \cs{iow_wrap:nnnN} will not be recognized in +% the argument of \cs{iow_shipout:Nn}. This may lead to the +% insertion of additionnal unwanted line-breaks. % \end{texnote} % \end{function} % @@ -391,6 +403,13 @@ % Function to add a new line within the \meta{tokens} written to a % file. The function has no effect if writing is taking place without % expansion (\emph{e.g.}~in the second argument of \cs{iow_now:Nn}). +% \begin{texnote} +% When using \pkg{expl3} with a format other than \LaTeX{}, the +% character inserted by \cs{iow_newline:} will not be recognized by +% \TeX{}, which may lead to the insertion of additionnal unwanted +% line-breaks. This issue only affects \cs{iow_shipout:Nn}, +% \cs{iow_shipout_x:Nn} and direct uses of primitive operations. +% \end{texnote} % \end{function} % % \subsection{Wrapping lines in output} @@ -540,6 +559,19 @@ % implementation of \cs{file_add_path:nN}, % \end{function} % +% \begin{function}[added = 2014-08-23]{\__iow_with:Nnn} +% \begin{syntax} +% \cs{__iow_with:Nnn} \meta{integer} \Arg{value} \Arg{code} +% \end{syntax} +% If the \meta{integer} is equal to the \meta{value} then this +% function simply runs the \meta{code}. Otherwise it saves the +% current value of the \meta{integer}, sets it to the \meta{value}, +% runs the \meta{code}, and restores the \meta{integer} to its former +% value. This is used to ensure that the \tn{newlinechar} is~$10$ +% when writing to a stream, which lets \cs{iow_newline:} work, and +% that \tn{errorcontextlines} is $-1$ when displaying a message. +% \end{function} +% % \end{documentation} % % \begin{implementation} @@ -677,9 +709,10 @@ } } { - \__msg_kernel_error:nnx { kernel } { unbalanced-quote-in-filename } + \__msg_kernel_error:nnx + { kernel } { unbalanced-quote-in-filename } { \l_@@_internal_name_tl } - } + } \use:x { \group_end: @@ -688,7 +721,7 @@ } \cs_new:Npn \@@_name_sanitize_aux:n #1 { - \str_if_eq:nnT {#1} { " } + \token_if_eq_charcode:NNT #1 " { + \c_one } } % \end{macrocode} @@ -720,7 +753,8 @@ %<*package> \cs_if_exist:NT \input@path { - \seq_set_eq:NN \l_@@_saved_search_path_seq \l_@@_search_path_seq + \seq_set_eq:NN \l_@@_saved_search_path_seq + \l_@@_search_path_seq \seq_set_split:NnV \l_@@_internal_seq { , } \input@path \seq_concat:NNN \l_@@_search_path_seq \l_@@_search_path_seq \l_@@_internal_seq @@ -737,7 +771,10 @@ } %<*package> \cs_if_exist:NT \input@path - { \seq_set_eq:NN \l_@@_search_path_seq \l_@@_saved_search_path_seq } + { + \seq_set_eq:NN \l_@@_search_path_seq + \l_@@_saved_search_path_seq + } %</package> } % \end{macrocode} @@ -842,7 +879,8 @@ % \begin{macro}{\file_list:} % A function to list all files used to the log, without duplicates. % In package mode, if \cs{@filelist} is still defined, we need to take -% it into account (we capture it \cs{AtBeginDocument} into +% this list of file names into account +% (we capture it \cs{AtBeginDocument} into % \cs{g_@@_record_seq}), turning each file name into a string. % \begin{macrocode} \cs_new_protected_nopar:Npn \file_list: @@ -921,11 +959,27 @@ % % \begin{variable}{\g_@@_streams_prop} % The name of the file attached to each stream is tracked in a property -% list. +% list. To get the correct number of reserved streams in package mode the +% underlying mechanism needs to be queried. For \LaTeXe{} and plain \TeX{} +% this data is stored in |\count16|: with the \pkg{etex} package loaded +% we need to subtract $1$ as the register holds the number of the next +% stream to use. In Con\TeX{}t, we need to look at |\count38| but there +% is no subtraction: like the original plain \TeX{}/\LaTeXe{} mechanism +% it holds the value of the \emph{last} stream allocated. % \begin{macrocode} \prop_new:N \g_@@_streams_prop %<*package> -\prop_gput:Nnn \g_@@_streams_prop { 0 } { LaTeX2e~reserved } +\int_step_inline:nnnn + { \c_zero } + { \c_one } + { + \cs_if_exist:NTF \normalend + { \tex_count:D 38 \scan_stop: } + { \tex_count:D 16 \scan_stop: - \c_one } + } + { + \prop_gput:Nnn \g_@@_streams_prop {#1} { Reserved~by~format } + } %</package> % \end{macrocode} % \end{variable} @@ -1174,13 +1228,22 @@ % \end{variable} % % \begin{variable}{\g_@@_streams_prop} -% As for reads, but with more reserved as \LaTeXe{} takes up a few here. +% As for reads with the appropriate adjustment of the register numbers to +% check on. % \begin{macrocode} \prop_new:N \g_@@_streams_prop %<*package> -\prop_put:Nnn \g_@@_streams_prop { 0 } { LaTeX2e~reserved } -\prop_put:Nnn \g_@@_streams_prop { 1 } { LaTeX2e~reserved } -\prop_put:Nnn \g_@@_streams_prop { 2 } { LaTeX2e~reserved } +\int_step_inline:nnnn + { \c_zero } + { \c_one } + { + \cs_if_exist:NTF \normalend + { \tex_count:D 39 \scan_stop: } + { \tex_count:D 17 \scan_stop: - \c_one } + } + { + \prop_gput:Nnn \g_@@_streams_prop {#1} { Reserved~by~format } + } %</package> % \end{macrocode} % \end{variable} @@ -1288,6 +1351,27 @@ % % \subsubsection{Immediate writing} % +% \begin{macro}[aux]{\@@_with:Nnn, \@@_with_aux:nNnn} +% If the integer~|#1| is equal to~|#2|, just leave~|#3| in the input +% stream. Otherwise, pass the old value to an auxiliary, which sets +% the integer to the new value, runs the code, and restores the +% integer. +% \begin{macrocode} +\cs_new_protected:Npn \@@_with:Nnn #1#2 + { + \int_compare:nNnTF {#1} = {#2} + { \use:n } + { \exp_args:No \@@_with_aux:nNnn { \int_use:N #1 } #1 {#2} } + } +\cs_new_protected:Npn \@@_with_aux:nNnn #1#2#3#4 + { + \int_set:Nn #2 {#3} + #4 + \int_set:Nn #2 {#1} + } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\iow_now:Nn,\iow_now:Nx,\iow_now:cn,\iow_now:cx} % This routine writes the second argument onto the output stream without % expansion. If this stream isn't open, the output goes to the terminal @@ -1295,10 +1379,17 @@ % internal error. We don't use the expansion done by \tn{write} to % get the |Nx| variant, because it differs in subtle ways from % \texttt{x}-expansion, namely, macro parameter characters would not -% need to be doubled. +% need to be doubled. We set the \tn{newlinechar} to~$10$ using +% \cs{@@_with:Nnn} to support formats such as plain \TeX{}: otherwise, +% \cs{iow_newline:} would not work. We do not do this for +% \cs{iow_shipout:Nn} or \cs{iow_shipout_x:Nn}, as \TeX{} looks at the +% value of the \tn{newlinechar} at shipout time in those cases. % \begin{macrocode} \cs_new_protected:Npn \iow_now:Nn #1#2 - { \tex_immediate:D \tex_write:D #1 { \exp_not:n {#2} } } + { + \@@_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 } % \end{macrocode} % \end{macro} @@ -1699,7 +1790,8 @@ { \__int_value:w \__int_eval:w \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1} - { X8 } { X7 } { X6 } { X5 } { X4 } { X3 } { X2 } { X1 } { X0 } \q_stop + { X8 } { X7 } { X6 } { X5 } { X4 } { X3 } { X2 } { X1 } { X0 } + \q_stop \__int_eval_end: } \cs_new:Npn \__str_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3format.ins b/Master/texmf-dist/source/latex/l3kernel/l3format.ins index 9f0a08405a1..5c02a99ac6a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3format.ins +++ b/Master/texmf-dist/source/latex/l3kernel/l3format.ins @@ -38,8 +38,8 @@ Do not distribute a modified version of this file. \generate { - \file{l3format.ltx} - { + \file{l3format.ltx} + { \from{l3bootstrap.dtx} {initex} \from{l3names.dtx} {initex} \from{l3basics.dtx} {initex} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index e90741a8d56..54ebb1db580 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-aux.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3fp-aux.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point support functions} \documentclass[full]{l3doc} \begin{document} @@ -83,7 +83,7 @@ % ^^A todo: make sanitize and pack more homogeneous between modules. % % ^^A begin[todo]: move -% \section{Internal representation} +% \subsection{Internal representation} % % Internally, a floating point number \meta{X} is a % token list containing @@ -170,7 +170,7 @@ % \end{tabular} % \end{table} % -% \section{Internal storage of floating points numbers} +% \subsection{Internal storage of floating points numbers} % % A floating point number \meta{X} is stored as % \begin{quote} @@ -337,8 +337,10 @@ % In case of overflow or underflow, we have to output % a zero or infinity with a given sign. % \begin{macrocode} -\cs_new:Npn \@@_zero_fp:N #1 { \s_@@ \@@_chk:w 0 #1 \s_@@_underflow ; } -\cs_new:Npn \@@_inf_fp:N #1 { \s_@@ \@@_chk:w 2 #1 \s_@@_overflow ; } +\cs_new:Npn \@@_zero_fp:N #1 + { \s_@@ \@@_chk:w 0 #1 \s_@@_underflow ; } +\cs_new:Npn \@@_inf_fp:N #1 + { \s_@@ \@@_chk:w 2 #1 \s_@@_overflow ; } % \end{macrocode} % \end{macro} % @@ -402,9 +404,10 @@ % \begin{macrocode} \cs_new:Npn \@@_sanitize:Nw #1 #2; { - \if_case:w \if_int_compare:w #2 > \c_@@_max_exponent_int \c_one \else: - \if_int_compare:w #2 < - \c_@@_max_exponent_int \c_two \else: - \if_meaning:w 1 #1 \c_three \else: \c_zero \fi: \fi: \fi: + \if_case:w + \if_int_compare:w #2 > \c_@@_max_exponent_int \c_one \else: + \if_int_compare:w #2 < - \c_@@_max_exponent_int \c_two \else: + \if_meaning:w 1 #1 \c_three \else: \c_zero \fi: \fi: \fi: \or: \exp_after:wN \@@_overflow:w \or: \exp_after:wN \@@_underflow:w \or: \exp_after:wN \@@_sanitize_zero:w @@ -412,7 +415,8 @@ \s_@@ \@@_chk:w 1 #1 {#2} } \cs_new:Npn \@@_sanitize:wN #1; #2 { \@@_sanitize:Nw #2 #1; } -\cs_new:Npn \@@_sanitize_zero:w \s_@@ \@@_chk:w #1 #2 #3; { \c_zero_fp } +\cs_new:Npn \@@_sanitize_zero:w \s_@@ \@@_chk:w #1 #2 #3; + { \c_zero_fp } % \end{macrocode} % \end{macro} % \end{macro} @@ -641,7 +645,7 @@ % \c_@@_Bigg_middle_shift_int , % \c_@@_Bigg_leading_shift_int , % } -% This set of shifts allows for computations involving results in the +% This set of shifts allows for computations with results in the % range $[-1\cdot 10^{9}, 147483647]$; the end-point is $2^{31} - 1 - % 2\cdot 10^{9} \simeq 1.47\cdot 10^{8}$. Shifted values all have % exactly $10$ digits. @@ -752,14 +756,14 @@ % % \begin{macro}[aux, EXP] % { -% \\@@_decimate_auxi:Nnnnn, \\@@_decimate_auxii:Nnnnn, -% \\@@_decimate_auxiii:Nnnnn, \\@@_decimate_auxiv:Nnnnn, -% \\@@_decimate_auxv:Nnnnn, \\@@_decimate_auxvi:Nnnnn, -% \\@@_decimate_auxvii:Nnnnn, \\@@_decimate_auxviii:Nnnnn, -% \\@@_decimate_auxix:Nnnnn, \\@@_decimate_auxx:Nnnnn, -% \\@@_decimate_auxxi:Nnnnn, \\@@_decimate_auxxii:Nnnnn, -% \\@@_decimate_auxxiii:Nnnnn, \\@@_decimate_auxxiv:Nnnnn, -% \\@@_decimate_auxxv:Nnnnn, \\@@_decimate_auxxvi:Nnnnn +% \@@_decimate_auxi:Nnnnn, \@@_decimate_auxii:Nnnnn, +% \@@_decimate_auxiii:Nnnnn, \@@_decimate_auxiv:Nnnnn, +% \@@_decimate_auxv:Nnnnn, \@@_decimate_auxvi:Nnnnn, +% \@@_decimate_auxvii:Nnnnn, \@@_decimate_auxviii:Nnnnn, +% \@@_decimate_auxix:Nnnnn, \@@_decimate_auxx:Nnnnn, +% \@@_decimate_auxxi:Nnnnn, \@@_decimate_auxxii:Nnnnn, +% \@@_decimate_auxxiii:Nnnnn, \@@_decimate_auxxiv:Nnnnn, +% \@@_decimate_auxxv:Nnnnn, \@@_decimate_auxxvi:Nnnnn % } % \begin{syntax} % \cs{\@@_decimate_auxi:Nnnnn} \meta{f_1} \Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} @@ -790,22 +794,22 @@ \@@_decimate_pack:nnnnnnnnnnw #3 ; } } -\@@_tmp:w {i} {\use_none:nnn #50} { 0{#2}#3{#4}#5 } -\@@_tmp:w {ii} {\use_none:nn #5 } { 00{#2}#3{#4}#5 } -\@@_tmp:w {iii} {\use_none:n #5 } { 000{#2}#3{#4}#5 } -\@@_tmp:w {iv} { #5 } { {0000}#2{#3}#4 #5 } -\@@_tmp:w {v} {\use_none:nnn #4#5 } { 0{0000}#2{#3}#4 #5 } -\@@_tmp:w {vi} {\use_none:nn #4#5 } { 00{0000}#2{#3}#4 #5 } -\@@_tmp:w {vii} {\use_none:n #4#5 } { 000{0000}#2{#3}#4 #5 } -\@@_tmp:w {viii}{ #4#5 } { {0000}0000{#2}#3 #4 #5 } -\@@_tmp:w {ix} {\use_none:nnn #3#4+#5} { 0{0000}0000{#2}#3 #4 #5 } -\@@_tmp:w {x} {\use_none:nn #3#4+#5} { 00{0000}0000{#2}#3 #4 #5 } -\@@_tmp:w {xi} {\use_none:n #3#4+#5} { 000{0000}0000{#2}#3 #4 #5 } -\@@_tmp:w {xii} { #3#4+#5} { {0000}0000{0000}#2 #3 #4 #5 } -\@@_tmp:w {xiii}{\use_none:nnn#2#3+#4#5} { 0{0000}0000{0000}#2 #3 #4 #5 } -\@@_tmp:w {xiv} {\use_none:nn #2#3+#4#5} { 00{0000}0000{0000}#2 #3 #4 #5 } -\@@_tmp:w {xv} {\use_none:n #2#3+#4#5} { 000{0000}0000{0000}#2 #3 #4 #5 } -\@@_tmp:w {xvi} { #2#3+#4#5} {{0000}0000{0000}0000 #2 #3 #4 #5 } +\@@_tmp:w {i} {\use_none:nnn #50}{ 0{#2}#3{#4}#5 } +\@@_tmp:w {ii} {\use_none:nn #5 }{ 00{#2}#3{#4}#5 } +\@@_tmp:w {iii} {\use_none:n #5 }{ 000{#2}#3{#4}#5 } +\@@_tmp:w {iv} { #5 }{ {0000}#2{#3}#4 #5 } +\@@_tmp:w {v} {\use_none:nnn #4#5 }{ 0{0000}#2{#3}#4 #5 } +\@@_tmp:w {vi} {\use_none:nn #4#5 }{ 00{0000}#2{#3}#4 #5 } +\@@_tmp:w {vii} {\use_none:n #4#5 }{ 000{0000}#2{#3}#4 #5 } +\@@_tmp:w {viii}{ #4#5 }{ {0000}0000{#2}#3 #4 #5 } +\@@_tmp:w {ix} {\use_none:nnn #3#4+#5}{ 0{0000}0000{#2}#3 #4 #5 } +\@@_tmp:w {x} {\use_none:nn #3#4+#5}{ 00{0000}0000{#2}#3 #4 #5 } +\@@_tmp:w {xi} {\use_none:n #3#4+#5}{ 000{0000}0000{#2}#3 #4 #5 } +\@@_tmp:w {xii} { #3#4+#5}{ {0000}0000{0000}#2 #3 #4 #5 } +\@@_tmp:w {xiii}{\use_none:nnn#2#3+#4#5}{ 0{0000}0000{0000}#2 #3 #4 #5 } +\@@_tmp:w {xiv} {\use_none:nn #2#3+#4#5}{ 00{0000}0000{0000}#2 #3 #4 #5 } +\@@_tmp:w {xv} {\use_none:n #2#3+#4#5}{ 000{0000}0000{0000}#2 #3 #4 #5 } +\@@_tmp:w {xvi} { #2#3+#4#5}{{0000}0000{0000}0000 #2 #3 #4 #5} % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index 44d8857b2b5..177e8246a94 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-basics.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3fp-basics.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point arithmetic} \begin{document} \DocInput{\jobname.dtx} @@ -381,7 +381,7 @@ % \begin{macro}[aux, rEXP]{\@@_add_significand_o:NnnwnnnnN} % \begin{macro}[aux, rEXP] % {\@@_add_significand_pack:NNNNNNN, \@@_add_significand_test_o:N} -% \begin{quote} +% \begin{quote}\raggedright % \cs{@@_add_significand_o:NnnwnnnnN} % \meta{rounding digit} % \Arg{Y'_1} \Arg{Y'_2} \meta{extra-digits} |;| @@ -629,7 +629,7 @@ % \end{macro} % % \begin{macro}[aux, rEXP]{\@@_sub_back_far_o:NnnwnnnnN} -% \begin{quote} +% \begin{quote}\raggedright % \cs{@@_sub_back_far_o:NnnwnnnnN} % \meta{rounding} \Arg{Y'_1} \Arg{Y'_2} \meta{extra-digits} |;| % \Arg{X_1} \Arg{X_2} \Arg{X_3} \Arg{X_4} @@ -913,11 +913,11 @@ \exp_after:wN \@@_mul_significand_keep:NNNNNw \int_use:N \__int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 + \exp_after:wN \@@_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 + + \int_use:N \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 + \exp_after:wN \@@_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 + + \int_use:N \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 + \exp_after:wN \@@_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #3*#9 + #4*#8 + + \int_use:N \__int_eval:w 99990000 + #3*#9 + #4*#8 + \exp_after:wN \@@_mul_significand_drop:NNNNNw \int_use:N \__int_eval:w 100000000 + #4*#9 ; ; \exp_after:wN ; @@ -1549,7 +1549,7 @@ % \cs{@@_div_significand_small_o:wwwNNNNwN} |0| \meta{4d} |;| % ~~\meta{4d} |;| \meta{4d} |;| \meta{5d} |;| \meta{final sign} % \end{quote} -% Standard use of \cs{@@_basics_pack_low:NNNNNw} and +% Standard use of the functions \cs{@@_basics_pack_low:NNNNNw} and % \cs{@@_basics_pack_high:NNNNNw}. We finally get to use the % \meta{final sign} which has been sitting there for a while. % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 0bcc77eb831..ba6c3fc876e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-expo.dtx 5191 2014-07-10 17:31:12Z bruno $ +\GetIdInfo$Id: l3fp-expo.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point exponential-related functions} \begin{document} \DocInput{\jobname.dtx} @@ -293,12 +293,14 @@ % Exactly as we did for division, we set $B = 10^4 A - Q_{1}Z$. Then % \begin{align*} % 10^4 B -% \leq +% & \leq % A_{1}A_{2}.A_{3}A_{4} % - \left( \frac{A_{1}A_{2}}{y} - \frac{3}{2} \right) 10^4 Z -% \leq +% \\ +% & \leq % A_{1}A_{2} \left( 1 - \frac{10^4 Z}{y} \right) + 1 + \frac{3}{2} y -% \leq +% \\ +% & \leq % 10^8 \frac{A}{y} + 1 + \frac{3}{2} y % \end{align*} % In the same way, and using $1.7\cdot 10^4\leq y\leq 2.4\cdot 10^4$, @@ -539,7 +541,7 @@ % \end{macro} % % \begin{macro}{\@@_ln_exponent:wn} -% \begin{quote} +% \begin{quote}\raggedright % \cs{@@_ln_exponent:wn} % \Arg{s_1} \Arg{s_2} \Arg{s_3} \Arg{s_4} \Arg{s_5} \Arg{s_6} |;| % \Arg{exponent} @@ -951,7 +953,8 @@ % division by zero, or $a=\pm\infty$ and $b>0$ and the result is also % $+\infty$, but without any exception. % \begin{macrocode} -\cs_new:Npn \@@_pow_zero_or_inf:ww \s_@@ \@@_chk:w #1#2; \s_@@ \@@_chk:w #3#4 +\cs_new:Npn \@@_pow_zero_or_inf:ww + \s_@@ \@@_chk:w #1#2; \s_@@ \@@_chk:w #3#4 { \if_meaning:w 1 #4 \@@_case_return_same_o:w @@ -988,7 +991,8 @@ % \item[3] Return $b$. % \end{itemize} % \begin{macrocode} -\cs_new:Npn \@@_pow_normal:ww \s_@@ \@@_chk:w 1 #1#2#3; \s_@@ \@@_chk:w #4#5 +\cs_new:Npn \@@_pow_normal:ww + \s_@@ \@@_chk:w 1 #1#2#3; \s_@@ \@@_chk:w #4#5 { \if_int_compare:w \__str_if_eq_x:nn { #2 #3 } { 1 {1000} {0000} {0000} {0000} } = \c_zero @@ -1074,7 +1078,7 @@ \exp_after:wN \@@_pow_exponent:Nwnnnnnw % n\ln(10) - (-\ln(x)) \exp_after:wN + \else: - \exp_after:wN \@@_pow_exponent:Nwnnnnnw % -( |n|\ln(10) + (-\ln(x)) ) + \exp_after:wN \@@_pow_exponent:Nwnnnnnw % -(|n|\ln(10) + (-\ln(x))) \exp_after:wN - \fi: #2; #1; diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 080e95b6d98..8173f9b62f0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-extended.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3fp-extended.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-points with extended precision} \begin{document} \DocInput{\jobname.dtx} @@ -395,11 +395,13 @@ % + a_{3} \cdot b_{1}) \cdot 10^{-16} \\ % & + (a_{1} \cdot b_{4} + a_{2} \cdot b_{3} % + a_{3} \cdot b_{2} + a_{4} \cdot b_{1}) \cdot 10^{-20} \\ -% & + \left(a_{2} \cdot b_{4} + a_{3} \cdot b_{3} + a_{4} \cdot b_{2} +% & + \Bigl(a_{2} \cdot b_{4} + a_{3} \cdot b_{3} + a_{4} \cdot b_{2} +% \\ & \qquad % + \frac{a_{3} \cdot b_{4} + a_{4} \cdot b_{3} % + a_{1} \cdot b_{6} + a_{2} \cdot b_{5} % + a_{5} \cdot b_{2} + a_{6} \cdot b_{1}}{10^{4}} -% + a_{1} \cdot b_{5} + a_{5} \cdot b_{1}\right) \cdot 10^{-24} +% \\ & \qquad +% + a_{1} \cdot b_{5} + a_{5} \cdot b_{1}\Bigr) \cdot 10^{-24} % + O(10^{-24}), % \end{align*} % where the $O(10^{-24})$ stands for terms which are at most $5\cdot @@ -480,9 +482,11 @@ % & + (a_{1} \cdot b_{4} + a_{2} \cdot b_{3} + a_{3} \cdot b_{2} % + a_{4} \cdot b_{1}) \cdot 10^{-20} \\ % & + \Big(a_{2} \cdot b_{4} + a_{3} \cdot b_{3} + a_{4} \cdot b_{2} +% \\ & \qquad % + \frac{a_{3} \cdot b_{4} + a_{4} \cdot b_{3} % + a_{1} \cdot b_{6} + a_{2} \cdot b_{5} % + a_{5} \cdot b_{2} + a_{6} \cdot b_{1}}{10^{4}} +% \\ & \qquad % + a_{1} \cdot b_{5} + a_{5} \cdot b_{1} % + c_{5} c_{6} \Big) \cdot 10^{-24} % + O(10^{-24}), @@ -841,6 +845,7 @@ % & < % \left(10^{3}\meta{d_1} % + \eTeXfrac{\meta{d_2}}{10} + \frac{1}{2}\right) +% \\ & \qquad % \left( % \left(10^{3}-\eTeXfrac{\meta{d_2}}{10}\right) % \left(\frac{10^{9}}{\meta{d_1}} + \frac{1}{2} \right) diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 42ae286d490..d870cb6e4e1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-logic.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3fp-logic.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point conditionals} \begin{document} \DocInput{\jobname.dtx} @@ -490,7 +490,8 @@ \exp_after:wN #1 \fi: } -\cs_new:Npn \@@_ternary_loop_break:w #1 \fi: #2 \@@_ternary_break_point:n #3 +\cs_new:Npn \@@_ternary_loop_break:w + #1 \fi: #2 \@@_ternary_break_point:n #3 { \c_zero = \c_zero \fi: \exp_after:wN \@@_ternary_auxii:NwwN diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index aaa4ee728da..a277f1b8952 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-round.dtx 4744 2014-05-06 10:35:53Z joseph $ +\GetIdInfo$Id: l3fp-round.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point rounding} \begin{document} \DocInput{\jobname.dtx} @@ -119,7 +119,7 @@ % \item \cs{@@_round:NNN} \meta{sign} \meta{digit_1} \meta{digit_2} % can expand to \cs{c_zero} or \cs{c_one}. % \item \cs{@@_round_s:NNNw} \meta{sign} \meta{digit_1} \meta{digit_2} -% \meta{more digits} |;| can expand to |\c_zero ;| or |\c_one ;|. +% \meta{more digits}|;| can expand to |\c_zero ;| or |\c_one ;|. % \item \cs{@@_round_neg:NNN} \meta{sign} \meta{digit_1} \meta{digit_2} % can expand to \cs{c_zero} or \cs{c_one}. % \end{itemize} @@ -266,10 +266,11 @@ % \begin{syntax} % \cs{@@_round_neg:NNN} \meta{final sign} \meta{digit_1} \meta{digit_2} % \end{syntax} -% This expands to \cs{c_zero} or \cs{c_one}. Consider a number of -% the form $ \meta{final sign}.X\ldots X\meta{digit_1} $ with exactly -% $15$ (non-all-zero) digits before \meta{digit_1}, and subtract from it -% $\meta{final sign}.0\ldots0\meta{digit_2}$, where there are $16$ zeros. +% This expands to \cs{c_zero} or \cs{c_one} after doing the following +% test. Starting from a number of +% the form $ \meta{final sign}0.\meta{15 digits}\meta{digit_1} $ with exactly +% $15$ (non-all-zero) digits before \meta{digit_1}, subtract from it +% $\meta{final sign}0.0\ldots{}0\meta{digit_2}$, where there are $16$~zeros. % If in the current rounding mode the result should be rounded down, % then this function returns \cs{c_one}. Otherwise, \emph{i.e.}, % if the result is rounded back to the first operand, then this function diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 8ab6c3d7967..3e7e396c902 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-traps.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3fp-traps.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point exception trapping} \begin{document} \DocInput{\jobname.dtx} @@ -178,7 +178,10 @@ \__msg_kernel_error:nnxx { kernel } { unknown-fpu-trap-type } {#1} {#2} } - { \__msg_kernel_error:nnx { kernel } { unknown-fpu-exception } {#1} } + { + \__msg_kernel_error:nnx + { kernel } { unknown-fpu-exception } {#1} + } } } % \end{macrocode} @@ -395,7 +398,10 @@ % Some messages. % \begin{macrocode} \__msg_kernel_new:nnnn { kernel } { unknown-fpu-exception } - { The~FPU~exception~'#1'~is~not~known:~that~trap~will~never~be~triggered. } + { + 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 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 11415825d54..98917baea7d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -36,7 +36,7 @@ % %<*driver> \documentclass[full]{l3doc} -\GetIdInfo$Id: l3fp-trig.dtx 4721 2014-05-03 13:54:09Z joseph $ +\GetIdInfo$Id: l3fp-trig.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Floating-point trigonometric functions} \begin{document} \DocInput{\jobname.dtx} @@ -846,7 +846,7 @@ \exp_after:wN \@@_sin_series_aux_o:NNnwww \exp_after:wN #1 \__int_value:w - \if_int_odd:w \__int_eval:w ( #3 + \c_two ) / \c_four \__int_eval_end: + \if_int_odd:w \__int_eval:w (#3 + \c_two) / \c_four \__int_eval_end: #2 \else: \if_meaning:w #2 0 2 \else: 0 \fi: @@ -862,28 +862,28 @@ \exp_after:wN \use_ii:nn \fi: { % 1/18! - \@@_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0001}{5619}{2070}; - #4; {0000}{0000}{0000}{0477}{9477}{3324}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0000}{0011}{4707}{4559}{7730}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0000}{2087}{6756}{9878}{6810}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0027}{5573}{1922}{3985}{8907}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{2480}{1587}{3015}{8730}{1587}; - \@@_fixed_mul_sub_back:wwwn #4; {0013}{8888}{8888}{8888}{8888}{8889}; - \@@_fixed_mul_sub_back:wwwn #4; {0416}{6666}{6666}{6666}{6666}{6667}; - \@@_fixed_mul_sub_back:wwwn #4; {5000}{0000}{0000}{0000}{0000}{0000}; - \@@_fixed_mul_sub_back:wwwn #4;{10000}{0000}{0000}{0000}{0000}{0000}; + \@@_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0001}{5619}{2070}; + #4;{0000}{0000}{0000}{0477}{9477}{3324}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0011}{4707}{4559}{7730}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0000}{2087}{6756}{9878}{6810}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0027}{5573}{1922}{3985}{8907}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{2480}{1587}{3015}{8730}{1587}; + \@@_fixed_mul_sub_back:wwwn #4;{0013}{8888}{8888}{8888}{8888}{8889}; + \@@_fixed_mul_sub_back:wwwn #4;{0416}{6666}{6666}{6666}{6666}{6667}; + \@@_fixed_mul_sub_back:wwwn #4;{5000}{0000}{0000}{0000}{0000}{0000}; + \@@_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000}; { \@@_fixed_continue:wn 0, } } { % 1/17! - \@@_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0028}{1145}{7254}; - #4; {0000}{0000}{0000}{7647}{1637}{3182}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0000}{0160}{5904}{3836}{8216}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0002}{5052}{1083}{8544}{1719}; - \@@_fixed_mul_sub_back:wwwn #4; {0000}{0275}{5731}{9223}{9858}{9065}; - \@@_fixed_mul_sub_back:wwwn #4; {0001}{9841}{2698}{4126}{9841}{2698}; - \@@_fixed_mul_sub_back:wwwn #4; {0083}{3333}{3333}{3333}{3333}{3333}; - \@@_fixed_mul_sub_back:wwwn #4; {1666}{6666}{6666}{6666}{6666}{6667}; - \@@_fixed_mul_sub_back:wwwn #4;{10000}{0000}{0000}{0000}{0000}{0000}; + \@@_fixed_mul_sub_back:wwwn {0000}{0000}{0000}{0028}{1145}{7254}; + #4;{0000}{0000}{0000}{7647}{1637}{3182}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0000}{0160}{5904}{3836}{8216}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0002}{5052}{1083}{8544}{1719}; + \@@_fixed_mul_sub_back:wwwn #4;{0000}{0275}{5731}{9223}{9858}{9065}; + \@@_fixed_mul_sub_back:wwwn #4;{0001}{9841}{2698}{4126}{9841}{2698}; + \@@_fixed_mul_sub_back:wwwn #4;{0083}{3333}{3333}{3333}{3333}{3333}; + \@@_fixed_mul_sub_back:wwwn #4;{1666}{6666}{6666}{6666}{6666}{6667}; + \@@_fixed_mul_sub_back:wwwn#4;{10000}{0000}{0000}{0000}{0000}{0000}; { \@@_ep_mul:wwwwn 0, } #5,#6; } { @@ -951,12 +951,12 @@ \@@_fixed_mul_sub_back:wwwn #3;{10000}{0000}{0000}{0000}{0000}{0000}; { \@@_ep_mul:wwwwn 0, } #4,#5; { - \@@_fixed_mul_sub_back:wwwn {0000}{0007}{0258}{0681}{9408}{4706}; - #3; {0000}{2343}{7175}{1399}{6151}{7670}; - \@@_fixed_mul_sub_back:wwwn #3; {0019}{2638}{4588}{9232}{8861}{3691}; - \@@_fixed_mul_sub_back:wwwn #3; {0536}{6357}{0691}{4344}{6852}{4252}; - \@@_fixed_mul_sub_back:wwwn #3; {5263}{1578}{9473}{6842}{1052}{6315}; - \@@_fixed_mul_sub_back:wwwn #3;{10000}{0000}{0000}{0000}{0000}{0000}; + \@@_fixed_mul_sub_back:wwwn {0000}{0007}{0258}{0681}{9408}{4706}; + #3;{0000}{2343}{7175}{1399}{6151}{7670}; + \@@_fixed_mul_sub_back:wwwn #3;{0019}{2638}{4588}{9232}{8861}{3691}; + \@@_fixed_mul_sub_back:wwwn #3;{0536}{6357}{0691}{4344}{6852}{4252}; + \@@_fixed_mul_sub_back:wwwn #3;{5263}{1578}{9473}{6842}{1052}{6315}; + \@@_fixed_mul_sub_back:wwwn#3;{10000}{0000}{0000}{0000}{0000}{0000}; { \reverse_if:N \if_int_odd:w \__int_eval:w (#2 - \c_one) / \c_two \__int_eval_end: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 80e4bd46480..d8dd82e49ba 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3fp.dtx 5223 2014-07-18 01:54:05Z bruno $ +\GetIdInfo$Id: l3fp.dtx 5336 2014-08-22 10:26:35Z bruno $ {L3 Floating points} %</driver|package> %<*driver> @@ -813,8 +813,7 @@ % in all cases. % \end{function} % -% \begingroup \catcode`\|=12 -% \begin{function}[tested = m3fp-logic002]{TWO BARS} +% \begin{function}[tested = m3fp-logic002]{||} % \begin{syntax} % \cs{fp_eval:n} \{ \meta{operand_1} \texttt{||} \meta{operand_2} \} % \end{syntax} @@ -822,21 +821,18 @@ % value of \meta{operand_2}. Both \meta{operands} are evaluated in all % cases. % \end{function} -% \endgroup % -% \begingroup \catcode`\&=12 % \begin{function}[tested = m3fp-logic002]{&&} % \begin{syntax} -% \cs{fp_eval:n} \{ \meta{operand_1} \texttt{&&} \meta{operand_2} \} +% \cs{fp_eval:n} \{ \meta{operand_1} |&&| \meta{operand_2} \} % \end{syntax} % If \meta{operand_1} is false (equal to~$\pm 0$), use that value, % otherwise the value of \meta{operand_2}. Both \meta{operands} are % evaluated in all cases. % \end{function} -% \endgroup % % \begin{function}[tested = m3fp-logic001, updated = 2013-12-14] -% {\<, =, >, ?} +% {<, =, >, ?} % \begin{syntax} % \cs{fp_eval:n} \\ % ~~\{ \\ @@ -888,7 +884,6 @@ % boolean function). Those operations never raise exceptions. % \end{function} % -% \begingroup\catcode`\^=12 % \begin{function}[tested = m3fp-expo001]{**, ^} % \begin{syntax} % \cs{fp_eval:n} \{ \meta{operand_1} |**| \meta{operand_2} \} @@ -903,7 +898,6 @@ % when raising $\pm 0$ to a strictly negative power. % \enquote{Underflow} and \enquote{overflow} occur when appropriate. % \end{function} -% \endgroup % % \begin{function}[tested = m3fp-basics004]{abs} % \begin{syntax} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index dd98220454f..78d244e3845 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3int.dtx 5197 2014-07-11 06:42:47Z joseph $ +\GetIdInfo$Id: l3int.dtx 5372 2014-08-25 02:01:41Z bruno $ {L3 Integers} %</driver|package> %<*driver> @@ -713,14 +713,15 @@ % representation and leaves this in the input stream. % \end{function} % -% \begin{function}[EXP]{\int_from_roman:n} +% \begin{function}[updated = 2014-08-25, EXP]{\int_from_roman:n} % \begin{syntax} % \cs{int_from_roman:n} \Arg{roman numeral} % \end{syntax} % Converts the \meta{roman numeral} into the integer (base~$10$) % representation and leaves this in the input stream. The % \meta{roman numeral} may be in upper or lower case; if the numeral -% is not valid then the resulting value will be $-1$. +% contains letters besides |mdclxvi| or |MDCLXVI| then the resulting +% value will be $-1$. % \end{function} % % \begin{function}[EXP]{\int_from_base:nn} @@ -744,7 +745,7 @@ % % \begin{function}[added = 2011-11-22, updated = 2012-05-27]{\int_show:n} % \begin{syntax} -% \cs{int_show:n} \meta{integer expression} +% \cs{int_show:n} \Arg{integer expression} % \end{syntax} % Displays the result of evaluating the \meta{integer expression} % on the terminal. @@ -974,10 +975,12 @@ % corrected to the \enquote{real} version here. % \begin{macrocode} %<*initex> -\cs_set:Npn \int_eval:n #1 { \@@_value:w \@@_eval:w #1 \@@_eval_end: } +\cs_set:Npn \int_eval:n #1 + { \@@_value:w \@@_eval:w #1 \@@_eval_end: } %</initex> %<*package> -\cs_new:Npn \int_eval:n #1 { \@@_value:w \@@_eval:w #1 \@@_eval_end: } +\cs_new:Npn \int_eval:n #1 + { \@@_value:w \@@_eval:w #1 \@@_eval_end: } %</package> % \end{macrocode} % \end{macro} @@ -1211,8 +1214,10 @@ % \begin{macro}[pTF]{\int_if_exist:N, \int_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -2099,144 +2104,93 @@ % % \subsection{Converting from other formats to integers} % -% \begin{macro}[int]{\@@_get_sign:n} -% \begin{macro}[int]{\@@_get_digits:n} -% \begin{macro}[aux] -% {\@@_get_sign_and_digits:nNNN, \@@_get_sign_and_digits:oNNN} -% Finding a number and its sign requires dealing with an arbitrary -% list of |+| and |-| symbols. This is done by working through token -% by token until there is something else at the start of the input. -% The sign of the input is tracked by the first Boolean used by the -% auxiliary function. -% \begin{macrocode} -\cs_new:Npn \@@_get_sign:n #1 - { - \@@_get_sign_and_digits:nNNN {#1} - \c_true_bool \c_true_bool \c_false_bool - } -\cs_new:Npn \@@_get_digits:n #1 - { - \@@_get_sign_and_digits:nNNN {#1} - \c_true_bool \c_false_bool \c_true_bool - } -% \end{macrocode} -% The auxiliary loops through, finding sign tokens and removing them. -% The sign itself is carried through as a flag. +% \begin{macro}[aux,rEXP]{\@@_pass_signs:wn, \@@_pass_signs_end:wn} +% Called as \cs{@@_pass_signs:wn} \meta{signs and digits} \cs{q_stop} +% \Arg{code}, this function leaves in the input stream any sign it +% finds, then inserts the \meta{code} before the first non-sign token +% (and removes \cs{q_stop}). More precisely, it deletes any~|+| and +% passes any~|-| to the input stream, hence should be called in an +% integer expression. % \begin{macrocode} -\cs_new:Npn \@@_get_sign_and_digits:nNNN #1#2#3#4 +\cs_new:Npn \@@_pass_signs:wn #1 { - \exp_args:Nf \tl_if_head_eq_charcode:nNTF {#1} - - { - \bool_if:NTF #2 - { - \@@_get_sign_and_digits:oNNN - { \use_none:n #1 } \c_false_bool #3#4 - } - { - \@@_get_sign_and_digits:oNNN - { \use_none:n #1 } \c_true_bool #3#4 - } - } - { - \exp_args:Nf \tl_if_head_eq_charcode:nNTF {#1} + - { \@@_get_sign_and_digits:oNNN { \use_none:n #1 } #2#3#4 } - { - \bool_if:NT #3 { \bool_if:NF #2 - } - \bool_if:NT #4 {#1} - } - } + \if:w + \if:w - \exp_not:N #1 + \fi: \exp_not:N #1 + \exp_after:wN \@@_pass_signs:wn + \else: + \exp_after:wN \@@_pass_signs_end:wn + \exp_after:wN #1 + \fi: } -\cs_generate_variant:Nn \@@_get_sign_and_digits:nNNN { o } +\cs_new:Npn \@@_pass_signs_end:wn #1 \q_stop #2 { #2 #1 } % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\int_from_alph:n} % \UnitTested -% \begin{macro}[aux]{\@@_from_alph:n} -% \begin{macro}[aux]{\@@_from_alph:nN} -% \begin{macro}[aux]{\@@_from_alph:N} -% The aim here is to iterate through the input, converting one letter at -% a time to a number. The same approach is also used for base -% conversion, but this needs a different final auxiliary. +% \begin{macro}[aux]{\@@_from_alph:nN, \@@_from_alph:N} +% First take care of signs then loop through the input using the +% \texttt{recursion} quarks. The \cs{@@_from_alph:nN} auxiliary +% collects in its first argument the value obtained so far, and the +% auxiliary \cs{@@_from_alph:N} converts one letter to an expression +% which evaluates to the correct number. % \begin{macrocode} \cs_new:Npn \int_from_alph:n #1 { \int_eval:n { - \@@_get_sign:n {#1} - \exp_args:Nf \@@_from_alph:n { \@@_get_digits:n {#1} } + \@@_pass_signs:wn #1 + \q_stop { \@@_from_alph:nN { 0 } } + \q_recursion_tail \q_recursion_stop } } -\cs_new:Npn \@@_from_alph:n #1 - { \@@_from_alph:nN { 0 } #1 \q_nil } \cs_new:Npn \@@_from_alph:nN #1#2 { - \quark_if_nil:NTF #2 - {#1} - { - \exp_args:Nf \@@_from_alph:nN - { \int_eval:n { #1 * 26 + \@@_from_alph:N #2 } } - } + \quark_if_recursion_tail_stop_do:Nn #2 {#1} + \exp_args:Nf \@@_from_alph:nN + { \int_eval:n { #1 * 26 + \@@_from_alph:N #2 } } } \cs_new:Npn \@@_from_alph:N #1 - { \int_eval:n { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } } } + { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\int_from_base:nn} % \UnitTested -% \begin{macro}[aux]{\@@_from_base:nn} -% \begin{macro}[aux]{\@@_from_base:nnN} -% \begin{macro}[aux]{\@@_from_base:N} -% Conversion to base ten means stripping off the sign then iterating -% through the input one token at a time. The total number is then added -% up as the code loops. +% \begin{macro}[aux]{\@@_from_base:nnN, \@@_from_base:N} +% Leave the signs into the integer expression, then loop through +% characters, collecting the value found so far in the first argument +% of \cs{@@_from_base:nnN}. To convert a single character, +% \cs{@@_from_base:N} checks first for digits, then distinguishes +% lower from upper case letters, turning them into the appropriate +% number. Note that this auxiliary does not use \cs{int_eval:n}, +% hence is not safe for general use. % \begin{macrocode} \cs_new:Npn \int_from_base:nn #1#2 { \int_eval:n { - \@@_get_sign:n {#1} - \exp_args:Nf \@@_from_base:nn - { \@@_get_digits:n {#1} } {#2} + \@@_pass_signs:wn #1 + \q_stop { \@@_from_base:nnN { 0 } {#2} } + \q_recursion_tail \q_recursion_stop } } -\cs_new:Npn \@@_from_base:nn #1#2 - { \@@_from_base:nnN { 0 } { #2 } #1 \q_nil } \cs_new:Npn \@@_from_base:nnN #1#2#3 { - \quark_if_nil:NTF #3 - {#1} - { - \exp_args:Nf \@@_from_base:nnN - { \int_eval:n { #1 * #2 + \@@_from_base:N #3 } } - {#2} - } + \quark_if_recursion_tail_stop_do:Nn #3 {#1} + \exp_args:Nf \@@_from_base:nnN + { \int_eval:n { #1 * #2 + \@@_from_base:N #3 } } + {#2} } -% \end{macrocode} -% The conversion here will take lower or upper case letters and turn -% them into the appropriate number, hence the two-part nature of the -% function. -% \begin{macrocode} \cs_new:Npn \@@_from_base:N #1 { \int_compare:nNnTF { `#1 } < { 58 } {#1} - { - \int_eval:n - { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } } - } + { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } } } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\int_from_bin:n, \int_from_hex:n, \int_from_oct:n} % \UnitTested @@ -2285,63 +2239,53 @@ % \UnitTested % \TestMissing{boundary cases / wrong input?} % \begin{macro}[aux]{\@@_from_roman:NN} -% \begin{macro}[aux]{\@@_from_roman_end:w} -% \begin{macro}[aux]{\@@_from_roman_clean_up:w} +% \begin{macro}[aux]{\@@_from_roman_error:w} % The method here is to iterate through the input, finding the % appropriate value for each letter and building up a sum. This is -% then evaluated by \TeX{}. +% then evaluated by \TeX{}. If any unknown letter is found, skip to +% the closing parenthesis and insert |*0-1| afterwards, to replace the +% value by $-1$. % \begin{macrocode} \cs_new:Npn \int_from_roman:n #1 { - \tl_if_blank:nF {#1} + \int_eval:n { - \exp_after:wN \@@_from_roman_end:w - \@@_value:w \@@_eval:w - \@@_from_roman:NN #1 Q \q_stop + ( + \c_zero + \exp_after:wN \@@_from_roman:NN \tl_to_str:n {#1} + \q_recursion_tail \q_recursion_tail \q_recursion_stop + ) } } \cs_new:Npn \@@_from_roman:NN #1#2 { - \str_if_eq:nnTF {#1} { Q } - {#1#2} + \quark_if_recursion_tail_stop:N #1 + \int_if_exist:cF { c_@@_from_roman_ #1 _int } + { \@@_from_roman_error:w } + \quark_if_recursion_tail_stop_do:Nn #2 + { + \use:c { c_@@_from_roman_ #1 _int } } + \int_if_exist:cF { c_@@_from_roman_ #2 _int } + { \@@_from_roman_error:w } + \int_compare:nNnTF + { \use:c { c_@@_from_roman_ #1 _int } } + < + { \use:c { c_@@_from_roman_ #2 _int } } { - \str_if_eq:nnTF {#2} { Q } - { - \int_if_exist:cF { c_@@_from_roman_ #1 _int } - { \@@_from_roman_clean_up:w } - + - \use:c { c_@@_from_roman_ #1 _int } - #2 - } - { - \int_if_exist:cF { c_@@_from_roman_ #1 _int } - { \@@_from_roman_clean_up:w } - \int_if_exist:cF { c_@@_from_roman_ #2 _int } - { \@@_from_roman_clean_up:w } - \int_compare:nNnTF - { \use:c { c_@@_from_roman_ #1 _int } } - < - { \use:c { c_@@_from_roman_ #2 _int } } - { - + \use:c { c_@@_from_roman_ #2 _int } - - \use:c { c_@@_from_roman_ #1 _int } - \@@_from_roman:NN - } - { - + \use:c { c_@@_from_roman_ #1 _int } - \@@_from_roman:NN #2 - } - } + + \use:c { c_@@_from_roman_ #2 _int } + - \use:c { c_@@_from_roman_ #1 _int } + \@@_from_roman:NN + } + { + + \use:c { c_@@_from_roman_ #1 _int } + \@@_from_roman:NN #2 } } -\cs_new:Npn \@@_from_roman_end:w #1 Q #2 \q_stop - { \tl_if_empty:nTF {#2} {#1} {#2} } -\cs_new:Npn \@@_from_roman_clean_up:w #1 Q { + 0 Q -1 } +\cs_new:Npn \@@_from_roman_error:w #1 \q_recursion_stop #2 + { #2 * \c_zero - \c_one } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} -% \end{macro} % % \subsection{Viewing integer} % @@ -2370,22 +2314,15 @@ % This is needed early, and so is in \pkg{l3basics} % \end{variable} % -% \begin{variable}{\c_zero} -% Again, one in \pkg{l3basics} for obvious reasons. -% \end{variable} -% -% \begin{variable}{\c_six, \c_seven} -% \begin{variable}{\c_twelve} -% \begin{variable}{\c_sixteen} -% Once again, in \pkg{l3basics}. -% \end{variable} -% \end{variable} +% \begin{variable}{\c_zero, \c_sixteen} +% Again, in \pkg{l3basics} % \end{variable} % % \begin{variable} % { -% \c_one, \c_two, \c_three, \c_four, \c_five, \c_eight, \c_nine, \c_ten, -% \c_eleven, \c_thirteen, \c_fourteen, \c_fifteen, +% \c_one, \c_two, \c_three, \c_four, \c_five, \c_six, \c_seven, \c_eight, +% \c_nine, \c_ten, \c_eleven, \c_twelve, \c_thirteen, \c_fourteen, +% \c_fifteen % } % Low-number values not previously defined. % \begin{macrocode} @@ -2394,10 +2331,13 @@ \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 } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 648508d7777..49b443977de 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3keys.dtx 5121 2014-06-12 17:37:56Z joseph $ +\GetIdInfo$Id: l3keys.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Key-value interfaces} %</driver|package> %<*driver> @@ -939,7 +939,11 @@ \tl_put_right:Nx \l_@@_parse_tl { \exp_not:c - { @@_key_no_value_elt_ \int_use:N \g_@@_level_int :n } + { + @@_key_no_value_elt_ + \int_use:N \g_@@_level_int + :n + } { \exp_not:o \l_@@_key_tl } } } @@ -1326,11 +1330,13 @@ { \@@_choice_make:N \@@_choice_find:n } \cs_new_protected_nopar:Npn \@@_multichoice_make: { \@@_choice_make:N \@@_multichoice_find:n } -\cs_new_protected_nopar:Npn \@@_choice_make:N #1 - { - \prop_if_exist:cTF { \c_@@_info_root_tl \@@_parent:o \l_keys_path_tl } +\cs_new_protected_nopar:Npn \@@_choice_make:N #1 + { + \prop_if_exist:cTF + { \c_@@_info_root_tl \@@_parent:o \l_keys_path_tl } { - \prop_get:cnNTF { \c_@@_info_root_tl \@@_parent:o \l_keys_path_tl } + \prop_get:cnNTF + { \c_@@_info_root_tl \@@_parent:o \l_keys_path_tl } { choice } \l_keys_value_tl { \__msg_kernel_error:nnxx { kernel } { nested-choice-key } @@ -1418,7 +1424,10 @@ \cs_new_protected:Npn \@@_default_set:n #1 { \prop_if_exist:cT { \c_@@_info_root_tl \l_keys_path_tl } - { \prop_put:cnn { \c_@@_info_root_tl \l_keys_path_tl } { default } {#1} } + { + \prop_put:cnn { \c_@@_info_root_tl \l_keys_path_tl } + { default } {#1} + } } % \end{macrocode} % \end{macro} @@ -1461,7 +1470,10 @@ \cs_new_protected:Npn \@@_meta_make:n #1 { \@@_cmd_set:Vo \l_keys_path_tl - { \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_tl } {#1} } + { + \exp_after:wN \keys_set:nn + \exp_after:wN { \l_@@_module_tl } {#1} + } } \cs_new_protected:Npn \@@_meta_make:nn #1#2 { \@@_cmd_set:Vn \l_keys_path_tl { \keys_set:nn {#1} {#2} } } @@ -1477,9 +1489,12 @@ { \prop_if_exist:cT { \c_@@_info_root_tl \l_keys_path_tl } { - \prop_remove:cn { \c_@@_info_root_tl \l_keys_path_tl } { required } - \prop_remove:cn { \c_@@_info_root_tl \l_keys_path_tl } { forbidden } - \prop_put:cnn { \c_@@_info_root_tl \l_keys_path_tl } {#1} { true } + \prop_remove:cn { \c_@@_info_root_tl \l_keys_path_tl } + { required } + \prop_remove:cn { \c_@@_info_root_tl \l_keys_path_tl } + { forbidden } + \prop_put:cnn { \c_@@_info_root_tl \l_keys_path_tl } + {#1} { true } } } % \end{macrocode} @@ -1493,7 +1508,11 @@ { \use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 } \@@_cmd_set:nx { \l_keys_path_tl } - { \exp_not:c { #2 _ #3 set:N #4 } \exp_not:N #1 \exp_not:n { {##1} } } + { + \exp_not:c { #2 _ #3 set:N #4 } + \exp_not:N #1 + \exp_not:n { {##1} } + } } \cs_generate_variant:Nn \@@_variable_set:NnnN { c } % \end{macrocode} @@ -2118,7 +2137,8 @@ % \begin{macro}[EXP,pTF]{\keys_if_choice_exist:nnn} % Just an alternative view on \cs{keys_if_exist:nn(TF)}. % \begin{macrocode} -\prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3 { p , T , F , TF } +\prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3 + { p , T , F , TF } { \cs_if_exist:cTF { \c_@@_code_root_tl #1 / #2 / #3 } { \prg_return_true: } @@ -2151,7 +2171,8 @@ \__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. + 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'. } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 1adc34d8e17..0e48e2abac8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3msg.dtx 4943 2014-05-30 17:26:32Z bruno $ +\GetIdInfo$Id: l3msg.dtx 5358 2014-08-24 09:19:52Z bruno $ {L3 Messages} %</driver|package> %<*driver> @@ -1011,8 +1011,20 @@ % trailing closing braces are turned into spaces to hide them as well. % The group in which we alter the definition of the active |!| is % closed before producing the message: this ensures that tokens -% inserted by typing |I| in the command-line will bee inserted after +% inserted by typing |I| in the command-line will be inserted after % the message is entirely cleaned up. + +% The \cs{__iow_with:Nnn} auxiliary, defined in \pkg{l3file}, expects +% an \meta{integer variable}, an integer \meta{value}, and some +% \meta{code}. It runs the \meta{code} after ensuring that the +% \meta{integer variable} takes the given \meta{value}, then restores +% the former value of the \meta{integer variable} if needed. We use +% it to ensure that the \tn{newlinechar} is $10$, as needed for +% \cs{iow_newline:} to work, and that \tn{errorcontextlines} is $-1$, +% to avoid showing irrelevant context. Note that restoring the former +% value of these integers requires inserting tokens after the +% \tn{errmessage}, which go in the way of tokens which could be +% inserted by the user. This is unavoidable. % \begin{macrocode} \group_begin: \char_set_lccode:nn {`\{} {`\ } @@ -1031,19 +1043,25 @@ \iow_newline: ! } - \group_begin: - \cs_set_protected_nopar:Npn & - { - \tex_errmessage:D - { - #1 - \use_none:n - { ............................................ } - } - } - \exp_after:wN - \group_end: - & + \__iow_with:Nnn \tex_newlinechar:D { `\^^J } + { + \__iow_with:Nnn \tex_errorcontextlines:D \c_minus_one + { + \group_begin: + \cs_set_protected_nopar:Npn & + { + \tex_errmessage:D + { + #1 + \use_none:n + { ............................................ } + } + } + \exp_after:wN + \group_end: + & + } + } } } % \end{macrocode} @@ -1120,7 +1138,8 @@ \cs_set_protected:Npn \@@_class_new:nn #1#2 { \prop_new:c { l_@@_redirect_ #1 _prop } - \cs_new_protected:cpn { @@_ #1 _code:nnnnnn } ##1##2##3##4##5##6 {#2} + \cs_new_protected:cpn { @@_ #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 @@ -1574,7 +1593,8 @@ \tl_if_eq:NNTF \l_@@_class_tl \l_@@_current_class_tl { \prop_put:cnn { l_@@_redirect_ #2 _prop } {#3} {#2} - \@@_kernel_warning:nnxxxx { kernel } { message-redirect-loop } + \@@_kernel_warning:nnxxxx + { kernel } { message-redirect-loop } { \seq_item:Nn \l_@@_class_loop_seq { \c_one } } { \seq_item:Nn \l_@@_class_loop_seq { \c_two } } {#3} @@ -2080,6 +2100,10 @@ % the resulting token list \cs{l_@@_internal_tl} is displayed to the % terminal, with an odd \cs{exp_after:wN} which expands the closing % brace to improve the output slightly. +% The calls to \cs{__iow_with:Nnn} ensure that the \tn{newlinechar} is +% set to~$10$ so that the \cs{iow_newline:} inserted by the +% line-wrapping code are correctly recognized by \TeX{}, and that +% \tn{errorcontextlines} is $-1$ to avoid printing irrelevant context. % \begin{macrocode} \cs_new_protected:Npn \@@_show_variable:Nnn #1#2#3 { @@ -2100,8 +2124,14 @@ \tl_if_empty:nTF {#1} { \tl_clear:N \l_@@_internal_tl } { \tl_set:Nf \l_@@_internal_tl { \@@_show_variable_aux:w #1 } } - \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN - { \exp_after:wN \l_@@_internal_tl } + \__iow_with:Nnn \tex_newlinechar:D { 10 } + { + \__iow_with:Nnn \tex_errorcontextlines:D \c_minus_one + { + \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN + { \exp_after:wN \l_@@_internal_tl } + } + } } \cs_new:Npn \@@_show_variable_aux:w #1 > { } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 1132202df40..a3440696f39 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3names.dtx 4993 2014-06-02 09:39:35Z joseph $ +\GetIdInfo$Id: l3names.dtx 5343 2014-08-22 19:32:35Z bruno $ {L3 Namespace for primitives} %</driver|package> %<*driver> @@ -618,13 +618,13 @@ \__kernel_primitive:NN \pardir \luatex_pardir:D \__kernel_primitive:NN \textdir \luatex_textdir:D % \end{macrocode} -% -% End of the \enquote{just the names} part of the source. +% +% End of the \enquote{just the names} part of the source. % \begin{macrocode} %</initex|names|package> %<*initex|package> % \end{macrocode} -% +% % The job is done: close the group (using the primitive renamed!). % \begin{macrocode} \tex_endgroup:D @@ -668,16 +668,17 @@ % implemented using some Lua code in the current Con\TeX{}t. % \begin{macrocode} \etex_ifdefined:D \normalend - \tex_let:D \tex_outer:D \normalouter - \tex_let:D \tex_input:D \normalinput \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_vcenter:D \normalvcneter - \tex_let:D \tex_over:D \normalover \tex_let:D \tex_mathop:D \normalmathop \tex_let:D \tex_month:D \normalmonth - \tex_let:D \tex_everyjob:D \normaleveryjob + \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 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index 3613101e0b6..92881b93abf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3prg.dtx 4728 2014-05-04 13:25:37Z joseph $ +\GetIdInfo$Id: l3prg.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Control structures} %</driver|package> %<*driver> @@ -511,7 +511,7 @@ % then loop until the \meta{boolean expression} is \texttt{false}. % \end{function} % -% \section{Producing $n$ copies} +% \section{Producing multiple copies} % % \begin{function}[updated = 2011-07-04, EXP]{\prg_replicate:nn} % \begin{syntax} @@ -922,8 +922,10 @@ % \begin{macro}[pTF]{\bool_if_exist:N, \bool_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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_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 } % \end{macrocode} % \end{macro} % @@ -1179,8 +1181,10 @@ % evaluation. This is slightly tricky as there are no braces so we % have to play match the |()| manually. % \begin{macrocode} -\cs_new_nopar:cpn { @@_&_0:w } & { \@@_eval_skip_to_end_auxi:Nw \c_false_bool } -\cs_new_nopar:cpn { @@_|_1:w } | { \@@_eval_skip_to_end_auxi:Nw \c_true_bool } +\cs_new_nopar:cpn { @@_&_0:w } & + { \@@_eval_skip_to_end_auxi:Nw \c_false_bool } +\cs_new_nopar:cpn { @@_|_1:w } | + { \@@_eval_skip_to_end_auxi:Nw \c_true_bool } % \end{macrocode} % There is always at least one |)| waiting, namely the outer % one. However, we are facing the problem that there may be more than @@ -1367,7 +1371,7 @@ % \end{macrocode} % \end{macro} % -% \subsection{Producing $n$ copies} +% \subsection{Producing multiple copies} % % \begin{macrocode} %<@@=prg> @@ -1427,8 +1431,8 @@ % ten copies of its previous argument it will severely affect the main % memory once you start demanding hundreds of thousands of copies. Now % I don't think this is a real limitation for any ordinary use, and if -% necessary, it is possible to write -% |\prg_replicate:nn{1000}{\prg_replicate:nn{1000}{|\meta{code}|}}|. An +% necessary, it is possible to write \cs{prg_replicate:nn} |{1000}| +% |{| \cs{prg_replicate:nn} |{1000}| \Arg{code}~|}|. An % alternative approach is to create a string of |m|'s with % \cs{__int_to_roman:w} which can be done with just four macros but that % method has its own problems since it can exhaust the string @@ -1451,9 +1455,12 @@ % the copies. The first function takes |:n| as a parameter. % \begin{macrocode} \cs_new:Npn \@@_replicate_ :n #1 { \cs_end: } -\cs_new:cpn { @@_replicate_0:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} } -\cs_new:cpn { @@_replicate_1:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1 } -\cs_new:cpn { @@_replicate_2:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1 } +\cs_new:cpn { @@_replicate_0:n } #1 + { \cs_end: {#1#1#1#1#1#1#1#1#1#1} } +\cs_new:cpn { @@_replicate_1:n } #1 + { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1 } +\cs_new:cpn { @@_replicate_2:n } #1 + { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1 } \cs_new:cpn { @@_replicate_3:n } #1 { \cs_end: {#1#1#1#1#1#1#1#1#1#1} #1#1#1 } \cs_new:cpn { @@_replicate_4:n } #1 diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 6a74a896de7..e8d253233ad 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3prop.dtx 5215 2014-07-17 13:23:20Z joseph $ +\GetIdInfo$Id: l3prop.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Property lists} %</driver|package> %<*driver> @@ -512,7 +512,7 @@ %<@@=prop> % \end{macrocode} % -% A property list is a macro whose top-level expansion is for the form +% A property list is a macro whose top-level expansion is of the form % \begin{quote} % \cs{s_@@} % \cs{@@_pair:wn} \meta{key_1} \cs{s_@@} \Arg{value_1} \\ @@ -916,8 +916,10 @@ % \begin{macro}[pTF, tested = m3prop004]{\prop_if_exist:N, \prop_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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_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 } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 29352c0212b..755b37577dc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3quark.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3quark.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Quarks} %</driver|package> %<*driver> @@ -295,7 +295,8 @@ \cs_new:Npn \my_map_dbl:nn #1#2 { \cs_set:Npn \__my_map_dbl_fn:nn ##1 ##2 {#2} - \__my_map_dbl:nn #1 \q_recursion_tail \q_recursion_tail \q_recursion_stop + \__my_map_dbl:nn #1 \q_recursion_tail \q_recursion_tail + \q_recursion_stop } % \end{macrocode} % @@ -393,6 +394,10 @@ % % \subsection{Quarks} % +% \begin{macrocode} +%<@@=quark> +% \end{macrocode} +% % \begin{macro}{\quark_new:N} % \UnitTested % Allocate a new quark. @@ -461,30 +466,34 @@ % \begin{macro} % {\quark_if_recursion_tail_stop_do:nn,\quark_if_recursion_tail_stop_do:on} % \UnitTested -% The same idea applies when testing multiple tokens, but here we just -% compare the token list to \cs{q_recursion_tail} as a string. +% \begin{macro}[aux]{\@@_if_recursion_tail:w} +% See \cs{quark_if_nil:nTF} for the details. Expanding +% \cs{@@_if_recursion_tail:w} once in front of the tokens chosen here +% gives an empty result if and only if |#1|~is exactly +% \cs{q_recursion_tail}. % \begin{macrocode} \cs_new:Npn \quark_if_recursion_tail_stop:n #1 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN \use_none_delimit_by_q_recursion_stop:w - \fi: + \tl_if_empty:oTF + { \@@_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 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw - \else: - \exp_after:wN \use_none:n - \fi: + \tl_if_empty:oTF + { \@@_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + { \use_i_delimit_by_q_recursion_stop:nw } + { \use_none:n } } +\cs_new:Npn \@@_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 } % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{macro}{\__quark_if_recursion_tail_break:NN} % \begin{macro}{\__quark_if_recursion_tail_break:nN} @@ -499,10 +508,10 @@ } \cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN #2 - \fi: + \tl_if_empty:oTF + { \@@_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + {#2} + { } } % \end{macrocode} % \end{macro} @@ -546,26 +555,34 @@ % \UnitTested % \begin{macro}[pTF]{\quark_if_no_value:n} % \UnitTested -% These are essentially \cs{str_if_eq:nn} tests but done directly. +% \begin{macro}[aux]{\@@_if_nil:w, \@@_if_no_value:w} +% Let us explain |\quark_if_nil:n(TF)|. Expanding \cs{@@_if_nil:w} +% once is safe thanks to the trailing \cs{q_nil} |??!|. The result of +% expanding once is empty if and only if both delimited arguments |#1| +% and~|#2| are empty and |#3|~is delimited by the last tokens~|?!|. +% Thanks to the leading~|{}|, the argument~|#1| is empty if and only +% if the argument of \cs{quark_if_nil:n} starts with \cs{q_nil}. The +% argument~|#2| is empty if and only if this \cs{q_nil} is followed +% immediately by~|?| or by~|{}?|, coming either from the trailing +% tokens in the definition of \cs{quark_if_nil:n}, or from its +% argument. In the first case, \cs{@@_if_nil:w} is followed by +% |{}\q_nil| |{}?| |!\q_nil|~|??!|, hence |#3|~is delimited by the +% final~|?!|, and the test returns \texttt{true} as wanted. In the +% second case, the result is not empty since the first~|?!| in the +% definition of \cs{quark_if_nil:n} stop~|#3|. % \begin{macrocode} \prg_new_conditional:Nnn \quark_if_nil:n { p, T , F , TF } { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_nil } { \exp_not:n {#1} } = \c_zero - \prg_return_true: - \else: - \prg_return_false: - \fi: + \__tl_if_empty_return:o + { \@@_if_nil:w {} #1 {} ? ! \q_nil ? ? ! } } +\cs_new:Npn \@@_if_nil:w #1 \q_nil #2 ? #3 ? ! { #1 #2 } \prg_new_conditional:Nnn \quark_if_no_value:n { p, T , F , TF } { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_no_value } { \exp_not:n {#1} } = \c_zero - \prg_return_true: - \else: - \prg_return_false: - \fi: + \__tl_if_empty_return:o + { \@@_if_no_value:w {} #1 {} ? ! \q_no_value ? ? ! } } +\cs_new:Npn \@@_if_no_value:w #1 \q_no_value #2 ? #3 ? ! { #1 #2 } \cs_generate_variant:Nn \quark_if_nil_p:n { V , o } \cs_generate_variant:Nn \quark_if_nil:nTF { V , o } \cs_generate_variant:Nn \quark_if_nil:nT { V , o } @@ -573,6 +590,7 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \begin{variable}{\q__tl_act_mark, \q__tl_act_stop} % These private quarks are needed by \pkg{l3tl}, but that is loaded diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index 813aee51c33..8fc257e4d54 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3seq.dtx 5232 2014-07-18 19:32:54Z joseph $ +\GetIdInfo$Id: l3seq.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Sequences and stacks} %</driver|package> %<*driver> @@ -1071,8 +1071,10 @@ % \begin{macro}[pTF]{\seq_if_exist:N, \seq_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -1793,7 +1795,10 @@ \q_stop { } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } + { + \__msg_kernel_expandable_error:nnn + { kernel } { bad-variable } {#1} + } } \cs_generate_variant:Nn \seq_use:Nnnn { c } \cs_new:Npn \@@_use:NNnNnn #1#2#3#4#5#6 { \exp_not:n { #3 #6 #5 } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index d977bc4cebd..d82f85327f8 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -38,7 +38,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3skip.dtx 5211 2014-07-17 07:22:35Z joseph $ +\GetIdInfo$Id: l3skip.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Dimensions and skips} %</driver|package> %<*driver> @@ -515,7 +515,7 @@ % % \begin{function}[added = 2011-11-22, updated = 2012-05-27]{\dim_show:n} % \begin{syntax} -% \cs{dim_show:n} \meta{dimension expression} +% \cs{dim_show:n} \Arg{dimension expression} % \end{syntax} % Displays the result of evaluating the \meta{dimension expression} % on the terminal. @@ -704,7 +704,7 @@ % % \begin{function}[added = 2011-11-22, updated = 2012-05-27]{\skip_show:n} % \begin{syntax} -% \cs{skip_show:n} \meta{skip expression} +% \cs{skip_show:n} \Arg{skip expression} % \end{syntax} % Displays the result of evaluating the \meta{skip expression} % on the terminal. @@ -900,7 +900,7 @@ % % \begin{function}[added = 2011-11-22, updated = 2012-05-27]{\muskip_show:n} % \begin{syntax} -% \cs{muskip_show:n} \meta{muskip expression} +% \cs{muskip_show:n} \Arg{muskip expression} % \end{syntax} % Displays the result of evaluating the \meta{muskip expression} % on the terminal. @@ -1053,8 +1053,10 @@ % \begin{macro}[pTF]{\dim_if_exist:N, \dim_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -1556,8 +1558,10 @@ % \begin{macro}[pTF]{\skip_if_exist:N, \skip_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % @@ -1801,8 +1805,10 @@ % \begin{macro}[pTF]{\muskip_if_exist:N, \muskip_if_exist:c} % Copies of the \texttt{cs} functions defined in \pkg{l3basics}. % \begin{macrocode} -\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 } +\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 } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index c4460d5ae0b..c73c8ed9f35 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3str.dtx 5158 2014-06-19 08:05:56Z joseph $ +\GetIdInfo$Id: l3str.dtx 5368 2014-08-24 22:32:57Z bruno $ {L3 Strings} %</driver|package> %<*driver> @@ -67,20 +67,20 @@ % \maketitle % % \begin{documentation} -% +% % \TeX{} associates each character with a category code: as such, there is no % concept of a \enquote{string} as commonly understood in many other % programming languages. However, there are places where we wish to manipulate % token lists while in some sense \enquote{ignoring} category codes: this is % done by treating token lists as strings in a \TeX{} sense. -% +% % A \TeX{} string (and thus an \pkg{expl3} string) is a series of characters % which have category code $12$ (\enquote{other}) with the exception of % space characters which have category code $10$ (\enquote{space}). Thus % at a technical level, a \TeX{} string is a token list with the appropriate % category codes. In this documentation, these will simply be referred to as % strings: note that they can be stored in token lists as normal. -% +% % The functions documented here take literal token lists, % convert to strings and then carry out manipulations. Thus they may % informally be described as \enquote{ignoring} category code. Note that @@ -88,7 +88,7 @@ % \cs{token_to_str:N} (and variants) will generate strings from the appropriate % input: these are documented in \pkg{l3basics}, \pkg{l3tl} and \pkg{l3token}, % respectively. -% +% % \section{The first character from a string} % % \begin{function}[added = 2011-08-10, EXP]{\str_head:n,\str_tail:n} @@ -104,7 +104,7 @@ % a space. If the \meta{token list} argument is entirely empty, % nothing is left in the input stream. % \end{function} -% +% % \subsection{Tests on strings} % % \begin{function}[EXP,pTF] @@ -164,7 +164,7 @@ % % \begin{function}[added = 2013-07-24, EXP, TF]{\str_case_x:nn} % \begin{syntax} -% \cs{str_case_x:nnn} \Arg{test string} \\ +% \cs{str_case_x:nnF} \Arg{test string} \\ % ~~|{| \\ % ~~~~\Arg{string case_1} \Arg{code case_1} \\ % ~~~~\Arg{string case_2} \Arg{code case_2} \\ @@ -187,7 +187,7 @@ % always yield the same result: for example, random numbers must % not be used within this string. % \end{function} -% +% % \section{String manipulation} % % \begin{function}[rEXP, added = 2014-06-19]{\str_fold_case:n} @@ -198,14 +198,14 @@ % described for \cs{tl_to_str:n}, and then folds the case of the resulting % \meta{string} to remove case information. The result of this process is % left in the input stream. -% +% % String folding is a process used for material such as identifiers rather % than for \enquote{text}. The folding provided by \cs{str_fold_case:n} % follows the mappings provided by the \href{http://www.unicode.org}^^A % {Unicode Consortium}, who % \href{http://www.unicode.org/faq/casemap_charprop.html#2}{state}: % \begin{quote} -% Case folding is primarily used for caseless comparison of text, such +% Case folding is primarily used for caseless comparison of text, such % as identifiers in a computer program, rather than actual text % transformation. Case folding in Unicode is based on the lowercase % mapping, but includes additional changes to the source text to help make @@ -219,7 +219,7 @@ % a language-insensitive process, there is no special treatment of % Turkic input (\emph{i.e.}~\texttt{I} always folds to \texttt{i} and % not to \texttt{\i}). -% +% % \begin{texnote} % As with all \pkg{expl3} functions, the input supported by % \cs{str_fold_case:n} is \emph{engine-native} characters which are or @@ -232,7 +232,7 @@ % $0\mathrm{xFFF}$ when interacting with \cs{tl_to_str:n}. % \end{texnote} % \end{function} -% +% % \subsection{Internal string functions} % % \begin{function}[EXP]{\__str_if_eq_x:nn} @@ -244,10 +244,10 @@ % characters in the same order. Leaves |0| in the input stream if the % condition is true, and |+1| or |-1| otherwise. % \end{function} -% -% \begin{function}{\@@_if_eq_x_return:nn} +% +% \begin{function}{\__str_if_eq_x_return:nn} % \begin{syntax} -% \cs{@@_if_eq_x_return:nn} \Arg{tl_1} \Arg{tl_2} +% \cs{__str_if_eq_x_return:nn} \Arg{tl_1} \Arg{tl_2} % \end{syntax} % Compares the full expansion of two \meta{token lists} on a character by % character basis, and is \texttt{true} if the two lists contain the same @@ -269,7 +269,7 @@ % \begin{macrocode} %<@@=str> % \end{macrocode} -% +% % \begin{macro}{\str_head:n, \str_tail:n} % \begin{macro}[aux]{\__str_head:w} % \begin{macro}[aux]{\__str_tail:w} @@ -313,7 +313,7 @@ % \end{macro} % \end{macro} % \end{macro} -% +% % \subsection{String comparisons} % % \begin{macro}[int, EXP]{\__str_if_eq_x:nn} @@ -388,7 +388,8 @@ % \begin{macrocode} \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} } + \if_int_compare:w + \__str_if_eq_x:nn { \exp_not:n {#1} } { \exp_not:n {#2} } = \c_zero \prg_return_true: \else: \prg_return_false: \fi: } @@ -534,7 +535,7 @@ \cs_new:Npn \@@_fold_auxiii:NNNNNNNN #1#2#3#4#5#6#7#8 { \exp_args:NNv \str_case_x:nnF #8 - { c_@@_fold_ #6 _ #7 _tl } + { c_@@_fold_ #6 _X_ #7 _tl } { #8 \exp_after:wN \use_none:n #8 @@ -563,7 +564,7 @@ \cs_new_eq:NN \str_case_x:nnn \str_case_x:nnF % \end{macrocode} % \end{macro} -% +% % \begin{macrocode} %</initex|package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3styleguide.tex b/Master/texmf-dist/source/latex/l3kernel/l3styleguide.tex index 6a3a9d122e6..c37c9e24dff 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3styleguide.tex +++ b/Master/texmf-dist/source/latex/l3kernel/l3styleguide.tex @@ -89,7 +89,7 @@ few points to highlight: |\(...\)|. \end{itemize} -Line length in the source files should to be under $80$ +Line length in the source files should be under $80$ characters where possible, as this helps keep everything on the screen when editing files. In the \file{dtx} format, documentation lines start with a \texttt{\%}, which is usually followed by a space to leave a @@ -119,11 +119,11 @@ used, as shown in the preceding example. The requirement for less than $80$ characters per line applies to the code itself as well as the surrounding documentation. A number of the general -style principals for \LaTeX3 code apply: these are described in the following +style principles for \LaTeX3 code apply: these are described in the following paragraph and an example is then given. With the exception of simple runs of parameter (|{#1}|, |#1#2|, -\emph{etc.}), everything should divided up using spaces to make the code +\emph{etc.}), everything should be divided up using spaces to make the code more readable. In general, these will be single spaces, but in some places it makes more sense to align parts of the code to emphasise similarity. (Tabs should not be used for introducing white space.) @@ -148,7 +148,7 @@ look like the example: { \module_foo_aux:n { X #2 } } { \module_foo_aux:nn {#1} {#2} - \module_foo_aux:n {#1#2} + \module_foo_aux:n { #1 #2 } } } \end{verbatim*} @@ -174,7 +174,7 @@ which has an \texttt{N}-type first argument: \cs_generate_variant:Nn \foo:Nn { c , cV , co } \end{verbatim} -There are cases where omitting braces from \texttt{o}-type arguments +There may be cases where omitting braces from \texttt{o}-type arguments is desirable for performance reasons. This should only be done if the argument is a single token, thus for example \begin{verbatim} @@ -205,7 +205,7 @@ then written in the form \section{Auxiliary functions} -In general, the team encourage the use of descriptive names in \LaTeX3 code. +In general, the team encourages the use of descriptive names in \LaTeX3 code. Thus many helper functions will have names which describe briefly what they do, rather than simply indicating that they are auxiliary to some higher-level function. However, there are places where one or more \texttt{aux} functions diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index d5798d44b3a..e23d2436807 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3tl.dtx 5214 2014-07-17 08:39:43Z joseph $ +\GetIdInfo$Id: l3tl.dtx 5359 2014-08-24 09:20:32Z bruno $ {L3 Token lists} %</driver|package> %<*driver> @@ -740,7 +740,7 @@ % consider \cs{tl_reverse_items:n}. % See also \cs{tl_reverse:N}. % \begin{texnote} -% The result is returned within \tn{exp_not:n}, which means that the token +% The result is returned within \tn{unexpanded}, which means that the token % list will not expand further when appearing in an \texttt{x}-type % argument expansion. % \end{texnote} @@ -775,7 +775,7 @@ % the result. In cases where preserving spaces is important, % consider the slower function \cs{tl_reverse:n}. % \begin{texnote} -% The result is returned within \tn{exp_not:n}, which means that the token +% The result is returned within \tn{unexpanded}, which means that the token % list will not expand further when appearing in an \texttt{x}-type % argument expansion. % \end{texnote} @@ -791,7 +791,7 @@ % from the \meta{token list} and leaves the result in the input % stream. % \begin{texnote} -% The result is returned within \tn{exp_not:n}, which means that the token +% The result is returned within \tn{unexpanded}, which means that the token % list will not expand further when appearing in an \texttt{x}-type % argument expansion. % \end{texnote} @@ -1542,106 +1542,205 @@ % \begin{macro}{\tl_greplace_all:Nnn, \tl_greplace_all:cnn} % \begin{macro}{\tl_replace_once:Nnn, \tl_replace_once:cnn} % \begin{macro}{\tl_greplace_once:Nnn, \tl_greplace_once:cnn} -% \begin{macro}[aux]{\@@_replace:NNNnn, \@@_replace:w} -% \begin{macro}[aux]{\@@_replace_all:, \@@_replace_once:} -% \begin{macro}[aux]{\@@_replace_once_end:w} -% All of the replace functions are based on \cs{@@_replace:NNNnn}, -% whose arguments are: \meta{function}, \cs{tl_(g)set:Nx}, \meta{tl~var}, -% \meta{search tokens}, \meta{replacement tokens}. +% All of the \texttt{replace} functions call \cs{@@_replace:NnNNNnn} +% with appropriate arguments. The first two arguments are explained +% later. The next controls whether the replacement function calls +% itself (\cs{@@_replace_next:w}) or stops (\cs{@@_replace_wrap:w}) +% after the first replacement. Next comes an \texttt{x}-type +% assignment function \cs{tl_set:Nx} or \cs{tl_gset:Nx} for local or +% global replacements. Finally, the three arguments \meta{tl~var} +% \Arg{pattern} \Arg{replacement} provided by the user. When +% describing the auxiliary functions below, we denote the contents of +% the \meta{tl~var} by \meta{token list}. % \begin{macrocode} \cs_new_protected_nopar:Npn \tl_replace_once:Nnn - { \@@_replace:NNNnn \@@_replace_once: \tl_set:Nx } + { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_set:Nx } \cs_new_protected_nopar:Npn \tl_greplace_once:Nnn - { \@@_replace:NNNnn \@@_replace_once: \tl_gset:Nx } + { \@@_replace:NnNNNnn \q_mark ? \@@_replace_wrap:w \tl_gset:Nx } \cs_new_protected_nopar:Npn \tl_replace_all:Nnn - { \@@_replace:NNNnn \@@_replace_all: \tl_set:Nx } + { \@@_replace:NnNNNnn \q_mark ? \@@_replace_next:w \tl_set:Nx } \cs_new_protected_nopar:Npn \tl_greplace_all:Nnn - { \@@_replace:NNNnn \@@_replace_all: \tl_gset:Nx } + { \@@_replace:NnNNNnn \q_mark ? \@@_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 } % \end{macrocode} -% The idea is easier to understand by considering the case of -% \cs{tl_replace_all:Nnn}. The replacement happens within an -% \texttt{x}-type expansion. We use an auxiliary function \cs{@@_tmp:w}, -% which essentially replaces the next \meta{search tokens} by -% \meta{replacement tokens}. To avoid runaway arguments, -% we expand something like \cs{@@_tmp:w} \meta{token list} \cs{q_mark} -% \meta{search tokens} \cs{q_stop}, repeating until the end. How do we -% detect that we have reached the last occurrence of \meta{search tokens}? -% The last replacement is characterized by the fact that the argument of -% \cs{@@_tmp:w} contains \cs{q_mark}. In the code below, -% \cs{@@_replace:w} takes an argument delimited by \cs{q_mark}, -% and removes the following token. Before we reach the end, this gobbles -% \cs{q_mark} \cs{use_none_delimit_by_q_stop:w} which appear in the -% definition of \cs{@@_tmp:w}, and leaves the \meta{replacement tokens}, -% passed to \cs{exp_not:n}, to be included in the \texttt{x}-expanding -% definition. At the end, the first \cs{q_mark} is within the argument -% of \cs{@@_tmp:w}, and \cs{@@_replace:w} gobbles the second -% \cs{q_mark} as well, leaving \cs{use_none_delimit_by_q_stop:w}, -% which ends the recursion cleanly. -% \begin{macrocode} -\cs_new_protected:Npn \@@_replace:NNNnn #1#2#3#4#5 +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}[aux] +% { +% \@@_replace:NnNNNnn, +% \@@_replace_auxi:NnnNNNnn, +% \@@_replace_auxii:nNNNnn, +% \@@_replace_next:w, +% \@@_replace_wrap:w, +% } +% To implement the actual replacement auxiliary +% \cs{@@_replace_auxii:nNNNnn} we will need a \meta{delimiter} with +% the following properties: +% \begin{itemize} +% \item all occurrences of the \meta{pattern}~|#6| in +% \enquote{\meta{token list} \meta{delimiter}} belong to the +% \meta{token list} and have no overlap with the \meta{delimiter}, +% \item the first occurrence of the \meta{delimiter} in +% \enquote{\meta{token list} \meta{delimiter}} is the trailing +% \meta{delimiter}. +% \end{itemize} +% We first find the building blocks for the \meta{delimiter}, namely +% two tokens \meta{A} and~\meta{B} such that \meta{A} does not appear +% in~|#6| and |#6| is not~\meta{B} (this condition is trivial if |#6| +% has more than one token). Then we consider the delimiters +% \enquote{\meta{A}} and \enquote{\meta{A} \meta{A}$^n$ \meta{B} +% \meta{A}$^n$ \meta{B}}, for $n\geq 1$, where $\meta{A}^n$ denotes +% $n$~copies of \meta{A}, and we choose as our \meta{delimiter} the +% first one which is not in the \meta{token list}. +% +% Every delimiter in the set obeys the first condition: |#6|~does not +% contain~\meta{A} hence cannot be overlapping with the \meta{token +% list} and the \meta{delimiter}, and it cannot be within the +% \meta{delimiter} since it would have to be in one of the two +% \meta{B} hence be equal to this single token (or empty, but this is +% an error case filtered separately). Given the particular form of +% these delimiters, for which no prefix is also a suffix, the second +% condition is actually a consequence of the weaker condition that the +% \meta{delimiter} we choose does not appear in the \meta{token list}. +% Additionally, the set of delimiters is such that a \meta{token list} +% of $n$~tokens can contain at most $O(n^{1/2})$ of them, hence we +% find a \meta{delimiter} with at most $O(n^{1/2})$ tokens in a time +% at most $O(n^{3/2})$. Bear in mind that these upper bounds are +% reached only in very contrived scenarios: we include the case +% \enquote{\meta{A}} in the list of delimiters to try, so that the +% \meta{delimiter} will simply be \cs{q_mark} in the most common +% situation where neither the \meta{token list} nor the \meta{pattern} +% contains \cs{q_mark}. +% +% Let us now ahead, optimizing for this most common case. First, two +% special cases: an empty \meta{pattern}~|#6| is an error, and if +% |#1|~is absent from both the \meta{token list}~|#5| and the +% \meta{pattern}~|#6| then we can use it as the \meta{delimiter} +% through \cs{@@_replace_auxii:nNNNnn} |{#1}|. Otherwise, we end up +% calling \cs{@@_replace:NnNNNnn} repeatedly with the first two +% arguments |\q_mark| |{?}|, |\?| |{??}|, |\??| |{???}|, and so on, +% until |#6|~does not contain the control sequence~|#1|, which we take +% as our~\meta{A}. The argument~|#2| only serves to collect~|?| +% characters for~|#1|. Note that the order of the tests means that +% the first two are done every time, which is wasteful (for instance, +% we repeatedly test for the emptyness of~|#6|). However, this is +% rare enough not to matter. Finally, choose~\meta{B} to be +% \cs{q_nil} or~\cs{q_stop} such that it is not equal to~|#6|. +% +% The \cs{@@_replace_auxi:NnnNNNnn} auxiliary receives \Arg{A} and +% |{|\meta{A}$^n$\meta{B}|}| as its arguments, initially with $n=1$. +% If \enquote{\meta{A} \meta{A}$^n$\meta{B} \meta{A}$^n$\meta{B}} is +% in the \meta{token list} then increase~$n$ and try again. Once it +% is not anymore in the \meta{token list} we take it as our +% \meta{delimiter} and pass this to the \texttt{auxii} auxiliary. +% \begin{macrocode} +\cs_new_protected:Npn \@@_replace:NnNNNnn #1#2#3#4#5#6#7 { - \tl_if_empty:nTF {#4} + \tl_if_empty:nTF {#6} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } - { \tl_to_str:n {#5} } + \__msg_kernel_error:nnx { kernel } { empty-search-pattern } + { \tl_to_str:n {#7} } } { - \group_align_safe_begin: - \cs_set:Npx \@@_tmp:w ##1##2 #4 + \tl_if_in:onTF { #5 #6 } {#1} { - ##2 - \exp_not:N \q_mark - \exp_not:N \use_none_delimit_by_q_stop:w - \exp_not:n { \exp_not:n {#5} } - ##1 - } - \group_align_safe_end: - #2 #3 - { - \exp_after:wN #1 - #3 \q_mark #4 \q_stop + \tl_if_in:nnTF {#6} {#1} + { \exp_args:Nc \@@_replace:NnNNNnn {#2} {#2?} } + { + \quark_if_nil:nTF {#6} + { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_stop } } + { \@@_replace_auxi:NnnNNNnn #5 {#1} { #1 \q_nil } } + } } + { \@@_replace_auxii:nNNNnn {#1} } + #3#4#5 {#6} {#7} } } -\cs_new:Npn \@@_replace:w #1 \q_mark #2 { \exp_not:o {#1} } -% \end{macrocode} -% The first argument of \cs{@@_tmp:w} is responsible for repeating -% the replacement in the case of \texttt{replace_all}, and stopping -% it early for \texttt{replace_once}. Note also that we build -% \cs{@@_tmp:w} within an \texttt{x}-expansion so that the -% \meta{replacement tokens} can contain |#|. The second -% \cs{exp_not:n} ensures that the \meta{replacement tokens} -% are not expanded by \cs{tl_(g)set:Nx}. -% -% Now on to the difference between \enquote{once} and \enquote{all}. -% The \cs{prg_do_nothing:} and accompanying \texttt{o}-expansion -% ensure that we don't lose braces in case the tokens between two -% occurrences of the \meta{search tokens} form a brace group. -% \begin{macrocode} -\cs_new_nopar:Npn \@@_replace_all: +\cs_new_protected:Npn \@@_replace_auxi:NnnNNNnn #1#2#3 { - \exp_after:wN \@@_replace:w - \@@_tmp:w \@@_replace_all: \prg_do_nothing: + \tl_if_in:NnTF #1 { #2 #3 #3 } + { \@@_replace_auxi:NnnNNNnn #1 { #2 #3 } {#2} } + { \@@_replace_auxii:nNNNnn { #2 #3 #3 } } } -\cs_new_nopar:Npn \@@_replace_once: +% \end{macrocode} +% The auxiliary \cs{@@_replace_auxii:nNNNnn} receives the following +% arguments: \Arg{delimiter} +% \meta{function} \meta{assignment} \meta{tl~var} \Arg{pattern} +% \Arg{replacement}. All of its work is done between +% \cs{group_align_safe_begin:} and \cs{group_align_safe_end:} to avoid +% issues in alignments. It does the actual replacement within +% |#3|~|#4|~|{...}|, an \texttt{x}-expanding \meta{assignment}~|#3| to +% the \meta{tl~var}~|#4|. The auxiliary \cs{@@_replace_next:w} is +% called, followed by the \meta{token list}, some tokens including the +% \meta{delimiter}~|#1|, followed by the \meta{pattern}~|#5|. +% This auxiliary finds an argument delimited by~|#5| (the presence of +% a trailing~|#5| avoids runaway arguments) and calls +% \cs{@@_replace_wrap:w} to test whether this |#5| is found within the +% \meta{token list} or is the trailing one. +% +% If on the one hand it is found within the \meta{token list}, then +% |##1| cannot contain the \meta{delimiter}~|#1| that we worked so +% hard to obtain, thus \cs{@@_replace_wrap:w} gets~|##1| as its own +% argument~|##1|, and wraps it using \cs{exp_not:o} for consumption by +% the \texttt{x}-expanding assignment. It also finds \cs{exp_not:n} +% as~|##2| and does nothing to it, thus letting through \cs{exp_not:n} +% \Arg{replacement} into the assignment. (Note that +% \cs{@@_replace_next:w} and \cs{@@_replace_wrap:w} are always called +% followed by \cs{prg_do_nothing:} to avoid losing braces when +% grabbing delimited arguments, hence the use of \cs{exp_not:o} rather +% than \cs{exp_not:n}.) Afterwards, \cs{@@_replace_next:w} is called +% to repeat the replacement, or \cs{@@_replace_wrap:w} if we only want +% a single replacement. In this second case, |##1| is the +% \meta{remaining tokens} in the \meta{token list} and |##2| is some +% \meta{ending code} which ends the assignment and removes the +% trailing tokens |#5| using some \cs{if_false:} |{| \cs{fi:} |}| +% trickery because~|#5| may contain any delimiter. +% +% If on the other hand the argument~|##1| of \cs{@@_replace_next:w} is +% delimited by the trailing \meta{pattern}~|#5|, then |##1| is +% \enquote{\cs{prg_do_nothing:} \meta{token list} \meta{delimiter} +% \Arg{ending code}}, hence \cs{@@_replace_wrap:w} finds +% \enquote{\cs{prg_do_nothing:} \meta{token list}} as |##1| and the +% \meta{ending code} as~|##2|. It leaves the \meta{token list} into +% the assignment and unbraces the \meta{ending code} which removes +% what remains (essentially the \meta{delimiter} and +% \meta{replacement}). +% \begin{macrocode} +\cs_new_protected:Npn \@@_replace_auxii:nNNNnn #1#2#3#4#5#6 { - \exp_after:wN \@@_replace:w - \@@_tmp:w { \@@_replace_once_end:w \prg_do_nothing: } \prg_do_nothing: + \group_align_safe_begin: + \cs_set:Npn \@@_replace_wrap:w ##1 #1 ##2 { \exp_not:o {##1} ##2 } + \cs_set:Npx \@@_replace_next:w ##1 #5 + { + \exp_not:N \@@_replace_wrap:w ##1 + \exp_not:n { #1 } + \exp_not:n { \exp_not:n {#6} } + \exp_not:n { #2 \prg_do_nothing: } + } + #3 #4 + { + \exp_after:wN \@@_replace_next:w + \exp_after:wN \prg_do_nothing: #4 + #1 + { + \if_false: { \fi: } + \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: + } + #5 + \q_recursion_stop + } + \group_align_safe_end: } -\cs_new:Npn \@@_replace_once_end:w #1 \q_mark #2 \q_stop - { \exp_not:o {#1} } +\cs_new_eq:NN \@@_replace_wrap:w ? +\cs_new_eq:NN \@@_replace_next:w ? % \end{macrocode} % \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} % % \begin{macro}{\tl_remove_once:Nn, \tl_remove_once:cn} % \begin{macro}{\tl_gremove_once:Nn, \tl_gremove_once:cn} @@ -1731,7 +1830,8 @@ % \begin{macrocode} \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 + \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: @@ -1834,18 +1934,23 @@ % test is \texttt{false}. See \cs{tl_if_empty:n(TF)} for details on % the emptiness test. % -% Special care is needed to treat correctly cases like +% Treating correctly cases like % |\tl_if_in:nnTF {a state}{states}|, where |#1#2| contains |#2| before -% the end. To cater for this case, we insert |{}{}| between the two token +% the end, requires special care. +% To cater for this case, we insert |{}{}| between the two token % lists. This marker may not appear in |#2| because of \TeX{} limitations % on what can delimit a parameter, hence we are safe. Using two brace % groups makes the test work also for empty arguments. +% The \cs{if_false:} constructions are a faster way to do +% \cs{group_align_safe_begin:} and \cs{group_align_safe_end:}. % \begin{macrocode} \prg_new_protected_conditional:Npnn \tl_if_in:nn #1#2 { T , F , TF } { + \if_false: { \fi: \cs_set:Npn \@@_tmp:w ##1 #2 { } \tl_if_empty:oTF { \@@_tmp:w #1 {} {} #2 } { \prg_return_false: } { \prg_return_true: } + \if_false: } \fi: } \cs_generate_variant:Nn \tl_if_in:nnT { V , o , no } \cs_generate_variant:Nn \tl_if_in:nnF { V , o , no } @@ -2082,7 +2187,10 @@ \cs_new:Npn \tl_use:N #1 { \tl_if_exist:NTF #1 {#1} - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } + { + \__msg_kernel_expandable_error:nnn + { kernel } { bad-variable } {#1} + } } \cs_generate_variant:Nn \tl_use:N { c } % \end{macrocode} @@ -2173,7 +2281,7 @@ % \begin{macro}[int]{\@@_trim_spaces:nn} % \begin{macro}[aux] % { -% \@@_trim_spaces_auxi:w, \@@_trim_spaces_auxii:w +% \@@_trim_spaces_auxi:w, \@@_trim_spaces_auxii:w, % \@@_trim_spaces_auxiii:w, \@@_trim_spaces_auxiv:w % } % Trimming spaces from around the input is done using delimited @@ -2235,11 +2343,11 @@ % % \subsection{Token by token changes} % -% \begin{variable}{\q__@@_act_mark,\q__@@_act_stop} +% \begin{variable}{\q_@@_act_mark,\q_@@_act_stop} % The \cs{tl_act} functions may be applied to any token list. % Hence, we use two private quarks, to allow any token, even quarks, % in the token list.^^A in particular critical for future \::e. -% Only \cs{q__@@_act_mark} and \cs{q__@@_act_stop} may not appear +% Only \cs{q_@@_act_mark} and \cs{q_@@_act_stop} may not appear % in the token lists manipulated by \cs{@@_act:NNNnn} functions. The quarks % are effectively defined in \pkg{l3quark}. % \end{variable} @@ -2254,7 +2362,7 @@ % To help control the expansion, \cs{@@_act:NNNnn} should always % be proceeded by \tn{romannumeral} and ends by producing \cs{c_zero} % once the result has been obtained. Then loop over tokens, -% groups, and spaces in |#5|. The marker \cs{q__@@_act_mark} +% groups, and spaces in |#5|. The marker \cs{q_@@_act_mark} % is used both to avoid losing outer braces and to detect the % end of the token list more easily. The result is stored % as an argument for the dummy function \cs{@@_act_result:n}. @@ -2262,14 +2370,14 @@ \cs_new:Npn \@@_act:NNNnn #1#2#3#4#5 { \group_align_safe_begin: - \@@_act_loop:w #5 \q__@@_act_mark \q__@@_act_stop + \@@_act_loop:w #5 \q_@@_act_mark \q_@@_act_stop {#4} #1 #2 #3 \@@_act_result:n { } } % \end{macrocode} % In the loop, we check how the token list begins and act % accordingly. In the \enquote{normal} case, we may have -% reached \cs{q__@@_act_mark}, the end of the list. Then +% reached \cs{q_@@_act_mark}, the end of the list. Then % leave \cs{c_zero} and the result in the input stream, % to terminate the expansion of \tn{romannumeral}. % Otherwise, apply the relevant function to the @@ -2279,7 +2387,7 @@ % group or with a space. Some extra work is needed to % make \cs{@@_act_space:wwnNNN} gobble the space. % \begin{macrocode} -\cs_new:Npn \@@_act_loop:w #1 \q__@@_act_stop +\cs_new:Npn \@@_act_loop:w #1 \q_@@_act_stop { \tl_if_head_is_N_type:nTF {#1} { \@@_act_normal:NwnNNN } @@ -2288,30 +2396,30 @@ { \@@_act_group:nwnNNN } { \@@_act_space:wwnNNN } } - #1 \q__@@_act_stop + #1 \q_@@_act_stop } -\cs_new:Npn \@@_act_normal:NwnNNN #1 #2 \q__@@_act_stop #3#4 +\cs_new:Npn \@@_act_normal:NwnNNN #1 #2 \q_@@_act_stop #3#4 { - \if_meaning:w \q__@@_act_mark #1 + \if_meaning:w \q_@@_act_mark #1 \exp_after:wN \@@_act_end:wn \fi: #4 {#3} #1 - \@@_act_loop:w #2 \q__@@_act_stop + \@@_act_loop:w #2 \q_@@_act_stop {#3} #4 } \cs_new:Npn \@@_act_end:wn #1 \@@_act_result:n #2 { \group_align_safe_end: \c_zero #2 } -\cs_new:Npn \@@_act_group:nwnNNN #1 #2 \q__@@_act_stop #3#4#5 +\cs_new:Npn \@@_act_group:nwnNNN #1 #2 \q_@@_act_stop #3#4#5 { #5 {#3} {#1} - \@@_act_loop:w #2 \q__@@_act_stop + \@@_act_loop:w #2 \q_@@_act_stop {#3} #4 #5 } \exp_last_unbraced:NNo - \cs_new:Npn \@@_act_space:wwnNNN \c_space_tl #1 \q__@@_act_stop #2#3#4#5 + \cs_new:Npn \@@_act_space:wwnNNN \c_space_tl #1 \q_@@_act_stop #2#3#4#5 { #5 {#2} - \@@_act_loop:w #1 \q__@@_act_stop + \@@_act_loop:w #1 \q_@@_act_stop {#2} #3 #4 #5 } % \end{macrocode} @@ -2407,7 +2515,10 @@ \if_false: { \fi: \@@_head_auxi:nw #1 { } \q_stop } } \cs_new:Npn \@@_head_auxi:nw #1#2 \q_stop - { \exp_after:wN \@@_head_auxii:n \exp_after:wN { \if_false: } \fi: {#1} } + { + \exp_after:wN \@@_head_auxii:n \exp_after:wN { + \if_false: } \fi: {#1} + } \cs_new:Npn \@@_head_auxii:n #1 { \exp_after:wN \if_meaning:w \exp_after:wN \q_nil @@ -2434,7 +2545,7 @@ % be stripped). Thus the only safe way to proceed is to first check that % there is an item to grab (\emph{i.e.}~that the argument is not blank) and % assuming there is to dispose of the first item. As with \cs{tl_head:n}, -% the result is protected from further expansion by \tn{etex_unexpanded:D}. +% the result is protected from further expansion by \tn{unexpanded}. % While we could optimise the test here, this would leave some tokens % \enquote{banned} in the input, which we do not have with this definition. % \begin{macrocode} @@ -2583,22 +2694,40 @@ % \end{macro} % % \begin{macro}[pTF]{\tl_if_head_is_N_type:n} -% The first token of a token list can be either an N-type argument, -% a begin-group token (catcode 1), or an explicit space token -% (catcode 10 and charcode 32). The latter two cases are characterized -% by the fact that \cs{use:n} removes some tokens from |#1|, hence -% changing its string representation (no token can have an empty -% string representation). The extra brace group covers the case of -% an empty argument, whose head is not \enquote{normal}. +% \begin{macro}[EXP,aux]{\@@_if_head_is_N_type:w} +% A token list can be empty, can start with an explicit space +% character (catcode 10 and charcode 32), can start with a begin-group +% token (catcode 1), or start with an \texttt{N}-type argument. In +% the first two cases, the line involving \cs{@@_if_head_is_N_type:w} +% produces~|^| (and otherwise nothing). In the third case +% (begin-group token), the lines involving \cs{exp_after:wN} produce a +% single closing brace. The category code test is thus true exactly +% in the fourth case, which is what we want. One cannot optimize by +% moving one of the |*| to the beginning: if |#1| contains primitive +% conditionals, all of its occurrences must be dealt with before the +% \cs{if_catcode:w} tries to skip the \texttt{true} branch of the +% conditional. % \begin{macrocode} \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF } { - \__str_if_eq_x_return:nn - { \exp_not:o { \use:n #1 { } } } - { \exp_not:n { #1 { } } } + \if_catcode:w + \if_false: { \fi: \@@_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 \@@_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: } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}[EXP,pTF]{\tl_if_head_is_group:n} % Pass the first token of |#1| through \cs{token_to_str:N}, @@ -2611,14 +2740,10 @@ % \begin{macrocode} \prg_new_conditional:Npnn \tl_if_head_is_group:n #1 { p , T , F , TF } { - \if_catcode:w * + \if_catcode:w \exp_after:wN \use_none:n - \exp_after:wN { - \exp_after:wN { - \token_to_str:N #1 ? - } - } - * + \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } + * * \prg_return_false: \else: \prg_return_true: @@ -2710,7 +2835,7 @@ } \cs_generate_variant:Nn \tl_show:N { c } % \end{macrocode} -%\end{macro} +% \end{macro} % % \begin{macro}{\tl_show:n} % The \cs{__msg_show_variable:n} internal function performs @@ -2722,7 +2847,7 @@ \cs_new_protected:Npn \tl_show:n #1 { \__msg_show_variable:n { > ~ \tl_to_str:n {#1} } } % \end{macrocode} -%\end{macro} +% \end{macro} % % \subsection{Scratch token lists} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index 36d2a427ac5..416bf573160 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -37,7 +37,7 @@ \documentclass[full]{l3doc} %</driver> %<*driver|package> -\GetIdInfo$Id: l3token.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3token.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental token manipulation} %</driver|package> %<*driver> @@ -206,7 +206,7 @@ % \begin{syntax} % \cs{char_set_lcode:nn} \Arg{intexpr_1} \Arg{intexpr_2} % \end{syntax} -% This function set up the behaviour of \meta{character} when +% Sets up the behaviour of the \meta{character} when % found inside \cs{tl_to_lowercase:n}, such that \meta{character_1} % will be converted into \meta{character_2}. The two \meta{characters} % may be specified using an \meta{integer expression} for the character code @@ -243,7 +243,7 @@ % \begin{syntax} % \cs{char_set_uccode:nn} \Arg{intexpr_1} \Arg{intexpr_2} % \end{syntax} -% This function set up the behaviour of \meta{character} when +% Sets up the behaviour of the \meta{character} when % found inside \cs{tl_to_uppercase:n}, such that \meta{character_1} % will be converted into \meta{character_2}. The two \meta{characters} % may be specified using an \meta{integer expression} for the character code @@ -974,7 +974,7 @@ \cs_new:Npn \char_value_catcode:n #1 { \tex_the:D \tex_catcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_catcode:n #1 - { \tex_showthe:D \tex_catcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_catcode:n {#1} } } % \end{macrocode} % \end{macro} % \end{macro} @@ -1109,25 +1109,25 @@ \cs_new:Npn \char_value_mathcode:n #1 { \tex_the:D \tex_mathcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_mathcode:n #1 - { \tex_showthe:D \tex_mathcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_mathcode:n {#1} } } \cs_new_protected:Npn \char_set_lccode:nn #1#2 { \tex_lccode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_lccode:n #1 { \tex_the:D \tex_lccode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_lccode:n #1 - { \tex_showthe:D \tex_lccode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_lccode:n {#1} } } \cs_new_protected:Npn \char_set_uccode:nn #1#2 { \tex_uccode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_uccode:n #1 { \tex_the:D \tex_uccode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_uccode:n #1 - { \tex_showthe:D \tex_uccode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_uccode:n {#1} } } \cs_new_protected:Npn \char_set_sfcode:nn #1#2 { \tex_sfcode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_sfcode:n #1 { \tex_the:D \tex_sfcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_sfcode:n #1 - { \tex_showthe:D \tex_sfcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_sfcode:n {#1} } } % \end{macrocode} % \end{macro} % \end{macro} @@ -1308,7 +1308,8 @@ % Check if token is a math superscript token. We use the constant % \cs{c_math_superscript_token} for this. % \begin{macrocode} -\prg_new_conditional:Npnn \token_if_math_superscript:N #1 { p , T , F , TF } +\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: @@ -1574,12 +1575,11 @@ } \cs_new:Npn \@@_if_chardef:w #1 CHAR" #2 \q_stop { #1 CHAR } % \end{macrocode} -% -% Dim registers are a little more difficult since their \tn{meaning} -% has the form |\dimen|\meta{number}, and we must take care of the +% Dim registers are a bit more difficult since their \tn{meaning} +% has the form \tn{dimen}\meta{number}, and we must take care of the % two primitives \tn{dimen} and \tn{dimendef}. % \begin{macrocode} - \prg_new_conditional:Npnn \token_if_dim_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_dim_register:N #1 { p , T , F , TF } { \if_meaning:w \tex_dimen:D #1 \prg_return_false: @@ -1602,7 +1602,7 @@ % differently from variables, and we also have to take care of the % primitives \tn{count} and \tn{countdef}. % \begin{macrocode} - \prg_new_conditional:Npnn \token_if_int_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_int_register:N #1 { p , T , F , TF } { % \token_if_chardef:NTF #1 { \prg_return_true: } % { @@ -1629,7 +1629,8 @@ % \end{macrocode} % Muskip registers are done the same way as the dimension registers. % \begin{macrocode} - \prg_new_conditional:Npnn \token_if_muskip_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_muskip_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_muskip:D #1 \prg_return_false: @@ -1650,7 +1651,8 @@ % \end{macrocode} % Skip registers. % \begin{macrocode} - \prg_new_conditional:Npnn \token_if_skip_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_skip_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_skip:D #1 \prg_return_false: @@ -1671,7 +1673,8 @@ % \end{macrocode} % Toks registers. % \begin{macrocode} - \prg_new_conditional:Npnn \token_if_toks_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_toks_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_toks:D #1 \prg_return_false: diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.def b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.def index 6d5625134b3..203ab7da3c4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.def +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.def @@ -1,4 +1,4 @@ -\ProvidesExplFile {l3unicode-data.def} {2014/06/30} {5166} {L3 Unicode data} +\ProvidesExplFile {l3unicode-data.def} {2014/08/12} {5276} {L3 Unicode data} \clist_const:Nn \c__tl_after_final_sigma_clist { 0021 , 0022 , 0029 , 002C , 002E , 003A , 003B , 003F , 005D , 007D } \clist_const:Nn \c__tl_mixed_skip_clist @@ -17,10 +17,10 @@ } \cs_set_protected:Npn \__unicode_tmp:NNNNNNN #1#2#3#4#5#6#7 { - \tl_const:cx { c__str_fold_ #1 _ #2 _ tl } + \tl_const:cx { c__str_fold_ #1 _X_ #2 _ tl } { \tl_to_str:n { #6#7 } } - \tl_const:cn { c__tl_lower_ #1 _ #2 _ tl } { #6#7 } - \tl_const:cn { c__tl_upper_ #4 _ #5 _ tl } { #7#6 } + \tl_const:cn { c__tl_lower_ #1 _X_ #2 _ tl } { #6#7 } + \tl_const:cn { c__tl_upper_ #4 _X_ #5 _ tl } { #7#6 } } \__unicode_tmp:NN AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz @@ -30,17 +30,17 @@ { \int_step_inline:nnnn { 0 } { 1 } { 9 } { - \tl_if_exist:cF { c__str_fold_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__str_fold_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__str_fold_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__str_fold_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_lower_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_lower_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_lower_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_lower_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_upper_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_upper_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_upper_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_upper_ #1 _X_ ##1 _ tl } { } } } } @@ -53,10 +53,217 @@ \tl_const:Nn \c__tl_dotted_I_tl { i } \tex_endinput:D } +\tl_const:cn { c__tl_upper_0_X_0_tl } { dDьЬոՈὀὈᾤ{ὬΙ}ⳬⳫ𐐨𐐀𑣜𑢼 } +\tl_const:cn { c__tl_upper_0_X_1_tl } { eEĭĬǵǴəƏϩϨэЭұҰԕԔչՉḕḔṹṸờỜὁὉᾥ{ὭΙ}ⲉⲈꙩꙨ𐐩𐐁𑣝𑢽 } +\tl_const:cn { c__tl_upper_0_X_2_tl } { fFƒƑюЮպՊὂὊᾦ{ὮΙ}ⳮⳭ𐐪𐐂𑣞𑢾 } +\tl_const:cn { c__tl_upper_0_X_3_tl } { gGįĮɛƐϫϪяЯҳҲԗԖջՋḗḖṻṺởỞὃὋᾧ{ὯΙ}ⲋⲊꙫꙪꜳꜲꞗꞖ𐐫𐐃𑣟𑢿 } +\tl_const:cn { c__tl_upper_0_X_4_tl } { hHɜꞫѐЀռՌὄὌ𐐬𐐄 } +\tl_const:cn { c__tl_upper_0_X_5_tl } { iIıIƕǶǹǸϭϬёЁҵҴԙԘսՍḙḘṽṼỡỠὅὍⲍⲌꙭꙬꜵꜴꞙꞘ𐐭𐐅 } +\tl_const:cn { c__tl_upper_0_X_6_tl } { jJђЂվՎ𐐮𐐆 } +\tl_const:cn { c__tl_upper_0_X_7_tl } { kK{ij}{IJ}ǻǺϯϮѓЃҷҶԛԚտՏḛḚṿṾợỢⲏⲎⳳⳲꜷꜶꞛꞚ𐐯𐐇 } +\tl_const:cn { c__tl_upper_0_X_8_tl } { lLɠƓϰΚєЄրՐ𐐰𐐈 } +\tl_const:cn { c__tl_upper_0_X_9_tl } { mMĵĴƙƘǽǼɡꞬϱΡѕЅҹҸԝԜցՑḝḜẁẀụỤⲑⲐꜹꜸꞝꞜ𐐱𐐉 } +\tl_const:cn { c__tl_upper_1_X_0_tl } { nNƚȽϲϹіІւՒ𐐲𐐊 } +\tl_const:cn { c__tl_upper_1_X_1_tl } { oOķĶǿǾɣƔϳͿїЇһҺԟԞփՓḟḞẃẂủỦⲓⲒꜻꜺꞟꞞ𐐳𐐋 } +\tl_const:cn { c__tl_upper_1_X_2_tl } { pPјЈքՔᾰᾸⰰⰀ𐐴𐐌 } +\tl_const:cn { c__tl_upper_1_X_3_tl } { qQȁȀɥꞍϵΕљЉҽҼԡԠօՕḡḠẅẄứỨᾱᾹⰱⰁⲕⲔꜽꜼꞡꞠ𐐵𐐍 } +\tl_const:cn { c__tl_upper_1_X_4_tl } { rRĺĹƞȠɦꞪњЊֆՖⰲⰂ𐐶𐐎 } +\tl_const:cn { c__tl_upper_1_X_5_tl } { sSȃȂћЋҿҾԣԢḣḢẇẆừỪᾳ{ΑΙ}ⰳⰃⲗⲖꜿꜾꞣꞢ𐐷𐐏 } +\tl_const:cn { c__tl_upper_1_X_6_tl } { tTļĻɨƗϸϷќЌⰴⰄ𐐸𐐐 } +\tl_const:cn { c__tl_upper_1_X_7_tl } { uUơƠȅȄɩƖѝЍԥԤḥḤẉẈửỬὑὙⰵⰅⲙⲘꝁꝀꞥꞤ𐐹𐐑 } +\tl_const:cn { c__tl_upper_1_X_8_tl } { vVľĽўЎӂӁⰶⰆ𐐺𐐒 } +\tl_const:cn { c__tl_upper_1_X_9_tl } { wWƣƢȇȆɫⱢϻϺџЏԧԦḧḦẋẊữỮὓὛⰷⰇⲛⲚꝃꝂꞧꞦ𐐻𐐓 } +\tl_const:cn { c__tl_upper_2_X_0_tl } { xX{ŀ}{Ŀ}ɬꞭӄӃⰸⰈⴀႠ𐐼𐐔 } +\tl_const:cn { c__tl_upper_2_X_1_tl } { yYƥƤȉȈѡѠԩԨḩḨẍẌựỰὕὝⰹⰉⲝⲜⴁႡꝅꝄꞩꞨ𐐽𐐕 } +\tl_const:cn { c__tl_upper_2_X_2_tl } { zZłŁӆӅⰺⰊⴂႢ𐐾𐐖 } +\tl_const:cn { c__tl_upper_2_X_3_tl } { ȋȊɯƜѣѢԫԪḫḪẏẎỳỲὗὟⰻⰋⲟⲞⴃႣꝇꝆ𐐿𐐗 } +\tl_const:cn { c__tl_upper_2_X_4_tl } { àÀńŃƨƧӈӇⓐⒶⰼⰌⴄႤ𐑀𐐘 } +\tl_const:cn { c__tl_upper_2_X_5_tl } { áÁȍȌɱⱮѥѤԭԬḭḬẑẐỵỴⓑⒷⰽⰍⲡⲠⴅႥꚁꚀꝉꝈ𐑁𐐙 } +\tl_const:cn { c__tl_upper_2_X_6_tl } { âÂņŅɲƝӊӉιΙⅎℲⓒⒸⰾⰎⴆႦ𐑂𐐚 } +\tl_const:cn { c__tl_upper_2_X_7_tl } { ãÃȏȎѧѦԯԮḯḮẓẒỷỶⓓⒹⰿⰏⲣⲢⴇႧꚃꚂꝋꝊ𐑃𐐛 } +\tl_const:cn { c__tl_upper_2_X_8_tl } { äÄňŇӌӋⓔⒺⱀⰐⴈႨ𐑄𐐜 } +\tl_const:cn { c__tl_upper_2_X_9_tl } { åÅƭƬȑȐɵƟѩѨḱḰẕẔỹỸⓕⒻⱁⰑⲥⲤⴉႩꚅꚄꝍꝌ𐑅𐐝 } +\tl_const:cn { c__tl_upper_3_X_0_tl } { æÆӎӍⓖⒼⱂⰒⴊႪ𐑆𐐞 } +\tl_const:cn { c__tl_upper_3_X_1_tl } { çÇŋŊȓȒѫѪӏӀḳḲỻỺῃ{ΗΙ}ⓗⒽⱃⰓⲧⲦⴋႫꚇꚆꝏꝎ𐑇𐐟 } +\tl_const:cn { c__tl_upper_3_X_2_tl } { èÈưƯὠὨⓘⒾⱄⰔⴌႬ𐑈𐐠 } +\tl_const:cn { c__tl_upper_3_X_3_tl } { éÉōŌȕȔѭѬӑӐḵḴỽỼὡὩⓙⒿⱅⰕⲩⲨⴍႭꚉꚈꝑꝐ𐑉𐐡 } +\tl_const:cn { c__tl_upper_3_X_4_tl } { êÊὢὪⓚⓀⱆⰖⴎႮ𐑊𐐢 } +\tl_const:cn { c__tl_upper_3_X_5_tl } { ëËŏŎȗȖѯѮӓӒḷḶẛṠỿỾὣὫⓛⓁⱇⰗⲫⲪⴏႯꚋꚊꝓꝒ𐑋𐐣 } +\tl_const:cn { c__tl_upper_3_X_6_tl } { ìÌƴƳἀἈὤὬⓜⓂⱈⰘⴐႰ𐑌𐐤 } +\tl_const:cn { c__tl_upper_3_X_7_tl } { íÍőŐșȘɽⱤͅΙѱѰӕӔḹḸἁἉὥὭⓝⓃⱉⰙⲭⲬⴑႱꚍꚌꝕꝔ𐑍𐐥 } +\tl_const:cn { c__tl_upper_3_X_8_tl } { îÎƶƵἂἊὦὮⓞⓄⱊⰚⴒႲ𐑎𐐦 } +\tl_const:cn { c__tl_upper_3_X_9_tl } { ïÏœŒțȚѳѲӗӖḻḺἃἋὧὯⓟⓅⱋⰛⲯⲮⴓႳꚏꚎꝗꝖ𐑏𐐧 } +\tl_const:cn { c__tl_upper_4_X_0_tl } { ðÐʀƦάΆἄἌⓠⓆⱌⰜⴔႴ } +\tl_const:cn { c__tl_upper_4_X_1_tl } { ñÑŕŔƹƸȝȜέΈѵѴәӘḽḼạẠἅἍⓡⓇⱍⰝⲱⲰⴕႵꚑꚐꝙꝘ } +\tl_const:cn { c__tl_upper_4_X_2_tl } { òÒήΉἆἎⓢⓈⱎⰞⴖႶ } +\tl_const:cn { c__tl_upper_4_X_3_tl } { óÓŗŖȟȞʃƩίΊѷѶӛӚḿḾảẢἇἏⓣⓉⱏⰟⲳⲲⴗႷꚓꚒꝛꝚ } +\tl_const:cn { c__tl_upper_4_X_4_tl } { ôÔῐῘⓤⓊⱐⰠⴘႸ } +\tl_const:cn { c__tl_upper_4_X_5_tl } { õÕřŘƽƼαΑѹѸӝӜᵹꝽṁṀấẤῑῙⓥⓋⱑⰡⲵⲴⴙႹꚕꚔꝝꝜaA } +\tl_const:cn { c__tl_upper_4_X_6_tl } { öÖβΒⓦⓌⱒⰢⴚႺbB } +\tl_const:cn { c__tl_upper_4_X_7_tl } { śŚƿǷȣȢʇꞱγΓѻѺӟӞṃṂầẦⓧⓍⱓⰣⲷⲶⴛႻꚗꚖꝟꝞcC } +\tl_const:cn { c__tl_upper_4_X_8_tl } { øØʈƮδΔὰᾺⓨⓎⱔⰤⴜႼdD } +\tl_const:cn { c__tl_upper_4_X_9_tl } { ùÙŝŜȥȤʉɄεΕѽѼӡӠᵽⱣṅṄẩẨάΆⓩⓏⱕⰥⲹⲸⴝႽꚙꚘꝡꝠeE } +\tl_const:cn { c__tl_upper_5_X_0_tl } { úÚʊƱζΖὲῈⱖⰦⴞႾfF } +\tl_const:cn { c__tl_upper_5_X_1_tl } { ûÛşŞȧȦʋƲηΗѿѾӣӢṇṆẫẪέΈⱗⰧⲻⲺⴟႿꚛꚚꝣꝢgG } +\tl_const:cn { c__tl_upper_5_X_2_tl } { üÜʌɅθΘἐἘὴῊⱘⰨⴠჀhH } +\tl_const:cn { c__tl_upper_5_X_3_tl } { ýÝšŠ{Dž}{DŽ}ȩȨιΙҁҀӥӤṉṈậẬἑἙήΉⱙⰩⲽⲼⴡჁꝥꝤiI } +\tl_const:cn { c__tl_upper_5_X_4_tl } { þÞ{dž}{DŽ}κΚἒἚὶῚⱚⰪⴢჂjJ } +\tl_const:cn { c__tl_upper_5_X_5_tl } { ÿŸţŢȫȪλΛӧӦṋṊắẮἓἛίΊⱛⰫⲿⲾⴣჃꝧꝦkK } +\tl_const:cn { c__tl_upper_5_X_6_tl } { {Lj}{LJ}μΜἔἜὸῸⱜⰬⴤჄlL } +\tl_const:cn { c__tl_upper_5_X_7_tl } { āĀťŤ{lj}{LJ}ȭȬνΝөӨṍṌằẰἕἝόΌⱝⰭⳁⳀⴥჅꝩꝨmM } +\tl_const:cn { c__tl_upper_5_X_8_tl } { ʒƷξΞὺῪⱞⰮnN } +\tl_const:cn { c__tl_upper_5_X_9_tl } { ăĂŧŦ{Nj}{NJ}ȯȮοΟӫӪṏṎẳẲύΎⳃⳂⴧჇꝫꝪoO } +\tl_const:cn { c__tl_upper_6_X_0_tl } { {nj}{NJ}πΠὼῺῠῨⅰⅠpP } +\tl_const:cn { c__tl_upper_6_X_1_tl } { ąĄũŨȱȰρΡӭӬṑṐẵẴώΏῡῩ{ⅱ}{Ⅱ}ⱡⱠⳅⳄꙁꙀꝭꝬqQ } +\tl_const:cn { c__tl_upper_6_X_2_tl } { ǎǍςΣ{ⅲ}{Ⅲ}rR } +\tl_const:cn { c__tl_upper_6_X_3_tl } { ćĆūŪȳȲσΣҋҊӯӮṓṒặẶ{ⅳ}{Ⅳ}ⳇⳆꙃꙂꝯꝮsS } +\tl_const:cn { c__tl_upper_6_X_4_tl } { ǐǏτΤᾀ{ἈΙ}ⅴⅤtT } +\tl_const:cn { c__tl_upper_6_X_5_tl } { ĉĈŭŬυΥҍҌӱӰṕṔẹẸᾁ{ἉΙ}ῥῬ{ⅵ}{Ⅵ}ⱥȺⳉⳈⴭჍꙅꙄuU } +\tl_const:cn { c__tl_upper_6_X_6_tl } { ǒǑφΦᾂ{ἊΙ}{ⅶ}{Ⅶ}ⱦȾvV } +\tl_const:cn { c__tl_upper_6_X_7_tl } { ċĊůŮχΧҏҎӳӲṗṖẻẺᾃ{ἋΙ}{ⅷ}{Ⅷ}ⳋⳊꙇꙆwW } +\tl_const:cn { c__tl_upper_6_X_8_tl } { ǔǓψΨἠἨᾄ{ἌΙ}{ⅸ}{Ⅸ}ⱨⱧxX } +\tl_const:cn { c__tl_upper_6_X_9_tl } { čČűŰωΩґҐӵӴṙṘẽẼἡἩᾅ{ἍΙ}ⅹⅩⳍⳌꙉꙈyY } +\tl_const:cn { c__tl_upper_7_X_0_tl } { ǖǕʞꞰϊΪἢἪᾆ{ἎΙ}{ⅺ}{Ⅺ}ⱪⱩzZ } +\tl_const:cn { c__tl_upper_7_X_1_tl } { ďĎųŲϋΫғҒӷӶṛṚếẾἣἫᾇ{ἏΙ}{ⅻ}{Ⅻ}ⳏⳎꙋꙊ } +\tl_const:cn { c__tl_upper_7_X_2_tl } { ǘǗȼȻόΌаАἤἬⅼⅬⱬⱫ𑣀𑢠 } +\tl_const:cn { c__tl_upper_7_X_3_tl } { đĐŵŴύΎбБҕҔӹӸṝṜềỀἥἭⅽⅭⳑⳐꙍꙌ𑣁𑢡 } +\tl_const:cn { c__tl_upper_7_X_4_tl } { ǚǙώΏвВἦἮⅾⅮꝺꝹ𑣂𑢢 } +\tl_const:cn { c__tl_upper_7_X_5_tl } { ēĒŷŶȿⱾгГҗҖӻӺṟṞểỂἧἯⅿⅯⳓⳒꙏꙎ𑣃𑢣 } +\tl_const:cn { c__tl_upper_7_X_6_tl } { ǜǛɀⱿϐΒдДꝼꝻ𑣄𑢤 } +\tl_const:cn { c__tl_upper_7_X_7_tl } { ĕĔǝƎϑΘеЕҙҘӽӼաԱṡṠễỄⳕⳔꙑꙐ𑣅𑢥 } +\tl_const:cn { c__tl_upper_7_X_8_tl } { źŹɂɁжЖբԲ𑣆𑢦 } +\tl_const:cn { c__tl_upper_7_X_9_tl } { ėĖǟǞзЗқҚӿӾգԳṣṢệỆῳ{ΩΙ}ⱳⱲⳗⳖꙓꙒꝿꝾ𑣇𑢧 } +\tl_const:cn { c__tl_upper_8_X_0_tl } { żŻиИդԴᾐ{ἨΙ}ↄↃ𑣈𑢨 } +\tl_const:cn { c__tl_upper_8_X_1_tl } { µΜęĘǡǠͱͰϕΦйЙҝҜԁԀեԵḁḀṥṤỉỈᾑ{ἩΙ}ⳙⳘꙕꙔꞁꞀ𑣉𑢩 } +\tl_const:cn { c__tl_upper_8_X_2_tl } { žŽϖΠкКզԶᾒ{ἪΙ}ⱶⱵ𑣊𑢪 } +\tl_const:cn { c__tl_upper_8_X_3_tl } { ěĚſSǣǢɇɆͳͲϗϏлЛҟҞԃԂէԷḃḂṧṦịỊᾓ{ἫΙ}ⳛⳚꙗꙖꞃꞂ𑣋𑢫 } +\tl_const:cn { c__tl_upper_8_X_4_tl } { ƀɃмМըԸἰἸᾔ{ἬΙ}𑣌𑢬 } +\tl_const:cn { c__tl_upper_8_X_5_tl } { ĝĜǥǤɉɈϙϘнНҡҠԅԄթԹḅḄṩṨọỌἱἹᾕ{ἭΙ}ⳝⳜꙙꙘꞅꞄ𑣍𑢭 } +\tl_const:cn { c__tl_upper_8_X_6_tl } { оОժԺἲἺᾖ{ἮΙ}𑣎𑢮 } +\tl_const:cn { c__tl_upper_8_X_7_tl } { ğĞƃƂǧǦɋɊͷͶϛϚпПңҢԇԆիԻḇḆṫṪỏỎἳἻᾗ{ἯΙ}ⳟⳞꙛꙚꜣꜢꞇꞆ𑣏𑢯 } +\tl_const:cn { c__tl_upper_8_X_8_tl } { рРլԼἴἼ𑣐𑢰 } +\tl_const:cn { c__tl_upper_8_X_9_tl } { ġĠƅƄǩǨɍɌϝϜсСҥҤԉԈխԽḉḈṭṬốỐἵἽⳡⳠꙝꙜꜥꜤ𑣑𑢱 } +\tl_const:cn { c__tl_upper_9_X_0_tl } { тТծԾἶἾ𑣒𑢲 } +\tl_const:cn { c__tl_upper_9_X_1_tl } { ģĢǫǪɏɎͻϽϟϞуУҧҦԋԊկԿḋḊṯṮồỒἷἿⳣⳢꙟꙞꜧꜦ𑣓𑢳 } +\tl_const:cn { c__tl_upper_9_X_2_tl } { ƈƇɐⱯͼϾфФհՀꞌꞋ𑣔𑢴 } +\tl_const:cn { c__tl_upper_9_X_3_tl } { ĥĤǭǬɑⱭͽϿϡϠхХҩҨԍԌձՁḍḌṱṰổỔⲁⲀꙡꙠꜩꜨ𑣕𑢵 } +\tl_const:cn { c__tl_upper_9_X_4_tl } { ɒⱰцЦղՂ𑣖𑢶 } +\tl_const:cn { c__tl_upper_9_X_5_tl } { ħĦǯǮɓƁϣϢчЧҫҪԏԎճՃḏḎṳṲỗỖⲃⲂꙣꙢꜫꜪ𑣗𑢷 } +\tl_const:cn { c__tl_upper_9_X_6_tl } { ƌƋɔƆшШմՄᾠ{ὨΙ}𑣘𑢸 } +\tl_const:cn { c__tl_upper_9_X_7_tl } { aAĩĨϥϤщЩҭҬԑԐյՅḑḐṵṴộỘᾡ{ὩΙ}ⲅⲄꙥꙤꜭꜬꞑꞐ𑣙𑢹 } +\tl_const:cn { c__tl_upper_9_X_8_tl } { bB{Dz}{DZ}ɖƉъЪնՆᾢ{ὪΙ}𑣚𑢺 } +\tl_const:cn { c__tl_upper_9_X_9_tl } { cCīĪ{dz}{DZ}ɗƊϧϦыЫүҮԓԒշՇḓḒṷṶớỚᾣ{ὫΙ}ⲇⲆꙧꙦꜯꜮꞓꞒ𑣛𑢻 } +\tl_const:cn { c__tl_lower_0_X_0_tl } { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờⒸⓒⰤⱔⲈⲉꙨꙩ } +\tl_const:cn { c__tl_lower_0_X_1_tl } { ÉéƑƒჍⴭⒹⓓⰥⱕⳭⳮ } +\tl_const:cn { c__tl_lower_0_X_2_tl } { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳꞖꞗ } +\tl_const:cn { c__tl_lower_0_X_3_tl } { ËëƓɠǷƿⒻⓕⰧⱗ } +\tl_const:cn { c__tl_lower_0_X_4_tl } { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨᾠⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵꞘꞙ } +\tl_const:cn { c__tl_lower_0_X_5_tl } { ÍíΉήᾩᾡⒽⓗⰩⱙ } +\tl_const:cn { c__tl_lower_0_X_6_tl } { Îî{IJ}{ij}ƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪᾢⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷꞚꞛ } +\tl_const:cn { c__tl_lower_0_X_7_tl } { ÏïƗɨᾫᾣⒿⓙⰫⱛ } +\tl_const:cn { c__tl_lower_0_X_8_tl } { ÐðĴĵƘƙǼǽΌόҸҹԜԝḜḝẀẁỤụὈὀᾬᾤⓀⓚⰬⱜⲐⲑꜸꜹꞜꞝ } +\tl_const:cn { c__tl_lower_0_X_9_tl } { ÑñὉὁᾭᾥⓁⓛⰭⱝ } +\tl_const:cn { c__tl_lower_1_X_0_tl } { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮᾦⓂⓜⰮⱞⲒⲓꜺꜻꞞꞟ } +\tl_const:cn { c__tl_lower_1_X_1_tl } { ÓóΏώὋὃᾯᾧⓃⓝ } +\tl_const:cn { c__tl_lower_1_X_2_tl } { ÔôƜɯȀȁϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } +\tl_const:cn { c__tl_lower_1_X_3_tl } { ÕõĹĺƝɲΑαὍὅⓅⓟAa } +\tl_const:cn { c__tl_lower_1_X_4_tl } { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừⓆⓠⲖⲗꜾꜿꞢꞣBb } +\tl_const:cn { c__tl_lower_1_X_5_tl } { ĻļƟɵΓγϷϸⓇⓡCc } +\tl_const:cn { c__tl_lower_1_X_6_tl } { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửⓈⓢⲘⲙꝀꝁꞤꞥDd } +\tl_const:cn { c__tl_lower_1_X_7_tl } { ÙùĽľΕεϹϲӁӂⓉⓣEe } +\tl_const:cn { c__tl_lower_1_X_8_tl } { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữⓊⓤⲚⲛꝂꝃꞦꞧFf } +\tl_const:cn { c__tl_lower_1_X_9_tl } { Ûû{Ŀ}{ŀ}ΗηӃӄⓋⓥGg } +\tl_const:cn { c__tl_lower_2_X_0_tl } { ÜüƤƥȈȉΘθѠѡԨԩḨḩẌẍỰựᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } +\tl_const:cn { c__tl_lower_2_X_1_tl } { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } +\tl_const:cn { c__tl_lower_2_X_2_tl } { ÞþƦʀȊȋΚκϾͼѢѣԪԫḪḫẎẏỲỳᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } +\tl_const:cn { c__tl_lower_2_X_3_tl } { ŃńƧƨΛλϿͽӇӈΆάⓏⓩꞫɜKk } +\tl_const:cn { c__tl_lower_2_X_4_tl } { ȌȍΜμЀѐѤѥԬԭḬḭẐẑỴỵᾼᾳⲠⲡꚀꚁꝈꝉꞬɡLl } +\tl_const:cn { c__tl_lower_2_X_5_tl } { ŅņƩʃΝνЁёӉӊὙὑꞭɬMm } +\tl_const:cn { c__tl_lower_2_X_6_tl } { ȎȏΞξЂђѦѧԮԯḮḯẒẓỶỷⲢⲣꚂꚃꝊꝋNn } +\tl_const:cn { c__tl_lower_2_X_7_tl } { ŇňΟοЃѓӋӌὛὓOo } +\tl_const:cn { c__tl_lower_2_X_8_tl } { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍꞰʞPp } +\tl_const:cn { c__tl_lower_2_X_9_tl } { ΡρЅѕӍӎԱաὝὕꞱʇQq } +\tl_const:cn { c__tl_lower_3_X_0_tl } { ŊŋƮʈȒȓІіѪѫԲբḲḳỺỻⲦⲧꚆꚇꝎꝏRr } +\tl_const:cn { c__tl_lower_3_X_1_tl } { ƯưΣσЇїԳգὟὗSs } +\tl_const:cn { c__tl_lower_3_X_2_tl } { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵỼỽⲨⲩꚈꚉꝐꝑTt } +\tl_const:cn { c__tl_lower_3_X_3_tl } { ƱʊΥυЉљԵեUu } +\tl_const:cn { c__tl_lower_3_X_4_tl } { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷỾỿⲪⲫꚊꚋꝒꝓVv } +\tl_const:cn { c__tl_lower_3_X_5_tl } { ƳƴΧχЋћԷէWw } +\tl_const:cn { c__tl_lower_3_X_6_tl } { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } +\tl_const:cn { c__tl_lower_3_X_7_tl } { ƵƶΩωЍѝԹթΈέYy } +\tl_const:cn { c__tl_lower_3_X_8_tl } { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞßῊὴⲮⲯꚎꚏꝖꝗZz } +\tl_const:cn { c__tl_lower_3_X_9_tl } { ƷʒΫϋЏџԻիΉή } +\tl_const:cn { c__tl_lower_4_X_0_tl } { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌῃⲰⲱꚐꚑꝘꝙ𑢠𑣀 } +\tl_const:cn { c__tl_lower_4_X_1_tl } { БбԽխὩὡ𑢡𑣁 } +\tl_const:cn { c__tl_lower_4_X_2_tl } { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ𑢢𑣂 } +\tl_const:cn { c__tl_lower_4_X_3_tl } { ГгԿկὫὣ𑢣𑣃 } +\tl_const:cn { c__tl_lower_4_X_4_tl } { ŘřƼƽȠƞДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ𑢤𑣄 } +\tl_const:cn { c__tl_lower_4_X_5_tl } { ЕеՁձἉἁὭὥ{Ⅱ}{ⅱ}𑢥𑣅 } +\tl_const:cn { c__tl_lower_4_X_6_tl } { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦ{Ⅲ}{ⅲ}ⲶⲷꚖꚗꝞꝟ𑢦𑣆 } +\tl_const:cn { c__tl_lower_4_X_7_tl } { ЗзՃճἋἃὯὧ{Ⅳ}{ⅳ}𑢧𑣇 } +\tl_const:cn { c__tl_lower_4_X_8_tl } { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꚘꚙꝠꝡ𑢨𑣈 } +\tl_const:cn { c__tl_lower_4_X_9_tl } { ЙйՅյἍἅ{Ⅵ}{ⅵ}𑢩𑣉 } +\tl_const:cn { c__tl_lower_5_X_0_tl } { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆ{Ⅶ}{ⅶ}ⲺⲻꚚꚛꝢꝣ𑢪𑣊 } +\tl_const:cn { c__tl_lower_5_X_1_tl } { ЛлՇշἏἇ{Ⅷ}{ⅷ}𑢫𑣋 } +\tl_const:cn { c__tl_lower_5_X_2_tl } { Šš{DŽ}{dž}ȨȩМмҀҁӤӥՈոṈṉẬậῘῐ{Ⅸ}{ⅸ}ⲼⲽꝤꝥ𑢬𑣌 } +\tl_const:cn { c__tl_lower_5_X_3_tl } { {Dž}{dž}НнՉչῙῑⅩⅹ𑢭𑣍 } +\tl_const:cn { c__tl_lower_5_X_4_tl } { ŢţȪȫОоӦӧՊպṊṋẮắῚὶ{Ⅺ}{ⅺ}ⲾⲿꝦꝧ𑢮𑣎 } +\tl_const:cn { c__tl_lower_5_X_5_tl } { {LJ}{lj}ПпՋջΊί{Ⅻ}{ⅻ}𑢯𑣏 } +\tl_const:cn { c__tl_lower_5_X_6_tl } { ĀāŤť{Lj}{lj}ȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ𑢰𑣐 } +\tl_const:cn { c__tl_lower_5_X_7_tl } { СсՍսႡⴁⅭⅽ𑢱𑣑 } +\tl_const:cn { c__tl_lower_5_X_8_tl } { ĂăŦŧ{NJ}{nj}ȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ𑢲𑣒 } +\tl_const:cn { c__tl_lower_5_X_9_tl } { {Nj}{nj}УуՏտႣⴃⅯⅿ𑢳𑣓 } +\tl_const:cn { c__tl_lower_6_X_0_tl } { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ𐐀𐐨𑢴𑣔 } +\tl_const:cn { c__tl_lower_6_X_1_tl } { ǍǎХхՑցႥⴅἙἑ𐐁𐐩𑢵𑣕 } +\tl_const:cn { c__tl_lower_6_X_2_tl } { ĆćŪūȲȳЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒⱢɫⳆⳇꙂꙃꝮꝯ𐐂𐐪𑢶𑣖 } +\tl_const:cn { c__tl_lower_6_X_3_tl } { ǏǐЧчՓփႧⴇἛἓⱣᵽ𐐃𐐫𑢷𑣗 } +\tl_const:cn { c__tl_lower_6_X_4_tl } { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬𑢸𑣘 } +\tl_const:cn { c__tl_lower_6_X_5_tl } { AaǑǒЩщՕօႩⴉἝἕⰁⰱ𐐅𐐭𑢹𑣙 } +\tl_const:cn { c__tl_lower_6_X_6_tl } { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻⰂⰲⳊⳋꙆꙇ𐐆𐐮𑢺𑣚 } +\tl_const:cn { c__tl_lower_6_X_7_tl } { CcǓǔЫыႫⴋⰃⰳⱧⱨ𐐇𐐯𑢻𑣛 } +\tl_const:cn { c__tl_lower_6_X_8_tl } { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰𑢼𑣜 } +\tl_const:cn { c__tl_lower_6_X_9_tl } { EeǕǖЭэႭⴍῩῡⰅⰵⱩⱪ𐐉𐐱𑢽𑣝 } +\tl_const:cn { c__tl_lower_7_X_0_tl } { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲𑢾𑣞 } +\tl_const:cn { c__tl_lower_7_X_1_tl } { GgǗǘȻȼЯяႯⴏΎύⰇⰷⱫⱬ𐐋𐐳𑢿𑣟 } +\tl_const:cn { c__tl_lower_7_X_2_tl } { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈᾀῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } +\tl_const:cn { c__tl_lower_7_X_3_tl } { IiǙǚȽƚႱⴑᾉᾁⰉⰹⱭɑꝹꝺ𐐍𐐵 } +\tl_const:cn { c__tl_lower_7_X_4_tl } { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊᾂⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } +\tl_const:cn { c__tl_lower_7_X_5_tl } { KkǛǜϏϗႳⴓᾋᾃⰋⰻⱯɐꝻꝼ𐐏𐐷 } +\tl_const:cn { c__tl_lower_7_X_6_tl } { LlĔĕŸÿҘҙӼӽႴⴔṠṡỄễἨἠᾌᾄⰌⰼⱰɒⳔⳕꙐꙑ𐐐𐐸 } +\tl_const:cn { c__tl_lower_7_X_7_tl } { MmŹźɁɂႵⴕἩἡᾍᾅⰍⰽꝽᵹ𐐑𐐹 } +\tl_const:cn { c__tl_lower_7_X_8_tl } { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎᾆⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ𐐒𐐺 } +\tl_const:cn { c__tl_lower_7_X_9_tl } { OoŻżɃƀႷⴗἫἣᾏᾇↃↄⰏⰿ𐐓𐐻 } +\tl_const:cn { c__tl_lower_8_X_0_tl } { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } +\tl_const:cn { c__tl_lower_8_X_1_tl } { QqŽžɅʌႹⴙἭἥⰑⱁⱵⱶ𐐕𐐽 } +\tl_const:cn { c__tl_lower_8_X_2_tl } { RrĚěǢǣɆɇͲͳҞҟԂԃႺⴚḂḃṦṧỊịἮἦⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } +\tl_const:cn { c__tl_lower_8_X_3_tl } { SsႻⴛἯἧⰓⱃ𐐗𐐿 } +\tl_const:cn { c__tl_lower_8_X_4_tl } { TtĜĝǤǥɈɉϘϙҠҡԄԅႼⴜḄḅṨṩỌọῸὸⰔⱄⳜⳝꙘꙙꞄꞅ𐐘𐑀 } +\tl_const:cn { c__tl_lower_8_X_5_tl } { UuƁɓႽⴝΌόⰕⱅ𐐙𐑁 } +\tl_const:cn { c__tl_lower_8_X_6_tl } { VvĞğƂƃǦǧɊɋͶͷϚϛҢңԆԇႾⴞḆḇṪṫỎỏῺὼΩωⰖⱆⳞⳟꙚꙛꜢꜣꞆꞇ𐐚𐑂 } +\tl_const:cn { c__tl_lower_8_X_7_tl } { WwႿⴟΏώⰗⱇ𐐛𐑃 } +\tl_const:cn { c__tl_lower_8_X_8_tl } { XxĠġƄƅǨǩɌɍϜϝҤҥԈԉჀⴠḈḉṬṭỐốᾘᾐῼῳⰘⱈⳠⳡꙜꙝꜤꜥ𐐜𐑄 } +\tl_const:cn { c__tl_lower_8_X_9_tl } { YyჁⴡᾙᾑⰙⱉ𐐝𐑅 } +\tl_const:cn { c__tl_lower_9_X_0_tl } { ZzĢģƆɔǪǫɎɏϞϟҦҧԊԋჂⴢḊḋṮṯỒồᾚᾒKkⰚⱊⱾȿⳢⳣꙞꙟꜦꜧ𐐞𐑆 } +\tl_const:cn { c__tl_lower_9_X_1_tl } { ƇƈჃⴣᾛᾓÅåⰛⱋⱿɀꞋꞌ𐐟𐑇 } +\tl_const:cn { c__tl_lower_9_X_2_tl } { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜᾔⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } +\tl_const:cn { c__tl_lower_9_X_3_tl } { ÁáƉɖჅⴥἹἱᾝᾕⰝⱍꞍɥ𐐡𐑉 } +\tl_const:cn { c__tl_lower_9_X_4_tl } { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞᾖⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } +\tl_const:cn { c__tl_lower_9_X_5_tl } { ÃãƋƌͿϳჇⴧἻἳᾟᾗⰟⱏ𐐣𐑋 } +\tl_const:cn { c__tl_lower_9_X_6_tl } { ÄäĨĩϤϥҬҭԐԑḐḑṴṵỘộἼἴⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } +\tl_const:cn { c__tl_lower_9_X_7_tl } { Åå{DZ}{dz}ἽἵⰡⱑ𐐥𐑍 } +\tl_const:cn { c__tl_lower_9_X_8_tl } { ÆæĪīƎǝ{Dz}{dz}ϦϧҮүԒԓḒḓṶṷỚớἾἶℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } +\tl_const:cn { c__tl_lower_9_X_9_tl } { ÇçƏəἿἷⒷⓑⰣⱓⳫⳬ𐐧𐑏 } +\tl_const:Nn \c__tl_mixed_exceptions_tl { {ß}{Ss}{ff}{Ff}{fi}{Fi}{fl}{Fl}{ffi}{Ffi}{ffl}{Ffl}{ſt}{St}{st}{St}{և}{Եւ}{ﬓ}{Մն}{ﬔ}{Մե}{ﬕ}{Մի}{ﬖ}{Վն}{ﬗ}{Մխ}{ᾲ}{Ὰͅ}{ᾴ}{Άͅ}{ῂ}{Ὴͅ}{ῄ}{Ήͅ}{ῲ}{Ὼͅ}{ῴ}{Ώͅ}{ᾷ}{ᾼ͂}{ῇ}{ῌ͂}{ῷ}{ῼ͂}DžDždžDžLjLjljLjNjNjnjNjDzDzdzDz } +\tl_const:Nn \c__tl_std_sigma_tl {σ} +\tl_const:Nn \c__tl_final_sigma_tl {ς} +\tl_const:Nn \c__tl_dotless_i_tl {ı} +\tl_const:Nn \c__tl_dot_above_tl {̇} +\tl_const:Nn \c__tl_dotted_I_tl {İ} +\tl_const:Nn \c__tl_accents_lt_tl {Ì{i̇̀}Í{i̇́}Ĩ{i̇̃}} \group_begin: \cs_set_protected:Npn \__str_tmp:NNn #1#2#3 { - \tl_const:cx { c__str_fold_#1_#2_tl } + \tl_const:cx { c__str_fold_#1 _X_ #2_tl } { \__str_tmp:Nw #3 \q_recursion_tail { } \q_recursion_stop } } \cs_set:Npn \__str_tmp:Nw #1#2 @@ -70,84 +277,84 @@ } \__str_tmp:NNn 0 0 { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờᾤ{ὤι}ⒸⓒⰤⱔⲈⲉꙨꙩ } \__str_tmp:NNn 0 1 { ÉéƑƒჍⴭᾥ{ὥι}ⒹⓓⰥⱕⳭⳮ } - \__str_tmp:NNn 0 2 { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởᾦ{ὦι}ⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳ } + \__str_tmp:NNn 0 2 { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởᾦ{ὦι}ⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳꞖꞗ } \__str_tmp:NNn 0 3 { ËëƓɠǷƿᾧ{ὧι}ⒻⓕⰧⱗ } - \__str_tmp:NNn 0 4 { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨ{ὠι}ⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵ } + \__str_tmp:NNn 0 4 { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨ{ὠι}ⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵꞘꞙ } \__str_tmp:NNn 0 5 { ÍíΉήᾩ{ὡι}ⒽⓗⰩⱙ } - \__str_tmp:NNn 0 6 { ÎîIJijƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪ{ὢι}ⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷ } + \__str_tmp:NNn 0 6 { Îî{IJ}{ij}ƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪ{ὢι}ⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷꞚꞛ } \__str_tmp:NNn 0 7 { ÏïƗɨᾫ{ὣι}ⒿⓙⰫⱛ } - \__str_tmp:NNn 0 8 { ÐðĴĵƘƙǼǽΌόϰκҸҹԜԝḜḝẀẁỤụὈὀᾬ{ὤι}ⓀⓚⰬⱜⲐⲑꜸꜹ } + \__str_tmp:NNn 0 8 { ÐðĴĵƘƙǼǽΌόϰκҸҹԜԝḜḝẀẁỤụὈὀᾬ{ὤι}ⓀⓚⰬⱜⲐⲑꜸꜹꞜꞝ } \__str_tmp:NNn 0 9 { ÑñϱρὉὁᾭ{ὥι}ⓁⓛⰭⱝ } - \__str_tmp:NNn 1 0 { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮ{ὦι}ⓂⓜⰮⱞⲒⲓꜺꜻ } + \__str_tmp:NNn 1 0 { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮ{ὦι}ⓂⓜⰮⱞⲒⲓꜺꜻꞞꞟ } \__str_tmp:NNn 1 1 { ÓóΏώὋὃᾯ{ὧι}Ⓝⓝ } \__str_tmp:NNn 1 2 { ÔôƜɯȀȁΐ{ΐ}ϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } \__str_tmp:NNn 1 3 { ÕõĹĺƝɲΑαϵεὍὅⓅⓟAa } \__str_tmp:NNn 1 4 { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừᾲ{ὰι}ⓆⓠⲖⲗꜾꜿꞢꞣBb } - \__str_tmp:NNn 1 5 { ĻļƟɵΓγϷϸև{եւ}ᾳ{αι}ⓇⓡCc } + \__str_tmp:NNn 1 5 { ĻļƟɵΓγϷϸ{և}{եւ}ᾳ{αι}ⓇⓡCc } \__str_tmp:NNn 1 6 { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửὐ{ὐ}ᾴ{άι}ⓈⓢⲘⲙꝀꝁꞤꞥDd } \__str_tmp:NNn 1 7 { ÙùĽľΕεϹϲӁӂⓉⓣEe } \__str_tmp:NNn 1 8 { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữὒ{ὒ}ᾶ{ᾶ}ⓊⓤⲚⲛꝂꝃꞦꞧFf } - \__str_tmp:NNn 1 9 { ÛûĿŀΗηӃӄᾷ{ᾶι}ⓋⓥGg } - \__str_tmp:NNn 2 0 { ÜüƤƥȈȉΘθѠѡḨḩẌẍỰựὔ{ὔ}ᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } + \__str_tmp:NNn 1 9 { Ûû{Ŀ}{ŀ}ΗηӃӄᾷ{ᾶι}ⓋⓥGg } + \__str_tmp:NNn 2 0 { ÜüƤƥȈȉΘθѠѡԨԩḨḩẌẍỰựὔ{ὔ}ᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } \__str_tmp:NNn 2 1 { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } - \__str_tmp:NNn 2 2 { ÞþƦʀȊȋΚκϾͼѢѣḪḫẎẏỲỳὖ{ὖ}ᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } - \__str_tmp:NNn 2 3 { ß{ss}ŃńƧƨΛλϿͽӇӈΆάⓏⓩKk } - \__str_tmp:NNn 2 4 { ȌȍΜμЀѐѤѥḬḭẐẑỴỵᾼ{αι}ⲠⲡꚀꚁꝈꝉLl } - \__str_tmp:NNn 2 5 { ŅņƩʃΝνЁёӉӊὙὑMm } - \__str_tmp:NNn 2 6 { ȎȏΞξЂђѦѧḮḯẒẓỶỷιιⲢⲣꚂꚃꝊꝋNn } + \__str_tmp:NNn 2 2 { ÞþƦʀȊȋΚκϾͼѢѣԪԫḪḫẎẏỲỳὖ{ὖ}ᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } + \__str_tmp:NNn 2 3 { ß{ss}ŃńƧƨΛλϿͽӇӈΆάⓏⓩꞫɜKk } + \__str_tmp:NNn 2 4 { ȌȍΜμЀѐѤѥԬԭḬḭẐẑỴỵᾼ{αι}ⲠⲡꚀꚁꝈꝉꞬɡLl } + \__str_tmp:NNn 2 5 { ŅņƩʃΝνЁёӉӊὙὑꞭɬMm } + \__str_tmp:NNn 2 6 { ȎȏΞξЂђѦѧԮԯḮḯẒẓỶỷιιⲢⲣꚂꚃꝊꝋNn } \__str_tmp:NNn 2 7 { ŇňΟοЃѓӋӌὛὓOo } - \__str_tmp:NNn 2 8 { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍPp } - \__str_tmp:NNn 2 9 { ʼn{ʼn}ΡρЅѕӍӎԱաὝὕQq } + \__str_tmp:NNn 2 8 { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍꞰʞPp } + \__str_tmp:NNn 2 9 { {ʼn}{ʼn}ΡρЅѕӍӎԱաὝὕꞱʇQq } \__str_tmp:NNn 3 0 { ŊŋƮʈȒȓІіѪѫԲբḲḳẖ{ẖ}Ỻỻῂ{ὴι}ⲦⲧꚆꚇꝎꝏRr } \__str_tmp:NNn 3 1 { ƯưΣσЇїԳգẗ{ẗ}Ὗὗῃ{ηι}Ss } \__str_tmp:NNn 3 2 { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵẘ{ẘ}Ỽỽῄ{ήι}ⲨⲩꚈꚉꝐꝑTt } \__str_tmp:NNn 3 3 { ƱʊΥυЉљԵեẙ{ẙ}Uu } - \__str_tmp:NNn 3 4 { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷẚ{aʾ}Ỿỿῆ{ῆ}ⲪⲫꚊꚋꝒꝓVv } + \__str_tmp:NNn 3 4 { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷ{ẚ}{aʾ}Ỿỿῆ{ῆ}ⲪⲫꚊꚋꝒꝓVv } \__str_tmp:NNn 3 5 { ƳƴΧχЋћԷէẛṡῇ{ῆι}Ww } \__str_tmp:NNn 3 6 { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } \__str_tmp:NNn 3 7 { ƵƶͅιΩωЍѝԹթΈέYy } \__str_tmp:NNn 3 8 { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞ{ss}ῊὴⲮⲯꚎꚏꝖꝗZz } \__str_tmp:NNn 3 9 { ƷʒΫϋЏџԻիΉή } - \__str_tmp:NNn 4 0 { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌ{ηι}ⲰⲱꚐꚑꝘꝙ } - \__str_tmp:NNn 4 1 { БбԽխὩὡ } - \__str_tmp:NNn 4 2 { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ } - \__str_tmp:NNn 4 3 { ГгԿկὫὣ } - \__str_tmp:NNn 4 4 { ŘřƼƽȠƞΰ{ΰ}ДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ } - \__str_tmp:NNn 4 5 { ЕеՁձἉἁὭὥⅡⅱ } - \__str_tmp:NNn 4 6 { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦῒ{ῒ}ⅢⅲⲶⲷꚖꚗꝞꝟ } - \__str_tmp:NNn 4 7 { ЗзՃճἋἃὯὧΐ{ΐ}Ⅳⅳ } - \__str_tmp:NNn 4 8 { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꝠꝡ } - \__str_tmp:NNn 4 9 { ЙйՅյἍἅⅥⅵ } - \__str_tmp:NNn 5 0 { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆῖ{ῖ}ⅦⅶⲺⲻꝢꝣ } - \__str_tmp:NNn 5 1 { ЛлՇշἏἇῗ{ῗ}Ⅷⅷ } - \__str_tmp:NNn 5 2 { ŠšDŽdžȨȩМмҀҁӤӥՈոṈṉẬậῘῐⅨⅸⲼⲽꝤꝥ } - \__str_tmp:NNn 5 3 { DždžНнՉչῙῑⅩⅹ } - \__str_tmp:NNn 5 4 { ŢţȪȫОоӦӧՊպṊṋẮắῚὶⅪⅺⲾⲿꝦꝧ } - \__str_tmp:NNn 5 5 { LJljПпՋջΊίⅫⅻ } - \__str_tmp:NNn 5 6 { ĀāŤťLjljȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩff{ff} } - \__str_tmp:NNn 5 7 { СсՍսႡⴁⅭⅽfi{fi} } - \__str_tmp:NNn 5 8 { ĂăŦŧNJnjȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫfl{fl} } - \__str_tmp:NNn 5 9 { NjnjУуՏտႣⴃⅯⅿffi{ffi} } - \__str_tmp:NNn 6 0 { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭffl{ffl}𐐀𐐨 } - \__str_tmp:NNn 6 1 { ǍǎХхՑցႥⴅἙἑſt{st}𐐁𐐩 } - \__str_tmp:NNn 6 2 { ĆćŪūȲȳςσЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒῢ{ῢ}ⱢɫⳆⳇꙂꙃꝮꝯst{st}𐐂𐐪 } - \__str_tmp:NNn 6 3 { ǏǐЧчՓփႧⴇἛἓΰ{ΰ}Ᵽᵽ𐐃𐐫 } - \__str_tmp:NNn 6 4 { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔᾀ{ἀι}ῤ{ῤ}ⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬 } - \__str_tmp:NNn 6 5 { AaǑǒЩщՕօႩⴉἝἕᾁ{ἁι}Ⰱⰱ𐐅𐐭 } - \__str_tmp:NNn 6 6 { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻᾂ{ἂι}ῦ{ῦ}ⰂⰲⳊⳋꙆꙇ𐐆𐐮 } - \__str_tmp:NNn 6 7 { CcǓǔЫыႫⴋᾃ{ἃι}ῧ{ῧ}ⰃⰳⱧⱨ𐐇𐐯 } - \__str_tmp:NNn 6 8 { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽᾄ{ἄι}ῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰 } - \__str_tmp:NNn 6 9 { EeǕǖЭэႭⴍᾅ{ἅι}ῩῡⰅⰵⱩⱪ𐐉𐐱 } - \__str_tmp:NNn 7 0 { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếᾆ{ἆι}ῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲 } - \__str_tmp:NNn 7 1 { GgǗǘȻȼЯяႯⴏᾇ{ἇι}ΎύⰇⰷⱫⱬ𐐋𐐳 } + \__str_tmp:NNn 4 0 { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌ{ηι}ⲰⲱꚐꚑꝘꝙ𑢠𑣀 } + \__str_tmp:NNn 4 1 { БбԽխὩὡ𑢡𑣁 } + \__str_tmp:NNn 4 2 { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ𑢢𑣂 } + \__str_tmp:NNn 4 3 { ГгԿկὫὣ𑢣𑣃 } + \__str_tmp:NNn 4 4 { ŘřƼƽȠƞΰ{ΰ}ДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ𑢤𑣄 } + \__str_tmp:NNn 4 5 { ЕеՁձἉἁὭὥ{Ⅱ}{ⅱ}𑢥𑣅 } + \__str_tmp:NNn 4 6 { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦῒ{ῒ}{Ⅲ}{ⅲ}ⲶⲷꚖꚗꝞꝟ𑢦𑣆 } + \__str_tmp:NNn 4 7 { ЗзՃճἋἃὯὧΐ{ΐ}{Ⅳ}{ⅳ}𑢧𑣇 } + \__str_tmp:NNn 4 8 { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꚘꚙꝠꝡ𑢨𑣈 } + \__str_tmp:NNn 4 9 { ЙйՅյἍἅ{Ⅵ}{ⅵ}𑢩𑣉 } + \__str_tmp:NNn 5 0 { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆῖ{ῖ}{Ⅶ}{ⅶ}ⲺⲻꚚꚛꝢꝣ𑢪𑣊 } + \__str_tmp:NNn 5 1 { ЛлՇշἏἇῗ{ῗ}{Ⅷ}{ⅷ}𑢫𑣋 } + \__str_tmp:NNn 5 2 { Šš{DŽ}{dž}ȨȩМмҀҁӤӥՈոṈṉẬậῘῐ{Ⅸ}{ⅸ}ⲼⲽꝤꝥ𑢬𑣌 } + \__str_tmp:NNn 5 3 { {Dž}{dž}НнՉչῙῑⅩⅹ𑢭𑣍 } + \__str_tmp:NNn 5 4 { ŢţȪȫОоӦӧՊպṊṋẮắῚὶ{Ⅺ}{ⅺ}ⲾⲿꝦꝧ𑢮𑣎 } + \__str_tmp:NNn 5 5 { {LJ}{lj}ПпՋջΊί{Ⅻ}{ⅻ}𑢯𑣏 } + \__str_tmp:NNn 5 6 { ĀāŤť{Lj}{lj}ȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ{ff}{ff}𑢰𑣐 } + \__str_tmp:NNn 5 7 { СсՍսႡⴁⅭⅽ{fi}{fi}𑢱𑣑 } + \__str_tmp:NNn 5 8 { ĂăŦŧ{NJ}{nj}ȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ{fl}{fl}𑢲𑣒 } + \__str_tmp:NNn 5 9 { {Nj}{nj}УуՏտႣⴃⅯⅿ{ffi}{ffi}𑢳𑣓 } + \__str_tmp:NNn 6 0 { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ{ffl}{ffl}𐐀𐐨𑢴𑣔 } + \__str_tmp:NNn 6 1 { ǍǎХхՑցႥⴅἙἑ{ſt}{st}𐐁𐐩𑢵𑣕 } + \__str_tmp:NNn 6 2 { ĆćŪūȲȳςσЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒῢ{ῢ}ⱢɫⳆⳇꙂꙃꝮꝯ{st}{st}𐐂𐐪𑢶𑣖 } + \__str_tmp:NNn 6 3 { ǏǐЧчՓփႧⴇἛἓΰ{ΰ}Ᵽᵽ𐐃𐐫𑢷𑣗 } + \__str_tmp:NNn 6 4 { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔᾀ{ἀι}ῤ{ῤ}ⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬𑢸𑣘 } + \__str_tmp:NNn 6 5 { AaǑǒЩщՕօႩⴉἝἕᾁ{ἁι}Ⰱⰱ𐐅𐐭𑢹𑣙 } + \__str_tmp:NNn 6 6 { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻᾂ{ἂι}ῦ{ῦ}ⰂⰲⳊⳋꙆꙇ𐐆𐐮𑢺𑣚 } + \__str_tmp:NNn 6 7 { CcǓǔЫыႫⴋᾃ{ἃι}ῧ{ῧ}ⰃⰳⱧⱨ𐐇𐐯𑢻𑣛 } + \__str_tmp:NNn 6 8 { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽᾄ{ἄι}ῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰𑢼𑣜 } + \__str_tmp:NNn 6 9 { EeǕǖЭэႭⴍᾅ{ἅι}ῩῡⰅⰵⱩⱪ𐐉𐐱𑢽𑣝 } + \__str_tmp:NNn 7 0 { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếᾆ{ἆι}ῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲𑢾𑣞 } + \__str_tmp:NNn 7 1 { GgǗǘȻȼЯяႯⴏᾇ{ἇι}ΎύⰇⰷⱫⱬ𐐋𐐳𑢿𑣟 } \__str_tmp:NNn 7 2 { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈ{ἀι}ῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } \__str_tmp:NNn 7 3 { IiǙǚȽƚႱⴑᾉ{ἁι}ⰉⰹⱭɑꝹꝺ𐐍𐐵 } \__str_tmp:NNn 7 4 { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊ{ἂι}ⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } - \__str_tmp:NNn 7 5 { KkǛǜϏϗႳⴓᾋ{ἃι}ⰋⰻⱯɐꝻꝼﬓ{մն}𐐏𐐷 } - \__str_tmp:NNn 7 6 { LlĔĕŸÿϐβҘҙӼӽႴⴔṠṡỄễἨἠᾌ{ἄι}ⰌⰼⱰɒⳔⳕꙐꙑﬔ{մե}𐐐𐐸 } - \__str_tmp:NNn 7 7 { MmŹźɁɂϑθႵⴕἩἡᾍ{ἅι}ⰍⰽꝽᵹﬕ{մի}𐐑𐐹 } - \__str_tmp:NNn 7 8 { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎ{ἆι}ῲ{ὼι}ⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿﬖ{վն}𐐒𐐺 } - \__str_tmp:NNn 7 9 { OoŻżɃƀႷⴗἫἣᾏ{ἇι}ῳ{ωι}ↃↄⰏⰿﬗ{մխ}𐐓𐐻 } + \__str_tmp:NNn 7 5 { KkǛǜϏϗႳⴓᾋ{ἃι}ⰋⰻⱯɐꝻꝼ{ﬓ}{մն}𐐏𐐷 } + \__str_tmp:NNn 7 6 { LlĔĕŸÿϐβҘҙӼӽႴⴔṠṡỄễἨἠᾌ{ἄι}ⰌⰼⱰɒⳔⳕꙐꙑ{ﬔ}{մե}𐐐𐐸 } + \__str_tmp:NNn 7 7 { MmŹźɁɂϑθႵⴕἩἡᾍ{ἅι}ⰍⰽꝽᵹ{ﬕ}{մի}𐐑𐐹 } + \__str_tmp:NNn 7 8 { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎ{ἆι}ῲ{ὼι}ⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ{ﬖ}{վն}𐐒𐐺 } + \__str_tmp:NNn 7 9 { OoŻżɃƀႷⴗἫἣᾏ{ἇι}ῳ{ωι}ↃↄⰏⰿ{ﬗ}{մխ}𐐓𐐻 } \__str_tmp:NNn 8 0 { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤᾐ{ἠι}ῴ{ώι}ⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } \__str_tmp:NNn 8 1 { QqµμŽžɅʌϕφႹⴙἭἥᾑ{ἡι}ⰑⱁⱵⱶ𐐕𐐽 } \__str_tmp:NNn 8 2 { RrĚěǢǣɆɇͲͳϖπҞҟԂԃႺⴚḂḃṦṧỊịἮἦᾒ{ἢι}ῶ{ῶ}ⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } @@ -163,216 +370,9 @@ \__str_tmp:NNn 9 2 { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜ{ἤι}ⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } \__str_tmp:NNn 9 3 { ÁáƉɖჅⴥἹἱᾝ{ἥι}ⰝⱍꞍɥ𐐡𐑉 } \__str_tmp:NNn 9 4 { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞ{ἦι}ⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } - \__str_tmp:NNn 9 5 { ÃãƋƌჇⴧἻἳᾟ{ἧι}Ⱏⱏ𐐣𐑋 } + \__str_tmp:NNn 9 5 { ÃãƋƌͿϳჇⴧἻἳᾟ{ἧι}Ⱏⱏ𐐣𐑋 } \__str_tmp:NNn 9 6 { ÄäĨĩǰ{ǰ}ϤϥҬҭԐԑḐḑṴṵỘộἼἴᾠ{ὠι}ⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } - \__str_tmp:NNn 9 7 { ÅåDZdzἽἵᾡ{ὡι}Ⱑⱑ𐐥𐑍 } - \__str_tmp:NNn 9 8 { ÆæĪīƎǝDzdzϦϧҮүԒԓḒḓṶṷỚớἾἶᾢ{ὢι}ℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } + \__str_tmp:NNn 9 7 { Åå{DZ}{dz}Ἵἵᾡ{ὡι}Ⱑⱑ𐐥𐑍 } + \__str_tmp:NNn 9 8 { ÆæĪīƎǝ{Dz}{dz}ϦϧҮүԒԓḒḓṶṷỚớἾἶᾢ{ὢι}ℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } \__str_tmp:NNn 9 9 { ÇçƏəἿἷᾣ{ὣι}ⒷⓑⰣⱓⳫⳬ𐐧𐑏 } \group_end: -\tl_const:cn { c__tl_upper_0_0_tl } { dDьЬոՈὀὈᾤ{ὬΙ}ⳬⳫ𐐨𐐀 } -\tl_const:cn { c__tl_upper_0_1_tl } { eEĭĬǵǴəƏϩϨэЭұҰԕԔչՉḕḔṹṸờỜὁὉᾥ{ὭΙ}ⲉⲈꙩꙨ𐐩𐐁 } -\tl_const:cn { c__tl_upper_0_2_tl } { fFƒƑюЮպՊὂὊᾦ{ὮΙ}ⳮⳭ𐐪𐐂 } -\tl_const:cn { c__tl_upper_0_3_tl } { gGįĮɛƐϫϪяЯҳҲԗԖջՋḗḖṻṺởỞὃὋᾧ{ὯΙ}ⲋⲊꙫꙪꜳꜲ𐐫𐐃 } -\tl_const:cn { c__tl_upper_0_4_tl } { hHѐЀռՌὄὌ𐐬𐐄 } -\tl_const:cn { c__tl_upper_0_5_tl } { iIıIƕǶǹǸϭϬёЁҵҴԙԘսՍḙḘṽṼỡỠὅὍⲍⲌꙭꙬꜵꜴ𐐭𐐅 } -\tl_const:cn { c__tl_upper_0_6_tl } { jJђЂվՎ𐐮𐐆 } -\tl_const:cn { c__tl_upper_0_7_tl } { kKijIJǻǺϯϮѓЃҷҶԛԚտՏḛḚṿṾợỢⲏⲎⳳⳲꜷꜶ𐐯𐐇 } -\tl_const:cn { c__tl_upper_0_8_tl } { lLɠƓϰΚєЄրՐ𐐰𐐈 } -\tl_const:cn { c__tl_upper_0_9_tl } { mMĵĴƙƘǽǼϱΡѕЅҹҸԝԜցՑḝḜẁẀụỤⲑⲐꜹꜸ𐐱𐐉 } -\tl_const:cn { c__tl_upper_1_0_tl } { nNƚȽϲϹіІւՒ𐐲𐐊 } -\tl_const:cn { c__tl_upper_1_1_tl } { oOķĶǿǾɣƔїЇһҺԟԞփՓḟḞẃẂủỦⲓⲒꜻꜺ𐐳𐐋 } -\tl_const:cn { c__tl_upper_1_2_tl } { pPјЈքՔᾰᾸⰰⰀ𐐴𐐌 } -\tl_const:cn { c__tl_upper_1_3_tl } { qQȁȀɥꞍϵΕљЉҽҼԡԠօՕḡḠẅẄứỨᾱᾹⰱⰁⲕⲔꜽꜼꞡꞠ𐐵𐐍 } -\tl_const:cn { c__tl_upper_1_4_tl } { rRĺĹƞȠɦꞪњЊֆՖⰲⰂ𐐶𐐎 } -\tl_const:cn { c__tl_upper_1_5_tl } { sSȃȂћЋҿҾԣԢḣḢẇẆừỪᾳ{ΑΙ}ⰳⰃⲗⲖꜿꜾꞣꞢ𐐷𐐏 } -\tl_const:cn { c__tl_upper_1_6_tl } { tTļĻɨƗϸϷќЌⰴⰄ𐐸𐐐 } -\tl_const:cn { c__tl_upper_1_7_tl } { uUơƠȅȄɩƖѝЍԥԤḥḤẉẈửỬὑὙⰵⰅⲙⲘꝁꝀꞥꞤ𐐹𐐑 } -\tl_const:cn { c__tl_upper_1_8_tl } { vVľĽўЎӂӁⰶⰆ𐐺𐐒 } -\tl_const:cn { c__tl_upper_1_9_tl } { wWƣƢȇȆɫⱢϻϺџЏԧԦḧḦẋẊữỮὓὛⰷⰇⲛⲚꝃꝂꞧꞦ𐐻𐐓 } -\tl_const:cn { c__tl_upper_2_0_tl } { xXŀĿӄӃⰸⰈⴀႠ𐐼𐐔 } -\tl_const:cn { c__tl_upper_2_1_tl } { yYƥƤȉȈѡѠḩḨẍẌựỰὕὝⰹⰉⲝⲜⴁႡꝅꝄꞩꞨ𐐽𐐕 } -\tl_const:cn { c__tl_upper_2_2_tl } { zZłŁӆӅⰺⰊⴂႢ𐐾𐐖 } -\tl_const:cn { c__tl_upper_2_3_tl } { ȋȊɯƜѣѢḫḪẏẎỳỲὗὟⰻⰋⲟⲞⴃႣꝇꝆ𐐿𐐗 } -\tl_const:cn { c__tl_upper_2_4_tl } { àÀńŃƨƧӈӇⓐⒶⰼⰌⴄႤ𐑀𐐘 } -\tl_const:cn { c__tl_upper_2_5_tl } { áÁȍȌɱⱮѥѤḭḬẑẐỵỴⓑⒷⰽⰍⲡⲠⴅႥꚁꚀꝉꝈ𐑁𐐙 } -\tl_const:cn { c__tl_upper_2_6_tl } { âÂņŅɲƝӊӉιΙⅎℲⓒⒸⰾⰎⴆႦ𐑂𐐚 } -\tl_const:cn { c__tl_upper_2_7_tl } { ãÃȏȎѧѦḯḮẓẒỷỶⓓⒹⰿⰏⲣⲢⴇႧꚃꚂꝋꝊ𐑃𐐛 } -\tl_const:cn { c__tl_upper_2_8_tl } { äÄňŇӌӋⓔⒺⱀⰐⴈႨ𐑄𐐜 } -\tl_const:cn { c__tl_upper_2_9_tl } { åÅƭƬȑȐɵƟѩѨḱḰẕẔỹỸⓕⒻⱁⰑⲥⲤⴉႩꚅꚄꝍꝌ𐑅𐐝 } -\tl_const:cn { c__tl_upper_3_0_tl } { æÆӎӍⓖⒼⱂⰒⴊႪ𐑆𐐞 } -\tl_const:cn { c__tl_upper_3_1_tl } { çÇŋŊȓȒѫѪӏӀḳḲỻỺῃ{ΗΙ}ⓗⒽⱃⰓⲧⲦⴋႫꚇꚆꝏꝎ𐑇𐐟 } -\tl_const:cn { c__tl_upper_3_2_tl } { èÈưƯὠὨⓘⒾⱄⰔⴌႬ𐑈𐐠 } -\tl_const:cn { c__tl_upper_3_3_tl } { éÉōŌȕȔѭѬӑӐḵḴỽỼὡὩⓙⒿⱅⰕⲩⲨⴍႭꚉꚈꝑꝐ𐑉𐐡 } -\tl_const:cn { c__tl_upper_3_4_tl } { êÊὢὪⓚⓀⱆⰖⴎႮ𐑊𐐢 } -\tl_const:cn { c__tl_upper_3_5_tl } { ëËŏŎȗȖѯѮӓӒḷḶẛṠỿỾὣὫⓛⓁⱇⰗⲫⲪⴏႯꚋꚊꝓꝒ𐑋𐐣 } -\tl_const:cn { c__tl_upper_3_6_tl } { ìÌƴƳἀἈὤὬⓜⓂⱈⰘⴐႰ𐑌𐐤 } -\tl_const:cn { c__tl_upper_3_7_tl } { íÍőŐșȘɽⱤͅΙѱѰӕӔḹḸἁἉὥὭⓝⓃⱉⰙⲭⲬⴑႱꚍꚌꝕꝔ𐑍𐐥 } -\tl_const:cn { c__tl_upper_3_8_tl } { îÎƶƵἂἊὦὮⓞⓄⱊⰚⴒႲ𐑎𐐦 } -\tl_const:cn { c__tl_upper_3_9_tl } { ïÏœŒțȚѳѲӗӖḻḺἃἋὧὯⓟⓅⱋⰛⲯⲮⴓႳꚏꚎꝗꝖ𐑏𐐧 } -\tl_const:cn { c__tl_upper_4_0_tl } { ðÐʀƦάΆἄἌⓠⓆⱌⰜⴔႴ } -\tl_const:cn { c__tl_upper_4_1_tl } { ñÑŕŔƹƸȝȜέΈѵѴәӘḽḼạẠἅἍⓡⓇⱍⰝⲱⲰⴕႵꚑꚐꝙꝘ } -\tl_const:cn { c__tl_upper_4_2_tl } { òÒήΉἆἎⓢⓈⱎⰞⴖႶ } -\tl_const:cn { c__tl_upper_4_3_tl } { óÓŗŖȟȞʃƩίΊѷѶӛӚḿḾảẢἇἏⓣⓉⱏⰟⲳⲲⴗႷꚓꚒꝛꝚ } -\tl_const:cn { c__tl_upper_4_4_tl } { ôÔῐῘⓤⓊⱐⰠⴘႸ } -\tl_const:cn { c__tl_upper_4_5_tl } { õÕřŘƽƼαΑѹѸӝӜᵹꝽṁṀấẤῑῙⓥⓋⱑⰡⲵⲴⴙႹꚕꚔꝝꝜaA } -\tl_const:cn { c__tl_upper_4_6_tl } { öÖβΒⓦⓌⱒⰢⴚႺbB } -\tl_const:cn { c__tl_upper_4_7_tl } { śŚƿǷȣȢγΓѻѺӟӞṃṂầẦⓧⓍⱓⰣⲷⲶⴛႻꚗꚖꝟꝞcC } -\tl_const:cn { c__tl_upper_4_8_tl } { øØʈƮδΔὰᾺⓨⓎⱔⰤⴜႼdD } -\tl_const:cn { c__tl_upper_4_9_tl } { ùÙŝŜȥȤʉɄεΕѽѼӡӠᵽⱣṅṄẩẨάΆⓩⓏⱕⰥⲹⲸⴝႽꝡꝠeE } -\tl_const:cn { c__tl_upper_5_0_tl } { úÚʊƱζΖὲῈⱖⰦⴞႾfF } -\tl_const:cn { c__tl_upper_5_1_tl } { ûÛşŞȧȦʋƲηΗѿѾӣӢṇṆẫẪέΈⱗⰧⲻⲺⴟႿꝣꝢgG } -\tl_const:cn { c__tl_upper_5_2_tl } { üÜʌɅθΘἐἘὴῊⱘⰨⴠჀhH } -\tl_const:cn { c__tl_upper_5_3_tl } { ýÝšŠDžDŽȩȨιΙҁҀӥӤṉṈậẬἑἙήΉⱙⰩⲽⲼⴡჁꝥꝤiI } -\tl_const:cn { c__tl_upper_5_4_tl } { þÞdžDŽκΚἒἚὶῚⱚⰪⴢჂjJ } -\tl_const:cn { c__tl_upper_5_5_tl } { ÿŸţŢȫȪλΛӧӦṋṊắẮἓἛίΊⱛⰫⲿⲾⴣჃꝧꝦkK } -\tl_const:cn { c__tl_upper_5_6_tl } { LjLJμΜἔἜὸῸⱜⰬⴤჄlL } -\tl_const:cn { c__tl_upper_5_7_tl } { āĀťŤljLJȭȬνΝөӨṍṌằẰἕἝόΌⱝⰭⳁⳀⴥჅꝩꝨmM } -\tl_const:cn { c__tl_upper_5_8_tl } { ʒƷξΞὺῪⱞⰮnN } -\tl_const:cn { c__tl_upper_5_9_tl } { ăĂŧŦNjNJȯȮοΟӫӪṏṎẳẲύΎⳃⳂⴧჇꝫꝪoO } -\tl_const:cn { c__tl_upper_6_0_tl } { njNJπΠὼῺῠῨⅰⅠpP } -\tl_const:cn { c__tl_upper_6_1_tl } { ąĄũŨȱȰρΡӭӬṑṐẵẴώΏῡῩⅱⅡⱡⱠⳅⳄꙁꙀꝭꝬqQ } -\tl_const:cn { c__tl_upper_6_2_tl } { ǎǍςΣⅲⅢrR } -\tl_const:cn { c__tl_upper_6_3_tl } { ćĆūŪȳȲσΣҋҊӯӮṓṒặẶⅳⅣⳇⳆꙃꙂꝯꝮsS } -\tl_const:cn { c__tl_upper_6_4_tl } { ǐǏτΤᾀ{ἈΙ}ⅴⅤtT } -\tl_const:cn { c__tl_upper_6_5_tl } { ĉĈŭŬυΥҍҌӱӰṕṔẹẸᾁ{ἉΙ}ῥῬⅵⅥⱥȺⳉⳈⴭჍꙅꙄuU } -\tl_const:cn { c__tl_upper_6_6_tl } { ǒǑφΦᾂ{ἊΙ}ⅶⅦⱦȾvV } -\tl_const:cn { c__tl_upper_6_7_tl } { ċĊůŮχΧҏҎӳӲṗṖẻẺᾃ{ἋΙ}ⅷⅧⳋⳊꙇꙆwW } -\tl_const:cn { c__tl_upper_6_8_tl } { ǔǓψΨἠἨᾄ{ἌΙ}ⅸⅨⱨⱧxX } -\tl_const:cn { c__tl_upper_6_9_tl } { čČűŰωΩґҐӵӴṙṘẽẼἡἩᾅ{ἍΙ}ⅹⅩⳍⳌꙉꙈyY } -\tl_const:cn { c__tl_upper_7_0_tl } { ǖǕϊΪἢἪᾆ{ἎΙ}ⅺⅪⱪⱩzZ } -\tl_const:cn { c__tl_upper_7_1_tl } { ďĎųŲϋΫғҒӷӶṛṚếẾἣἫᾇ{ἏΙ}ⅻⅫⳏⳎꙋꙊ } -\tl_const:cn { c__tl_upper_7_2_tl } { ǘǗȼȻόΌаАἤἬⅼⅬⱬⱫ } -\tl_const:cn { c__tl_upper_7_3_tl } { đĐŵŴύΎбБҕҔӹӸṝṜềỀἥἭⅽⅭⳑⳐꙍꙌ } -\tl_const:cn { c__tl_upper_7_4_tl } { ǚǙώΏвВἦἮⅾⅮꝺꝹ } -\tl_const:cn { c__tl_upper_7_5_tl } { ēĒŷŶȿⱾгГҗҖӻӺṟṞểỂἧἯⅿⅯⳓⳒꙏꙎ } -\tl_const:cn { c__tl_upper_7_6_tl } { ǜǛɀⱿϐΒдДꝼꝻ } -\tl_const:cn { c__tl_upper_7_7_tl } { ĕĔǝƎϑΘеЕҙҘӽӼաԱṡṠễỄⳕⳔꙑꙐ } -\tl_const:cn { c__tl_upper_7_8_tl } { źŹɂɁжЖբԲ } -\tl_const:cn { c__tl_upper_7_9_tl } { ėĖǟǞзЗқҚӿӾգԳṣṢệỆῳ{ΩΙ}ⱳⱲⳗⳖꙓꙒꝿꝾ } -\tl_const:cn { c__tl_upper_8_0_tl } { żŻиИդԴᾐ{ἨΙ}ↄↃ } -\tl_const:cn { c__tl_upper_8_1_tl } { µΜęĘǡǠͱͰϕΦйЙҝҜԁԀեԵḁḀṥṤỉỈᾑ{ἩΙ}ⳙⳘꙕꙔꞁꞀ } -\tl_const:cn { c__tl_upper_8_2_tl } { žŽϖΠкКզԶᾒ{ἪΙ}ⱶⱵ } -\tl_const:cn { c__tl_upper_8_3_tl } { ěĚſSǣǢɇɆͳͲϗϏлЛҟҞԃԂէԷḃḂṧṦịỊᾓ{ἫΙ}ⳛⳚꙗꙖꞃꞂ } -\tl_const:cn { c__tl_upper_8_4_tl } { ƀɃмМըԸἰἸᾔ{ἬΙ} } -\tl_const:cn { c__tl_upper_8_5_tl } { ĝĜǥǤɉɈϙϘнНҡҠԅԄթԹḅḄṩṨọỌἱἹᾕ{ἭΙ}ⳝⳜꙙꙘꞅꞄ } -\tl_const:cn { c__tl_upper_8_6_tl } { оОժԺἲἺᾖ{ἮΙ} } -\tl_const:cn { c__tl_upper_8_7_tl } { ğĞƃƂǧǦɋɊͷͶϛϚпПңҢԇԆիԻḇḆṫṪỏỎἳἻᾗ{ἯΙ}ⳟⳞꙛꙚꜣꜢꞇꞆ } -\tl_const:cn { c__tl_upper_8_8_tl } { рРլԼἴἼ } -\tl_const:cn { c__tl_upper_8_9_tl } { ġĠƅƄǩǨɍɌϝϜсСҥҤԉԈխԽḉḈṭṬốỐἵἽⳡⳠꙝꙜꜥꜤ } -\tl_const:cn { c__tl_upper_9_0_tl } { тТծԾἶἾ } -\tl_const:cn { c__tl_upper_9_1_tl } { ģĢǫǪɏɎͻϽϟϞуУҧҦԋԊկԿḋḊṯṮồỒἷἿⳣⳢꙟꙞꜧꜦ } -\tl_const:cn { c__tl_upper_9_2_tl } { ƈƇɐⱯͼϾфФհՀꞌꞋ } -\tl_const:cn { c__tl_upper_9_3_tl } { ĥĤǭǬɑⱭͽϿϡϠхХҩҨԍԌձՁḍḌṱṰổỔⲁⲀꙡꙠꜩꜨ } -\tl_const:cn { c__tl_upper_9_4_tl } { ɒⱰцЦղՂ } -\tl_const:cn { c__tl_upper_9_5_tl } { ħĦǯǮɓƁϣϢчЧҫҪԏԎճՃḏḎṳṲỗỖⲃⲂꙣꙢꜫꜪ } -\tl_const:cn { c__tl_upper_9_6_tl } { ƌƋɔƆшШմՄᾠ{ὨΙ} } -\tl_const:cn { c__tl_upper_9_7_tl } { aAĩĨϥϤщЩҭҬԑԐյՅḑḐṵṴộỘᾡ{ὩΙ}ⲅⲄꙥꙤꜭꜬꞑꞐ } -\tl_const:cn { c__tl_upper_9_8_tl } { bBDzDZɖƉъЪնՆᾢ{ὪΙ} } -\tl_const:cn { c__tl_upper_9_9_tl } { cCīĪdzDZɗƊϧϦыЫүҮԓԒշՇḓḒṷṶớỚᾣ{ὫΙ}ⲇⲆꙧꙦꜯꜮꞓꞒ } -\tl_const:cn { c__tl_lower_0_0_tl } { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờⒸⓒⰤⱔⲈⲉꙨꙩ } -\tl_const:cn { c__tl_lower_0_1_tl } { ÉéƑƒჍⴭⒹⓓⰥⱕⳭⳮ } -\tl_const:cn { c__tl_lower_0_2_tl } { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳ } -\tl_const:cn { c__tl_lower_0_3_tl } { ËëƓɠǷƿⒻⓕⰧⱗ } -\tl_const:cn { c__tl_lower_0_4_tl } { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨᾠⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵ } -\tl_const:cn { c__tl_lower_0_5_tl } { ÍíΉήᾩᾡⒽⓗⰩⱙ } -\tl_const:cn { c__tl_lower_0_6_tl } { ÎîIJijƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪᾢⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷ } -\tl_const:cn { c__tl_lower_0_7_tl } { ÏïƗɨᾫᾣⒿⓙⰫⱛ } -\tl_const:cn { c__tl_lower_0_8_tl } { ÐðĴĵƘƙǼǽΌόҸҹԜԝḜḝẀẁỤụὈὀᾬᾤⓀⓚⰬⱜⲐⲑꜸꜹ } -\tl_const:cn { c__tl_lower_0_9_tl } { ÑñὉὁᾭᾥⓁⓛⰭⱝ } -\tl_const:cn { c__tl_lower_1_0_tl } { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮᾦⓂⓜⰮⱞⲒⲓꜺꜻ } -\tl_const:cn { c__tl_lower_1_1_tl } { ÓóΏώὋὃᾯᾧⓃⓝ } -\tl_const:cn { c__tl_lower_1_2_tl } { ÔôƜɯȀȁϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } -\tl_const:cn { c__tl_lower_1_3_tl } { ÕõĹĺƝɲΑαὍὅⓅⓟAa } -\tl_const:cn { c__tl_lower_1_4_tl } { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừⓆⓠⲖⲗꜾꜿꞢꞣBb } -\tl_const:cn { c__tl_lower_1_5_tl } { ĻļƟɵΓγϷϸⓇⓡCc } -\tl_const:cn { c__tl_lower_1_6_tl } { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửⓈⓢⲘⲙꝀꝁꞤꞥDd } -\tl_const:cn { c__tl_lower_1_7_tl } { ÙùĽľΕεϹϲӁӂⓉⓣEe } -\tl_const:cn { c__tl_lower_1_8_tl } { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữⓊⓤⲚⲛꝂꝃꞦꞧFf } -\tl_const:cn { c__tl_lower_1_9_tl } { ÛûĿŀΗηӃӄⓋⓥGg } -\tl_const:cn { c__tl_lower_2_0_tl } { ÜüƤƥȈȉΘθѠѡḨḩẌẍỰựᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } -\tl_const:cn { c__tl_lower_2_1_tl } { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } -\tl_const:cn { c__tl_lower_2_2_tl } { ÞþƦʀȊȋΚκϾͼѢѣḪḫẎẏỲỳᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } -\tl_const:cn { c__tl_lower_2_3_tl } { ŃńƧƨΛλϿͽӇӈΆάⓏⓩKk } -\tl_const:cn { c__tl_lower_2_4_tl } { ȌȍΜμЀѐѤѥḬḭẐẑỴỵᾼᾳⲠⲡꚀꚁꝈꝉLl } -\tl_const:cn { c__tl_lower_2_5_tl } { ŅņƩʃΝνЁёӉӊὙὑMm } -\tl_const:cn { c__tl_lower_2_6_tl } { ȎȏΞξЂђѦѧḮḯẒẓỶỷⲢⲣꚂꚃꝊꝋNn } -\tl_const:cn { c__tl_lower_2_7_tl } { ŇňΟοЃѓӋӌὛὓOo } -\tl_const:cn { c__tl_lower_2_8_tl } { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍPp } -\tl_const:cn { c__tl_lower_2_9_tl } { ΡρЅѕӍӎԱաὝὕQq } -\tl_const:cn { c__tl_lower_3_0_tl } { ŊŋƮʈȒȓІіѪѫԲբḲḳỺỻⲦⲧꚆꚇꝎꝏRr } -\tl_const:cn { c__tl_lower_3_1_tl } { ƯưΣσЇїԳգὟὗSs } -\tl_const:cn { c__tl_lower_3_2_tl } { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵỼỽⲨⲩꚈꚉꝐꝑTt } -\tl_const:cn { c__tl_lower_3_3_tl } { ƱʊΥυЉљԵեUu } -\tl_const:cn { c__tl_lower_3_4_tl } { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷỾỿⲪⲫꚊꚋꝒꝓVv } -\tl_const:cn { c__tl_lower_3_5_tl } { ƳƴΧχЋћԷէWw } -\tl_const:cn { c__tl_lower_3_6_tl } { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } -\tl_const:cn { c__tl_lower_3_7_tl } { ƵƶΩωЍѝԹթΈέYy } -\tl_const:cn { c__tl_lower_3_8_tl } { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞßῊὴⲮⲯꚎꚏꝖꝗZz } -\tl_const:cn { c__tl_lower_3_9_tl } { ƷʒΫϋЏџԻիΉή } -\tl_const:cn { c__tl_lower_4_0_tl } { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌῃⲰⲱꚐꚑꝘꝙ } -\tl_const:cn { c__tl_lower_4_1_tl } { БбԽխὩὡ } -\tl_const:cn { c__tl_lower_4_2_tl } { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ } -\tl_const:cn { c__tl_lower_4_3_tl } { ГгԿկὫὣ } -\tl_const:cn { c__tl_lower_4_4_tl } { ŘřƼƽȠƞДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ } -\tl_const:cn { c__tl_lower_4_5_tl } { ЕеՁձἉἁὭὥⅡⅱ } -\tl_const:cn { c__tl_lower_4_6_tl } { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦⅢⅲⲶⲷꚖꚗꝞꝟ } -\tl_const:cn { c__tl_lower_4_7_tl } { ЗзՃճἋἃὯὧⅣⅳ } -\tl_const:cn { c__tl_lower_4_8_tl } { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꝠꝡ } -\tl_const:cn { c__tl_lower_4_9_tl } { ЙйՅյἍἅⅥⅵ } -\tl_const:cn { c__tl_lower_5_0_tl } { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆⅦⅶⲺⲻꝢꝣ } -\tl_const:cn { c__tl_lower_5_1_tl } { ЛлՇշἏἇⅧⅷ } -\tl_const:cn { c__tl_lower_5_2_tl } { ŠšDŽdžȨȩМмҀҁӤӥՈոṈṉẬậῘῐⅨⅸⲼⲽꝤꝥ } -\tl_const:cn { c__tl_lower_5_3_tl } { DždžНнՉչῙῑⅩⅹ } -\tl_const:cn { c__tl_lower_5_4_tl } { ŢţȪȫОоӦӧՊպṊṋẮắῚὶⅪⅺⲾⲿꝦꝧ } -\tl_const:cn { c__tl_lower_5_5_tl } { LJljПпՋջΊίⅫⅻ } -\tl_const:cn { c__tl_lower_5_6_tl } { ĀāŤťLjljȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ } -\tl_const:cn { c__tl_lower_5_7_tl } { СсՍսႡⴁⅭⅽ } -\tl_const:cn { c__tl_lower_5_8_tl } { ĂăŦŧNJnjȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ } -\tl_const:cn { c__tl_lower_5_9_tl } { NjnjУуՏտႣⴃⅯⅿ } -\tl_const:cn { c__tl_lower_6_0_tl } { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ𐐀𐐨 } -\tl_const:cn { c__tl_lower_6_1_tl } { ǍǎХхՑցႥⴅἙἑ𐐁𐐩 } -\tl_const:cn { c__tl_lower_6_2_tl } { ĆćŪūȲȳЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒⱢɫⳆⳇꙂꙃꝮꝯ𐐂𐐪 } -\tl_const:cn { c__tl_lower_6_3_tl } { ǏǐЧчՓփႧⴇἛἓⱣᵽ𐐃𐐫 } -\tl_const:cn { c__tl_lower_6_4_tl } { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬 } -\tl_const:cn { c__tl_lower_6_5_tl } { AaǑǒЩщՕօႩⴉἝἕⰁⰱ𐐅𐐭 } -\tl_const:cn { c__tl_lower_6_6_tl } { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻⰂⰲⳊⳋꙆꙇ𐐆𐐮 } -\tl_const:cn { c__tl_lower_6_7_tl } { CcǓǔЫыႫⴋⰃⰳⱧⱨ𐐇𐐯 } -\tl_const:cn { c__tl_lower_6_8_tl } { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰 } -\tl_const:cn { c__tl_lower_6_9_tl } { EeǕǖЭэႭⴍῩῡⰅⰵⱩⱪ𐐉𐐱 } -\tl_const:cn { c__tl_lower_7_0_tl } { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲 } -\tl_const:cn { c__tl_lower_7_1_tl } { GgǗǘȻȼЯяႯⴏΎύⰇⰷⱫⱬ𐐋𐐳 } -\tl_const:cn { c__tl_lower_7_2_tl } { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈᾀῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } -\tl_const:cn { c__tl_lower_7_3_tl } { IiǙǚȽƚႱⴑᾉᾁⰉⰹⱭɑꝹꝺ𐐍𐐵 } -\tl_const:cn { c__tl_lower_7_4_tl } { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊᾂⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } -\tl_const:cn { c__tl_lower_7_5_tl } { KkǛǜϏϗႳⴓᾋᾃⰋⰻⱯɐꝻꝼ𐐏𐐷 } -\tl_const:cn { c__tl_lower_7_6_tl } { LlĔĕŸÿҘҙӼӽႴⴔṠṡỄễἨἠᾌᾄⰌⰼⱰɒⳔⳕꙐꙑ𐐐𐐸 } -\tl_const:cn { c__tl_lower_7_7_tl } { MmŹźɁɂႵⴕἩἡᾍᾅⰍⰽꝽᵹ𐐑𐐹 } -\tl_const:cn { c__tl_lower_7_8_tl } { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎᾆⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ𐐒𐐺 } -\tl_const:cn { c__tl_lower_7_9_tl } { OoŻżɃƀႷⴗἫἣᾏᾇↃↄⰏⰿ𐐓𐐻 } -\tl_const:cn { c__tl_lower_8_0_tl } { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } -\tl_const:cn { c__tl_lower_8_1_tl } { QqŽžɅʌႹⴙἭἥⰑⱁⱵⱶ𐐕𐐽 } -\tl_const:cn { c__tl_lower_8_2_tl } { RrĚěǢǣɆɇͲͳҞҟԂԃႺⴚḂḃṦṧỊịἮἦⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } -\tl_const:cn { c__tl_lower_8_3_tl } { SsႻⴛἯἧⰓⱃ𐐗𐐿 } -\tl_const:cn { c__tl_lower_8_4_tl } { TtĜĝǤǥɈɉϘϙҠҡԄԅႼⴜḄḅṨṩỌọῸὸⰔⱄⳜⳝꙘꙙꞄꞅ𐐘𐑀 } -\tl_const:cn { c__tl_lower_8_5_tl } { UuƁɓႽⴝΌόⰕⱅ𐐙𐑁 } -\tl_const:cn { c__tl_lower_8_6_tl } { VvĞğƂƃǦǧɊɋͶͷϚϛҢңԆԇႾⴞḆḇṪṫỎỏῺὼΩωⰖⱆⳞⳟꙚꙛꜢꜣꞆꞇ𐐚𐑂 } -\tl_const:cn { c__tl_lower_8_7_tl } { WwႿⴟΏώⰗⱇ𐐛𐑃 } -\tl_const:cn { c__tl_lower_8_8_tl } { XxĠġƄƅǨǩɌɍϜϝҤҥԈԉჀⴠḈḉṬṭỐốᾘᾐῼῳⰘⱈⳠⳡꙜꙝꜤꜥ𐐜𐑄 } -\tl_const:cn { c__tl_lower_8_9_tl } { YyჁⴡᾙᾑⰙⱉ𐐝𐑅 } -\tl_const:cn { c__tl_lower_9_0_tl } { ZzĢģƆɔǪǫɎɏϞϟҦҧԊԋჂⴢḊḋṮṯỒồᾚᾒKkⰚⱊⱾȿⳢⳣꙞꙟꜦꜧ𐐞𐑆 } -\tl_const:cn { c__tl_lower_9_1_tl } { ƇƈჃⴣᾛᾓÅåⰛⱋⱿɀꞋꞌ𐐟𐑇 } -\tl_const:cn { c__tl_lower_9_2_tl } { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜᾔⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } -\tl_const:cn { c__tl_lower_9_3_tl } { ÁáƉɖჅⴥἹἱᾝᾕⰝⱍꞍɥ𐐡𐑉 } -\tl_const:cn { c__tl_lower_9_4_tl } { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞᾖⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } -\tl_const:cn { c__tl_lower_9_5_tl } { ÃãƋƌჇⴧἻἳᾟᾗⰟⱏ𐐣𐑋 } -\tl_const:cn { c__tl_lower_9_6_tl } { ÄäĨĩϤϥҬҭԐԑḐḑṴṵỘộἼἴⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } -\tl_const:cn { c__tl_lower_9_7_tl } { ÅåDZdzἽἵⰡⱑ𐐥𐑍 } -\tl_const:cn { c__tl_lower_9_8_tl } { ÆæĪīƎǝDzdzϦϧҮүԒԓḒḓṶṷỚớἾἶℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } -\tl_const:cn { c__tl_lower_9_9_tl } { ÇçƏəἿἷⒷⓑⰣⱓⳫⳬ𐐧𐑏 } -\tl_const:Nn \c__tl_mixed_exceptions_tl { ß{Ss}ff{Ff}fi{Fi}fl{Fl}ffi{Ffi}ffl{Ffl}ſt{St}st{St}և{Եւ}ﬓ{Մն}ﬔ{Մե}ﬕ{Մի}ﬖ{Վն}ﬗ{Մխ}ᾲ{Ὰͅ}ᾴ{Άͅ}ῂ{Ὴͅ}ῄ{Ήͅ}ῲ{Ὼͅ}ῴ{Ώͅ}ᾷ{ᾼ͂}ῇ{ῌ͂}ῷ{ῼ͂}DžDždžDžLjLjljLjNjNjnjNjDzDzdzDz } -\tl_const:Nn \c__tl_std_sigma_tl {σ} -\tl_const:Nn \c__tl_final_sigma_tl {ς} -\tl_const:Nn \c__tl_dotless_i_tl {ı} -\tl_const:Nn \c__tl_dot_above_tl {̇} -\tl_const:Nn \c__tl_dotted_I_tl {İ} -\tl_const:Nn \c__tl_accents_lt_tl {Ì{i̇̀}Í{i̇́}Ĩ{i̇̃}} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx index 8d24cae8f46..ff9b5ee304c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode-data.dtx @@ -38,7 +38,7 @@ % plain \TeX{}, set up in generic mode. %<*driver|script> \input expl3-generic\relax -\GetIdInfo$Id: l3unicode-data.dtx 5166 2014-06-30 07:48:12Z joseph $ +\GetIdInfo$Id: l3unicode-data.dtx 5283 2014-08-17 00:52:45Z bruno $ {L3 Case data script} %</driver|script> % @@ -160,6 +160,15 @@ } % \end{macrocode} % +% \begin{variable}{\l__unicode_compat_seq} +% A sequence to hold the list of compatibility chars currently defined by +% Unicode. This is needed for both case mapping and case folding (it's +% defined by information in the master file |UnicodeData.txt|). +% \begin{macrocode} +\seq_new:N \l__unicode_compat_seq +% \end{macrocode} +% \end{variable} +% % \begin{variable}{\g__unicode_data_ior} % \begin{variable}{\g__unicode_result_iow} % Streams for reading and writing the data. @@ -259,7 +268,7 @@ % of the data structures. For case folding, the tokens are all stored as % strings. For the lower case letters, to ensure there are always three % digits a bit of maths is used. -% +% % After the mapping, the small number of fixed data structures that are % used for the special case conversions are created. These are mainly empty, % but for cases where a match is possible (as the test char is in the \pdfTeX{} @@ -280,10 +289,10 @@ } \cs_set_protected:Npn \__unicode_tmp:NNNNNNN #1#2#3#4#5#6#7 { - \tl_const:cx { c__str_fold_ #1 _ #2 _ tl } + \tl_const:cx { c__str_fold_ #1 _X_ #2 _ tl } { \tl_to_str:n { #6#7 } } - \tl_const:cn { c__tl_lower_ #1 _ #2 _ tl } { #6#7 } - \tl_const:cn { c__tl_upper_ #4 _ #5 _ tl } { #7#6 } + \tl_const:cn { c__tl_lower_ #1 _X_ #2 _ tl } { #6#7 } + \tl_const:cn { c__tl_upper_ #4 _X_ #5 _ tl } { #7#6 } } \__unicode_tmp:NN AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz @@ -293,17 +302,17 @@ { \int_step_inline:nnnn { 0 } { 1 } { 9 } { - \tl_if_exist:cF { c__str_fold_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__str_fold_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__str_fold_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__str_fold_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_lower_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_lower_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_lower_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_lower_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_upper_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_upper_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_upper_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_upper_ #1 _X_ ##1 _ tl } { } } } } @@ -319,192 +328,22 @@ \__unicode_verb_end: % \end{macrocode} % -% \subsection{Case folding} -% -% \begin{macro}{\__unicode_parse_line:w} -% \begin{macro}[aux]{\__unicode_parse_line_auxi:Nw} -% \begin{macro}[aux]{\__unicode_parse_line_auxii:w} -% \begin{macro}[aux]{\__unicode_parse_line_auxiii:nw} -% \begin{macro}[aux]{\__unicode_parse_line_auxiv:nn} -% \begin{macro}[aux]{\__unicode_parse_line_auxv:wnn} -% The format of |CaseFolding.txt| allows for both blank lines and -% C-style comments starting with |#|. Thus the first two steps of -% the parsing routine are set up to deal with these cases. -% \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line:w #1 \q_stop - { - \tl_if_blank:nF {#1} - { \__unicode_parse_line_auxi:Nw #1 \q_stop } - } -\cs_new_protected:Npn \__unicode_parse_line_auxi:Nw #1#2 \q_stop - { - \str_if_eq_x:nnF { \exp_not:n {#1} } { \cs_to_str:N \# } - { \__unicode_parse_line_auxii:w #1#2 \q_stop } - } -% \end{macrocode} -% For lines actually containing data, there will be four entries separated by -% |;| tokens: the hex code for the char itself, which folding regim\'{e}s -% the line applies to, the hex code(s) for the folded char and a -% description. Of these, we need all but the last one. In the simple -% case of core foldings, the mapping is one--one and this information -% can be passed directly to the next stage. We also handle the full -% mappings (dropping simple ones plus any Turkic variation): an additional -% step is needed to parse this case. -% \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxii:w #1 ;~ #2 ; #3 ; #4 \q_stop - { - \str_if_eq:nnTF {#2} { C } - { - \__unicode_parse_line_auxiv:nn - {#1} { \luatex_Uchar:D "#3 \c_space_tl } - } - { - \str_if_eq:nnT {#2} { F } - { \__unicode_parse_line_auxiii:nw {#1} #3 ~ \q_stop } - } - } -% \end{macrocode} -% Full folding produces two or three Unicode code points from a single -% input char. To deal with this, we split the relevant part of the input -% and check how many chars to generate. The entire folding output is -% braced so that when read back \TeX{} will see this as a group in our -% replacement code. -% \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxiii:nw #1 ~ #2 ~ #3 ~ #4 \q_stop - { - \__unicode_parse_line_auxiv:nn - {#1} - { - { - \luatex_Uchar:D "#2 \c_space_tl - \luatex_Uchar:D "#3 \c_space_tl - \tl_if_empty:nF {#4} - { \luatex_Uchar:D "#4 \c_space_tl } - } - } - } -% \end{macrocode} -% The final stage of extracting the mapping is to split the various cases -% up such that comparison and replacement does not need to check every -% character. That is done by taking the charcode modulo $100$: this splits -% the list of chars into $100$ much shorter lists. With that done, the -% input and output chars are added to the appropriate token lists. -% \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxiv:nn #1#2 - { - \exp_last_unbraced:Nf \__unicode_parse_line_auxv:wnn - { \int_eval:n { 1000000 + "#1 } } \q_stop - {#1} {#2} - } -% \end{macrocode} -% As the input is read in string mode, there is a need for a rescan -% here since \tn{Uchar} requires letters for hexadecimal digits -% beyond~$9$. -% \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxv:wnn - #1#2#3#4#5#6#7 \q_stop #8#9 - { - \tl_rescan:nn - { } - { - \tl_put_right:cx { l__unicode_a_ #6 _ #7 _tl } - { - \luatex_Uchar:D "#8 \c_space_tl - #9 - } - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% The main loop can now take place, reading the source data and saving all of -% the information in the token list array. -% \begin{macrocode} -\ior_open:Nn \g__unicode_data_ior { CaseFolding.txt } -\ior_str_map_inline:Nn \g__unicode_data_ior - { \__unicode_parse_line:w #1 \q_stop } -\ior_close:N \g__unicode_data_ior -% \end{macrocode} -% -% \begin{macro}[aux]{\__str_tmp:NNn} -% \begin{macro}[aux, EXP]{\__str_tmp:Nw} -% To ensure that the output of the case-folding function is a string, all of -% the stored results need to be detokenized. That is done by including a loop -% in the |.def| file which will do the necessary change. To set that up, a -% slightly complicated bit of secondary work: write the functions which do -% the job into the |.def| file itself, using a group to trap the temporary -% code. There is also a test in the following so that the result only has -% braces around items which need it: this is a slight performance tweak when -% the code actually gets used. Notice that everything in the token list is -% detokenized except for the |{| and |}| chars needed for grouping: if the -% search part of the list is not detokenized there are issues with \XeTeX{} -% and chars beyond $0\mathrm{xFFFF}$ (probably a bug, but can be worked -% around!). -% \begin{macrocode} -\__unicode_verb: -\group_begin: - \cs_set_protected:Npn \__str_tmp:NNn #1#2#3 - { - \tl_const:cx { c__str_fold_#1_#2_tl } - { \__str_tmp:Nw #3 \q_recursion_tail { } \q_recursion_stop } - } - \cs_set:Npn \__str_tmp:Nw #1#2 - { - \quark_if_recursion_tail_stop:N #1 - \tl_to_str:N #1 - \tl_if_blank:oT { \use_none:n #2 } - { \use:n } - { \tl_to_str:n {#2} } - \__str_tmp:Nw - } -\__unicode_verb_end: -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% The write loop is simple: map over the array and write everything to the -% output. The saved data is also cleared to save a second loop later on when -% dealing with case mappings. The group used for the temporary stuff in the -% |.def| file is also closed at this point. -% \begin{macrocode} -\tl_map_inline:nn { 0123456789 } - { - \tl_map_inline:nn { 0123456789 } - { - \iow_now:Nx \g__unicode_result_iow - { - \c_space_tl \c_space_tl - \exp_not:N \__str_tmp:NNn #1 ~ ##1 ~ - { ~ \exp_not:v { l__unicode_a_ #1 _ ##1 _tl } ~ } - } - \tl_clear:c { l__unicode_a_ #1 _ ##1 _tl } - } - } -\iow_now:Nn \g__unicode_result_iow { \group_end: } -% \end{macrocode} -% % \subsection{Upper/lower/title casing} % -% Unlike the case folding data, case changing data is split into two parts -% which we need to combine into a single data structure. There are therefore -% two parts to this process: first to read the exceptions, then to read the -% main data and combine it. +% Case changing data is split into two parts which we need to combine into a +% single data structure. There are therefore two parts to this process: first +% to read the exceptions, then to read the main data and combine it. % % \begin{macro}^^A % { % \l__unicode_lower_exceptions_tl, % \l__unicode_title_exceptions_tl, % \l__unicode_upper_exceptions_tl -% } -% There are special cases for lower, title and uppercase changes: these +% } +% There are special cases for lower, title and upper case changes: these % all get read in to appropriate lists. Exceptions could be saved as % property lists but that would make life a bit more complex with the -% titlecase exceptions and wouldn't really gain much (this is after all +% title case exceptions and wouldn't really gain much (this is after all % \enquote{disposable} data). Note that for our purposes, what Unicode call % title case is stored in the output as `mixed' case. % \begin{macrocode} @@ -514,18 +353,31 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\__unicode_parse_line:w} % \begin{macro}[aux]{\__unicode_parse_line_auxii:w} % \begin{macro}[aux]{\__unicode_parse_line_auxiii:nnn} % \begin{macro}[aux]{\__unicode_parse_line_auxiv:nwn} % \begin{macro}[aux]{\__unicode_brace:n} -% The format of the special cases data is similar to that of the folding -% data: as such only some of the parsing is altered. This file has four -% important data fields: the char at it's lower, title and uppercase -% equivalents. As most of the titlecase exceptions are also uppercase -% exceptions, a test is made so that we are only storing truly useful -% exceptions for titlecase. -% \begin{macrocode} -\cs_set_protected:Npn \__unicode_parse_line_auxii:w +% The file |SpecialCasing.txt| uses C-style comments and may contain +% blank lines: those two awkward situations need to be filtered out before +% parsing the real data in the line. +% \begin{macrocode} +\cs_new_protected:Npn \__unicode_parse_line:w #1 \q_stop + { + \tl_if_blank:nF {#1} + { + \str_if_eq_x:nnF { \tl_head:n {#1} } { \cs_to_str:N \# } + { \__unicode_parse_line_auxii:w #1 \q_stop } + } + } +% \end{macrocode} +% Here, |#1| is the code point for the input, |#2| is the lower case mapping, +% |#3| the title case mapping and |#4| the upper case mapping: all three +% mappings are always given even if they are also in |UnicodeData.txt|. As +% most of the title case exceptions are also upper case exceptions, a test is +% made so that we are only storing truly useful exceptions for title case. +% \begin{macrocode} +\cs_new_protected:Npn \__unicode_parse_line_auxii:w #1 ;~ #2 ;~ #3 ;~ #4 ; #5 \q_stop { \__unicode_parse_line_auxiii:nnn {#1} {#2} { lower } @@ -534,13 +386,12 @@ \__unicode_parse_line_auxiii:nnn {#1} {#4} { upper } } % \end{macrocode} -% Unlike the folding data, the special cases file always has a value for -% each of the three entries. Some of these have only one hex number in. -% After a bit of a trick to allow for ease of parsing, we check if there -% are at least two numbers for the case-changed char. If there are, then -% save the exception. If not, then the value will also be in the main +% For each mapping there may be one, two or three code points in the +% output. After a bit of a trick to allow for ease of parsing, we check if +% there are at least two numbers for the case-changed char. If there are, +% then save the exception. If not, then the value will also be in the main % table and we can ignore it here. There is also a test to see if the -% current value is a titlecase exception: they don't need extra braces +% current value is a title case exception: they don't need extra braces % for those. % \begin{macrocode} \cs_new_protected:Npn \__unicode_parse_line_auxiii:nnn #1#2#3 @@ -549,15 +400,15 @@ { \tl_if_empty:nF {#3} { - \str_if_eq:nnTF {#5} { title } - { \cs_set_eq:NN \__unicode_brace:n \use:n } - { \cs_set:Npn \__unicode_brace:n ##1 { { ##1 } } } + \str_if_eq:nnTF {#5} { title } + { \cs_set_eq:NN \__unicode_brace:n \use:n } + { \cs_set:Npn \__unicode_brace:n ##1 { { ##1 } } } \tl_rescan:nn { } { \tl_put_right:cx { l__unicode_ #5 _exceptions_tl } { - \luatex_Uchar:D "#1 \c_space_tl + { \luatex_Uchar:D "#1 \c_space_tl } { \__unicode_brace:n { @@ -577,6 +428,7 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % % Parsing set up, read the special cases file. The input contains both % general special cases and ones dependent on context. We only want to read @@ -595,74 +447,123 @@ % % \begin{macro}{\__unicode_parse_line:w} % \begin{macro}[aux]{\__unicode_parse_line_auxi:w} -% \begin{macro}[aux]{\__unicode_parse_line_auxii:nnNn} -% \begin{macro}[aux]{\__unicode_parse_line_auxiii:wnnNn} -% \begin{macro}[aux]{\__unicode_parse_line_auxiv:nnNNNn} -% Much the same as for the case folding set up: parse the lines of -% data. Here, the lines are longer but always have one--one mappings. +% \begin{macro}[aux]{\__unicode_parse_line_auxii:nw} +% \begin{macro}[aux]{\__unicode_parse_line_auxiii:nw} +% \begin{macro}[aux]{\__unicode_parse_line_auxiv:nnNn} +% \begin{macro}[aux]{\__unicode_parse_line_auxv:wnnNn} +% \begin{macro}[aux]{\__unicode_parse_line_auxvi:nnNNNn} +% For parsing |UnicodeData.txt| there is no need to worry about funny lines: +% the file has no comments or blank lines. Each line also contains a +% one-to-one mapping for the case mappings, so they are easy to deal with. +% The slight complication here is that the lines are rather long, so a +% multi-part approach is needed to grab the correct parts of the line as +% arguments. Of the first set of arguments, the two that needed are |#1| +% (the code point) and |#6| (details about the code point which may include +% the fact it's a compatibility char). % \begin{macrocode} \cs_set_protected:Npn \__unicode_parse_line:w #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 ; #9 ; { - \__unicode_parse_line_auxi:w #1 ; + \__unicode_parse_line_auxi:w #1 ; #6 ; } % \end{macrocode} % With some data items removed, at this stage the hexadecimal -% representation of the char is |#1|, the upper case char is |#5|, -% the lower case one |#6| and the title case one |#7|. These may or -% may not be present and the upper and titlecase values may be -% identical. Where there are values for upper/lowercase, they are -% saved into the arrays. For titlecase, since the number of exceptions -% is small: they are added to the existing list of exceptions we've -% already started. +% representation of the char is |#1|, any compatibility char information is +% in |#2|, the upper case char is |#6|, the lower case one |#7| and the +% title case one |#8|. These may or may not be present and the upper and +% title case values may be identical. The compatibility data is first +% extracted into a sequence, then the main information is processed. +% Where there are values for upper/lower case, they are saved into the +% arrays. For title case, since the number of exceptions is small: they are +% added to the existing list of exceptions we've already started. Note +% that there is a space at the end of |#8| as we are reading the data in +% with spaces not ignored: that has to be allowed for to get the equality +% test right. % \begin{macrocode} \cs_new_protected:Npn \__unicode_parse_line_auxi:w - #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 \q_stop + #1 ; #2 ; #3 ; #4 ; #5 ; #6 ; #7 ; #8 \q_stop { - \tl_if_empty:nF {#5} + \use:x { - \__unicode_parse_line_auxii:nnNn {#1} {#5} a { upper } - \str_if_eq:nnF {#5} {#7} + \__unicode_parse_line_auxii:nw {#1} #2 \tl_to_str:n { <compat> } + \c_space_tl \exp_not:N \q_stop + } + \tl_if_empty:nF {#6} + { + \__unicode_parse_line_auxiv:nnNn {#1} {#6} a { upper } + \str_if_eq:nnF {#6} {#8} { \tl_put_right:Nx \l__unicode_title_exceptions_tl { \luatex_Uchar:D "#1 \c_space_tl - \luatex_Uchar:D "#7 \c_space_tl + \luatex_Uchar:D "#8 \c_space_tl } } } - \tl_if_empty:nF {#6} - { \__unicode_parse_line_auxii:nnNn {#1} {#6} b { lower } } + \tl_if_empty:nF {#7} + { \__unicode_parse_line_auxiv:nnNn {#1} {#7} b { lower } } + } +% \end{macrocode} +% Compatibility chars have information as the marker |<compat>| then a list +% of one to three resulting code points. The one-to-one cases are not an +% issue for dealing the the data, so it's only the more complex versions that +% need to be recorded. +% \begin{macrocode} +\use:x + { + \cs_new_protected:Npn \exp_not:N \__unicode_parse_line_auxii:nw + ##1##2 \tl_to_str:n { <compat> } ~ ##3 \exp_not:N \q_stop + } + { + \tl_if_blank:nF {#3} + { + \__unicode_parse_line_auxiii:nw {#1} #3 ~ \q_stop + } + } +\cs_new_protected:Npn \__unicode_parse_line_auxiii:nw #1#2 ~ #3 \q_stop + { + \tl_if_blank:nF {#3} + { + \seq_put_right:Nn \l__unicode_compat_seq {#1} + } } % \end{macrocode} -% The array structure here is the same as before, except now there -% are two separate ones to manage. +% The array structure here is in two parts, one for upper and one +% for lower case mappings. % \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxii:nnNn #1#2#3 +\cs_new_protected:Npn \__unicode_parse_line_auxiv:nnNn #1#2#3 { - \exp_last_unbraced:Nf \__unicode_parse_line_auxiii:wnnNn + \exp_last_unbraced:Nf \__unicode_parse_line_auxv:wnnNn { \int_eval:n { 1000000 + "#1 } } \q_stop {#1} {#2} #3 } -\cs_new_protected:Npn \__unicode_parse_line_auxiii:wnnNn +\cs_new_protected:Npn \__unicode_parse_line_auxv:wnnNn #1#2#3#4#5#6#7 \q_stop #8#9 - { \__unicode_parse_line_auxiv:nnNNNn {#8} {#9} #6 #7 } + { \__unicode_parse_line_auxvi:nnNNNn {#8} {#9} #6 #7 } % \end{macrocode} -% The final test required here is to look for the special cases and where -% appropriate use that rather than the one--one mapping value. +% There are two final tests. First, for entries in the the compatibility list +% there is a need to add braces around the chars in case there is any +% normalisation during file reading. Second, any special cases have to be +% allowed for: these are checked in the exception list built up earlier. +% Entries in the latter are always braced, so there is no need to add another +% one. % \begin{macrocode} -\cs_new_protected:Npn \__unicode_parse_line_auxiv:nnNNNn #1#2#3#4#5#6 +\cs_new_protected:Npn \__unicode_parse_line_auxvi:nnNNNn #1#2#3#4#5#6 { + \seq_if_in:NnTF \l__unicode_compat_seq {#1} + { \cs_set:Npn \__unicode_brace:n ##1 { { ##1 } } } + { \cs_set_eq:NN \__unicode_brace:n \use:n } \tl_rescan:nn { } { \tl_put_right:cx { l__unicode_ #5 _ #3 _ #4 _tl } { - \luatex_Uchar:D "#1 \c_space_tl - \str_case_x:nvF - { \luatex_Uchar:D "#1 \c_space_tl } - { l__unicode_ #6 _exceptions_tl } - { \luatex_Uchar:D "#2 \c_space_tl } + \__unicode_brace:n + { \luatex_Uchar:D "#1 \c_space_tl } + \str_case_x:nvF + { \luatex_Uchar:D "#1 \c_space_tl } + { l__unicode_ #6 _exceptions_tl } + { \__unicode_brace:n { \luatex_Uchar:D "#2 \c_space_tl } } } } } @@ -672,19 +573,20 @@ % \end{macro} % \end{macro} % \end{macro} +% \end{macro} % -% Everything is set up and so the read loop can take place: this time -% there are no comment chars to worry about and so normal category -% codes apply. +% Everything is set up and so the read loop can take place. % \begin{macrocode} \ior_open:Nn \g__unicode_data_ior { UnicodeData.txt } -\ior_map_inline:Nn \g__unicode_data_ior - { \__unicode_parse_line:w #1 \q_stop } +\ior_str_map_inline:Nn \g__unicode_data_ior + { \__unicode_parse_line:w #1\q_stop } \ior_close:N \g__unicode_data_ior % \end{macrocode} % -% Saving the data uses a single file, with the uppercase array -% followed by the lowercase one and finally the titlecase exceptions. +% Saving the data uses a single file, with the upper case array +% followed by the lower case one and finally the title case exceptions. +% The saved data in the \texttt{a} storage array is also cleared to save a +% second loop later on when dealing with case folding. % \begin{macrocode} \tl_map_inline:nn { 0123456789 } { @@ -693,9 +595,10 @@ \iow_now:Nx \g__unicode_result_iow { \tl_const:cn - { ~ c__tl_upper_ #1 _ ##1 _tl ~ } ~ + { ~ c__tl_upper_ #1 _X_ ##1 _tl ~ } ~ { ~ \exp_not:v { l__unicode_a_ #1 _ ##1 _tl } ~ } } + \tl_clear:c { l__unicode_a_ #1 _ ##1 _tl } } } \tl_map_inline:nn { 0123456789 } @@ -705,7 +608,7 @@ \iow_now:Nx \g__unicode_result_iow { \tl_const:cn - { ~ c__tl_lower_ #1 _ ##1 _tl ~ } ~ + { ~ c__tl_lower_ #1 _X_ ##1 _tl ~ } ~ { ~ \exp_not:v { l__unicode_b_ #1 _ ##1 _tl } ~ } } } @@ -718,7 +621,7 @@ } % \end{macrocode} % -% Data for the special cases is now needed. This is mainly a series of simple +% Data for the special cases is now stored. This is mainly a series of simple % token lists with appropriate names and content, but there is also one place % where a small mapping list is required. % \begin{macrocode} @@ -753,6 +656,180 @@ } % \end{macrocode} % +% \subsection{Case folding} +% +% \begin{macro}{\__unicode_parse_line:w} +% \begin{macro}[aux]{\__unicode_parse_line_auxi:Nw} +% \begin{macro}[aux]{\__unicode_parse_line_auxii:w} +% \begin{macro}[aux]{\__unicode_parse_line_auxiii:nw} +% \begin{macro}[aux]{\__unicode_parse_line_auxiv:nn} +% \begin{macro}[aux]{\__unicode_parse_line_auxv:wnn} +% As for |SpecialCasing.txt|, the format of |CaseFolding.txt| allows both +% blank lines and C-style comments starting with |#|. +% \begin{macrocode} +\cs_set_protected:Npn \__unicode_parse_line:w #1 \q_stop + { + \tl_if_blank:nF {#1} + { \__unicode_parse_line_auxi:Nw #1 \q_stop } + } +\cs_set_protected:Npn \__unicode_parse_line_auxi:Nw #1#2 \q_stop + { + \str_if_eq_x:nnF { \exp_not:n {#1} } { \cs_to_str:N \# } + { \__unicode_parse_line_auxii:w #1#2 \q_stop } + } +% \end{macrocode} +% For lines actually containing data, there will be four entries separated by +% |;| tokens: the hex code for the char itself, which folding regim\'{e}s +% the line applies to, the hex code(s) for the folded char and a +% description. Of these, we need all but the last one. In the simple +% case of core foldings, the mapping is one--one and this information +% can be passed directly to the next stage. We also handle the full +% mappings (dropping simple ones plus any Turkic variation): an additional +% step is needed to parse this case. +% \begin{macrocode} +\cs_set_protected:Npn \__unicode_parse_line_auxii:w #1 ;~ #2 ; #3 ; #4 \q_stop + { + \str_if_eq:nnTF {#2} { C } + { + \__unicode_parse_line_auxiv:nn + {#1} { \luatex_Uchar:D "#3 \c_space_tl } + } + { + \str_if_eq:nnT {#2} { F } + { \__unicode_parse_line_auxiii:nw {#1} #3 ~ \q_stop } + } + } +% \end{macrocode} +% Full folding produces two or three Unicode code points from a single +% input char. To deal with this, we split the relevant part of the input +% and check how many chars to generate. The entire folding output is +% braced so that when read back \TeX{} will see this as a group in our +% replacement code: the only exceptions occur when the input char is on +% the compatibility list, as that would lead to an extra set of braces. +% \begin{macrocode} +\cs_set_protected:Npn \__unicode_parse_line_auxiii:nw #1 ~ #2 ~ #3 ~ #4 \q_stop + { + \seq_if_in:NnTF \l__unicode_compat_seq {#1} + { \cs_set_eq:NN \__unicode_brace:n \use:n } + { \cs_set:Npn \__unicode_brace:n ##1 { { ##1 } } } + \exp_args:Nno \__unicode_parse_line_auxiv:nn + {#1} + { + \__unicode_brace:n + { + \luatex_Uchar:D "#2 \c_space_tl + \luatex_Uchar:D "#3 \c_space_tl + \tl_if_empty:nF {#4} + { \luatex_Uchar:D "#4 \c_space_tl } + } + } + } +% \end{macrocode} +% The final stage of extracting the mapping is to split the various cases +% up such that comparison and replacement does not need to check every +% character. That is done by taking the charcode modulo $100$: this splits +% the list of chars into $100$ much shorter lists. With that done, the +% input and output chars are added to the appropriate token lists. +% \begin{macrocode} +\cs_new_protected:Npn \__unicode_parse_line_auxiv:nn #1#2 + { + \exp_last_unbraced:Nf \__unicode_parse_line_auxv:wnn + { \int_eval:n { 1000000 + "#1 } } \q_stop + {#1} {#2} + } +% \end{macrocode} +% As the input is read in string mode, there is a need for a rescan +% here since \tn{Uchar} requires letters for hexadecimal digits +% beyond~$9$. +% \begin{macrocode} +\cs_new_protected:Npn \__unicode_parse_line_auxv:wnn + #1#2#3#4#5#6#7 \q_stop #8#9 + { + \seq_if_in:NnTF \l__unicode_compat_seq {#8} + { \cs_set:Npn \__unicode_brace:n ##1 { { ##1 } } } + { \cs_set_eq:NN \__unicode_brace:n \use:n } + \tl_rescan:nn + { } + { + \tl_put_right:cx { l__unicode_a_ #6 _ #7 _tl } + { + \__unicode_brace:n { \luatex_Uchar:D "#8 \c_space_tl } + \__unicode_brace:n { #9 } + } + } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% The main loop can now take place, reading the source data and saving all of +% the information in the token list array. +% \begin{macrocode} +\ior_open:Nn \g__unicode_data_ior { CaseFolding.txt } +\ior_str_map_inline:Nn \g__unicode_data_ior + { \__unicode_parse_line:w #1 \q_stop } +\ior_close:N \g__unicode_data_ior +% \end{macrocode} +% +% \begin{macro}[aux]{\__str_tmp:NNn} +% \begin{macro}[aux, EXP]{\__str_tmp:Nw} +% To ensure that the output of the case-folding function is a string, all of +% the stored results need to be detokenized. That is done by including a loop +% in the |.def| file which will do the necessary change. To set that up, a +% slightly complicated bit of secondary work: write the functions which do +% the job into the |.def| file itself, using a group to trap the temporary +% code. There is also a test in the following so that the result only has +% braces around items which need it: this is a slight performance tweak when +% the code actually gets used. Notice that everything in the token list is +% detokenized except for the |{| and |}| chars needed for grouping: if the +% search part of the list is not detokenized there are issues with \XeTeX{} +% and chars beyond $0\mathrm{xFFFF}$ (probably a bug, but can be worked +% around!). +% \begin{macrocode} +\__unicode_verb: +\group_begin: + \cs_set_protected:Npn \__str_tmp:NNn #1#2#3 + { + \tl_const:cx { c__str_fold_#1 _X_ #2_tl } + { \__str_tmp:Nw #3 \q_recursion_tail { } \q_recursion_stop } + } + \cs_set:Npn \__str_tmp:Nw #1#2 + { + \quark_if_recursion_tail_stop:N #1 + \tl_to_str:N #1 + \tl_if_blank:oT { \use_none:n #2 } + { \use:n } + { \tl_to_str:n {#2} } + \__str_tmp:Nw + } +\__unicode_verb_end: +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% The write loop is simple: map over the array and write everything to the +% output. The group used for the temporary stuff in the +% |.def| file is also closed at this point. +% \begin{macrocode} +\tl_map_inline:nn { 0123456789 } + { + \tl_map_inline:nn { 0123456789 } + { + \iow_now:Nx \g__unicode_result_iow + { + \c_space_tl \c_space_tl + \exp_not:N \__str_tmp:NNn #1 ~ ##1 ~ + { ~ \exp_not:v { l__unicode_a_ #1 _ ##1 _tl } ~ } + } + } + } +\iow_now:Nn \g__unicode_result_iow { \group_end: } +% \end{macrocode} +% % Job done, end the \TeX{} run. % \begin{macrocode} \iow_close:N \g__unicode_result_iow diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx index 3976b45c9c0..0bffa0cef39 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx @@ -37,8 +37,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2014/07/20] -%<package>\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} %<package> {} %<package> {% %<package> \PackageError{l3keys2e}{Support package l3kernel too old} @@ -50,7 +50,7 @@ %<package> }% %<package> \endinput %<package> } -\GetIdInfo$Id: l3keys2e.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: l3keys2e.dtx 5378 2014-08-25 10:59:48Z joseph $ {LaTeX2e option processing using LaTeX3 keys} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx index 27bb33f151d..e354b21deaa 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx @@ -41,8 +41,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2014/07/20] -%<package>\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} %<package> {} %<package> {% %<package> \PackageError{xparse}{Support package l3kernel too old} @@ -54,7 +54,7 @@ %<package> }% %<package> \endinput %<package> } -\GetIdInfo$Id: xparse.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: xparse.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental document command parser} %</driver|package> %<*driver> @@ -927,7 +927,7 @@ { \cs_if_exist:NTF #1 { - \__msg_kernel_warning:nnxx { xparse } { redefine-command } + \__msg_kernel_info:nnxx { xparse } { redefine-command } { \token_to_str:N #1 } { \tl_to_str:n {#2} } } { @@ -1057,7 +1057,7 @@ \cs_if_exist:cTF {#1} %</package> { - \__msg_kernel_warning:nnxx { xparse } { redefine-environment } + \__msg_kernel_info:nnxx { xparse } { redefine-environment } {#1} { \tl_to_str:n {#2} } } { @@ -2320,18 +2320,19 @@ % \begin{macro}{\@@_grab_v_group_end:} % \begin{variable}{\l_@@_v_rest_of_signature_tl} % \begin{variable}{\l_@@_v_arg_tl} -% The opening delimiter is never read verbatim, for consistency: if the -% preceding argument was optional and absent, then \TeX{} has already read -% that token when looking for the optional argument. The first thing -% to check is that this delimiter is a character, and distinguish the -% case of a left brace (in that case, \cs{group_align_safe_end:} -% is needed to compensate for the begin-group character that was -% just seen). -% Then set verbatim catcodes with \cs{@@_grab_v_aux_catcodes:}. +% The opening delimiter is the first non-space token, and is never +% read verbatim. This is required by consistency with the case where +% the preceding argument was optional and absent: then \TeX{} has +% already read and tokenized that token when looking for the optional +% argument. The first thing is thus to check is that this delimiter +% is a character, and to distinguish the case of a left brace (in that +% case, \cs{group_align_safe_end:} is needed to compensate for the +% begin-group character that was just seen). Then set verbatim +% catcodes with \cs{@@_grab_v_aux_catcodes:}. % % The group keep catcode changes local, and % \cs{group_align_safe_begin/end:} allow to use a character -% with category code $4$ (normally |&|) as the delimiter. +% with category code~$4$ (normally |&|) as the delimiter. % It is ended by \cs{@@_grab_v_group_end:}, which smuggles % the collected argument out of the group. % \begin{macrocode} @@ -2354,15 +2355,15 @@ \group_align_safe_begin: \tex_escapechar:D = 92 \scan_stop: \tl_clear:N \l_@@_v_arg_tl - \peek_N_type:TF - { \@@_grab_v_aux_test:N } + \peek_meaning_remove_ignore_spaces:NTF \c_group_begin_token { - \peek_meaning_remove:NTF \c_group_begin_token - { - \group_align_safe_end: - \@@_grab_v_bgroup: - } - { \@@_grab_v_aux_abort: } + \group_align_safe_end: + \@@_grab_v_bgroup: + } + { + \peek_N_type:TF + { \@@_grab_v_aux_test:N } + { \@@_grab_v_aux_abort:n { } } } } \cs_new_protected_nopar:Npn \@@_grab_v_group_end: @@ -2402,24 +2403,24 @@ % If we ever meet a token which we cannot grab (non-N-type), % or which is not a character according to % \cs{@@_grab_v_token_if_char:NTF}, then we bail out with -% \cs{@@_grab_v_aux_abort:}. Otherwise, we stop at the first +% \cs{@@_grab_v_aux_abort:n}. Otherwise, we stop at the first % character matching the delimiter. % \begin{macrocode} \cs_new_protected:Npn \@@_grab_v_aux_test:N #1 { - \@@_grab_v_aux_put:N #1 \@@_grab_v_token_if_char:NTF #1 { + \@@_grab_v_aux_put:N #1 \@@_grab_v_aux_catcodes: \@@_grab_v_aux_loop:N #1 } - { \@@_grab_v_aux_abort: } + { \@@_grab_v_aux_abort:n {#1} #1 } } \cs_new_protected:Npn \@@_grab_v_aux_loop:N #1 { \peek_N_type:TF { \@@_grab_v_aux_loop:NN #1 } - { \@@_grab_v_aux_abort: } + { \@@_grab_v_aux_abort:n { } } } \cs_new_protected:Npn \@@_grab_v_aux_loop:NN #1 #2 { @@ -2432,7 +2433,7 @@ \@@_grab_v_aux_loop:N #1 } } - { \@@_grab_v_aux_abort: #2 } + { \@@_grab_v_aux_abort:n {#2} #2 } } \cs_new_protected_nopar:Npn \@@_grab_v_aux_loop_end: { @@ -2472,7 +2473,7 @@ { \peek_N_type:TF { \@@_grab_v_bgroup_loop:N } - { \@@_grab_v_aux_abort: } + { \@@_grab_v_aux_abort:n { } } } \cs_new_protected:Npn \@@_grab_v_bgroup_loop:N #1 { @@ -2495,7 +2496,7 @@ \@@_grab_v_bgroup_loop: } } - { \@@_grab_v_aux_abort: #1 } + { \@@_grab_v_aux_abort:n {#1} #1 } } % \end{macrocode} % \end{variable} @@ -2504,8 +2505,7 @@ % \end{macro} % % \begin{macro}{\@@_grab_v_aux_catcodes:} -% \begin{macro}{\@@_grab_v_aux_abort:} -% \begin{macro}{\@@_grab_v_aux_abort:w} +% \begin{macro}{\@@_grab_v_aux_abort:n} % In a standalone format, the list of special characters is kept % as a sequence, \cs{c_@@_special_chars_seq}, and we use % \tn{dospecials} in package mode. @@ -2530,35 +2530,32 @@ { \char_set_catcode_other:n { \tex_endlinechar:D } } { \char_set_catcode_parameter:n { \tex_endlinechar:D } } } -\cs_new_protected_nopar:Npn \@@_grab_v_aux_abort: +\cs_new_protected:Npn \@@_grab_v_aux_abort:n #1 { \@@_grab_v_group_end: \@@_add_arg:o \c_@@_no_value_tl - \exp_after:wN \@@_grab_v_aux_abort:w \l_@@_args_tl \q_stop - } -\cs_new_protected:Npn \@@_grab_v_aux_abort:w #1 #2 \q_stop - { \group_begin: \char_set_lccode:nn { `\# } { \tex_endlinechar:D } \tl_to_lowercase:n { \group_end: \peek_meaning_remove:NTF ## } { - \__msg_kernel_error:nnxx { xparse } { verbatim-newline } - { \token_to_str:N #1 } + \__msg_kernel_error:nnxxx { xparse } { verbatim-newline } + { \exp_after:wN \token_to_str:N \l_@@_fn_tl } { \tl_to_str:N \l_@@_v_arg_tl } + { \tl_to_str:n {#1} } \l_@@_v_rest_of_signature_tl \l_@@_args_tl } { - \__msg_kernel_error:nnxx { xparse } { verbatim-already-tokenized } - { \token_to_str:N #1 } + \__msg_kernel_error:nnxxx { xparse } { verbatim-tokenized } + { \exp_after:wN \token_to_str:N \l_@@_fn_tl } { \tl_to_str:N \l_@@_v_arg_tl } + { \tl_to_str:n {#1} } \l_@@_v_rest_of_signature_tl \l_@@_args_tl } } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} % % \begin{macro}{\@@_grab_v_aux_put:N} % Storing one token in the collected argument. Most tokens are @@ -3267,19 +3264,23 @@ but~this~is~not~a~document~environment. } \__msg_kernel_new:nnnn { xparse } { verbatim-newline } - { Verbatim~argument~of~#1~ended~by~end~of~line. } + { Verbatim~argument~of~'#1'~ended~by~end~of~line. } { - The~verbatim~argument~of~#1~cannot~contain~more~than~one~line,~but~the~end~ + The~verbatim~argument~of~'#1'~cannot~contain~more~than~one~line,~ + but~the~end~ of~the~current~line~has~been~reached.~You~have~probably~forgotten~the~ closing~delimiter. \\ \\ - LaTeX~will~ignored~'#2'. + LaTeX~will~ignore~'#2'. + } +\__msg_kernel_new:nnnn { xparse } { verbatim-tokenized } + { + The~verbatim~command~'#1'~cannot~be~used~inside~an~argument.~ } -\__msg_kernel_new:nnnn { xparse } { verbatim-already-tokenized } - { Verbatim~command~#1~illegal~in~command~argument. } { - The~command~#1~takes~a~verbatim~argument.~It~may~not~appear~within~ - the~argument~of~another~function. + The~command~'#1'~takes~a~verbatim~argument.~ + It~may~not~appear~within~the~argument~of~another~function.~ + It~received~an~illegal~token \tl_if_empty:nF {#3} { ~'#3' } . \\ \\ LaTeX~will~ignore~'#2'. } @@ -3289,23 +3290,23 @@ % \begin{macrocode} \__msg_kernel_new:nnn { xparse } { define-command } { - Defining~document~command~#1~ - with~arg.~spec.~'#2'~\msg_line_context:. + Defining~command~#1~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { define-environment } { - Defining~document~environment~'#1'~ - with~arg.~spec.~'#2'~\msg_line_context:. + Defining~environment~'#1'~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { redefine-command } { - Redefining~document~command~#1~ - with~arg.~spec.~'#2'~\msg_line_context:. + Redefining~command~#1~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { redefine-environment } { - Redefining~document~environment~'#1'~ - with~arg.~spec.~'#2'~\msg_line_context:. + Redefining~environment~'#1'~ + with~sig.~'#2'~\msg_line_context:. } % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx index f2c65ec055e..54ed4a7c0a7 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx @@ -41,8 +41,8 @@ %<*driver|package> % The version of expl3 required is tested as early as possible, as % some really old versions do not define \ProvidesExplPackage. -\RequirePackage{expl3}[2014/07/20] -%<package>\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +%<package>\@ifpackagelater{expl3}{2014/08/25} %<package> {} %<package> {% %<package> \PackageError{xtemplate}{Support package l3kernel too old} @@ -54,7 +54,7 @@ %<package> }% %<package> \endinput %<package> } -\GetIdInfo$Id: xtemplate.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: xtemplate.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental prototype document functions} %</driver|package> %<*driver> diff --git a/Master/texmf-dist/tex/latex/l3build/l3build.lua b/Master/texmf-dist/tex/latex/l3build/l3build.lua index 02a6f8c066c..9e6bd7d8c59 100644 --- a/Master/texmf-dist/tex/latex/l3build/l3build.lua +++ b/Master/texmf-dist/tex/latex/l3build/l3build.lua @@ -17,20 +17,43 @@ --]] -- Version information: should be identical to that in l3build.dtx -release_date = "2014/07/19" -release_ver = "5240" +release_date = "2014/08/25" +release_ver = "5378" + +-- "module" is a deprecated function in Lua 5.2: as we want the name +-- for other purposes, and it should eventually be 'free', simply +-- remove the built-in +if type (module) == "function" then + module = nil +end -- Ensure the module and bundle exist module = module or "" bundle = bundle or "" +-- Sanity check +if module == "" and bundle == "" then + if string.match (arg[0], ".*l3build%.lua$") then + print ( + "\n" .. + "Error: Call l3build using a configuration file, not directly.\n" + ) + else + print ( + "\n" .. + "Error: Specify either bundle or module in configuration script.\n" + ) + end + os.exit (1) +end + -- Directory structure for the build system -- Use Unix-style path separators maindir = maindir or "." -- Substructure for tests and support files testfiledir = testfiledir or "testfiles" -- Set to "" to cancel any tests -testsupdir = testsupdir or testfiledir .. "/support" +testsuppdir = testsuppdir or testfiledir .. "/support" supportdir = supportdir or maindir .. "/support" -- Structure within a development area @@ -64,7 +87,7 @@ cleanfiles = cleanfiles or {"*.pdf", "*.zip"} excludefiles = excludefiles or {"*~"} -- Any Emacs stuff installfiles = installfiles or {"*.sty"} sourcefiles = sourcefiles or {"*.dtx", "*.ins"} -- Files to copy for unpacking -txtfiles = txtfiles or {"*.markdown"} +txtfiles = txtfiles or {"*.md", "*.markdown"} typesetfiles = typesetfiles or {"*.dtx"} typesetsuppfiles = typesetsuppfiles or { } unpackfiles = unpackfiles or {"*.ins"} -- Files to actually unpack @@ -378,9 +401,9 @@ function checkinit () for _,i in ipairs (checkfiles) do cp (i, unpackdir, testdir) end - if direxists (testsupdir) then - for _,i in ipairs (filelist (testsupdir)) do - cp (i, testsupdir, testdir) + if direxists (testsuppdir) then + for _,i in ipairs (filelist (testsuppdir)) do + cp (i, testsuppdir, testdir) end end for _,i in ipairs (checksuppfiles) do @@ -441,6 +464,10 @@ function formatlog (logfile, newfile) line = string.gsub (line, string.match (logfile, ".*/(.*)%" .. logext .. "$"), "") -- Zap ./ at begin of filename line = string.gsub (line, "%(%.%/", "(") + -- Zap paths if places other than 'here' are accessible + if checksearch then + line = string.gsub (line, "%(.*/([%w-]+%.[%w-]+)%s*$", "(../%1") + end -- XeTeX knows only the smaller set of dimension units line = string.gsub ( line, "cm, mm, dd, cc, bp, or sp", "cm, mm, dd, cc, nd, nc, bp, or sp" @@ -463,6 +490,12 @@ function formatlog (logfile, newfile) for i = 1, 31, 1 do line = string.gsub (line, string.char (i), "^^" .. string.char (64 + i)) end + -- Minor LuaTeX difference: it does not include parentheses in one message + line = string.gsub ( + line, + "%(If you're confused by all this, try typing `I}' now%.%)", + "If you're confused by all this, try typing `I}' now." + ) -- Minor LuaTeX bug: it prints an extra "'" in one message: add enough -- context to hopefully hit only the bug line = string.gsub ( @@ -524,6 +557,7 @@ function runcheck (name, engine, hide) end local errorlevel = 0 for _,i in ipairs (checkengines) do + cp (name .. tlgext, testfiledir, testdir) runtest (name, i, hide) local testname = name .. "." .. i local difffile = testdir .. "/" .. testname .. os_diffext @@ -593,30 +627,40 @@ end help = help or function () print "" if testfiledir ~= "" then - print " build check - run automated check system " + print " build check - run all automated tests for all engines" end if module ~= "" and testfiledir ~= "" then - print " build checklvt <name> - check one test file <name> for all engines" - print " build checklvt <name> <engine> - check one test file <name> for <engine> " + print " build check <name> - check one test file <name> for all engines" + print " build check <name> <engine> - check one test file <name> for <engine> " end - print " build clean - clean out directory tree " + print " build clean - clean out directory tree " if next (cmdchkfiles) ~= nil then - print " build cmdcheck - check commands documented are defined " + print " build cmdcheck - check commands documented are defined " end if module == "" or bundle == "" then - print " build ctan - create CTAN-ready archive " + print " build ctan - create CTAN-ready archive " end - print " build doc - runs all documentation files " - print " build install - install files in local texmf tree " + print " build doc - runs all documentation files " + print " build install - install files in local texmf tree " if module ~= "" and testfiledir ~= "" then - print " build savetlg <name> - save test log for <name> for all engines " - print " build savetlg <name> <engine> - save test log for <name> for <engine> " + print " build save <name> - save test log for <name> for all engines " + print " build save <name> <engine> - save test log for <name> for <engine> " end - print " build unpack - extract packages " + print " build unpack - extract packages " print "" end -function check () +function check (name, engine) + local errorlevel = 0 + if name then + errorlevel = checklvt (name, engine) + else + errorlevel = checkall () + end + return (errorlevel) +end + +function checkall () local errorlevel = 0 if testfiledir ~= "" and direxists (testfiledir) then checkinit () @@ -630,11 +674,7 @@ function check () end end if errorlevel ~= 0 then - print ("\n Check failed with difference files") - for _,i in ipairs (filelist (testdir, "*" .. os_diffext)) do - print (" - " .. testdir .. "/" .. i) - end - print ("") + checkdiff () else print ("\n All checks passed\n") end @@ -643,23 +683,33 @@ function check () end function checklvt (name, engine) - local engine = engine or stdengine if testexists (name) then checkinit () print ("Running checks on " .. name) - runcheck (name, engine) - if fileexists (testdir .. "/" .. name .. "." .. engine .. os_diffext) then - print (" Check fails with diff file") - print ( - " " .. testdir .. "/" .. name .. "." .. engine .. os_diffext) + local errorlevel = runcheck (name, engine) + if errorlevel ~= 0 then + checkdiff () else - print (" Check passes") + if engine then + print (" Check passes") + else + print ("\n All checks passed\n") + end end else print ("Test \"" .. name .. "\" not set up!") end end +-- A short auxiliary to print the list of differences for check +function checkdiff () + print ("\n Check failed with difference files") + for _,i in ipairs (filelist (testdir, "*" .. os_diffext)) do + print (" - " .. testdir .. "/" .. i) + end + print ("") +end + -- Remove all generated files function clean () -- To make sure that distribdir never contains any stray subdirs, @@ -745,7 +795,9 @@ function ctan (standalone) errorlevel = allmodules ("bundlecheck") end if errorlevel == 0 then + rmdir (ctandir) mkdir (ctandir .. "/" .. bundle) + rmdir (tdsdir) mkdir (tdsdir) if standalone then errorlevel = bundlectan () @@ -892,7 +944,7 @@ function install () end end -function savetlg (name, engine) +function save (name, engine) local tlgfile = name .. (engine and ("." .. engine) or "") .. tlgext local newfile = name .. "." .. (engine or stdengine) .. logext if fileexists (testfiledir .. "/" .. name .. lvtext) then @@ -999,13 +1051,7 @@ function stdmain (target, file, engine) elseif target == "doc" then doc () elseif target == "check" and testfiledir ~= "" then - check () - elseif target == "checklvt" and testfiledir ~= "" then - if file then - checklvt (file, engine) - else - help () - end + check (file, engine) elseif target == "clean" then clean () elseif target == "cmdcheck" and next (cmdchkfiles) ~= nil then @@ -1014,9 +1060,9 @@ function stdmain (target, file, engine) ctan (true) elseif target == "install" then install () - elseif target == "savetlg" and testfiledir ~= "" then + elseif target == "save" and testfiledir ~= "" then if file then - savetlg (file, engine) + save (file, engine) else help () end diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3sort/l3sort.sty b/Master/texmf-dist/tex/latex/l3experimental/l3sort/l3sort.sty index cffbfc4bcc1..3f781de5dfc 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3sort/l3sort.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3sort/l3sort.sty @@ -13,7 +13,7 @@ %% %% Do not distribute a modified version of this file. %% -%% File l3sort.dtx (C) Copyright 2012 The LaTeX3 Project +%% File l3sort.dtx (C) Copyright 2012,2014 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 @@ -46,8 +46,20 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{expl3} -\GetIdInfo$Id: l3sort.dtx 4623 2013-12-14 13:53:40Z bruno $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3sort}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3sort will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3sort.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental sorting functions} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3flag.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3flag.sty index 242a465ed60..263f313e488 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3flag.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3flag.sty @@ -13,7 +13,7 @@ %% %% Do not distribute a modified version of this file. %% -%% File: l3flag.dtx Copyright (C) 2011-2012 The LaTeX3 Project +%% File: l3flag.dtx Copyright (C) 2011-2012,2104 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 @@ -45,8 +45,20 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\RequirePackage{expl3} -\GetIdInfo$Id: l3flag.dtx 4745 2014-05-06 10:41:27Z joseph $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3flag}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3flag will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3flag.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental flags} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex-trace.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex-trace.sty index 2fb5cfe9b27..3ea9923985f 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex-trace.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex-trace.sty @@ -45,8 +45,20 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\RequirePackage{expl3} -\GetIdInfo$Id: l3regex.dtx 5218 2014-07-17 14:23:10Z bruno $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3regex}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3regex will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3regex.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental regular expressions} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty index c66adca5c64..980335eefd3 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3regex.sty @@ -45,8 +45,20 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\RequirePackage{expl3} -\GetIdInfo$Id: l3regex.dtx 5218 2014-07-17 14:23:10Z bruno $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3regex}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3regex will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3regex.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental regular expressions} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str.sty index 70ef981eba3..b5b5048082f 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str.sty @@ -45,10 +45,22 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\RequirePackage{expl3} -\GetIdInfo$Id: l3str-expl.dtx 5226 2014-07-18 18:08:01Z joseph $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3str}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3str will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3str-expl.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental strings} -\def\ExplSyntaxName{l3str} +\def\ExplFileName{l3str} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} \cs_new_eq:NN \str_new:N \tl_new:N diff --git a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3tl-build.sty b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3tl-build.sty index e916eaa180e..c2f1b05c180 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/l3str/l3tl-build.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/l3str/l3tl-build.sty @@ -45,8 +45,20 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\RequirePackage{expl3} -\GetIdInfo$Id: l3tl-build.dtx 4745 2014-05-06 10:41:27Z joseph $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3tl-build}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3tl-build will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3tl-build.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental token list construction} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty index 25e080d20df..5af9a52a3c0 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty @@ -47,8 +47,20 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{xparse} -\GetIdInfo$Id: l3galley.dtx 4728 2014-05-04 13:25:37Z joseph $ +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} + {} + {% + \PackageError{l3galley}{Support package l3kernel too old} + {% + Please install an up to date version of l3kernel\MessageBreak + using your TeX package manager or from CTAN.\MessageBreak + \MessageBreak + Loading l3galley will abort!% + }% + \endinput + } +\GetIdInfo$Id: l3galley.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental galley code} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty index 93bbff8537b..96d7bf29a06 100644 --- a/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty +++ b/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty @@ -47,8 +47,8 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{expl3} -\GetIdInfo$Id: xgalley.dtx 4728 2014-05-04 13:25:37Z joseph $ +\RequirePackage{xparse} +\GetIdInfo$Id: xgalley.dtx 5375 2014-08-25 10:17:29Z joseph $ {L3 Experimental galley} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 7261f07da3b..6e360dc8537 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -80,8 +80,8 @@ %% ----------------------------------------------------------------------- \def\ExplFileName{expl3} \def\ExplFileDescription{L3 programming layer} -\def\ExplFileDate{2014/07/20} -\def\ExplFileVersion{5241} +\def\ExplFileDate{2014/08/25} +\def\ExplFileVersion{5378} \begingroup \def\next{\endgroup} \expandafter\ifx\csname PackageError\endcsname\relax @@ -190,7 +190,7 @@ \def\ExplFileDescription{#2}% \def\ExplFileName{[unknown name]}% \def\ExplFileExtension{[unknown extension]}% - \def\ExplFileDate{-1}% + \def\ExplFileVersion{-1}% }% \else \def\tempa @@ -240,7 +240,7 @@ } } \endgroup -\GetIdInfo$Id: l3bootstrap.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3bootstrap.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Bootstrap code} \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname pdfstrcmp\endcsname\relax @@ -301,16 +301,15 @@ \expandafter\ifx\csname directlua\endcsname\relax \else \ifnum\luatexversion<36 % + \newlinechar`\^^J\relax \def\LineBreak{\noexpand\MessageBreak}% \expandafter\ifx\csname PackageError\endcsname\relax \def\LineBreak{^^J}% - \begingroup - \def\PackageError#1#2#3% - {% - \endgroup - \errhelp{#3}% - \errmessage{#1 Error: #2!} - }% + \def\PackageError#1#2#3% + {% + \errhelp{#3}% + \errmessage{#1 Error: #2!} + }% \fi \edef\next {% @@ -426,7 +425,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3names.dtx 4993 2014-06-02 09:39:35Z joseph $ +\GetIdInfo$Id: l3names.dtx 5343 2014-08-22 19:32:35Z bruno $ {L3 Namespace for primitives} \let \tex_global:D \global \let \tex_let:D \let @@ -883,16 +882,17 @@ \tex_let:D \luatex_textdir:D \luatextextdir \tex_fi:D \etex_ifdefined:D \normalend - \tex_let:D \tex_outer:D \normalouter - \tex_let:D \tex_input:D \normalinput \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_vcenter:D \normalvcneter - \tex_let:D \tex_over:D \normalover \tex_let:D \tex_mathop:D \normalmathop \tex_let:D \tex_month:D \normalmonth - \tex_let:D \tex_everyjob:D \normaleveryjob + \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 @@ -939,7 +939,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3basics.dtx 5187 2014-07-09 12:02:17Z will $ +\GetIdInfo$Id: l3basics.dtx 5364 2014-08-24 20:19:24Z joseph $ {L3 Basic definitions} \tex_let:D \if_true: \tex_iftrue:D \tex_let:D \if_false: \tex_iffalse:D @@ -990,9 +990,6 @@ \tex_let:D \c_minus_one \m@ne \tex_chardef:D \c_sixteen = 16 ~ \tex_chardef:D \c_zero = 0 ~ -\tex_chardef:D \c_six = 6 ~ -\tex_chardef:D \c_seven = 7 ~ -\tex_chardef:D \c_twelve = 12 ~ \etex_ifdefined:D \luatex_luatexversion:D \tex_chardef:D \c_max_register_int = 65 535 ~ \tex_else:D @@ -1136,7 +1133,8 @@ {#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 +\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 @@ -1152,17 +1150,20 @@ { \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 +\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 \c_zero \use:n \use_none:n } } -\cs_set_protected:Npn \__prg_generate_F_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 +\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 \c_zero { } } } -\cs_set_protected:Npn \__prg_generate_TF_form:wnnnnnn #1 \q_stop #2#3#4#5#6#7 +\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 \c_zero } @@ -1346,6 +1347,7 @@ { \tex_immediate:D \tex_write:D \c_sixteen } \cs_set_protected:Npn \__msg_kernel_error:nnxx #1#2#3#4 { + \tex_newlinechar:D = `\^^J \tex_relax:D \tex_errmessage:D { !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~! ^^J @@ -1734,7 +1736,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3expan.dtx 5146 2014-06-16 13:12:18Z joseph $ +\GetIdInfo$Id: l3expan.dtx 5349 2014-08-22 21:46:59Z bruno $ {L3 Argument expansion} \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 } } @@ -2210,7 +2212,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3tl.dtx 5214 2014-07-17 08:39:43Z joseph $ +\GetIdInfo$Id: l3tl.dtx 5359 2014-08-24 09:20:32Z bruno $ {L3 Token lists} \cs_new_protected:Npn \tl_new:N #1 { @@ -2423,55 +2425,72 @@ \cs_new_protected:Npn \tl_to_uppercase:n #1 { \tex_uppercase:D {#1} } \cs_new_protected_nopar:Npn \tl_replace_once:Nnn - { \__tl_replace:NNNnn \__tl_replace_once: \tl_set:Nx } + { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_set:Nx } \cs_new_protected_nopar:Npn \tl_greplace_once:Nnn - { \__tl_replace:NNNnn \__tl_replace_once: \tl_gset:Nx } + { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_wrap:w \tl_gset:Nx } \cs_new_protected_nopar:Npn \tl_replace_all:Nnn - { \__tl_replace:NNNnn \__tl_replace_all: \tl_set:Nx } + { \__tl_replace:NnNNNnn \q_mark ? \__tl_replace_next:w \tl_set:Nx } \cs_new_protected_nopar:Npn \tl_greplace_all:Nnn - { \__tl_replace:NNNnn \__tl_replace_all: \tl_gset:Nx } + { \__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:NNNnn #1#2#3#4#5 +\cs_new_protected:Npn \__tl_replace:NnNNNnn #1#2#3#4#5#6#7 { - \tl_if_empty:nTF {#4} + \tl_if_empty:nTF {#6} { - \__msg_kernel_error:nnx { kernel } { empty-search-pattern } - { \tl_to_str:n {#5} } + \__msg_kernel_error:nnx { kernel } { empty-search-pattern } + { \tl_to_str:n {#7} } } { - \group_align_safe_begin: - \cs_set:Npx \__tl_tmp:w ##1##2 #4 - { - ##2 - \exp_not:N \q_mark - \exp_not:N \use_none_delimit_by_q_stop:w - \exp_not:n { \exp_not:n {#5} } - ##1 - } - \group_align_safe_end: - #2 #3 + \tl_if_in:onTF { #5 #6 } {#1} { - \exp_after:wN #1 - #3 \q_mark #4 \q_stop + \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:Npn \__tl_replace:w #1 \q_mark #2 { \exp_not:o {#1} } -\cs_new_nopar:Npn \__tl_replace_all: +\cs_new_protected:Npn \__tl_replace_auxi:NnnNNNnn #1#2#3 { - \exp_after:wN \__tl_replace:w - \__tl_tmp:w \__tl_replace_all: \prg_do_nothing: + \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_nopar:Npn \__tl_replace_once: +\cs_new_protected:Npn \__tl_replace_auxii:nNNNnn #1#2#3#4#5#6 { - \exp_after:wN \__tl_replace:w - \__tl_tmp:w { \__tl_replace_once_end:w \prg_do_nothing: } \prg_do_nothing: + \group_align_safe_begin: + \cs_set:Npn \__tl_replace_wrap:w ##1 #1 ##2 { \exp_not:o {##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 \prg_do_nothing: } + } + #3 #4 + { + \exp_after:wN \__tl_replace_next:w + \exp_after:wN \prg_do_nothing: #4 + #1 + { + \if_false: { \fi: } + \exp_after:wN \use_none:n \exp_after:wN { \if_false: } \fi: + } + #5 + \q_recursion_stop + } + \group_align_safe_end: } -\cs_new:Npn \__tl_replace_once_end:w #1 \q_mark #2 \q_stop - { \exp_not:o {#1} } +\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 @@ -2508,7 +2527,8 @@ \cs_generate_variant:Nn \tl_if_empty:NTF { c } \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 + \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: @@ -2564,9 +2584,11 @@ \cs_generate_variant:Nn \tl_if_in:NnTF { c } \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: } \cs_generate_variant:Nn \tl_if_in:nnT { V , o , no } \cs_generate_variant:Nn \tl_if_in:nnF { V , o , no } @@ -2672,7 +2694,10 @@ \cs_new:Npn \tl_use:N #1 { \tl_if_exist:NTF #1 {#1} - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#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 @@ -2828,7 +2853,10 @@ \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} } + { + \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 @@ -2927,20 +2955,27 @@ } \prg_new_conditional:Npnn \tl_if_head_is_N_type:n #1 { p , T , F , TF } { - \__str_if_eq_x_return:nn - { \exp_not:o { \use:n #1 { } } } - { \exp_not:n { #1 { } } } + \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 * + \if_catcode:w \exp_after:wN \use_none:n - \exp_after:wN { - \exp_after:wN { - \token_to_str:N #1 ? - } - } - * + \exp_after:wN { \exp_after:wN { \token_to_str:N #1 ? } } + * * \prg_return_false: \else: \prg_return_true: @@ -3032,7 +3067,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3str.dtx 5158 2014-06-19 08:05:56Z joseph $ +\GetIdInfo$Id: l3str.dtx 5368 2014-08-24 22:32:57Z bruno $ {L3 Strings} \cs_new:Npn \str_head:n #1 { @@ -3081,7 +3116,8 @@ } \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} } + \if_int_compare:w + \__str_if_eq_x:nn { \exp_not:n {#1} } { \exp_not:n {#2} } = \c_zero \prg_return_true: \else: \prg_return_false: \fi: } @@ -3177,7 +3213,7 @@ \cs_new:Npn \__str_fold_auxiii:NNNNNNNN #1#2#3#4#5#6#7#8 { \exp_args:NNv \str_case_x:nnF #8 - { c__str_fold_ #6 _ #7 _tl } + { c__str_fold_ #6 _X_ #7 _tl } { #8 \exp_after:wN \use_none:n #8 @@ -3220,7 +3256,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3seq.dtx 5232 2014-07-18 19:32:54Z joseph $ +\GetIdInfo$Id: l3seq.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Sequences and stacks} \cs_new:Npn \__seq_item:n { @@ -3326,8 +3362,10 @@ { \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 } +\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 @@ -3684,7 +3722,10 @@ \q_stop { } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } + { + \__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 } } @@ -3775,14 +3816,15 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3int.dtx 5197 2014-07-11 06:42:47Z joseph $ +\GetIdInfo$Id: l3int.dtx 5372 2014-08-25 02:01:41Z bruno $ {L3 Integers} \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 -\cs_new:Npn \int_eval:n #1 { \__int_value:w \__int_eval:w #1 \__int_eval_end: } +\cs_new:Npn \int_eval:n #1 + { \__int_value:w \__int_eval:w #1 \__int_eval_end: } \cs_new:Npn \int_abs:n #1 { \__int_value:w \exp_after:wN \__int_abs:N @@ -3899,8 +3941,10 @@ \cs_new_protected:Npn \int_gset_eq:NN #1#2 { \tex_global:D #1 = #2 } \cs_generate_variant:Nn \int_gset_eq:NN { c } \cs_generate_variant:Nn \int_gset_eq:NN { 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 } +\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_new_protected:Npn \int_add:Nn #1#2 { \tex_advance:D #1 by \__int_eval:w #2 \__int_eval_end: } \cs_new_protected:Npn \int_sub:Nn #1#2 @@ -4415,90 +4459,54 @@ \cs_new_nopar:Npn \__int_to_Roman_d:w { D } \cs_new_nopar:Npn \__int_to_Roman_m:w { M } \cs_new:Npn \__int_to_Roman_Q:w #1 { } -\cs_new:Npn \__int_get_sign:n #1 - { - \__int_get_sign_and_digits:nNNN {#1} - \c_true_bool \c_true_bool \c_false_bool - } -\cs_new:Npn \__int_get_digits:n #1 - { - \__int_get_sign_and_digits:nNNN {#1} - \c_true_bool \c_false_bool \c_true_bool - } -\cs_new:Npn \__int_get_sign_and_digits:nNNN #1#2#3#4 +\cs_new:Npn \__int_pass_signs:wn #1 { - \exp_args:Nf \tl_if_head_eq_charcode:nNTF {#1} - - { - \bool_if:NTF #2 - { - \__int_get_sign_and_digits:oNNN - { \use_none:n #1 } \c_false_bool #3#4 - } - { - \__int_get_sign_and_digits:oNNN - { \use_none:n #1 } \c_true_bool #3#4 - } - } - { - \exp_args:Nf \tl_if_head_eq_charcode:nNTF {#1} + - { \__int_get_sign_and_digits:oNNN { \use_none:n #1 } #2#3#4 } - { - \bool_if:NT #3 { \bool_if:NF #2 - } - \bool_if:NT #4 {#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_generate_variant:Nn \__int_get_sign_and_digits:nNNN { o } +\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 { - \__int_get_sign:n {#1} - \exp_args:Nf \__int_from_alph:n { \__int_get_digits:n {#1} } + \__int_pass_signs:wn #1 + \q_stop { \__int_from_alph:nN { 0 } } + \q_recursion_tail \q_recursion_stop } } -\cs_new:Npn \__int_from_alph:n #1 - { \__int_from_alph:nN { 0 } #1 \q_nil } \cs_new:Npn \__int_from_alph:nN #1#2 { - \quark_if_nil:NTF #2 - {#1} - { - \exp_args:Nf \__int_from_alph:nN - { \int_eval:n { #1 * 26 + \__int_from_alph:N #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 - { \int_eval:n { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } } } + { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 64 } { 96 } } \cs_new:Npn \int_from_base:nn #1#2 { \int_eval:n { - \__int_get_sign:n {#1} - \exp_args:Nf \__int_from_base:nn - { \__int_get_digits:n {#1} } {#2} + \__int_pass_signs:wn #1 + \q_stop { \__int_from_base:nnN { 0 } {#2} } + \q_recursion_tail \q_recursion_stop } } -\cs_new:Npn \__int_from_base:nn #1#2 - { \__int_from_base:nnN { 0 } { #2 } #1 \q_nil } \cs_new:Npn \__int_from_base:nnN #1#2#3 { - \quark_if_nil:NTF #3 - {#1} - { - \exp_args:Nf \__int_from_base:nnN - { \int_eval:n { #1 * #2 + \__int_from_base:N #3 } } - {#2} - } + \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} - { - \int_eval:n - { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } } - } + { `#1 - \int_compare:nNnTF { `#1 } < { 91 } { 55 } { 87 } } } \cs_new:Npn \int_from_bin:n #1 { \int_from_base:nn {#1} \c_two } @@ -4522,50 +4530,40 @@ \int_const:cn { c__int_from_roman_M_int } { 1000 } \cs_new:Npn \int_from_roman:n #1 { - \tl_if_blank:nF {#1} + \int_eval:n { - \exp_after:wN \__int_from_roman_end:w - \__int_value:w \__int_eval:w - \__int_from_roman:NN #1 Q \q_stop + ( + \c_zero + \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 { - \str_if_eq:nnTF {#1} { Q } - {#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 } } { - \str_if_eq:nnTF {#2} { Q } - { - \int_if_exist:cF { c__int_from_roman_ #1 _int } - { \__int_from_roman_clean_up:w } - + - \use:c { c__int_from_roman_ #1 _int } - #2 - } - { - \int_if_exist:cF { c__int_from_roman_ #1 _int } - { \__int_from_roman_clean_up:w } - \int_if_exist:cF { c__int_from_roman_ #2 _int } - { \__int_from_roman_clean_up: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 - } - } + + \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_end:w #1 Q #2 \q_stop - { \tl_if_empty:nTF {#2} {#1} {#2} } -\cs_new:Npn \__int_from_roman_clean_up:w #1 Q { + 0 Q -1 } +\cs_new:Npn \__int_from_roman_error:w #1 \q_recursion_stop #2 + { #2 * \c_zero - \c_one } \cs_new_eq:NN \int_show:N \__kernel_register_show:N \cs_new_eq:NN \int_show:c \__kernel_register_show:c \cs_new_protected:Npn \int_show:n #1 @@ -4575,10 +4573,13 @@ \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 } @@ -4632,7 +4633,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3quark.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3quark.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Quarks} \cs_new_protected:Npn \quark_new:N #1 { \tl_const:Nn #1 {#1} } \quark_new:N \q_nil @@ -4657,20 +4658,20 @@ } \cs_new:Npn \quark_if_recursion_tail_stop:n #1 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN \use_none_delimit_by_q_recursion_stop:w - \fi: + \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 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN \use_i_delimit_by_q_recursion_stop:nw - \else: - \exp_after:wN \use_none:n - \fi: + \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 @@ -4681,10 +4682,10 @@ } \cs_new:Npn \__quark_if_recursion_tail_break:nN #1#2 { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_recursion_tail } { \exp_not:n {#1} } = \c_zero - \exp_after:wN #2 - \fi: + \tl_if_empty:oTF + { \__quark_if_recursion_tail:w {} #1 {} ?! \q_recursion_tail ??! } + {#2} + { } } \prg_new_conditional:Nnn \quark_if_nil:N { p, T , F , TF } { @@ -4708,22 +4709,16 @@ \cs_generate_variant:Nn \quark_if_no_value:NTF { c } \prg_new_conditional:Nnn \quark_if_nil:n { p, T , F , TF } { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_nil } { \exp_not:n {#1} } = \c_zero - \prg_return_true: - \else: - \prg_return_false: - \fi: + \__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:Nnn \quark_if_no_value:n { p, T , F , TF } { - \if_int_compare:w \__str_if_eq_x:nn - { \exp_not:N \q_no_value } { \exp_not:n {#1} } = \c_zero - \prg_return_true: - \else: - \prg_return_false: - \fi: + \__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 } \cs_generate_variant:Nn \quark_if_nil_p:n { V , o } \cs_generate_variant:Nn \quark_if_nil:nTF { V , o } \cs_generate_variant:Nn \quark_if_nil:nT { V , o } @@ -4782,7 +4777,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3prg.dtx 4728 2014-05-04 13:25:37Z joseph $ +\GetIdInfo$Id: l3prg.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Control structures} %% \tex_let:D \if_bool:N \tex_ifodd:D @@ -4889,8 +4884,10 @@ \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_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} @@ -4953,8 +4950,10 @@ \cs_new_nopar:cpn { __bool_S_1:w } { \group_align_safe_end: \c_true_bool } \cs_new_nopar:cpn { __bool_&_1:w } & { \__bool_get_next:NN \use_i:nn } \cs_new_nopar:cpn { __bool_|_0:w } | { \__bool_get_next:NN \use_i:nn } -\cs_new_nopar:cpn { __bool_&_0:w } & { \__bool_eval_skip_to_end_auxi:Nw \c_false_bool } -\cs_new_nopar:cpn { __bool_|_1:w } | { \__bool_eval_skip_to_end_auxi:Nw \c_true_bool } +\cs_new_nopar:cpn { __bool_&_0:w } & + { \__bool_eval_skip_to_end_auxi:Nw \c_false_bool } +\cs_new_nopar:cpn { __bool_|_1:w } | + { \__bool_eval_skip_to_end_auxi:Nw \c_true_bool } %% ( \cs_new:Npn \__bool_eval_skip_to_end_auxi:Nw #1#2 ) { @@ -5029,9 +5028,12 @@ \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_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 @@ -5142,7 +5144,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3clist.dtx 5237 2014-07-19 15:09:54Z bruno $ +\GetIdInfo$Id: l3clist.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Comma separated lists} \cs_new_eq:NN \c_empty_clist \c_empty_tl \tl_new:N \l__clist_internal_clist @@ -5211,8 +5213,10 @@ } \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 } +\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} @@ -5422,8 +5426,10 @@ { #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_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 @@ -5583,7 +5589,10 @@ \q_stop { } } } - { \__msg_kernel_expandable_error:nnn { kernel } { bad-variable } {#1} } + { + \__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 } } @@ -5702,14 +5711,14 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3token.dtx 4889 2014-05-26 19:59:25Z joseph $ +\GetIdInfo$Id: l3token.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental token manipulation} \cs_new_protected:Npn \char_set_catcode:nn #1#2 { \tex_catcode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_catcode:n #1 { \tex_the:D \tex_catcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_catcode:n #1 - { \tex_showthe:D \tex_catcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_catcode:n {#1} } } \cs_new_protected:Npn \char_set_catcode_escape:N #1 { \char_set_catcode:nn { `#1 } \c_zero } \cs_new_protected:Npn \char_set_catcode_group_begin:N #1 @@ -5779,25 +5788,25 @@ \cs_new:Npn \char_value_mathcode:n #1 { \tex_the:D \tex_mathcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_mathcode:n #1 - { \tex_showthe:D \tex_mathcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_mathcode:n {#1} } } \cs_new_protected:Npn \char_set_lccode:nn #1#2 { \tex_lccode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_lccode:n #1 { \tex_the:D \tex_lccode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_lccode:n #1 - { \tex_showthe:D \tex_lccode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_lccode:n {#1} } } \cs_new_protected:Npn \char_set_uccode:nn #1#2 { \tex_uccode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_uccode:n #1 { \tex_the:D \tex_uccode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_uccode:n #1 - { \tex_showthe:D \tex_uccode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_uccode:n {#1} } } \cs_new_protected:Npn \char_set_sfcode:nn #1#2 { \tex_sfcode:D #1 = \__int_eval:w #2 \__int_eval_end: } \cs_new:Npn \char_value_sfcode:n #1 { \tex_the:D \tex_sfcode:D \__int_eval:w #1\__int_eval_end: } \cs_new_protected:Npn \char_show_value_sfcode:n #1 - { \tex_showthe:D \tex_sfcode:D \__int_eval:w #1 \__int_eval_end: } + { \int_show:n { \char_value_sfcode:n {#1} } } \cs_new_protected:Npn \token_new:Nn #1#2 { \cs_new_eq:NN #1 #2 } \cs_new_eq:NN \c_group_begin_token { \cs_new_eq:NN \c_group_end_token } @@ -5866,7 +5875,8 @@ \prg_return_true: \else: \prg_return_false: \fi: } \group_end: -\prg_new_conditional:Npnn \token_if_math_superscript:N #1 { p , T , F , TF } +\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: @@ -5981,7 +5991,7 @@ { \token_to_str:N \mathchar } } \cs_new:Npn \__token_if_chardef:w #1 CHAR" #2 \q_stop { #1 CHAR } - \prg_new_conditional:Npnn \token_if_dim_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_dim_register:N #1 { p , T , F , TF } { \if_meaning:w \tex_dimen:D #1 \prg_return_false: @@ -5999,7 +6009,7 @@ \fi: } \cs_new:Npn \__token_if_dim_register:w #1 ZIMEX #2 \q_stop { #1 ~ } - \prg_new_conditional:Npnn \token_if_int_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_int_register:N #1 { p , T , F , TF } { % \token_if_chardef:NTF #1 { \prg_return_true: } % { @@ -6023,7 +6033,8 @@ % } } \cs_new:Npn \__token_if_int_register:w #1 COUXY #2 \q_stop { #1 ~ } - \prg_new_conditional:Npnn \token_if_muskip_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_muskip_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_muskip:D #1 \prg_return_false: @@ -6041,7 +6052,8 @@ \fi: } \cs_new:Npn \__token_if_muskip_register:w #1 MUSKIP #2 \q_stop { #1 ~ } - \prg_new_conditional:Npnn \token_if_skip_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_skip_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_skip:D #1 \prg_return_false: @@ -6059,7 +6071,8 @@ \fi: } \cs_new:Npn \__token_if_skip_register:w #1 SKIP #2 \q_stop { #1 ~ } - \prg_new_conditional:Npnn \token_if_toks_register:N #1 { p , T , F , TF } + \prg_new_conditional:Npnn \token_if_toks_register:N #1 + { p , T , F , TF } { \if_meaning:w \tex_toks:D #1 \prg_return_false: @@ -6406,7 +6419,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3prop.dtx 5215 2014-07-17 13:23:20Z joseph $ +\GetIdInfo$Id: l3prop.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Property lists} \__scan_new:N \s__prop \cs_new:Npn \__prop_pair:wn #1 \s__prop #2 @@ -6577,8 +6590,10 @@ } \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_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 @@ -6708,7 +6723,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3msg.dtx 4943 2014-05-30 17:26:32Z bruno $ +\GetIdInfo$Id: l3msg.dtx 5358 2014-08-24 09:19:52Z bruno $ {L3 Messages} \tl_new:N \l__msg_internal_tl \tl_const:Nn \c__msg_text_prefix_tl { msg~text~>~ } @@ -6827,6 +6842,7 @@ |............................................... } } + \group_begin: \char_set_lccode:nn {`\{} {`\ } \char_set_lccode:nn {`\}} {`\ } @@ -6844,19 +6860,25 @@ \iow_newline: ! } - \group_begin: - \cs_set_protected_nopar:Npn & - { - \tex_errmessage:D - { - #1 - \use_none:n - { ............................................ } - } - } - \exp_after:wN - \group_end: - & + \__iow_with:Nnn \tex_newlinechar:D { `\^^J } + { + \__iow_with:Nnn \tex_errorcontextlines:D \c_minus_one + { + \group_begin: + \cs_set_protected_nopar:Npn & + { + \tex_errmessage:D + { + #1 + \use_none:n + { ............................................ } + } + } + \exp_after:wN + \group_end: + & + } + } } } \cs_new_protected:Npn \msg_log:n #1 @@ -6886,7 +6908,8 @@ \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 _code:nnnnnn } + ##1##2##3##4##5##6 {#2} \cs_new_protected:cpn { msg_ #1 :nnnnnn } ##1##2##3##4##5##6 { \use:x @@ -7102,7 +7125,8 @@ \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 } + \__msg_kernel_warning:nnxxxx + { kernel } { message-redirect-loop } { \seq_item:Nn \l__msg_class_loop_seq { \c_one } } { \seq_item:Nn \l__msg_class_loop_seq { \c_two } } {#3} @@ -7432,8 +7456,14 @@ \tl_if_empty:nTF {#1} { \tl_clear:N \l__msg_internal_tl } { \tl_set:Nf \l__msg_internal_tl { \__msg_show_variable_aux:w #1 } } - \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN - { \exp_after:wN \l__msg_internal_tl } + \__iow_with:Nnn \tex_newlinechar:D { 10 } + { + \__iow_with:Nnn \tex_errorcontextlines:D \c_minus_one + { + \etex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN + { \exp_after:wN \l__msg_internal_tl } + } + } } \cs_new:Npn \__msg_show_variable_aux:w #1 > { } \cs_new:Npn \__msg_show_item:n #1 @@ -7482,7 +7512,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3file.dtx 5188 2014-07-09 12:02:22Z will $ +\GetIdInfo$Id: l3file.dtx 5369 2014-08-24 22:41:47Z bruno $ {L3 File and I/O operations} \tl_new:N \g_file_current_name_tl \tl_gset_eq:NN \g_file_current_name_tl \@currname @@ -7520,7 +7550,8 @@ } } { - \__msg_kernel_error:nnx { kernel } { unbalanced-quote-in-filename } + \__msg_kernel_error:nnx + { kernel } { unbalanced-quote-in-filename } { \l__file_internal_name_tl } } \use:x @@ -7531,7 +7562,7 @@ } \cs_new:Npn \__file_name_sanitize_aux:n #1 { - \str_if_eq:nnT {#1} { " } + \token_if_eq_charcode:NNT #1 " { + \c_one } } \cs_new_protected:Npn \file_add_path:nN #1 @@ -7549,7 +7580,8 @@ \tl_set:Nn #2 { \q_no_value } \cs_if_exist:NT \input@path { - \seq_set_eq:NN \l__file_saved_search_path_seq \l__file_search_path_seq + \seq_set_eq:NN \l__file_saved_search_path_seq + \l__file_search_path_seq \seq_set_split:NnV \l__file_internal_seq { , } \input@path \seq_concat:NNN \l__file_search_path_seq \l__file_search_path_seq \l__file_internal_seq @@ -7564,7 +7596,10 @@ } } \cs_if_exist:NT \input@path - { \seq_set_eq:NN \l__file_search_path_seq \l__file_saved_search_path_seq } + { + \seq_set_eq:NN \l__file_search_path_seq + \l__file_saved_search_path_seq + } } \prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF } { @@ -7643,7 +7678,17 @@ \seq_new:N \g__ior_streams_seq \tl_new:N \l__ior_stream_tl \prop_new:N \g__ior_streams_prop -\prop_gput:Nnn \g__ior_streams_prop { 0 } { LaTeX2e~reserved } +\int_step_inline:nnnn + { \c_zero } + { \c_one } + { + \cs_if_exist:NTF \normalend + { \tex_count:D 38 \scan_stop: } + { \tex_count:D 16 \scan_stop: - \c_one } + } + { + \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 } \cs_new_protected:Npn \ior_open:Nn #1#2 @@ -7745,9 +7790,17 @@ \seq_new:N \g__iow_streams_seq \tl_new:N \l__iow_stream_tl \prop_new:N \g__iow_streams_prop -\prop_put:Nnn \g__iow_streams_prop { 0 } { LaTeX2e~reserved } -\prop_put:Nnn \g__iow_streams_prop { 1 } { LaTeX2e~reserved } -\prop_put:Nnn \g__iow_streams_prop { 2 } { LaTeX2e~reserved } +\int_step_inline:nnnn + { \c_zero } + { \c_one } + { + \cs_if_exist:NTF \normalend + { \tex_count:D 39 \scan_stop: } + { \tex_count:D 17 \scan_stop: - \c_one } + } + { + \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 } \cs_new_protected:Npn \iow_open:Nn #1#2 @@ -7792,8 +7845,23 @@ \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 - { \tex_immediate:D \tex_write:D #1 { \exp_not:n {#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_nopar:Npn \iow_log:x { \iow_now:Nx \c_log_iow } \cs_new_protected_nopar:Npn \iow_log:n { \iow_now:Nn \c_log_iow } @@ -7964,7 +8032,8 @@ { \__int_value:w \__int_eval:w \exp_after:wN \__str_count_loop:NNNNNNNNN \tl_to_str:n {#1} - { X8 } { X7 } { X6 } { X5 } { X4 } { X3 } { X2 } { X1 } { X0 } \q_stop + { X8 } { X7 } { X6 } { X5 } { X4 } { X3 } { X2 } { X1 } { X0 } + \q_stop \__int_eval_end: } \cs_new:Npn \__str_count_loop:NNNNNNNNN #1#2#3#4#5#6#7#8#9 @@ -8034,7 +8103,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3skip.dtx 5211 2014-07-17 07:22:35Z joseph $ +\GetIdInfo$Id: l3skip.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Dimensions and skips} \cs_new_eq:NN \if_dim:w \tex_ifdim:D \cs_new_eq:NN \__dim_eval:w \etex_dimexpr:D @@ -8061,8 +8130,10 @@ { \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 } +\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_new_protected:Npn \dim_set:Nn #1#2 { #1 ~ \__dim_eval:w #2 \__dim_eval_end: } \cs_new_protected:Npn \dim_gset:Nn { \tex_global:D \dim_set:Nn } @@ -8306,8 +8377,10 @@ { \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 } +\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_new_protected:Npn \skip_set:Nn #1#2 { #1 ~ \etex_glueexpr:D #2 \scan_stop: } \cs_new_protected:Npn \skip_gset:Nn { \tex_global:D \skip_set:Nn } @@ -8395,8 +8468,10 @@ { \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 } +\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_new_protected:Npn \muskip_set:Nn #1#2 { #1 ~ \etex_muexpr:D #2 \scan_stop: } \cs_new_protected:Npn \muskip_gset:Nn { \tex_global:D \muskip_set:Nn } @@ -8467,7 +8542,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3keys.dtx 5121 2014-06-12 17:37:56Z joseph $ +\GetIdInfo$Id: l3keys.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Key-value interfaces} \int_new:N \g__keyval_level_int \tl_new:N \l__keyval_key_tl @@ -8512,7 +8587,11 @@ \tl_put_right:Nx \l__keyval_parse_tl { \exp_not:c - { __keyval_key_no_value_elt_ \int_use:N \g__keyval_level_int :n } + { + __keyval_key_no_value_elt_ + \int_use:N \g__keyval_level_int + :n + } { \exp_not:o \l__keyval_key_tl } } } @@ -8685,9 +8764,11 @@ { \__keys_choice_make:N \__keys_multichoice_find:n } \cs_new_protected_nopar:Npn \__keys_choice_make:N #1 { - \prop_if_exist:cTF { \c__keys_info_root_tl \__keys_parent:o \l_keys_path_tl } + \prop_if_exist:cTF + { \c__keys_info_root_tl \__keys_parent:o \l_keys_path_tl } { - \prop_get:cnNTF { \c__keys_info_root_tl \__keys_parent:o \l_keys_path_tl } + \prop_get:cnNTF + { \c__keys_info_root_tl \__keys_parent:o \l_keys_path_tl } { choice } \l_keys_value_tl { \__msg_kernel_error:nnxx { kernel } { nested-choice-key } @@ -8748,7 +8829,10 @@ \cs_new_protected:Npn \__keys_default_set:n #1 { \prop_if_exist:cT { \c__keys_info_root_tl \l_keys_path_tl } - { \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } { default } {#1} } + { + \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } + { default } {#1} + } } \cs_new_protected:Npn \__keys_groups_set:n #1 { @@ -8766,7 +8850,10 @@ \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} } + { + \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} } } @@ -8774,16 +8861,23 @@ { \prop_if_exist:cT { \c__keys_info_root_tl \l_keys_path_tl } { - \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } { required } - \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } { forbidden } - \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } {#1} { true } + \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } + { required } + \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } + { forbidden } + \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } + {#1} { true } } } \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} } } + { + \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 @@ -9116,7 +9210,8 @@ { \prg_return_true: } { \prg_return_false: } } -\prg_new_conditional:Npnn \keys_if_choice_exist:nnn #1#2#3 { p , T , F , TF } +\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 #1 / #2 / #3 } { \prg_return_true: } @@ -9136,7 +9231,8 @@ \__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. + 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'. } @@ -9269,7 +9365,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3fp.dtx 5223 2014-07-18 01:54:05Z bruno $ +\GetIdInfo$Id: l3fp.dtx 5336 2014-08-22 10:26:35Z bruno $ {L3 Floating points} %% File: l3fp-aux.dtx Copyright(C) 2011-2014 The LaTeX3 Project %% @@ -9333,8 +9429,10 @@ \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_max_exponent_int { 10000 } -\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_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_min_fp:N #1 { \s__fp \__fp_chk:w 1 #1 @@ -9360,9 +9458,10 @@ { \__int_eval:w \c_two - #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 \c_one \else: - \if_int_compare:w #2 < - \c__fp_max_exponent_int \c_two \else: - \if_meaning:w 1 #1 \c_three \else: \c_zero \fi: \fi: \fi: + \if_case:w + \if_int_compare:w #2 > \c__fp_max_exponent_int \c_one \else: + \if_int_compare:w #2 < - \c__fp_max_exponent_int \c_two \else: + \if_meaning:w 1 #1 \c_three \else: \c_zero \fi: \fi: \fi: \or: \exp_after:wN \__fp_overflow:w \or: \exp_after:wN \__fp_underflow:w \or: \exp_after:wN \__fp_sanitize_zero:w @@ -9370,7 +9469,8 @@ \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_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 @@ -9475,22 +9575,22 @@ \__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 } +\__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 @@ -9639,7 +9739,10 @@ \__msg_kernel_error:nnxx { kernel } { unknown-fpu-trap-type } {#1} {#2} } - { \__msg_kernel_error:nnx { kernel } { unknown-fpu-exception } {#1} } + { + \__msg_kernel_error:nnx + { kernel } { unknown-fpu-exception } {#1} + } } } \cs_new_protected_nopar:Npn \__fp_trap_invalid_operation_set_error: @@ -9751,7 +9854,10 @@ { \__msg_kernel_expandable_error:nnnnn { kernel } { fp - #1 } } \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~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 @@ -11499,7 +11605,8 @@ \exp_after:wN #1 \fi: } -\cs_new:Npn \__fp_ternary_loop_break:w #1 \fi: #2 \__fp_ternary_break_point:n #3 +\cs_new:Npn \__fp_ternary_loop_break:w + #1 \fi: #2 \__fp_ternary_break_point:n #3 { \c_zero = \c_zero \fi: \exp_after:wN \__fp_ternary_auxii:NwwN @@ -11934,11 +12041,11 @@ \exp_after:wN \__fp_mul_significand_keep:NNNNNw \int_use:N \__int_eval:w 99990000 + #1*#8 + #2*#7 + #3*#6 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 + + \int_use:N \__int_eval:w 99990000 + #1*#9 + #2*#8 + #3*#7 + #4*#6 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 + + \int_use:N \__int_eval:w 99990000 + #2*#9 + #3*#8 + #4*#7 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw - \int_use:N \__int_eval:w 99990000 + #3*#9 + #4*#8 + + \int_use:N \__int_eval:w 99990000 + #3*#9 + #4*#8 + \exp_after:wN \__fp_mul_significand_drop:NNNNNw \int_use:N \__int_eval:w 100000000 + #4*#9 ; ; \exp_after:wN ; @@ -13293,7 +13400,8 @@ { \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 +\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 @@ -13312,7 +13420,8 @@ \fi: \s__fp \__fp_chk:w #3#4 } -\cs_new:Npn \__fp_pow_normal:ww \s__fp \__fp_chk:w 1 #1#2#3; \s__fp \__fp_chk:w #4#5 +\cs_new:Npn \__fp_pow_normal: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} } = \c_zero @@ -13372,7 +13481,7 @@ \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 \__fp_pow_exponent:Nwnnnnnw % -(|n|\ln(10) + (-\ln(x))) \exp_after:wN - \fi: #2; #1; @@ -13955,7 +14064,7 @@ \exp_after:wN \__fp_sin_series_aux_o:NNnwww \exp_after:wN #1 \__int_value:w - \if_int_odd:w \__int_eval:w ( #3 + \c_two ) / \c_four \__int_eval_end: + \if_int_odd:w \__int_eval:w (#3 + \c_two) / \c_four \__int_eval_end: #2 \else: \if_meaning:w #2 0 2 \else: 0 \fi: @@ -13971,28 +14080,28 @@ \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_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_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; } { @@ -14025,12 +14134,12 @@ \__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}; + \__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 - \c_one) / \c_two \__int_eval_end: @@ -14722,7 +14831,7 @@ %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- -\GetIdInfo$Id: l3box.dtx 4974 2014-05-31 18:28:43Z mittelba $ +\GetIdInfo$Id: l3box.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental boxes} \cs_new_protected:Npn \box_new:N #1 { @@ -14754,8 +14863,10 @@ { \tex_global:D \box_set_eq_clear:NN } \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 } +\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 @@ -14851,7 +14962,8 @@ \group_end: } \cs_new_protected:Npn \hbox:n { \tex_hbox:D \scan_stop: } -\cs_new_protected:Npn \hbox_set:Nn #1#2 { \tex_setbox:D #1 \tex_hbox:D {#2} } +\cs_new_protected:Npn \hbox_set:Nn #1#2 + { \tex_setbox:D #1 \tex_hbox:D {#2} } \cs_new_protected:Npn \hbox_gset:Nn { \tex_global:D \hbox_set:Nn } \cs_generate_variant:Nn \hbox_set:Nn { c } \cs_generate_variant:Nn \hbox_gset:Nn { c } @@ -14904,7 +15016,10 @@ \cs_generate_variant:Nn \vbox_set_top:Nn { c } \cs_generate_variant:Nn \vbox_gset_top:Nn { c } \cs_new_protected:Npn \vbox_set_to_ht:Nnn #1#2#3 - { \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end: { #3 \par } } + { + \tex_setbox:D #1 \tex_vbox:D to \__dim_eval:w #2 \__dim_eval_end: + { #3 \par } + } \cs_new_protected:Npn \vbox_gset_to_ht:Nnn { \tex_global:D \vbox_set_to_ht:Nnn } \cs_generate_variant:Nn \vbox_set_to_ht:Nnn { c } @@ -14966,7 +15081,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3coffins.dtx 4899 2014-05-28 20:13:51Z joseph $ +\GetIdInfo$Id: l3coffins.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Coffin code layer} \box_new:N \l__coffin_internal_box \dim_new:N \l__coffin_internal_dim @@ -15079,7 +15194,10 @@ \__coffin_set_pole:Nnx #1 { T } { { 0 pt } - { \dim_eval:n { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } } + { + \dim_eval:n + { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } + } { 1000 pt } { 0 pt } } @@ -15125,7 +15243,8 @@ { { 0 pt } { - \dim_eval:n { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } + \dim_eval:n + { \box_ht:N #1 - \box_ht:N \l__coffin_internal_box } } { 1000 pt } { 0 pt } @@ -15353,7 +15472,8 @@ } } } -\cs_new_protected:Npn \__coffin_calculate_intersection_aux:nnnnnN #1#2#3#4#5#6 +\cs_new_protected:Npn \__coffin_calculate_intersection_aux:nnnnnN + #1#2#3#4#5#6 { \dim_set:Nn #6 { @@ -15382,7 +15502,7 @@ } \__coffin_reset_structure:N \l__coffin_aligned_coffin \prop_clear:c - { l__coffin_corners_ \__int_value:w \l__coffin_aligned_coffin _ prop } + { 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 { @@ -15791,7 +15911,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3color.dtx 4712 2014-04-30 08:17:49Z joseph $ +\GetIdInfo$Id: l3color.dtx 5354 2014-08-23 01:35:39Z bruno $ {L3 Experimental color support} \cs_new_eq:NN \color_group_begin: \group_begin: \cs_new_protected_nopar:Npn \color_group_end: @@ -15809,7 +15929,10 @@ } { \cs_if_exist:NT \set@color - { \cs_set_protected_nopar:Npn \color_ensure_current: { \set@color } } + { + \cs_set_protected_nopar:Npn \color_ensure_current: + { \set@color } + } } } %% File: l3candidates.dtx Copyright(C) 2012-2014 The LaTeX3 Project @@ -15845,8 +15968,36 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3candidates.dtx 5232 2014-07-18 19:32:54Z joseph $ +\GetIdInfo$Id: l3candidates.dtx 5366 2014-08-24 21:35:03Z bruno $ {L3 Experimental additions to l3kernel} +\group_begin: + \tex_lccode:D `? = `: \scan_stop: + \tex_catcode:D `? = 12 \scan_stop: +\tex_lowercase:D + { + \group_end: + \cs_new_protected:Npn \cs_log:N #1 + { + \__msg_log_wrap:n + { + > ~ \token_to_str:N #1 = + \exp_after:wN \__cs_show:www \cs_meaning:N #1 + \use_none:nn ? \prg_do_nothing: + } + } + } +\cs_new_protected_nopar:Npn \cs_log:c + { \group_begin: \exp_args:NNc \group_end: \cs_log:N } +\cs_new_protected:Npn \__kernel_register_log:N #1 + { + \cs_if_exist:NTF #1 + { \__msg_log_value:x { \token_to_str:N #1 = \tex_the:D #1 } } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \__kernel_register_log:N { c } \fp_new:N \l__box_angle_fp \fp_new:N \l__box_cos_fp \fp_new:N \l__box_sin_fp @@ -16162,7 +16313,10 @@ \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_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) } } @@ -16202,7 +16356,10 @@ \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_move_up:nn \c_zero_dim + { \box_use:N \l__box_internal_box } + } \box_set_ht:Nn \l__box_internal_box { #5 @@ -16221,6 +16378,17 @@ \box_set_eq:NN #1 \l__box_internal_box } \cs_generate_variant:Nn \box_viewport:Nnnnn { c } +\cs_new_protected:Npn \clist_log:N #1 + { + \__msg_log_variable:Nnn #1 { clist } + { \clist_map_function:NN #1 \__msg_show_item:n } + } +\cs_new_protected:Npn \clist_log:n #1 + { + \clist_set:Nn \l__clist_internal_clist {#1} + \clist_log:N \l__clist_internal_clist + } +\cs_generate_variant:Nn \clist_log:N { c } \fp_new:N \l__coffin_sin_fp \fp_new:N \l__coffin_cos_fp \prop_new:N \l__coffin_bounding_prop @@ -16450,6 +16618,19 @@ {#5} {#6} } } +\cs_new_protected:Npn \coffin_log_structure:N #1 + { + \__coffin_if_exist:NT #1 + { + \__msg_log_variable:Nnn #1 { coffins } + { + \prop_map_function:cN + { l__coffin_poles_ \__int_value:w #1 _prop } + \__msg_show_item_unbraced:nn + } + } + } +\cs_generate_variant:Nn \coffin_log_structure:N { c } \cs_new_protected:Npn \file_if_exist_input:n #1 { \file_if_exist:nT {#1} @@ -16507,6 +16688,85 @@ } } \tl_new:N \l__ior_internal_tl +\cs_new_protected_nopar:Npn \ior_log_streams: + { \__ior_log_streams:Nn \g__ior_streams_prop { input } } +\cs_new_protected:Npn \__ior_log_streams:Nn #1#2 + { + \__msg_log:nnn { LaTeX / kernel } + { \prop_if_empty:NTF #1 { show-no-stream } { show-open-streams } } + {#2} + \__msg_log_wrap:n + { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn } + } +\cs_new_protected_nopar:Npn \iow_log_streams: + { \__iow_log_streams:Nn \g__iow_streams_prop { output } } +\cs_new_protected:Npn \__iow_log_streams:Nn #1#2 + { + \__msg_log:nnn { LaTeX / kernel } + { \prop_if_empty:NTF #1 { show-no-stream } { show-open-streams } } + {#2} + \__msg_log_wrap:n + { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn } + } +\cs_new_protected:Npn \fp_log:N #1 + { + \fp_if_exist:NTF #1 + { \__msg_log_value:x { \token_to_str:N #1 = \fp_to_tl:N #1 } } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \fp_log:n #1 + { \__msg_log_value:x { \fp_to_tl:n {#1} } } +\cs_generate_variant:Nn \fp_log:N { c } +\cs_new_eq:NN \int_log:N \__kernel_register_log:N +\cs_new_eq:NN \int_log:c \__kernel_register_log:c +\cs_new_protected:Npn \int_log:n #1 + { \__msg_log_value:x { \int_eval:n {#1} } } +\cs_new_protected:Npn \keys_log:nn #1#2 + { \cs_log:c { \c__keys_code_root_tl #1 / \tl_to_str:n {#2} } } +\cs_new_protected:Npn \__msg_log:nnn #1#2#3 + { + \iow_wrap:nnnN + { \use:c { \c__msg_text_prefix_tl #1 / #2 } {#3} { } { } { } } + { } { } \iow_log:n + } +\cs_new_protected:Npn \__msg_log_variable:Nnn #1#2#3 + { + \cs_if_exist:NTF #1 + { + \__msg_log:nnn { LaTeX / kernel } { show- #2 } {#1} + \__msg_log_wrap:n {#3} + } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \__msg_log_wrap:n #1 + { \iow_wrap:nnnN { #1 . } { } { } \__msg_log:n } +\cs_new_protected:Npn \__msg_log:n #1 + { \iow_log:x { \tl_if_single:nT {#1} { > ~ } #1 } } +\cs_new_protected:Npn \__msg_log_value:n #1 + { \iow_log:n { >~ #1 . } } +\cs_generate_variant:Nn \__msg_log_value:n { x } +\cs_new_protected:Npn \bool_log:N #1 + { + \bool_if_exist:NTF #1 + { + \__msg_log_value:x + { \token_to_str:N #1 = \__bool_to_word:n {#1} } + } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_new_protected:Npn \bool_log:n #1 + { \__msg_log_value:x { \__bool_to_word:n {#1} } } +\cs_new:Npn \__bool_to_word:n #1 { \bool_if:nTF {#1} { true } { false } } +\cs_generate_variant:Nn \bool_log:N { c } \cs_new:Npn \prop_map_tokens:Nn #1#2 { \exp_last_unbraced:Nno \__prop_map_tokens:nwwn {#2} #1 @@ -16522,6 +16782,12 @@ \__prop_map_tokens:nwwn {#1} } \cs_generate_variant:Nn \prop_map_tokens:Nn { c } +\cs_new_protected:Npn \prop_log:N #1 + { + \__msg_log_variable:Nnn #1 { prop } + { \prop_map_function:NN #1 \__msg_show_item:nn } + } +\cs_generate_variant:Nn \prop_log: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 @@ -16565,6 +16831,12 @@ #1 #2 { #3 } \__seq_pop_item_def: } +\cs_new_protected:Npn \seq_log:N #1 + { + \__msg_log_variable:Nnn #1 { seq } + { \seq_map_function:NN #1 \__msg_show_item:n } + } +\cs_generate_variant:Nn \seq_log:N { c } \cs_new:Npn \skip_split_finite_else_action:nnNN #1#2#3#4 { \skip_if_finite:nTF {#1} @@ -16578,11 +16850,27 @@ #2 } } +\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 #1 + { \__msg_log_value:x { \dim_eval:n {#1} } } +\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 #1 + { \__msg_log_value:x { \skip_eval:n {#1} } } +\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 #1 + { \__msg_log_value:x { \muskip_eval:n {#1} } } \prg_new_conditional:Npnn \tl_if_single_token:n #1 { p , T , F , TF } { \tl_if_head_is_N_type:nTF {#1} - { \__str_if_eq_x_return:nn { \exp_not:o { \use_none:n #1 } } { } } - { \__str_if_eq_x_return:nn { \exp_not:n {#1} } { ~ } } + { \__tl_if_empty_return:o { \use_none:n #1 } } + { + \tl_if_empty:nTF {#1} + { \prg_return_false: } + { \__tl_if_empty_return:o { \tex_romannumeral:D -`0 #1 } } + } } \cs_new:Npn \tl_reverse_tokens:n #1 { @@ -16669,7 +16957,10 @@ \cs_new:Npn \__tl_act_case_group:nn #1 #2 { \exp_after:wN \__tl_act_output:n \exp_after:wN - { \exp_after:wN { \tex_romannumeral:D \__tl_act_case_aux:nn {#1} {#2} } } + { + \exp_after:wN + { \tex_romannumeral:D \__tl_act_case_aux:nn {#1} {#2} } + } } \cs_new_protected_nopar:Npn \tl_set_from_file:Nnn { \__tl_set_from_file:NNnn \tl_set:Nn } @@ -16770,7 +17061,7 @@ \cs_new:Npn \__tl_change_case_char:NNNNNNNNn #1#2#3#4#5#6#7#8#9 { \exp_args:NNv \str_case:nnF #8 - { c__tl_ #9 _ #6 _ #7 _tl } + { c__tl_ #9 _ #6 _X_ #7 _tl } { \exp_not:N #8 } } \cs_new:Npn \__tl_change_case_lower_sigma:Nnn #1#2 @@ -16836,12 +17127,14 @@ #1 {#2} { \exp_after:wN \__tl_mixed_case_skip:Nwn \exp_after:wN #1 - \c__tl_mixed_skip_clist , \q_recursion_tail , \q_recursion_stop + \c__tl_mixed_skip_clist , \q_recursion_tail , + \q_recursion_stop { \exp_args:NNV \str_case:nnF #1 \c__tl_mixed_exceptions_tl { \exp_after:wN \__tl_change_case_char:NNNNNNNNn - \int_use:N \__int_eval:w 1000000 + `#1 \__int_eval_end: + \int_use:N + \__int_eval:w 1000000 + `#1 \__int_eval_end: #1 { upper } } } @@ -16991,6 +17284,18 @@ \use_i:nn } } +\cs_new_protected:Npn \tl_log:N #1 + { + \tl_if_exist:NTF #1 + { \cs_log:N #1 } + { + \__msg_kernel_error:nnx { kernel } { variable-not-defined } + { \token_to_str:N #1 } + } + } +\cs_generate_variant:Nn \tl_log:N { c } +\cs_new_protected:Npn \tl_log:n #1 + { \__msg_log_wrap:n { > ~ \tl_to_str:n {#1} } } \group_begin: \char_set_catcode_active:N \^^@ \cs_set:Npn \char_tmp:NN #1#2 @@ -17049,9 +17354,9 @@ \cs_new_protected_nopar:Npn \peek_N_type:TF { \__peek_token_generic:NNTF \__peek_execute_branches_N_type: \scan_stop: } \cs_new_protected_nopar:Npn \peek_N_type:T - { \__peek_token_generic:NNT \__peek_execute_branches_N_type: \scan_stop: } + { \__peek_token_generic:NNT \__peek_execute_branches_N_type: \scan_stop: } \cs_new_protected_nopar:Npn \peek_N_type:F - { \__peek_token_generic:NNF \__peek_execute_branches_N_type: \scan_stop: } + { \__peek_token_generic:NNF \__peek_execute_branches_N_type: \scan_stop: } \cs_new_protected:Npn \fp_set_from_dim:Nn #1#2 { \fp_set:Nn #1 { \dim_to_fp:n {#2} } } \cs_new_protected:Npn \fp_gset_from_dim:Nn #1#2 diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index db6ef6f3371..237dea6613b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -47,8 +47,8 @@ %% ----------------------------------------------------------------------- \def\ExplFileName{expl3} \def\ExplFileDescription{L3 programming layer} -\def\ExplFileDate{2014/07/20} -\def\ExplFileVersion{5241} +\def\ExplFileDate{2014/08/25} +\def\ExplFileVersion{5378} \let\ExplLoaderFileVersion\ExplFileVersion \begingroup \def\tempa{LaTeX2e} @@ -57,7 +57,7 @@ \def\next {% \PackageInfo{expl3}{Switching from generic to LaTeX2e loader} - \endinput \RequirePackage{expl3} + \RequirePackage{expl3} \relax \endinput } \fi \expandafter\endgroup diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index e1b4fd7100f..cce7edf339b 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -47,8 +47,8 @@ %% ----------------------------------------------------------------------- \def\ExplFileName{expl3} \def\ExplFileDescription{L3 programming layer} -\def\ExplFileDate{2014/07/20} -\def\ExplFileVersion{5241} +\def\ExplFileDate{2014/08/25} +\def\ExplFileVersion{5378} \let\ExplLoaderFileVersion\ExplFileVersion \ProvidesPackage{\ExplFileName} [% @@ -238,7 +238,7 @@ \ProvidesFile {#1} [ #2~v#3~#4 ] } \@onefilewithoptions { l3unicode-data } [ ] [ ] \c__expl_def_ext_tl -\str_if_eq:nVTF { latex2e } \l__expl_driver_tl +\str_if_eq:VnTF \l__expl_driver_tl { latex2e } { \tl_gput_left:Nn \@begindocumenthook { \RequirePackage { graphics } } \__msg_kernel_new:nnnn { box } { clipping-not-available } diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls index 68d8ada8b0f..f4467321a8f 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls +++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls @@ -50,7 +50,7 @@ \let \fileversionOld \ExplFileVersion \let \filedescriptionOld \ExplFileDescription \RequirePackage{expl3,xparse,calc} -\GetIdInfo$Id: l3doc.dtx 5204 2014-07-15 09:56:33Z mittelba $ +\GetIdInfo$Id: l3doc.dtx 5353 2014-08-23 01:23:51Z bruno $ {L3 Experimental documentation class} \ProvidesExplClass {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} @@ -58,62 +58,169 @@ \let \ExplFileDate \filedateOld \let \ExplFileVersion \fileversionOld \let \ExplFileDescription \filedescriptionOld -\coffin_new:N \l__codedoc_output_box +\cs_generate_variant:Nn \tl_count:n { f } +\cs_generate_variant:Nn \tl_greplace_all:Nnn { Nx } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNTF { o } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNT { o } +\cs_generate_variant:Nn \tl_if_head_eq_charcode:nNF { o } +\cs_generate_variant:Nn \tl_if_in:NnTF { No } +\cs_generate_variant:Nn \tl_if_in:NnT { No } +\cs_generate_variant:Nn \tl_if_in:NnF { No } +\cs_generate_variant:Nn \tl_remove_all:Nn { Nx } +\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx , Nnx, No , Nno } +\cs_generate_variant:Nn \tl_replace_once:Nnn { Noo } +\cs_generate_variant:Nn \prop_get:NnNTF { Nx } +\cs_generate_variant:Nn \prop_put:Nnn { Nx } +\cs_generate_variant:Nn \prop_gput:Nnn { NVx } +\cs_new_protected:Npn \__codedoc_replace_at_at:N #1 + { + \tl_if_empty:NF \g__codedoc_module_name_tl + { + \exp_args:NNo \__codedoc_replace_at_at_aux:Nn + #1 \g__codedoc_module_name_tl + } + } +\cs_new_protected:Npn \__codedoc_replace_at_at_aux:Nn #1#2 + { + \tl_replace_all:Non #1 { \token_to_str:N @ } { @ } + \tl_replace_all:Non #1 { \token_to_str:N _ } { _ } + \tl_replace_all:Nnn #1 { _ @ @ } { _ _ #2 } + \tl_replace_all:Nnn #1 { @ @ } { _ _ #2 } + } +\cs_new_protected:Npn \__codedoc_verb_get_seq:nN #1#2 + { + \tl_set:Nx \l__codedoc_tmpa_tl { \tl_to_str:n {#1} } + \tl_remove_all:Nx \l__codedoc_tmpa_tl + { \iow_char:N \^^M \iow_char:N \% } + \tl_remove_all:Nx \l__codedoc_tmpa_tl { \tl_to_str:n { ^ ^ A } } + \tl_remove_all:Nx \l__codedoc_tmpa_tl { \iow_char:N \^^I } + \tl_remove_all:Nx \l__codedoc_tmpa_tl { \iow_char:N \^^M } + \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl + \exp_args:NNx \seq_set_from_clist:Nn #2 + { \tl_to_str:N \l__codedoc_tmpa_tl } + } +\cs_new:Npn \__codedoc_signature_base_form:n #1 + { \__codedoc_signature_base_form_aux:n #1 \c_empty_tl } +\cs_new:Npn \__codedoc_signature_base_form_aux:n #1 + { + \str_case:nnTF {#1} + { + { N } { N } + { c } { N } + { n } { n } + { o } { n } + { f } { n } + { x } { n } + { V } { n } + { v } { n } + } + { \__codedoc_signature_base_form_aux:n } + {#1} + } +\cs_new:Npn \__codedoc_predicate_from_base:N #1 + { + \__cs_get_function_name:N #1 _p: + \__cs_get_function_signature:N #1 + } +\cs_new_protected:Npn \CodedocUseCs #1 { \use:c { \tl_to_str:n {#1} } } +\cs_new:Npn \CodedocUnexpandedTokens #1 # + { \use:c { CodedocUnexpandedTokens ~ } \__codedoc_exp_not:n } +\cs_new_protected:cpn { CodedocUnexpandedTokens ~ } #1#2 {#2} +\cs_new:Npn \__codedoc_exp_not:n #1 { \exp_not:n { \__codedoc_exp_not:n {#1} } } +\clist_new:N \g_docinput_clist +\seq_new:N \g_doc_functions_seq +\seq_new:N \g_doc_macros_seq +\coffin_new:N \l__codedoc_output_coffin \coffin_new:N \l__codedoc_names_coffin \coffin_new:N \l__codedoc_descr_coffin \coffin_new:N \l__codedoc_syntax_coffin \box_new:N \g__codedoc_syntax_box \bool_new:N \l__codedoc_long_name_bool -\bool_new:N \g__codedoc_implementation_bool \dim_new:N \l__codedoc_trial_width_dim -\tl_new:N \l__codedoc_macro_tl -\int_new:N \l__codedoc_macro_int -\int_new:N \g__codedoc_nested_macro_int +\int_new:N \l__codedoc_nested_macro_int +\bool_new:N \l__codedoc_macro_tested_bool \prop_new:N \g__codedoc_missing_tests_prop -\clist_new:N \g_docinput_clist -\tl_new:N \l__codedoc_at_replaced_macro_tl -\seq_new:N \g__codedoc_testfiles_seq -\seq_new:N \g_doc_functions_seq -\seq_new:N \g_doc_macros_seq \seq_new:N \g__codedoc_not_tested_seq -\bool_new:N \l__codedoc_meta_TF_bool -\bool_new:N \l__codedoc_meta_pTF_bool -\bool_new:N \l__codedoc_meta_EXP_bool -\bool_new:N \l__codedoc_meta_rEXP_bool +\seq_new:N \g__codedoc_testfiles_seq \bool_new:N \l__codedoc_macro_internal_bool \bool_new:N \l__codedoc_macro_aux_bool \bool_new:N \l__codedoc_macro_TF_bool \bool_new:N \l__codedoc_macro_pTF_bool +\bool_new:N \l__codedoc_macro_EXP_bool +\bool_new:N \l__codedoc_macro_rEXP_bool \bool_new:N \l__codedoc_macro_var_bool -\bool_new:N \g__codedoc_full_bool \bool_new:N \g__codedoc_lmodern_bool \bool_new:N \g__codedoc_checkfunc_bool \bool_new:N \g__codedoc_checktest_bool -\seq_new:N \g__codedoc_tmpa_seq \tl_new:N \l__codedoc_tmpa_tl \tl_new:N \l__codedoc_tmpb_tl \int_new:N \l__codedoc_tmpa_int -\bool_new:N \l__codedoc_tested_bool -\DeclareOption{a5paper}{\@latexerr{Option not supported}{}} -\DeclareOption{full}{ \bool_set_true:N \g__codedoc_full_bool } -\DeclareOption{onlydoc}{ \bool_set_false:N \g__codedoc_full_bool } -\DeclareOption{check}{ \bool_set_true:N \g__codedoc_checkfunc_bool } -\DeclareOption{nocheck}{ \bool_set_false:N \g__codedoc_checkfunc_bool } -\DeclareOption{checktest}{ \bool_set_true:N \g__codedoc_checktest_bool } -\DeclareOption{nochecktest}{ \bool_set_false:N \g__codedoc_checktest_bool } -\DeclareOption{cm-default}{ \bool_set_false:N \g__codedoc_lmodern_bool } -\DeclareOption{lm-default}{ \bool_set_true:N \g__codedoc_lmodern_bool } -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ExecuteOptions{full,a4paper,nocheck,nochecktest,lm-default} -\msg_new:nnn {l3doc} {input-cfg} - { - Local~config~file~l3doc.cfg~loaded. - } -\file_if_exist:nT {l3doc.cfg} - { - \file_input:n {l3doc.cfg} - \msg_info:nn {l3doc} {input-cfg} - } +\prop_new:N \l__codedoc_functions_block_prop +\seq_new:N \l__codedoc_function_input_seq +\seq_new:N \l__codedoc_macro_input_seq +\tl_const:Nx \c__codedoc_backslash_tl { \iow_char:N \\ } +\exp_last_unbraced:NNo + \cs_new_eq:NN \c__codedoc_backslash_token { \c__codedoc_backslash_tl } +\tl_new:N \g__codedoc_function_name_prefix_tl +\tl_new:N \l__codedoc_index_macro_tl +\tl_new:N \l__codedoc_index_key_tl +\tl_new:N \l__codedoc_index_module_tl +\tl_new:N \g__codedoc_module_name_tl +\tl_const:Nn \c__codedoc_iow_rule_tl + { ======================================== } +\tl_const:Nn \c__codedoc_iow_mid_rule_tl + { -------------------------------------- } +\box_new:N \l__codedoc_macro_index_box +\box_new:N \l__codedoc_macro_box +\int_new:N \l__codedoc_macro_int +\tl_new:N \l__codedoc_cmd_tl +\tl_new:N \l__codedoc_cmd_index_tl +\bool_new:N \l__codedoc_cmd_replace_bool +\bool_new:N \l__codedoc_in_implementation_bool +\bool_new:N \g__codedoc_typeset_documentation_bool +\bool_new:N \g__codedoc_typeset_implementation_bool +\bool_set_true:N \g__codedoc_typeset_documentation_bool +\bool_set_true:N \g__codedoc_typeset_implementation_bool +\tl_new:N \g__codedoc_base_name_tl +\prop_new:N \l__codedoc_variants_prop +\bool_new:N \l__codedoc_no_label_bool +\cs_new_eq:NN \__codedoc_tmpa:w ? +\cs_new_eq:NN \__codedoc_tmpb:w ? +\DeclareOption { a5paper } { \@latexerr { Option~not~supported } { } } +\DeclareOption { full } + { + \bool_gset_true:N \g__codedoc_typeset_documentation_bool + \bool_gset_true:N \g__codedoc_typeset_implementation_bool + } +\DeclareOption { onlydoc } + { + \bool_gset_true:N \g__codedoc_typeset_documentation_bool + \bool_gset_false:N \g__codedoc_typeset_implementation_bool + } +\DeclareOption { check } + { \bool_gset_true:N \g__codedoc_checkfunc_bool } +\DeclareOption { nocheck } + { \bool_gset_false:N \g__codedoc_checkfunc_bool } +\DeclareOption { checktest } + { \bool_gset_true:N \g__codedoc_checktest_bool } +\DeclareOption { nochecktest } + { \bool_gset_false:N \g__codedoc_checktest_bool } +\DeclareOption { cm-default } + { \bool_gset_false:N \g__codedoc_lmodern_bool } +\DeclareOption { lm-default } + { \bool_gset_true:N \g__codedoc_lmodern_bool } +\DeclareOption* { \PassOptionsToClass { \CurrentOption } { article } } +\ExecuteOptions { full, a4paper, nocheck, nochecktest, lm-default } +\msg_new:nnn { l3doc } { input-cfg } + { Local~config~file~l3doc.cfg~loaded. } +\file_if_exist:nT { l3doc.cfg } + { + \file_input:nT { l3doc.cfg } + { + \cs_if_exist:cF { ExplMakeTitle } + { \msg_info:nn { l3doc } { input-cfg } } + } + } \ProcessOptions \LoadClass{article} \RequirePackage{doc} @@ -138,862 +245,1158 @@ verbatim } \raggedbottom -\fvset{gobble=2} -\cs_set_eq:NN \verbatim \Verbatim -\cs_set_eq:NN \endverbatim \endVerbatim \bool_if:NT \g__codedoc_lmodern_bool - { - \RequirePackage[T1]{fontenc} - \RequirePackage{lmodern} - \group_begin: - \ttfamily - \DeclareFontShape{T1}{lmtt}{m}{it}{<->ec-lmtto10}{} - \group_end: - } + { + \RequirePackage[T1]{fontenc} + \RequirePackage{lmodern} + \group_begin: + \ttfamily + \DeclareFontShape{T1}{lmtt}{m}{it}{<->ec-lmtto10}{} + \group_end: + } \RequirePackage{hypdoc} -\cs_set_nopar:Npn \MakePrivateLetters - { - \char_set_catcode_letter:N \@ - \char_set_catcode_letter:N \_ - \char_set_catcode_letter:N \: - } +\cs_gset_nopar:Npn \MakePrivateLetters + { + \char_set_catcode_letter:N \@ + \char_set_catcode_letter:N \_ + \char_set_catcode_letter:N \: + } \setcounter{StandardModuleDepth}{1} \@addtoreset{CodelineNo}{part} \tl_replace_once:Nnn \theCodelineNo - { \HDorg@theCodelineNo } - { \textcolor[gray]{0.5} { \sffamily\tiny\arabic{CodelineNo} } } + { \HDorg@theCodelineNo } + { \textcolor[gray]{0.5} { \sffamily\tiny\arabic{CodelineNo} } } +\fvset{gobble=2} +\cs_gset_eq:NN \verbatim \Verbatim +\cs_gset_eq:NN \endverbatim \endVerbatim \setlength \textwidth { 385pt } \addtolength \marginparwidth { 30pt } \addtolength \oddsidemargin { 20pt } \addtolength \evensidemargin { 20pt } -\cs_set_eq:NN \__codedoc_oldlist:nn \list -\cs_set_nopar:Npn \list #1 #2 { \__codedoc_oldlist:nn {#1} { #2 \listparindent\z@ } } +\cs_new_eq:NN \__codedoc_oldlist:nn \list +\cs_gset_nopar:Npn \list #1 #2 + { \__codedoc_oldlist:nn {#1} { #2 \dim_zero:N \listparindent } } \setlength \parindent { 2em } \setlength \itemindent { 0pt } \setlength \parskip { 0pt plus 3pt minus 0pt } +\tl_gset:Nn \partname {File} \@addtoreset{section}{part} -\cs_set_nopar:Npn \l@section #1#2 - { - \ifnum \c@tocdepth >\z@ - \addpenalty\@secpenalty - \addvspace{1.0em \@plus\p@} - \setlength\@tempdima{2.5em} % was 1.5em - \begingroup - \parindent \z@ \rightskip \@pnumwidth - \parfillskip -\@pnumwidth - \leavevmode \bfseries - \advance\leftskip\@tempdima - \hskip -\leftskip - #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par - \endgroup - \fi - } -\cs_set_nopar:Npn\l@subsection{\@dottedtocline{2}{2.5em}{2.3em}} % #2 = 1.5em +\cs_gset_nopar:Npn \l@section #1#2 + { + \ifnum \c@tocdepth >\z@ + \addpenalty\@secpenalty + \addvspace{1.0em \@plus\p@} + \setlength\@tempdima{2.5em} % was 1.5em + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \bfseries + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par + \endgroup + \fi + } +\cs_gset_nopar:Npn \l@subsection + { \@dottedtocline{2}{2.5em}{2.3em} } % #2 = 1.5em \AtBeginDocument - { - \MakeShortVerb \" - \MakeShortVerb \| - } + { + \MakeShortVerb \" + \MakeShortVerb \| + } +\AtEndDocument + { + \DeleteShortVerb \" + \DeleteShortVerb \| + } \providecommand*\eTeX{\hologo{eTeX}} \providecommand*\IniTeX{\hologo{iniTeX}} \providecommand*\Lua{Lua} \providecommand*\LuaTeX{\hologo{LuaTeX}} \providecommand*\pdfTeX{\hologo{pdfTeX}} \providecommand*\XeTeX{\hologo{XeTeX}} -\DeclareDocumentCommand \cmd {m} { \__codedoc_cmd:n { #1 } } -\DeclareDocumentCommand \cs {m} { \__codedoc_cs:n { #1 } } -\cs_new:Npn \__codedoc_cmd:n #1 { \cs{ \expandafter \__codedoc_cmd_to_cs:w \string#1 } } -\cs_set_nopar:Npn \__codedoc_cmd_to_cs:w #1#2 { \char\number`#2\relax } -\cs_new:Npn \__codedoc_cs:n #1 - { - \tl_set_rescan:Nnn \l__codedoc_tmpb_tl { } { _ } - \tl_set:Nn \l__codedoc_tmpa_tl {#1} - \tl_replace_all:NVn \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl { _ } - \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl - \tl_replace_all:NnV \l__codedoc_tmpa_tl { _ } \l__codedoc_tmpb_tl - \texttt { \char`\\ \tl_use:N \l__codedoc_tmpa_tl} - } -\cs_generate_variant:Nn \tl_replace_all:Nnn { NV , NnV } -\providecommand\marg[1]{ \texttt{\char`\{} \meta{#1} \texttt{\char`\}} } +\DeclareExpandableDocumentCommand \cmd { O{} m } + { \__codedoc_cmd:no {#1} { \token_to_str:N #2 } } +\DeclareExpandableDocumentCommand \cs { O{} m } + { \__codedoc_cmd:no {#1} { \c__codedoc_backslash_tl #2 } } +\DeclareExpandableDocumentCommand \tn { O{} m } + { + \__codedoc_cmd:no + { index = TeX , replace = false , #1 } + { \c__codedoc_backslash_tl #2 } + } +\DeclareExpandableDocumentCommand { \meta } { m } + { \__codedoc_meta:n {#1} } +\newcommand\Arg[1] + { \texttt{\char`\{} \meta{#1} \texttt{\char`\}} } +\providecommand\marg[1]{ \Arg{#1} } \providecommand\oarg[1]{ \texttt[ \meta{#1} \texttt] } \providecommand\parg[1]{ \texttt( \meta{#1} \texttt) } -\cs_set_eq:NN \file \nolinkurl +\DeclareRobustCommand \file {\nolinkurl} \DeclareRobustCommand \env {\texttt} \DeclareRobustCommand \pkg {\textsf} \DeclareRobustCommand \cls {\textsf} -\newenvironment{texnote} - { - \endgraf - \vspace{3mm} - \small\textbf{\TeX~hackers~note:} - } - { - \vspace{3mm} - } -\DeclareDocumentCommand \tn {m} - { - \texttt { \char`\\ #1 } - \index - { - TeX~and~LaTeX2e~commands\actualchar - \string\TeX{}~and~\string\LaTeXe{}~commands:\levelchar - #1\actualchar{\string\ttfamily\string\bslash{}#1} - } - } -\cs_new:Npn \__codedoc_implementation: - { - \DeclareDocumentCommand {\variable} { O{} } { \__codedoc_macro:n { var , ##1 } } - \cs_set_eq:NN \endvariable \endmacro - } -\cs_new:Npn \__codedoc_docu: - { - \cs_set_eq:NN \variable \variabledoc - \cs_set_eq:NN \endvariable \endvariabledoc - } -\AtEndOfPackage{\__codedoc_docu:} -\newenvironment{documentation}{\__codedoc_docu:}{} -\newenvironment{implementation}{\__codedoc_implementation:}{} -\NewDocumentCommand \EnableDocumentation {} - { - \renewenvironment{documentation}{\__codedoc_docu:}{} - } -\NewDocumentCommand \EnableImplementation {} - { - \renewenvironment{implementation}{\__codedoc_implementation:}{} - } -\NewDocumentCommand \DisableDocumentation {} - { - \cs_set_eq:NN \documentation \comment - \cs_set_eq:NN \enddocumentation \endcomment - } -\NewDocumentCommand \DisableImplementation {} - { - \cs_set_eq:NN \implementation \comment - \cs_set_eq:NN \endimplementation \endcomment - } -\newenvironment{arguments} - { - \enumerate[ - nolistsep, - label=\texttt{\#\arabic*}~:, - labelsep=*, - ] - } - { - \endenumerate - } -\keys_define:nn { l3doc/function } - { - TF .code:n = - { - \bool_gset_true:N \l__codedoc_meta_TF_bool - } , - EXP .code:n = - { - \bool_gset_true:N \l__codedoc_meta_EXP_bool - \bool_gset_false:N \l__codedoc_meta_rEXP_bool - } , - rEXP .code:n = - { - \bool_gset_false:N \l__codedoc_meta_EXP_bool - \bool_gset_true:N \l__codedoc_meta_rEXP_bool - } , - pTF .code:n = - { - \bool_gset_true:N \l__codedoc_meta_pTF_bool - \bool_gset_true:N \l__codedoc_meta_TF_bool - \bool_gset_true:N \l__codedoc_meta_EXP_bool - } , - added .tl_set:N = \l__codedoc_date_added_tl , - updated .tl_set:N = \l__codedoc_date_updated_tl , - tested .code:n = { } , - } -\char_set_catcode_active:N \< -\DeclareDocumentEnvironment {function} { O{} } - { - - \par\bigskip\noindent - \phantomsection - - \coffin_clear:N \l__codedoc_descr_coffin - \box_gclear:N \g__codedoc_syntax_box - \coffin_clear:N \l__codedoc_syntax_coffin - \coffin_clear:N \l__codedoc_names_coffin - - \bool_set_false:N \l__codedoc_meta_TF_bool - \bool_set_false:N \l__codedoc_meta_pTF_bool - \bool_set_false:N \l__codedoc_meta_EXP_bool - \bool_set_false:N \l__codedoc_meta_rEXP_bool - - \keys_set:nn { l3doc/function } {#1} - - \char_set_active_eq:NN < \__codedoc_open_meta:w - - \group_begin: - \MakePrivateLetters - \char_set_catcode_other:N \| - \char_set_catcode_space:N \~ - \char_set_catcode_ignore:N \ % space - \char_set_catcode_ignore:N \^^M - \char_set_catcode_ignore:N \^^I - \exp_after:wN - \group_end: - \__codedoc_function:n - } - { - \vcoffin_set_end: - \hcoffin_set:Nn \l__codedoc_syntax_coffin { \box_use:N \g__codedoc_syntax_box } - \bool_if:NTF \l__codedoc_long_name_bool - { - \coffin_join:NnnNnnnn - \l__codedoc_output_box {hc} {vc} - \l__codedoc_syntax_coffin {l} {T} - {0pt} {0pt} - \coffin_join:NnnNnnnn - \l__codedoc_output_box {l} {t} - \l__codedoc_names_coffin {r} {t} - {-\marginparsep} {0pt} - \coffin_join:NnnNnnnn - \l__codedoc_output_box {l} {b} - \l__codedoc_descr_coffin {l} {t} - {0.75\marginparwidth + \marginparsep} {-\medskipamount} - - \coffin_typeset:Nnnnn \l__codedoc_output_box {\l__codedoc_descr_coffin-l} {\l__codedoc_descr_coffin-t} {0pt} {0pt} - } - { - \coffin_join:NnnNnnnn - \l__codedoc_output_box {hc} {vc} - \l__codedoc_syntax_coffin {l} {t} - {0pt} {0pt} - \coffin_join:NnnNnnnn - \l__codedoc_output_box {l} {b} - \l__codedoc_descr_coffin {l} {t} - {0pt} {-\medskipamount} - \coffin_join:NnnNnnnn - \l__codedoc_output_box {l} {t} - \l__codedoc_names_coffin {r} {t} - {-\marginparsep} {0pt} - - \coffin_typeset:Nnnnn - \l__codedoc_output_box {\l__codedoc_syntax_coffin-l} {\l__codedoc_syntax_coffin-T} - {0pt} {0pt} - } - \par - \allowbreak - } -\char_set_catcode_other:N \< -\cs_set_eq:NN \variabledoc \function -\cs_set_eq:NN \endvariabledoc \endfunction -\cs_set_nopar:Npn \__codedoc_function:n #1 - { - - \tl_set:Nn \l__codedoc_function_input_tl {#1} - - \dim_zero:N \l__codedoc_trial_width_dim - \hcoffin_set:Nn \l__codedoc_names_coffin { \function_typeset:n {#1} } - \dim_set:Nn \l__codedoc_trial_width_dim { \box_wd:N \l__codedoc_names_coffin } - - \bool_set:Nn \l__codedoc_long_name_bool - { \dim_compare_p:nNn \l__codedoc_trial_width_dim > \marginparwidth } - - \vcoffin_set:Nnw \l__codedoc_descr_coffin {\textwidth} - \noindent\ignorespaces - } -\cs_gset_nopar:Npn \function_typeset:n #1 %^^A todo: use "\cs_new:Npn" here - { - \tl_gclear:N \g__codedoc_macro_tl - - % populate "\l__codedoc_functions_block_prop" with info on the functions present: - % with a hack as we don't currently read verbatim and that means that - % \q_recursion_tail is an issue! - \str_if_eq:nnTF {#1} { \q_recursion_tail } +\NewDocumentCommand \EnableDocumentation { } + { \bool_gset_true:N \g__codedoc_typeset_documentation_bool } +\NewDocumentCommand \EnableImplementation { } + { \bool_gset_true:N \g__codedoc_typeset_implementation_bool } +\NewDocumentCommand \DisableDocumentation { } + { \bool_gset_false:N \g__codedoc_typeset_documentation_bool } +\NewDocumentCommand \DisableImplementation { } + { \bool_gset_false:N \g__codedoc_typeset_implementation_bool } +\NewDocumentEnvironment { documentation } { } + { + \bool_if:NTF \g__codedoc_typeset_documentation_bool + { \bool_set_false:N \l__codedoc_in_implementation_bool } + { \comment } + } + { \bool_if:NF \g__codedoc_typeset_documentation_bool { \endcomment } } +\NewDocumentEnvironment { implementation } { } + { + \bool_if:NTF \g__codedoc_typeset_implementation_bool + { \bool_set_true:N \l__codedoc_in_implementation_bool } + { \comment } + } + { \bool_if:NF \g__codedoc_typeset_implementation_bool { \endcomment } } +\DeclareDocumentEnvironment { variable } { O{} +v } + { + \bool_if:NTF \l__codedoc_in_implementation_bool + { \__codedoc_macro:nnw { var , #1 } {#2} } + { \__codedoc_function:nnw {#1} {#2} } + } + { + \bool_if:NTF \l__codedoc_in_implementation_bool + { \__codedoc_macro_end: } + { \__codedoc_function_end: } + } +\DeclareDocumentEnvironment { function } { O{} +v } + { \__codedoc_function:nnw {#1} {#2} } + { \__codedoc_function_end: } +\DeclareDocumentEnvironment { macro } { O{} +v } + { \__codedoc_macro:nnw {#1} {#2} } + { \__codedoc_macro_end: } +\NewDocumentEnvironment { syntax } { } + { \__codedoc_syntax:w } + { + \__codedoc_syntax_end: + \ignorespacesafterend + } +\NewDocumentEnvironment { texnote } { } + { + \endgraf + \vspace{3mm} + \small\textbf{\TeX~hackers~note:} + } + { + \vspace{3mm} + } +\NewDocumentEnvironment { arguments } { } + { + \enumerate [ + nolistsep , + label = \texttt{\#\arabic*} ~ : , + labelsep = * , + ] + } + { + \endenumerate + } +\keys_define:nn { l3doc/cmd } + { + index .tl_set:N = \l__codedoc_cmd_index_tl , + replace .bool_set:N = \l__codedoc_cmd_replace_bool , + } +\cs_new:Npn \__codedoc_cmd:nn #1#2 + { + \texorpdfstring + { + \CodedocUnexpandedTokens + { \CodedocUseCs { __codedoc_cmd_aux:nn } {#1} {#2} } + } + {#2} + } +\cs_generate_variant:Nn \__codedoc_cmd:nn { no } +\cs_new_protected:Npn \__codedoc_cmd_aux:nn #1#2 + { + \bool_set_true:N \l__codedoc_cmd_replace_bool + \tl_set:Nn \l__codedoc_cmd_index_tl { \q_no_value } + \keys_set:nn { l3doc/cmd } {#1} + \tl_set:No \l__codedoc_cmd_tl { \token_to_str:N #2 } + \bool_if:NT \l__codedoc_cmd_replace_bool + { + \tl_set_rescan:Nnn \l__codedoc_tmpb_tl { } { _ } + \tl_replace_all:Non \l__codedoc_cmd_tl \l__codedoc_tmpb_tl { _ } + \__codedoc_replace_at_at:N \l__codedoc_cmd_tl + \tl_replace_all:Nno \l__codedoc_cmd_tl { _ } \l__codedoc_tmpb_tl + } + \mode_if_math:T { \mbox } { - \prop_put:Nxx \l__codedoc_functions_block_prop - { \cs_to_str:N \q_recursion_tail } - { { -1 } { } } + \verbatim@font + \int_compare:nNnF + { \tl_count:N \l__codedoc_cmd_tl } + < { \tl_count:f { \tl_to_str:N \l__codedoc_cmd_tl } } + { + \tl_set:Nx \l__codedoc_cmd_tl { \tl_to_str:N \l__codedoc_cmd_tl } + \tl_replace_all:Non \l__codedoc_cmd_tl + { \token_to_str:N _ } { \_ } + } + \tl_replace_all:Nnn \l__codedoc_cmd_tl { ~ } { \@xobeysp } + \l__codedoc_cmd_tl } - { \clist_map_function:nN {#1} \__codedoc_parse_functions:n } - - \small\ttfamily - \begin{tabular}{ @{} l @{} r @{} } - \toprule - \prop_map_function:NN \l__codedoc_functions_block_prop \__codedoc_typeset_functions:nn - \__codedoc_typeset_dates: - \bottomrule - \end{tabular} - \normalfont\normalsize - } -\prop_new:N \l__codedoc_functions_block_prop -\cs_generate_variant:Nn \prop_put:Nnn {Nxx} -\cs_new:Nn \__codedoc_parse_functions:n - { - \exp_args:Nxx \tl_if_head_eq_charcode:nNTF { \token_to_str:N #1 } {\cs_to_str:N \\} - { - \tl_gset_eq:NN \l__codedoc_function_name_prefix_tl \@backslashchar - % for the weird functions named "\::N" and so on: - \exp_args:Nx \tl_if_head_eq_charcode:nNTF { \cs_to_str:N #1 } { : } - { - % again, no variants: - \prop_put:Nxx \l__codedoc_functions_block_prop { \cs_to_str:N #1 } { {-1} {} } - } - { - % finally, for regular old csnames: - \exp_args:NNf \prop_get:NnNTF - \l__codedoc_functions_block_prop - { \__cs_get_function_name:N #1 } \l__codedoc_tmpb_tl - { - \prop_put:Nxx \l__codedoc_functions_block_prop - { \__cs_get_function_name:N #1 } - { - \l__codedoc_tmpb_tl , - {\__cs_count_signature:N #1} - {\__cs_get_function_signature:N #1} - } - } - { - \prop_put:Nxx \l__codedoc_functions_block_prop - { \__cs_get_function_name:N #1 } + \exp_args:No \__codedoc_key_get:n { \l__codedoc_cmd_tl } + \quark_if_no_value:NF \l__codedoc_cmd_index_tl + { \tl_set_eq:NN \l__codedoc_index_module_tl \l__codedoc_cmd_index_tl } + \__codedoc_special_index_module:ooon + { \l__codedoc_index_key_tl } + { \l__codedoc_index_macro_tl } + { \l__codedoc_index_module_tl } + { } + } +\cs_new:Npn \__codedoc_meta:n #1 + { + \texorpdfstring + { + \CodedocUnexpandedTokens + { \CodedocUseCs { __codedoc_meta_aux:n } {#1} } + } + { < #1 > } + } +\cs_new_protected:Npn \__codedoc_meta_aux:n #1 + { + \tl_set:Nn \l__codedoc_tmpa_tl {#1} + \tl_map_inline:nn + { { 3 } { 4 } { 7 } { 8 } { 11 } { 12 } { 13 } } + { + \tl_set_rescan:Nnn \l__codedoc_tmpb_tl + { \char_set_catcode:nn { `_ } {##1} } { _ } + \tl_replace_all:Non \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl + { \__codedoc_ensuremath_sb:n } + } + \exp_args:NV \__codedoc_meta_original:n \l__codedoc_tmpa_tl + } +\cs_new_protected:Npn \__codedoc_ensuremath_sb:n #1 + { \ensuremath { \sb {#1} } } +\cs_new_protected:Npn \__codedoc_meta_original:n #1 + { + \ensuremath \langle + \mode_if_math:T { \nfss@text } + { + \meta@font@select + \edef \meta@hyphen@restore + { \hyphenchar \the \font \the \hyphenchar \font } + \hyphenchar \font \m@ne + \language \l@nohyphenation + #1 \/ + \meta@hyphen@restore + } + \ensuremath \rangle + } +\keys_define:nn { l3doc/function } + { + TF .code:n = + { + \bool_set_true:N \l__codedoc_macro_TF_bool + } , + EXP .code:n = + { + \bool_set_true:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + } , + rEXP .code:n = + { + \bool_set_false:N \l__codedoc_macro_EXP_bool + \bool_set_true:N \l__codedoc_macro_rEXP_bool + } , + pTF .code:n = + { + \bool_set_true:N \l__codedoc_macro_pTF_bool + \bool_set_true:N \l__codedoc_macro_TF_bool + \bool_set_true:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + } , + added .tl_set:N = \l__codedoc_date_added_tl , + updated .tl_set:N = \l__codedoc_date_updated_tl , + tested .code:n = { } , + no-label .bool_set:N = \l__codedoc_no_label_bool , + } +\cs_new_protected:Npn \__codedoc_function:nnw #1#2 + { + \__codedoc_function_typeset_start: + \__codedoc_function_init: + \keys_set:nn { l3doc/function } {#1} + \__codedoc_verb_get_seq:nN {#2} \l__codedoc_function_input_seq + \__codedoc_function_parse: + \__codedoc_function_typeset: + \__codedoc_function_descr_start:w + } +\cs_new_protected_nopar:Npn \__codedoc_function_end: + { + \__codedoc_function_descr_stop: + \__codedoc_function_assemble: + \__codedoc_function_typeset_stop: + } +\cs_new_protected_nopar:Npn \__codedoc_function_typeset_start: + { + \par \bigskip \noindent + \phantomsection + } +\cs_new_protected_nopar:Npn \__codedoc_function_typeset_stop: + { + \par + \allowbreak + } +\cs_new_protected:Npn \__codedoc_function_init: + { + \coffin_clear:N \l__codedoc_descr_coffin + \box_gclear:N \g__codedoc_syntax_box + \coffin_clear:N \l__codedoc_syntax_coffin + \coffin_clear:N \l__codedoc_names_coffin + \bool_set_false:N \l__codedoc_macro_TF_bool + \bool_set_false:N \l__codedoc_macro_pTF_bool + \bool_set_false:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + \bool_set_false:N \l__codedoc_no_label_bool + \char_set_active:Npn < ##1 > { \meta {##1} } + } +\cs_new_protected_nopar:Npn \__codedoc_function_parse: + { + \seq_map_function:NN + \l__codedoc_function_input_seq + \__codedoc_function_parse_one:n + } +\cs_new_protected:Npn \__codedoc_function_parse_one:n #1 + { + \tl_if_head_eq_charcode:nNTF {#1} \c__codedoc_backslash_token + { + \tl_gset_eq:NN \g__codedoc_function_name_prefix_tl \c__codedoc_backslash_tl + \exp_args:No \tl_if_head_eq_charcode:nNTF { \use_none:n #1 } : { - {\__cs_count_signature:N #1} - {\__cs_get_function_signature:N #1} + \prop_put:Nxn \l__codedoc_functions_block_prop + { \use_none:n #1 } { \scan_stop: } } - } - } - } - { - % for now don't bother splitting into variants: - \tl_gclear:N \l__codedoc_function_name_prefix_tl - \prop_put:Nxx \l__codedoc_functions_block_prop { \tl_to_str:n {#1} } { {-1} {} } - } - } -\cs_new:Nn \__codedoc_typeset_functions:nn - { - \clist_gset:Nn \l__codedoc_variants_clist {#2} - \clist_gpop:NN \l__codedoc_variants_clist \l__codedoc_tmpb_tl - \exp_args:Nc \__codedoc_typeset_functions_aux:N - { - #1 - \int_compare:nT { \exp_after:wN \use_i:nn \l__codedoc_tmpb_tl > -1 } {:} - \int_compare:nT { \exp_after:wN \use_i:nn \l__codedoc_tmpb_tl > 0 } - { \exp_after:wN \use_ii:nn \l__codedoc_tmpb_tl } - } - \\ - } - -\cs_new_nopar:Nn \__codedoc_typeset_functions_aux:N - { - \bool_if:NT \l__codedoc_meta_pTF_bool - { - \tl_set:Nx \l__codedoc_pTF_name_tl - { \l__codedoc_function_name_prefix_tl \__codedoc_predicate_from_base:N #1 } - \__codedoc_special_main_index:o { \l__codedoc_pTF_name_tl } - \seq_gput_right:Nx \g_doc_functions_seq - { \tl_to_str:N \l__codedoc_pTF_name_tl } - \tl_set:Nx \l__codedoc_pTF_name_tl { \__codedoc_predicate_from_base:N #1 } - } - - \tl_set:Nx \l__codedoc_tmpa_tl - { - \l__codedoc_function_name_prefix_tl - \cs_to_str:N #1 - \bool_if:NT \l__codedoc_meta_TF_bool { \tl_to_str:n {TF} } - } - \__codedoc_special_main_index:o { \l__codedoc_tmpa_tl } - \seq_gput_right:No \g_doc_functions_seq { \l__codedoc_tmpa_tl } - - \bool_if:NTF \l__codedoc_meta_pTF_bool - { - \bool_gset_false:N \l__codedoc_meta_TF_bool - \exp_args:Nc \__codedoc_typeset_function_block:N { \l__codedoc_pTF_name_tl } - \bool_gset_true:N \l__codedoc_meta_TF_bool - + { + \exp_args:Nc \__cs_split_function:NN { \use_none:n #1 } + \__codedoc_function_parse_cs_aux:nnN + } + } + { + \tl_gclear:N \g__codedoc_function_name_prefix_tl + \prop_put:Nnn \l__codedoc_functions_block_prop {#1} { \scan_stop: } + } + } +\cs_new_protected:Npn \__codedoc_function_parse_cs_aux:nnN #1#2#3 + { + \prop_get:NnNF + \l__codedoc_functions_block_prop {#1} \l__codedoc_tmpb_tl + { \tl_clear:N \l__codedoc_tmpb_tl } + \prop_put:Nnx \l__codedoc_functions_block_prop {#1} + { + \l__codedoc_tmpb_tl , + \bool_if:NTF #3 { {#2} } { \scan_stop: } + } + } +\cs_new_protected_nopar:Npn \__codedoc_function_typeset: + { + \dim_zero:N \l__codedoc_trial_width_dim + \hcoffin_set:Nn \l__codedoc_names_coffin { \__codedoc_typeset_names: } + \dim_set:Nn \l__codedoc_trial_width_dim + { \box_wd:N \l__codedoc_names_coffin } + \bool_set:Nn \l__codedoc_long_name_bool + { \dim_compare_p:nNn \l__codedoc_trial_width_dim > \marginparwidth } + } +\cs_new_protected_nopar:Npn \__codedoc_function_descr_start:w + { + \vcoffin_set:Nnw \l__codedoc_descr_coffin { \textwidth } + \noindent \ignorespaces + } +\cs_new_protected_nopar:Npn \__codedoc_function_descr_stop: + { \vcoffin_set_end: } +\cs_new_protected_nopar:Npn \__codedoc_function_assemble: + { + \hcoffin_set:Nn \l__codedoc_syntax_coffin + { \box_use:N \g__codedoc_syntax_box } + \bool_if:NTF \l__codedoc_long_name_bool + { + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {hc} {vc} + \l__codedoc_syntax_coffin {l} {T} + {0pt} {0pt} + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {l} {t} + \l__codedoc_names_coffin {r} {t} + {-\marginparsep} {0pt} + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {l} {b} + \l__codedoc_descr_coffin {l} {t} + {0.75\marginparwidth + \marginparsep} {-\medskipamount} + \coffin_typeset:Nnnnn \l__codedoc_output_coffin + {\l__codedoc_descr_coffin-l} {\l__codedoc_descr_coffin-t} + {0pt} {0pt} + } + { + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {hc} {vc} + \l__codedoc_syntax_coffin {l} {t} + {0pt} {0pt} + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {l} {b} + \l__codedoc_descr_coffin {l} {t} + {0pt} {-\medskipamount} + \coffin_join:NnnNnnnn + \l__codedoc_output_coffin {l} {t} + \l__codedoc_names_coffin {r} {t} + {-\marginparsep} {0pt} + \coffin_typeset:Nnnnn \l__codedoc_output_coffin + {\l__codedoc_syntax_coffin-l} {\l__codedoc_syntax_coffin-T} + {0pt} {0pt} + } + } +\cs_new_protected_nopar:Npn \__codedoc_typeset_names: + { + \small\ttfamily + \begin{tabular} { @{} l @{} r @{} } + \toprule + \__codedoc_typeset_functions: + \__codedoc_typeset_dates: + \bottomrule + \end{tabular} + \normalfont\normalsize + } +\cs_new_protected_nopar:Npn \__codedoc_typeset_functions: + { + \prop_map_function:NN \l__codedoc_functions_block_prop + \__codedoc_typeset_functions_auxi:nn + } +\cs_new_protected:Npn \__codedoc_typeset_functions_auxi:nn #1#2 + { + \tl_gset:Nn \g__codedoc_base_name_tl {#1} + \prop_clear:N \l__codedoc_variants_prop + \clist_map_inline:nn {#2} + { + \tl_set:Nx \l__codedoc_tmpa_tl + { \__codedoc_signature_base_form:n {##1} } + \prop_get:NoNTF \l__codedoc_variants_prop + \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl + { \tl_put_right:Nn \l__codedoc_tmpb_tl { , {##1} } } + { \tl_set:Nn \l__codedoc_tmpb_tl { {##1} } } + \prop_put:Noo \l__codedoc_variants_prop + \l__codedoc_tmpa_tl \l__codedoc_tmpb_tl + } + \prop_map_function:NN \l__codedoc_variants_prop + \__codedoc_typeset_functions_auxii:nn + } +\cs_new_protected:Npn \__codedoc_typeset_functions_auxii:nn #1#2 + { + \clist_gset:Nn \g__codedoc_variants_clist {#2} + \clist_gpop:NN \g__codedoc_variants_clist \l__codedoc_tmpb_tl + \exp_args:Nc \__codedoc_typeset_functions_auxiii:N + { + \g__codedoc_base_name_tl + \exp_last_unbraced:Nf \token_if_eq_meaning:NNF + { \tl_head:f { \l__codedoc_tmpb_tl ? } } + \scan_stop: + { : \l__codedoc_tmpb_tl } + } + } +\cs_new_protected:Npn \__codedoc_typeset_functions_auxiii:N #1 + { + \bool_if:NT \l__codedoc_macro_pTF_bool + { + \tl_set:Nx \l__codedoc_pTF_name_tl + { \__codedoc_predicate_from_base:N #1 } + \__codedoc_function_index:x { \l__codedoc_pTF_name_tl } + } + \__codedoc_function_index:x + { + \cs_to_str:N #1 + \bool_if:NT \l__codedoc_macro_TF_bool { \tl_to_str:n {TF} } + } + \bool_if:NT \l__codedoc_macro_pTF_bool + { + \exp_args:Nc \__codedoc_typeset_function_block:NN + { \l__codedoc_pTF_name_tl } \c_false_bool + } + \__codedoc_typeset_function_block:NN #1 \l__codedoc_macro_TF_bool + } +\cs_new_protected:Npn \__codedoc_function_index:x #1 + { + \tl_set:Nx \l__codedoc_tmpa_tl + { \g__codedoc_function_name_prefix_tl #1 } + \seq_gput_right:No \g_doc_functions_seq { \l__codedoc_tmpa_tl } + \__codedoc_special_index:on { \l__codedoc_tmpa_tl } { usage } + } +\cs_new_protected:Npn \__codedoc_typeset_function_block:NN #1#2 + { + \__codedoc_function_label:x + { \g__codedoc_function_name_prefix_tl \cs_to_str:N #1 } + \g__codedoc_function_name_prefix_tl \cs_to_str:N #1 + \bool_if:NT #2 { \__codedoc_typeset_TF: } + \__codedoc_typeset_expandability: + \clist_if_empty:NF \g__codedoc_variants_clist + { \__codedoc_typeset_variant_list:NN #1#2 } \\ - \__codedoc_typeset_function_block:N #1 - } - { - \exp_args:Nx \tl_if_head_eq_charcode:nNTF { \exp_after:wN \use_none:n \token_to_str:N #1 } {:} - { \__codedoc_show_macro_unusual:N #1 } - { \__codedoc_typeset_function_block:N #1 } - } -} -\cs_set_nopar:Nn \__codedoc_typeset_function_block:N - { - \tl_gset:Nx \l__codedoc_function_name_tl { \__cs_get_function_name:N #1 } - \tl_gset:Nx \l__codedoc_function_sig_tl { \__cs_get_function_signature:N #1 } - \tl_gset:Nx \g__codedoc_macro_tl { \l__codedoc_function_name_prefix_tl \l__codedoc_function_name_tl } - - \__codedoc_typeset_function_basename:N #1 - \bool_if:NT \l__codedoc_meta_TF_bool { \__codedoc_typeset_TF: } - \__codedoc_typeset_expandability: - \clist_if_empty:NF \l__codedoc_variants_clist { \__codedoc_typeset_variants: } - \bool_if:NT \g__codedoc_full_bool { \__codedoc_label_function:N #1 } - } -\cs_set:Nn \__codedoc_typeset_function_basename:N - { \l__codedoc_function_name_prefix_tl \cs_to_str:N #1 } -\cs_set:Nn \__codedoc_typeset_expandability: - { - & - \bool_if:NT \l__codedoc_meta_EXP_bool - { - \hspace{\tabcolsep} - \hyperlink{expstar} {$\star$} - } - \bool_if:NT \l__codedoc_meta_rEXP_bool - { - \hspace{\tabcolsep} - \hyperlink{rexpstar} {\ding{73}} % hollow star - } - } -\cs_set:Nn \__codedoc_typeset_variants: - { - \\ - \__codedoc_typeset_aux:n \g__codedoc_macro_tl : - \int_compare:nTF { \clist_count:N \l__codedoc_variants_clist == 1 } - { \exp_after:wN \use_ii:nn \l__codedoc_variants_clist } - { - \textrm( - \clist_pop:NN \l__codedoc_variants_clist \l__codedoc_tmpb_tl - \exp_after:wN \use_ii:nn \l__codedoc_tmpb_tl - \clist_map_inline:Nn \l__codedoc_variants_clist {\textrm| \use_ii:nn ##1} - \textrm) - } - \bool_if:NT \l__codedoc_meta_TF_bool { \__codedoc_typeset_TF: } - & - \bool_if:NT \l__codedoc_meta_EXP_bool - { - \hspace{\tabcolsep} - \hyperlink{expstar} {$\star$} - } - \bool_if:NT \l__codedoc_meta_rEXP_bool - { - \hspace{\tabcolsep} - \hyperlink{rexpstar} {\ding{73}} % hollow star - } - } -\cs_set:Nn \__codedoc_label_function:N - { - \tl_set:Nx \l__codedoc_tmpa_tl { \l__codedoc_function_name_prefix_tl \cs_to_str:N #1 } - \exp_args:NNf \tl_replace_all:Nnn \l__codedoc_tmpa_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_remove_all:Nn \l__codedoc_tmpa_tl {\@backslashchar} - \exp_args:Nx \label {doc/function//\l__codedoc_tmpa_tl} - } -\cs_set_nopar:Nn \__codedoc_show_macro_unusual:N - { - \tl_gset:Nx \g__codedoc_macro_tl { \token_to_str:N #1} - \token_to_str:N #1 & - - \exp_args:NNf \tl_replace_all:Nnn \g__codedoc_macro_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_replace_all:Nnn \g__codedoc_macro_tl {\@backslashchar} {} - \bool_if:NT \g__codedoc_full_bool - { - \exp_args:Nx \label { doc/function//\g__codedoc_macro_tl } - } - } -\cs_set:Nn \__codedoc_typeset_dates: - { - \bool_if:nF { \tl_if_empty_p:N \l__codedoc_date_added_tl && - \tl_if_empty_p:N \l__codedoc_date_updated_tl } - { \midrule } - - \tl_if_empty:NF \l__codedoc_date_added_tl - { - \multicolumn{2}{@{}r@{}} - { \scriptsize New:\,\l__codedoc_date_added_tl } \\ - } - - \tl_if_empty:NF \l__codedoc_date_updated_tl - { - \multicolumn{2}{@{}r@{}} - { \scriptsize Updated:\,\l__codedoc_date_updated_tl } \\ - } - } -\newenvironment{syntax} - { - \small\ttfamily - \bool_if:NTF \l__codedoc_long_name_bool - { - \hbox_gset:Nw \g__codedoc_syntax_box - \arrayrulecolor{white} - \begin{tabular}{@{}l@{}} - \toprule - \begin{minipage} - { \textwidth+0.75\marginparwidth-\l__codedoc_trial_width_dim } - } - { - \hbox_gset:Nw \g__codedoc_syntax_box - \arrayrulecolor{white} - \begin{tabular}{@{}l@{}} - \toprule - \begin{minipage}{ \textwidth } - } - \raggedright - \obeyspaces\obeylines - } - { - \end{minipage} - \end{tabular} - \arrayrulecolor{black} - \hbox_set_end: - \ignorespacesafterend - } -\cs_new:Npn \__codedoc_ensuremath_sb:n #1 - { - \ensuremath{\sb{#1}} - } -\cs_set_eq:NN \__codedoc_meta:n \meta -\cs_set:Npn \meta - { - \group_begin: - \char_set_active_eq:NN _ \__codedoc_ensuremath_sb:n - \__codedoc_close_meta:n - } -\cs_new:Npn \__codedoc_open_meta:w - { - \group_begin: - \char_set_active_eq:NN _ \__codedoc_ensuremath_sb:n - \__codedoc_close_meta:w - } -\cs_new:Npn \Arg - { - \texttt{ \char`\{ } - \group_begin: - \char_set_active_eq:NN _ \__codedoc_ensuremath_sb:n - \__codedoc_close_Arg:n - } -\cs_new_nopar:Npn \__codedoc_close_meta:n #1 { \__codedoc_meta:n {#1} \group_end: } -\cs_new_nopar:Npn \__codedoc_close_meta:w #1> { \__codedoc_meta:n {#1} \group_end: } -\cs_new_nopar:Npn \__codedoc_close_Arg:n #1 - { - \__codedoc_meta:n {#1} - \group_end: - \texttt{ \char`\} } - } -\keys_define:nn { l3doc/macro } - { - aux .code:n = - { \bool_set_true:N \l__codedoc_macro_aux_bool } , - internal .code:n = - { \bool_set_true:N \l__codedoc_macro_internal_bool } , - int .code:n = - { \bool_set_true:N \l__codedoc_macro_internal_bool } , - var .code:n = - { \bool_set_true:N \l__codedoc_macro_var_bool } , - TF .code:n = - { \bool_set_true:N \l__codedoc_macro_TF_bool } , - pTF .code:n = - { \bool_set_true:N \l__codedoc_macro_pTF_bool } , - tested .code:n = - { } , - EXP .code:n = {} , % TODO - rEXP .code:n = {} , % TODO - added .code:n = {} , % TODO - updated .code:n = {} , % TODO - } -\RenewDocumentCommand { \macro } { O{} } { \__codedoc_macro:n {#1} } -\cs_new_protected:Npn \__codedoc_macro:n #1 - { - - \int_compare:nNnTF \currentgrouplevel=2 - { \int_gzero:N \g__codedoc_nested_macro_int } - { \int_incr:N \g__codedoc_nested_macro_int } - - \bool_set_false:N \l__codedoc_macro_aux_bool - \bool_set_false:N \l__codedoc_macro_internal_bool - \bool_set_false:N \l__codedoc_macro_TF_bool - \bool_set_false:N \l__codedoc_macro_pTF_bool - \bool_set_false:N \l__codedoc_macro_var_bool - \bool_set_false:N \l__codedoc_tested_bool - - \cs_set_eq:NN \__codedoc_macroname_prefix:n \use:n - \cs_set_eq:NN \__codedoc_macroname_suffix: \c_empty_tl - - \keys_set:nn { l3doc/macro } {#1} - - \cs_set_eq:NN \testfile \__codedoc_print_testfile:n + } +\cs_new_protected_nopar:Npn \__codedoc_typeset_expandability: + { + & + \bool_if:NT \l__codedoc_macro_EXP_bool + { + \hspace{\tabcolsep} + \hyperlink{expstar} {$\star$} + } + \bool_if:NT \l__codedoc_macro_rEXP_bool + { + \hspace{\tabcolsep} + \hyperlink{rexpstar} {\ding{73}} % hollow star + } + } +\cs_new_protected:Npn \__codedoc_typeset_variant_list:NN #1#2 + { + \\ + \__codedoc_typeset_aux:n + { + \g__codedoc_function_name_prefix_tl + \__cs_get_function_name:N #1 + } + : + \int_compare:nTF { \clist_count:N \g__codedoc_variants_clist == 1 } + { \clist_use:Nn \g__codedoc_variants_clist { } } + { + \textrm( + \clist_use:Nn \g__codedoc_variants_clist { \textrm| } + \textrm) + } + \bool_if:NT #2 { \__codedoc_typeset_TF: } + \__codedoc_typeset_expandability: + } +\cs_new_protected:Npn \__codedoc_function_label:n #1 + { + % \bool_if:NT \g__codedoc_typeset_implementation_bool + % { + \bool_if:NF \l__codedoc_no_label_bool + { + \__codedoc_get_hyper_target:nN {#1} \l__codedoc_tmpa_tl + \exp_args:No \label { \l__codedoc_tmpa_tl } + } + % } + } +\cs_generate_variant:Nn \__codedoc_function_label:n { x } +\cs_new_nopar:Npn \__codedoc_typeset_dates: + { + \bool_if:nF + { + \tl_if_empty_p:N \l__codedoc_date_added_tl && + \tl_if_empty_p:N \l__codedoc_date_updated_tl + } + { \midrule } + \tl_if_empty:NF \l__codedoc_date_added_tl + { + \multicolumn { 2 } { @{} r @{} } + { \scriptsize New: \, \l__codedoc_date_added_tl } \\ + } - \peek_meaning_ignore_spaces:NTF \c_group_begin_token - { - \group_begin: - \MakePrivateLetters - \char_set_catcode_letter:N \\ - \char_set_catcode_ignore:N \ % space - \char_set_catcode_ignore:N \^^M - \char_set_catcode_ignore:N \^^I - \__codedoc_macro_aux:n - } - { - \__codedoc_macro_verbatim:w - } - } -\NewDocumentCommand {\__codedoc_macro_verbatim:w} {v} - { - \group_begin: % pretty useless - \__codedoc_macro_aux:n {#1} - } -\clist_new:N \l__codedoc_macro_input_clist -\cs_new_nopar:Npn \__codedoc_macro_aux:n #1 - { - \group_end: - \clist_set:Nn \l__codedoc_macro_input_clist {#1} - \bool_if:NTF \l__codedoc_macro_pTF_bool - { - \clist_map_inline:Nn \l__codedoc_macro_input_clist - { - \exp_args:Nx \__codedoc_macro_single:n { \__codedoc_predicate_from_base:w ##1 \q_nil } + \tl_if_empty:NF \l__codedoc_date_updated_tl + { + \multicolumn { 2 } { @{} r @{} } + { \scriptsize Updated: \, \l__codedoc_date_updated_tl } \\ + } + } +\dim_new:N \l__codedoc_syntax_dim +\cs_new_protected:Npn \__codedoc_syntax:w + { + \dim_set:Nn \l__codedoc_syntax_dim + { + \textwidth + \bool_if:NT \l__codedoc_long_name_bool + { + 0.75 \marginparwidth - \l__codedoc_trial_width_dim } } - \bool_set_true:N \l__codedoc_macro_TF_bool - \clist_map_function:NN \l__codedoc_macro_input_clist \__codedoc_macro_single:n + \hbox_gset:Nw \g__codedoc_syntax_box + \small \ttfamily + \arrayrulecolor{white} + \begin{tabular} { @{} l @{} } + \toprule + \begin{minipage}{\l__codedoc_syntax_dim} + \raggedright + \obeyspaces + \obeylines + } +\cs_new_protected:Npn \__codedoc_syntax_end: + { + \end{minipage} + \end{tabular} + \arrayrulecolor{black} + \hbox_gset_end: + } +\keys_define:nn { l3doc/macro } + { + aux .code:n = + { \bool_set_true:N \l__codedoc_macro_aux_bool } , + internal .code:n = + { \bool_set_true:N \l__codedoc_macro_internal_bool } , + int .code:n = + { \bool_set_true:N \l__codedoc_macro_internal_bool } , + var .code:n = + { \bool_set_true:N \l__codedoc_macro_var_bool } , + TF .code:n = + { \bool_set_true:N \l__codedoc_macro_TF_bool } , + pTF .code:n = + { + \bool_set_true:N \l__codedoc_macro_TF_bool + \bool_set_true:N \l__codedoc_macro_pTF_bool + \bool_set_true:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + } , + EXP .code:n = + { + \bool_set_true:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + } , + rEXP .code:n = + { + \bool_set_false:N \l__codedoc_macro_EXP_bool + \bool_set_true:N \l__codedoc_macro_rEXP_bool + } , + tested .code:n = + { + \bool_set_true:N \l__codedoc_macro_tested_bool + } , + added .code:n = {} , % TODO + updated .code:n = {} , % TODO + } +\cs_new_protected:Npn \__codedoc_macro:nnw #1#2 + { + \__codedoc_macro_init: + \keys_set:nn { l3doc/macro } {#1} + \__codedoc_verb_get_seq:nN {#2} \l__codedoc_macro_input_seq + \__codedoc_macro_map:N \__codedoc_macro_single:n + \__codedoc_macro_typeset: + } +\cs_new_protected_nopar:Npn \__codedoc_macro_init: + { + \int_incr:N \l__codedoc_nested_macro_int + \bool_set_false:N \l__codedoc_macro_aux_bool + \bool_set_false:N \l__codedoc_macro_internal_bool \bool_set_false:N \l__codedoc_macro_TF_bool - } - { \clist_map_function:NN \l__codedoc_macro_input_clist \__codedoc_macro_single:n } - } -\cs_set:Nn \__codedoc_predicate_from_base:N - { - \__cs_get_function_name:N #1 _p: \__cs_get_function_signature:N #1 - } -\cs_set:Npn \__codedoc_predicate_from_base:w #1 : #2 \q_nil - { - #1 _p: #2 - } -\cs_set_nopar:Npn \__codedoc_macro_single:n #1 - { - \int_incr:N \l__codedoc_macro_int - - \tl_set:Nx \l__codedoc_at_replaced_macro_tl { \token_to_str:N #1 } - \__codedoc_replace_at_at:N \l__codedoc_at_replaced_macro_tl - \tl_set_eq:NN \saved@macroname \l__codedoc_at_replaced_macro_tl - - \topsep\MacroTopsep - \trivlist - \cs_set_nopar:Npn \makelabel ##1 { \llap{##1} } - \if@inlabel - \cs_set_eq:NN \@tempa \@empty - \count@ \macro@cnt - \loop \ifnum\count@>\z@ - \cs_set_nopar:Npx \@tempa{\@tempa\hbox{\strut}} - \advance\count@\m@ne - \repeat - \cs_set_nopar:Npx \makelabel ##1 - { - \llap{\vtop to\baselineskip {\@tempa\hbox{##1}\vss}} - } - \advance \macro@cnt \@ne - \else - \macro@cnt \@ne - \fi - - \bool_if:NT \l__codedoc_macro_aux_bool - { - \cs_set_eq:NN \__codedoc_macroname_prefix:n \__codedoc_typeset_aux:n - } - \bool_if:NT \l__codedoc_macro_TF_bool - { - \cs_set_eq:NN \__codedoc_macroname_suffix: \__codedoc_typeset_TF: - } - - \bool_if:NF \l__codedoc_macro_aux_bool - { - \tl_gset:Nx \l__codedoc_macro_tl { \tl_to_str:N \l__codedoc_at_replaced_macro_tl } - \exp_args:NNf \tl_greplace_all:Nnn \l__codedoc_macro_tl {\token_to_str:N _} {/} - \exp_args:NNf \tl_greplace_all:Nnn \l__codedoc_macro_tl {\@backslashchar} {} - } - - \use:x - { - \exp_not:N \item [ \exp_not:N \__codedoc_print_macroname:n { - \tl_to_str:N \l__codedoc_at_replaced_macro_tl - }] - } - \int_gincr:N \c@CodelineNo - - \bool_if:NF \l__codedoc_macro_aux_bool - { - \bool_if:NTF \l__codedoc_macro_TF_bool - { - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l__codedoc_at_replaced_macro_tl \tl_to_str:n {TF} } - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l__codedoc_at_replaced_macro_tl \tl_to_str:n {T } } - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l__codedoc_at_replaced_macro_tl \tl_to_str:n { F} } - } - { - \seq_gput_right:Nx \g_doc_macros_seq { \tl_to_str:N \l__codedoc_at_replaced_macro_tl } - } - } - \bool_if:NTF \l__codedoc_macro_TF_bool - { - \exp_args:Nx \SpecialMainIndex{ \tl_to_str:N \l__codedoc_at_replaced_macro_tl TF}\nobreak - \exp_args:Nx \DoNotIndex{ \tl_to_str:N \l__codedoc_at_replaced_macro_tl TF} - } - { - \exp_args:Nx \SpecialMainIndex{ \tl_to_str:N \l__codedoc_at_replaced_macro_tl }\nobreak - \exp_args:Nx \DoNotIndex{ \tl_to_str:N \l__codedoc_at_replaced_macro_tl } - } + \bool_set_false:N \l__codedoc_macro_pTF_bool + \bool_set_false:N \l__codedoc_macro_EXP_bool + \bool_set_false:N \l__codedoc_macro_rEXP_bool + \bool_set_false:N \l__codedoc_macro_var_bool + \bool_set_false:N \l__codedoc_macro_tested_bool + \cs_set_eq:NN \testfile \__codedoc_print_testfile:n + \box_clear:N \l__codedoc_macro_index_box + \vbox_set:Nn \l__codedoc_macro_box + { + \hbox:n { \strut } + \vskip \int_eval:n { \l__codedoc_macro_int - 1 } \baselineskip + } + } +\cs_new_protected:Npn \__codedoc_macro_map:N #1 + { + \bool_if:NT \l__codedoc_macro_pTF_bool + { + \bool_set_false:N \l__codedoc_macro_TF_bool + \seq_map_inline:Nn \l__codedoc_macro_input_seq + { + \tl_set:Nn \l__codedoc_tmpa_tl {##1} + \tl_replace_once:Noo \l__codedoc_tmpa_tl + { \tl_to_str:n { : } } { \tl_to_str:n { _p: } } + \exp_args:No #1 \l__codedoc_tmpa_tl + } + \bool_set_true:N \l__codedoc_macro_TF_bool + } + \seq_map_function:NN \l__codedoc_macro_input_seq #1 + } +\cs_new_protected_nopar:Npn \__codedoc_macro_typeset: + { + \topsep\MacroTopsep + \trivlist + \cs_set:Npn \makelabel ##1 + { + \llap + { + \hbox_unpack_clear:N \l__codedoc_macro_index_box + \vtop to \baselineskip + { + \vbox_unpack_clear:N \l__codedoc_macro_box + \vss + } + } + } + \item [ ] + } +\cs_new_protected:Npn \__codedoc_macro_single:n #1 + { + \tl_set:Nn \saved@macroname {#1} - \int_gdecr:N \c@CodelineNo - \ignorespaces - } -\tl_clear:N \l__codedoc_macro_tl -\cs_set_nopar:Npn \__codedoc_print_macroname:n #1 - { - \strut - \HD@target - \int_compare:nTF { \tl_count:n {#1} <= 28 } - { \MacroFont } { \MacroLongFont } + \__codedoc_macro_typeset_one:n {#1} + \exp_args:Nx \__codedoc_macro_index:n + { + #1 + \bool_if:NT \l__codedoc_macro_TF_bool { \tl_to_str:n { TF } } + } + } +\cs_new_protected:Npn \__codedoc_macro_index:n #1 + { + \bool_if:NF \l__codedoc_macro_aux_bool + { \seq_gput_right:Nn \g_doc_macros_seq {#1} } + \hbox_set:Nn \l__codedoc_macro_index_box + { + % This box only contains targets... it seems inefficient. + \hbox_unpack_clear:N \l__codedoc_macro_index_box + \int_gincr:N \c@CodelineNo + \__codedoc_special_index:nn {#1} { main } + \DoNotIndex {#1} + \int_gdecr:N \c@CodelineNo + } + } +\cs_new_protected:Npn \__codedoc_macro_typeset_one:n #1 + { + \vbox_set:Nn \l__codedoc_macro_box + { + \vbox_unpack_clear:N \l__codedoc_macro_box + \hbox { \llap { \__codedoc_print_macroname:n {#1} \ } } + } + \int_incr:N \l__codedoc_macro_int + } +\cs_new_protected:Npn \__codedoc_print_macroname:n #1 + { + \strut + \HD@target - % INEFFICIENT: (!) - \exp_args:NNx \seq_if_in:NnTF \g_doc_functions_seq - { #1 \bool_if:NT \l__codedoc_macro_TF_bool { \tl_to_str:n {TF} } } - { - \hyperref [doc/function//\l__codedoc_macro_tl] - } - { \use:n } - { - \__codedoc_macroname_prefix:n {#1} \__codedoc_macroname_suffix: \ % space! - } - } + % TODO: INEFFICIENT(!) + \exp_args:NNx \seq_if_in:NnTF \g_doc_functions_seq + { #1 \bool_if:NT \l__codedoc_macro_TF_bool { \tl_to_str:n {TF} } } + { + \__codedoc_get_hyper_target:nN {#1} \l__codedoc_tmpa_tl + \exp_last_unbraced:NNo \hyperref [ \l__codedoc_tmpa_tl ] + } + { \use:n } + { + \int_compare:nTF { \tl_count:n {#1} <= 28 } + { \MacroFont } { \MacroLongFont } + \__codedoc_macroname_prefix:n {#1} \__codedoc_macroname_suffix: + } + } +\cs_new_protected:Npn \__codedoc_macroname_prefix:n #1 + { + \bool_if:NTF \l__codedoc_macro_aux_bool + { \__codedoc_typeset_aux:n {#1} } {#1} + } +\cs_new_protected_nopar:Npn \__codedoc_macroname_suffix: + { \bool_if:NTF \l__codedoc_macro_TF_bool { \__codedoc_typeset_TF: } { } } \providecommand \MacroLongFont - { - \fontfamily{lmtt}\fontseries{lc}\small - } -\cs_set_nopar:Npn \__codedoc_typeset_TF: - { - \hyperlink{explTF} - { - \color{black} - \itshape TF - \makebox[0pt][r] - { - \color{red} - \underline { \phantom{\itshape TF} \kern-0.1em } - } - } - } -\cs_set_nopar:Npn \__codedoc_typeset_aux:n #1 - { - { \color[gray]{0.7} #1 } - } -\DeclareDocumentCommand \__codedoc_print_testfile:n {m} - { - \bool_set_true:N \l__codedoc_tested_bool - \tl_if_eq:nnF {#1} {*} - { - \seq_if_in:NnF \g__codedoc_testfiles_seq {#1} - { - \seq_gput_right:Nn \g__codedoc_testfiles_seq {#1} - \par - \__codedoc_print_testfile_aux:n {#1} - } - } - } + { + \fontfamily{lmtt}\fontseries{lc}\small + } +\cs_new_protected:Npn \__codedoc_print_testfile:n #1 + { + \bool_set_true:N \l__codedoc_macro_tested_bool + \tl_if_eq:nnF {#1} {*} + { + \seq_if_in:NnF \g__codedoc_testfiles_seq {#1} + { + \seq_gput_right:Nn \g__codedoc_testfiles_seq {#1} + \par + \__codedoc_print_testfile_aux:n {#1} + } + } + } \cs_new_protected:Npn \__codedoc_print_testfile_aux:n #1 - { - \footnotesize - ( - \textit{ - The~ test~ suite~ for~ this~ command,~ - and~ others~ in~ this~ file,~ is~ \textsf{#1} - }. - )\par - } + { + \footnotesize + ( + \textit + { + The~ test~ suite~ for~ this~ command,~ + and~ others~ in~ this~ file,~ is~ \textsf{#1} + }. + )\par + } \DeclareDocumentCommand \TestFiles {m} - { - \par - {\itshape - The~ following~ test~ files~ are~ used~ for~ this~ code:~ \textsf{#1}. - } - \par\ignorespaces - } -\DeclareDocumentCommand \UnitTested {} { \testfile* } -\cs_generate_variant:Nn \prop_gput:Nnn {NVx} -\DeclareDocumentCommand \TestMissing {m} - { - \prop_if_in:NVTF \g__codedoc_missing_tests_prop \l__codedoc_macro_input_clist - { - \prop_get:NVN \g__codedoc_missing_tests_prop \l__codedoc_macro_input_clist \l__codedoc_tmpa_tl - \prop_gput:NVx \g__codedoc_missing_tests_prop \l__codedoc_macro_input_clist + { + \par + \textit + { + The~ following~ test~ files~ are~ + used~ for~ this~ code:~ \textsf{#1}. + } + \par \ignorespaces + } +\DeclareDocumentCommand \UnitTested { } { \testfile* } +\DeclareDocumentCommand \TestMissing { m } + { \__codedoc_test_missing:n {#1} } +\cs_new_protected:Npn \__codedoc_test_missing:n #1 + { + \tl_set:Nx \l__codedoc_tmpb_tl + { \seq_use:Nn \l__codedoc_macro_input_seq { , } } + \prop_if_in:NVTF \g__codedoc_missing_tests_prop \l__codedoc_tmpb_tl + { + \prop_get:NVN \g__codedoc_missing_tests_prop \l__codedoc_tmpb_tl + \l__codedoc_tmpa_tl + } + { \tl_clear:N \l__codedoc_tmpa_tl } + \clist_set:Nx \l__codedoc_tmpa_clist { \l__codedoc_tmpa_tl , #1 } + \prop_gput:NVV \g__codedoc_missing_tests_prop \l__codedoc_tmpb_tl + \l__codedoc_tmpa_clist + } +\cs_new_protected:Npn \__codedoc_macro_end: + { + \endtrivlist + \__codedoc_macro_end_check_tested: + \int_compare:nNnT \l__codedoc_nested_macro_int = 1 + { + \__codedoc_macro_end_style:n + { + \__codedoc_print_end_definition: + \__codedoc_print_documented: + } + } + } +\cs_new_protected_nopar:Npn \__codedoc_macro_end_check_tested: + { + \bool_if:nT { - *~ \l__codedoc_tmpa_tl - ^^J \exp_not:n {\space\space\space\space\space\space} - *~ #1 + \g__codedoc_checktest_bool && + ! \l__codedoc_macro_aux_bool && + ! \l__codedoc_macro_var_bool && + ! \l__codedoc_macro_tested_bool } - } - { \prop_gput:NVn \g__codedoc_missing_tests_prop \l__codedoc_macro_input_clist {#1} } - } -\tl_new:N \g__codedoc_module_name_tl -\cs_new_protected:Npn \__codedoc_replace_at_at:N #1 - { - \tl_if_empty:NF \g__codedoc_module_name_tl - { - \tl_replace_all:Non #1 { \token_to_str:N @ } { @ } - \tl_replace_all:Non #1 { \token_to_str:N _ } { _ } - \tl_replace_all:Nox #1 { _@ @ } { __ \g__codedoc_module_name_tl } - \tl_replace_all:Nox #1 { @ @ } { __ \g__codedoc_module_name_tl } - } - } -\cs_generate_variant:Nn \tl_replace_all:Nnn { Non, Nox } -\cs_new_protected:Nn \__codedoc_endmacro_build_seq:N - { - \seq_gclear:N #1 - \clist_map_inline:Nn \l__codedoc_macro_input_clist - { - \tl_set:Nn \l__codedoc_tmpa_tl {##1} - \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl - \seq_gput_right:No #1 { \l__codedoc_tmpa_tl } - } - } -\cs_set_protected:Nn \__codedoc_endmacro_wrap_each:N - { - \bool_if:NTF \l__codedoc_macro_TF_bool - { \seq_gset_map:NNn #1 #1 { \exp_not:N \texttt { ##1 TF } } } - { \seq_gset_map:NNn #1 #1 { \exp_not:N \texttt { ##1 } } } - } -\cs_set:Nn \__codedoc_texttt_comma:n {\,,~\texttt{#1}} -\cs_set:Npn \endmacro - { - \int_compare:nT { \g__codedoc_nested_macro_int < 1 } - { - \par\nobreak\noindent{\footnotesize(\emph{ + { + \seq_gput_right:Nx \g__codedoc_not_tested_seq + { + \seq_use:Nn \l__codedoc_macro_input_seq { , } + \bool_if:NTF \l__codedoc_macro_pTF_bool {~(pTF)} + { \bool_if:NT \l__codedoc_macro_TF_bool {~(TF)} } + } + } + } +\cs_new_protected:Npn \__codedoc_macro_end_style:n #1 + { + \nobreak \noindent + { \footnotesize ( \emph{#1} ) \par } + } +\cs_new_protected:Npn \__codedoc_macro_end_wrap_items:N #1 + { + \bool_if:NT \l__codedoc_macro_TF_bool + { \seq_set_map:NNn #1 #1 { ##1 TF } } + \seq_set_map:NNn #1 #1 + { + \exp_not:n + { + \tl_set:Nn \l__codedoc_tmpa_tl {##1} + \tl_replace_all:Non \l__codedoc_tmpa_tl + { \token_to_str:N _ } { \_ } + \texttt { \l__codedoc_tmpa_tl } + } + } + } +\cs_new_protected_nopar:Npn \__codedoc_print_end_definition: + { + \group_begin: + \__codedoc_macro_end_wrap_items:N \l__codedoc_macro_input_seq End~ definition~ for~ - \__codedoc_endmacro_build_seq:N \g__codedoc_tmpa_seq - \__codedoc_endmacro_wrap_each:N \g__codedoc_tmpa_seq - \int_compare:nTF { \seq_count:N \g__codedoc_tmpa_seq <= 3 } + \int_compare:nTF { \seq_count:N \l__codedoc_macro_input_seq <= 3 } { - \seq_use:Nnnn \g__codedoc_tmpa_seq + \seq_use:Nnnn \l__codedoc_macro_input_seq { \,~and~ } { \,,~ } { \,,~and~ } \@. } - { \seq_item:Nn \g__codedoc_tmpa_seq {1}\,~and~others. } - + { \seq_item:Nn \l__codedoc_macro_input_seq {1}\,~and~others. } + \group_end: + } +\cs_new_protected_nopar:Npn \__codedoc_print_documented: + { \bool_if:nT - { - !\l__codedoc_macro_aux_bool && - !\l__codedoc_macro_internal_bool && - \int_compare_p:n {\g__codedoc_nested_macro_int<1} - } - { - \int_compare:nNnTF \l__codedoc_macro_int=1 {~This~} {~These~} - \bool_if:NTF \l__codedoc_macro_var_bool{variable}{function} - \int_compare:nNnTF \l__codedoc_macro_int=1 {~is~}{s~are~} - documented~on~page~ - \exp_args:Nx\pageref{doc/function//\l__codedoc_macro_tl}. - } - })\par} - } - - \bool_if:nT - { - \g__codedoc_checktest_bool && - !( \l__codedoc_macro_aux_bool || \l__codedoc_macro_var_bool ) && - !\l__codedoc_tested_bool - } - { - \seq_gput_right:Nx \g__codedoc_not_tested_seq - { - \seq_use:Nnnn \g__codedoc_tmpa_seq { , } { , } { , } - \bool_if:NT \l__codedoc_macro_pTF_bool {~(pTF)} - \bool_if:NT \l__codedoc_macro_TF_bool {~(TF)} - } - } - } + { + ! \l__codedoc_macro_aux_bool && + ! \l__codedoc_macro_internal_bool + } + { + \int_set:Nn \l__codedoc_tmpa_int + { \seq_count:N \l__codedoc_macro_input_seq } + \int_compare:nNnTF \l__codedoc_tmpa_int = 1 {~This~} {~These~} + \bool_if:NTF \l__codedoc_macro_var_bool {variable} {function} + \int_compare:nNnTF \l__codedoc_tmpa_int = 1 {~is~} {s~are~} + documented~on~page~ + \exp_args:Nx \__codedoc_get_hyper_target:nN + { \seq_item:Nn \l__codedoc_macro_input_seq { 1 } } + \l__codedoc_tmpa_tl + \exp_args:Nx \pageref { \l__codedoc_tmpa_tl } . + } + } +\cs_new_protected_nopar:Npn \__codedoc_typeset_TF: + { + \hyperlink{explTF} + { + \color{black} + \itshape TF + \makebox[0pt][r] + { + \color{red} + \underline { \phantom{\itshape TF} \kern-0.1em } + } + } + } +\cs_new_protected:Npn \__codedoc_typeset_aux:n #1 + { + { \color[gray]{0.7} #1 } + } +\cs_new_protected:Npn \__codedoc_get_hyper_target:nN #1#2 + { + \tl_set:Nx #2 + { + \tl_to_str:n {#1} + \bool_if:NT \l__codedoc_macro_TF_bool { \tl_to_str:n {TF} } + } + \tl_replace_all:Nxn #2 { \iow_char:N \_ } { / } + \tl_remove_all:Nx #2 { \iow_char:N \\ } + \tl_put_left:Nn #2 { doc/function// } + } +\newcommand*{\DescribeOption} + { + \leavevmode + \@bsphack + \begingroup + \MakePrivateLetters + \Describe@Option + } +\newcommand*{\Describe@Option}[1] + { + \endgroup + \marginpar{ + \raggedleft + \PrintDescribeEnv{#1} + } + \SpecialOptionIndex{#1} + \@esphack + \ignorespaces + } +\newcommand*{\SpecialOptionIndex}[1] + { + \@bsphack + \begingroup + \HD@target + \let\HDorg@encapchar\encapchar + \edef\encapchar usage + { + \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage} + } + \index + { + #1\actualchar{\protect\ttfamily#1}~(option) + \encapchar usage + } + \index + { + options:\levelchar#1\actualchar{\protect\ttfamily#1} + \encapchar usage + } + \endgroup + \@esphack + } +\font \manual = manfnt \scan_stop: +\cs_gset_nopar:Npn \dbend { {\manual\char127} } +\newenvironment {danger} + { + \begin{trivlist}\item[]\noindent + \begingroup\hangindent=2pc\hangafter=-2 + \cs_set_nopar:Npn \par{\endgraf\endgroup} + \hbox to0pt{\hskip-\hangindent\dbend\hfill}\ignorespaces + } + { + \par\end{trivlist} + } +\newenvironment {ddanger} + { + \begin{trivlist}\item[]\noindent + \begingroup\hangindent=3.5pc\hangafter=-2 + \cs_set_nopar:Npn \par{\endgraf\endgroup} + \hbox to0pt{\hskip-\hangindent\dbend\kern2pt\dbend\hfill}\ignorespaces + }{ + \par\end{trivlist} + } +\newenvironment{TemplateInterfaceDescription}[1] + { + \subsection{The~object~type~`#1'} + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par} + \def\TemplateSemantics + { + \enddescription\endgroup + \subsubsection*{Semantics:} + } + } + { + \par\bigskip + } +\newenvironment{TemplateDescription}[2] + { + \subsection{The~template~`#2'~(object~type~#1)} + \subsubsection*{Attributes:} + \begingroup + \@beginparpenalty\@M + \description + \def\TemplateKey##1##2##3##4 + { + \item[##1~(##2)]##3% + \ifx\TemplateKey##4\TemplateKey\else + \hfill\penalty500\hbox{}\hfill Default:~##4% + \nobreak\hskip-\parfillskip\hskip0pt\relax + \fi + \par + } + \def\TemplateSemantics + { + \enddescription\endgroup + \subsubsection*{Semantics~\&~Comments:} + } + } + { \par \bigskip } +\newenvironment{InstanceDescription}[4][xxxxxxxxxxxxxxx] + { + \subsubsection{The~instance~`#3'~(template~#2/#4)} + \subsubsection*{Attribute~values:} + \begingroup + \@beginparpenalty\@M + \def\InstanceKey##1##2{\>\textbf{##1}\>##2\\} + \def\InstanceSemantics{\endtabbing\endgroup + \vskip-30pt\vskip0pt + \subsubsection*{Layout~description~\&~Comments:}} + \tabbing + xxxx\=#1\=\kill + } + { \par \bigskip } +\DeclareDocumentCommand \OnlyDescription { } + { \bool_gset_false:N \g__codedoc_typeset_implementation_bool } +\DeclareDocumentCommand \AlsoImplementation { } + { \bool_gset_true:N \g__codedoc_typeset_implementation_bool } +\DeclareDocumentCommand \StopEventually { m } + { + \bool_if:NTF \g__codedoc_typeset_implementation_bool + { + \@bsphack + \tl_gset:Nn \g__codedoc_finale_tl { #1 \check@checksum } + \init@checksum + \@esphack + } + { #1 \endinput } + } +\DeclareDocumentCommand \Finale { } + { \tl_use:N \g__codedoc_finale_tl } +\tl_new:N \g__codedoc_finale_tl +\cs_new_protected:Npn \__codedoc_input:n #1 + { + \tl_gclear:N \g__codedoc_module_name_tl + \MakePercentIgnore + \input{#1} + \MakePercentComment + } +\DeclareDocumentCommand \DocInput { m } + { + \clist_map_inline:nn {#1} + { + \clist_put_right:Nn \g_docinput_clist {##1} + \__codedoc_input:n {##1} + } + } +\DeclareDocumentCommand \DocInputAgain { } + { \clist_map_function:NN \g_docinput_clist \__codedoc_input:n } +\NewDocumentCommand \DocInclude { m } + { + \relax\clearpage + \docincludeaux + \IfFileExists{#1.fdd} + { \cs_set_nopar:Npn \currentfile{#1.fdd} } + { \cs_set_nopar:Npn \currentfile{#1.dtx} } + \int_compare:nNnTF \@auxout = \@partaux + { \@latexerr{\string\include\space cannot~be~nested}\@eha } + { \@docinclude #1 } + } +\cs_gset:Npn \@docinclude #1 + { + \clearpage + \immediate\write\@mainaux{\string\@input{#1.aux}} + \@tempswatrue + \if@partsw + \@tempswafalse + \cs_set_nopar:Npx \@tempb{#1} + \@for\@tempa:=\@partlist\do + { + \ifx\@tempa\@tempb\@tempswatrue\fi + } + \fi + \if@tempswa + \cs_set_eq:NN \@auxout \@partaux + \immediate\openout\@partaux #1.aux + \immediate\write\@partaux{\relax} + \cs_set_eq:NN \@ltxdoc@PrintIndex \PrintIndex + \cs_set_eq:NN \PrintIndex \relax + \cs_set_eq:NN \@ltxdoc@PrintChanges \PrintChanges + \cs_set_eq:NN \PrintChanges \relax + \cs_set_eq:NN \@ltxdoc@theglossary \theglossary + \cs_set_eq:NN \@ltxdoc@endtheglossary \endtheglossary + \part{\currentfile} + { + \cs_set_eq:NN \ttfamily\relax + \cs_gset_nopar:Npx \filekey + { \filekey, \thepart = { \ttfamily \currentfile } } + } + \DocInput{\currentfile} + \cs_set_eq:NN \PrintIndex \@ltxdoc@PrintIndex + \cs_set_eq:NN \PrintChanges \@ltxdoc@PrintChanges + \cs_set_eq:NN \theglossary \@ltxdoc@theglossary + \cs_set_eq:NN \endtheglossary \@ltxdoc@endtheglossary + \clearpage + \@writeckpt{#1} + \immediate \closeout \@partaux + \else + \@nameuse{cp@#1} + \fi + \cs_set_eq:NN \@auxout \@mainaux + } +\cs_gset:Npn \codeline@wrindex #1 + { + \immediate\write\@indexfile + { + \string\indexentry{#1} + { \filesep \int_use:N \c@CodelineNo } + } + } +\tl_gclear:N \filesep +\cs_gset_nopar:Npn \docincludeaux + { + \tl_set:Nn \thepart { \alphalph { part } } + \tl_set:Nn \filesep { \thepart - } + \cs_set_eq:NN \filekey \use_none:n + \tl_gput_right:Nn \index@prologue + { + \cs_gset_nopar:Npn \@oddfoot + { + \parbox { \textwidth } + { + \strut \footnotesize + \raggedright { \bfseries File~Key: } ~ \filekey + } + } + \cs_set_eq:NN \@evenfoot \@oddfoot + } + \cs_gset_eq:NN \docincludeaux \relax + \cs_gset_nopar:Npn \@oddfoot + { + \cs_if_exist:cTF { ver @ \currentfile } + { File~\thepart :~{\ttfamily\currentfile}~ } + { + \GetFileInfo{\currentfile} + File~\thepart :~{\ttfamily\filename}~ + Date:~\ExplFileDate\ % space + Version~\ExplFileVersion + } + \hfill \thepage + } + \cs_set_eq:NN \@evenfoot \@oddfoot + } \group_begin: \char_set_catcode_escape:N \/ \char_set_catcode_other:N \^^A @@ -1007,457 +1410,371 @@ \char_set_lccode:nn { `\^^L } { `\{ } \char_set_lccode:nn { `\^^R } { `\} } \tl_to_lowercase:n - { - \group_end: - \cs_set_protected:Npn \xmacro@code - #1 ^^A ^^S^^S^^S^^S ^^Bend ^^Lmacrocode^^R - { \__codedoc_xmacro_code:n {#1} /end{macrocode} } - } + { + \group_end: + \cs_set_protected:Npn \xmacro@code + #1 ^^A ^^S^^S^^S^^S ^^Bend ^^Lmacrocode^^R + { \__codedoc_xmacro_code:n {#1} /end{macrocode} } + } \group_begin: \char_set_catcode_active:N \< \char_set_catcode_active:N \> \cs_new_protected:Npn \__codedoc_xmacro_code:n #1 - { - \tl_if_in:nnTF {#1} { < @ @ = } - { \__codedoc_xmacro_code:w #1 \q_stop } - { + { + \tl_if_in:nnTF {#1} { < @ @ = } + { \__codedoc_xmacro_code:w #1 \q_stop } + { + \tl_set:Nn \l__codedoc_tmpa_tl {#1} + \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl + \tl_use:N \l__codedoc_tmpa_tl + } + } + \cs_new_protected:Npn \__codedoc_xmacro_code:w #1 < @ @ = #2 > #3 \q_stop + { \tl_set:Nn \l__codedoc_tmpa_tl {#1} \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl - \tl_use:N \l__codedoc_tmpa_tl - } - } - \cs_new_protected:Npn \__codedoc_xmacro_code:w #1 < @ @ = #2 > #3 \q_stop - { - \tl_set:Nn \l__codedoc_tmpa_tl {#1} - \__codedoc_replace_at_at:N \l__codedoc_tmpa_tl - \tl_gset:Nn \g__codedoc_module_name_tl {#2} - \tl_put_right:Nn \l__codedoc_tmpa_tl { < @ @ = #2 > } + \tl_gset:Nn \g__codedoc_module_name_tl {#2} + \tl_put_right:Nn \l__codedoc_tmpa_tl { < @ @ = #2 > } - \tl_set:Nn \l__codedoc_tmpb_tl {#3} - \__codedoc_replace_at_at:N \l__codedoc_tmpb_tl - \tl_put_right:No \l__codedoc_tmpa_tl { \l__codedoc_tmpb_tl } + \tl_set:Nn \l__codedoc_tmpb_tl {#3} + \__codedoc_replace_at_at:N \l__codedoc_tmpb_tl + \tl_put_right:No \l__codedoc_tmpa_tl { \l__codedoc_tmpb_tl } - \tl_use:N \l__codedoc_tmpa_tl - } + \tl_use:N \l__codedoc_tmpa_tl + } \group_end: -\newcommand*{\DescribeOption} - { - \leavevmode - \@bsphack - \begingroup - \MakePrivateLetters - \Describe@Option - } -\newcommand*{\Describe@Option}[1] - { - \endgroup - \marginpar{ - \raggedleft - \PrintDescribeEnv{#1} - } - \SpecialOptionIndex{#1} - \@esphack - \ignorespaces - } -\newcommand*{\SpecialOptionIndex}[1] - { - \@bsphack - \begingroup - \HD@target - \let\HDorg@encapchar\encapchar - \edef\encapchar usage - { - \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage} - } - \index - { - #1\actualchar{\protect\ttfamily#1}~(option) - \encapchar usage - } - \index - { - options:\levelchar#1\actualchar{\protect\ttfamily#1} - \encapchar usage - } - \endgroup - \@esphack - } -\font\manual=manfnt -\cs_set_nopar:Npn \dbend { {\manual\char127} } -\newenvironment {danger} - { - \begin{trivlist}\item[]\noindent - \begingroup\hangindent=2pc\hangafter=-2 - \cs_set_nopar:Npn \par{\endgraf\endgroup} - \hbox to0pt{\hskip-\hangindent\dbend\hfill}\ignorespaces - } - { - \par\end{trivlist} - } -\newenvironment {ddanger} - { - \begin{trivlist}\item[]\noindent - \begingroup\hangindent=3.5pc\hangafter=-2 - \cs_set_nopar:Npn \par{\endgraf\endgroup} - \hbox to0pt{\hskip-\hangindent\dbend\kern2pt\dbend\hfill}\ignorespaces - }{ - \par\end{trivlist} - } -\newenvironment{TemplateInterfaceDescription}[1] - { - \subsection{The~object~type~`#1'} - \begingroup - \@beginparpenalty\@M - \description - \def\TemplateArgument##1##2{\item[Arg:~##1]##2\par} - \def\TemplateSemantics - { - \enddescription\endgroup - \subsubsection*{Semantics:} - } - } - { - \par\bigskip - } -\newenvironment{TemplateDescription}[2] +\iow_new:N \g__codedoc_func_iow +\tl_new:N \l__codedoc_doc_def_tl +\tl_new:N \l__codedoc_doc_undef_tl +\tl_new:N \l__codedoc_undoc_def_tl +\cs_new_protected_nopar:Npn \__codedoc_show_functions_defined: { - \subsection{The~template~`#2'~(object~type~#1)} - \subsubsection*{Attributes:} - \begingroup - \@beginparpenalty\@M - \description - \def\TemplateKey##1##2##3##4 - { - \item[##1~(##2)]##3% - \ifx\TemplateKey##4\TemplateKey\else - \hfill\penalty500\hbox{}\hfill Default:~##4% - \nobreak\hskip-\parfillskip\hskip0pt\relax - \fi - \par - } - \def\TemplateSemantics - { - \enddescription\endgroup - \subsubsection*{Semantics~\&~Comments:} - } + \bool_if:nT + { \g__codedoc_typeset_implementation_bool && \g__codedoc_checkfunc_bool } + { + \iow_term:x { \c__codedoc_iow_separator_tl \iow_newline: } + \iow_open:Nn \g__codedoc_func_iow { \c_job_name_tl .cmds } + + \tl_clear:N \l__codedoc_doc_def_tl + \tl_clear:N \l__codedoc_doc_undef_tl + \tl_clear:N \l__codedoc_undoc_def_tl + \seq_map_inline:Nn \g_doc_functions_seq + { + \seq_if_in:NnTF \g_doc_macros_seq {##1} + { + \tl_put_right:Nx \l__codedoc_doc_def_tl + { ##1 \iow_newline: } + \iow_now:Nn \g__codedoc_func_iow { > ~ ##1 } + } + { + \tl_put_right:Nx \l__codedoc_doc_undef_tl + { ##1 \iow_newline: } + \iow_now:Nn \g__codedoc_func_iow { ! ~ ##1 } + } + } + \seq_map_inline:Nn \g_doc_macros_seq + { + \seq_if_in:NnF \g_doc_functions_seq {##1} + { + \tl_put_right:Nx \l__codedoc_undoc_def_tl + { ##1 \iow_newline: } + \iow_now:Nn \g__codedoc_func_iow { ? ~ ##1 } + } + } + \__codedoc_functions_typeout:nN + { + Functions~both~documented~and~defined: \iow_newline: + (In~order~of~being~documented) + } + \l__codedoc_doc_def_tl + \__codedoc_functions_typeout:nN + { Functions~documented~but~not~defined: } + \l__codedoc_doc_undef_tl + \__codedoc_functions_typeout:nN + { Functions~defined~but~not~documented: } + \l__codedoc_undoc_def_tl + + \iow_close:N \g__codedoc_func_iow + \iow_term:x { \c__codedoc_iow_separator_tl } + } } - {\par\bigskip} -\newenvironment{InstanceDescription}[4][xxxxxxxxxxxxxxx] +\AtEndDocument { \__codedoc_show_functions_defined: } +\cs_new_protected:Npn \__codedoc_functions_typeout:nN #1#2 + { + \tl_if_empty:NF #2 + { + \typeout + { + \c__codedoc_iow_midrule_tl \iow_newline: + #1 \iow_newline: + \c__codedoc_iow_midrule_tl \iow_newline: + #2 + } + \tl_clear:N #2 + } + } +\cs_new_protected_nopar:Npn \__codedoc_show_not_tested: + { + \bool_if:NT \g__codedoc_checktest_bool + { + \tl_clear:N \l__codedoc_tmpa_tl + \prop_if_empty:NF \g__codedoc_missing_tests_prop + { + \cs_set:Npn \__codedoc_tmpa:w ##1##2 + { + \iow_newline: + \space\space\space\space \exp_not:n {##1} + \clist_map_function:nN {##2} \__codedoc_tmpb:w + } + \cs_set:Npn \__codedoc_tmpb:w ##1 + { + \iow_newline: + \space\space\space\space\space\space * ~ ##1 + } + \tl_put_right:Nx \l__codedoc_tmpa_tl + { + \iow_newline: \iow_newline: + The~ following~ macro(s)~ have~ incomplete~ tests: + \iow_newline: + \prop_map_function:NN + \g__codedoc_missing_tests_prop \__codedoc_tmpa:w + } + } + \seq_if_empty:NF \g__codedoc_not_tested_seq + { + \cs_set:Npn \__codedoc_tmpa:w ##1 + { \clist_map_function:nN {##1} \__codedoc_tmpb:w } + \cs_set:Npn \__codedoc_tmpb:w ##1 + { + \iow_newline: + \space\space\space\space ##1 + } + \tl_put_right:Nx \l__codedoc_tmpa_tl + { + \iow_newline: + \iow_newline: + The~ following~ macro(s)~ do~ not~ have~ any~ tests: + \iow_newline: + \seq_map_function:NN + \g__codedoc_not_tested_seq \__codedoc_tmpa:w + } + } + \tl_if_empty:NF \l__codedoc_tmpa_tl + { + \int_set:Nn \l__codedoc_tmpa_int { \etex_interactionmode:D } + \errorstopmode + \ClassError { l3doc } { \l__codedoc_tmpa_tl } { } + \int_set:Nn \etex_interactionmode:D { \l__codedoc_tmpa_int } + } + } + } +\AtEndDocument { \__codedoc_show_not_tested: } +\g@addto@macro \theindex { \MakePrivateLetters } +\cs_gset:Npn \verbatimchar {&} +\setcounter { IndexColumns } { 2 } +\IndexPrologue + { + \part*{Index} + \markboth{Index}{Index} + \addcontentsline{toc}{part}{Index} + The~italic~numbers~denote~the~pages~where~the~ + corresponding~entry~is~described,~ + numbers~underlined~point~to~the~definition,~ + all~others~indicate~the~places~where~it~is~used. + } +\cs_gset_protected:Npn \SpecialIndex #1 { - \subsubsection{The~instance~`#3'~(template~#2/#4)} - \subsubsection*{Attribute~values:} - \begingroup - \@beginparpenalty\@M - \def\InstanceKey##1##2{\>\textbf{##1}\>##2\\} - \def\InstanceSemantics{\endtabbing\endgroup - \vskip-30pt\vskip0pt - \subsubsection*{Layout~description~\&~Comments:}} - \tabbing - xxxx\=#1\=\kill - } - {\par\bigskip} -\cs_set_nopar:Npn \AlsoImplementation - { - \bool_set_true:N \g__codedoc_implementation_bool - \cs_set:Npn \StopEventually ##1 - { \@bsphack - \cs_gset_nopar:Npn \Finale { ##1 \check@checksum } - \init@checksum + \__codedoc_special_index:nn {#1} { } \@esphack - } - } -\AlsoImplementation -\cs_set_nopar:Npn \OnlyDescription - { - \@bsphack - \bool_set_false:N \g__codedoc_implementation_bool - \cs_set:Npn \StopEventually ##1 { ##1 \endinput } - \@esphack - } -\cs_set_eq:NN \Finale \relax -\cs_set_nopar:Npn \partname{File} -\cs_set:Npn \DocInput #1 - { - \clist_map_inline:nn {#1} - { - \clist_put_right:Nn \g_docinput_clist {##1} - \tl_gclear:N \g__codedoc_module_name_tl - \MakePercentIgnore - \input{##1} - \MakePercentComment - } - } -\cs_set:Npn \DocInputAgain - { - \clist_map_inline:Nn \g_docinput_clist - { - \MakePercentIgnore - \tl_gclear:N \g__codedoc_module_name_tl - \input{##1} - \MakePercentComment - } - } -\cs_set_nopar:Npn \partname{File} -\newcommand*{\DocInclude}[1] - { - \relax\clearpage - \docincludeaux - \IfFileExists{#1.fdd} - { \cs_set_nopar:Npn \currentfile{#1.fdd} } - { \cs_set_nopar:Npn \currentfile{#1.dtx} } - \ifnum\@auxout=\@partaux - \@latexerr{\string\include\space cannot~be~nested}\@eha - \else - \@docinclude #1 - \fi - } -\cs_set_nopar:Npn \@docinclude #1 - { - \clearpage - \immediate\write\@mainaux{\string\@input{#1.aux}} - \@tempswatrue - \if@partsw - \@tempswafalse - \cs_set_nopar:Npx \@tempb{#1} - \@for\@tempa:=\@partlist\do - { - \ifx\@tempa\@tempb\@tempswatrue\fi - } - \fi - \if@tempswa - \cs_set_eq:NN \@auxout\@partaux - \immediate\openout\@partaux #1.aux - \immediate\write\@partaux{\relax} - \cs_set_eq:NN \@ltxdoc@PrintIndex\PrintIndex - \cs_set_eq:NN \PrintIndex\relax - \cs_set_eq:NN \@ltxdoc@PrintChanges\PrintChanges - \cs_set_eq:NN \PrintChanges\relax - \cs_set_eq:NN \@ltxdoc@theglossary\theglossary - \cs_set_eq:NN \@ltxdoc@endtheglossary\endtheglossary - \part{\currentfile} - { - \cs_set_eq:NN \ttfamily\relax - \cs_gset_nopar:Npx \filekey{\filekey, \thepart={\ttfamily\currentfile}} - } - \DocInput{\currentfile} - \cs_set_eq:NN \PrintIndex\@ltxdoc@PrintIndex - \cs_set_eq:NN \PrintChanges\@ltxdoc@PrintChanges - \cs_set_eq:NN \theglossary\@ltxdoc@theglossary - \cs_set_eq:NN \endtheglossary\@ltxdoc@endtheglossary - \clearpage - \@writeckpt{#1} - \immediate\closeout\@partaux - \else - \@nameuse{cp@#1} - \fi - \cs_set_eq:NN \@auxout\@mainaux - } -\cs_gset_nopar:Npn \codeline@wrindex #1 - { - \immediate\write\@indexfile - { - \string\indexentry{#1} - { \filesep \int_use:N \c@CodelineNo } - } - } -\cs_set_eq:NN \filesep \@empty -\cs_set_nopar:Npn \docincludeaux - { - \cs_set_nopar:Npn \thepart {\alphalph{part}} - \cs_set_nopar:Npn \filesep {\thepart-} - \cs_set_eq:NN \filekey\@gobble - \g@addto@macro\index@prologue - { - \cs_gset_nopar:Npn\@oddfoot - { - \parbox{\textwidth} - { - \strut\footnotesize - \raggedright{\bfseries File~Key:}~\filekey - } - } - \cs_set_eq:NN \@evenfoot\@oddfoot - } - \cs_gset_eq:NN \docincludeaux\relax - \cs_gset_nopar:Npn\@oddfoot - { - \expandafter\ifx\csname ver@\currentfile\endcsname\relax - File~\thepart :~{\ttfamily\currentfile}~ - \else - \GetFileInfo{\currentfile} - File~\thepart :~{\ttfamily\filename}~ - Date:~\ExplFileDate\ % space - Version~\ExplFileVersion - \fi - \hfill\thepage - } - \cs_set_eq:NN \@evenfoot \@oddfoot - } -\iow_new:N \g__codedoc_func_iow -\cs_new_nopar:Npn \__codedoc_show_functions_defined: - { - \bool_if:nT { \g__codedoc_implementation_bool && \g__codedoc_checkfunc_bool } - { - \typeout{ ======================================== ^^J } - \iow_open:Nn \g__codedoc_func_iow { \c_job_name_tl .cmds } - - \tl_clear:N \l__codedoc_tmpa_tl - \seq_map_inline:Nn \g_doc_functions_seq - { - \seq_if_in:NnT \g_doc_macros_seq {##1} - { - \tl_put_right:Nn \l__codedoc_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g__codedoc_func_iow { > ~ ##1 } - } - } - - \__codedoc_functions_typeout:n - { - Functions~both~documented~and~defined:^^J - (In~order~of~being~documented) - } - - \seq_map_inline:Nn \g_doc_functions_seq - { - \seq_if_in:NnF \g_doc_macros_seq {##1} - { - \tl_put_right:Nn \l__codedoc_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g__codedoc_func_iow { ! ~ ##1} - } - } - \__codedoc_functions_typeout:n { Functions~documented~but~not~defined: } - - \seq_map_inline:Nn \g_doc_macros_seq - { - \seq_if_in:NnF \g_doc_functions_seq {##1} - { - \tl_put_right:Nn \l__codedoc_tmpa_tl { ##1 ^^J } - \iow_now:Nn \g__codedoc_func_iow { ? ~ ##1} - } - } - \__codedoc_functions_typeout:n { Functions~defined~but~not~documented: } - - \iow_close:N \g__codedoc_func_iow - \typeout{ ======================================== } - } -} -\AtEndDocument{ \__codedoc_show_functions_defined: } -\cs_set_nopar:Npn \__codedoc_functions_typeout:n #1 - { - \tl_if_empty:NF \l__codedoc_tmpa_tl - { - \typeout - { - -------------------------------------- ^^J #1 ^^J - -------------------------------------- ^^J \l__codedoc_tmpa_tl - } - \tl_clear:N \l__codedoc_tmpa_tl - } - } -\cs_new:Npn \__codedoc_show_not_tested: - { - \bool_if:NT \g__codedoc_checktest_bool - { - \bool_if:nT { !(\seq_if_empty_p:N \g__codedoc_not_tested_seq) || - !(\prop_if_empty_p:N \g__codedoc_missing_tests_prop) } - { - \tl_clear:N \l__codedoc_tmpa_tl - \prop_if_empty:NF \g__codedoc_missing_tests_prop - { - \tl_put_right:Nn \l__codedoc_tmpa_tl - { - ^^J^^JThe~ following~ macro(s)~ have~ incomplete~ tests:^^J - } - \prop_map_inline:Nn \g__codedoc_missing_tests_prop - { - \tl_put_right:Nn \l__codedoc_tmpa_tl - {^^J\space\space\space\space ##1 - ^^J\space\space\space\space\space\space ##2} - } - } - \seq_if_empty:NF \g__codedoc_not_tested_seq - { - \tl_put_right:Nn \l__codedoc_tmpa_tl - { - ^^J^^J - The~ following~ macro(s)~ do~ not~ have~ any~ tests:^^J - } - \seq_map_inline:Nn \g__codedoc_not_tested_seq - { - \clist_map_inline:nn {##1} - { - \tl_put_right:Nn \l__codedoc_tmpa_tl {^^J\space\space\space\space ####1} - } - } - \int_set:Nn \l_tmpa_int {\etex_interactionmode:D} - \errorstopmode - \ClassError{l3doc}{\l__codedoc_tmpa_tl}{} - \int_set:Nn \etex_interactionmode:D {\l_tmpa_int} - } - } - } - } -\AtEndDocument{ \__codedoc_show_not_tested: } -\g@addto@macro\theindex{\MakePrivateLetters} -\cs_set:Npn \verbatimchar {&} -\setcounter{IndexColumns}{2} -\IndexPrologue - { - \part*{Index} - \markboth{Index}{Index} - \addcontentsline{toc}{part}{Index} - The~italic~numbers~denote~the~pages~where~the~ - corresponding~entry~is~described,~ - numbers~underlined~point~to~the~definition,~ - all~others~indicate~the~places~where~it~is~used. - } - -\cs_set_nopar:Npn \__codedoc_special_main_index:n #1 - { - \HD@target - \index - { - \@gobble#1 - \actualchar - \string\verb\quotechar*\verbatimchar#1\verbatimchar - \encapchar - hdclindex{\the\c@HD@hypercount}{usage} - } - } -\cs_generate_variant:Nn \__codedoc_special_main_index:n { o , x } -\msg_new:nnn {l3doc} {print-index-howto} - { - Generate~the~index~by~executing\\ - \iow_indent:n { makeindex~-s~gind.ist~-o~\c_job_name_tl .ind~\c_job_name_tl .idx } - } -\tl_gput_right:Nn \PrintIndex { \AtEndDocument{ \msg_info:nn {l3doc} {print-index-howto} } } + } +\msg_new:nnn { l3doc } { print-index-howto } + { + Generate~the~index~by~executing\\ + \iow_indent:n + { makeindex~-s~gind.ist~-o~\c_job_name_tl.ind~\c_job_name_tl.idx } + } +\tl_gput_right:Nn \PrintIndex + { \AtEndDocument { \msg_info:nn { l3doc } { print-index-howto } } } +\cs_gset_protected:Npn \it@is@a #1 + { + \use:x + { + \__codedoc_special_index_module:nnnn + { \quotechar #1 } + { \quotechar \bslash \quotechar #1 } + { } + { } + } + } +\cs_new_protected:Npn \__codedoc_special_index:nn #1#2 + { + \__codedoc_key_get:n {#1} + \__codedoc_special_index_module:ooon + { \l__codedoc_index_key_tl } + { \l__codedoc_index_macro_tl } + { \l__codedoc_index_module_tl } + {#2} + } +\cs_generate_variant:Nn \__codedoc_special_index:nn { o } +\tl_new:N \l__codedoc_index_escaped_macro_tl +\cs_new_protected:Npn \__codedoc_special_index_module:nnnn #1#2#3#4 + { + \use:x + { + \exp_not:n { \__codedoc_special_index_aux:nnnnn {#1} {#2} } + \str_case_x:nnF {#3} + { + { } { { } { } } + { TeX } + { + { TeX~and~LaTeX2e~commands } + { \string\TeX{}~and~\string\LaTeXe{}~commands: } + } + } + { { #3~commands } { \string\pkg{#3}~commands: } } + } + {#4} + } +\cs_generate_variant:Nn \__codedoc_special_index_module:nnnn { ooo } +\cs_new_protected:Npn \__codedoc_special_index_aux:nnnnn #1#2#3#4#5 + { + \HD@target + \__codedoc_special_index_set:Nn \l__codedoc_index_escaped_macro_tl {#2} + \index + { + \tl_if_empty:nF { #3 #4 } + { #3 \actualchar #4 \levelchar } + #1 + \actualchar + { + \token_to_str:N \verbatim@font \c_space_tl + \l__codedoc_index_escaped_macro_tl + } + \encapchar + hdclindex{\the\c@HD@hypercount}{#5} + } + } +\cs_generate_variant:Nn \__codedoc_special_index_aux:nnnnn { o } +\cs_new_protected:Npn \__codedoc_special_index_set:Nn #1#2 + { + \tl_set:Nx #1 { \tl_to_str:n {#2} } + \int_compare:nNnTF { \tl_count:n {#2} } < { \tl_count:N #1 } + { + \tl_set:Nn #1 {#2} + \tl_replace_all:Non #1 + { \c__codedoc_backslash_tl } + { \token_to_str:N \bslash \c_space_tl } + } + { + \exp_args:Nx \tl_map_inline:nn + { \tl_to_str:N \verbatimchar \token_to_str:N _ } + { + \tl_replace_all:Nnn #1 {##1} + { + \verbatimchar \c__codedoc_backslash_tl ##1 + \token_to_str:N \verb \quotechar * \verbatimchar + } + } + \tl_map_inline:nn { \actualchar \encapchar \levelchar } + { + \tl_replace_all:Nxn #1 + { \tl_to_str:N ##1 } { \quotechar \tl_to_str:N ##1 } + } + \tl_set:Nx #1 + { + \token_to_str:N \verb \quotechar * \verbatimchar + #1 \verbatimchar + } + } + } +\cs_new_protected:Npn \__codedoc_key_get:n #1 + { + \tl_set:Nn \l__codedoc_index_macro_tl {#1} + \tl_set:Nx \l__codedoc_index_key_tl { \tl_to_str:n {#1} } + \tl_clear:N \l__codedoc_index_module_tl + \tl_if_head_eq_charcode:oNT + { \l__codedoc_index_key_tl } \c__codedoc_backslash_token + { \__codedoc_key_pop: } + \tl_if_in:NoTF \l__codedoc_index_key_tl { \token_to_str:N : } + { \__codedoc_key_expl: } + { + \tl_if_in:NoTF \l__codedoc_index_key_tl { \token_to_str:N _ } + { \__codedoc_key_expl: } + { + \tl_if_in:NoT \l__codedoc_index_key_tl { \token_to_str:N @ } + { \tl_set:Nn \l__codedoc_index_module_tl { TeX } } + } + } + } +\cs_new_protected_nopar:Npn \__codedoc_key_pop: + { + \tl_set:Nx \l__codedoc_index_key_tl + { \tl_tail:N \l__codedoc_index_key_tl } + } +\cs_new_protected_nopar:Npn \__codedoc_key_expl: + { + \tl_if_head_eq_charcode:oNTF { \l__codedoc_index_key_tl } . + { \__codedoc_key_pop: } + { + \exp_args:Nx \tl_if_head_eq_charcode:nNT + { \exp_args:No \str_tail:n \l__codedoc_index_key_tl } _ + { + \tl_if_head_eq_charcode:oNTF { \l__codedoc_index_key_tl } _ + { + \__codedoc_key_pop: + \__codedoc_key_pop: + } + { + \__codedoc_key_pop: + \__codedoc_key_pop: + \tl_if_head_eq_charcode:oNT { \l__codedoc_index_key_tl } _ + { \__codedoc_key_pop: } + } + } + } + \__codedoc_key_get_module: + } +\cs_new_protected_nopar:Npn \__codedoc_key_get_module: + { + \tl_set_eq:NN \l__codedoc_index_module_tl \l__codedoc_index_key_tl + \exp_args:No \__codedoc_key_get_module_aux:n { \token_to_str:N : } + \exp_args:No \__codedoc_key_get_module_aux:n { \token_to_str:N _ } + } +\cs_new_protected:Npn \__codedoc_key_get_module_aux:n #1 + { + \cs_set:Npn \__codedoc_tmpa:w ##1 #1 ##2 \q_stop { \exp_not:n {##1} } + \tl_set:Nx \l__codedoc_index_module_tl + { \exp_after:wN \__codedoc_tmpa:w \l__codedoc_index_module_tl #1 \q_stop } + } \GlossaryPrologue - { - \part*{Change~History} - {\GlossaryParms\ttfamily\hyphenchar\font=`\-} - \markboth{Change~History}{Change~History} - \addcontentsline{toc}{part}{Change~History} - } -\msg_new:nnn {l3doc} {print-changes-howto} - { - Generate~the~change~list~by~executing\\ - \iow_indent:n { makeindex~-s~gglo.ist~-o~\c_job_name_tl .gls~\c_job_name_tl .glo } - } -\tl_gput_right:Nn \PrintChanges { \AtEndDocument{ \msg_info:nn {l3doc} {print-changes-howto} } } -\bool_if:NTF \g__codedoc_full_bool - { - \RecordChanges - \CodelineIndex - \EnableCrossrefs - \AlsoImplementation - } - { - \CodelineNumbered - \DisableCrossrefs - \OnlyDescription - } + { + \part*{Change~History} + {\GlossaryParms\ttfamily\hyphenchar\font=`\-} + \markboth{Change~History}{Change~History} + \addcontentsline{toc}{part}{Change~History} + } +\msg_new:nnn { l3doc } { print-changes-howto } + { + Generate~the~change~list~by~executing\\ + \iow_indent:n + { makeindex~-s~gglo.ist~-o~\c_job_name_tl.gls~\c_job_name_tl.glo } + } +\tl_gput_right:Nn \PrintChanges + { \AtEndDocument { \msg_info:nn { l3doc } { print-changes-howto } } } +\bool_if:NTF \g__codedoc_typeset_implementation_bool + { + \RecordChanges + \CodelineIndex + \EnableCrossrefs + \AlsoImplementation + } + { + \CodelineNumbered + \DisableCrossrefs + \OnlyDescription + } %% %% %% End of file `l3doc.cls'. diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def index 39085843be6..fdceac1a81e 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvipdfmx.def @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3drivers.dtx 5203 2014-07-15 08:59:02Z joseph $ +\GetIdInfo$Id: l3drivers.dtx 5308 2014-08-20 01:22:39Z bruno $ {L3 Experimental drivers} \ProvidesExplFile {l3dvidpfmx.def}{\ExplFileDate}{\ExplFileVersion} diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def index dd81247dddc..8b55e3715fd 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3dvips.def @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3drivers.dtx 5203 2014-07-15 08:59:02Z joseph $ +\GetIdInfo$Id: l3drivers.dtx 5308 2014-08-20 01:22:39Z bruno $ {L3 Experimental drivers} \ProvidesExplFile {l3dvips.def}{\ExplFileDate}{\ExplFileVersion} diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def index 2f90a67e3a0..0e1f866ebeb 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3pdfmode.def @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3drivers.dtx 5203 2014-07-15 08:59:02Z joseph $ +\GetIdInfo$Id: l3drivers.dtx 5308 2014-08-20 01:22:39Z bruno $ {L3 Experimental drivers} \ProvidesExplFile {l3pdfmode.def}{\ExplFileDate}{\ExplFileVersion} diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def b/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def index 6d5625134b3..203ab7da3c4 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3unicode-data.def @@ -1,4 +1,4 @@ -\ProvidesExplFile {l3unicode-data.def} {2014/06/30} {5166} {L3 Unicode data} +\ProvidesExplFile {l3unicode-data.def} {2014/08/12} {5276} {L3 Unicode data} \clist_const:Nn \c__tl_after_final_sigma_clist { 0021 , 0022 , 0029 , 002C , 002E , 003A , 003B , 003F , 005D , 007D } \clist_const:Nn \c__tl_mixed_skip_clist @@ -17,10 +17,10 @@ } \cs_set_protected:Npn \__unicode_tmp:NNNNNNN #1#2#3#4#5#6#7 { - \tl_const:cx { c__str_fold_ #1 _ #2 _ tl } + \tl_const:cx { c__str_fold_ #1 _X_ #2 _ tl } { \tl_to_str:n { #6#7 } } - \tl_const:cn { c__tl_lower_ #1 _ #2 _ tl } { #6#7 } - \tl_const:cn { c__tl_upper_ #4 _ #5 _ tl } { #7#6 } + \tl_const:cn { c__tl_lower_ #1 _X_ #2 _ tl } { #6#7 } + \tl_const:cn { c__tl_upper_ #4 _X_ #5 _ tl } { #7#6 } } \__unicode_tmp:NN AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz @@ -30,17 +30,17 @@ { \int_step_inline:nnnn { 0 } { 1 } { 9 } { - \tl_if_exist:cF { c__str_fold_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__str_fold_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__str_fold_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__str_fold_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_lower_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_lower_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_lower_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_lower_ #1 _X_ ##1 _ tl } { } } - \tl_if_exist:cF { c__tl_upper_ #1 _ ##1 _ tl } + \tl_if_exist:cF { c__tl_upper_ #1 _X_ ##1 _ tl } { - \tl_const:cn { c__tl_upper_ #1 _ ##1 _ tl } { } + \tl_const:cn { c__tl_upper_ #1 _X_ ##1 _ tl } { } } } } @@ -53,10 +53,217 @@ \tl_const:Nn \c__tl_dotted_I_tl { i } \tex_endinput:D } +\tl_const:cn { c__tl_upper_0_X_0_tl } { dDьЬոՈὀὈᾤ{ὬΙ}ⳬⳫ𐐨𐐀𑣜𑢼 } +\tl_const:cn { c__tl_upper_0_X_1_tl } { eEĭĬǵǴəƏϩϨэЭұҰԕԔչՉḕḔṹṸờỜὁὉᾥ{ὭΙ}ⲉⲈꙩꙨ𐐩𐐁𑣝𑢽 } +\tl_const:cn { c__tl_upper_0_X_2_tl } { fFƒƑюЮպՊὂὊᾦ{ὮΙ}ⳮⳭ𐐪𐐂𑣞𑢾 } +\tl_const:cn { c__tl_upper_0_X_3_tl } { gGįĮɛƐϫϪяЯҳҲԗԖջՋḗḖṻṺởỞὃὋᾧ{ὯΙ}ⲋⲊꙫꙪꜳꜲꞗꞖ𐐫𐐃𑣟𑢿 } +\tl_const:cn { c__tl_upper_0_X_4_tl } { hHɜꞫѐЀռՌὄὌ𐐬𐐄 } +\tl_const:cn { c__tl_upper_0_X_5_tl } { iIıIƕǶǹǸϭϬёЁҵҴԙԘսՍḙḘṽṼỡỠὅὍⲍⲌꙭꙬꜵꜴꞙꞘ𐐭𐐅 } +\tl_const:cn { c__tl_upper_0_X_6_tl } { jJђЂվՎ𐐮𐐆 } +\tl_const:cn { c__tl_upper_0_X_7_tl } { kK{ij}{IJ}ǻǺϯϮѓЃҷҶԛԚտՏḛḚṿṾợỢⲏⲎⳳⳲꜷꜶꞛꞚ𐐯𐐇 } +\tl_const:cn { c__tl_upper_0_X_8_tl } { lLɠƓϰΚєЄրՐ𐐰𐐈 } +\tl_const:cn { c__tl_upper_0_X_9_tl } { mMĵĴƙƘǽǼɡꞬϱΡѕЅҹҸԝԜցՑḝḜẁẀụỤⲑⲐꜹꜸꞝꞜ𐐱𐐉 } +\tl_const:cn { c__tl_upper_1_X_0_tl } { nNƚȽϲϹіІւՒ𐐲𐐊 } +\tl_const:cn { c__tl_upper_1_X_1_tl } { oOķĶǿǾɣƔϳͿїЇһҺԟԞփՓḟḞẃẂủỦⲓⲒꜻꜺꞟꞞ𐐳𐐋 } +\tl_const:cn { c__tl_upper_1_X_2_tl } { pPјЈքՔᾰᾸⰰⰀ𐐴𐐌 } +\tl_const:cn { c__tl_upper_1_X_3_tl } { qQȁȀɥꞍϵΕљЉҽҼԡԠօՕḡḠẅẄứỨᾱᾹⰱⰁⲕⲔꜽꜼꞡꞠ𐐵𐐍 } +\tl_const:cn { c__tl_upper_1_X_4_tl } { rRĺĹƞȠɦꞪњЊֆՖⰲⰂ𐐶𐐎 } +\tl_const:cn { c__tl_upper_1_X_5_tl } { sSȃȂћЋҿҾԣԢḣḢẇẆừỪᾳ{ΑΙ}ⰳⰃⲗⲖꜿꜾꞣꞢ𐐷𐐏 } +\tl_const:cn { c__tl_upper_1_X_6_tl } { tTļĻɨƗϸϷќЌⰴⰄ𐐸𐐐 } +\tl_const:cn { c__tl_upper_1_X_7_tl } { uUơƠȅȄɩƖѝЍԥԤḥḤẉẈửỬὑὙⰵⰅⲙⲘꝁꝀꞥꞤ𐐹𐐑 } +\tl_const:cn { c__tl_upper_1_X_8_tl } { vVľĽўЎӂӁⰶⰆ𐐺𐐒 } +\tl_const:cn { c__tl_upper_1_X_9_tl } { wWƣƢȇȆɫⱢϻϺџЏԧԦḧḦẋẊữỮὓὛⰷⰇⲛⲚꝃꝂꞧꞦ𐐻𐐓 } +\tl_const:cn { c__tl_upper_2_X_0_tl } { xX{ŀ}{Ŀ}ɬꞭӄӃⰸⰈⴀႠ𐐼𐐔 } +\tl_const:cn { c__tl_upper_2_X_1_tl } { yYƥƤȉȈѡѠԩԨḩḨẍẌựỰὕὝⰹⰉⲝⲜⴁႡꝅꝄꞩꞨ𐐽𐐕 } +\tl_const:cn { c__tl_upper_2_X_2_tl } { zZłŁӆӅⰺⰊⴂႢ𐐾𐐖 } +\tl_const:cn { c__tl_upper_2_X_3_tl } { ȋȊɯƜѣѢԫԪḫḪẏẎỳỲὗὟⰻⰋⲟⲞⴃႣꝇꝆ𐐿𐐗 } +\tl_const:cn { c__tl_upper_2_X_4_tl } { àÀńŃƨƧӈӇⓐⒶⰼⰌⴄႤ𐑀𐐘 } +\tl_const:cn { c__tl_upper_2_X_5_tl } { áÁȍȌɱⱮѥѤԭԬḭḬẑẐỵỴⓑⒷⰽⰍⲡⲠⴅႥꚁꚀꝉꝈ𐑁𐐙 } +\tl_const:cn { c__tl_upper_2_X_6_tl } { âÂņŅɲƝӊӉιΙⅎℲⓒⒸⰾⰎⴆႦ𐑂𐐚 } +\tl_const:cn { c__tl_upper_2_X_7_tl } { ãÃȏȎѧѦԯԮḯḮẓẒỷỶⓓⒹⰿⰏⲣⲢⴇႧꚃꚂꝋꝊ𐑃𐐛 } +\tl_const:cn { c__tl_upper_2_X_8_tl } { äÄňŇӌӋⓔⒺⱀⰐⴈႨ𐑄𐐜 } +\tl_const:cn { c__tl_upper_2_X_9_tl } { åÅƭƬȑȐɵƟѩѨḱḰẕẔỹỸⓕⒻⱁⰑⲥⲤⴉႩꚅꚄꝍꝌ𐑅𐐝 } +\tl_const:cn { c__tl_upper_3_X_0_tl } { æÆӎӍⓖⒼⱂⰒⴊႪ𐑆𐐞 } +\tl_const:cn { c__tl_upper_3_X_1_tl } { çÇŋŊȓȒѫѪӏӀḳḲỻỺῃ{ΗΙ}ⓗⒽⱃⰓⲧⲦⴋႫꚇꚆꝏꝎ𐑇𐐟 } +\tl_const:cn { c__tl_upper_3_X_2_tl } { èÈưƯὠὨⓘⒾⱄⰔⴌႬ𐑈𐐠 } +\tl_const:cn { c__tl_upper_3_X_3_tl } { éÉōŌȕȔѭѬӑӐḵḴỽỼὡὩⓙⒿⱅⰕⲩⲨⴍႭꚉꚈꝑꝐ𐑉𐐡 } +\tl_const:cn { c__tl_upper_3_X_4_tl } { êÊὢὪⓚⓀⱆⰖⴎႮ𐑊𐐢 } +\tl_const:cn { c__tl_upper_3_X_5_tl } { ëËŏŎȗȖѯѮӓӒḷḶẛṠỿỾὣὫⓛⓁⱇⰗⲫⲪⴏႯꚋꚊꝓꝒ𐑋𐐣 } +\tl_const:cn { c__tl_upper_3_X_6_tl } { ìÌƴƳἀἈὤὬⓜⓂⱈⰘⴐႰ𐑌𐐤 } +\tl_const:cn { c__tl_upper_3_X_7_tl } { íÍőŐșȘɽⱤͅΙѱѰӕӔḹḸἁἉὥὭⓝⓃⱉⰙⲭⲬⴑႱꚍꚌꝕꝔ𐑍𐐥 } +\tl_const:cn { c__tl_upper_3_X_8_tl } { îÎƶƵἂἊὦὮⓞⓄⱊⰚⴒႲ𐑎𐐦 } +\tl_const:cn { c__tl_upper_3_X_9_tl } { ïÏœŒțȚѳѲӗӖḻḺἃἋὧὯⓟⓅⱋⰛⲯⲮⴓႳꚏꚎꝗꝖ𐑏𐐧 } +\tl_const:cn { c__tl_upper_4_X_0_tl } { ðÐʀƦάΆἄἌⓠⓆⱌⰜⴔႴ } +\tl_const:cn { c__tl_upper_4_X_1_tl } { ñÑŕŔƹƸȝȜέΈѵѴәӘḽḼạẠἅἍⓡⓇⱍⰝⲱⲰⴕႵꚑꚐꝙꝘ } +\tl_const:cn { c__tl_upper_4_X_2_tl } { òÒήΉἆἎⓢⓈⱎⰞⴖႶ } +\tl_const:cn { c__tl_upper_4_X_3_tl } { óÓŗŖȟȞʃƩίΊѷѶӛӚḿḾảẢἇἏⓣⓉⱏⰟⲳⲲⴗႷꚓꚒꝛꝚ } +\tl_const:cn { c__tl_upper_4_X_4_tl } { ôÔῐῘⓤⓊⱐⰠⴘႸ } +\tl_const:cn { c__tl_upper_4_X_5_tl } { õÕřŘƽƼαΑѹѸӝӜᵹꝽṁṀấẤῑῙⓥⓋⱑⰡⲵⲴⴙႹꚕꚔꝝꝜaA } +\tl_const:cn { c__tl_upper_4_X_6_tl } { öÖβΒⓦⓌⱒⰢⴚႺbB } +\tl_const:cn { c__tl_upper_4_X_7_tl } { śŚƿǷȣȢʇꞱγΓѻѺӟӞṃṂầẦⓧⓍⱓⰣⲷⲶⴛႻꚗꚖꝟꝞcC } +\tl_const:cn { c__tl_upper_4_X_8_tl } { øØʈƮδΔὰᾺⓨⓎⱔⰤⴜႼdD } +\tl_const:cn { c__tl_upper_4_X_9_tl } { ùÙŝŜȥȤʉɄεΕѽѼӡӠᵽⱣṅṄẩẨάΆⓩⓏⱕⰥⲹⲸⴝႽꚙꚘꝡꝠeE } +\tl_const:cn { c__tl_upper_5_X_0_tl } { úÚʊƱζΖὲῈⱖⰦⴞႾfF } +\tl_const:cn { c__tl_upper_5_X_1_tl } { ûÛşŞȧȦʋƲηΗѿѾӣӢṇṆẫẪέΈⱗⰧⲻⲺⴟႿꚛꚚꝣꝢgG } +\tl_const:cn { c__tl_upper_5_X_2_tl } { üÜʌɅθΘἐἘὴῊⱘⰨⴠჀhH } +\tl_const:cn { c__tl_upper_5_X_3_tl } { ýÝšŠ{Dž}{DŽ}ȩȨιΙҁҀӥӤṉṈậẬἑἙήΉⱙⰩⲽⲼⴡჁꝥꝤiI } +\tl_const:cn { c__tl_upper_5_X_4_tl } { þÞ{dž}{DŽ}κΚἒἚὶῚⱚⰪⴢჂjJ } +\tl_const:cn { c__tl_upper_5_X_5_tl } { ÿŸţŢȫȪλΛӧӦṋṊắẮἓἛίΊⱛⰫⲿⲾⴣჃꝧꝦkK } +\tl_const:cn { c__tl_upper_5_X_6_tl } { {Lj}{LJ}μΜἔἜὸῸⱜⰬⴤჄlL } +\tl_const:cn { c__tl_upper_5_X_7_tl } { āĀťŤ{lj}{LJ}ȭȬνΝөӨṍṌằẰἕἝόΌⱝⰭⳁⳀⴥჅꝩꝨmM } +\tl_const:cn { c__tl_upper_5_X_8_tl } { ʒƷξΞὺῪⱞⰮnN } +\tl_const:cn { c__tl_upper_5_X_9_tl } { ăĂŧŦ{Nj}{NJ}ȯȮοΟӫӪṏṎẳẲύΎⳃⳂⴧჇꝫꝪoO } +\tl_const:cn { c__tl_upper_6_X_0_tl } { {nj}{NJ}πΠὼῺῠῨⅰⅠpP } +\tl_const:cn { c__tl_upper_6_X_1_tl } { ąĄũŨȱȰρΡӭӬṑṐẵẴώΏῡῩ{ⅱ}{Ⅱ}ⱡⱠⳅⳄꙁꙀꝭꝬqQ } +\tl_const:cn { c__tl_upper_6_X_2_tl } { ǎǍςΣ{ⅲ}{Ⅲ}rR } +\tl_const:cn { c__tl_upper_6_X_3_tl } { ćĆūŪȳȲσΣҋҊӯӮṓṒặẶ{ⅳ}{Ⅳ}ⳇⳆꙃꙂꝯꝮsS } +\tl_const:cn { c__tl_upper_6_X_4_tl } { ǐǏτΤᾀ{ἈΙ}ⅴⅤtT } +\tl_const:cn { c__tl_upper_6_X_5_tl } { ĉĈŭŬυΥҍҌӱӰṕṔẹẸᾁ{ἉΙ}ῥῬ{ⅵ}{Ⅵ}ⱥȺⳉⳈⴭჍꙅꙄuU } +\tl_const:cn { c__tl_upper_6_X_6_tl } { ǒǑφΦᾂ{ἊΙ}{ⅶ}{Ⅶ}ⱦȾvV } +\tl_const:cn { c__tl_upper_6_X_7_tl } { ċĊůŮχΧҏҎӳӲṗṖẻẺᾃ{ἋΙ}{ⅷ}{Ⅷ}ⳋⳊꙇꙆwW } +\tl_const:cn { c__tl_upper_6_X_8_tl } { ǔǓψΨἠἨᾄ{ἌΙ}{ⅸ}{Ⅸ}ⱨⱧxX } +\tl_const:cn { c__tl_upper_6_X_9_tl } { čČűŰωΩґҐӵӴṙṘẽẼἡἩᾅ{ἍΙ}ⅹⅩⳍⳌꙉꙈyY } +\tl_const:cn { c__tl_upper_7_X_0_tl } { ǖǕʞꞰϊΪἢἪᾆ{ἎΙ}{ⅺ}{Ⅺ}ⱪⱩzZ } +\tl_const:cn { c__tl_upper_7_X_1_tl } { ďĎųŲϋΫғҒӷӶṛṚếẾἣἫᾇ{ἏΙ}{ⅻ}{Ⅻ}ⳏⳎꙋꙊ } +\tl_const:cn { c__tl_upper_7_X_2_tl } { ǘǗȼȻόΌаАἤἬⅼⅬⱬⱫ𑣀𑢠 } +\tl_const:cn { c__tl_upper_7_X_3_tl } { đĐŵŴύΎбБҕҔӹӸṝṜềỀἥἭⅽⅭⳑⳐꙍꙌ𑣁𑢡 } +\tl_const:cn { c__tl_upper_7_X_4_tl } { ǚǙώΏвВἦἮⅾⅮꝺꝹ𑣂𑢢 } +\tl_const:cn { c__tl_upper_7_X_5_tl } { ēĒŷŶȿⱾгГҗҖӻӺṟṞểỂἧἯⅿⅯⳓⳒꙏꙎ𑣃𑢣 } +\tl_const:cn { c__tl_upper_7_X_6_tl } { ǜǛɀⱿϐΒдДꝼꝻ𑣄𑢤 } +\tl_const:cn { c__tl_upper_7_X_7_tl } { ĕĔǝƎϑΘеЕҙҘӽӼաԱṡṠễỄⳕⳔꙑꙐ𑣅𑢥 } +\tl_const:cn { c__tl_upper_7_X_8_tl } { źŹɂɁжЖբԲ𑣆𑢦 } +\tl_const:cn { c__tl_upper_7_X_9_tl } { ėĖǟǞзЗқҚӿӾգԳṣṢệỆῳ{ΩΙ}ⱳⱲⳗⳖꙓꙒꝿꝾ𑣇𑢧 } +\tl_const:cn { c__tl_upper_8_X_0_tl } { żŻиИդԴᾐ{ἨΙ}ↄↃ𑣈𑢨 } +\tl_const:cn { c__tl_upper_8_X_1_tl } { µΜęĘǡǠͱͰϕΦйЙҝҜԁԀեԵḁḀṥṤỉỈᾑ{ἩΙ}ⳙⳘꙕꙔꞁꞀ𑣉𑢩 } +\tl_const:cn { c__tl_upper_8_X_2_tl } { žŽϖΠкКզԶᾒ{ἪΙ}ⱶⱵ𑣊𑢪 } +\tl_const:cn { c__tl_upper_8_X_3_tl } { ěĚſSǣǢɇɆͳͲϗϏлЛҟҞԃԂէԷḃḂṧṦịỊᾓ{ἫΙ}ⳛⳚꙗꙖꞃꞂ𑣋𑢫 } +\tl_const:cn { c__tl_upper_8_X_4_tl } { ƀɃмМըԸἰἸᾔ{ἬΙ}𑣌𑢬 } +\tl_const:cn { c__tl_upper_8_X_5_tl } { ĝĜǥǤɉɈϙϘнНҡҠԅԄթԹḅḄṩṨọỌἱἹᾕ{ἭΙ}ⳝⳜꙙꙘꞅꞄ𑣍𑢭 } +\tl_const:cn { c__tl_upper_8_X_6_tl } { оОժԺἲἺᾖ{ἮΙ}𑣎𑢮 } +\tl_const:cn { c__tl_upper_8_X_7_tl } { ğĞƃƂǧǦɋɊͷͶϛϚпПңҢԇԆիԻḇḆṫṪỏỎἳἻᾗ{ἯΙ}ⳟⳞꙛꙚꜣꜢꞇꞆ𑣏𑢯 } +\tl_const:cn { c__tl_upper_8_X_8_tl } { рРլԼἴἼ𑣐𑢰 } +\tl_const:cn { c__tl_upper_8_X_9_tl } { ġĠƅƄǩǨɍɌϝϜсСҥҤԉԈխԽḉḈṭṬốỐἵἽⳡⳠꙝꙜꜥꜤ𑣑𑢱 } +\tl_const:cn { c__tl_upper_9_X_0_tl } { тТծԾἶἾ𑣒𑢲 } +\tl_const:cn { c__tl_upper_9_X_1_tl } { ģĢǫǪɏɎͻϽϟϞуУҧҦԋԊկԿḋḊṯṮồỒἷἿⳣⳢꙟꙞꜧꜦ𑣓𑢳 } +\tl_const:cn { c__tl_upper_9_X_2_tl } { ƈƇɐⱯͼϾфФհՀꞌꞋ𑣔𑢴 } +\tl_const:cn { c__tl_upper_9_X_3_tl } { ĥĤǭǬɑⱭͽϿϡϠхХҩҨԍԌձՁḍḌṱṰổỔⲁⲀꙡꙠꜩꜨ𑣕𑢵 } +\tl_const:cn { c__tl_upper_9_X_4_tl } { ɒⱰцЦղՂ𑣖𑢶 } +\tl_const:cn { c__tl_upper_9_X_5_tl } { ħĦǯǮɓƁϣϢчЧҫҪԏԎճՃḏḎṳṲỗỖⲃⲂꙣꙢꜫꜪ𑣗𑢷 } +\tl_const:cn { c__tl_upper_9_X_6_tl } { ƌƋɔƆшШմՄᾠ{ὨΙ}𑣘𑢸 } +\tl_const:cn { c__tl_upper_9_X_7_tl } { aAĩĨϥϤщЩҭҬԑԐյՅḑḐṵṴộỘᾡ{ὩΙ}ⲅⲄꙥꙤꜭꜬꞑꞐ𑣙𑢹 } +\tl_const:cn { c__tl_upper_9_X_8_tl } { bB{Dz}{DZ}ɖƉъЪնՆᾢ{ὪΙ}𑣚𑢺 } +\tl_const:cn { c__tl_upper_9_X_9_tl } { cCīĪ{dz}{DZ}ɗƊϧϦыЫүҮԓԒշՇḓḒṷṶớỚᾣ{ὫΙ}ⲇⲆꙧꙦꜯꜮꞓꞒ𑣛𑢻 } +\tl_const:cn { c__tl_lower_0_X_0_tl } { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờⒸⓒⰤⱔⲈⲉꙨꙩ } +\tl_const:cn { c__tl_lower_0_X_1_tl } { ÉéƑƒჍⴭⒹⓓⰥⱕⳭⳮ } +\tl_const:cn { c__tl_lower_0_X_2_tl } { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳꞖꞗ } +\tl_const:cn { c__tl_lower_0_X_3_tl } { ËëƓɠǷƿⒻⓕⰧⱗ } +\tl_const:cn { c__tl_lower_0_X_4_tl } { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨᾠⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵꞘꞙ } +\tl_const:cn { c__tl_lower_0_X_5_tl } { ÍíΉήᾩᾡⒽⓗⰩⱙ } +\tl_const:cn { c__tl_lower_0_X_6_tl } { Îî{IJ}{ij}ƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪᾢⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷꞚꞛ } +\tl_const:cn { c__tl_lower_0_X_7_tl } { ÏïƗɨᾫᾣⒿⓙⰫⱛ } +\tl_const:cn { c__tl_lower_0_X_8_tl } { ÐðĴĵƘƙǼǽΌόҸҹԜԝḜḝẀẁỤụὈὀᾬᾤⓀⓚⰬⱜⲐⲑꜸꜹꞜꞝ } +\tl_const:cn { c__tl_lower_0_X_9_tl } { ÑñὉὁᾭᾥⓁⓛⰭⱝ } +\tl_const:cn { c__tl_lower_1_X_0_tl } { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮᾦⓂⓜⰮⱞⲒⲓꜺꜻꞞꞟ } +\tl_const:cn { c__tl_lower_1_X_1_tl } { ÓóΏώὋὃᾯᾧⓃⓝ } +\tl_const:cn { c__tl_lower_1_X_2_tl } { ÔôƜɯȀȁϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } +\tl_const:cn { c__tl_lower_1_X_3_tl } { ÕõĹĺƝɲΑαὍὅⓅⓟAa } +\tl_const:cn { c__tl_lower_1_X_4_tl } { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừⓆⓠⲖⲗꜾꜿꞢꞣBb } +\tl_const:cn { c__tl_lower_1_X_5_tl } { ĻļƟɵΓγϷϸⓇⓡCc } +\tl_const:cn { c__tl_lower_1_X_6_tl } { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửⓈⓢⲘⲙꝀꝁꞤꞥDd } +\tl_const:cn { c__tl_lower_1_X_7_tl } { ÙùĽľΕεϹϲӁӂⓉⓣEe } +\tl_const:cn { c__tl_lower_1_X_8_tl } { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữⓊⓤⲚⲛꝂꝃꞦꞧFf } +\tl_const:cn { c__tl_lower_1_X_9_tl } { Ûû{Ŀ}{ŀ}ΗηӃӄⓋⓥGg } +\tl_const:cn { c__tl_lower_2_X_0_tl } { ÜüƤƥȈȉΘθѠѡԨԩḨḩẌẍỰựᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } +\tl_const:cn { c__tl_lower_2_X_1_tl } { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } +\tl_const:cn { c__tl_lower_2_X_2_tl } { ÞþƦʀȊȋΚκϾͼѢѣԪԫḪḫẎẏỲỳᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } +\tl_const:cn { c__tl_lower_2_X_3_tl } { ŃńƧƨΛλϿͽӇӈΆάⓏⓩꞫɜKk } +\tl_const:cn { c__tl_lower_2_X_4_tl } { ȌȍΜμЀѐѤѥԬԭḬḭẐẑỴỵᾼᾳⲠⲡꚀꚁꝈꝉꞬɡLl } +\tl_const:cn { c__tl_lower_2_X_5_tl } { ŅņƩʃΝνЁёӉӊὙὑꞭɬMm } +\tl_const:cn { c__tl_lower_2_X_6_tl } { ȎȏΞξЂђѦѧԮԯḮḯẒẓỶỷⲢⲣꚂꚃꝊꝋNn } +\tl_const:cn { c__tl_lower_2_X_7_tl } { ŇňΟοЃѓӋӌὛὓOo } +\tl_const:cn { c__tl_lower_2_X_8_tl } { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍꞰʞPp } +\tl_const:cn { c__tl_lower_2_X_9_tl } { ΡρЅѕӍӎԱաὝὕꞱʇQq } +\tl_const:cn { c__tl_lower_3_X_0_tl } { ŊŋƮʈȒȓІіѪѫԲբḲḳỺỻⲦⲧꚆꚇꝎꝏRr } +\tl_const:cn { c__tl_lower_3_X_1_tl } { ƯưΣσЇїԳգὟὗSs } +\tl_const:cn { c__tl_lower_3_X_2_tl } { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵỼỽⲨⲩꚈꚉꝐꝑTt } +\tl_const:cn { c__tl_lower_3_X_3_tl } { ƱʊΥυЉљԵեUu } +\tl_const:cn { c__tl_lower_3_X_4_tl } { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷỾỿⲪⲫꚊꚋꝒꝓVv } +\tl_const:cn { c__tl_lower_3_X_5_tl } { ƳƴΧχЋћԷէWw } +\tl_const:cn { c__tl_lower_3_X_6_tl } { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } +\tl_const:cn { c__tl_lower_3_X_7_tl } { ƵƶΩωЍѝԹթΈέYy } +\tl_const:cn { c__tl_lower_3_X_8_tl } { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞßῊὴⲮⲯꚎꚏꝖꝗZz } +\tl_const:cn { c__tl_lower_3_X_9_tl } { ƷʒΫϋЏџԻիΉή } +\tl_const:cn { c__tl_lower_4_X_0_tl } { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌῃⲰⲱꚐꚑꝘꝙ𑢠𑣀 } +\tl_const:cn { c__tl_lower_4_X_1_tl } { БбԽխὩὡ𑢡𑣁 } +\tl_const:cn { c__tl_lower_4_X_2_tl } { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ𑢢𑣂 } +\tl_const:cn { c__tl_lower_4_X_3_tl } { ГгԿկὫὣ𑢣𑣃 } +\tl_const:cn { c__tl_lower_4_X_4_tl } { ŘřƼƽȠƞДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ𑢤𑣄 } +\tl_const:cn { c__tl_lower_4_X_5_tl } { ЕеՁձἉἁὭὥ{Ⅱ}{ⅱ}𑢥𑣅 } +\tl_const:cn { c__tl_lower_4_X_6_tl } { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦ{Ⅲ}{ⅲ}ⲶⲷꚖꚗꝞꝟ𑢦𑣆 } +\tl_const:cn { c__tl_lower_4_X_7_tl } { ЗзՃճἋἃὯὧ{Ⅳ}{ⅳ}𑢧𑣇 } +\tl_const:cn { c__tl_lower_4_X_8_tl } { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꚘꚙꝠꝡ𑢨𑣈 } +\tl_const:cn { c__tl_lower_4_X_9_tl } { ЙйՅյἍἅ{Ⅵ}{ⅵ}𑢩𑣉 } +\tl_const:cn { c__tl_lower_5_X_0_tl } { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆ{Ⅶ}{ⅶ}ⲺⲻꚚꚛꝢꝣ𑢪𑣊 } +\tl_const:cn { c__tl_lower_5_X_1_tl } { ЛлՇշἏἇ{Ⅷ}{ⅷ}𑢫𑣋 } +\tl_const:cn { c__tl_lower_5_X_2_tl } { Šš{DŽ}{dž}ȨȩМмҀҁӤӥՈոṈṉẬậῘῐ{Ⅸ}{ⅸ}ⲼⲽꝤꝥ𑢬𑣌 } +\tl_const:cn { c__tl_lower_5_X_3_tl } { {Dž}{dž}НнՉչῙῑⅩⅹ𑢭𑣍 } +\tl_const:cn { c__tl_lower_5_X_4_tl } { ŢţȪȫОоӦӧՊպṊṋẮắῚὶ{Ⅺ}{ⅺ}ⲾⲿꝦꝧ𑢮𑣎 } +\tl_const:cn { c__tl_lower_5_X_5_tl } { {LJ}{lj}ПпՋջΊί{Ⅻ}{ⅻ}𑢯𑣏 } +\tl_const:cn { c__tl_lower_5_X_6_tl } { ĀāŤť{Lj}{lj}ȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ𑢰𑣐 } +\tl_const:cn { c__tl_lower_5_X_7_tl } { СсՍսႡⴁⅭⅽ𑢱𑣑 } +\tl_const:cn { c__tl_lower_5_X_8_tl } { ĂăŦŧ{NJ}{nj}ȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ𑢲𑣒 } +\tl_const:cn { c__tl_lower_5_X_9_tl } { {Nj}{nj}УуՏտႣⴃⅯⅿ𑢳𑣓 } +\tl_const:cn { c__tl_lower_6_X_0_tl } { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ𐐀𐐨𑢴𑣔 } +\tl_const:cn { c__tl_lower_6_X_1_tl } { ǍǎХхՑցႥⴅἙἑ𐐁𐐩𑢵𑣕 } +\tl_const:cn { c__tl_lower_6_X_2_tl } { ĆćŪūȲȳЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒⱢɫⳆⳇꙂꙃꝮꝯ𐐂𐐪𑢶𑣖 } +\tl_const:cn { c__tl_lower_6_X_3_tl } { ǏǐЧчՓփႧⴇἛἓⱣᵽ𐐃𐐫𑢷𑣗 } +\tl_const:cn { c__tl_lower_6_X_4_tl } { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬𑢸𑣘 } +\tl_const:cn { c__tl_lower_6_X_5_tl } { AaǑǒЩщՕօႩⴉἝἕⰁⰱ𐐅𐐭𑢹𑣙 } +\tl_const:cn { c__tl_lower_6_X_6_tl } { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻⰂⰲⳊⳋꙆꙇ𐐆𐐮𑢺𑣚 } +\tl_const:cn { c__tl_lower_6_X_7_tl } { CcǓǔЫыႫⴋⰃⰳⱧⱨ𐐇𐐯𑢻𑣛 } +\tl_const:cn { c__tl_lower_6_X_8_tl } { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰𑢼𑣜 } +\tl_const:cn { c__tl_lower_6_X_9_tl } { EeǕǖЭэႭⴍῩῡⰅⰵⱩⱪ𐐉𐐱𑢽𑣝 } +\tl_const:cn { c__tl_lower_7_X_0_tl } { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲𑢾𑣞 } +\tl_const:cn { c__tl_lower_7_X_1_tl } { GgǗǘȻȼЯяႯⴏΎύⰇⰷⱫⱬ𐐋𐐳𑢿𑣟 } +\tl_const:cn { c__tl_lower_7_X_2_tl } { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈᾀῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } +\tl_const:cn { c__tl_lower_7_X_3_tl } { IiǙǚȽƚႱⴑᾉᾁⰉⰹⱭɑꝹꝺ𐐍𐐵 } +\tl_const:cn { c__tl_lower_7_X_4_tl } { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊᾂⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } +\tl_const:cn { c__tl_lower_7_X_5_tl } { KkǛǜϏϗႳⴓᾋᾃⰋⰻⱯɐꝻꝼ𐐏𐐷 } +\tl_const:cn { c__tl_lower_7_X_6_tl } { LlĔĕŸÿҘҙӼӽႴⴔṠṡỄễἨἠᾌᾄⰌⰼⱰɒⳔⳕꙐꙑ𐐐𐐸 } +\tl_const:cn { c__tl_lower_7_X_7_tl } { MmŹźɁɂႵⴕἩἡᾍᾅⰍⰽꝽᵹ𐐑𐐹 } +\tl_const:cn { c__tl_lower_7_X_8_tl } { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎᾆⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ𐐒𐐺 } +\tl_const:cn { c__tl_lower_7_X_9_tl } { OoŻżɃƀႷⴗἫἣᾏᾇↃↄⰏⰿ𐐓𐐻 } +\tl_const:cn { c__tl_lower_8_X_0_tl } { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } +\tl_const:cn { c__tl_lower_8_X_1_tl } { QqŽžɅʌႹⴙἭἥⰑⱁⱵⱶ𐐕𐐽 } +\tl_const:cn { c__tl_lower_8_X_2_tl } { RrĚěǢǣɆɇͲͳҞҟԂԃႺⴚḂḃṦṧỊịἮἦⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } +\tl_const:cn { c__tl_lower_8_X_3_tl } { SsႻⴛἯἧⰓⱃ𐐗𐐿 } +\tl_const:cn { c__tl_lower_8_X_4_tl } { TtĜĝǤǥɈɉϘϙҠҡԄԅႼⴜḄḅṨṩỌọῸὸⰔⱄⳜⳝꙘꙙꞄꞅ𐐘𐑀 } +\tl_const:cn { c__tl_lower_8_X_5_tl } { UuƁɓႽⴝΌόⰕⱅ𐐙𐑁 } +\tl_const:cn { c__tl_lower_8_X_6_tl } { VvĞğƂƃǦǧɊɋͶͷϚϛҢңԆԇႾⴞḆḇṪṫỎỏῺὼΩωⰖⱆⳞⳟꙚꙛꜢꜣꞆꞇ𐐚𐑂 } +\tl_const:cn { c__tl_lower_8_X_7_tl } { WwႿⴟΏώⰗⱇ𐐛𐑃 } +\tl_const:cn { c__tl_lower_8_X_8_tl } { XxĠġƄƅǨǩɌɍϜϝҤҥԈԉჀⴠḈḉṬṭỐốᾘᾐῼῳⰘⱈⳠⳡꙜꙝꜤꜥ𐐜𐑄 } +\tl_const:cn { c__tl_lower_8_X_9_tl } { YyჁⴡᾙᾑⰙⱉ𐐝𐑅 } +\tl_const:cn { c__tl_lower_9_X_0_tl } { ZzĢģƆɔǪǫɎɏϞϟҦҧԊԋჂⴢḊḋṮṯỒồᾚᾒKkⰚⱊⱾȿⳢⳣꙞꙟꜦꜧ𐐞𐑆 } +\tl_const:cn { c__tl_lower_9_X_1_tl } { ƇƈჃⴣᾛᾓÅåⰛⱋⱿɀꞋꞌ𐐟𐑇 } +\tl_const:cn { c__tl_lower_9_X_2_tl } { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜᾔⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } +\tl_const:cn { c__tl_lower_9_X_3_tl } { ÁáƉɖჅⴥἹἱᾝᾕⰝⱍꞍɥ𐐡𐑉 } +\tl_const:cn { c__tl_lower_9_X_4_tl } { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞᾖⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } +\tl_const:cn { c__tl_lower_9_X_5_tl } { ÃãƋƌͿϳჇⴧἻἳᾟᾗⰟⱏ𐐣𐑋 } +\tl_const:cn { c__tl_lower_9_X_6_tl } { ÄäĨĩϤϥҬҭԐԑḐḑṴṵỘộἼἴⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } +\tl_const:cn { c__tl_lower_9_X_7_tl } { Åå{DZ}{dz}ἽἵⰡⱑ𐐥𐑍 } +\tl_const:cn { c__tl_lower_9_X_8_tl } { ÆæĪīƎǝ{Dz}{dz}ϦϧҮүԒԓḒḓṶṷỚớἾἶℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } +\tl_const:cn { c__tl_lower_9_X_9_tl } { ÇçƏəἿἷⒷⓑⰣⱓⳫⳬ𐐧𐑏 } +\tl_const:Nn \c__tl_mixed_exceptions_tl { {ß}{Ss}{ff}{Ff}{fi}{Fi}{fl}{Fl}{ffi}{Ffi}{ffl}{Ffl}{ſt}{St}{st}{St}{և}{Եւ}{ﬓ}{Մն}{ﬔ}{Մե}{ﬕ}{Մի}{ﬖ}{Վն}{ﬗ}{Մխ}{ᾲ}{Ὰͅ}{ᾴ}{Άͅ}{ῂ}{Ὴͅ}{ῄ}{Ήͅ}{ῲ}{Ὼͅ}{ῴ}{Ώͅ}{ᾷ}{ᾼ͂}{ῇ}{ῌ͂}{ῷ}{ῼ͂}DžDždžDžLjLjljLjNjNjnjNjDzDzdzDz } +\tl_const:Nn \c__tl_std_sigma_tl {σ} +\tl_const:Nn \c__tl_final_sigma_tl {ς} +\tl_const:Nn \c__tl_dotless_i_tl {ı} +\tl_const:Nn \c__tl_dot_above_tl {̇} +\tl_const:Nn \c__tl_dotted_I_tl {İ} +\tl_const:Nn \c__tl_accents_lt_tl {Ì{i̇̀}Í{i̇́}Ĩ{i̇̃}} \group_begin: \cs_set_protected:Npn \__str_tmp:NNn #1#2#3 { - \tl_const:cx { c__str_fold_#1_#2_tl } + \tl_const:cx { c__str_fold_#1 _X_ #2_tl } { \__str_tmp:Nw #3 \q_recursion_tail { } \q_recursion_stop } } \cs_set:Npn \__str_tmp:Nw #1#2 @@ -70,84 +277,84 @@ } \__str_tmp:NNn 0 0 { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờᾤ{ὤι}ⒸⓒⰤⱔⲈⲉꙨꙩ } \__str_tmp:NNn 0 1 { ÉéƑƒჍⴭᾥ{ὥι}ⒹⓓⰥⱕⳭⳮ } - \__str_tmp:NNn 0 2 { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởᾦ{ὦι}ⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳ } + \__str_tmp:NNn 0 2 { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởᾦ{ὦι}ⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳꞖꞗ } \__str_tmp:NNn 0 3 { ËëƓɠǷƿᾧ{ὧι}ⒻⓕⰧⱗ } - \__str_tmp:NNn 0 4 { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨ{ὠι}ⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵ } + \__str_tmp:NNn 0 4 { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨ{ὠι}ⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵꞘꞙ } \__str_tmp:NNn 0 5 { ÍíΉήᾩ{ὡι}ⒽⓗⰩⱙ } - \__str_tmp:NNn 0 6 { ÎîIJijƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪ{ὢι}ⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷ } + \__str_tmp:NNn 0 6 { Îî{IJ}{ij}ƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪ{ὢι}ⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷꞚꞛ } \__str_tmp:NNn 0 7 { ÏïƗɨᾫ{ὣι}ⒿⓙⰫⱛ } - \__str_tmp:NNn 0 8 { ÐðĴĵƘƙǼǽΌόϰκҸҹԜԝḜḝẀẁỤụὈὀᾬ{ὤι}ⓀⓚⰬⱜⲐⲑꜸꜹ } + \__str_tmp:NNn 0 8 { ÐðĴĵƘƙǼǽΌόϰκҸҹԜԝḜḝẀẁỤụὈὀᾬ{ὤι}ⓀⓚⰬⱜⲐⲑꜸꜹꞜꞝ } \__str_tmp:NNn 0 9 { ÑñϱρὉὁᾭ{ὥι}ⓁⓛⰭⱝ } - \__str_tmp:NNn 1 0 { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮ{ὦι}ⓂⓜⰮⱞⲒⲓꜺꜻ } + \__str_tmp:NNn 1 0 { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮ{ὦι}ⓂⓜⰮⱞⲒⲓꜺꜻꞞꞟ } \__str_tmp:NNn 1 1 { ÓóΏώὋὃᾯ{ὧι}Ⓝⓝ } \__str_tmp:NNn 1 2 { ÔôƜɯȀȁΐ{ΐ}ϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } \__str_tmp:NNn 1 3 { ÕõĹĺƝɲΑαϵεὍὅⓅⓟAa } \__str_tmp:NNn 1 4 { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừᾲ{ὰι}ⓆⓠⲖⲗꜾꜿꞢꞣBb } - \__str_tmp:NNn 1 5 { ĻļƟɵΓγϷϸև{եւ}ᾳ{αι}ⓇⓡCc } + \__str_tmp:NNn 1 5 { ĻļƟɵΓγϷϸ{և}{եւ}ᾳ{αι}ⓇⓡCc } \__str_tmp:NNn 1 6 { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửὐ{ὐ}ᾴ{άι}ⓈⓢⲘⲙꝀꝁꞤꞥDd } \__str_tmp:NNn 1 7 { ÙùĽľΕεϹϲӁӂⓉⓣEe } \__str_tmp:NNn 1 8 { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữὒ{ὒ}ᾶ{ᾶ}ⓊⓤⲚⲛꝂꝃꞦꞧFf } - \__str_tmp:NNn 1 9 { ÛûĿŀΗηӃӄᾷ{ᾶι}ⓋⓥGg } - \__str_tmp:NNn 2 0 { ÜüƤƥȈȉΘθѠѡḨḩẌẍỰựὔ{ὔ}ᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } + \__str_tmp:NNn 1 9 { Ûû{Ŀ}{ŀ}ΗηӃӄᾷ{ᾶι}ⓋⓥGg } + \__str_tmp:NNn 2 0 { ÜüƤƥȈȉΘθѠѡԨԩḨḩẌẍỰựὔ{ὔ}ᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } \__str_tmp:NNn 2 1 { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } - \__str_tmp:NNn 2 2 { ÞþƦʀȊȋΚκϾͼѢѣḪḫẎẏỲỳὖ{ὖ}ᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } - \__str_tmp:NNn 2 3 { ß{ss}ŃńƧƨΛλϿͽӇӈΆάⓏⓩKk } - \__str_tmp:NNn 2 4 { ȌȍΜμЀѐѤѥḬḭẐẑỴỵᾼ{αι}ⲠⲡꚀꚁꝈꝉLl } - \__str_tmp:NNn 2 5 { ŅņƩʃΝνЁёӉӊὙὑMm } - \__str_tmp:NNn 2 6 { ȎȏΞξЂђѦѧḮḯẒẓỶỷιιⲢⲣꚂꚃꝊꝋNn } + \__str_tmp:NNn 2 2 { ÞþƦʀȊȋΚκϾͼѢѣԪԫḪḫẎẏỲỳὖ{ὖ}ᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } + \__str_tmp:NNn 2 3 { ß{ss}ŃńƧƨΛλϿͽӇӈΆάⓏⓩꞫɜKk } + \__str_tmp:NNn 2 4 { ȌȍΜμЀѐѤѥԬԭḬḭẐẑỴỵᾼ{αι}ⲠⲡꚀꚁꝈꝉꞬɡLl } + \__str_tmp:NNn 2 5 { ŅņƩʃΝνЁёӉӊὙὑꞭɬMm } + \__str_tmp:NNn 2 6 { ȎȏΞξЂђѦѧԮԯḮḯẒẓỶỷιιⲢⲣꚂꚃꝊꝋNn } \__str_tmp:NNn 2 7 { ŇňΟοЃѓӋӌὛὓOo } - \__str_tmp:NNn 2 8 { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍPp } - \__str_tmp:NNn 2 9 { ʼn{ʼn}ΡρЅѕӍӎԱաὝὕQq } + \__str_tmp:NNn 2 8 { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍꞰʞPp } + \__str_tmp:NNn 2 9 { {ʼn}{ʼn}ΡρЅѕӍӎԱաὝὕꞱʇQq } \__str_tmp:NNn 3 0 { ŊŋƮʈȒȓІіѪѫԲբḲḳẖ{ẖ}Ỻỻῂ{ὴι}ⲦⲧꚆꚇꝎꝏRr } \__str_tmp:NNn 3 1 { ƯưΣσЇїԳգẗ{ẗ}Ὗὗῃ{ηι}Ss } \__str_tmp:NNn 3 2 { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵẘ{ẘ}Ỽỽῄ{ήι}ⲨⲩꚈꚉꝐꝑTt } \__str_tmp:NNn 3 3 { ƱʊΥυЉљԵեẙ{ẙ}Uu } - \__str_tmp:NNn 3 4 { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷẚ{aʾ}Ỿỿῆ{ῆ}ⲪⲫꚊꚋꝒꝓVv } + \__str_tmp:NNn 3 4 { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷ{ẚ}{aʾ}Ỿỿῆ{ῆ}ⲪⲫꚊꚋꝒꝓVv } \__str_tmp:NNn 3 5 { ƳƴΧχЋћԷէẛṡῇ{ῆι}Ww } \__str_tmp:NNn 3 6 { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } \__str_tmp:NNn 3 7 { ƵƶͅιΩωЍѝԹթΈέYy } \__str_tmp:NNn 3 8 { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞ{ss}ῊὴⲮⲯꚎꚏꝖꝗZz } \__str_tmp:NNn 3 9 { ƷʒΫϋЏџԻիΉή } - \__str_tmp:NNn 4 0 { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌ{ηι}ⲰⲱꚐꚑꝘꝙ } - \__str_tmp:NNn 4 1 { БбԽխὩὡ } - \__str_tmp:NNn 4 2 { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ } - \__str_tmp:NNn 4 3 { ГгԿկὫὣ } - \__str_tmp:NNn 4 4 { ŘřƼƽȠƞΰ{ΰ}ДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ } - \__str_tmp:NNn 4 5 { ЕеՁձἉἁὭὥⅡⅱ } - \__str_tmp:NNn 4 6 { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦῒ{ῒ}ⅢⅲⲶⲷꚖꚗꝞꝟ } - \__str_tmp:NNn 4 7 { ЗзՃճἋἃὯὧΐ{ΐ}Ⅳⅳ } - \__str_tmp:NNn 4 8 { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꝠꝡ } - \__str_tmp:NNn 4 9 { ЙйՅյἍἅⅥⅵ } - \__str_tmp:NNn 5 0 { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆῖ{ῖ}ⅦⅶⲺⲻꝢꝣ } - \__str_tmp:NNn 5 1 { ЛлՇշἏἇῗ{ῗ}Ⅷⅷ } - \__str_tmp:NNn 5 2 { ŠšDŽdžȨȩМмҀҁӤӥՈոṈṉẬậῘῐⅨⅸⲼⲽꝤꝥ } - \__str_tmp:NNn 5 3 { DždžНнՉչῙῑⅩⅹ } - \__str_tmp:NNn 5 4 { ŢţȪȫОоӦӧՊպṊṋẮắῚὶⅪⅺⲾⲿꝦꝧ } - \__str_tmp:NNn 5 5 { LJljПпՋջΊίⅫⅻ } - \__str_tmp:NNn 5 6 { ĀāŤťLjljȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩff{ff} } - \__str_tmp:NNn 5 7 { СсՍսႡⴁⅭⅽfi{fi} } - \__str_tmp:NNn 5 8 { ĂăŦŧNJnjȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫfl{fl} } - \__str_tmp:NNn 5 9 { NjnjУуՏտႣⴃⅯⅿffi{ffi} } - \__str_tmp:NNn 6 0 { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭffl{ffl}𐐀𐐨 } - \__str_tmp:NNn 6 1 { ǍǎХхՑցႥⴅἙἑſt{st}𐐁𐐩 } - \__str_tmp:NNn 6 2 { ĆćŪūȲȳςσЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒῢ{ῢ}ⱢɫⳆⳇꙂꙃꝮꝯst{st}𐐂𐐪 } - \__str_tmp:NNn 6 3 { ǏǐЧчՓփႧⴇἛἓΰ{ΰ}Ᵽᵽ𐐃𐐫 } - \__str_tmp:NNn 6 4 { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔᾀ{ἀι}ῤ{ῤ}ⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬 } - \__str_tmp:NNn 6 5 { AaǑǒЩщՕօႩⴉἝἕᾁ{ἁι}Ⰱⰱ𐐅𐐭 } - \__str_tmp:NNn 6 6 { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻᾂ{ἂι}ῦ{ῦ}ⰂⰲⳊⳋꙆꙇ𐐆𐐮 } - \__str_tmp:NNn 6 7 { CcǓǔЫыႫⴋᾃ{ἃι}ῧ{ῧ}ⰃⰳⱧⱨ𐐇𐐯 } - \__str_tmp:NNn 6 8 { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽᾄ{ἄι}ῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰 } - \__str_tmp:NNn 6 9 { EeǕǖЭэႭⴍᾅ{ἅι}ῩῡⰅⰵⱩⱪ𐐉𐐱 } - \__str_tmp:NNn 7 0 { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếᾆ{ἆι}ῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲 } - \__str_tmp:NNn 7 1 { GgǗǘȻȼЯяႯⴏᾇ{ἇι}ΎύⰇⰷⱫⱬ𐐋𐐳 } + \__str_tmp:NNn 4 0 { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌ{ηι}ⲰⲱꚐꚑꝘꝙ𑢠𑣀 } + \__str_tmp:NNn 4 1 { БбԽխὩὡ𑢡𑣁 } + \__str_tmp:NNn 4 2 { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ𑢢𑣂 } + \__str_tmp:NNn 4 3 { ГгԿկὫὣ𑢣𑣃 } + \__str_tmp:NNn 4 4 { ŘřƼƽȠƞΰ{ΰ}ДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ𑢤𑣄 } + \__str_tmp:NNn 4 5 { ЕеՁձἉἁὭὥ{Ⅱ}{ⅱ}𑢥𑣅 } + \__str_tmp:NNn 4 6 { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦῒ{ῒ}{Ⅲ}{ⅲ}ⲶⲷꚖꚗꝞꝟ𑢦𑣆 } + \__str_tmp:NNn 4 7 { ЗзՃճἋἃὯὧΐ{ΐ}{Ⅳ}{ⅳ}𑢧𑣇 } + \__str_tmp:NNn 4 8 { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꚘꚙꝠꝡ𑢨𑣈 } + \__str_tmp:NNn 4 9 { ЙйՅյἍἅ{Ⅵ}{ⅵ}𑢩𑣉 } + \__str_tmp:NNn 5 0 { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆῖ{ῖ}{Ⅶ}{ⅶ}ⲺⲻꚚꚛꝢꝣ𑢪𑣊 } + \__str_tmp:NNn 5 1 { ЛлՇշἏἇῗ{ῗ}{Ⅷ}{ⅷ}𑢫𑣋 } + \__str_tmp:NNn 5 2 { Šš{DŽ}{dž}ȨȩМмҀҁӤӥՈոṈṉẬậῘῐ{Ⅸ}{ⅸ}ⲼⲽꝤꝥ𑢬𑣌 } + \__str_tmp:NNn 5 3 { {Dž}{dž}НнՉչῙῑⅩⅹ𑢭𑣍 } + \__str_tmp:NNn 5 4 { ŢţȪȫОоӦӧՊպṊṋẮắῚὶ{Ⅺ}{ⅺ}ⲾⲿꝦꝧ𑢮𑣎 } + \__str_tmp:NNn 5 5 { {LJ}{lj}ПпՋջΊί{Ⅻ}{ⅻ}𑢯𑣏 } + \__str_tmp:NNn 5 6 { ĀāŤť{Lj}{lj}ȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ{ff}{ff}𑢰𑣐 } + \__str_tmp:NNn 5 7 { СсՍսႡⴁⅭⅽ{fi}{fi}𑢱𑣑 } + \__str_tmp:NNn 5 8 { ĂăŦŧ{NJ}{nj}ȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ{fl}{fl}𑢲𑣒 } + \__str_tmp:NNn 5 9 { {Nj}{nj}УуՏտႣⴃⅯⅿ{ffi}{ffi}𑢳𑣓 } + \__str_tmp:NNn 6 0 { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ{ffl}{ffl}𐐀𐐨𑢴𑣔 } + \__str_tmp:NNn 6 1 { ǍǎХхՑցႥⴅἙἑ{ſt}{st}𐐁𐐩𑢵𑣕 } + \__str_tmp:NNn 6 2 { ĆćŪūȲȳςσЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒῢ{ῢ}ⱢɫⳆⳇꙂꙃꝮꝯ{st}{st}𐐂𐐪𑢶𑣖 } + \__str_tmp:NNn 6 3 { ǏǐЧчՓփႧⴇἛἓΰ{ΰ}Ᵽᵽ𐐃𐐫𑢷𑣗 } + \__str_tmp:NNn 6 4 { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔᾀ{ἀι}ῤ{ῤ}ⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬𑢸𑣘 } + \__str_tmp:NNn 6 5 { AaǑǒЩщՕօႩⴉἝἕᾁ{ἁι}Ⰱⰱ𐐅𐐭𑢹𑣙 } + \__str_tmp:NNn 6 6 { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻᾂ{ἂι}ῦ{ῦ}ⰂⰲⳊⳋꙆꙇ𐐆𐐮𑢺𑣚 } + \__str_tmp:NNn 6 7 { CcǓǔЫыႫⴋᾃ{ἃι}ῧ{ῧ}ⰃⰳⱧⱨ𐐇𐐯𑢻𑣛 } + \__str_tmp:NNn 6 8 { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽᾄ{ἄι}ῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰𑢼𑣜 } + \__str_tmp:NNn 6 9 { EeǕǖЭэႭⴍᾅ{ἅι}ῩῡⰅⰵⱩⱪ𐐉𐐱𑢽𑣝 } + \__str_tmp:NNn 7 0 { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếᾆ{ἆι}ῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲𑢾𑣞 } + \__str_tmp:NNn 7 1 { GgǗǘȻȼЯяႯⴏᾇ{ἇι}ΎύⰇⰷⱫⱬ𐐋𐐳𑢿𑣟 } \__str_tmp:NNn 7 2 { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈ{ἀι}ῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } \__str_tmp:NNn 7 3 { IiǙǚȽƚႱⴑᾉ{ἁι}ⰉⰹⱭɑꝹꝺ𐐍𐐵 } \__str_tmp:NNn 7 4 { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊ{ἂι}ⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } - \__str_tmp:NNn 7 5 { KkǛǜϏϗႳⴓᾋ{ἃι}ⰋⰻⱯɐꝻꝼﬓ{մն}𐐏𐐷 } - \__str_tmp:NNn 7 6 { LlĔĕŸÿϐβҘҙӼӽႴⴔṠṡỄễἨἠᾌ{ἄι}ⰌⰼⱰɒⳔⳕꙐꙑﬔ{մե}𐐐𐐸 } - \__str_tmp:NNn 7 7 { MmŹźɁɂϑθႵⴕἩἡᾍ{ἅι}ⰍⰽꝽᵹﬕ{մի}𐐑𐐹 } - \__str_tmp:NNn 7 8 { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎ{ἆι}ῲ{ὼι}ⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿﬖ{վն}𐐒𐐺 } - \__str_tmp:NNn 7 9 { OoŻżɃƀႷⴗἫἣᾏ{ἇι}ῳ{ωι}ↃↄⰏⰿﬗ{մխ}𐐓𐐻 } + \__str_tmp:NNn 7 5 { KkǛǜϏϗႳⴓᾋ{ἃι}ⰋⰻⱯɐꝻꝼ{ﬓ}{մն}𐐏𐐷 } + \__str_tmp:NNn 7 6 { LlĔĕŸÿϐβҘҙӼӽႴⴔṠṡỄễἨἠᾌ{ἄι}ⰌⰼⱰɒⳔⳕꙐꙑ{ﬔ}{մե}𐐐𐐸 } + \__str_tmp:NNn 7 7 { MmŹźɁɂϑθႵⴕἩἡᾍ{ἅι}ⰍⰽꝽᵹ{ﬕ}{մի}𐐑𐐹 } + \__str_tmp:NNn 7 8 { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎ{ἆι}ῲ{ὼι}ⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ{ﬖ}{վն}𐐒𐐺 } + \__str_tmp:NNn 7 9 { OoŻżɃƀႷⴗἫἣᾏ{ἇι}ῳ{ωι}ↃↄⰏⰿ{ﬗ}{մխ}𐐓𐐻 } \__str_tmp:NNn 8 0 { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤᾐ{ἠι}ῴ{ώι}ⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } \__str_tmp:NNn 8 1 { QqµμŽžɅʌϕφႹⴙἭἥᾑ{ἡι}ⰑⱁⱵⱶ𐐕𐐽 } \__str_tmp:NNn 8 2 { RrĚěǢǣɆɇͲͳϖπҞҟԂԃႺⴚḂḃṦṧỊịἮἦᾒ{ἢι}ῶ{ῶ}ⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } @@ -163,216 +370,9 @@ \__str_tmp:NNn 9 2 { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜ{ἤι}ⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } \__str_tmp:NNn 9 3 { ÁáƉɖჅⴥἹἱᾝ{ἥι}ⰝⱍꞍɥ𐐡𐑉 } \__str_tmp:NNn 9 4 { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞ{ἦι}ⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } - \__str_tmp:NNn 9 5 { ÃãƋƌჇⴧἻἳᾟ{ἧι}Ⱏⱏ𐐣𐑋 } + \__str_tmp:NNn 9 5 { ÃãƋƌͿϳჇⴧἻἳᾟ{ἧι}Ⱏⱏ𐐣𐑋 } \__str_tmp:NNn 9 6 { ÄäĨĩǰ{ǰ}ϤϥҬҭԐԑḐḑṴṵỘộἼἴᾠ{ὠι}ⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } - \__str_tmp:NNn 9 7 { ÅåDZdzἽἵᾡ{ὡι}Ⱑⱑ𐐥𐑍 } - \__str_tmp:NNn 9 8 { ÆæĪīƎǝDzdzϦϧҮүԒԓḒḓṶṷỚớἾἶᾢ{ὢι}ℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } + \__str_tmp:NNn 9 7 { Åå{DZ}{dz}Ἵἵᾡ{ὡι}Ⱑⱑ𐐥𐑍 } + \__str_tmp:NNn 9 8 { ÆæĪīƎǝ{Dz}{dz}ϦϧҮүԒԓḒḓṶṷỚớἾἶᾢ{ὢι}ℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } \__str_tmp:NNn 9 9 { ÇçƏəἿἷᾣ{ὣι}ⒷⓑⰣⱓⳫⳬ𐐧𐑏 } \group_end: -\tl_const:cn { c__tl_upper_0_0_tl } { dDьЬոՈὀὈᾤ{ὬΙ}ⳬⳫ𐐨𐐀 } -\tl_const:cn { c__tl_upper_0_1_tl } { eEĭĬǵǴəƏϩϨэЭұҰԕԔչՉḕḔṹṸờỜὁὉᾥ{ὭΙ}ⲉⲈꙩꙨ𐐩𐐁 } -\tl_const:cn { c__tl_upper_0_2_tl } { fFƒƑюЮպՊὂὊᾦ{ὮΙ}ⳮⳭ𐐪𐐂 } -\tl_const:cn { c__tl_upper_0_3_tl } { gGįĮɛƐϫϪяЯҳҲԗԖջՋḗḖṻṺởỞὃὋᾧ{ὯΙ}ⲋⲊꙫꙪꜳꜲ𐐫𐐃 } -\tl_const:cn { c__tl_upper_0_4_tl } { hHѐЀռՌὄὌ𐐬𐐄 } -\tl_const:cn { c__tl_upper_0_5_tl } { iIıIƕǶǹǸϭϬёЁҵҴԙԘսՍḙḘṽṼỡỠὅὍⲍⲌꙭꙬꜵꜴ𐐭𐐅 } -\tl_const:cn { c__tl_upper_0_6_tl } { jJђЂվՎ𐐮𐐆 } -\tl_const:cn { c__tl_upper_0_7_tl } { kKijIJǻǺϯϮѓЃҷҶԛԚտՏḛḚṿṾợỢⲏⲎⳳⳲꜷꜶ𐐯𐐇 } -\tl_const:cn { c__tl_upper_0_8_tl } { lLɠƓϰΚєЄրՐ𐐰𐐈 } -\tl_const:cn { c__tl_upper_0_9_tl } { mMĵĴƙƘǽǼϱΡѕЅҹҸԝԜցՑḝḜẁẀụỤⲑⲐꜹꜸ𐐱𐐉 } -\tl_const:cn { c__tl_upper_1_0_tl } { nNƚȽϲϹіІւՒ𐐲𐐊 } -\tl_const:cn { c__tl_upper_1_1_tl } { oOķĶǿǾɣƔїЇһҺԟԞփՓḟḞẃẂủỦⲓⲒꜻꜺ𐐳𐐋 } -\tl_const:cn { c__tl_upper_1_2_tl } { pPјЈքՔᾰᾸⰰⰀ𐐴𐐌 } -\tl_const:cn { c__tl_upper_1_3_tl } { qQȁȀɥꞍϵΕљЉҽҼԡԠօՕḡḠẅẄứỨᾱᾹⰱⰁⲕⲔꜽꜼꞡꞠ𐐵𐐍 } -\tl_const:cn { c__tl_upper_1_4_tl } { rRĺĹƞȠɦꞪњЊֆՖⰲⰂ𐐶𐐎 } -\tl_const:cn { c__tl_upper_1_5_tl } { sSȃȂћЋҿҾԣԢḣḢẇẆừỪᾳ{ΑΙ}ⰳⰃⲗⲖꜿꜾꞣꞢ𐐷𐐏 } -\tl_const:cn { c__tl_upper_1_6_tl } { tTļĻɨƗϸϷќЌⰴⰄ𐐸𐐐 } -\tl_const:cn { c__tl_upper_1_7_tl } { uUơƠȅȄɩƖѝЍԥԤḥḤẉẈửỬὑὙⰵⰅⲙⲘꝁꝀꞥꞤ𐐹𐐑 } -\tl_const:cn { c__tl_upper_1_8_tl } { vVľĽўЎӂӁⰶⰆ𐐺𐐒 } -\tl_const:cn { c__tl_upper_1_9_tl } { wWƣƢȇȆɫⱢϻϺџЏԧԦḧḦẋẊữỮὓὛⰷⰇⲛⲚꝃꝂꞧꞦ𐐻𐐓 } -\tl_const:cn { c__tl_upper_2_0_tl } { xXŀĿӄӃⰸⰈⴀႠ𐐼𐐔 } -\tl_const:cn { c__tl_upper_2_1_tl } { yYƥƤȉȈѡѠḩḨẍẌựỰὕὝⰹⰉⲝⲜⴁႡꝅꝄꞩꞨ𐐽𐐕 } -\tl_const:cn { c__tl_upper_2_2_tl } { zZłŁӆӅⰺⰊⴂႢ𐐾𐐖 } -\tl_const:cn { c__tl_upper_2_3_tl } { ȋȊɯƜѣѢḫḪẏẎỳỲὗὟⰻⰋⲟⲞⴃႣꝇꝆ𐐿𐐗 } -\tl_const:cn { c__tl_upper_2_4_tl } { àÀńŃƨƧӈӇⓐⒶⰼⰌⴄႤ𐑀𐐘 } -\tl_const:cn { c__tl_upper_2_5_tl } { áÁȍȌɱⱮѥѤḭḬẑẐỵỴⓑⒷⰽⰍⲡⲠⴅႥꚁꚀꝉꝈ𐑁𐐙 } -\tl_const:cn { c__tl_upper_2_6_tl } { âÂņŅɲƝӊӉιΙⅎℲⓒⒸⰾⰎⴆႦ𐑂𐐚 } -\tl_const:cn { c__tl_upper_2_7_tl } { ãÃȏȎѧѦḯḮẓẒỷỶⓓⒹⰿⰏⲣⲢⴇႧꚃꚂꝋꝊ𐑃𐐛 } -\tl_const:cn { c__tl_upper_2_8_tl } { äÄňŇӌӋⓔⒺⱀⰐⴈႨ𐑄𐐜 } -\tl_const:cn { c__tl_upper_2_9_tl } { åÅƭƬȑȐɵƟѩѨḱḰẕẔỹỸⓕⒻⱁⰑⲥⲤⴉႩꚅꚄꝍꝌ𐑅𐐝 } -\tl_const:cn { c__tl_upper_3_0_tl } { æÆӎӍⓖⒼⱂⰒⴊႪ𐑆𐐞 } -\tl_const:cn { c__tl_upper_3_1_tl } { çÇŋŊȓȒѫѪӏӀḳḲỻỺῃ{ΗΙ}ⓗⒽⱃⰓⲧⲦⴋႫꚇꚆꝏꝎ𐑇𐐟 } -\tl_const:cn { c__tl_upper_3_2_tl } { èÈưƯὠὨⓘⒾⱄⰔⴌႬ𐑈𐐠 } -\tl_const:cn { c__tl_upper_3_3_tl } { éÉōŌȕȔѭѬӑӐḵḴỽỼὡὩⓙⒿⱅⰕⲩⲨⴍႭꚉꚈꝑꝐ𐑉𐐡 } -\tl_const:cn { c__tl_upper_3_4_tl } { êÊὢὪⓚⓀⱆⰖⴎႮ𐑊𐐢 } -\tl_const:cn { c__tl_upper_3_5_tl } { ëËŏŎȗȖѯѮӓӒḷḶẛṠỿỾὣὫⓛⓁⱇⰗⲫⲪⴏႯꚋꚊꝓꝒ𐑋𐐣 } -\tl_const:cn { c__tl_upper_3_6_tl } { ìÌƴƳἀἈὤὬⓜⓂⱈⰘⴐႰ𐑌𐐤 } -\tl_const:cn { c__tl_upper_3_7_tl } { íÍőŐșȘɽⱤͅΙѱѰӕӔḹḸἁἉὥὭⓝⓃⱉⰙⲭⲬⴑႱꚍꚌꝕꝔ𐑍𐐥 } -\tl_const:cn { c__tl_upper_3_8_tl } { îÎƶƵἂἊὦὮⓞⓄⱊⰚⴒႲ𐑎𐐦 } -\tl_const:cn { c__tl_upper_3_9_tl } { ïÏœŒțȚѳѲӗӖḻḺἃἋὧὯⓟⓅⱋⰛⲯⲮⴓႳꚏꚎꝗꝖ𐑏𐐧 } -\tl_const:cn { c__tl_upper_4_0_tl } { ðÐʀƦάΆἄἌⓠⓆⱌⰜⴔႴ } -\tl_const:cn { c__tl_upper_4_1_tl } { ñÑŕŔƹƸȝȜέΈѵѴәӘḽḼạẠἅἍⓡⓇⱍⰝⲱⲰⴕႵꚑꚐꝙꝘ } -\tl_const:cn { c__tl_upper_4_2_tl } { òÒήΉἆἎⓢⓈⱎⰞⴖႶ } -\tl_const:cn { c__tl_upper_4_3_tl } { óÓŗŖȟȞʃƩίΊѷѶӛӚḿḾảẢἇἏⓣⓉⱏⰟⲳⲲⴗႷꚓꚒꝛꝚ } -\tl_const:cn { c__tl_upper_4_4_tl } { ôÔῐῘⓤⓊⱐⰠⴘႸ } -\tl_const:cn { c__tl_upper_4_5_tl } { õÕřŘƽƼαΑѹѸӝӜᵹꝽṁṀấẤῑῙⓥⓋⱑⰡⲵⲴⴙႹꚕꚔꝝꝜaA } -\tl_const:cn { c__tl_upper_4_6_tl } { öÖβΒⓦⓌⱒⰢⴚႺbB } -\tl_const:cn { c__tl_upper_4_7_tl } { śŚƿǷȣȢγΓѻѺӟӞṃṂầẦⓧⓍⱓⰣⲷⲶⴛႻꚗꚖꝟꝞcC } -\tl_const:cn { c__tl_upper_4_8_tl } { øØʈƮδΔὰᾺⓨⓎⱔⰤⴜႼdD } -\tl_const:cn { c__tl_upper_4_9_tl } { ùÙŝŜȥȤʉɄεΕѽѼӡӠᵽⱣṅṄẩẨάΆⓩⓏⱕⰥⲹⲸⴝႽꝡꝠeE } -\tl_const:cn { c__tl_upper_5_0_tl } { úÚʊƱζΖὲῈⱖⰦⴞႾfF } -\tl_const:cn { c__tl_upper_5_1_tl } { ûÛşŞȧȦʋƲηΗѿѾӣӢṇṆẫẪέΈⱗⰧⲻⲺⴟႿꝣꝢgG } -\tl_const:cn { c__tl_upper_5_2_tl } { üÜʌɅθΘἐἘὴῊⱘⰨⴠჀhH } -\tl_const:cn { c__tl_upper_5_3_tl } { ýÝšŠDžDŽȩȨιΙҁҀӥӤṉṈậẬἑἙήΉⱙⰩⲽⲼⴡჁꝥꝤiI } -\tl_const:cn { c__tl_upper_5_4_tl } { þÞdžDŽκΚἒἚὶῚⱚⰪⴢჂjJ } -\tl_const:cn { c__tl_upper_5_5_tl } { ÿŸţŢȫȪλΛӧӦṋṊắẮἓἛίΊⱛⰫⲿⲾⴣჃꝧꝦkK } -\tl_const:cn { c__tl_upper_5_6_tl } { LjLJμΜἔἜὸῸⱜⰬⴤჄlL } -\tl_const:cn { c__tl_upper_5_7_tl } { āĀťŤljLJȭȬνΝөӨṍṌằẰἕἝόΌⱝⰭⳁⳀⴥჅꝩꝨmM } -\tl_const:cn { c__tl_upper_5_8_tl } { ʒƷξΞὺῪⱞⰮnN } -\tl_const:cn { c__tl_upper_5_9_tl } { ăĂŧŦNjNJȯȮοΟӫӪṏṎẳẲύΎⳃⳂⴧჇꝫꝪoO } -\tl_const:cn { c__tl_upper_6_0_tl } { njNJπΠὼῺῠῨⅰⅠpP } -\tl_const:cn { c__tl_upper_6_1_tl } { ąĄũŨȱȰρΡӭӬṑṐẵẴώΏῡῩⅱⅡⱡⱠⳅⳄꙁꙀꝭꝬqQ } -\tl_const:cn { c__tl_upper_6_2_tl } { ǎǍςΣⅲⅢrR } -\tl_const:cn { c__tl_upper_6_3_tl } { ćĆūŪȳȲσΣҋҊӯӮṓṒặẶⅳⅣⳇⳆꙃꙂꝯꝮsS } -\tl_const:cn { c__tl_upper_6_4_tl } { ǐǏτΤᾀ{ἈΙ}ⅴⅤtT } -\tl_const:cn { c__tl_upper_6_5_tl } { ĉĈŭŬυΥҍҌӱӰṕṔẹẸᾁ{ἉΙ}ῥῬⅵⅥⱥȺⳉⳈⴭჍꙅꙄuU } -\tl_const:cn { c__tl_upper_6_6_tl } { ǒǑφΦᾂ{ἊΙ}ⅶⅦⱦȾvV } -\tl_const:cn { c__tl_upper_6_7_tl } { ċĊůŮχΧҏҎӳӲṗṖẻẺᾃ{ἋΙ}ⅷⅧⳋⳊꙇꙆwW } -\tl_const:cn { c__tl_upper_6_8_tl } { ǔǓψΨἠἨᾄ{ἌΙ}ⅸⅨⱨⱧxX } -\tl_const:cn { c__tl_upper_6_9_tl } { čČűŰωΩґҐӵӴṙṘẽẼἡἩᾅ{ἍΙ}ⅹⅩⳍⳌꙉꙈyY } -\tl_const:cn { c__tl_upper_7_0_tl } { ǖǕϊΪἢἪᾆ{ἎΙ}ⅺⅪⱪⱩzZ } -\tl_const:cn { c__tl_upper_7_1_tl } { ďĎųŲϋΫғҒӷӶṛṚếẾἣἫᾇ{ἏΙ}ⅻⅫⳏⳎꙋꙊ } -\tl_const:cn { c__tl_upper_7_2_tl } { ǘǗȼȻόΌаАἤἬⅼⅬⱬⱫ } -\tl_const:cn { c__tl_upper_7_3_tl } { đĐŵŴύΎбБҕҔӹӸṝṜềỀἥἭⅽⅭⳑⳐꙍꙌ } -\tl_const:cn { c__tl_upper_7_4_tl } { ǚǙώΏвВἦἮⅾⅮꝺꝹ } -\tl_const:cn { c__tl_upper_7_5_tl } { ēĒŷŶȿⱾгГҗҖӻӺṟṞểỂἧἯⅿⅯⳓⳒꙏꙎ } -\tl_const:cn { c__tl_upper_7_6_tl } { ǜǛɀⱿϐΒдДꝼꝻ } -\tl_const:cn { c__tl_upper_7_7_tl } { ĕĔǝƎϑΘеЕҙҘӽӼաԱṡṠễỄⳕⳔꙑꙐ } -\tl_const:cn { c__tl_upper_7_8_tl } { źŹɂɁжЖբԲ } -\tl_const:cn { c__tl_upper_7_9_tl } { ėĖǟǞзЗқҚӿӾգԳṣṢệỆῳ{ΩΙ}ⱳⱲⳗⳖꙓꙒꝿꝾ } -\tl_const:cn { c__tl_upper_8_0_tl } { żŻиИդԴᾐ{ἨΙ}ↄↃ } -\tl_const:cn { c__tl_upper_8_1_tl } { µΜęĘǡǠͱͰϕΦйЙҝҜԁԀեԵḁḀṥṤỉỈᾑ{ἩΙ}ⳙⳘꙕꙔꞁꞀ } -\tl_const:cn { c__tl_upper_8_2_tl } { žŽϖΠкКզԶᾒ{ἪΙ}ⱶⱵ } -\tl_const:cn { c__tl_upper_8_3_tl } { ěĚſSǣǢɇɆͳͲϗϏлЛҟҞԃԂէԷḃḂṧṦịỊᾓ{ἫΙ}ⳛⳚꙗꙖꞃꞂ } -\tl_const:cn { c__tl_upper_8_4_tl } { ƀɃмМըԸἰἸᾔ{ἬΙ} } -\tl_const:cn { c__tl_upper_8_5_tl } { ĝĜǥǤɉɈϙϘнНҡҠԅԄթԹḅḄṩṨọỌἱἹᾕ{ἭΙ}ⳝⳜꙙꙘꞅꞄ } -\tl_const:cn { c__tl_upper_8_6_tl } { оОժԺἲἺᾖ{ἮΙ} } -\tl_const:cn { c__tl_upper_8_7_tl } { ğĞƃƂǧǦɋɊͷͶϛϚпПңҢԇԆիԻḇḆṫṪỏỎἳἻᾗ{ἯΙ}ⳟⳞꙛꙚꜣꜢꞇꞆ } -\tl_const:cn { c__tl_upper_8_8_tl } { рРլԼἴἼ } -\tl_const:cn { c__tl_upper_8_9_tl } { ġĠƅƄǩǨɍɌϝϜсСҥҤԉԈխԽḉḈṭṬốỐἵἽⳡⳠꙝꙜꜥꜤ } -\tl_const:cn { c__tl_upper_9_0_tl } { тТծԾἶἾ } -\tl_const:cn { c__tl_upper_9_1_tl } { ģĢǫǪɏɎͻϽϟϞуУҧҦԋԊկԿḋḊṯṮồỒἷἿⳣⳢꙟꙞꜧꜦ } -\tl_const:cn { c__tl_upper_9_2_tl } { ƈƇɐⱯͼϾфФհՀꞌꞋ } -\tl_const:cn { c__tl_upper_9_3_tl } { ĥĤǭǬɑⱭͽϿϡϠхХҩҨԍԌձՁḍḌṱṰổỔⲁⲀꙡꙠꜩꜨ } -\tl_const:cn { c__tl_upper_9_4_tl } { ɒⱰцЦղՂ } -\tl_const:cn { c__tl_upper_9_5_tl } { ħĦǯǮɓƁϣϢчЧҫҪԏԎճՃḏḎṳṲỗỖⲃⲂꙣꙢꜫꜪ } -\tl_const:cn { c__tl_upper_9_6_tl } { ƌƋɔƆшШմՄᾠ{ὨΙ} } -\tl_const:cn { c__tl_upper_9_7_tl } { aAĩĨϥϤщЩҭҬԑԐյՅḑḐṵṴộỘᾡ{ὩΙ}ⲅⲄꙥꙤꜭꜬꞑꞐ } -\tl_const:cn { c__tl_upper_9_8_tl } { bBDzDZɖƉъЪնՆᾢ{ὪΙ} } -\tl_const:cn { c__tl_upper_9_9_tl } { cCīĪdzDZɗƊϧϦыЫүҮԓԒշՇḓḒṷṶớỚᾣ{ὫΙ}ⲇⲆꙧꙦꜯꜮꞓꞒ } -\tl_const:cn { c__tl_lower_0_0_tl } { ÈèĬĭƐɛǴǵϨϩҰұԔԕḔḕṸṹỜờⒸⓒⰤⱔⲈⲉꙨꙩ } -\tl_const:cn { c__tl_lower_0_1_tl } { ÉéƑƒჍⴭⒹⓓⰥⱕⳭⳮ } -\tl_const:cn { c__tl_lower_0_2_tl } { ÊêĮįǶƕΆάϪϫҲҳԖԗḖḗṺṻỞởⒺⓔⰦⱖⲊⲋꙪꙫꜲꜳ } -\tl_const:cn { c__tl_lower_0_3_tl } { ËëƓɠǷƿⒻⓕⰧⱗ } -\tl_const:cn { c__tl_lower_0_4_tl } { Ììİ{i̇}ƔɣǸǹΈέϬϭҴҵԘԙḘḙṼṽỠỡᾨᾠⒼⓖⰨⱘⲌⲍꙬꙭꜴꜵ } -\tl_const:cn { c__tl_lower_0_5_tl } { ÍíΉήᾩᾡⒽⓗⰩⱙ } -\tl_const:cn { c__tl_lower_0_6_tl } { ÎîIJijƖɩǺǻΊίϮϯҶҷԚԛḚḛṾṿỢợᾪᾢⒾⓘⰪⱚⲎⲏⳲⳳꜶꜷ } -\tl_const:cn { c__tl_lower_0_7_tl } { ÏïƗɨᾫᾣⒿⓙⰫⱛ } -\tl_const:cn { c__tl_lower_0_8_tl } { ÐðĴĵƘƙǼǽΌόҸҹԜԝḜḝẀẁỤụὈὀᾬᾤⓀⓚⰬⱜⲐⲑꜸꜹ } -\tl_const:cn { c__tl_lower_0_9_tl } { ÑñὉὁᾭᾥⓁⓛⰭⱝ } -\tl_const:cn { c__tl_lower_1_0_tl } { ÒòĶķǾǿΎύҺһԞԟḞḟẂẃỦủὊὂᾮᾦⓂⓜⰮⱞⲒⲓꜺꜻ } -\tl_const:cn { c__tl_lower_1_1_tl } { ÓóΏώὋὃᾯᾧⓃⓝ } -\tl_const:cn { c__tl_lower_1_2_tl } { ÔôƜɯȀȁϴθҼҽԠԡḠḡẄẅỨứὌὄⓄⓞⲔⲕꜼꜽꞠꞡ } -\tl_const:cn { c__tl_lower_1_3_tl } { ÕõĹĺƝɲΑαὍὅⓅⓟAa } -\tl_const:cn { c__tl_lower_1_4_tl } { ÖöȂȃΒβҾҿԢԣḢḣẆẇỪừⓆⓠⲖⲗꜾꜿꞢꞣBb } -\tl_const:cn { c__tl_lower_1_5_tl } { ĻļƟɵΓγϷϸⓇⓡCc } -\tl_const:cn { c__tl_lower_1_6_tl } { ØøƠơȄȅΔδӀӏԤԥḤḥẈẉỬửⓈⓢⲘⲙꝀꝁꞤꞥDd } -\tl_const:cn { c__tl_lower_1_7_tl } { ÙùĽľΕεϹϲӁӂⓉⓣEe } -\tl_const:cn { c__tl_lower_1_8_tl } { ÚúƢƣȆȇΖζϺϻԦԧḦḧẊẋỮữⓊⓤⲚⲛꝂꝃꞦꞧFf } -\tl_const:cn { c__tl_lower_1_9_tl } { ÛûĿŀΗηӃӄⓋⓥGg } -\tl_const:cn { c__tl_lower_2_0_tl } { ÜüƤƥȈȉΘθѠѡḨḩẌẍỰựᾸᾰⓌⓦⲜⲝꝄꝅꞨꞩHh } -\tl_const:cn { c__tl_lower_2_1_tl } { ÝýŁłΙιϽͻӅӆᾹᾱⓍⓧIi } -\tl_const:cn { c__tl_lower_2_2_tl } { ÞþƦʀȊȋΚκϾͼѢѣḪḫẎẏỲỳᾺὰⓎⓨⲞⲟꝆꝇꞪɦJj } -\tl_const:cn { c__tl_lower_2_3_tl } { ŃńƧƨΛλϿͽӇӈΆάⓏⓩKk } -\tl_const:cn { c__tl_lower_2_4_tl } { ȌȍΜμЀѐѤѥḬḭẐẑỴỵᾼᾳⲠⲡꚀꚁꝈꝉLl } -\tl_const:cn { c__tl_lower_2_5_tl } { ŅņƩʃΝνЁёӉӊὙὑMm } -\tl_const:cn { c__tl_lower_2_6_tl } { ȎȏΞξЂђѦѧḮḯẒẓỶỷⲢⲣꚂꚃꝊꝋNn } -\tl_const:cn { c__tl_lower_2_7_tl } { ŇňΟοЃѓӋӌὛὓOo } -\tl_const:cn { c__tl_lower_2_8_tl } { ƬƭȐȑΠπЄєѨѩḰḱẔẕỸỹⲤⲥꚄꚅꝌꝍPp } -\tl_const:cn { c__tl_lower_2_9_tl } { ΡρЅѕӍӎԱաὝὕQq } -\tl_const:cn { c__tl_lower_3_0_tl } { ŊŋƮʈȒȓІіѪѫԲբḲḳỺỻⲦⲧꚆꚇꝎꝏRr } -\tl_const:cn { c__tl_lower_3_1_tl } { ƯưΣσЇїԳգὟὗSs } -\tl_const:cn { c__tl_lower_3_2_tl } { ŌōȔȕΤτЈјѬѭӐӑԴդḴḵỼỽⲨⲩꚈꚉꝐꝑTt } -\tl_const:cn { c__tl_lower_3_3_tl } { ƱʊΥυЉљԵեUu } -\tl_const:cn { c__tl_lower_3_4_tl } { ŎŏƲʋȖȗΦφЊњѮѯӒӓԶզḶḷỾỿⲪⲫꚊꚋꝒꝓVv } -\tl_const:cn { c__tl_lower_3_5_tl } { ƳƴΧχЋћԷէWw } -\tl_const:cn { c__tl_lower_3_6_tl } { ŐőȘșΨψЌќѰѱӔӕԸըḸḹῈὲⲬⲭꚌꚍꝔꝕXx } -\tl_const:cn { c__tl_lower_3_7_tl } { ƵƶΩωЍѝԹթΈέYy } -\tl_const:cn { c__tl_lower_3_8_tl } { ŒœȚțΪϊЎўѲѳӖӗԺժḺḻẞßῊὴⲮⲯꚎꚏꝖꝗZz } -\tl_const:cn { c__tl_lower_3_9_tl } { ƷʒΫϋЏџԻիΉή } -\tl_const:cn { c__tl_lower_4_0_tl } { ŔŕƸƹȜȝАаѴѵӘәԼլḼḽẠạὨὠῌῃⲰⲱꚐꚑꝘꝙ } -\tl_const:cn { c__tl_lower_4_1_tl } { БбԽխὩὡ } -\tl_const:cn { c__tl_lower_4_2_tl } { ŖŗȞȟВвѶѷӚӛԾծḾḿẢảὪὢⲲⲳꚒꚓꝚꝛ } -\tl_const:cn { c__tl_lower_4_3_tl } { ГгԿկὫὣ } -\tl_const:cn { c__tl_lower_4_4_tl } { ŘřƼƽȠƞДдѸѹӜӝՀհṀṁẤấἈἀὬὤⅠⅰⲴⲵꚔꚕꝜꝝ } -\tl_const:cn { c__tl_lower_4_5_tl } { ЕеՁձἉἁὭὥⅡⅱ } -\tl_const:cn { c__tl_lower_4_6_tl } { ŚśȢȣЖжѺѻӞӟՂղṂṃẦầἊἂὮὦⅢⅲⲶⲷꚖꚗꝞꝟ } -\tl_const:cn { c__tl_lower_4_7_tl } { ЗзՃճἋἃὯὧⅣⅳ } -\tl_const:cn { c__tl_lower_4_8_tl } { ŜŝȤȥИиѼѽӠӡՄմṄṅẨẩἌἄⅤⅴⲸⲹꝠꝡ } -\tl_const:cn { c__tl_lower_4_9_tl } { ЙйՅյἍἅⅥⅵ } -\tl_const:cn { c__tl_lower_5_0_tl } { ŞşȦȧКкѾѿӢӣՆնṆṇẪẫἎἆⅦⅶⲺⲻꝢꝣ } -\tl_const:cn { c__tl_lower_5_1_tl } { ЛлՇշἏἇⅧⅷ } -\tl_const:cn { c__tl_lower_5_2_tl } { ŠšDŽdžȨȩМмҀҁӤӥՈոṈṉẬậῘῐⅨⅸⲼⲽꝤꝥ } -\tl_const:cn { c__tl_lower_5_3_tl } { DždžНнՉչῙῑⅩⅹ } -\tl_const:cn { c__tl_lower_5_4_tl } { ŢţȪȫОоӦӧՊպṊṋẮắῚὶⅪⅺⲾⲿꝦꝧ } -\tl_const:cn { c__tl_lower_5_5_tl } { LJljПпՋջΊίⅫⅻ } -\tl_const:cn { c__tl_lower_5_6_tl } { ĀāŤťLjljȬȭРрӨөՌռႠⴀṌṍẰằⅬⅼⳀⳁꝨꝩ } -\tl_const:cn { c__tl_lower_5_7_tl } { СсՍսႡⴁⅭⅽ } -\tl_const:cn { c__tl_lower_5_8_tl } { ĂăŦŧNJnjȮȯТтӪӫՎվႢⴂṎṏẲẳⅮⅾⳂⳃꝪꝫ } -\tl_const:cn { c__tl_lower_5_9_tl } { NjnjУуՏտႣⴃⅯⅿ } -\tl_const:cn { c__tl_lower_6_0_tl } { ĄąŨũȰȱФфӬӭՐրႤⴄṐṑẴẵἘἐⱠⱡⳄⳅꙀꙁꝬꝭ𐐀𐐨 } -\tl_const:cn { c__tl_lower_6_1_tl } { ǍǎХхՑցႥⴅἙἑ𐐁𐐩 } -\tl_const:cn { c__tl_lower_6_2_tl } { ĆćŪūȲȳЦцҊҋӮӯՒւႦⴆṒṓẶặἚἒⱢɫⳆⳇꙂꙃꝮꝯ𐐂𐐪 } -\tl_const:cn { c__tl_lower_6_3_tl } { ǏǐЧчՓփႧⴇἛἓⱣᵽ𐐃𐐫 } -\tl_const:cn { c__tl_lower_6_4_tl } { ĈĉŬŭШшҌҍӰӱՔքႨⴈṔṕẸẹἜἔⰀⰰⱤɽⳈⳉꙄꙅ𐐄𐐬 } -\tl_const:cn { c__tl_lower_6_5_tl } { AaǑǒЩщՕօႩⴉἝἕⰁⰱ𐐅𐐭 } -\tl_const:cn { c__tl_lower_6_6_tl } { BbĊċŮůЪъҎҏӲӳՖֆႪⴊṖṗẺẻⰂⰲⳊⳋꙆꙇ𐐆𐐮 } -\tl_const:cn { c__tl_lower_6_7_tl } { CcǓǔЫыႫⴋⰃⰳⱧⱨ𐐇𐐯 } -\tl_const:cn { c__tl_lower_6_8_tl } { DdČčŰűЬьҐґӴӵႬⴌṘṙẼẽῨῠⰄⰴⳌⳍꙈꙉ𐐈𐐰 } -\tl_const:cn { c__tl_lower_6_9_tl } { EeǕǖЭэႭⴍῩῡⰅⰵⱩⱪ𐐉𐐱 } -\tl_const:cn { c__tl_lower_7_0_tl } { FfĎďŲųȺⱥЮюҒғӶӷႮⴎṚṛẾếῪὺⰆⰶⳎⳏꙊꙋ𐐊𐐲 } -\tl_const:cn { c__tl_lower_7_1_tl } { GgǗǘȻȼЯяႯⴏΎύⰇⰷⱫⱬ𐐋𐐳 } -\tl_const:cn { c__tl_lower_7_2_tl } { HhĐđŴŵҔҕӸӹႰⴐṜṝỀềᾈᾀῬῥⰈⰸⳐⳑꙌꙍ𐐌𐐴 } -\tl_const:cn { c__tl_lower_7_3_tl } { IiǙǚȽƚႱⴑᾉᾁⰉⰹⱭɑꝹꝺ𐐍𐐵 } -\tl_const:cn { c__tl_lower_7_4_tl } { JjĒēŶŷȾⱦҖҗӺӻႲⴒṞṟỂểᾊᾂⰊⰺⱮɱⳒⳓꙎꙏ𐐎𐐶 } -\tl_const:cn { c__tl_lower_7_5_tl } { KkǛǜϏϗႳⴓᾋᾃⰋⰻⱯɐꝻꝼ𐐏𐐷 } -\tl_const:cn { c__tl_lower_7_6_tl } { LlĔĕŸÿҘҙӼӽႴⴔṠṡỄễἨἠᾌᾄⰌⰼⱰɒⳔⳕꙐꙑ𐐐𐐸 } -\tl_const:cn { c__tl_lower_7_7_tl } { MmŹźɁɂႵⴕἩἡᾍᾅⰍⰽꝽᵹ𐐑𐐹 } -\tl_const:cn { c__tl_lower_7_8_tl } { NnĖėǞǟҚқӾӿႶⴖṢṣỆệἪἢᾎᾆⰎⰾⱲⱳⳖⳗꙒꙓꝾꝿ𐐒𐐺 } -\tl_const:cn { c__tl_lower_7_9_tl } { OoŻżɃƀႷⴗἫἣᾏᾇↃↄⰏⰿ𐐓𐐻 } -\tl_const:cn { c__tl_lower_8_0_tl } { PpĘęǠǡɄʉͰͱҜҝԀԁႸⴘḀḁṤṥỈỉἬἤⰐⱀⳘⳙꙔꙕꞀꞁ𐐔𐐼 } -\tl_const:cn { c__tl_lower_8_1_tl } { QqŽžɅʌႹⴙἭἥⰑⱁⱵⱶ𐐕𐐽 } -\tl_const:cn { c__tl_lower_8_2_tl } { RrĚěǢǣɆɇͲͳҞҟԂԃႺⴚḂḃṦṧỊịἮἦⰒⱂⳚⳛꙖꙗꞂꞃ𐐖𐐾 } -\tl_const:cn { c__tl_lower_8_3_tl } { SsႻⴛἯἧⰓⱃ𐐗𐐿 } -\tl_const:cn { c__tl_lower_8_4_tl } { TtĜĝǤǥɈɉϘϙҠҡԄԅႼⴜḄḅṨṩỌọῸὸⰔⱄⳜⳝꙘꙙꞄꞅ𐐘𐑀 } -\tl_const:cn { c__tl_lower_8_5_tl } { UuƁɓႽⴝΌόⰕⱅ𐐙𐑁 } -\tl_const:cn { c__tl_lower_8_6_tl } { VvĞğƂƃǦǧɊɋͶͷϚϛҢңԆԇႾⴞḆḇṪṫỎỏῺὼΩωⰖⱆⳞⳟꙚꙛꜢꜣꞆꞇ𐐚𐑂 } -\tl_const:cn { c__tl_lower_8_7_tl } { WwႿⴟΏώⰗⱇ𐐛𐑃 } -\tl_const:cn { c__tl_lower_8_8_tl } { XxĠġƄƅǨǩɌɍϜϝҤҥԈԉჀⴠḈḉṬṭỐốᾘᾐῼῳⰘⱈⳠⳡꙜꙝꜤꜥ𐐜𐑄 } -\tl_const:cn { c__tl_lower_8_9_tl } { YyჁⴡᾙᾑⰙⱉ𐐝𐑅 } -\tl_const:cn { c__tl_lower_9_0_tl } { ZzĢģƆɔǪǫɎɏϞϟҦҧԊԋჂⴢḊḋṮṯỒồᾚᾒKkⰚⱊⱾȿⳢⳣꙞꙟꜦꜧ𐐞𐑆 } -\tl_const:cn { c__tl_lower_9_1_tl } { ƇƈჃⴣᾛᾓÅåⰛⱋⱿɀꞋꞌ𐐟𐑇 } -\tl_const:cn { c__tl_lower_9_2_tl } { ÀàĤĥǬǭϠϡҨҩԌԍჄⴤḌḍṰṱỔổἸἰᾜᾔⰜⱌⲀⲁꙠꙡꜨꜩ𐐠𐑈 } -\tl_const:cn { c__tl_lower_9_3_tl } { ÁáƉɖჅⴥἹἱᾝᾕⰝⱍꞍɥ𐐡𐑉 } -\tl_const:cn { c__tl_lower_9_4_tl } { ÂâĦħƊɗǮǯϢϣҪҫԎԏḎḏṲṳỖỗἺἲᾞᾖⰞⱎⲂⲃꙢꙣꜪꜫ𐐢𐑊 } -\tl_const:cn { c__tl_lower_9_5_tl } { ÃãƋƌჇⴧἻἳᾟᾗⰟⱏ𐐣𐑋 } -\tl_const:cn { c__tl_lower_9_6_tl } { ÄäĨĩϤϥҬҭԐԑḐḑṴṵỘộἼἴⰠⱐⲄⲅꙤꙥꜬꜭꞐꞑ𐐤𐑌 } -\tl_const:cn { c__tl_lower_9_7_tl } { ÅåDZdzἽἵⰡⱑ𐐥𐑍 } -\tl_const:cn { c__tl_lower_9_8_tl } { ÆæĪīƎǝDzdzϦϧҮүԒԓḒḓṶṷỚớἾἶℲⅎⒶⓐⰢⱒⲆⲇꙦꙧꜮꜯꞒꞓ𐐦𐑎 } -\tl_const:cn { c__tl_lower_9_9_tl } { ÇçƏəἿἷⒷⓑⰣⱓⳫⳬ𐐧𐑏 } -\tl_const:Nn \c__tl_mixed_exceptions_tl { ß{Ss}ff{Ff}fi{Fi}fl{Fl}ffi{Ffi}ffl{Ffl}ſt{St}st{St}և{Եւ}ﬓ{Մն}ﬔ{Մե}ﬕ{Մի}ﬖ{Վն}ﬗ{Մխ}ᾲ{Ὰͅ}ᾴ{Άͅ}ῂ{Ὴͅ}ῄ{Ήͅ}ῲ{Ὼͅ}ῴ{Ώͅ}ᾷ{ᾼ͂}ῇ{ῌ͂}ῷ{ῼ͂}DžDždžDžLjLjljLjNjNjnjNjDzDzdzDz } -\tl_const:Nn \c__tl_std_sigma_tl {σ} -\tl_const:Nn \c__tl_final_sigma_tl {ς} -\tl_const:Nn \c__tl_dotless_i_tl {ı} -\tl_const:Nn \c__tl_dot_above_tl {̇} -\tl_const:Nn \c__tl_dotted_I_tl {İ} -\tl_const:Nn \c__tl_accents_lt_tl {Ì{i̇̀}Í{i̇́}Ĩ{i̇̃}} diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def index 7f937fbcb18..244fab08545 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3kernel/l3xdvipdfmx.def @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- %% -\GetIdInfo$Id: l3drivers.dtx 5203 2014-07-15 08:59:02Z joseph $ +\GetIdInfo$Id: l3drivers.dtx 5308 2014-08-20 01:22:39Z bruno $ {L3 Experimental drivers} \ProvidesExplFile {l3xdvidpfmx.def}{\ExplFileDate}{\ExplFileVersion} diff --git a/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty index 21b43ed87c9..c9ce3db17c8 100644 --- a/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty +++ b/Master/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty @@ -46,8 +46,8 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{expl3}[2014/07/20] -\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} {} {% \PackageError{l3keys2e}{Support package l3kernel too old} @@ -59,7 +59,7 @@ }% \endinput } -\GetIdInfo$Id: l3keys2e.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: l3keys2e.dtx 5378 2014-08-25 10:59:48Z joseph $ {LaTeX2e option processing using LaTeX3 keys} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} diff --git a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty index ba137345670..43829b42af7 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xparse/xparse.sty @@ -50,8 +50,8 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{expl3}[2014/07/20] -\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} {} {% \PackageError{xparse}{Support package l3kernel too old} @@ -63,7 +63,7 @@ }% \endinput } -\GetIdInfo$Id: xparse.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: xparse.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental document command parser} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} @@ -116,7 +116,7 @@ { \cs_if_exist:NTF #1 { - \__msg_kernel_warning:nnxx { xparse } { redefine-command } + \__msg_kernel_info:nnxx { xparse } { redefine-command } { \token_to_str:N #1 } { \tl_to_str:n {#2} } } { @@ -199,7 +199,7 @@ { \cs_if_exist:cTF {#1} { - \__msg_kernel_warning:nnxx { xparse } { redefine-environment } + \__msg_kernel_info:nnxx { xparse } { redefine-environment } {#1} { \tl_to_str:n {#2} } } { @@ -956,15 +956,15 @@ \group_align_safe_begin: \tex_escapechar:D = 92 \scan_stop: \tl_clear:N \l__xparse_v_arg_tl - \peek_N_type:TF - { \__xparse_grab_v_aux_test:N } + \peek_meaning_remove_ignore_spaces:NTF \c_group_begin_token { - \peek_meaning_remove:NTF \c_group_begin_token - { - \group_align_safe_end: - \__xparse_grab_v_bgroup: - } - { \__xparse_grab_v_aux_abort: } + \group_align_safe_end: + \__xparse_grab_v_bgroup: + } + { + \peek_N_type:TF + { \__xparse_grab_v_aux_test:N } + { \__xparse_grab_v_aux_abort:n { } } } } \cs_new_protected_nopar:Npn \__xparse_grab_v_group_end: @@ -976,19 +976,19 @@ } \cs_new_protected:Npn \__xparse_grab_v_aux_test:N #1 { - \__xparse_grab_v_aux_put:N #1 \__xparse_grab_v_token_if_char:NTF #1 { + \__xparse_grab_v_aux_put:N #1 \__xparse_grab_v_aux_catcodes: \__xparse_grab_v_aux_loop:N #1 } - { \__xparse_grab_v_aux_abort: } + { \__xparse_grab_v_aux_abort:n {#1} #1 } } \cs_new_protected:Npn \__xparse_grab_v_aux_loop:N #1 { \peek_N_type:TF { \__xparse_grab_v_aux_loop:NN #1 } - { \__xparse_grab_v_aux_abort: } + { \__xparse_grab_v_aux_abort:n { } } } \cs_new_protected:Npn \__xparse_grab_v_aux_loop:NN #1 #2 { @@ -1001,7 +1001,7 @@ \__xparse_grab_v_aux_loop:N #1 } } - { \__xparse_grab_v_aux_abort: #2 } + { \__xparse_grab_v_aux_abort:n {#2} #2 } } \cs_new_protected_nopar:Npn \__xparse_grab_v_aux_loop_end: { @@ -1021,7 +1021,7 @@ { \peek_N_type:TF { \__xparse_grab_v_bgroup_loop:N } - { \__xparse_grab_v_aux_abort: } + { \__xparse_grab_v_aux_abort:n { } } } \cs_new_protected:Npn \__xparse_grab_v_bgroup_loop:N #1 { @@ -1044,7 +1044,7 @@ \__xparse_grab_v_bgroup_loop: } } - { \__xparse_grab_v_aux_abort: #1 } + { \__xparse_grab_v_aux_abort:n {#1} #1 } } \cs_new_protected_nopar:Npn \__xparse_grab_v_aux_catcodes: { @@ -1055,28 +1055,26 @@ { \char_set_catcode_other:n { \tex_endlinechar:D } } { \char_set_catcode_parameter:n { \tex_endlinechar:D } } } -\cs_new_protected_nopar:Npn \__xparse_grab_v_aux_abort: +\cs_new_protected:Npn \__xparse_grab_v_aux_abort:n #1 { \__xparse_grab_v_group_end: \__xparse_add_arg:o \c__xparse_no_value_tl - \exp_after:wN \__xparse_grab_v_aux_abort:w \l__xparse_args_tl \q_stop - } -\cs_new_protected:Npn \__xparse_grab_v_aux_abort:w #1 #2 \q_stop - { \group_begin: \char_set_lccode:nn { `\# } { \tex_endlinechar:D } \tl_to_lowercase:n { \group_end: \peek_meaning_remove:NTF ## } { - \__msg_kernel_error:nnxx { xparse } { verbatim-newline } - { \token_to_str:N #1 } + \__msg_kernel_error:nnxxx { xparse } { verbatim-newline } + { \exp_after:wN \token_to_str:N \l__xparse_fn_tl } { \tl_to_str:N \l__xparse_v_arg_tl } + { \tl_to_str:n {#1} } \l__xparse_v_rest_of_signature_tl \l__xparse_args_tl } { - \__msg_kernel_error:nnxx { xparse } { verbatim-already-tokenized } - { \token_to_str:N #1 } + \__msg_kernel_error:nnxxx { xparse } { verbatim-tokenized } + { \exp_after:wN \token_to_str:N \l__xparse_fn_tl } { \tl_to_str:N \l__xparse_v_arg_tl } + { \tl_to_str:n {#1} } \l__xparse_v_rest_of_signature_tl \l__xparse_args_tl } } @@ -1515,41 +1513,45 @@ but~this~is~not~a~document~environment. } \__msg_kernel_new:nnnn { xparse } { verbatim-newline } - { Verbatim~argument~of~#1~ended~by~end~of~line. } + { Verbatim~argument~of~'#1'~ended~by~end~of~line. } { - The~verbatim~argument~of~#1~cannot~contain~more~than~one~line,~but~the~end~ + The~verbatim~argument~of~'#1'~cannot~contain~more~than~one~line,~ + but~the~end~ of~the~current~line~has~been~reached.~You~have~probably~forgotten~the~ closing~delimiter. \\ \\ - LaTeX~will~ignored~'#2'. + LaTeX~will~ignore~'#2'. + } +\__msg_kernel_new:nnnn { xparse } { verbatim-tokenized } + { + The~verbatim~command~'#1'~cannot~be~used~inside~an~argument.~ } -\__msg_kernel_new:nnnn { xparse } { verbatim-already-tokenized } - { Verbatim~command~#1~illegal~in~command~argument. } { - The~command~#1~takes~a~verbatim~argument.~It~may~not~appear~within~ - the~argument~of~another~function. + The~command~'#1'~takes~a~verbatim~argument.~ + It~may~not~appear~within~the~argument~of~another~function.~ + It~received~an~illegal~token \tl_if_empty:nF {#3} { ~'#3' } . \\ \\ LaTeX~will~ignore~'#2'. } \__msg_kernel_new:nnn { xparse } { define-command } { - Defining~document~command~#1~ - with~arg.~spec.~'#2'~\msg_line_context:. + Defining~command~#1~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { define-environment } { - Defining~document~environment~'#1'~ - with~arg.~spec.~'#2'~\msg_line_context:. + Defining~environment~'#1'~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { redefine-command } { - Redefining~document~command~#1~ - with~arg.~spec.~'#2'~\msg_line_context:. + Redefining~command~#1~ + with~sig.~'#2'~\msg_line_context:. } \__msg_kernel_new:nnn { xparse } { redefine-environment } { - Redefining~document~environment~'#1'~ - with~arg.~spec.~'#2'~\msg_line_context:. + Redefining~environment~'#1'~ + with~sig.~'#2'~\msg_line_context:. } \cs_new_eq:NN \BooleanFalse \c_false_bool \cs_new_eq:NN \BooleanTrue \c_true_bool diff --git a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty index b9638f5aa71..7dd8e7b35b0 100644 --- a/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty +++ b/Master/texmf-dist/tex/latex/l3packages/xtemplate/xtemplate.sty @@ -50,8 +50,8 @@ %% %% ----------------------------------------------------------------------- %% -\RequirePackage{expl3}[2014/07/20] -\@ifpackagelater{expl3}{2014/07/20} +\RequirePackage{expl3}[2014/08/25] +\@ifpackagelater{expl3}{2014/08/25} {} {% \PackageError{xtemplate}{Support package l3kernel too old} @@ -63,7 +63,7 @@ }% \endinput } -\GetIdInfo$Id: xtemplate.dtx 5241 2014-07-20 09:44:41Z joseph $ +\GetIdInfo$Id: xtemplate.dtx 5378 2014-08-25 10:59:48Z joseph $ {L3 Experimental prototype document functions} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} |